{"version":3,"file":"index.mjs","sources":["src/helpers/format.ts","src/flood-monitoring-api/error.ts","src/flood-monitoring-api/measure.ts","src/helpers/dom.ts","src/helpers/time.ts","src/widget/chart.ts","src/flood-monitoring-api/api.ts","src/flood-monitoring-api/store.ts","src/flood-monitoring-api/reading.ts","src/widget/render.ts","src/index.ts"],"sourcesContent":["export const FONT_STACK =\n  '-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Roboto\",\"Helvetica Neue\",Arial,sans-serif';\n\nexport const round3 = (value: number) =>\n  value < 100 ? value.toPrecision(3) : Math.round(value).toString();\n","export class FloodMonitoringApiError extends Error {\n  public info: Record<string, unknown>;\n\n  constructor(msg: string, info: Record<string, unknown> = {}) {\n    super(msg);\n    this.name = 'FloodMonitoringApiError';\n    this.info = info;\n  }\n}\n","import { FloodMonitoringApiError } from './error';\n\nexport { parseMeasureId };\n\nconst parseMeasureId = (measureId: string) => {\n  // ............base/ stat-paramet-qualifi- type  -interva-unit\n  const regExp = /(.*)-([^-]*)-([^-]*)-([^-]*)-([^-]*)-([^-]*)$/;\n  const matches = measureId.match(regExp);\n  if (matches === null) {\n    throw new FloodMonitoringApiError('Cannot parse measure id', { measureId });\n  }\n  const [unit, interval, type, qualifier, parameter, stationId] =\n    matches.reverse();\n  const qualifiedParameter = qualifier.length\n    ? `${parameter}-${qualifier}`\n    : parameter;\n  return {\n    stationId,\n    parameter,\n    qualifier,\n    type,\n    interval,\n    unit,\n    qualifiedParameter,\n  };\n};\n\nconst measureTranslations: Record<string, Record<string, string>> = {\n  unit: {\n    m3_s: 'm³/s',\n    mAOD: 'm',\n    mASD: 'm',\n  },\n  qualifiedParameter: {\n    'level-stage': 'level',\n    'level-downstage': 'downstream level',\n  },\n};\n\nexport const translateMeasureProperties = (measure: Record<string, string>) => {\n  const translated: Record<string, string> = {};\n  for (const prop in measure) {\n    const value = measure[prop];\n    if (measureTranslations[prop] && measureTranslations[prop][value]) {\n      translated[prop] = measureTranslations[prop][value];\n    } else {\n      translated[prop] = value;\n    }\n  }\n  return translated;\n};\n","/**\n * RiverDataWidget https://github.com/pb-uk/river-data-widget.\n *\n * @copyright Copyright (C) 2022 pbuk https://github.com/pb-uk.\n * @license AGPL-3.0-or-later see LICENSE.md.\n */\n\nexport { createElement, createSvgElement, setAttributes, setStyles };\n\ntype AttributeList = Record<string, string | number>;\n\nconst setAttributes = <T extends HTMLElement | SVGElement>(\n  el: T,\n  attributes: AttributeList\n): T => {\n  for (const [key, value] of Object.entries(attributes)) {\n    el.setAttribute(key, `${value}`);\n  }\n  return el;\n};\n\nconst setStyles = <T extends HTMLElement | SVGElement>(\n  el: T,\n  styles: AttributeList\n): T => {\n  for (const [key, value] of Object.entries(styles)) {\n    // Workaround (el.style.setProperty uses kebab-case keys).\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (<any>el.style)[key] = value;\n  }\n  return el;\n};\n\nconst createElement = (\n  name = 'div',\n  attributes: AttributeList = {},\n  styles: AttributeList = {},\n  innerHTML: string | false = false\n): HTMLElement => {\n  const el = document.createElement(name);\n  if (innerHTML !== false) {\n    el.innerHTML = innerHTML;\n  }\n  return setStyles(setAttributes(el, attributes), styles);\n};\n\nconst createSvgElement = (\n  name = 'svg',\n  attributes: AttributeList = {},\n  styles: AttributeList = {},\n  innerHTML: string | false = false\n) => {\n  const el = document.createElementNS('http://www.w3.org/2000/svg', name);\n  if (innerHTML !== false) {\n    el.innerHTML = innerHTML;\n  }\n  return setStyles(setAttributes(el, attributes), styles);\n};\n","export const MINUTE_MS = 60000;\n// const HOUR_MS = 3600000;\nexport const DAY_MS = 86400000;\n\n/**\n * Get the Date at the start of a day in UTC or local time.\n *\n * @param offset\n * @param timeZone The time zone offset in minutes, or set to `true` to use the\n *                 local time zone (`false`, the default, uses UTC).\n * @returns The reqested date.\n */\nexport const startOfDay = (\n  date: Date | null = null,\n  offset = 0,\n  timeZone: boolean | number = false\n): Date => {\n  if (timeZone === false) {\n    // Use UTC.\n    const base = date === null ? Date.now() : date.valueOf();\n    return new Date(Math.floor(base / DAY_MS + offset) * DAY_MS);\n  }\n\n  const now = new Date();\n  const tz = timeZone === true ? now.getTimezoneOffset() : timeZone;\n  const local = now.valueOf() + tz * MINUTE_MS;\n  return new Date(Math.floor(local / DAY_MS + offset) * DAY_MS);\n};\n\n/**\n * |         | long        |short|narrow|numeric|2-digit|\n * |:-------:|:-----------:|:---:|:----:|:-----:|:-----:|\n * | weekday | Monday      | Mon |   M  |       |       |\n * | era     | Anno Domini | AD  |   A  |       |       |\n * | year    |             |     |      | 2012  |  12   |\n * | month   | March       | Mar |   M  |   3   |  03   |\n * | day     |             |     |      |   1   |  01   |\n * | hour    |             |     |      |   1   |  01   |\n * | minute  |             |     |      |   1   |  01   |\n * | second  |             |     |      |   1   |  01   |\n *\n * * fractionalSecondDigits: 1, 2 or 3 for number of digits.\n * * timeZoneName: long (Pacific Standard Time), short (PST),\n *   longOffset (GMT-0800), shortOffset (GMT-8), longGeneric (Pacific Time),\n *   shortGeneric (PT).\n */\n\nexport const dateFormatter = new Intl.DateTimeFormat('en-GB', {\n  weekday: 'long',\n  day: 'numeric',\n  month: 'long',\n  // year: 'numeric',\n});\n\nexport const timeFormatter = new Intl.DateTimeFormat('en-GB', {\n  hour: '2-digit',\n  minute: '2-digit',\n  hour12: false,\n  timeZoneName: 'short',\n});\n\nexport const dddFormatter = new Intl.DateTimeFormat('en-GB', {\n  weekday: 'short',\n});\n\nexport const dMmmFormatter = new Intl.DateTimeFormat('en-GB', {\n  day: 'numeric',\n  month: 'short',\n});\n","import { createSvgElement } from '../helpers/dom';\nimport { timeFormatter, dddFormatter, dMmmFormatter } from '../helpers/time';\nimport { FloodMonitoringApiError } from '../flood-monitoring-api/error';\nimport { FONT_STACK } from '../helpers/format';\n\nexport interface ChartOptions {\n  minTime?: number;\n  maxTime?: number;\n  attribution?: string;\n}\n\nexport interface ChartScaleLimits {\n  minTime: number;\n  maxTime: number;\n  timeScale: number;\n  minValue: number;\n  maxValue: number;\n  valueScale: number;\n}\n\nexport interface ChartSeries {\n  data: TimeSeriesValue[];\n  min?: number;\n  max?: number;\n  unit?: string;\n  formatter?: (value: number) => string;\n}\n\nexport type TimeSeriesValue = [\n  ts: number, // Unix time stamp (seconds).\n  v: number // Value.\n];\n\nexport class Chart {\n  protected strokeWidth = 2;\n  protected fontSizePx = 14;\n\n  protected el: SVGElement;\n  protected series: ChartSeries[];\n  protected options: ChartOptions;\n\n  protected width = 480; // 400;\n  protected height = 270; // 225;\n  protected plotHeight = this.height - this.fontSizePx * 4.5;\n  protected plotWidth = this.width - this.strokeWidth;\n\n  protected limits?: ChartScaleLimits;\n\n  protected plotColor = '#77C';\n  protected labelBg = 'rgba(255,255,255,0.5)';\n  protected labelBgWidth = '0.5em';\n\n  protected attribution =\n    'Uses Environment Agency data from the real-time API (Beta)';\n\n  // CSS settings.\n  // Just readable at 320x180.\n  // Good from 400x225.\n  // Perfect at 480x270 (font is 12px);\n  protected styles = {\n    'font-family': FONT_STACK,\n    'font-size': `${this.fontSizePx}px`,\n    display: 'block',\n    margin: 'auto',\n    'max-width': '150vh',\n  };\n\n  constructor(\n    el: HTMLElement,\n    series: ChartSeries[],\n    options: ChartOptions = {}\n  ) {\n    this.series = series;\n    this.options = options;\n    const viewBox = `0 0 ${this.width} ${this.height}`;\n    this.attribution = options.attribution ?? this.attribution;\n    this.el = createSvgElement('svg', { viewBox }, this.styles);\n    el.append(this.el);\n  }\n\n  getLimits(): ChartScaleLimits {\n    if (this.limits == null) {\n      throw new FloodMonitoringApiError('Chart axis limits have not been set');\n    }\n    return this.limits;\n  }\n\n  getHorizontalGridlines(): SVGElement[] {\n    const { minTime, maxTime, timeScale, minValue, maxValue, valueScale } =\n      this.getLimits();\n    const xOffset = this.strokeWidth / 2;\n    const yOffset = this.plotHeight;\n    const x1 = xOffset;\n    const x2 = xOffset + (maxTime - minTime) * timeScale;\n    // Horizontal grid lines.\n    const stroke = '#ddd';\n    const lines = createSvgElement('g', { stroke });\n    const labels = createSvgElement('g');\n    const valueRange = maxValue - minValue;\n    // Horizontal grid interval.\n    const [interval, exponent] = getInterval(valueRange, 9);\n    const factor = 10 ** -exponent;\n    const base = Math.ceil((minValue * factor) / interval + 1) * interval;\n    let i = 0;\n    let current = base / factor;\n    while (current < maxValue) {\n      const y1 = yOffset - (current - minValue) * valueScale;\n      lines.append(createSvgElement('line', { x1, y1, x2, y2: y1 }));\n      labels.append(\n        createSvgElement('text', { x: x1 + 4, y: y1 + 4 }, {}, `${current}`)\n      );\n      ++i;\n      current = (base + i * interval) / factor;\n    }\n    const timeAxisLine = createSvgElement(\n      'line',\n      { x1, y1: yOffset, x2, y2: yOffset },\n      { stroke: '#777' }\n    );\n\n    return [lines, labels, timeAxisLine];\n  }\n\n  getTimeScale(): SVGElement[] {\n    const { minTime, maxTime, timeScale } = this.getLimits();\n    const xOffset = this.strokeWidth / 2;\n    const yOffset = this.plotHeight + this.strokeWidth / 2;\n    const y1 = yOffset + this.fontSizePx * 3;\n    const y2 = yOffset - this.plotHeight;\n    // Vertical grid lines.\n    const stroke = '#ddd';\n    const lines = createSvgElement('g', { stroke });\n    const labels = createSvgElement('g');\n    // Vertical grid interval.\n    const base = minTime;\n    const interval = 86400;\n    let i = 0;\n    let current = base;\n    const labelOffset = 43200 * timeScale;\n    const fill = '#444';\n    while (current <= maxTime) {\n      const x1 = xOffset + (current - minTime) * timeScale;\n      const d = new Date(current * 1000);\n      // lines.append(createSvgElement('line', { x1, y1, x2, y2: y1 }));\n      lines.append(createSvgElement('line', { x1, y1, x2: x1, y2 }));\n      labels.append(\n        createSvgElement(\n          'text',\n          {\n            x: x1 + labelOffset,\n            y: y1 - this.fontSizePx * 1.8,\n            'text-anchor': 'middle',\n          },\n          { fill },\n          `${dddFormatter.format(d)}`\n        ),\n        createSvgElement(\n          'text',\n          {\n            x: x1 + labelOffset,\n            y: y1 - this.fontSizePx * 0.5,\n            'text-anchor': 'middle',\n          },\n          { fill },\n          `${dMmmFormatter.format(d)}`\n        )\n      );\n      ++i;\n      current = base + i * interval;\n    }\n    return [lines, labels];\n  }\n\n  render() {\n    // Calculate axis scales.\n    const limits = getLimits(this.series[0].data);\n    limits.minValue = this.series[0].min ?? limits.minValue;\n    limits.maxValue = this.series[0].max ?? limits.maxValue;\n    limits.minTime = this.options.minTime ?? limits.minTime;\n    limits.maxTime = this.options.maxTime ?? limits.maxTime;\n\n    this.limits = {\n      ...limits,\n      valueScale:\n        (this.plotHeight - this.strokeWidth) /\n        (limits.maxValue - limits.minValue),\n      timeScale:\n        (this.width - this.strokeWidth) / (limits.maxTime - limits.minTime),\n    };\n\n    // Time axis.\n    const [timeLines, timeLabels] = this.getTimeScale();\n    this.el.append(timeLines);\n\n    // Value axis.\n    const [valueLines, valueLabels, timeAxisLine] =\n      this.getHorizontalGridlines();\n    this.el.append(valueLines);\n    this.el.append(timeAxisLine);\n\n    this.plotData();\n\n    // Plot labels on top of the line.\n    this.el.append(timeLabels);\n    this.el.append(valueLabels);\n\n    this.el.append(\n      createSvgElement(\n        'text',\n        {\n          x: this.width / 2,\n          'text-anchor': 'middle',\n          y: this.height - this.fontSizePx * 0.5,\n        },\n        { fill: '#595959' },\n        this.attribution\n      )\n    );\n\n    this.plotLastValue();\n  }\n\n  plotLastValue() {\n    const { data, unit, formatter } = this.series[0];\n\n    // If there is no data show a message.\n    if (data.length === 0) {\n      const x = this.plotWidth / 2;\n      const y = this.plotHeight / 2;\n      this.el.append(...this.createLargeLabel(x, y, 'No data', 'middle'));\n      return;\n    }\n\n    const [time, value] = data[data.length - 1];\n    const { minTime, timeScale, maxValue, minValue } = this.getLimits();\n\n    const v = formatter == null ? value : formatter(value);\n    const xOffset = this.strokeWidth / 2;\n    // const yOffset = this.plotHeight - this.strokeWidth / 2;\n    const x = xOffset + (time - minTime) * timeScale;\n    const isHighLabel = (value - minValue) / (maxValue - minValue) < 0.5;\n    const y = this.plotHeight * (isHighLabel ? 0 : 0.5) + this.fontSizePx * 2;\n\n    this.el.append(\n      // Value label.\n      ...this.createLargeLabel(x, y, `${v} ${unit}`),\n      // Time label.\n      ...this.createLabel(\n        x,\n        y,\n        `${timeFormatter.format(new Date(time * 1000))}`\n      )\n    );\n  }\n\n  plotData() {\n    const { data } = this.series[0];\n    // Don't do anything we don't have to!\n    if (data.length === 0) return;\n\n    const xOffset = this.strokeWidth / 2;\n    const yOffset = this.plotHeight - this.strokeWidth / 2;\n    const { minTime, timeScale, minValue, valueScale } = this.getLimits();\n    // First data point.\n    const x = xOffset + (data[0][0] - minTime) * timeScale;\n    const y = yOffset - (data[0][1] - minValue) * valueScale;\n    const points = [`M${x},${y}`];\n    // Remaining data points.\n    for (let i = 1; i < data.length; ++i) {\n      const x = xOffset + (data[i][0] - minTime) * timeScale;\n      const y = yOffset - (data[i][1] - minValue) * valueScale;\n      points.push(`L${x},${y}`);\n    }\n    // Plot the data.\n    const path = createSvgElement('path', {\n      d: points.join(''),\n      stroke: this.plotColor,\n      'stroke-width': this.strokeWidth,\n      fill: 'none',\n    });\n    this.el.append(path);\n  }\n\n  protected createLabel(x: number, y: number, text: string, anchor = 'end') {\n    return [\n      // Background for time label.\n      createSvgElement(\n        'text',\n        { x, y: y + this.fontSizePx * 1.5, 'text-anchor': anchor },\n        {\n          stroke: this.labelBg,\n          'stroke-width': this.labelBgWidth,\n        },\n        text\n      ),\n      // Time label.\n      createSvgElement(\n        'text',\n        { x, y: y + this.fontSizePx * 1.5, 'text-anchor': anchor },\n        { fill: this.plotColor },\n        text\n      ),\n    ];\n  }\n\n  protected createLargeLabel(\n    x: number,\n    y: number,\n    text: string,\n    anchor = 'end'\n  ) {\n    return [\n      // Background for value label.\n      createSvgElement(\n        'text',\n        { x, y, 'text-anchor': anchor },\n        {\n          'font-size': '1.5em',\n          'font-weight': 'bold',\n          stroke: this.labelBg,\n          'stroke-width': this.labelBgWidth,\n        },\n        text\n      ),\n      // Value label.\n      createSvgElement(\n        'text',\n        { x, y, 'text-anchor': anchor },\n        { fill: this.plotColor, 'font-size': '1.5em', 'font-weight': 'bold' },\n        text\n      ),\n    ];\n  }\n}\n\nexport const getLimits = (data: TimeSeriesValue[]) => {\n  if (data.length < 1) {\n    return { minTime: 0, maxTime: 1, minValue: 0, maxValue: 0 };\n  }\n  const minTime = data[0][0];\n  const maxTime = data[data.length - 1][0];\n  let minValue = Infinity;\n  let maxValue = -minValue;\n  for (const [, value] of data) {\n    minValue = Math.min(minValue, value);\n    maxValue = Math.max(maxValue, value);\n  }\n  return { minTime, maxTime, minValue, maxValue };\n};\n\nexport const getInterval = (range: number, maxDivisions: number) => {\n  const exponent = Math.floor(Math.log10(range)) - 1;\n  const k = range / (maxDivisions * 10 ** exponent);\n  const mantissa = k <= 2 ? 2 : k <= 5 ? 5 : 10;\n  return [mantissa, exponent];\n};\n","// There is no need to be secure about this!\nconst baseUrl = 'http://environment.data.gov.uk/flood-monitoring';\n\nexport interface ApiResponse<T> {\n  data: {\n    items: T;\n  };\n  response: Response;\n}\n\nexport interface ApiParameters {\n  since?: string; // Time from.\n  _sorted?: ''; // Flag for sorting.\n}\n\nexport const apiFetch = async (\n  path: string,\n  query = {}\n): Promise<ApiResponse<unknown>> => {\n  const queryString = new URLSearchParams(query).toString();\n  const uri = queryString\n    ? `${baseUrl}${path}?${queryString}`\n    : `${baseUrl}${path}`;\n  const response = await fetch(uri);\n  return { data: await response.json(), response };\n};\n\n/**\n * Convert a Date to a format recognized by the EA API for a query parameter.\n *\n * @param date Convert from.\n * @returns A string in the EA API query parameter format.\n */\nexport const toTimeParameter = (date: Date): string => {\n  return date.toISOString().substring(0, 19) + 'Z';\n};\n\n/*\nUseful response headers\n  Date: 'Sat, 13 May 2023 09:14:07 GMT',\n  last-modified: Sat, 13 May 2023 09:03:13 GMT,\nResponse meta:\n  publisher: 'Environment Agency',\n  license: 'http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/',\n  documentation: 'http://environment.data.gov.uk/flood-monitoring/doc/reference',\n  version: '0.9',\n  comment: 'Status: Beta service',\n  hasFormat: [\n    \"http://environment.data.gov.uk/flood-monitoring/id/measures/3400TH-level-stage-i-15_min-mAOD/readings.csv?_sorted=&since=2023-05-12T08%3A00%3A00Z\",\n    \"http://environment.data.gov.uk/flood-monitoring/id/measures/3400TH-level-stage-i-15_min-mAOD/readings.rdf?_sorted=&since=2023-05-12T08%3A00%3A00Z\",\n    \"http://environment.data.gov.uk/flood-monitoring/id/measures/3400TH-level-stage-i-15_min-mAOD/readings.ttl?_sorted=&since=2023-05-12T08%3A00%3A00Z\",\n    \"http://environment.data.gov.uk/flood-monitoring/id/measures/3400TH-level-stage-i-15_min-mAOD/readings.html?_sorted=&since=2023-05-12T08%3A00%3A00Z\"\n  ],\n*/\n","const prefix = 'riverDataWidget';\n\nconst addPrefix = (key: string): string => `${prefix}|${key}`;\n\nlet instance: Store;\n\nclass Store {\n  clear(destroy = false) {\n    for (const key of this.keys()) {\n      localStorage.removeItem(addPrefix(key));\n    }\n    if (destroy) {\n      localStorage.removeItem(prefix);\n      return;\n    }\n    localStorage.setItem(prefix, JSON.stringify([]));\n  }\n\n  get(key: string) {\n    const value = localStorage.getItem(addPrefix(key));\n    return value === null ? null : JSON.parse(value);\n  }\n\n  has(key: string): boolean {\n    return this.keys().includes(key);\n  }\n\n  /**\n   * Detect active localStorage.\n   *\n   * @returns true iff localStorage for the widget is active.\n   */\n  isActive() {\n    return localStorage.getItem(prefix) !== null;\n  }\n\n  keys(): string[] {\n    const storedKeys = localStorage.getItem(prefix);\n    return storedKeys === null ? [] : JSON.parse(storedKeys);\n  }\n\n  set(key: string, value: unknown) {\n    const json = JSON.stringify(value);\n    const storedKeys = localStorage.getItem(prefix);\n    const keys: string[] = storedKeys === null ? [] : JSON.parse(storedKeys);\n    if (!keys.includes(key)) {\n      keys.push(key);\n      localStorage.setItem(prefix, JSON.stringify(keys));\n    }\n    localStorage.setItem(addPrefix(key), json);\n  }\n\n  unset(key: string): boolean {\n    // Remove it before we do anything else.\n    localStorage.removeItem(addPrefix(key));\n\n    // Then remove it from the list of keys.\n    const storedKeys = localStorage.getItem(prefix);\n    const keys: string[] = storedKeys === null ? [] : JSON.parse(storedKeys);\n    const index = keys.indexOf(key);\n\n    // If it doesn't exist we don't have to remove it.\n    if (index === -1) return false;\n\n    keys.splice(index, 1);\n    localStorage.setItem(prefix, JSON.stringify(keys));\n    return true;\n  }\n}\n\nexport const useStore = (): Store => {\n  if (!instance) {\n    instance = new Store();\n  }\n  return instance;\n};\n","import { apiFetch, toTimeParameter } from './api';\nimport { useStore } from './store';\nimport { MINUTE_MS, startOfDay } from '../helpers/time';\n\nimport type { ApiParameters, ApiResponse } from './api';\n\n// Throttle requests to five minutes.\nconst THROTTLE_MS = 5 * MINUTE_MS;\n\n/**\n * Internal format for readings.\n */\nexport type Reading = [\n  timestamp: number, // Unix epoch timestamp (seconds).\n  value: number // Value.\n];\n\n/**\n * Internal format for readings.\n */\nexport interface ReadingOptions {\n  since?: Date; // Time from.\n}\n\n/**\n * Internal format for readings.\n */\ntype ReadingResponse = [a: Reading[], b: ApiResponse<ReadingDTO[]>];\n\n/**\n * Data transfer object for readings provided by the API.\n */\nexport interface ReadingDTO {\n  '@id': string; // The URL of this reading.\n  dateTime: string; // e.g. '2023-05-13T09:00:00Z'.\n  measure: string; // The URL of the measure.\n  // See https://github.com/pb-uk/river-data-widget/issues/5.\n  value?: unknown; // The value in the appropriate units.\n}\n\ninterface StoredReadings {\n  storedSince: number;\n  lastCheck: number;\n  data: Reading[];\n}\n\n/**\n * Fetch the readings for a measure.\n *\n * @param id The EA measure id.\n * @returns A promise for an array of readings for the measure.\n */\nconst fetchMeasureReadings = async (\n  id: string,\n  options: ReadingOptions = {}\n): Promise<ReadingResponse> => {\n  // Set the parameters for the request.\n  const params: ApiParameters = { _sorted: '' };\n  if (options.since) {\n    params.since = toTimeParameter(options.since);\n  }\n  // Get the response, casting the items to ReadingDTOs.\n  const response = <ApiResponse<ReadingDTO[]>>(\n    await apiFetch(`/id/measures/${id}/readings`, params)\n  );\n  return [parseReadings(response.data.items)[id] || [], response];\n};\n\nexport const filterSince = (data: Reading[], since: number) => {\n  const position = data.findIndex((reading) => reading[0] >= since);\n  return position < 0 ? [] : data.slice(position);\n};\n\n/**\n * Get the readings for a measure.\n *\n * @todo Caching and throttling.\n *\n * @param id The EA measure id.\n * @returns A promise for an array of readings for the measure.\n */\nexport const getMeasureReadings = async (\n  id: string,\n  options: ReadingOptions = {}\n): Promise<Reading[]> => {\n  // Get the saved readings.\n  const key = `readings|${id}`;\n  const store = useStore();\n\n  const stored: StoredReadings = store.get(key) || {\n    data: [],\n    lastCheck: 0,\n    storedSince: Infinity,\n  };\n  const { data, lastCheck } = stored;\n  let { storedSince } = stored;\n\n  const discardBefore = startOfDay(null, -8, true).valueOf() / 1000;\n\n  // Discard any older than 30 days.\n  while (data.length && data[0][0] < discardBefore) {\n    [storedSince] = data[0];\n    data.shift();\n  }\n\n  // If we have data early enough apply throttle.\n  const lastStored = data.length ? data[data.length - 1][0] : 0;\n  const requestedSince = (options.since && options.since.valueOf() / 1000) || 0;\n  if (\n    storedSince <= requestedSince &&\n    Date.now() < lastCheck * 1000 + THROTTLE_MS\n  ) {\n    // Throttled.\n    return filterSince(data, requestedSince);\n  }\n\n  const fetchOptions: ReadingOptions = {\n    ...options,\n    since: new Date(Math.max(requestedSince, lastStored) * 1000),\n  };\n\n  const [newData] = await fetchMeasureReadings(id, fetchOptions);\n  mergeReadings(data, newData);\n  storedSince = Math.min(requestedSince, storedSince);\n  store.set(key, { lastCheck: Date.now() / 1000, data, storedSince });\n  return filterSince(data, requestedSince);\n};\n\nexport const mergeReadings = (first: Reading[], second: Reading[]): void => {\n  if (!second.length) return;\n\n  let firstPos = first.length - 1;\n  while (firstPos >= 0 && first[firstPos][0] >= second[0][0]) {\n    --firstPos;\n  }\n  first.splice(firstPos + 1, Infinity, ...second);\n};\n\nexport const parseReadings = (\n  items: ReadingDTO[]\n): Record<string, Reading[]> => {\n  const ranges: Record<string, Reading[]> = {};\n  for (const { measure, dateTime, value } of items) {\n    if (ranges[measure] == null) {\n      ranges[measure] = [];\n    }\n    // Ignore missing or unexpected values - see\n    // https://github.com/pb-uk/river-data-widget/issues/5\n    if (typeof value === 'number' && !isNaN(value)) {\n      ranges[measure].unshift([new Date(dateTime).valueOf() / 1000, value]);\n    }\n  }\n\n  const rangesById: Record<string, Reading[]> = {};\n  for (const [key, range] of Object.entries(ranges)) {\n    rangesById[key.substring(key.lastIndexOf('/') + 1)] = range;\n  }\n\n  return rangesById;\n};\n","import { RiverDataWidgetError } from '../error';\nimport { round3 } from '../helpers/format';\nimport {\n  parseMeasureId,\n  translateMeasureProperties,\n} from '../flood-monitoring-api/measure';\nimport { Chart } from './chart';\nimport { getMeasureReadings as getFloodMeasureReadings } from '../flood-monitoring-api';\nimport { startOfDay } from '../helpers/time';\n\nimport type { ChartSeries } from './chart';\nimport type { Reading } from '../flood-monitoring-api/reading';\n\nexport const drawMeasureWidget = async (\n  parentEl: HTMLElement,\n  measureId: string,\n  options: Record<string, unknown> = {}\n) => {\n  // Get readings for the last 7 days in local time.\n  const since = startOfDay(null, -7, true);\n  let data: Reading[] = [];\n\n  // Get the right API.\n  const parts = measureId.split('/');\n  const id = parts.pop() ?? '';\n  const api = parts.length === 0 ? 'flood' : parts[0];\n  switch (api) {\n    case 'flood':\n      data = await getFloodMeasureReadings(id, { since });\n  }\n\n  // Clear the GUI deck.\n  parentEl.replaceChildren();\n\n  const measure = parseMeasureId(measureId);\n  const { unit } = translateMeasureProperties(measure);\n\n  const series1: ChartSeries = { data, unit, formatter: round3 };\n  // Set max/min options for plot from widget options.\n  if (options.riverDataWidgetMaxValue != null) {\n    series1.max = parseFloat(<string>options.riverDataWidgetMaxValue);\n  }\n  if (options.riverDataWidgetMinValue != null) {\n    series1.min = parseFloat(<string>options.riverDataWidgetMinValue);\n  }\n\n  // Deal with no data.\n  if (data.length === 0) {\n    const minTime = since.valueOf() / 1000;\n    const maxTime = minTime + 86400 * 7;\n    const chartOptions = { minTime, maxTime };\n\n    const chart = new Chart(parentEl, [series1], chartOptions);\n    chart.render();\n    return;\n  }\n\n  const minTime = startOfDay(new Date(data[0][0] * 1000)).valueOf() / 1000;\n  const maxTime =\n    startOfDay(new Date(data[data.length - 1][0] * 1000), 1).valueOf() / 1000;\n  const chartOptions = {\n    minTime,\n    maxTime,\n    // attribution: `www.riverdata.co.uk/station/${measure.stationId}`,\n  };\n\n  const chart = new Chart(parentEl, [series1], chartOptions);\n  chart.render();\n};\n\n/**\n * Load a widget specified by a DOM element.\n */\nexport const loadWidget = (el: HTMLElement | string) => {\n  // Get the target element from a query selector if necessary and check it\n  // exists.\n  const targetEl =\n    typeof el === 'string' ? <HTMLElement>document.querySelector(el) : el;\n  if (targetEl === null) {\n    throw new Error('Target element not found');\n  }\n\n  // Parse element for widget type and options.\n  const widgetIdParts = targetEl.dataset.riverDataWidget?.split(':') ?? [];\n  const type = widgetIdParts.shift();\n  const id = widgetIdParts.join(':');\n  const options = targetEl.dataset;\n\n  switch (type) {\n    case 'measure':\n      drawMeasureWidget(targetEl, id, options);\n      break;\n    default:\n      throw new RiverDataWidgetError('Unknown widget definition', { type, id });\n  }\n};\n","/**\n * RiverDataWidget https://github.com/pb-uk/river-data-widget.\n *\n * @copyright Copyright (C) 2022 pbuk https://github.com/pb-uk.\n * @license AGPL-3.0-or-later see LICENSE.md.\n */\n\nexport { drawMeasureWidget } from './widget/render';\n\nexport const version = '1.2.1';\n"],"names":["getFloodMeasureReadings"],"mappings":"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"}