{"version":3,"file":"worker-wrapper.mjs","sources":["../src/extract/cleanInputs.ts","../src/workerWrapper.ts"],"sourcesContent":["import { BrowserOptions, OptionsCleaned } from \"../types/Options\";\n\n/**\n * Default extractor values\n */\nexport const EXTRACTOR_PIXELS_DEFAULT = 64000;\nexport const EXTRACTOR_DISTANCE_DEFAULT = 0.22;\n\n/**\n * Default average values\n */\nexport const AVERAGE_HUE_DEFAULT = 1 / 12;\nexport const AVERAGE_SATURATION_DEFAULT = 1 / 5;\nexport const AVERAGE_LIGHTNESS_DEFAULT = 1 / 5;\n\nexport function testInputs({\n  pixels = EXTRACTOR_PIXELS_DEFAULT,\n  distance = EXTRACTOR_DISTANCE_DEFAULT,\n  colorValidator = (\n    _red: number,\n    _green: number,\n    _blue: number,\n    _alpha?: number\n  ) => (_alpha ?? 255) > 250,\n  hueDistance = AVERAGE_HUE_DEFAULT,\n  saturationDistance = AVERAGE_LIGHTNESS_DEFAULT,\n  lightnessDistance = AVERAGE_SATURATION_DEFAULT,\n  crossOrigin = \"\",\n  requestMode = \"cors\",\n}: BrowserOptions = {}) {\n  /**\n   * Test if value is an integer.\n   */\n  const testUint = (\n    label: string,\n    val: number,\n    min = 0,\n    max = Number.MAX_SAFE_INTEGER\n  ) => {\n    if (!Number.isInteger(val)) {\n      throw new Error(`${label} is not a valid number (${val})`);\n    }\n\n    if (val < min) {\n      console.warn(`${label} can not be less than ${min} (it's ${val})`);\n    }\n\n    if (val > max) {\n      console.warn(`${label} can not be more than ${max} (it's ${val})`);\n    }\n\n    return Math.min(Math.max(val, min), max);\n  };\n\n  /**\n   * Test if value is a number.\n   */\n  const testNumber = (\n    label: string,\n    val: number,\n    min = 0,\n    max = Number.MAX_VALUE\n  ) => {\n    if (Number(val) !== val) {\n      throw new Error(`${label} is not a valid number (${val})`);\n    }\n\n    if (val < min) {\n      console.warn(`${label} can not be less than ${min} (it's ${val})`);\n    }\n\n    if (val > max) {\n      console.warn(`${label} can not be more than ${max} (it's ${val})`);\n    }\n\n    return Math.min(Math.max(val, min), max);\n  };\n\n  /**\n   * Test if value is a function.\n   */\n  const testFunction = <T = () => void>(label: string, val: T) => {\n    if (!val || {}.toString.call(val) !== \"[object Function]\") {\n      throw new Error(`${label} is not a function (${val})`);\n    }\n\n    return val;\n  };\n\n  /**\n   * Test if value is in the list of values\n   */\n  const testValueInList = <T>(label: string, val: T, list: T[]) => {\n    if (list.indexOf(val) < 0) {\n      console.warn(\n        `${label} can be one of this values ${list\n          .map((v) => `\"${v}\"`)\n          .join(\", \")} (it's \"${val}\")`\n      );\n    }\n  };\n\n  testUint(\"pixels\", pixels || 0, 1);\n  testNumber(\"distance\", distance, 0, 1);\n  testFunction(\"colorValidator\", colorValidator);\n  testNumber(\"hueDistance\", hueDistance, 0, 1);\n  testNumber(\"saturationDistance\", saturationDistance, 0, 1);\n  testNumber(\"lightnessDistance\", lightnessDistance, 0, 1);\n  testValueInList(\"crossOrigin\", crossOrigin, [\n    \"\",\n    \"anonymous\",\n    \"use-credentials\",\n  ]);\n  testValueInList(\"requestMode\", requestMode, [\n    \"cors\",\n    \"navigate\",\n    \"no-cors\",\n    \"same-origin\",\n  ]);\n}\n\nexport default ({\n  pixels = EXTRACTOR_PIXELS_DEFAULT,\n  distance = EXTRACTOR_DISTANCE_DEFAULT,\n  colorValidator = (\n    _red: number,\n    _green: number,\n    _blue: number,\n    _alpha?: number\n  ) => (_alpha ?? 255) > 250,\n  hueDistance = AVERAGE_HUE_DEFAULT,\n  saturationDistance = AVERAGE_LIGHTNESS_DEFAULT,\n  lightnessDistance = AVERAGE_SATURATION_DEFAULT,\n  crossOrigin = \"\",\n  requestMode = \"cors\",\n}: BrowserOptions = {}): OptionsCleaned => {\n  return [\n    Math.max(pixels, 1),\n    Math.min(Math.max(distance, 0), 1),\n    colorValidator,\n    Math.min(Math.max(hueDistance, 0), 1),\n    Math.min(Math.max(saturationDistance, 0), 1),\n    Math.min(Math.max(lightnessDistance, 0), 1),\n    crossOrigin,\n    requestMode,\n  ];\n};\n","import WorkerWrapper from \"./worker?worker&inline\";\nimport cleanInputs, { testInputs } from \"./extract/cleanInputs\";\nimport type { BrowserOptions, ImageDataAlt } from \"./types/Options\";\nimport type { FinalColor } from \"./types/Color\";\n\n/**\n * Extract colors from a picture with Web Worker support.\n *\n * @param picture image source or image data\n * @param options Process configuration\n * @param options.pixels Total pixel number of the resized picture for calculation\n * @param options.distance From 0 to 1 is the color distance to not have near colors (1 distance is between white and black)\n * @param options.colorValidator Test function to enable only some colors\n * @param options.saturationDistance Minimum saturation value between two colors otherwise the colors will be merged (from 0 to 1)\n * @param options.lightnessDistance inimum lightness value between two colors otherwise the colors will be merged (from 0 to 1)\n * @param options.hueDistance inimum hue value between two colors otherwise the colors will be merged (from 0 to 1)\n * @param options.requestMode support for CORS (only for Web Workers in browser)\n *\n * @returns List of extracted colors\n */\nexport const extractColors = (\n  picture: string | ImageData | ImageDataAlt,\n  options?: BrowserOptions\n) => {\n  if (__DEV__) {\n    testInputs(options);\n  }\n\n  if (picture instanceof HTMLImageElement) {\n    if (__DEV__) {\n      console.warn(\n        \"HTMLImageElement not enable on worker, please send 'src' or image data instead HTMLImageElement\"\n      );\n    }\n\n    // HTMLImageElement not enable on Worker, switch to src fallback\n    picture = picture.src;\n  }\n\n  const [_pixels, _distance, _colorValidator, ..._cleanInputsRest] =\n    cleanInputs(options);\n\n  // Wrap worker inside Promise\n  return new Promise<FinalColor[]>((resolve, reject) => {\n    try {\n      const worker: Worker = new WorkerWrapper();\n      worker.postMessage([\n        picture,\n        [_pixels, _distance, _colorValidator.toString(), ..._cleanInputsRest],\n      ]);\n      worker.addEventListener(\"message\", (message) => {\n        resolve(message.data);\n        worker.terminate();\n      });\n      worker.addEventListener(\"error\", (error) => {\n        reject(error);\n        worker.terminate();\n      });\n    } catch (error) {\n      reject(error);\n    }\n  });\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,2BAA2B;AACjC,MAAM,6BAA6B;AAKnC,MAAM,sBAAsB,IAAI;AAChC,MAAM,6BAA6B,IAAI;AACvC,MAAM,4BAA4B,IAAI;AAEtC,SAAS,WAAW;AAAA,EACzB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB,CACf,MACA,QACA,OACA,YACI,UAAU,OAAO;AAAA,EACvB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,cAAc;AAChB,IAAoB,IAAI;AAIhB,QAAA,WAAW,CACf,OACA,KACA,MAAM,GACN,MAAM,OAAO,qBACV;AACH,QAAI,CAAC,OAAO,UAAU,GAAG,GAAG;AAC1B,YAAM,IAAI,MAAM,GAAG,KAAK,2BAA2B,GAAG,GAAG;AAAA,IAC3D;AAEA,QAAI,MAAM,KAAK;AACb,cAAQ,KAAK,GAAG,KAAK,yBAAyB,GAAG,UAAU,GAAG,GAAG;AAAA,IACnE;AAEA,QAAI,MAAM,KAAK;AACb,cAAQ,KAAK,GAAG,KAAK,yBAAyB,GAAG,UAAU,GAAG,GAAG;AAAA,IACnE;AAEA,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG;AAAA,EAAA;AAMnC,QAAA,aAAa,CACjB,OACA,KACA,MAAM,GACN,MAAM,OAAO,cACV;AACC,QAAA,OAAO,GAAG,MAAM,KAAK;AACvB,YAAM,IAAI,MAAM,GAAG,KAAK,2BAA2B,GAAG,GAAG;AAAA,IAC3D;AAEA,QAAI,MAAM,KAAK;AACb,cAAQ,KAAK,GAAG,KAAK,yBAAyB,GAAG,UAAU,GAAG,GAAG;AAAA,IACnE;AAEA,QAAI,MAAM,KAAK;AACb,cAAQ,KAAK,GAAG,KAAK,yBAAyB,GAAG,UAAU,GAAG,GAAG;AAAA,IACnE;AAEA,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG;AAAA,EAAA;AAMnC,QAAA,eAAe,CAAiB,OAAe,QAAW;AAC1D,QAAA,CAAC,OAAO,GAAG,SAAS,KAAK,GAAG,MAAM,qBAAqB;AACzD,YAAM,IAAI,MAAM,GAAG,KAAK,uBAAuB,GAAG,GAAG;AAAA,IACvD;AAEO,WAAA;AAAA,EAAA;AAMT,QAAM,kBAAkB,CAAI,OAAe,KAAQ,SAAc;AAC/D,QAAI,KAAK,QAAQ,GAAG,IAAI,GAAG;AACjB,cAAA;AAAA,QACN,GAAG,KAAK,8BAA8B,KACnC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB,KAAK,IAAI,CAAC,WAAW,GAAG;AAAA,MAAA;AAAA,IAE/B;AAAA,EAAA;AAGO,WAAA,UAAU,UAAU,GAAG,CAAC;AACtB,aAAA,YAAY,UAAU,GAAG,CAAC;AACrC,eAAa,kBAAkB,cAAc;AAClC,aAAA,eAAe,aAAa,GAAG,CAAC;AAChC,aAAA,sBAAsB,oBAAoB,GAAG,CAAC;AAC9C,aAAA,qBAAqB,mBAAmB,GAAG,CAAC;AACvD,kBAAgB,eAAe,aAAa;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACD,kBAAgB,eAAe,aAAa;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACH;AAEA,MAAA,cAAe,CAAC;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB,CACf,MACA,QACA,OACA,YACI,UAAU,OAAO;AAAA,EACvB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,cAAc;AAChB,IAAoB,OAAuB;AAClC,SAAA;AAAA,IACL,KAAK,IAAI,QAAQ,CAAC;AAAA,IAClB,KAAK,IAAI,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC;AAAA,IACjC;AAAA,IACA,KAAK,IAAI,KAAK,IAAI,aAAa,CAAC,GAAG,CAAC;AAAA,IACpC,KAAK,IAAI,KAAK,IAAI,oBAAoB,CAAC,GAAG,CAAC;AAAA,IAC3C,KAAK,IAAI,KAAK,IAAI,mBAAmB,CAAC,GAAG,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,EAAA;AAEJ;AC9Ha,MAAA,gBAAgB,CAC3B,SACA,YACG;AACH,MAAI,SAAS;AACX,eAAW,OAAO;AAAA,EACpB;AAEA,MAAI,mBAAmB,kBAAkB;AACvC,QAAI,SAAS;AACH,cAAA;AAAA,QACN;AAAA,MAAA;AAAA,IAEJ;AAGA,cAAU,QAAQ;AAAA,EACpB;AAEM,QAAA,CAAC,SAAS,WAAW,iBAAiB,GAAG,gBAAgB,IAC7D,YAAY,OAAO;AAGrB,SAAO,IAAI,QAAsB,CAAC,SAAS,WAAW;AAChD,QAAA;AACI,YAAA,SAAiB,IAAI;AAC3B,aAAO,YAAY;AAAA,QACjB;AAAA,QACA,CAAC,SAAS,WAAW,gBAAgB,SAAS,GAAG,GAAG,gBAAgB;AAAA,MAAA,CACrE;AACM,aAAA,iBAAiB,WAAW,CAAC,YAAY;AAC9C,gBAAQ,QAAQ,IAAI;AACpB,eAAO,UAAU;AAAA,MAAA,CAClB;AACM,aAAA,iBAAiB,SAAS,CAAC,UAAU;AAC1C,eAAO,KAAK;AACZ,eAAO,UAAU;AAAA,MAAA,CAClB;AAAA,aACM,OAAO;AACd,aAAO,KAAK;AAAA,IACd;AAAA,EAAA,CACD;AACH;"}