@dclimate/zarr-map 0.1.0

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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +374 -0
  3. package/dist/core/index.cjs +1603 -0
  4. package/dist/core/index.cjs.map +1 -0
  5. package/dist/core/index.d.cts +50 -0
  6. package/dist/core/index.d.ts +50 -0
  7. package/dist/core/index.js +1575 -0
  8. package/dist/core/index.js.map +1 -0
  9. package/dist/dclimate/index.cjs +1859 -0
  10. package/dist/dclimate/index.cjs.map +1 -0
  11. package/dist/dclimate/index.d.cts +80 -0
  12. package/dist/dclimate/index.d.ts +80 -0
  13. package/dist/dclimate/index.js +1856 -0
  14. package/dist/dclimate/index.js.map +1 -0
  15. package/dist/index.cjs +3071 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.cts +5 -0
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.js +3038 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/jaxray-CZWT_ZgD.d.ts +57 -0
  22. package/dist/jaxray-D_mmLPHk.d.cts +57 -0
  23. package/dist/react/index.cjs +3953 -0
  24. package/dist/react/index.cjs.map +1 -0
  25. package/dist/react/index.d.cts +71 -0
  26. package/dist/react/index.d.ts +71 -0
  27. package/dist/react/index.js +3945 -0
  28. package/dist/react/index.js.map +1 -0
  29. package/dist/renderers/index.cjs +903 -0
  30. package/dist/renderers/index.cjs.map +1 -0
  31. package/dist/renderers/index.d.cts +115 -0
  32. package/dist/renderers/index.d.ts +115 -0
  33. package/dist/renderers/index.js +899 -0
  34. package/dist/renderers/index.js.map +1 -0
  35. package/dist/types-DEZwfJNY.d.cts +210 -0
  36. package/dist/types-DEZwfJNY.d.ts +210 -0
  37. package/docs/README.md +12 -0
  38. package/docs/api-design.md +185 -0
  39. package/docs/architecture.md +246 -0
  40. package/docs/decision-record-renderer.md +144 -0
  41. package/docs/package-boundaries.md +50 -0
  42. package/docs/release-checklist.md +31 -0
  43. package/package.json +121 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/core/color.ts","../../src/core/validation.ts","../../src/core/selectors.ts","../../src/renderers/maplibre.ts"],"names":["colors"],"mappings":"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","file":"index.js","sourcesContent":["export type GridErrorCode =\n | \"MISSING_VARIABLE\"\n | \"MISSING_DIMENSION\"\n | \"MISSING_SPATIAL_DIMENSIONS\"\n | \"MISSING_BOUNDS\"\n | \"MISSING_COORDINATES\"\n | \"UNSUPPORTED_DIMENSION\"\n | \"UNSUPPORTED_SELECTOR\"\n | \"UNSUPPORTED_GEOMETRY\"\n | \"UNSUPPORTED_DTYPE\"\n | \"UNSUPPORTED_UNIT\"\n | \"INVALID_COLOR_SCALE\"\n | \"QUERY_TOO_EXPENSIVE\"\n | \"ABORTED\"\n | \"SOURCE_LOAD_FAILED\"\n | \"RENDERER_SETUP_FAILED\"\n | \"CHUNK_LOAD_FAILED\";\n\nexport interface GridErrorDetails {\n code: GridErrorCode;\n message: string;\n cause?: unknown;\n dimension?: string;\n variable?: string;\n sourceId?: string;\n context?: Record<string, unknown>;\n}\n\nexport class GridError extends Error {\n readonly code: GridErrorCode;\n override readonly cause?: unknown;\n readonly dimension?: string;\n readonly variable?: string;\n readonly sourceId?: string;\n readonly context?: Record<string, unknown>;\n\n constructor(details: GridErrorDetails) {\n super(details.message);\n this.name = \"GridError\";\n this.code = details.code;\n this.cause = details.cause;\n this.dimension = details.dimension;\n this.variable = details.variable;\n this.sourceId = details.sourceId;\n this.context = details.context;\n }\n}\n\nexport function isGridError(error: unknown): error is GridError {\n return error instanceof GridError;\n}\n\nexport function toGridError(details: GridErrorDetails | GridError): GridError {\n return details instanceof GridError ? details : new GridError(details);\n}\n","import { GridError } from \"./errors\";\nimport type { ColorPalette, GridColorScale, GridDisplayQuantity } from \"./types\";\n\nexport type RendererColorMap = readonly string[];\n\nconst builtinPalettes: Record<string, RendererColorMap> = {\n viridis: [\"#440154\", \"#31688e\", \"#35b779\", \"#fde725\"],\n inferno: [\"#000004\", \"#57106e\", \"#bc3754\", \"#f98e09\", \"#fcffa4\"],\n magma: [\"#000004\", \"#3b0f70\", \"#8c2981\", \"#de4968\", \"#fe9f6d\", \"#fcfdbf\"],\n plasma: [\"#0d0887\", \"#7e03a8\", \"#cc4778\", \"#f89540\", \"#f0f921\"],\n cividis: [\"#00204c\", \"#31446b\", \"#666870\", \"#958f78\", \"#c6b866\", \"#ffe945\"],\n turbo: [\"#30123b\", \"#466be3\", \"#35ab6b\", \"#faba39\", \"#7a0403\"],\n greys: [\"#000000\", \"#777777\", \"#ffffff\"],\n grays: [\"#000000\", \"#777777\", \"#ffffff\"],\n temperature: [\"#2c5ab4\", \"#67b0f0\", \"#e0e4dc\", \"#ffb266\", \"#cd4434\"],\n precipitation: [\"#bae6fd\", \"#60a5fa\", \"#2563eb\", \"#4f46e5\", \"#6d28d9\"],\n humidity: [\"#374151\", \"#2d5a6e\", \"#1890b0\", \"#2dd4bf\", \"#99f6e4\"],\n vegetation: [\"#f7fee7\", \"#bef264\", \"#4ade80\", \"#15803d\", \"#064e3b\"],\n wind: [\"#e2e8f0\", \"#7dd3fc\", \"#2dd4bf\", \"#14b8a6\"]\n};\n\nexport function validateColorScale(colorScale: GridColorScale): GridColorScale {\n const [min, max] = colorScale.domain;\n\n if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) {\n throw new GridError({\n code: \"INVALID_COLOR_SCALE\",\n message: \"Color scale domain must be finite and ordered as [min, max].\",\n context: { domain: colorScale.domain }\n });\n }\n\n if (!colorScale.palette) {\n throw new GridError({\n code: \"INVALID_COLOR_SCALE\",\n message: \"Color scale must include a palette name or color stop array.\"\n });\n }\n\n paletteToRendererColorMap(colorScale.palette);\n return colorScale;\n}\n\nexport function colorScaleToRendererOptions(colorScale?: GridColorScale):\n | {\n colormap?: RendererColorMap;\n clim?: readonly [number, number];\n }\n | undefined {\n if (!colorScale) {\n return undefined;\n }\n\n validateColorScale(colorScale);\n return {\n colormap: paletteToRendererColorMap(colorScale.palette),\n clim: colorScale.domain\n };\n}\n\nexport function paletteToRendererColorMap(palette: ColorPalette): RendererColorMap {\n if (typeof palette !== \"string\") {\n if (palette.length < 2) {\n throw new GridError({\n code: \"INVALID_COLOR_SCALE\",\n message: \"Custom color palettes must include at least two color stops.\",\n context: { palette }\n });\n }\n const colors = palette.map((color) => color.trim());\n const invalid = colors.find((color) => color.length === 0);\n if (invalid !== undefined) {\n throw new GridError({\n code: \"INVALID_COLOR_SCALE\",\n message: \"Custom color palettes cannot include empty color stops.\",\n context: { palette }\n });\n }\n return colors;\n }\n\n const normalized = palette.toLowerCase();\n const colors = builtinPalettes[normalized];\n if (!colors) {\n throw new GridError({\n code: \"INVALID_COLOR_SCALE\",\n message: `Unsupported renderer palette \"${palette}\". Use one of: ${Object.keys(builtinPalettes).join(\", \")}.`,\n context: { palette }\n });\n }\n return colors;\n}\n\nexport function colorScaleDisplayDomain(colorScale: GridColorScale): readonly [number, number] {\n const { displayUnit, quantity, unit } = colorScale;\n if (!displayUnit || !unit || displayUnit === unit || !quantity) {\n return colorScale.domain;\n }\n\n return [\n convertDisplayValue(colorScale.domain[0], {\n fromUnit: unit,\n quantity,\n toUnit: displayUnit\n }),\n convertDisplayValue(colorScale.domain[1], {\n fromUnit: unit,\n quantity,\n toUnit: displayUnit\n })\n ];\n}\n\nexport function convertDisplayValue(\n value: number,\n options: {\n fromUnit: string;\n toUnit: string;\n quantity: GridDisplayQuantity;\n }\n): number {\n if (!Number.isFinite(value)) {\n return value;\n }\n\n if (options.quantity === \"temperature\") {\n return temperatureFromKelvin(temperatureToKelvin(value, options.fromUnit), options.toUnit);\n }\n\n return precipitationFromMeters(precipitationToMeters(value, options.fromUnit), options.toUnit);\n}\n\nfunction temperatureToKelvin(value: number, unit: string): number {\n const normalized = normalizeUnit(unit);\n if (normalized === \"k\" || normalized === \"kelvin\") {\n return value;\n }\n if ([\"c\", \"degc\", \"celsius\"].includes(normalized)) {\n return value + 273.15;\n }\n if ([\"f\", \"degf\", \"fahrenheit\"].includes(normalized)) {\n return ((value - 32) * 5) / 9 + 273.15;\n }\n throw unsupportedUnit(unit, \"temperature\");\n}\n\nfunction temperatureFromKelvin(value: number, unit: string): number {\n const normalized = normalizeUnit(unit);\n if (normalized === \"k\" || normalized === \"kelvin\") {\n return value;\n }\n if ([\"c\", \"degc\", \"celsius\"].includes(normalized)) {\n return value - 273.15;\n }\n if ([\"f\", \"degf\", \"fahrenheit\"].includes(normalized)) {\n return ((value - 273.15) * 9) / 5 + 32;\n }\n throw unsupportedUnit(unit, \"temperature\");\n}\n\nfunction precipitationToMeters(value: number, unit: string): number {\n const normalized = normalizeUnit(unit);\n if ([\"m\", \"meter\", \"meters\"].includes(normalized)) {\n return value;\n }\n if ([\"mm\", \"millimeter\", \"millimeters\"].includes(normalized)) {\n return value / 1000;\n }\n if (isKilogramPerSquareMeter(normalized)) {\n return value / 1000;\n }\n if ([\"in\", \"inch\", \"inches\"].includes(normalized)) {\n return value * 0.0254;\n }\n throw unsupportedUnit(unit, \"precipitation\");\n}\n\nfunction precipitationFromMeters(value: number, unit: string): number {\n const normalized = normalizeUnit(unit);\n if ([\"m\", \"meter\", \"meters\"].includes(normalized)) {\n return value;\n }\n if ([\"mm\", \"millimeter\", \"millimeters\"].includes(normalized)) {\n return value * 1000;\n }\n if (isKilogramPerSquareMeter(normalized)) {\n return value * 1000;\n }\n if ([\"in\", \"inch\", \"inches\"].includes(normalized)) {\n return value / 0.0254;\n }\n throw unsupportedUnit(unit, \"precipitation\");\n}\n\nfunction isKilogramPerSquareMeter(normalizedUnit: string): boolean {\n const compact = normalizedUnit.replace(/\\s+/g, \"\");\n return [\"kgm**-2\", \"kgm^-2\", \"kgm-2\", \"kg/m2\", \"kg/m^2\"].includes(compact);\n}\n\nfunction normalizeUnit(unit: string): string {\n return unit\n .trim()\n .toLowerCase()\n .replace(/^degrees?_?/, \"deg\")\n .replace(\"°\", \"deg\");\n}\n\nfunction unsupportedUnit(unit: string, quantity: GridDisplayQuantity): GridError {\n return new GridError({\n code: \"UNSUPPORTED_UNIT\",\n message: `Unsupported ${quantity} display unit \"${unit}\".`,\n context: { quantity, unit }\n });\n}\n","import { GridError } from \"./errors\";\nimport type {\n GridDataSource,\n GridDimension,\n GridSourceValidationResult,\n GridSpatialDimensions,\n GridVariable\n} from \"./types\";\n\nconst xAliases = new Set([\"x\", \"lon\", \"lng\", \"longitude\"]);\nconst yAliases = new Set([\"y\", \"lat\", \"latitude\"]);\nconst numericDtypes = new Set([\n \"int8\",\n \"uint8\",\n \"int16\",\n \"uint16\",\n \"int32\",\n \"uint32\",\n \"float32\",\n \"float64\",\n \"i1\",\n \"u1\",\n \"i2\",\n \"u2\",\n \"i4\",\n \"u4\",\n \"f4\",\n \"f8\"\n]);\n\nexport function findVariable(\n source: GridDataSource,\n variableName: string\n): GridVariable | undefined {\n return source.variables.find(\n (variable) => variable.name === variableName || variable.path === variableName\n );\n}\n\nexport function findDimension(\n source: GridDataSource,\n dimensionName: string\n): GridDimension | undefined {\n return source.dimensions.find((dimension) => dimension.name === dimensionName);\n}\n\nexport function inferSpatialDimensions(\n source: GridDataSource,\n variableName = source.variables[0]?.name\n): GridSpatialDimensions | undefined {\n const variable = variableName ? findVariable(source, variableName) : source.variables[0];\n if (source.spatialDimensions) {\n return variableIncludesSpatialDimensions(variable, source.spatialDimensions)\n ? source.spatialDimensions\n : undefined;\n }\n\n const candidateNames =\n variable?.dimensions ?? source.dimensions.map((dimension) => dimension.name);\n let x: string | undefined;\n let y: string | undefined;\n\n for (const name of candidateNames) {\n const dimension = findDimension(source, name);\n const normalizedName = name.toLowerCase();\n const standardName = String(dimension?.standardName ?? \"\").toLowerCase();\n const kind = dimension?.kind;\n\n if (!x && (kind === \"x\" || xAliases.has(normalizedName) || standardName === \"longitude\")) {\n x = name;\n }\n\n if (!y && (kind === \"y\" || yAliases.has(normalizedName) || standardName === \"latitude\")) {\n y = name;\n }\n }\n\n return x && y ? { x, y } : undefined;\n}\n\nfunction variableIncludesSpatialDimensions(\n variable: GridVariable | undefined,\n spatialDimensions: GridSpatialDimensions\n): boolean {\n if (!variable) {\n return false;\n }\n return (\n variable.dimensions.includes(spatialDimensions.x) &&\n variable.dimensions.includes(spatialDimensions.y)\n );\n}\n\nexport function validateGridDataSource(\n source: GridDataSource,\n options: { variable?: string; requireRenderable?: boolean } = {}\n): GridSourceValidationResult {\n const errors: GridError[] = [];\n const warnings: string[] = [];\n\n if (source.variables.length === 0) {\n errors.push(\n new GridError({\n code: \"MISSING_VARIABLE\",\n message: \"GridDataSource must expose at least one variable.\",\n sourceId: source.id\n })\n );\n }\n\n const variable = options.variable ? findVariable(source, options.variable) : source.variables[0];\n if (options.variable && !variable) {\n errors.push(\n new GridError({\n code: \"MISSING_VARIABLE\",\n message: `Variable \"${options.variable}\" is not present in the grid source.`,\n sourceId: source.id,\n variable: options.variable\n })\n );\n }\n\n for (const dimension of source.dimensions) {\n if (!Number.isInteger(dimension.size) || dimension.size <= 0) {\n errors.push(\n new GridError({\n code: \"UNSUPPORTED_DIMENSION\",\n message: `Dimension \"${dimension.name}\" must have a positive integer size.`,\n dimension: dimension.name,\n sourceId: source.id\n })\n );\n }\n\n if (dimension.coordinates && dimension.coordinates.length !== dimension.size) {\n errors.push(\n new GridError({\n code: \"MISSING_COORDINATES\",\n message: `Dimension \"${dimension.name}\" has ${dimension.coordinates.length} coordinates for size ${dimension.size}.`,\n dimension: dimension.name,\n sourceId: source.id\n })\n );\n }\n }\n\n if (variable) {\n if (!isNumericDType(variable.dtype)) {\n errors.push(\n new GridError({\n code: \"UNSUPPORTED_DTYPE\",\n message: `Variable \"${variable.name}\" has unsupported dtype \"${variable.dtype}\".`,\n variable: variable.name,\n sourceId: source.id\n })\n );\n }\n\n if (variable.dimensions.length !== variable.shape.length) {\n errors.push(\n new GridError({\n code: \"MISSING_DIMENSION\",\n message: `Variable \"${variable.name}\" has ${variable.dimensions.length} dimensions but ${variable.shape.length} shape entries.`,\n variable: variable.name,\n sourceId: source.id\n })\n );\n }\n\n variable.dimensions.forEach((dimensionName, index) => {\n const dimension = findDimension(source, dimensionName);\n if (!dimension) {\n errors.push(\n new GridError({\n code: \"MISSING_DIMENSION\",\n message: `Variable \"${variable.name}\" references missing dimension \"${dimensionName}\".`,\n dimension: dimensionName,\n variable: variable.name,\n sourceId: source.id\n })\n );\n return;\n }\n\n const expectedSize = variable.shape[index];\n if (expectedSize !== dimension.size) {\n warnings.push(\n `Variable \"${variable.name}\" shape for dimension \"${dimensionName}\" is ${expectedSize}, but the dimension size is ${dimension.size}.`\n );\n }\n });\n\n const spatialDimensions = inferSpatialDimensions(source, variable.name);\n if (!spatialDimensions) {\n errors.push(\n new GridError({\n code: \"MISSING_SPATIAL_DIMENSIONS\",\n message: `Variable \"${variable.name}\" needs latitude/longitude or x/y spatial dimensions before it can render.`,\n variable: variable.name,\n sourceId: source.id\n })\n );\n }\n\n if (options.requireRenderable && !source.bounds) {\n errors.push(\n new GridError({\n code: \"MISSING_BOUNDS\",\n message:\n \"Renderable grid sources must include explicit [west, south, east, north] bounds.\",\n variable: variable.name,\n sourceId: source.id\n })\n );\n }\n }\n\n return {\n ok: errors.length === 0,\n errors,\n warnings\n };\n}\n\nexport function assertValidGridDataSource(\n source: GridDataSource,\n options: { variable?: string; requireRenderable?: boolean } = {}\n): void {\n const result = validateGridDataSource(source, options);\n if (!result.ok) {\n throw result.errors[0];\n }\n}\n\nexport function isNumericDType(dtype: string): boolean {\n return numericDtypes.has(dtype.toLowerCase()) || /^[<>|]?[ifu]\\d+$/.test(dtype.toLowerCase());\n}\n","import { GridError } from \"./errors\";\nimport { findDimension, findVariable } from \"./validation\";\nimport type {\n DebounceHandle,\n GridCoordinateValue,\n GridDataSource,\n GridDimension,\n GridSelectorInput,\n GridSelectors,\n NormalizedGridSelectors,\n NormalizedSelector,\n TimeCoordinate\n} from \"./types\";\n\nexport function indexSelector(index: number): GridSelectorInput {\n return { kind: \"index\", index };\n}\n\nexport function coordinateSelector(value: GridCoordinateValue): GridSelectorInput {\n return { kind: \"coordinate\", value };\n}\n\nexport function isoTimeSelector(iso: string): GridSelectorInput {\n return { kind: \"isoTime\", iso };\n}\n\nexport function normalizeSelectors(\n source: GridDataSource,\n variableName: string,\n selectors: GridSelectors = {}\n): NormalizedGridSelectors {\n const variable = findVariable(source, variableName);\n if (!variable) {\n throw new GridError({\n code: \"MISSING_VARIABLE\",\n message: `Variable \"${variableName}\" is not present in the grid source.`,\n variable: variableName,\n sourceId: source.id\n });\n }\n\n const normalized: NormalizedGridSelectors = {};\n for (const dimensionName of variable.dimensions) {\n const dimension = findDimension(source, dimensionName);\n if (!dimension) {\n throw new GridError({\n code: \"MISSING_DIMENSION\",\n message: `Selector normalization cannot find dimension \"${dimensionName}\".`,\n dimension: dimensionName,\n variable: variableName,\n sourceId: source.id\n });\n }\n\n const input = selectors[dimensionName];\n if (input === undefined) {\n normalized[dimensionName] = defaultSelectorForDimension(dimension);\n continue;\n }\n\n normalized[dimensionName] = normalizeSelectorValue(dimension, input, source.id);\n }\n\n return normalized;\n}\n\nexport function normalizeSelectorValue(\n dimension: GridDimension,\n input: GridSelectorInput,\n sourceId?: string\n): NormalizedSelector {\n if (input instanceof Date) {\n return { kind: \"coordinate\", value: input.toISOString() };\n }\n\n if (typeof input !== \"object\") {\n return normalizeCoordinateSelector(dimension, input, sourceId);\n }\n\n if (input.kind === \"coordinate\") {\n const value = input.value instanceof Date ? input.value.toISOString() : input.value;\n return normalizeCoordinateSelector(dimension, value, sourceId);\n }\n\n if (input.kind === \"index\") {\n assertIndexInRange(dimension, input.index, sourceId);\n const value = dimension.coordinates?.[input.index];\n return {\n kind: \"index\",\n index: input.index,\n value: value instanceof Date ? value.toISOString() : value\n };\n }\n\n if (input.kind === \"isoTime\") {\n const value = findCoordinateForIso(dimension, input.iso);\n return value === undefined\n ? { kind: \"isoTime\", iso: input.iso }\n : { kind: \"isoTime\", iso: input.iso, value };\n }\n\n throw new GridError({\n code: \"UNSUPPORTED_SELECTOR\",\n message: `Unsupported selector for dimension \"${dimension.name}\".`,\n dimension: dimension.name,\n sourceId\n });\n}\n\nexport function toRendererSelectors(\n selectors: NormalizedGridSelectors\n): Record<string, { selected: number | string; type: \"index\" | \"value\" }> {\n const output: Record<string, { selected: number | string; type: \"index\" | \"value\" }> = {};\n\n for (const [dimensionName, selector] of Object.entries(selectors)) {\n if (selector.kind === \"index\") {\n output[dimensionName] = { selected: selector.index, type: \"index\" };\n continue;\n }\n\n if (selector.kind === \"isoTime\") {\n output[dimensionName] = {\n selected: selector.value ?? selector.iso,\n type: \"value\"\n };\n continue;\n }\n\n output[dimensionName] = { selected: selector.value, type: \"value\" };\n }\n\n return output;\n}\n\nexport function selectorToIndex(dimension: GridDimension, selector: NormalizedSelector): number {\n if (selector.kind === \"index\") {\n return selector.index;\n }\n\n const selected = selector.kind === \"isoTime\" ? (selector.value ?? selector.iso) : selector.value;\n const index =\n dimension.coordinates?.findIndex((coordinate) => sameCoordinate(coordinate, selected)) ?? -1;\n if (index >= 0) {\n return index;\n }\n\n throw new GridError({\n code: \"UNSUPPORTED_SELECTOR\",\n message: `Selector value \"${String(selected)}\" does not match coordinates for dimension \"${dimension.name}\".`,\n dimension: dimension.name\n });\n}\n\nexport function listTimeCoordinates(\n source: GridDataSource,\n dimensionName = \"time\"\n): readonly TimeCoordinate[] {\n const dimension = findDimension(source, dimensionName);\n if (!dimension) {\n throw new GridError({\n code: \"MISSING_DIMENSION\",\n message: `Time dimension \"${dimensionName}\" is not present in the grid source.`,\n dimension: dimensionName,\n sourceId: source.id\n });\n }\n\n if (!dimension.coordinates) {\n throw new GridError({\n code: \"MISSING_COORDINATES\",\n message: `Time dimension \"${dimensionName}\" needs coordinate values for a slider.`,\n dimension: dimensionName,\n sourceId: source.id\n });\n }\n\n const coordinates = dimension.coordinates.map((coordinate, index) => {\n const decoded = decodeTimeCoordinate(coordinate, dimension.units);\n const forecastLabel = formatForecastStepLabel(source, dimension, coordinate);\n return {\n index,\n value: decoded.value,\n label:\n forecastLabel ??\n (decoded.iso ? formatHumanUtcDateTime(decoded.iso) : String(decoded.value)),\n ...(decoded.iso ? { iso: decoded.iso } : {})\n };\n });\n\n assertMonotonicTimeCoordinates(coordinates, dimension.name, source.id);\n return coordinates;\n}\n\nfunction formatForecastStepLabel(\n source: GridDataSource,\n dimension: GridDimension,\n coordinate: GridCoordinateValue\n): string | undefined {\n if (!isForecastStepDimension(dimension.name)) {\n return undefined;\n }\n\n const reference = forecastReferenceDate(source);\n const offsetMs = forecastStepOffsetMs(coordinate, dimension.units);\n if (!reference || offsetMs === undefined) {\n return undefined;\n }\n\n return formatHumanUtcDateTime(new Date(reference.getTime() + offsetMs));\n}\n\nfunction isForecastStepDimension(name: string): boolean {\n return normalizeDimensionName(name) === \"step\";\n}\n\nfunction forecastReferenceDate(source: GridDataSource): Date | undefined {\n const referenceDimension = source.dimensions.find((dimension) =>\n [\"forecastreferencetime\", \"forecastreferencedate\"].includes(\n normalizeDimensionName(dimension.name)\n )\n );\n if (!referenceDimension) {\n return undefined;\n }\n\n const referenceCoordinate = referenceDimension.coordinates?.[0];\n if (referenceCoordinate === undefined) {\n return undefined;\n }\n\n const decoded = decodeTimeCoordinate(referenceCoordinate, referenceDimension.units);\n const referenceValue =\n decoded.iso ?? (typeof decoded.value === \"string\" ? decoded.value : undefined);\n if (!referenceValue) {\n return undefined;\n }\n\n const date = new Date(referenceValue);\n return Number.isNaN(date.getTime()) ? undefined : date;\n}\n\nfunction forecastStepOffsetMs(coordinate: GridCoordinateValue, units?: string): number | undefined {\n const value = numericCoordinateValue(coordinate);\n if (value === undefined) {\n return undefined;\n }\n\n return value * forecastStepUnitMultiplier(units);\n}\n\nfunction numericCoordinateValue(coordinate: GridCoordinateValue): number | undefined {\n if (typeof coordinate === \"number\") {\n return Number.isFinite(coordinate) ? coordinate : undefined;\n }\n if (typeof coordinate !== \"string\") {\n return undefined;\n }\n\n const value = Number(coordinate);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction forecastStepUnitMultiplier(units?: string): number {\n const normalizedUnits = units?.toLowerCase() ?? \"\";\n if (normalizedUnits.includes(\"second\")) {\n return 1_000;\n }\n if (normalizedUnits.includes(\"minute\")) {\n return 60_000;\n }\n if (normalizedUnits.includes(\"day\")) {\n return 86_400_000;\n }\n return 3_600_000;\n}\n\nfunction normalizeDimensionName(name: string): string {\n return name.toLowerCase().replace(/[_\\-\\s]+/g, \"\");\n}\n\nconst UTC_MONTH_LABELS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n] as const;\n\nfunction formatHumanUtcDateTime(input: Date | string): string {\n const date = input instanceof Date ? input : new Date(input);\n return [\n UTC_MONTH_LABELS[date.getUTCMonth()],\n \" \",\n date.getUTCDate(),\n \", \",\n date.getUTCFullYear(),\n \", \",\n padDatePart(date.getUTCHours()),\n \":\",\n padDatePart(date.getUTCMinutes()),\n \" UTC\"\n ].join(\"\");\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nexport function createDebouncer<TArgs extends readonly unknown[]>(\n callback: (...args: TArgs) => void,\n waitMs: number\n): DebounceHandle<TArgs> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: TArgs | undefined;\n\n const flush = () => {\n if (!lastArgs) {\n return;\n }\n const args = lastArgs;\n lastArgs = undefined;\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n callback(...args);\n };\n\n return {\n call(...args: TArgs) {\n lastArgs = args;\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(flush, waitMs);\n },\n flush,\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = undefined;\n lastArgs = undefined;\n }\n };\n}\n\nfunction defaultSelectorForDimension(dimension: GridDimension): NormalizedSelector {\n const firstValue = dimension.coordinates?.[0];\n if (firstValue !== undefined) {\n return {\n kind: \"coordinate\",\n value: firstValue instanceof Date ? firstValue.toISOString() : firstValue\n };\n }\n return { kind: \"index\", index: 0 };\n}\n\nfunction normalizeCoordinateSelector(\n dimension: GridDimension,\n value: number | string,\n sourceId?: string\n): NormalizedSelector {\n if (\n dimension.coordinates &&\n !dimension.coordinates.some((coordinate) => sameCoordinate(coordinate, value))\n ) {\n throw new GridError({\n code: \"UNSUPPORTED_SELECTOR\",\n message: `Selector value \"${String(value)}\" does not match coordinates for dimension \"${dimension.name}\".`,\n dimension: dimension.name,\n sourceId\n });\n }\n\n return { kind: \"coordinate\", value };\n}\n\nfunction assertIndexInRange(dimension: GridDimension, index: number, sourceId?: string): void {\n if (!Number.isInteger(index) || index < 0 || index >= dimension.size) {\n throw new GridError({\n code: \"UNSUPPORTED_SELECTOR\",\n message: `Index selector ${index} is outside dimension \"${dimension.name}\" size ${dimension.size}.`,\n dimension: dimension.name,\n sourceId\n });\n }\n}\n\nfunction findCoordinateForIso(dimension: GridDimension, iso: string): number | string | undefined {\n return dimension.coordinates\n ?.map((coordinate) => decodeTimeCoordinate(coordinate, dimension.units))\n .find((coordinate) => coordinate.iso === iso || coordinate.value === iso)?.value;\n}\n\nfunction decodeTimeCoordinate(\n coordinate: GridCoordinateValue,\n units?: string\n): { value: number | string; iso?: string } {\n if (coordinate instanceof Date) {\n return { value: coordinate.toISOString(), iso: coordinate.toISOString() };\n }\n\n if (typeof coordinate === \"string\") {\n const date = new Date(coordinate);\n return Number.isNaN(date.getTime())\n ? { value: coordinate }\n : { value: coordinate, iso: date.toISOString() };\n }\n\n const cfTime = decodeCfTime(coordinate, units);\n return cfTime ? { value: coordinate, iso: cfTime } : { value: coordinate };\n}\n\nfunction decodeCfTime(value: number, units?: string): string | undefined {\n if (!units) {\n return undefined;\n }\n\n const match =\n /^(seconds|minutes|hours|days) since ([0-9]{4}-[0-9]{2}-[0-9]{2})(?:[ T]([0-9:.Z+-]+))?/i.exec(\n units\n );\n if (!match) {\n return undefined;\n }\n\n const unit = match[1]?.toLowerCase();\n const date = match[2];\n const time = match[3] ?? \"00:00:00Z\";\n const origin = new Date(`${date}T${time.replace(/Z?$/, \"Z\")}`);\n if (Number.isNaN(origin.getTime())) {\n return undefined;\n }\n\n const multiplier =\n unit === \"seconds\"\n ? 1_000\n : unit === \"minutes\"\n ? 60_000\n : unit === \"hours\"\n ? 3_600_000\n : 86_400_000;\n return new Date(origin.getTime() + value * multiplier).toISOString();\n}\n\nfunction assertMonotonicTimeCoordinates(\n coordinates: readonly TimeCoordinate[],\n dimensionName: string,\n sourceId?: string\n): void {\n let direction: \"ascending\" | \"descending\" | undefined;\n\n for (let index = 1; index < coordinates.length; index += 1) {\n const previous = comparableTimeValue(coordinates[index - 1]);\n const current = comparableTimeValue(coordinates[index]);\n if (previous === current) {\n throw new GridError({\n code: \"UNSUPPORTED_DIMENSION\",\n message: `Time dimension \"${dimensionName}\" has duplicate coordinate values.`,\n dimension: dimensionName,\n sourceId\n });\n }\n\n const pairDirection = current > previous ? \"ascending\" : \"descending\";\n direction ??= pairDirection;\n if (pairDirection !== direction) {\n throw new GridError({\n code: \"UNSUPPORTED_DIMENSION\",\n message: `Time dimension \"${dimensionName}\" must be monotonic for slider controls.`,\n dimension: dimensionName,\n sourceId\n });\n }\n }\n}\n\nfunction comparableTimeValue(coordinate: TimeCoordinate | undefined): number {\n if (!coordinate) {\n return 0;\n }\n if (coordinate.iso) {\n return new Date(coordinate.iso).getTime();\n }\n if (typeof coordinate.value === \"number\") {\n return coordinate.value;\n }\n const parsed = new Date(coordinate.value).getTime();\n return Number.isNaN(parsed) ? coordinate.index : parsed;\n}\n\nfunction sameCoordinate(left: GridCoordinateValue, right: number | string): boolean {\n const normalizedLeft = left instanceof Date ? left.toISOString() : left;\n return normalizedLeft === right || String(normalizedLeft) === String(right);\n}\n","import { colorScaleToRendererOptions, normalizeSelectors, toRendererSelectors } from \"../core\";\nimport { GridError } from \"../core/errors\";\nimport { assertValidGridDataSource, inferSpatialDimensions } from \"../core/validation\";\nimport type {\n GridColorScale,\n GridDataSource,\n GridSelectors,\n GridSpatialDimensions\n} from \"../core/types\";\n\nexport interface MapLibreLike {\n addLayer(layer: GridLayerInstance, beforeId?: string): void;\n removeLayer(id: string): void;\n getLayer(id: string): unknown;\n removeSource?(id: string): void;\n getSource?(id: string): unknown;\n isStyleLoaded?(): boolean;\n on?(event: string, listener: (...args: readonly unknown[]) => void): void;\n off?(event: string, listener: (...args: readonly unknown[]) => void): void;\n once?(event: string, listener: (...args: readonly unknown[]) => void): void;\n loaded?(): boolean;\n remove?(): void;\n}\n\nexport type GridLayerLoadingStage = \"map\" | \"layer\" | \"metadata\" | \"chunks\" | \"complete\";\n\nexport interface GridLayerLoadingState {\n loading: boolean;\n metadata: boolean;\n chunks: boolean;\n percent: number;\n stage?: GridLayerLoadingStage;\n}\n\nexport interface GridLayerInstance {\n id: string;\n type?: string;\n setSelector?(\n selector: Record<string, { selected: number | string; type: \"index\" | \"value\" }>\n ): void;\n setVariable?(variable: string): void;\n setColormap?(palette: readonly string[]): void;\n setClim?(domain: readonly [number, number]): void;\n setOpacity?(opacity: number): void;\n queryData?(geometry: unknown): Promise<unknown>;\n onAdd?(map: MapLibreLike, gl: WebGLRenderingContext | WebGL2RenderingContext): void;\n onRemove?(map: MapLibreLike, gl: WebGLRenderingContext | WebGL2RenderingContext): void;\n}\n\nexport interface MapLibreMapConfig {\n container: string | HTMLElement;\n style: string | Record<string, unknown>;\n center?: [longitude: number, latitude: number];\n zoom?: number;\n bounds?: [[west: number, south: number], [east: number, north: number]];\n maxBounds?: [[west: number, south: number], [east: number, north: number]];\n attributionControl?: boolean;\n}\n\nexport interface ZarrLayerFactoryOptions {\n id: string;\n source?: string;\n store?: GridDataSource[\"store\"];\n variable: string;\n selector?: Record<string, { selected: number | string; type: \"index\" | \"value\" }>;\n spatialDimensions?: { lon: string; lat: string };\n zarrVersion?: 2 | 3;\n crs?: string;\n proj4?: string;\n bounds?: readonly [number, number, number, number];\n fillValue?: number | null;\n colormap?: readonly string[];\n clim?: readonly [number, number];\n opacity?: number;\n latIsAscending?: boolean;\n customFrag?: string;\n uniforms?: Record<string, number>;\n onLoad?: () => void;\n onError?: (error: unknown) => void;\n onLoadingStateChange?: (loading: boolean | Partial<GridLayerLoadingState>) => void;\n}\n\nexport type GridLayerFactory = (\n options: ZarrLayerFactoryOptions\n) => GridLayerInstance | Promise<GridLayerInstance>;\nexport type MapFactory = (config: MapLibreMapConfig) => MapLibreLike | Promise<MapLibreLike>;\n\nexport interface GridLayerOptions {\n source: GridDataSource;\n variable: string;\n selectors?: GridSelectors;\n colorScale?: GridColorScale;\n opacity?: number;\n layerId?: string;\n beforeId?: string;\n map?: MapLibreLike;\n mapConfig?: MapLibreMapConfig;\n layerFactory?: GridLayerFactory;\n mapFactory?: MapFactory;\n onLoadingChange?: (loading: boolean) => void;\n onLoadingStateChange?: (state: GridLayerLoadingState) => void;\n onError?: (error: GridError) => void;\n}\n\nexport interface GridLayerUpdate {\n source?: GridDataSource;\n variable?: string;\n selectors?: GridSelectors;\n colorScale?: GridColorScale;\n opacity?: number;\n}\n\nexport interface GridLayerController {\n readonly id: string;\n readonly ownsMap: boolean;\n mount(): Promise<void>;\n update(update: GridLayerUpdate): Promise<void>;\n remove(): void;\n query(geometry: unknown): Promise<unknown>;\n getMap(): MapLibreLike | undefined;\n getLayer(): GridLayerInstance | undefined;\n}\n\nexport function createMapLibreGridLayer(options: GridLayerOptions): GridLayerController {\n return new MapLibreGridLayerController(options);\n}\n\nexport function buildZarrLayerOptions(options: GridLayerOptions): ZarrLayerFactoryOptions {\n assertValidGridDataSource(options.source, {\n variable: options.variable,\n requireRenderable: true\n });\n const variable = options.source.variables.find(\n (candidate) => candidate.name === options.variable || candidate.path === options.variable\n );\n if (!variable) {\n throw new GridError({\n code: \"MISSING_VARIABLE\",\n message: `Variable \"${options.variable}\" is not present in the grid source.`,\n variable: options.variable,\n sourceId: options.source.id\n });\n }\n\n const spatialDimensions = inferSpatialDimensions(options.source, variable.name);\n if (!spatialDimensions) {\n throw new GridError({\n code: \"MISSING_SPATIAL_DIMENSIONS\",\n message: `Variable \"${variable.name}\" needs spatial dimensions before rendering.`,\n variable: variable.name,\n sourceId: options.source.id\n });\n }\n\n const colorOptions = colorScaleToRendererOptions(options.colorScale);\n const rendererVariable = variable.path ?? variable.name;\n const normalizedSelectors = normalizeSelectors(options.source, variable.name, options.selectors);\n const rendererSelectors = omitSpatialSelectors(normalizedSelectors, spatialDimensions);\n const yDimension = options.source.dimensions.find(\n (dimension) => dimension.name === spatialDimensions.y\n );\n const shaderOptions = buildColorScaleShaderOptions(options.colorScale, rendererVariable);\n\n return {\n id: options.layerId ?? `zarr-map-${options.source.id ?? variable.name}`,\n source: options.source.source,\n store: options.source.store,\n variable: rendererVariable,\n selector: toRendererSelectors(rendererSelectors),\n spatialDimensions: { lon: spatialDimensions.x, lat: spatialDimensions.y },\n zarrVersion: options.source.zarrVersion,\n crs: options.source.crs,\n proj4: options.source.proj4,\n bounds: options.source.bounds,\n fillValue: variable.fillValue,\n colormap: colorOptions?.colormap,\n clim: colorOptions?.clim,\n opacity: options.opacity,\n latIsAscending: yDimension?.ascending,\n customFrag: shaderOptions?.customFrag,\n uniforms: shaderOptions?.uniforms,\n onLoad: () => {\n options.onLoadingChange?.(false);\n options.onLoadingStateChange?.(completeLoadingState());\n },\n onLoadingStateChange: (state) => {\n const loadingState = normalizeLoadingState(state);\n options.onLoadingChange?.(loadingState.loading);\n options.onLoadingStateChange?.(loadingState);\n },\n onError: (error) =>\n options.onError?.(\n new GridError({\n code: \"CHUNK_LOAD_FAILED\",\n message: \"Zarr renderer reported a metadata or chunk loading error.\",\n cause: error,\n sourceId: options.source.id,\n variable: options.variable\n })\n )\n };\n}\n\nfunction buildColorScaleShaderOptions(\n colorScale: GridColorScale | undefined,\n rendererVariable: string\n): Pick<ZarrLayerFactoryOptions, \"customFrag\" | \"uniforms\"> | undefined {\n const transparentPalette = transparentPaletteKind(colorScale);\n if (!transparentPalette || !isValidGlslIdentifier(rendererVariable)) {\n return undefined;\n }\n\n return {\n customFrag:\n transparentPalette === \"vegetation\"\n ? vegetationOverlayShader(rendererVariable)\n : transparentPalette === \"magma\"\n ? magmaTransparentLowerBoundShader(rendererVariable)\n : precipitationOverlayShader(rendererVariable),\n uniforms: {}\n };\n}\n\nfunction precipitationOverlayShader(rendererVariable: string): string {\n return `\n if (${rendererVariable} <= 0.0) {\n discard;\n }\n\n float rescaled = clamp((${rendererVariable} - clim.x) / (clim.y - clim.x), 0.0, 1.0);\n vec4 c = texture(colormap, vec2(rescaled, 0.5));\n float precipAlpha = opacity * mix(0.22, 1.0, rescaled);\n fragColor = vec4(c.rgb, precipAlpha);\n fragColor.rgb *= fragColor.a;\n`;\n}\n\nfunction vegetationOverlayShader(rendererVariable: string): string {\n return `\n float vegetationRange = clim.y - clim.x;\n float noVegetationCutoff = clim.x + vegetationRange * 0.04;\n if (${rendererVariable} <= noVegetationCutoff) {\n discard;\n }\n\n float rescaled = clamp((${rendererVariable} - clim.x) / vegetationRange, 0.0, 1.0);\n vec4 c = texture(colormap, vec2(rescaled, 0.5));\n float vegetationAlpha = opacity * mix(0.14, 1.0, smoothstep(0.04, 0.85, rescaled));\n fragColor = vec4(c.rgb, vegetationAlpha);\n fragColor.rgb *= fragColor.a;\n`;\n}\n\nfunction magmaTransparentLowerBoundShader(rendererVariable: string): string {\n return `\n float rescaled = clamp((${rendererVariable} - clim.x) / (clim.y - clim.x), 0.0, 1.0);\n vec4 c = texture(colormap, vec2(rescaled, 0.5));\n float magmaAlpha = opacity * smoothstep(0.0, 0.2, rescaled);\n fragColor = vec4(c.rgb, magmaAlpha);\n fragColor.rgb *= fragColor.a;\n`;\n}\n\nfunction transparentPaletteKind(\n colorScale: GridColorScale | undefined\n): \"magma\" | \"precipitation\" | \"vegetation\" | undefined {\n if (typeof colorScale?.palette !== \"string\") {\n return undefined;\n }\n const palette = colorScale.palette.toLowerCase();\n if (palette === \"magma\" || palette === \"precipitation\" || palette === \"vegetation\") {\n return palette;\n }\n return undefined;\n}\n\nfunction isValidGlslIdentifier(value: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);\n}\n\nfunction colorScaleShaderSignature(options: GridLayerOptions): string {\n const variable = options.source.variables.find(\n (candidate) => candidate.name === options.variable || candidate.path === options.variable\n );\n const rendererVariable = variable?.path ?? variable?.name ?? options.variable;\n return buildColorScaleShaderOptions(options.colorScale, rendererVariable)?.customFrag ?? \"\";\n}\n\nclass MapLibreGridLayerController implements GridLayerController {\n readonly id: string;\n readonly ownsMap: boolean;\n\n private options: GridLayerOptions;\n private map: MapLibreLike | undefined;\n private layer: GridLayerInstance | undefined;\n private removed = false;\n\n constructor(options: GridLayerOptions) {\n this.id = options.layerId ?? `zarr-map-${options.source.id ?? options.variable}`;\n this.options = { ...options, layerId: this.id };\n this.map = options.map;\n this.ownsMap = !options.map;\n }\n\n async mount(): Promise<void> {\n if (this.layer || this.removed) {\n return;\n }\n\n this.options.onLoadingChange?.(true);\n this.options.onLoadingStateChange?.({\n loading: true,\n metadata: false,\n chunks: false,\n percent: 5,\n stage: \"map\"\n });\n try {\n this.map ??= await this.createMap();\n await this.whenMapReady(this.map);\n this.options.onLoadingStateChange?.({\n loading: true,\n metadata: false,\n chunks: false,\n percent: 25,\n stage: \"layer\"\n });\n this.layer = await (this.options.layerFactory ?? createDefaultZarrLayer)(\n buildZarrLayerOptions(this.options)\n );\n this.map.addLayer(this.layer, this.options.beforeId);\n this.options.onLoadingStateChange?.({\n loading: true,\n metadata: false,\n chunks: true,\n percent: 65,\n stage: \"chunks\"\n });\n } catch (error) {\n this.options.onLoadingChange?.(false);\n this.handleError(\"RENDERER_SETUP_FAILED\", \"Failed to create the MapLibre Zarr layer.\", error);\n }\n }\n\n async update(update: GridLayerUpdate): Promise<void> {\n const nextOptions = {\n ...this.options,\n ...update\n };\n\n if (!this.layer) {\n this.options = nextOptions;\n await this.mount();\n return;\n }\n\n try {\n if (update.source && update.source !== this.options.source) {\n await this.replaceLayer(nextOptions);\n this.options = nextOptions;\n return;\n }\n\n if (colorScaleShaderSignature(nextOptions) !== colorScaleShaderSignature(this.options)) {\n await this.replaceLayer(nextOptions);\n this.options = nextOptions;\n return;\n }\n\n this.options = nextOptions;\n\n if (update.colorScale) {\n const colorOptions = colorScaleToRendererOptions(update.colorScale);\n this.layer.setColormap?.(colorOptions?.colormap ?? []);\n this.layer.setClim?.(colorOptions?.clim ?? update.colorScale.domain);\n }\n\n if (typeof update.opacity === \"number\") {\n this.layer.setOpacity?.(update.opacity);\n }\n\n if (update.variable) {\n this.layer.setVariable?.(update.variable);\n }\n\n if (update.selectors || update.variable || update.source) {\n const variable = update.variable ?? this.options.variable;\n const source = update.source ?? this.options.source;\n const spatialDimensions = inferSpatialDimensions(source, variable);\n const normalizedSelectors = normalizeSelectors(source, variable, this.options.selectors);\n const rendererSelectors = spatialDimensions\n ? omitSpatialSelectors(normalizedSelectors, spatialDimensions)\n : normalizedSelectors;\n this.layer.setSelector?.(toRendererSelectors(rendererSelectors));\n }\n } catch (error) {\n this.handleError(\"RENDERER_SETUP_FAILED\", \"Failed to update the MapLibre Zarr layer.\", error);\n }\n }\n\n private async replaceLayer(nextOptions: GridLayerOptions): Promise<void> {\n if (!this.map) {\n this.options = nextOptions;\n await this.mount();\n return;\n }\n\n this.options.onLoadingChange?.(true);\n this.options.onLoadingStateChange?.({\n loading: true,\n metadata: false,\n chunks: false,\n percent: 5,\n stage: \"layer\"\n });\n\n const previousLayer = this.layer;\n if (previousLayer && this.map.getLayer(previousLayer.id)) {\n this.map.removeLayer(previousLayer.id);\n }\n if (previousLayer?.id && this.map.getSource?.(previousLayer.id)) {\n this.map.removeSource?.(previousLayer.id);\n }\n this.layer = undefined;\n\n try {\n this.options.onLoadingStateChange?.({\n loading: true,\n metadata: false,\n chunks: false,\n percent: 35,\n stage: \"layer\"\n });\n const nextLayer = await (nextOptions.layerFactory ?? createDefaultZarrLayer)(\n buildZarrLayerOptions(nextOptions)\n );\n\n this.layer = nextLayer;\n this.map.addLayer(nextLayer, nextOptions.beforeId);\n this.options.onLoadingStateChange?.({\n loading: true,\n metadata: false,\n chunks: true,\n percent: 65,\n stage: \"chunks\"\n });\n } catch (error) {\n this.options.onLoadingChange?.(false);\n this.handleError(\"RENDERER_SETUP_FAILED\", \"Failed to update the MapLibre Zarr layer.\", error);\n }\n }\n\n remove(): void {\n if (this.removed) {\n return;\n }\n this.removed = true;\n\n if (this.layer && this.map?.getLayer(this.layer.id)) {\n this.map.removeLayer(this.layer.id);\n }\n if (this.layer?.id && this.map?.getSource?.(this.layer.id)) {\n this.map.removeSource?.(this.layer.id);\n }\n if (this.ownsMap) {\n this.map?.remove?.();\n }\n this.layer = undefined;\n this.map = undefined;\n }\n\n async query(geometry: unknown): Promise<unknown> {\n if (!this.layer?.queryData) {\n throw new GridError({\n code: \"UNSUPPORTED_GEOMETRY\",\n message: \"The active renderer layer does not expose queryData.\"\n });\n }\n return this.layer.queryData(geometry);\n }\n\n getMap(): MapLibreLike | undefined {\n return this.map;\n }\n\n getLayer(): GridLayerInstance | undefined {\n return this.layer;\n }\n\n private async createMap(): Promise<MapLibreLike> {\n if (!this.options.mapConfig) {\n throw new GridError({\n code: \"RENDERER_SETUP_FAILED\",\n message: \"Provide either an existing map instance or mapConfig to create one.\"\n });\n }\n\n if (this.options.mapFactory) {\n return this.options.mapFactory(this.options.mapConfig);\n }\n\n const maplibre = await import(\"maplibre-gl\");\n return new maplibre.Map(\n this.options.mapConfig as unknown as ConstructorParameters<typeof maplibre.Map>[0]\n ) as unknown as MapLibreLike;\n }\n\n private async whenMapReady(map: MapLibreLike): Promise<void> {\n if (this.isStyleReady(map) || !map.once) {\n return;\n }\n\n if (map.isStyleLoaded) {\n await new Promise<void>((resolve) => {\n let resolved = false;\n const resolveWhenStyleReady = () => {\n if (resolved) {\n return;\n }\n if (this.isStyleReady(map)) {\n resolved = true;\n resolve();\n return;\n }\n map.once?.(\"styledata\", resolveWhenStyleReady);\n };\n map.once?.(\"styledata\", resolveWhenStyleReady);\n map.once?.(\"load\", resolveWhenStyleReady);\n });\n return;\n }\n\n if (!map.loaded || map.loaded()) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n map.once?.(\"load\", () => resolve());\n });\n }\n\n private isStyleReady(map: MapLibreLike): boolean {\n return map.isStyleLoaded?.() ?? map.loaded?.() ?? true;\n }\n\n private handleError(code: GridError[\"code\"], message: string, cause: unknown): never {\n const gridError =\n cause instanceof GridError\n ? cause\n : new GridError({\n code,\n message: errorMessageWithCause(message, cause),\n cause,\n sourceId: this.options.source.id,\n variable: this.options.variable\n });\n this.options.onError?.(gridError);\n throw gridError;\n }\n}\n\nfunction errorMessageWithCause(message: string, cause: unknown): string {\n if (cause instanceof Error && cause.message) {\n return `${message} ${cause.message}`;\n }\n return message;\n}\n\nfunction omitSpatialSelectors<TSelectors extends Record<string, unknown>>(\n selectors: TSelectors,\n spatialDimensions: GridSpatialDimensions\n): TSelectors {\n return Object.fromEntries(\n Object.entries(selectors).filter(([dimensionName]) => {\n return dimensionName !== spatialDimensions.x && dimensionName !== spatialDimensions.y;\n })\n ) as TSelectors;\n}\n\nfunction normalizeLoadingState(\n state: boolean | Partial<GridLayerLoadingState>\n): GridLayerLoadingState {\n if (typeof state === \"boolean\") {\n return {\n loading: state,\n metadata: state,\n chunks: false,\n percent: state ? 35 : 100,\n stage: state ? \"metadata\" : \"complete\"\n };\n }\n\n const loading = Boolean(state.loading ?? state.metadata ?? state.chunks);\n const metadata = Boolean(state.metadata);\n const chunks = Boolean(state.chunks);\n return {\n loading,\n metadata,\n chunks,\n stage: state.stage ?? loadingStage(loading, metadata, chunks),\n percent:\n typeof state.percent === \"number\"\n ? Math.max(0, Math.min(100, state.percent))\n : loading\n ? loadingPercent(metadata, chunks)\n : 100\n };\n}\n\nfunction loadingStage(loading: boolean, metadata: boolean, chunks: boolean): GridLayerLoadingStage {\n if (!loading) {\n return \"complete\";\n }\n if (chunks) {\n return \"chunks\";\n }\n if (metadata) {\n return \"metadata\";\n }\n return \"layer\";\n}\n\nfunction loadingPercent(metadata: boolean, chunks: boolean): number {\n if (chunks) {\n return 85;\n }\n if (metadata) {\n return 45;\n }\n return 65;\n}\n\nfunction completeLoadingState(): GridLayerLoadingState {\n return {\n loading: false,\n metadata: false,\n chunks: false,\n percent: 100,\n stage: \"complete\"\n };\n}\n\ntype ZarrLayerConstructor = new (options: ZarrLayerFactoryOptions) => GridLayerInstance;\n\nlet zarrLayerConstructorPromise: Promise<ZarrLayerConstructor> | undefined;\n\nexport async function preloadDefaultZarrLayer(): Promise<void> {\n await loadDefaultZarrLayerConstructor();\n}\n\nasync function createDefaultZarrLayer(\n options: ZarrLayerFactoryOptions\n): Promise<GridLayerInstance> {\n const ZarrLayer = await loadDefaultZarrLayerConstructor();\n return new ZarrLayer(options);\n}\n\nasync function loadDefaultZarrLayerConstructor(): Promise<ZarrLayerConstructor> {\n zarrLayerConstructorPromise ??= import(\"@carbonplan/zarr-layer\")\n .then((module) => {\n const zarrLayerModule = module as unknown as {\n ZarrLayer?: ZarrLayerConstructor;\n default?: ZarrLayerConstructor;\n };\n const ZarrLayer = zarrLayerModule.ZarrLayer ?? zarrLayerModule.default;\n if (!ZarrLayer) {\n throw new GridError({\n code: \"RENDERER_SETUP_FAILED\",\n message: \"@carbonplan/zarr-layer did not export ZarrLayer.\"\n });\n }\n return ZarrLayer;\n })\n .catch((error: unknown) => {\n zarrLayerConstructorPromise = undefined;\n throw error;\n });\n return zarrLayerConstructorPromise;\n}\n"]}
@@ -0,0 +1,210 @@
1
+ type GridErrorCode = "MISSING_VARIABLE" | "MISSING_DIMENSION" | "MISSING_SPATIAL_DIMENSIONS" | "MISSING_BOUNDS" | "MISSING_COORDINATES" | "UNSUPPORTED_DIMENSION" | "UNSUPPORTED_SELECTOR" | "UNSUPPORTED_GEOMETRY" | "UNSUPPORTED_DTYPE" | "UNSUPPORTED_UNIT" | "INVALID_COLOR_SCALE" | "QUERY_TOO_EXPENSIVE" | "ABORTED" | "SOURCE_LOAD_FAILED" | "RENDERER_SETUP_FAILED" | "CHUNK_LOAD_FAILED";
2
+ interface GridErrorDetails {
3
+ code: GridErrorCode;
4
+ message: string;
5
+ cause?: unknown;
6
+ dimension?: string;
7
+ variable?: string;
8
+ sourceId?: string;
9
+ context?: Record<string, unknown>;
10
+ }
11
+ declare class GridError extends Error {
12
+ readonly code: GridErrorCode;
13
+ readonly cause?: unknown;
14
+ readonly dimension?: string;
15
+ readonly variable?: string;
16
+ readonly sourceId?: string;
17
+ readonly context?: Record<string, unknown>;
18
+ constructor(details: GridErrorDetails);
19
+ }
20
+ declare function isGridError(error: unknown): error is GridError;
21
+ declare function toGridError(details: GridErrorDetails | GridError): GridError;
22
+
23
+ type GridDType = "int8" | "uint8" | "int16" | "uint16" | "int32" | "uint32" | "float32" | "float64" | string;
24
+ type GridCoordinateValue = number | string | Date;
25
+ type GridBounds = [west: number, south: number, east: number, north: number];
26
+ type GridDimensionKind = "x" | "y" | "time" | "band" | "vertical" | "other";
27
+ interface GridDimension {
28
+ name: string;
29
+ size: number;
30
+ kind?: GridDimensionKind;
31
+ coordinates?: readonly GridCoordinateValue[];
32
+ bounds?: readonly [number, number][];
33
+ units?: string;
34
+ calendar?: string;
35
+ longName?: string;
36
+ standardName?: string;
37
+ ascending?: boolean;
38
+ attrs?: Record<string, unknown>;
39
+ }
40
+ interface GridVariable {
41
+ name: string;
42
+ path?: string;
43
+ dtype: GridDType;
44
+ dimensions: readonly string[];
45
+ shape: readonly number[];
46
+ chunks?: readonly number[];
47
+ units?: string;
48
+ longName?: string;
49
+ standardName?: string;
50
+ fillValue?: number | null;
51
+ scaleFactor?: number;
52
+ addOffset?: number;
53
+ attrs?: Record<string, unknown>;
54
+ }
55
+ interface GridSpatialDimensions {
56
+ x: string;
57
+ y: string;
58
+ }
59
+ interface GridReadableStore {
60
+ get(key: string): Promise<Uint8Array | undefined>;
61
+ getRange?(key: string, range: [start: number, end: number]): Promise<Uint8Array | undefined>;
62
+ }
63
+ interface GridSliceRequest {
64
+ variable: string;
65
+ selectors?: GridSelectors;
66
+ signal?: AbortSignal;
67
+ }
68
+ interface GridSlice {
69
+ variable: string;
70
+ selectors: NormalizedGridSelectors;
71
+ dimensions: readonly string[];
72
+ shape: readonly number[];
73
+ data: ArrayLike<number>;
74
+ coordinates?: Record<string, readonly GridCoordinateValue[]>;
75
+ unit?: string;
76
+ fillValue?: number | null;
77
+ }
78
+ type GridGeometry = {
79
+ type: "Point";
80
+ coordinates: [longitude: number, latitude: number];
81
+ } | {
82
+ type: "BoundingBox";
83
+ bounds: GridBounds;
84
+ } | {
85
+ type: "Polygon";
86
+ coordinates: readonly [longitude: number, latitude: number][];
87
+ };
88
+ interface GridGeometryQueryRequest {
89
+ source: GridDataSource;
90
+ variable: string;
91
+ geometry: GridGeometry;
92
+ selectors?: GridSelectors;
93
+ maxCells?: number;
94
+ signal?: AbortSignal;
95
+ }
96
+ interface GridQuerySample {
97
+ coordinates: [longitude: number, latitude: number];
98
+ indexes: Record<string, number>;
99
+ rawValue: number | null;
100
+ value: number | null;
101
+ }
102
+ interface GridQueryResult {
103
+ variable: string;
104
+ selectors: NormalizedGridSelectors;
105
+ geometry: GridGeometry;
106
+ unit?: string;
107
+ samples: readonly GridQuerySample[];
108
+ warnings: readonly string[];
109
+ }
110
+ interface GridDataSource {
111
+ id?: string;
112
+ label?: string;
113
+ source?: string;
114
+ store?: GridReadableStore;
115
+ zarrVersion?: 2 | 3;
116
+ crs?: string;
117
+ proj4?: string;
118
+ bounds?: GridBounds;
119
+ spatialDimensions?: GridSpatialDimensions;
120
+ dimensions: readonly GridDimension[];
121
+ variables: readonly GridVariable[];
122
+ metadata?: Record<string, unknown>;
123
+ readSlice?: (request: GridSliceRequest) => Promise<GridSlice>;
124
+ queryGeometry?: (request: Omit<GridGeometryQueryRequest, "source">) => Promise<GridQueryResult>;
125
+ }
126
+ type GridSelectorInput = GridCoordinateValue | {
127
+ kind: "coordinate";
128
+ value: GridCoordinateValue;
129
+ } | {
130
+ kind: "index";
131
+ index: number;
132
+ } | {
133
+ kind: "isoTime";
134
+ iso: string;
135
+ };
136
+ type GridSelectors = Record<string, GridSelectorInput>;
137
+ type NormalizedSelector = {
138
+ kind: "coordinate";
139
+ value: number | string;
140
+ } | {
141
+ kind: "index";
142
+ index: number;
143
+ value?: number | string;
144
+ } | {
145
+ kind: "isoTime";
146
+ iso: string;
147
+ value?: number | string;
148
+ };
149
+ type NormalizedGridSelectors = Record<string, NormalizedSelector>;
150
+ interface GridSourceValidationResult {
151
+ ok: boolean;
152
+ errors: readonly GridError[];
153
+ warnings: readonly string[];
154
+ }
155
+ type BuiltinColorPalette = "viridis" | "inferno" | "magma" | "plasma" | "cividis" | "turbo" | "greys" | "grays" | "temperature" | "precipitation" | "humidity" | "vegetation" | "wind";
156
+ type ColorPalette = BuiltinColorPalette | string | readonly string[];
157
+ type GridDisplayQuantity = "temperature" | "precipitation";
158
+ interface GridColorScale {
159
+ palette: ColorPalette;
160
+ domain: readonly [min: number, max: number];
161
+ quantity?: GridDisplayQuantity;
162
+ unit?: string;
163
+ displayUnit?: string;
164
+ missingColor?: string;
165
+ }
166
+ interface GridTimeRange {
167
+ start: Date | string;
168
+ end: Date | string;
169
+ }
170
+ interface GridRequestPreflightLimits {
171
+ maxCells?: number;
172
+ maxBytes?: number;
173
+ }
174
+ interface GridRequestPreflight {
175
+ ok: boolean;
176
+ cells?: number;
177
+ bytes?: number;
178
+ dimensions: Record<string, number>;
179
+ warnings: readonly string[];
180
+ errors: readonly GridError[];
181
+ }
182
+ interface GridRequestPreflightConfig {
183
+ variable?: string;
184
+ bounds?: GridBounds;
185
+ timeRange?: GridTimeRange;
186
+ selectors?: GridSelectors;
187
+ limits?: GridRequestPreflightLimits;
188
+ onResult?: (preflight: GridRequestPreflight) => void;
189
+ }
190
+ interface GridRequestPreflightOptions {
191
+ source: GridDataSource;
192
+ variable: string;
193
+ bounds?: GridBounds;
194
+ timeRange?: GridTimeRange;
195
+ selectors?: GridSelectors;
196
+ limits?: GridRequestPreflightLimits;
197
+ }
198
+ interface TimeCoordinate {
199
+ index: number;
200
+ value: number | string;
201
+ label: string;
202
+ iso?: string;
203
+ }
204
+ interface DebounceHandle<TArgs extends readonly unknown[]> {
205
+ call(...args: TArgs): void;
206
+ flush(): void;
207
+ cancel(): void;
208
+ }
209
+
210
+ export { type GridVariable as A, type BuiltinColorPalette as B, type ColorPalette as C, type DebounceHandle as D, type NormalizedSelector as E, isGridError as F, type GridBounds as G, toGridError as H, type NormalizedGridSelectors as N, type TimeCoordinate as T, type GridColorScale as a, type GridCoordinateValue as b, type GridDType as c, type GridDataSource as d, type GridDimension as e, type GridDimensionKind as f, type GridDisplayQuantity as g, GridError as h, type GridErrorCode as i, type GridErrorDetails as j, type GridGeometry as k, type GridGeometryQueryRequest as l, type GridQueryResult as m, type GridQuerySample as n, type GridReadableStore as o, type GridRequestPreflight as p, type GridRequestPreflightConfig as q, type GridRequestPreflightLimits as r, type GridRequestPreflightOptions as s, type GridSelectorInput as t, type GridSelectors as u, type GridSlice as v, type GridSliceRequest as w, type GridSourceValidationResult as x, type GridSpatialDimensions as y, type GridTimeRange as z };
@@ -0,0 +1,210 @@
1
+ type GridErrorCode = "MISSING_VARIABLE" | "MISSING_DIMENSION" | "MISSING_SPATIAL_DIMENSIONS" | "MISSING_BOUNDS" | "MISSING_COORDINATES" | "UNSUPPORTED_DIMENSION" | "UNSUPPORTED_SELECTOR" | "UNSUPPORTED_GEOMETRY" | "UNSUPPORTED_DTYPE" | "UNSUPPORTED_UNIT" | "INVALID_COLOR_SCALE" | "QUERY_TOO_EXPENSIVE" | "ABORTED" | "SOURCE_LOAD_FAILED" | "RENDERER_SETUP_FAILED" | "CHUNK_LOAD_FAILED";
2
+ interface GridErrorDetails {
3
+ code: GridErrorCode;
4
+ message: string;
5
+ cause?: unknown;
6
+ dimension?: string;
7
+ variable?: string;
8
+ sourceId?: string;
9
+ context?: Record<string, unknown>;
10
+ }
11
+ declare class GridError extends Error {
12
+ readonly code: GridErrorCode;
13
+ readonly cause?: unknown;
14
+ readonly dimension?: string;
15
+ readonly variable?: string;
16
+ readonly sourceId?: string;
17
+ readonly context?: Record<string, unknown>;
18
+ constructor(details: GridErrorDetails);
19
+ }
20
+ declare function isGridError(error: unknown): error is GridError;
21
+ declare function toGridError(details: GridErrorDetails | GridError): GridError;
22
+
23
+ type GridDType = "int8" | "uint8" | "int16" | "uint16" | "int32" | "uint32" | "float32" | "float64" | string;
24
+ type GridCoordinateValue = number | string | Date;
25
+ type GridBounds = [west: number, south: number, east: number, north: number];
26
+ type GridDimensionKind = "x" | "y" | "time" | "band" | "vertical" | "other";
27
+ interface GridDimension {
28
+ name: string;
29
+ size: number;
30
+ kind?: GridDimensionKind;
31
+ coordinates?: readonly GridCoordinateValue[];
32
+ bounds?: readonly [number, number][];
33
+ units?: string;
34
+ calendar?: string;
35
+ longName?: string;
36
+ standardName?: string;
37
+ ascending?: boolean;
38
+ attrs?: Record<string, unknown>;
39
+ }
40
+ interface GridVariable {
41
+ name: string;
42
+ path?: string;
43
+ dtype: GridDType;
44
+ dimensions: readonly string[];
45
+ shape: readonly number[];
46
+ chunks?: readonly number[];
47
+ units?: string;
48
+ longName?: string;
49
+ standardName?: string;
50
+ fillValue?: number | null;
51
+ scaleFactor?: number;
52
+ addOffset?: number;
53
+ attrs?: Record<string, unknown>;
54
+ }
55
+ interface GridSpatialDimensions {
56
+ x: string;
57
+ y: string;
58
+ }
59
+ interface GridReadableStore {
60
+ get(key: string): Promise<Uint8Array | undefined>;
61
+ getRange?(key: string, range: [start: number, end: number]): Promise<Uint8Array | undefined>;
62
+ }
63
+ interface GridSliceRequest {
64
+ variable: string;
65
+ selectors?: GridSelectors;
66
+ signal?: AbortSignal;
67
+ }
68
+ interface GridSlice {
69
+ variable: string;
70
+ selectors: NormalizedGridSelectors;
71
+ dimensions: readonly string[];
72
+ shape: readonly number[];
73
+ data: ArrayLike<number>;
74
+ coordinates?: Record<string, readonly GridCoordinateValue[]>;
75
+ unit?: string;
76
+ fillValue?: number | null;
77
+ }
78
+ type GridGeometry = {
79
+ type: "Point";
80
+ coordinates: [longitude: number, latitude: number];
81
+ } | {
82
+ type: "BoundingBox";
83
+ bounds: GridBounds;
84
+ } | {
85
+ type: "Polygon";
86
+ coordinates: readonly [longitude: number, latitude: number][];
87
+ };
88
+ interface GridGeometryQueryRequest {
89
+ source: GridDataSource;
90
+ variable: string;
91
+ geometry: GridGeometry;
92
+ selectors?: GridSelectors;
93
+ maxCells?: number;
94
+ signal?: AbortSignal;
95
+ }
96
+ interface GridQuerySample {
97
+ coordinates: [longitude: number, latitude: number];
98
+ indexes: Record<string, number>;
99
+ rawValue: number | null;
100
+ value: number | null;
101
+ }
102
+ interface GridQueryResult {
103
+ variable: string;
104
+ selectors: NormalizedGridSelectors;
105
+ geometry: GridGeometry;
106
+ unit?: string;
107
+ samples: readonly GridQuerySample[];
108
+ warnings: readonly string[];
109
+ }
110
+ interface GridDataSource {
111
+ id?: string;
112
+ label?: string;
113
+ source?: string;
114
+ store?: GridReadableStore;
115
+ zarrVersion?: 2 | 3;
116
+ crs?: string;
117
+ proj4?: string;
118
+ bounds?: GridBounds;
119
+ spatialDimensions?: GridSpatialDimensions;
120
+ dimensions: readonly GridDimension[];
121
+ variables: readonly GridVariable[];
122
+ metadata?: Record<string, unknown>;
123
+ readSlice?: (request: GridSliceRequest) => Promise<GridSlice>;
124
+ queryGeometry?: (request: Omit<GridGeometryQueryRequest, "source">) => Promise<GridQueryResult>;
125
+ }
126
+ type GridSelectorInput = GridCoordinateValue | {
127
+ kind: "coordinate";
128
+ value: GridCoordinateValue;
129
+ } | {
130
+ kind: "index";
131
+ index: number;
132
+ } | {
133
+ kind: "isoTime";
134
+ iso: string;
135
+ };
136
+ type GridSelectors = Record<string, GridSelectorInput>;
137
+ type NormalizedSelector = {
138
+ kind: "coordinate";
139
+ value: number | string;
140
+ } | {
141
+ kind: "index";
142
+ index: number;
143
+ value?: number | string;
144
+ } | {
145
+ kind: "isoTime";
146
+ iso: string;
147
+ value?: number | string;
148
+ };
149
+ type NormalizedGridSelectors = Record<string, NormalizedSelector>;
150
+ interface GridSourceValidationResult {
151
+ ok: boolean;
152
+ errors: readonly GridError[];
153
+ warnings: readonly string[];
154
+ }
155
+ type BuiltinColorPalette = "viridis" | "inferno" | "magma" | "plasma" | "cividis" | "turbo" | "greys" | "grays" | "temperature" | "precipitation" | "humidity" | "vegetation" | "wind";
156
+ type ColorPalette = BuiltinColorPalette | string | readonly string[];
157
+ type GridDisplayQuantity = "temperature" | "precipitation";
158
+ interface GridColorScale {
159
+ palette: ColorPalette;
160
+ domain: readonly [min: number, max: number];
161
+ quantity?: GridDisplayQuantity;
162
+ unit?: string;
163
+ displayUnit?: string;
164
+ missingColor?: string;
165
+ }
166
+ interface GridTimeRange {
167
+ start: Date | string;
168
+ end: Date | string;
169
+ }
170
+ interface GridRequestPreflightLimits {
171
+ maxCells?: number;
172
+ maxBytes?: number;
173
+ }
174
+ interface GridRequestPreflight {
175
+ ok: boolean;
176
+ cells?: number;
177
+ bytes?: number;
178
+ dimensions: Record<string, number>;
179
+ warnings: readonly string[];
180
+ errors: readonly GridError[];
181
+ }
182
+ interface GridRequestPreflightConfig {
183
+ variable?: string;
184
+ bounds?: GridBounds;
185
+ timeRange?: GridTimeRange;
186
+ selectors?: GridSelectors;
187
+ limits?: GridRequestPreflightLimits;
188
+ onResult?: (preflight: GridRequestPreflight) => void;
189
+ }
190
+ interface GridRequestPreflightOptions {
191
+ source: GridDataSource;
192
+ variable: string;
193
+ bounds?: GridBounds;
194
+ timeRange?: GridTimeRange;
195
+ selectors?: GridSelectors;
196
+ limits?: GridRequestPreflightLimits;
197
+ }
198
+ interface TimeCoordinate {
199
+ index: number;
200
+ value: number | string;
201
+ label: string;
202
+ iso?: string;
203
+ }
204
+ interface DebounceHandle<TArgs extends readonly unknown[]> {
205
+ call(...args: TArgs): void;
206
+ flush(): void;
207
+ cancel(): void;
208
+ }
209
+
210
+ export { type GridVariable as A, type BuiltinColorPalette as B, type ColorPalette as C, type DebounceHandle as D, type NormalizedSelector as E, isGridError as F, type GridBounds as G, toGridError as H, type NormalizedGridSelectors as N, type TimeCoordinate as T, type GridColorScale as a, type GridCoordinateValue as b, type GridDType as c, type GridDataSource as d, type GridDimension as e, type GridDimensionKind as f, type GridDisplayQuantity as g, GridError as h, type GridErrorCode as i, type GridErrorDetails as j, type GridGeometry as k, type GridGeometryQueryRequest as l, type GridQueryResult as m, type GridQuerySample as n, type GridReadableStore as o, type GridRequestPreflight as p, type GridRequestPreflightConfig as q, type GridRequestPreflightLimits as r, type GridRequestPreflightOptions as s, type GridSelectorInput as t, type GridSelectors as u, type GridSlice as v, type GridSliceRequest as w, type GridSourceValidationResult as x, type GridSpatialDimensions as y, type GridTimeRange as z };
package/docs/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # Docs
2
+
3
+ Architecture notes, renderer decision records, API design notes, and research findings belong here.
4
+
5
+ Planned documents:
6
+
7
+ - `architecture.md`: research spike output and recommended architecture.
8
+ - `decision-record-renderer.md`: renderer comparison and final renderer choice.
9
+ - `api-design.md`: normalized grid-source contracts and public API examples.
10
+ - `package-boundaries.md`: package scope, upstream responsibilities, app
11
+ responsibilities, and dependency guardrails.
12
+ - `release-checklist.md`: CI, publishing, peer dependency, and renderer limitation checklist.