@sqlrooms/deck 0.29.0-rc.11 → 0.29.0-rc.12

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 (126) hide show
  1. package/README.md +49 -13
  2. package/dist/BlockMapSettings.d.ts.map +1 -1
  3. package/dist/BlockMapSettings.js +4 -16
  4. package/dist/BlockMapSettings.js.map +1 -1
  5. package/dist/DashboardMapSettings.d.ts.map +1 -1
  6. package/dist/DashboardMapSettings.js +7 -10
  7. package/dist/DashboardMapSettings.js.map +1 -1
  8. package/dist/DeckJsonMap.d.ts.map +1 -1
  9. package/dist/DeckJsonMap.js +18 -12
  10. package/dist/DeckJsonMap.js.map +1 -1
  11. package/dist/DeckJsonMapSpec.d.ts +41 -0
  12. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  13. package/dist/DeckJsonMapSpec.js +2 -0
  14. package/dist/DeckJsonMapSpec.js.map +1 -1
  15. package/dist/DeckMapSurface.d.ts +1 -1
  16. package/dist/DeckMapSurface.js +1 -1
  17. package/dist/DeckMapSurface.js.map +1 -1
  18. package/dist/MapSettings.d.ts +14 -0
  19. package/dist/MapSettings.d.ts.map +1 -1
  20. package/dist/MapSettings.js +547 -192
  21. package/dist/MapSettings.js.map +1 -1
  22. package/dist/MapSettingsControls.d.ts +8 -1
  23. package/dist/MapSettingsControls.d.ts.map +1 -1
  24. package/dist/MapSettingsControls.js +24 -2
  25. package/dist/MapSettingsControls.js.map +1 -1
  26. package/dist/ai.d.ts.map +1 -1
  27. package/dist/ai.js +6 -3
  28. package/dist/ai.js.map +1 -1
  29. package/dist/aiNormalize.d.ts.map +1 -1
  30. package/dist/aiNormalize.js +2 -1
  31. package/dist/aiNormalize.js.map +1 -1
  32. package/dist/block.d.ts +1 -1
  33. package/dist/block.d.ts.map +1 -1
  34. package/dist/block.js +1 -1
  35. package/dist/block.js.map +1 -1
  36. package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
  37. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
  38. package/dist/createOrUpdateDeckMapResource.js +57 -4
  39. package/dist/createOrUpdateDeckMapResource.js.map +1 -1
  40. package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
  41. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
  42. package/dist/datasets/PreparedDatasetStore.js +4 -8
  43. package/dist/datasets/PreparedDatasetStore.js.map +1 -1
  44. package/dist/datasets/helpers.d.ts +39 -2
  45. package/dist/datasets/helpers.d.ts.map +1 -1
  46. package/dist/datasets/helpers.js +86 -3
  47. package/dist/datasets/helpers.js.map +1 -1
  48. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
  49. package/dist/datasets/usePreparedDatasetStates.js +12 -8
  50. package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
  51. package/dist/index.d.ts +2 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/json/colorScaleFunction.d.ts +12 -4
  56. package/dist/json/colorScaleFunction.d.ts.map +1 -1
  57. package/dist/json/colorScaleFunction.js.map +1 -1
  58. package/dist/json/compileColorScale.d.ts +3 -2
  59. package/dist/json/compileColorScale.d.ts.map +1 -1
  60. package/dist/json/compileColorScale.js +16 -1
  61. package/dist/json/compileColorScale.js.map +1 -1
  62. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  63. package/dist/json/createDeckJsonConfiguration.js +235 -175
  64. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  65. package/dist/json/defaultClasses.d.ts.map +1 -1
  66. package/dist/json/defaultClasses.js +3 -3
  67. package/dist/json/defaultClasses.js.map +1 -1
  68. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  69. package/dist/json/extractColorScaleLegends.js +41 -26
  70. package/dist/json/extractColorScaleLegends.js.map +1 -1
  71. package/dist/json/heatmapDefaults.d.ts +17 -7
  72. package/dist/json/heatmapDefaults.d.ts.map +1 -1
  73. package/dist/json/heatmapDefaults.js +54 -12
  74. package/dist/json/heatmapDefaults.js.map +1 -1
  75. package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
  76. package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
  77. package/dist/json/layers/DeckHeatmapLayer.js +69 -0
  78. package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
  79. package/dist/json/layers/index.d.ts +1 -0
  80. package/dist/json/layers/index.d.ts.map +1 -1
  81. package/dist/json/layers/index.js +1 -0
  82. package/dist/json/layers/index.js.map +1 -1
  83. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  84. package/dist/json/rewriteGeoArrowAccessors.js +13 -5
  85. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  86. package/dist/json/scaleFunction.d.ts +5 -8
  87. package/dist/json/scaleFunction.d.ts.map +1 -1
  88. package/dist/json/scaleFunction.js +30 -5
  89. package/dist/json/scaleFunction.js.map +1 -1
  90. package/dist/mapAiConfig.d.ts +6 -0
  91. package/dist/mapAiConfig.d.ts.map +1 -1
  92. package/dist/mapAiConfig.js +7 -0
  93. package/dist/mapAiConfig.js.map +1 -1
  94. package/dist/mapAiSharedInstructions.d.ts +1 -1
  95. package/dist/mapAiSharedInstructions.d.ts.map +1 -1
  96. package/dist/mapAiSharedInstructions.js +3 -3
  97. package/dist/mapAiSharedInstructions.js.map +1 -1
  98. package/dist/mapConfig.d.ts +1 -1
  99. package/dist/mapConfig.d.ts.map +1 -1
  100. package/dist/mapConfig.js.map +1 -1
  101. package/dist/mapConfigUtils.d.ts +22 -0
  102. package/dist/mapConfigUtils.d.ts.map +1 -1
  103. package/dist/mapConfigUtils.js +145 -3
  104. package/dist/mapConfigUtils.js.map +1 -1
  105. package/dist/mapLayerConfigUtils.d.ts +55 -0
  106. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  107. package/dist/mapLayerConfigUtils.js +222 -11
  108. package/dist/mapLayerConfigUtils.js.map +1 -1
  109. package/dist/mapResourceAuthoring.d.ts +1 -1
  110. package/dist/mapResourceAuthoring.d.ts.map +1 -1
  111. package/dist/mapResourceAuthoring.js +14 -7
  112. package/dist/mapResourceAuthoring.js.map +1 -1
  113. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
  114. package/dist/prepare/prepareDeckDataset.js +1 -0
  115. package/dist/prepare/prepareDeckDataset.js.map +1 -1
  116. package/dist/prepare/types.d.ts +3 -0
  117. package/dist/prepare/types.d.ts.map +1 -1
  118. package/dist/prepare/types.js.map +1 -1
  119. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  120. package/dist/prepare/wkbDecoder.js +62 -16
  121. package/dist/prepare/wkbDecoder.js.map +1 -1
  122. package/dist/prepare/wkbParser.d.ts +2 -0
  123. package/dist/prepare/wkbParser.d.ts.map +1 -1
  124. package/dist/prepare/wkbParser.js +1 -0
  125. package/dist/prepare/wkbParser.js.map +1 -1
  126. package/package.json +9 -9
package/dist/block.d.ts CHANGED
@@ -15,7 +15,7 @@ export type DeckMapBlockRendererProps = {
15
15
  headerActions?: ReactNode;
16
16
  dataAdapter?: DeckMapDataAdapter;
17
17
  };
18
- /** Mosaic-free worksheet map renderer backed only by `deckMaps`. */
18
+ /** Mosaic-free document map renderer backed only by `deckMaps`. */
19
19
  export declare function DeckMapBlockRenderer({ mapId, title, caption, onCaptionChange, selected, readOnly, headerActions, dataAdapter, }: DeckMapBlockRendererProps): import("react/jsx-runtime").JSX.Element;
20
20
  export {};
21
21
  //# sourceMappingURL=block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../src/block.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,KAAK,kBAAkB,EAAuB,MAAM,iBAAiB,CAAC;AAQ9E,KAAK,oBAAoB,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAmDlE,kFAAkF;AAClF,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,QAoBf;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEF,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,KAAK,EACL,OAAO,EACP,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAsC,GACvC,EAAE,yBAAyB,2CA6K3B"}
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../src/block.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,KAAK,kBAAkB,EAAuB,MAAM,iBAAiB,CAAC;AAQ9E,KAAK,oBAAoB,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAmDlE,kFAAkF;AAClF,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,QAoBf;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,KAAK,EACL,OAAO,EACP,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAsC,GACvC,EAAE,yBAAyB,2CA6K3B"}
package/dist/block.js CHANGED
@@ -50,7 +50,7 @@ export function ensureDeckMapResourceState(state, mapId, title) {
50
50
  if (table)
51
51
  state.deckMaps.setSelectedTable(mapId, getTableIdentity(table.table));
52
52
  }
53
- /** Mosaic-free worksheet map renderer backed only by `deckMaps`. */
53
+ /** Mosaic-free document map renderer backed only by `deckMaps`. */
54
54
  export function DeckMapBlockRenderer({ mapId, title, caption, onCaptionChange, selected, readOnly, headerActions, dataAdapter = directDeckMapDataAdapter, }) {
55
55
  const map = useStoreWithDeckMaps((state) => state.deckMaps.config.mapsById[mapId]);
56
56
  const tables = useStoreWithDeckMaps((state) => state.db.tables);
package/dist/block.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"block.js","sourceRoot":"","sources":["../src/block.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n getTableIdentity,\n type DataTable,\n type DuckDbSliceState,\n} from '@sqlrooms/duckdb';\nimport {useBlockSettingsStore} from '@sqlrooms/documents';\nimport {Button, Tooltip, TooltipContent, TooltipTrigger} from '@sqlrooms/ui';\nimport {FocusIcon, MapIcon, SlidersVerticalIcon} from 'lucide-react';\nimport {\n Component,\n useCallback,\n useEffect,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from 'react';\nimport {\n DeckMapSurface,\n directDeckMapDataAdapter,\n type DeckMapDataAdapter,\n} from './DeckMapSurface';\nimport {type DeckMapsSliceState, useStoreWithDeckMaps} from './DeckMapsSlice';\nimport {createEmptyDeckMapConfig} from './mapConfig';\nimport {\n createDeckMapConfigForTable,\n findGeometryColumn,\n findLongitudeLatitudeColumns,\n} from './mapConfigUtils';\n\ntype DeckMapResourceState = DeckMapsSliceState & DuckDbSliceState;\n\ntype DeckMapResourceErrorBoundaryProps = {\n children: ReactNode;\n onError: (error: Error) => void;\n resetKey: unknown;\n};\n\ntype DeckMapResourceErrorBoundaryState = {\n error?: Error;\n resetKey: unknown;\n};\n\nclass DeckMapResourceErrorBoundary extends Component<\n DeckMapResourceErrorBoundaryProps,\n DeckMapResourceErrorBoundaryState\n> {\n state: DeckMapResourceErrorBoundaryState = {\n resetKey: this.props.resetKey,\n };\n static getDerivedStateFromError(error: Error) {\n return {error};\n }\n static getDerivedStateFromProps(\n props: DeckMapResourceErrorBoundaryProps,\n state: DeckMapResourceErrorBoundaryState,\n ) {\n return Object.is(props.resetKey, state.resetKey)\n ? null\n : {error: undefined, resetKey: props.resetKey};\n }\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\n '[DeckMapResourceErrorBoundary] Map render failed',\n error,\n errorInfo,\n );\n this.props.onError(error);\n }\n render() {\n if (this.state.error) {\n return (\n <div className=\"text-muted-foreground flex h-full min-h-[320px] items-center justify-center p-4 text-center text-sm\">\n Map failed to render: {this.state.error.message}\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n/** Ensures a first-class map resource, optionally seeded from geospatial data. */\nexport function ensureDeckMapResourceState(\n state: DeckMapResourceState,\n mapId: string,\n title?: string,\n) {\n if (state.deckMaps.getMap(mapId)) return;\n const table = state.db.tables.find(\n (candidate) =>\n Boolean(findLongitudeLatitudeColumns(candidate)) ||\n Boolean(findGeometryColumn(candidate)),\n );\n state.deckMaps.ensureMap(mapId, {\n title: title ?? 'Map',\n config: table\n ? createDeckMapConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n })\n : createEmptyDeckMapConfig(),\n });\n if (table)\n state.deckMaps.setSelectedTable(mapId, getTableIdentity(table.table));\n}\n\nexport type DeckMapBlockRendererProps = {\n mapId: string;\n title?: string;\n caption?: string;\n onCaptionChange?: (caption: string | undefined) => void;\n selected?: boolean;\n readOnly?: boolean;\n headerActions?: ReactNode;\n dataAdapter?: DeckMapDataAdapter;\n};\n\n/** Mosaic-free worksheet map renderer backed only by `deckMaps`. */\nexport function DeckMapBlockRenderer({\n mapId,\n title,\n caption,\n onCaptionChange,\n selected,\n readOnly,\n headerActions,\n dataAdapter = directDeckMapDataAdapter,\n}: DeckMapBlockRendererProps) {\n const map = useStoreWithDeckMaps(\n (state) => state.deckMaps.config.mapsById[mapId],\n );\n const tables = useStoreWithDeckMaps((state) => state.db.tables);\n const ensureMap = useStoreWithDeckMaps((state) => state.deckMaps.ensureMap);\n const updateMap = useStoreWithDeckMaps((state) => state.deckMaps.updateMap);\n const setSelectedTable = useStoreWithDeckMaps(\n (state) => state.deckMaps.setSelectedTable,\n );\n const reportMapIssue = useStoreWithDeckMaps(\n (state) => state.deckMaps.reportMapIssue,\n );\n const clearMapIssue = useStoreWithDeckMaps(\n (state) => state.deckMaps.clearMapIssue,\n );\n const requestOpenSettingsPanel = useBlockSettingsStore(\n (state) => state.blockSettings.requestOpenSettingsPanel,\n );\n const requestCloseSettingsPanel = useBlockSettingsStore(\n (state) => state.blockSettings.requestCloseSettingsPanel,\n );\n const isSettingsPanelOpen = useBlockSettingsStore(\n (state) => state.blockSettings.runtime.isSettingsPanelOpen,\n );\n const isSettingsShown = Boolean(selected && isSettingsPanelOpen);\n const [fitRequestVersion, setFitRequestVersion] = useState(0);\n\n useEffect(() => {\n if (mapId && !map) ensureMap(mapId, {title: title ?? 'Embedded Map'});\n }, [ensureMap, map, mapId, title]);\n\n const handleTableChange = useCallback(\n (table: DataTable) => {\n setSelectedTable(mapId, getTableIdentity(table.table));\n const hasGeo =\n Boolean(findLongitudeLatitudeColumns(table)) ||\n Boolean(findGeometryColumn(table));\n updateMap(mapId, {\n config: hasGeo\n ? createDeckMapConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n })\n : createEmptyDeckMapConfig(),\n });\n },\n [mapId, setSelectedTable, updateMap],\n );\n\n if (!map) {\n return (\n <div className=\"text-muted-foreground flex h-full min-h-[320px] items-center justify-center\">\n Preparing map...\n </div>\n );\n }\n const hasDatasets = Object.keys(map.config.datasets).length > 0;\n const canFitView = Boolean(map.config.fitToData && hasDatasets);\n const fitViewLabel = canFitView\n ? 'Fit map view to data'\n : 'Fit view unavailable for this map';\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n <div className=\"border-border flex shrink-0 items-center justify-between gap-2 border-b px-3 py-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <MapIcon className=\"h-4 w-4 shrink-0\" />\n <input\n className=\"min-w-0 flex-1 bg-transparent text-sm outline-none\"\n value={caption ?? map.title}\n readOnly={readOnly}\n placeholder={map.selectedTable ?? title ?? 'Map caption'}\n onChange={(event) =>\n onCaptionChange?.(event.target.value || undefined)\n }\n />\n </div>\n <div className=\"flex items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"inline-flex\"\n tabIndex={canFitView ? undefined : 0}\n aria-label={canFitView ? undefined : fitViewLabel}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={fitViewLabel}\n disabled={!canFitView}\n onClick={() => setFitRequestVersion((version) => version + 1)}\n >\n <FocusIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{fitViewLabel}</TooltipContent>\n </Tooltip>\n <Button\n type=\"button\"\n variant={isSettingsShown ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={\n isSettingsShown ? 'Close map settings' : 'Open map settings'\n }\n onClick={() =>\n isSettingsShown\n ? requestCloseSettingsPanel()\n : requestOpenSettingsPanel()\n }\n >\n <SlidersVerticalIcon className=\"h-3.5 w-3.5\" />\n </Button>\n {headerActions}\n </div>\n </div>\n <div className=\"min-h-0 flex-1\">\n {hasDatasets ? (\n <DeckMapResourceErrorBoundary\n resetKey={map.config}\n onError={(error) =>\n reportMapIssue(mapId, {\n kind: 'render-error',\n message: error.message,\n recoverable: true,\n })\n }\n >\n <DeckMapSurface\n mapId={mapId}\n map={map}\n readOnly={readOnly}\n selected={selected}\n onUpdateMap={(patch) => updateMap(mapId, patch)}\n onReportIssue={(issue) => reportMapIssue(mapId, issue)}\n onClearIssue={(kind) => clearMapIssue(mapId, kind)}\n fitRequestVersion={fitRequestVersion}\n dataAdapter={dataAdapter}\n />\n </DeckMapResourceErrorBoundary>\n ) : (\n <div className=\"flex h-full min-h-[320px] items-center justify-center p-4\">\n <select\n className=\"border-border bg-background rounded border px-3 py-2 text-sm\"\n value={map.selectedTable ?? ''}\n disabled={readOnly}\n onChange={(event) => {\n const table = tables.find(\n (candidate) =>\n getTableIdentity(candidate.table) === event.target.value,\n );\n if (table) handleTableChange(table);\n }}\n >\n <option value=\"\">Select a table</option>\n {tables.map((table) => (\n <option\n key={getTableIdentity(table.table)}\n value={getTableIdentity(table.table)}\n >\n {table.tableName}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../src/block.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n getTableIdentity,\n type DataTable,\n type DuckDbSliceState,\n} from '@sqlrooms/duckdb';\nimport {useBlockSettingsStore} from '@sqlrooms/documents';\nimport {Button, Tooltip, TooltipContent, TooltipTrigger} from '@sqlrooms/ui';\nimport {FocusIcon, MapIcon, SlidersVerticalIcon} from 'lucide-react';\nimport {\n Component,\n useCallback,\n useEffect,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from 'react';\nimport {\n DeckMapSurface,\n directDeckMapDataAdapter,\n type DeckMapDataAdapter,\n} from './DeckMapSurface';\nimport {type DeckMapsSliceState, useStoreWithDeckMaps} from './DeckMapsSlice';\nimport {createEmptyDeckMapConfig} from './mapConfig';\nimport {\n createDeckMapConfigForTable,\n findGeometryColumn,\n findLongitudeLatitudeColumns,\n} from './mapConfigUtils';\n\ntype DeckMapResourceState = DeckMapsSliceState & DuckDbSliceState;\n\ntype DeckMapResourceErrorBoundaryProps = {\n children: ReactNode;\n onError: (error: Error) => void;\n resetKey: unknown;\n};\n\ntype DeckMapResourceErrorBoundaryState = {\n error?: Error;\n resetKey: unknown;\n};\n\nclass DeckMapResourceErrorBoundary extends Component<\n DeckMapResourceErrorBoundaryProps,\n DeckMapResourceErrorBoundaryState\n> {\n state: DeckMapResourceErrorBoundaryState = {\n resetKey: this.props.resetKey,\n };\n static getDerivedStateFromError(error: Error) {\n return {error};\n }\n static getDerivedStateFromProps(\n props: DeckMapResourceErrorBoundaryProps,\n state: DeckMapResourceErrorBoundaryState,\n ) {\n return Object.is(props.resetKey, state.resetKey)\n ? null\n : {error: undefined, resetKey: props.resetKey};\n }\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\n '[DeckMapResourceErrorBoundary] Map render failed',\n error,\n errorInfo,\n );\n this.props.onError(error);\n }\n render() {\n if (this.state.error) {\n return (\n <div className=\"text-muted-foreground flex h-full min-h-[320px] items-center justify-center p-4 text-center text-sm\">\n Map failed to render: {this.state.error.message}\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n/** Ensures a first-class map resource, optionally seeded from geospatial data. */\nexport function ensureDeckMapResourceState(\n state: DeckMapResourceState,\n mapId: string,\n title?: string,\n) {\n if (state.deckMaps.getMap(mapId)) return;\n const table = state.db.tables.find(\n (candidate) =>\n Boolean(findLongitudeLatitudeColumns(candidate)) ||\n Boolean(findGeometryColumn(candidate)),\n );\n state.deckMaps.ensureMap(mapId, {\n title: title ?? 'Map',\n config: table\n ? createDeckMapConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n })\n : createEmptyDeckMapConfig(),\n });\n if (table)\n state.deckMaps.setSelectedTable(mapId, getTableIdentity(table.table));\n}\n\nexport type DeckMapBlockRendererProps = {\n mapId: string;\n title?: string;\n caption?: string;\n onCaptionChange?: (caption: string | undefined) => void;\n selected?: boolean;\n readOnly?: boolean;\n headerActions?: ReactNode;\n dataAdapter?: DeckMapDataAdapter;\n};\n\n/** Mosaic-free document map renderer backed only by `deckMaps`. */\nexport function DeckMapBlockRenderer({\n mapId,\n title,\n caption,\n onCaptionChange,\n selected,\n readOnly,\n headerActions,\n dataAdapter = directDeckMapDataAdapter,\n}: DeckMapBlockRendererProps) {\n const map = useStoreWithDeckMaps(\n (state) => state.deckMaps.config.mapsById[mapId],\n );\n const tables = useStoreWithDeckMaps((state) => state.db.tables);\n const ensureMap = useStoreWithDeckMaps((state) => state.deckMaps.ensureMap);\n const updateMap = useStoreWithDeckMaps((state) => state.deckMaps.updateMap);\n const setSelectedTable = useStoreWithDeckMaps(\n (state) => state.deckMaps.setSelectedTable,\n );\n const reportMapIssue = useStoreWithDeckMaps(\n (state) => state.deckMaps.reportMapIssue,\n );\n const clearMapIssue = useStoreWithDeckMaps(\n (state) => state.deckMaps.clearMapIssue,\n );\n const requestOpenSettingsPanel = useBlockSettingsStore(\n (state) => state.blockSettings.requestOpenSettingsPanel,\n );\n const requestCloseSettingsPanel = useBlockSettingsStore(\n (state) => state.blockSettings.requestCloseSettingsPanel,\n );\n const isSettingsPanelOpen = useBlockSettingsStore(\n (state) => state.blockSettings.runtime.isSettingsPanelOpen,\n );\n const isSettingsShown = Boolean(selected && isSettingsPanelOpen);\n const [fitRequestVersion, setFitRequestVersion] = useState(0);\n\n useEffect(() => {\n if (mapId && !map) ensureMap(mapId, {title: title ?? 'Embedded Map'});\n }, [ensureMap, map, mapId, title]);\n\n const handleTableChange = useCallback(\n (table: DataTable) => {\n setSelectedTable(mapId, getTableIdentity(table.table));\n const hasGeo =\n Boolean(findLongitudeLatitudeColumns(table)) ||\n Boolean(findGeometryColumn(table));\n updateMap(mapId, {\n config: hasGeo\n ? createDeckMapConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n })\n : createEmptyDeckMapConfig(),\n });\n },\n [mapId, setSelectedTable, updateMap],\n );\n\n if (!map) {\n return (\n <div className=\"text-muted-foreground flex h-full min-h-[320px] items-center justify-center\">\n Preparing map...\n </div>\n );\n }\n const hasDatasets = Object.keys(map.config.datasets).length > 0;\n const canFitView = Boolean(map.config.fitToData && hasDatasets);\n const fitViewLabel = canFitView\n ? 'Fit map view to data'\n : 'Fit view unavailable for this map';\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n <div className=\"border-border flex shrink-0 items-center justify-between gap-2 border-b px-3 py-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <MapIcon className=\"h-4 w-4 shrink-0\" />\n <input\n className=\"min-w-0 flex-1 bg-transparent text-sm outline-none\"\n value={caption ?? map.title}\n readOnly={readOnly}\n placeholder={map.selectedTable ?? title ?? 'Map caption'}\n onChange={(event) =>\n onCaptionChange?.(event.target.value || undefined)\n }\n />\n </div>\n <div className=\"flex items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"inline-flex\"\n tabIndex={canFitView ? undefined : 0}\n aria-label={canFitView ? undefined : fitViewLabel}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={fitViewLabel}\n disabled={!canFitView}\n onClick={() => setFitRequestVersion((version) => version + 1)}\n >\n <FocusIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{fitViewLabel}</TooltipContent>\n </Tooltip>\n <Button\n type=\"button\"\n variant={isSettingsShown ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={\n isSettingsShown ? 'Close map settings' : 'Open map settings'\n }\n onClick={() =>\n isSettingsShown\n ? requestCloseSettingsPanel()\n : requestOpenSettingsPanel()\n }\n >\n <SlidersVerticalIcon className=\"h-3.5 w-3.5\" />\n </Button>\n {headerActions}\n </div>\n </div>\n <div className=\"min-h-0 flex-1\">\n {hasDatasets ? (\n <DeckMapResourceErrorBoundary\n resetKey={map.config}\n onError={(error) =>\n reportMapIssue(mapId, {\n kind: 'render-error',\n message: error.message,\n recoverable: true,\n })\n }\n >\n <DeckMapSurface\n mapId={mapId}\n map={map}\n readOnly={readOnly}\n selected={selected}\n onUpdateMap={(patch) => updateMap(mapId, patch)}\n onReportIssue={(issue) => reportMapIssue(mapId, issue)}\n onClearIssue={(kind) => clearMapIssue(mapId, kind)}\n fitRequestVersion={fitRequestVersion}\n dataAdapter={dataAdapter}\n />\n </DeckMapResourceErrorBoundary>\n ) : (\n <div className=\"flex h-full min-h-[320px] items-center justify-center p-4\">\n <select\n className=\"border-border bg-background rounded border px-3 py-2 text-sm\"\n value={map.selectedTable ?? ''}\n disabled={readOnly}\n onChange={(event) => {\n const table = tables.find(\n (candidate) =>\n getTableIdentity(candidate.table) === event.target.value,\n );\n if (table) handleTableChange(table);\n }}\n >\n <option value=\"\">Select a table</option>\n {tables.map((table) => (\n <option\n key={getTableIdentity(table.table)}\n value={getTableIdentity(table.table)}\n >\n {table.tableName}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { DeckMapResource } from './DeckMapsSlice';
2
- import type { DeckMapConfig } from './mapConfig';
2
+ import { type DeckMapConfig } from './mapConfig';
3
+ import { type DeckMapConfigColumn, type DeckMapPointBinding } from './mapConfigUtils';
3
4
  /**
4
5
  * Host callbacks used to coordinate a durable Deck map resource with its block
5
6
  * document container, table registry, and optional config preparation.
@@ -39,6 +40,7 @@ export type CreateOrUpdateDeckMapResourceHost = {
39
40
  }) => void | Promise<void>;
40
41
  findTable: (tableName: string) => {
41
42
  tableIdentity: string;
43
+ columns: readonly DeckMapConfigColumn[];
42
44
  } | undefined;
43
45
  prepareConfig?: (options: {
44
46
  config: DeckMapConfig;
@@ -52,6 +54,8 @@ export type CreateOrUpdateDeckMapResourceHost = {
52
54
  export type CreateOrUpdateDeckMapResourceParams = {
53
55
  blockDocumentId: string;
54
56
  config: DeckMapConfig;
57
+ /** Generates canonical point geometry from structured lon/lat provenance. */
58
+ pointBinding?: DeckMapPointBinding;
55
59
  mapId?: string;
56
60
  tableName?: string;
57
61
  title?: string;
@@ -76,6 +80,6 @@ export type CreateOrUpdateDeckMapResourceResult = {
76
80
  message: string;
77
81
  created: boolean;
78
82
  };
79
- /** Resource-native worksheet map orchestration with metadata-after-map-write ordering. */
83
+ /** Resource-native document map orchestration with metadata-after-map-write ordering. */
80
84
  export declare function createOrUpdateDeckMapResource(host: CreateOrUpdateDeckMapResourceHost, params: CreateOrUpdateDeckMapResourceParams): Promise<CreateOrUpdateDeckMapResourceResult>;
81
85
  //# sourceMappingURL=createOrUpdateDeckMapResource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createOrUpdateDeckMapResource.d.ts","sourceRoot":"","sources":["../src/createOrUpdateDeckMapResource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createOrUpdateDeckMapResource.d.ts","sourceRoot":"","sources":["../src/createOrUpdateDeckMapResource.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,32 @@
1
+ import { createDeckTableDatasetSql } from './datasets/tableDatasetSql';
2
+ import { isDeckMapTableDatasetSource } from './mapConfig';
1
3
  import { getFirstDatasetSourceTableName, hasSqlOnlyDatasetSource, } from './datasetSourceUtils';
2
4
  import { assertDeckMapResourceConfig } from './mapResourceAuthoring';
3
- /** Resource-native worksheet map orchestration with metadata-after-map-write ordering. */
5
+ import { applyDeckMapPointBinding, } from './mapConfigUtils';
6
+ function resolveTableDatasetSources(host, config) {
7
+ let changed = false;
8
+ const datasets = Object.fromEntries(Object.entries(config.datasets).map(([datasetId, dataset]) => {
9
+ const source = dataset.source;
10
+ if (!isDeckMapTableDatasetSource(source))
11
+ return [datasetId, dataset];
12
+ const table = host.findTable(source.tableName);
13
+ if (!table) {
14
+ throw new Error(`Dataset "${datasetId}" table "${source.tableName}" was not found.`);
15
+ }
16
+ const canonicalSource = {
17
+ ...source,
18
+ tableName: table.tableIdentity,
19
+ };
20
+ createDeckTableDatasetSql(canonicalSource);
21
+ if (canonicalSource.tableName === source.tableName) {
22
+ return [datasetId, dataset];
23
+ }
24
+ changed = true;
25
+ return [datasetId, { ...dataset, source: canonicalSource }];
26
+ }));
27
+ return changed ? { ...config, datasets } : config;
28
+ }
29
+ /** Resource-native document map orchestration with metadata-after-map-write ordering. */
4
30
  export async function createOrUpdateDeckMapResource(host, params) {
5
31
  const artifactLabel = params.artifactLabel ?? 'block document';
6
32
  host.ensureBlockDocument(params.blockDocumentId);
@@ -25,8 +51,27 @@ export async function createOrUpdateDeckMapResource(host, params) {
25
51
  replaceDatasets: params.replaceDatasets,
26
52
  })
27
53
  : params.config;
28
- assertDeckMapResourceConfig(preparedConfig);
29
- const tableName = requestedTable ?? getFirstDatasetSourceTableName(preparedConfig);
54
+ const pointBindingDataset = params.pointBinding
55
+ ? preparedConfig.datasets[params.pointBinding.dataset.trim()]
56
+ : undefined;
57
+ const pointBindingTable = isDeckMapTableDatasetSource(pointBindingDataset?.source)
58
+ ? host.findTable(pointBindingDataset.source.tableName)
59
+ : undefined;
60
+ if (params.pointBinding &&
61
+ isDeckMapTableDatasetSource(pointBindingDataset?.source) &&
62
+ !pointBindingTable) {
63
+ throw new Error(`Dataset "${params.pointBinding.dataset.trim()}" table "${pointBindingDataset.source.tableName}" was not found.`);
64
+ }
65
+ const pointBoundConfig = params.pointBinding
66
+ ? applyDeckMapPointBinding({
67
+ config: preparedConfig,
68
+ pointBinding: params.pointBinding,
69
+ sourceColumns: pointBindingTable?.columns ?? [],
70
+ })
71
+ : preparedConfig;
72
+ const resolvedConfig = resolveTableDatasetSources(host, pointBoundConfig);
73
+ assertDeckMapResourceConfig(resolvedConfig);
74
+ const tableName = requestedTable ?? getFirstDatasetSourceTableName(resolvedConfig);
30
75
  if ((params.requireTableNameForSqlOnlyUpdate ?? true) &&
31
76
  existingBlock &&
32
77
  !tableName &&
@@ -36,6 +81,14 @@ export async function createOrUpdateDeckMapResource(host, params) {
36
81
  const table = tableName ? host.findTable(tableName) : undefined;
37
82
  if (tableName && !table)
38
83
  throw new Error(`Table "${tableName}" was not found.`);
84
+ const tableDatasetCount = Object.values(resolvedConfig.datasets).filter((dataset) => isDeckMapTableDatasetSource(dataset.source)).length;
85
+ if (params.pointBinding &&
86
+ tableDatasetCount === 1 &&
87
+ pointBindingTable &&
88
+ table &&
89
+ pointBindingTable.tableIdentity !== table.tableIdentity) {
90
+ throw new Error(`Point binding dataset "${params.pointBinding.dataset.trim()}" resolves to table "${pointBindingTable.tableIdentity}", but selected table "${table.tableIdentity}" would override it.`);
91
+ }
39
92
  const caption = params.caption?.trim() ||
40
93
  params.title?.trim() ||
41
94
  existingBlock?.caption?.trim() ||
@@ -56,7 +109,7 @@ export async function createOrUpdateDeckMapResource(host, params) {
56
109
  await host.writeMap({
57
110
  mapId: block.mapId,
58
111
  title,
59
- config: preparedConfig,
112
+ config: resolvedConfig,
60
113
  selectedTable: table?.tableIdentity,
61
114
  });
62
115
  if (existingBlock) {
@@ -1 +1 @@
1
- {"version":3,"file":"createOrUpdateDeckMapResource.js","sourceRoot":"","sources":["../src/createOrUpdateDeckMapResource.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DeckMapResource} from './DeckMapsSlice';\nimport type {DeckMapConfig} from './mapConfig';\nimport {\n getFirstDatasetSourceTableName,\n hasSqlOnlyDatasetSource,\n} from './datasetSourceUtils';\nimport {assertDeckMapResourceConfig} from './mapResourceAuthoring';\n\n/**\n * Host callbacks used to coordinate a durable Deck map resource with its block\n * document container, table registry, and optional config preparation.\n */\nexport type CreateOrUpdateDeckMapResourceHost = {\n ensureBlockDocument: (blockDocumentId: string) => void;\n findMapBlock: (\n blockDocumentId: string,\n mapId: string,\n ) => {blockId: string; mapId: string; caption?: string} | undefined;\n findMap: (mapId: string) => DeckMapResource | undefined;\n createMapBlock: (options: {\n blockDocumentId: string;\n mapId: string;\n title: string;\n caption?: string;\n intent?: string;\n height?: number;\n }) => Promise<{blockId: string; mapId: string}>;\n updateBlockMetadata: (options: {\n blockDocumentId: string;\n blockId: string;\n caption?: string;\n intent?: string;\n height?: number;\n }) => void | Promise<void>;\n ensureMap: (mapId: string, title: string) => void;\n writeMap: (options: {\n mapId: string;\n title: string;\n config: DeckMapConfig;\n selectedTable?: string;\n }) => void | Promise<void>;\n findTable: (tableName: string) => {tableIdentity: string} | undefined;\n prepareConfig?: (options: {\n config: DeckMapConfig;\n existingMapConfig?: DeckMapConfig;\n tableName?: string;\n replaceLayers?: boolean;\n replaceDatasets?: boolean;\n }) => DeckMapConfig | Promise<DeckMapConfig>;\n};\n\n/** Input for creating or updating a Deck map resource and its owning block. */\nexport type CreateOrUpdateDeckMapResourceParams = {\n blockDocumentId: string;\n config: DeckMapConfig;\n mapId?: string;\n tableName?: string;\n title?: string;\n caption?: string;\n intent?: string;\n height?: number;\n /** Treat `config.spec.layers` as the complete replacement layer list. */\n replaceLayers?: boolean;\n /** Treat `config.datasets` as the complete replacement dataset registry. */\n replaceDatasets?: boolean;\n requireTableNameForSqlOnlyUpdate?: boolean;\n artifactLabel?: string;\n createMapId?: () => string;\n missingMapBlockBehavior?: 'throw' | 'create';\n};\n\n/** Result identities and resolved table selection from a map resource write. */\nexport type CreateOrUpdateDeckMapResourceResult = {\n blockDocumentId: string;\n blockId: string;\n mapId: string;\n selectedTable?: string;\n message: string;\n created: boolean;\n};\n\n/** Resource-native worksheet map orchestration with metadata-after-map-write ordering. */\nexport async function createOrUpdateDeckMapResource(\n host: CreateOrUpdateDeckMapResourceHost,\n params: CreateOrUpdateDeckMapResourceParams,\n): Promise<CreateOrUpdateDeckMapResourceResult> {\n const artifactLabel = params.artifactLabel ?? 'block document';\n host.ensureBlockDocument(params.blockDocumentId);\n const existingBlock = params.mapId\n ? host.findMapBlock(params.blockDocumentId, params.mapId)\n : undefined;\n const missingBehavior = params.missingMapBlockBehavior ?? 'throw';\n if (params.mapId && !existingBlock && missingBehavior === 'throw') {\n throw new Error(\n `${artifactLabel} map block ${params.mapId} was not found in ${params.blockDocumentId}`,\n );\n }\n const mapId = existingBlock?.mapId ?? params.mapId ?? params.createMapId?.();\n if (!mapId) throw new Error('mapId is required when creating a map block');\n\n const existingMap = host.findMap(mapId);\n const requestedTable =\n params.tableName ?? getFirstDatasetSourceTableName(params.config);\n const preparedConfig = host.prepareConfig\n ? await host.prepareConfig({\n config: params.config,\n existingMapConfig: existingMap?.config,\n tableName: requestedTable,\n replaceLayers: params.replaceLayers,\n replaceDatasets: params.replaceDatasets,\n })\n : params.config;\n assertDeckMapResourceConfig(preparedConfig);\n const tableName =\n requestedTable ?? getFirstDatasetSourceTableName(preparedConfig);\n if (\n (params.requireTableNameForSqlOnlyUpdate ?? true) &&\n existingBlock &&\n !tableName &&\n hasSqlOnlyDatasetSource(params.config)\n ) {\n throw new Error(\n `tableName is required when updating a ${artifactLabel} map block with SQL-only dataset sources.`,\n );\n }\n const table = tableName ? host.findTable(tableName) : undefined;\n if (tableName && !table)\n throw new Error(`Table \"${tableName}\" was not found.`);\n\n const caption =\n params.caption?.trim() ||\n params.title?.trim() ||\n existingBlock?.caption?.trim() ||\n existingMap?.title?.trim() ||\n 'Map';\n const title = params.title?.trim() || caption;\n const created = !existingBlock;\n const block =\n existingBlock ??\n (await host.createMapBlock({\n blockDocumentId: params.blockDocumentId,\n mapId,\n title,\n caption,\n intent: params.intent,\n height: params.height,\n }));\n host.ensureMap(block.mapId, title);\n await host.writeMap({\n mapId: block.mapId,\n title,\n config: preparedConfig,\n selectedTable: table?.tableIdentity,\n });\n if (existingBlock) {\n await host.updateBlockMetadata({\n blockDocumentId: params.blockDocumentId,\n blockId: block.blockId,\n caption,\n intent: params.intent,\n height: params.height,\n });\n }\n return {\n blockDocumentId: params.blockDocumentId,\n blockId: block.blockId,\n mapId: block.mapId,\n selectedTable: table?.tableIdentity,\n created,\n message: created\n ? `Added ${artifactLabel} map block \"${title}\".`\n : `Updated ${artifactLabel} map block \"${title}\".`,\n };\n}\n"]}
1
+ {"version":3,"file":"createOrUpdateDeckMapResource.js","sourceRoot":"","sources":["../src/createOrUpdateDeckMapResource.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DeckMapResource} from './DeckMapsSlice';\nimport {createDeckTableDatasetSql} from './datasets/tableDatasetSql';\nimport {isDeckMapTableDatasetSource, type DeckMapConfig} from './mapConfig';\nimport {\n getFirstDatasetSourceTableName,\n hasSqlOnlyDatasetSource,\n} from './datasetSourceUtils';\nimport {assertDeckMapResourceConfig} from './mapResourceAuthoring';\nimport {\n applyDeckMapPointBinding,\n type DeckMapConfigColumn,\n type DeckMapPointBinding,\n} from './mapConfigUtils';\n\n/**\n * Host callbacks used to coordinate a durable Deck map resource with its block\n * document container, table registry, and optional config preparation.\n */\nexport type CreateOrUpdateDeckMapResourceHost = {\n ensureBlockDocument: (blockDocumentId: string) => void;\n findMapBlock: (\n blockDocumentId: string,\n mapId: string,\n ) => {blockId: string; mapId: string; caption?: string} | undefined;\n findMap: (mapId: string) => DeckMapResource | undefined;\n createMapBlock: (options: {\n blockDocumentId: string;\n mapId: string;\n title: string;\n caption?: string;\n intent?: string;\n height?: number;\n }) => Promise<{blockId: string; mapId: string}>;\n updateBlockMetadata: (options: {\n blockDocumentId: string;\n blockId: string;\n caption?: string;\n intent?: string;\n height?: number;\n }) => void | Promise<void>;\n ensureMap: (mapId: string, title: string) => void;\n writeMap: (options: {\n mapId: string;\n title: string;\n config: DeckMapConfig;\n selectedTable?: string;\n }) => void | Promise<void>;\n findTable: (\n tableName: string,\n ) =>\n | {tableIdentity: string; columns: readonly DeckMapConfigColumn[]}\n | undefined;\n prepareConfig?: (options: {\n config: DeckMapConfig;\n existingMapConfig?: DeckMapConfig;\n tableName?: string;\n replaceLayers?: boolean;\n replaceDatasets?: boolean;\n }) => DeckMapConfig | Promise<DeckMapConfig>;\n};\n\n/** Input for creating or updating a Deck map resource and its owning block. */\nexport type CreateOrUpdateDeckMapResourceParams = {\n blockDocumentId: string;\n config: DeckMapConfig;\n /** Generates canonical point geometry from structured lon/lat provenance. */\n pointBinding?: DeckMapPointBinding;\n mapId?: string;\n tableName?: string;\n title?: string;\n caption?: string;\n intent?: string;\n height?: number;\n /** Treat `config.spec.layers` as the complete replacement layer list. */\n replaceLayers?: boolean;\n /** Treat `config.datasets` as the complete replacement dataset registry. */\n replaceDatasets?: boolean;\n requireTableNameForSqlOnlyUpdate?: boolean;\n artifactLabel?: string;\n createMapId?: () => string;\n missingMapBlockBehavior?: 'throw' | 'create';\n};\n\n/** Result identities and resolved table selection from a map resource write. */\nexport type CreateOrUpdateDeckMapResourceResult = {\n blockDocumentId: string;\n blockId: string;\n mapId: string;\n selectedTable?: string;\n message: string;\n created: boolean;\n};\n\nfunction resolveTableDatasetSources(\n host: Pick<CreateOrUpdateDeckMapResourceHost, 'findTable'>,\n config: DeckMapConfig,\n): DeckMapConfig {\n let changed = false;\n const datasets = Object.fromEntries(\n Object.entries(config.datasets).map(([datasetId, dataset]) => {\n const source = dataset.source;\n if (!isDeckMapTableDatasetSource(source)) return [datasetId, dataset];\n\n const table = host.findTable(source.tableName);\n if (!table) {\n throw new Error(\n `Dataset \"${datasetId}\" table \"${source.tableName}\" was not found.`,\n );\n }\n const canonicalSource = {\n ...source,\n tableName: table.tableIdentity,\n };\n createDeckTableDatasetSql(canonicalSource);\n if (canonicalSource.tableName === source.tableName) {\n return [datasetId, dataset];\n }\n changed = true;\n return [datasetId, {...dataset, source: canonicalSource}];\n }),\n );\n return changed ? {...config, datasets} : config;\n}\n\n/** Resource-native document map orchestration with metadata-after-map-write ordering. */\nexport async function createOrUpdateDeckMapResource(\n host: CreateOrUpdateDeckMapResourceHost,\n params: CreateOrUpdateDeckMapResourceParams,\n): Promise<CreateOrUpdateDeckMapResourceResult> {\n const artifactLabel = params.artifactLabel ?? 'block document';\n host.ensureBlockDocument(params.blockDocumentId);\n const existingBlock = params.mapId\n ? host.findMapBlock(params.blockDocumentId, params.mapId)\n : undefined;\n const missingBehavior = params.missingMapBlockBehavior ?? 'throw';\n if (params.mapId && !existingBlock && missingBehavior === 'throw') {\n throw new Error(\n `${artifactLabel} map block ${params.mapId} was not found in ${params.blockDocumentId}`,\n );\n }\n const mapId = existingBlock?.mapId ?? params.mapId ?? params.createMapId?.();\n if (!mapId) throw new Error('mapId is required when creating a map block');\n\n const existingMap = host.findMap(mapId);\n const requestedTable =\n params.tableName ?? getFirstDatasetSourceTableName(params.config);\n const preparedConfig = host.prepareConfig\n ? await host.prepareConfig({\n config: params.config,\n existingMapConfig: existingMap?.config,\n tableName: requestedTable,\n replaceLayers: params.replaceLayers,\n replaceDatasets: params.replaceDatasets,\n })\n : params.config;\n const pointBindingDataset = params.pointBinding\n ? preparedConfig.datasets[params.pointBinding.dataset.trim()]\n : undefined;\n const pointBindingTable = isDeckMapTableDatasetSource(\n pointBindingDataset?.source,\n )\n ? host.findTable(pointBindingDataset.source.tableName)\n : undefined;\n if (\n params.pointBinding &&\n isDeckMapTableDatasetSource(pointBindingDataset?.source) &&\n !pointBindingTable\n ) {\n throw new Error(\n `Dataset \"${params.pointBinding.dataset.trim()}\" table \"${pointBindingDataset.source.tableName}\" was not found.`,\n );\n }\n const pointBoundConfig = params.pointBinding\n ? applyDeckMapPointBinding({\n config: preparedConfig,\n pointBinding: params.pointBinding,\n sourceColumns: pointBindingTable?.columns ?? [],\n })\n : preparedConfig;\n const resolvedConfig = resolveTableDatasetSources(host, pointBoundConfig);\n assertDeckMapResourceConfig(resolvedConfig);\n const tableName =\n requestedTable ?? getFirstDatasetSourceTableName(resolvedConfig);\n if (\n (params.requireTableNameForSqlOnlyUpdate ?? true) &&\n existingBlock &&\n !tableName &&\n hasSqlOnlyDatasetSource(params.config)\n ) {\n throw new Error(\n `tableName is required when updating a ${artifactLabel} map block with SQL-only dataset sources.`,\n );\n }\n const table = tableName ? host.findTable(tableName) : undefined;\n if (tableName && !table)\n throw new Error(`Table \"${tableName}\" was not found.`);\n const tableDatasetCount = Object.values(resolvedConfig.datasets).filter(\n (dataset) => isDeckMapTableDatasetSource(dataset.source),\n ).length;\n if (\n params.pointBinding &&\n tableDatasetCount === 1 &&\n pointBindingTable &&\n table &&\n pointBindingTable.tableIdentity !== table.tableIdentity\n ) {\n throw new Error(\n `Point binding dataset \"${params.pointBinding.dataset.trim()}\" resolves to table \"${pointBindingTable.tableIdentity}\", but selected table \"${table.tableIdentity}\" would override it.`,\n );\n }\n\n const caption =\n params.caption?.trim() ||\n params.title?.trim() ||\n existingBlock?.caption?.trim() ||\n existingMap?.title?.trim() ||\n 'Map';\n const title = params.title?.trim() || caption;\n const created = !existingBlock;\n const block =\n existingBlock ??\n (await host.createMapBlock({\n blockDocumentId: params.blockDocumentId,\n mapId,\n title,\n caption,\n intent: params.intent,\n height: params.height,\n }));\n host.ensureMap(block.mapId, title);\n await host.writeMap({\n mapId: block.mapId,\n title,\n config: resolvedConfig,\n selectedTable: table?.tableIdentity,\n });\n if (existingBlock) {\n await host.updateBlockMetadata({\n blockDocumentId: params.blockDocumentId,\n blockId: block.blockId,\n caption,\n intent: params.intent,\n height: params.height,\n });\n }\n return {\n blockDocumentId: params.blockDocumentId,\n blockId: block.blockId,\n mapId: block.mapId,\n selectedTable: table?.tableIdentity,\n created,\n message: created\n ? `Added ${artifactLabel} map block \"${title}\".`\n : `Updated ${artifactLabel} map block \"${title}\".`,\n };\n}\n"]}
@@ -26,10 +26,9 @@ type PreparedDatasetStoreState = {
26
26
  /**
27
27
  * Ensure a cache entry exists for the given dataset key.
28
28
  *
29
- * If an entry already exists, this is a no-op other than touching its LRU
30
- * metadata. Otherwise the store creates a `loading` entry, resolves the
31
- * source table through DuckDB if needed, runs `prepareDeckDataset(...)`, and
32
- * stores the resulting `ready` or `error` state.
29
+ * If an entry already exists, this is a no-op besides refreshing the
30
+ * in-place LRU timestamp. Subscribers are not notified: a cache hit is not
31
+ * a dataset change, and notifying would rebuild every mounted map's layers.
33
32
  */
34
33
  ensureEntry: (options: {
35
34
  cacheKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"PreparedDatasetStore.d.ts","sourceRoot":"","sources":["../../src/datasets/PreparedDatasetStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC9B,MAAM,UAAU,CAAC;AAWlB,OAAO,KAAK,EACV,yBAAyB,EACzB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AAQjB;;;;;GAKG;AACH,KAAK,yBAAyB,GAAG;IAC/B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACnD;;;;;;;OAOG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACjC,KAAK,EAAE,gBAAgB,CAAC;KACzB,KAAK,IAAI,CAAC;IACX;;;;;;OAMG;IACH,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;;;;OAMG;IACH,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3D;;;;;;;OAOG;IACH,uBAAuB,EAAE,CAAC,OAAO,EAAE;QACjC,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC3C,UAAU,EAAE,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACjC,iBAAiB,EAAE,MAAM,CAAC;KAC3B,KAAK,IAAI,CAAC;CACZ,CAAC;AAwBF;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,2BAAgC,yDAkR1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,yBAAyB,CAAC;CACnC,GAAG,wBAAwB,CAqB3B;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE;IACxD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACnD,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAc3C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,uDAA+B,CAAC"}
1
+ {"version":3,"file":"PreparedDatasetStore.d.ts","sourceRoot":"","sources":["../../src/datasets/PreparedDatasetStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC9B,MAAM,UAAU,CAAC;AAUlB,OAAO,KAAK,EACV,yBAAyB,EACzB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AAQjB;;;;;GAKG;AACH,KAAK,yBAAyB,GAAG;IAC/B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACnD;;;;;;OAMG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACjC,KAAK,EAAE,gBAAgB,CAAC;KACzB,KAAK,IAAI,CAAC;IACX;;;;;;OAMG;IACH,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;;;;OAMG;IACH,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3D;;;;;;;OAOG;IACH,uBAAuB,EAAE,CAAC,OAAO,EAAE;QACjC,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC3C,UAAU,EAAE,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACjC,iBAAiB,EAAE,MAAM,CAAC;KAC3B,KAAK,IAAI,CAAC;CACZ,CAAC;AAwBF;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,2BAAgC,yDA8Q1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,yBAAyB,CAAC;CACnC,GAAG,wBAAwB,CAqB3B;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE;IACxD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACnD,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAc3C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,uDAA+B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { createStore } from 'zustand/vanilla';
2
2
  import { prepareDeckDataset } from '../prepare/prepareDeckDataset';
3
3
  import { isSqlDatasetInput, isTableDatasetInput, } from '../types';
4
- import { DEFAULT_MAX_PREPARED_DATASET_ENTRIES, cloneEntryWithConsumers, evictLruEntries, nextAccessTimestamp, resolvePreparedDatasetCacheKey, touchEntry, } from './helpers';
4
+ import { DEFAULT_MAX_PREPARED_DATASET_ENTRIES, cloneEntryWithConsumers, evictLruEntries, nextAccessTimestamp, resolvePreparedDatasetCacheKey, } from './helpers';
5
5
  import { resolveArrowTable } from './normalizeDatasets';
6
6
  import { createDeckTableDatasetSql } from './tableDatasetSql';
7
7
  import { createDescribeDatasetSql, geometryColumnsNeedingWkbWrap, parseDescribeSqlColumns, wrapSqlGeometryColumnsAsWkb, } from './wrapGeometryAsWkb';
@@ -38,13 +38,9 @@ export function createPreparedDatasetStore(options = {}) {
38
38
  const existing = get().entries[cacheKey];
39
39
  if (existing) {
40
40
  if (existing.status !== 'loading') {
41
- set((state) => ({
42
- ...state,
43
- entries: {
44
- ...state.entries,
45
- [cacheKey]: touchEntry(existing),
46
- },
47
- }));
41
+ // Mutate the timestamp in place so LRU still works without replacing
42
+ // `entries` and forcing every DeckJsonMap to reconvert layers.
43
+ existing.lastAccessedAt = nextAccessTimestamp();
48
44
  }
49
45
  return;
50
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PreparedDatasetStore.js","sourceRoot":"","sources":["../../src/datasets/PreparedDatasetStore.ts"],"names":[],"mappings":"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","sourcesContent":["import type {QueryHandle} from '@sqlrooms/duckdb';\nimport {createStore} from 'zustand/vanilla';\nimport {prepareDeckDataset} from '../prepare/prepareDeckDataset';\nimport {\n isSqlDatasetInput,\n isTableDatasetInput,\n type DeckDatasetInput,\n type PreparedDeckDatasetState,\n} from '../types';\nimport {\n DEFAULT_MAX_PREPARED_DATASET_ENTRIES,\n cloneEntryWithConsumers,\n evictLruEntries,\n nextAccessTimestamp,\n resolvePreparedDatasetCacheKey,\n touchEntry,\n} from './helpers';\nimport {resolveArrowTable} from './normalizeDatasets';\nimport {createDeckTableDatasetSql} from './tableDatasetSql';\nimport type {\n PreparedDatasetCacheEntry,\n PreparedDatasetStoreOptions,\n} from './types';\nimport {\n createDescribeDatasetSql,\n geometryColumnsNeedingWkbWrap,\n parseDescribeSqlColumns,\n wrapSqlGeometryColumnsAsWkb,\n} from './wrapGeometryAsWkb';\n\n/**\n * Internal store state for the prepared-dataset cache.\n *\n * `DeckJsonMap` never talks to this shape directly; `usePreparedDatasetStates`\n * uses it as the backing state machine for preparation, reuse, and eviction.\n */\ntype PreparedDatasetStoreState = {\n /**\n * Cache keys currently referenced by each hook consumer.\n *\n * This lets the store update consumer memberships incrementally when a map's\n * dataset registry changes, instead of resetting all cache state.\n */\n consumerKeys: Record<string, string[]>;\n /**\n * Prepared entries keyed by resolved dataset identity.\n *\n * Keys are based on query/table identity plus geometry options, not dataset\n * id, so the same prepared result can be reused across multiple maps or\n * differently named datasets that point at the same underlying data.\n */\n entries: Record<string, PreparedDatasetCacheEntry>;\n /**\n * Ensure a cache entry exists for the given dataset key.\n *\n * If an entry already exists, this is a no-op other than touching its LRU\n * metadata. Otherwise the store creates a `loading` entry, resolves the\n * source table through DuckDB if needed, runs `prepareDeckDataset(...)`, and\n * stores the resulting `ready` or `error` state.\n */\n ensureEntry: (options: {\n cacheKey: string;\n datasetId: string;\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n input: DeckDatasetInput;\n }) => void;\n /**\n * Remove all subscriptions for one hook consumer.\n *\n * This is called when a `DeckJsonMap` instance unmounts so the store can\n * release the consumer's references and allow now-unreferenced entries to be\n * evicted later.\n */\n removeConsumer: (consumerId: string) => void;\n /**\n * Reconcile the set of cache keys referenced by one hook consumer.\n *\n * This adds the consumer to newly needed entries, removes it from entries no\n * longer needed, and preserves existing entries in place so unrelated dataset\n * states do not get reset during prop changes.\n */\n syncConsumer: (consumerId: string, keys: string[]) => void;\n /**\n * Reconcile and ensure all prepared entries needed by one dataset registry.\n *\n * This is the store-level orchestration entrypoint used by\n * `usePreparedDatasetStates`. It computes cache keys for the current dataset\n * registry, syncs consumer memberships, and eagerly ensures any resolvable\n * entries exist.\n */\n syncDatasetsForConsumer: (options: {\n consumerId: string;\n datasets: Record<string, DeckDatasetInput>;\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n sqlSourceIdentity: object;\n }) => void;\n};\n\ntype PreparedDatasetDescriptor = {\n datasetId: string;\n input: DeckDatasetInput;\n cacheKey: string | undefined;\n};\n\nfunction resolvePreparedDatasetDescriptors(options: {\n datasets: Record<string, DeckDatasetInput>;\n sqlSourceIdentity: object;\n}): PreparedDatasetDescriptor[] {\n const {datasets, sqlSourceIdentity} = options;\n\n return Object.entries(datasets).map(([datasetId, input]) => ({\n datasetId,\n input,\n cacheKey: resolvePreparedDatasetCacheKey({\n input,\n sqlSourceIdentity,\n }),\n }));\n}\n\n/**\n * Create a feature-local cache store for prepared deck datasets.\n *\n * The store is intentionally scoped to deck's preparation layer. It reuses the\n * expensive result of `prepareDeckDataset(...)` across consumers while leaving\n * raw query/result caching to the upstream data provider:\n *\n * - Mosaic handles cached query results through its coordinator/query manager\n * - DuckDB-backed SQL datasets still use the DuckDB slice execution path\n *\n * This keeps `@sqlrooms/deck` independent from either provider while still\n * avoiding repeated geometry decoding and GeoArrow/GeoJSON shaping work.\n */\nexport function createPreparedDatasetStore(\n options: PreparedDatasetStoreOptions = {},\n) {\n const {\n maxEntries = DEFAULT_MAX_PREPARED_DATASET_ENTRIES,\n prepareDataset = prepareDeckDataset,\n } = options;\n\n return createStore<PreparedDatasetStoreState>((set, get) => ({\n consumerKeys: {},\n entries: {},\n\n ensureEntry({cacheKey, datasetId, executeSql, input}) {\n const existing = get().entries[cacheKey];\n if (existing) {\n if (existing.status !== 'loading') {\n set((state) => ({\n ...state,\n entries: {\n ...state.entries,\n [cacheKey]: touchEntry(existing),\n },\n }));\n }\n return;\n }\n\n const promise = Promise.resolve().then(async () => {\n try {\n let table = resolveArrowTable(input);\n let geometryEncodingHint = input.geometryEncodingHint;\n if (\n !table &&\n (isSqlDatasetInput(input) || isTableDatasetInput(input))\n ) {\n const baseSql = isSqlDatasetInput(input)\n ? input.sqlQuery\n : createDeckTableDatasetSql(input);\n\n // Probe DuckDB logical types and project native GEOMETRY columns\n // through ST_AsWKB so prepare/decode never sees undecodable blobs.\n // Authored SQL is left intact — the wrap is a pipeline outer query.\n let sql = baseSql;\n try {\n const describeHandle = await executeSql(\n createDescribeDatasetSql(baseSql),\n );\n if (describeHandle) {\n const describeTable = await describeHandle;\n const geometryColumns = geometryColumnsNeedingWkbWrap(\n parseDescribeSqlColumns(describeTable),\n );\n const wrapped = wrapSqlGeometryColumnsAsWkb(\n baseSql,\n geometryColumns,\n );\n if (wrapped) {\n sql = wrapped;\n // Only force the dataset-level hint to WKB when the configured\n // geometry column was among the wrapped columns (or unset).\n // An unrelated native GEOMETRY column must not make a WKT /\n // GeoArrow geometryColumn decode as WKB.\n const resolvedGeom = input.geometryColumn;\n if (!resolvedGeom || geometryColumns.includes(resolvedGeom)) {\n geometryEncodingHint = 'wkb';\n }\n }\n }\n } catch {\n // If DESCRIBE fails (e.g. missing spatial), fall through to the\n // original SQL — prepare still surfaces decode errors.\n }\n\n const queryHandle = await executeSql(sql);\n if (!queryHandle) {\n throw new Error(\n `Query for dataset \"${datasetId}\" was cancelled.`,\n );\n }\n\n table = await queryHandle;\n }\n\n if (!table) {\n return;\n }\n\n const prepared = prepareDataset({\n datasetId,\n table,\n geometryColumn: input.geometryColumn,\n geometryEncodingHint,\n });\n\n set((state) => ({\n ...state,\n entries: evictLruEntries(\n {\n ...state.entries,\n [cacheKey]: {\n status: 'ready',\n prepared,\n consumers:\n state.entries[cacheKey]?.consumers ?? new Set<string>(),\n lastAccessedAt: nextAccessTimestamp(),\n },\n },\n maxEntries,\n ),\n }));\n } catch (error) {\n set((state) => ({\n ...state,\n entries: evictLruEntries(\n {\n ...state.entries,\n [cacheKey]: {\n status: 'error',\n error:\n error instanceof Error ? error : new Error(String(error)),\n consumers:\n state.entries[cacheKey]?.consumers ?? new Set<string>(),\n lastAccessedAt: nextAccessTimestamp(),\n },\n },\n maxEntries,\n ),\n }));\n }\n });\n\n set((state) => ({\n ...state,\n entries: {\n ...state.entries,\n [cacheKey]: {\n status: 'loading',\n promise,\n consumers: state.entries[cacheKey]?.consumers ?? new Set<string>(),\n lastAccessedAt: nextAccessTimestamp(),\n },\n },\n }));\n },\n\n syncConsumer(consumerId, keys) {\n const previousKeys = new Set(get().consumerKeys[consumerId] ?? []);\n const nextKeys = new Set(keys);\n\n set((state) => {\n let didChangeEntries = false;\n let nextEntries = state.entries;\n\n const updateEntry = (\n cacheKey: string,\n updater: (\n entry: PreparedDatasetCacheEntry,\n ) => PreparedDatasetCacheEntry,\n ) => {\n const currentEntry = nextEntries[cacheKey];\n if (!currentEntry) {\n return;\n }\n\n if (!didChangeEntries) {\n nextEntries = {...nextEntries};\n didChangeEntries = true;\n }\n\n nextEntries[cacheKey] = updater(currentEntry);\n };\n\n for (const cacheKey of previousKeys) {\n if (nextKeys.has(cacheKey)) {\n continue;\n }\n\n updateEntry(cacheKey, (entry) => {\n const consumers = new Set(entry.consumers);\n consumers.delete(consumerId);\n return cloneEntryWithConsumers(entry, consumers);\n });\n }\n\n for (const cacheKey of nextKeys) {\n updateEntry(cacheKey, (entry) => {\n const consumers = new Set(entry.consumers);\n consumers.add(consumerId);\n return cloneEntryWithConsumers(entry, consumers);\n });\n }\n\n return {\n ...state,\n consumerKeys: {\n ...state.consumerKeys,\n [consumerId]: [...nextKeys],\n },\n entries: didChangeEntries\n ? evictLruEntries(nextEntries, maxEntries)\n : state.entries,\n };\n });\n },\n\n removeConsumer(consumerId) {\n const previousKeys = get().consumerKeys[consumerId];\n if (!previousKeys) {\n return;\n }\n\n set((state) => {\n let didChangeEntries = false;\n let nextEntries = state.entries;\n\n for (const cacheKey of previousKeys) {\n const entry = nextEntries[cacheKey];\n if (!entry) {\n continue;\n }\n\n const consumers = new Set(entry.consumers);\n consumers.delete(consumerId);\n\n if (!didChangeEntries) {\n nextEntries = {...nextEntries};\n didChangeEntries = true;\n }\n\n nextEntries[cacheKey] = cloneEntryWithConsumers(entry, consumers);\n }\n\n const nextConsumerKeys = {...state.consumerKeys};\n delete nextConsumerKeys[consumerId];\n\n return {\n ...state,\n consumerKeys: nextConsumerKeys,\n entries: didChangeEntries\n ? evictLruEntries(nextEntries, maxEntries)\n : state.entries,\n };\n });\n },\n\n syncDatasetsForConsumer({\n consumerId,\n datasets,\n executeSql,\n sqlSourceIdentity,\n }) {\n const descriptors = resolvePreparedDatasetDescriptors({\n datasets,\n sqlSourceIdentity,\n });\n const cacheKeys = descriptors\n .map((descriptor) => descriptor.cacheKey)\n .filter((cacheKey): cacheKey is string => Boolean(cacheKey));\n\n for (const descriptor of descriptors) {\n if (!descriptor.cacheKey) {\n continue;\n }\n\n get().ensureEntry({\n cacheKey: descriptor.cacheKey,\n datasetId: descriptor.datasetId,\n executeSql,\n input: descriptor.input,\n });\n }\n\n get().syncConsumer(consumerId, cacheKeys);\n },\n }));\n}\n\n/**\n * Resolve a shared prepared-store entry back into the dataset-state shape\n * consumed by `DeckJsonMap`.\n *\n * Prepared entries are shared by cache key, while `datasetId` stays a\n * view-level label used by layer binding and user-facing errors. When a shared\n * prepared entry is reused for a different dataset id, this helper remaps the\n * prepared payload so downstream callers still see the dataset id they asked\n * for.\n */\nexport function resolvePreparedDeckDatasetState(options: {\n datasetId: string;\n entry?: PreparedDatasetCacheEntry;\n}): PreparedDeckDatasetState {\n const {datasetId, entry} = options;\n\n if (!entry || entry.status === 'loading') {\n return {status: 'loading'};\n }\n\n if (entry.status === 'error') {\n return {status: 'error', error: entry.error};\n }\n\n return {\n status: 'ready',\n prepared:\n entry.prepared.datasetId === datasetId\n ? entry.prepared\n : {\n ...entry.prepared,\n datasetId,\n },\n };\n}\n\n/**\n * Resolve the full `datasetId -> state` map for a dataset registry.\n *\n * This mirrors the lookup logic used by `DeckJsonMap`: unresolved Arrow\n * datasets remain `loading`, while resolvable datasets reuse shared prepared\n * entries keyed by data identity rather than by dataset id.\n */\nexport function resolvePreparedDeckDatasetStates(options: {\n datasets: Record<string, DeckDatasetInput>;\n entries: Record<string, PreparedDatasetCacheEntry>;\n sqlSourceIdentity: object;\n}): Record<string, PreparedDeckDatasetState> {\n const {datasets, entries, sqlSourceIdentity} = options;\n\n return Object.fromEntries(\n resolvePreparedDatasetDescriptors({datasets, sqlSourceIdentity}).map(\n ({datasetId, cacheKey}) => [\n datasetId,\n resolvePreparedDeckDatasetState({\n datasetId,\n entry: cacheKey ? entries[cacheKey] : undefined,\n }),\n ],\n ),\n );\n}\n\n/**\n * Module-global prepared dataset cache shared by all `DeckJsonMap` instances.\n *\n * The cache stores only deck-specific prepared payloads, not raw query\n * results, and applies a small internal LRU policy so settled entries do not\n * grow without bound.\n */\nexport const preparedDatasetStore = createPreparedDatasetStore();\n"]}
1
+ {"version":3,"file":"PreparedDatasetStore.js","sourceRoot":"","sources":["../../src/datasets/PreparedDatasetStore.ts"],"names":[],"mappings":"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","sourcesContent":["import type {QueryHandle} from '@sqlrooms/duckdb';\nimport {createStore} from 'zustand/vanilla';\nimport {prepareDeckDataset} from '../prepare/prepareDeckDataset';\nimport {\n isSqlDatasetInput,\n isTableDatasetInput,\n type DeckDatasetInput,\n type PreparedDeckDatasetState,\n} from '../types';\nimport {\n DEFAULT_MAX_PREPARED_DATASET_ENTRIES,\n cloneEntryWithConsumers,\n evictLruEntries,\n nextAccessTimestamp,\n resolvePreparedDatasetCacheKey,\n} from './helpers';\nimport {resolveArrowTable} from './normalizeDatasets';\nimport {createDeckTableDatasetSql} from './tableDatasetSql';\nimport type {\n PreparedDatasetCacheEntry,\n PreparedDatasetStoreOptions,\n} from './types';\nimport {\n createDescribeDatasetSql,\n geometryColumnsNeedingWkbWrap,\n parseDescribeSqlColumns,\n wrapSqlGeometryColumnsAsWkb,\n} from './wrapGeometryAsWkb';\n\n/**\n * Internal store state for the prepared-dataset cache.\n *\n * `DeckJsonMap` never talks to this shape directly; `usePreparedDatasetStates`\n * uses it as the backing state machine for preparation, reuse, and eviction.\n */\ntype PreparedDatasetStoreState = {\n /**\n * Cache keys currently referenced by each hook consumer.\n *\n * This lets the store update consumer memberships incrementally when a map's\n * dataset registry changes, instead of resetting all cache state.\n */\n consumerKeys: Record<string, string[]>;\n /**\n * Prepared entries keyed by resolved dataset identity.\n *\n * Keys are based on query/table identity plus geometry options, not dataset\n * id, so the same prepared result can be reused across multiple maps or\n * differently named datasets that point at the same underlying data.\n */\n entries: Record<string, PreparedDatasetCacheEntry>;\n /**\n * Ensure a cache entry exists for the given dataset key.\n *\n * If an entry already exists, this is a no-op besides refreshing the\n * in-place LRU timestamp. Subscribers are not notified: a cache hit is not\n * a dataset change, and notifying would rebuild every mounted map's layers.\n */\n ensureEntry: (options: {\n cacheKey: string;\n datasetId: string;\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n input: DeckDatasetInput;\n }) => void;\n /**\n * Remove all subscriptions for one hook consumer.\n *\n * This is called when a `DeckJsonMap` instance unmounts so the store can\n * release the consumer's references and allow now-unreferenced entries to be\n * evicted later.\n */\n removeConsumer: (consumerId: string) => void;\n /**\n * Reconcile the set of cache keys referenced by one hook consumer.\n *\n * This adds the consumer to newly needed entries, removes it from entries no\n * longer needed, and preserves existing entries in place so unrelated dataset\n * states do not get reset during prop changes.\n */\n syncConsumer: (consumerId: string, keys: string[]) => void;\n /**\n * Reconcile and ensure all prepared entries needed by one dataset registry.\n *\n * This is the store-level orchestration entrypoint used by\n * `usePreparedDatasetStates`. It computes cache keys for the current dataset\n * registry, syncs consumer memberships, and eagerly ensures any resolvable\n * entries exist.\n */\n syncDatasetsForConsumer: (options: {\n consumerId: string;\n datasets: Record<string, DeckDatasetInput>;\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n sqlSourceIdentity: object;\n }) => void;\n};\n\ntype PreparedDatasetDescriptor = {\n datasetId: string;\n input: DeckDatasetInput;\n cacheKey: string | undefined;\n};\n\nfunction resolvePreparedDatasetDescriptors(options: {\n datasets: Record<string, DeckDatasetInput>;\n sqlSourceIdentity: object;\n}): PreparedDatasetDescriptor[] {\n const {datasets, sqlSourceIdentity} = options;\n\n return Object.entries(datasets).map(([datasetId, input]) => ({\n datasetId,\n input,\n cacheKey: resolvePreparedDatasetCacheKey({\n input,\n sqlSourceIdentity,\n }),\n }));\n}\n\n/**\n * Create a feature-local cache store for prepared deck datasets.\n *\n * The store is intentionally scoped to deck's preparation layer. It reuses the\n * expensive result of `prepareDeckDataset(...)` across consumers while leaving\n * raw query/result caching to the upstream data provider:\n *\n * - Mosaic handles cached query results through its coordinator/query manager\n * - DuckDB-backed SQL datasets still use the DuckDB slice execution path\n *\n * This keeps `@sqlrooms/deck` independent from either provider while still\n * avoiding repeated geometry decoding and GeoArrow/GeoJSON shaping work.\n */\nexport function createPreparedDatasetStore(\n options: PreparedDatasetStoreOptions = {},\n) {\n const {\n maxEntries = DEFAULT_MAX_PREPARED_DATASET_ENTRIES,\n prepareDataset = prepareDeckDataset,\n } = options;\n\n return createStore<PreparedDatasetStoreState>((set, get) => ({\n consumerKeys: {},\n entries: {},\n\n ensureEntry({cacheKey, datasetId, executeSql, input}) {\n const existing = get().entries[cacheKey];\n if (existing) {\n if (existing.status !== 'loading') {\n // Mutate the timestamp in place so LRU still works without replacing\n // `entries` and forcing every DeckJsonMap to reconvert layers.\n existing.lastAccessedAt = nextAccessTimestamp();\n }\n return;\n }\n\n const promise = Promise.resolve().then(async () => {\n try {\n let table = resolveArrowTable(input);\n let geometryEncodingHint = input.geometryEncodingHint;\n if (\n !table &&\n (isSqlDatasetInput(input) || isTableDatasetInput(input))\n ) {\n const baseSql = isSqlDatasetInput(input)\n ? input.sqlQuery\n : createDeckTableDatasetSql(input);\n\n // Probe DuckDB logical types and project native GEOMETRY columns\n // through ST_AsWKB so prepare/decode never sees undecodable blobs.\n // Authored SQL is left intact — the wrap is a pipeline outer query.\n let sql = baseSql;\n try {\n const describeHandle = await executeSql(\n createDescribeDatasetSql(baseSql),\n );\n if (describeHandle) {\n const describeTable = await describeHandle;\n const geometryColumns = geometryColumnsNeedingWkbWrap(\n parseDescribeSqlColumns(describeTable),\n );\n const wrapped = wrapSqlGeometryColumnsAsWkb(\n baseSql,\n geometryColumns,\n );\n if (wrapped) {\n sql = wrapped;\n // Only force the dataset-level hint to WKB when the configured\n // geometry column was among the wrapped columns (or unset).\n // An unrelated native GEOMETRY column must not make a WKT /\n // GeoArrow geometryColumn decode as WKB.\n const resolvedGeom = input.geometryColumn;\n if (!resolvedGeom || geometryColumns.includes(resolvedGeom)) {\n geometryEncodingHint = 'wkb';\n }\n }\n }\n } catch {\n // If DESCRIBE fails (e.g. missing spatial), fall through to the\n // original SQL — prepare still surfaces decode errors.\n }\n\n const queryHandle = await executeSql(sql);\n if (!queryHandle) {\n throw new Error(\n `Query for dataset \"${datasetId}\" was cancelled.`,\n );\n }\n\n table = await queryHandle;\n }\n\n if (!table) {\n return;\n }\n\n const prepared = prepareDataset({\n datasetId,\n table,\n geometryColumn: input.geometryColumn,\n geometryEncodingHint,\n });\n\n set((state) => ({\n ...state,\n entries: evictLruEntries(\n {\n ...state.entries,\n [cacheKey]: {\n status: 'ready',\n prepared,\n consumers:\n state.entries[cacheKey]?.consumers ?? new Set<string>(),\n lastAccessedAt: nextAccessTimestamp(),\n },\n },\n maxEntries,\n ),\n }));\n } catch (error) {\n set((state) => ({\n ...state,\n entries: evictLruEntries(\n {\n ...state.entries,\n [cacheKey]: {\n status: 'error',\n error:\n error instanceof Error ? error : new Error(String(error)),\n consumers:\n state.entries[cacheKey]?.consumers ?? new Set<string>(),\n lastAccessedAt: nextAccessTimestamp(),\n },\n },\n maxEntries,\n ),\n }));\n }\n });\n\n set((state) => ({\n ...state,\n entries: {\n ...state.entries,\n [cacheKey]: {\n status: 'loading',\n promise,\n consumers: state.entries[cacheKey]?.consumers ?? new Set<string>(),\n lastAccessedAt: nextAccessTimestamp(),\n },\n },\n }));\n },\n\n syncConsumer(consumerId, keys) {\n const previousKeys = new Set(get().consumerKeys[consumerId] ?? []);\n const nextKeys = new Set(keys);\n\n set((state) => {\n let didChangeEntries = false;\n let nextEntries = state.entries;\n\n const updateEntry = (\n cacheKey: string,\n updater: (\n entry: PreparedDatasetCacheEntry,\n ) => PreparedDatasetCacheEntry,\n ) => {\n const currentEntry = nextEntries[cacheKey];\n if (!currentEntry) {\n return;\n }\n\n if (!didChangeEntries) {\n nextEntries = {...nextEntries};\n didChangeEntries = true;\n }\n\n nextEntries[cacheKey] = updater(currentEntry);\n };\n\n for (const cacheKey of previousKeys) {\n if (nextKeys.has(cacheKey)) {\n continue;\n }\n\n updateEntry(cacheKey, (entry) => {\n const consumers = new Set(entry.consumers);\n consumers.delete(consumerId);\n return cloneEntryWithConsumers(entry, consumers);\n });\n }\n\n for (const cacheKey of nextKeys) {\n updateEntry(cacheKey, (entry) => {\n const consumers = new Set(entry.consumers);\n consumers.add(consumerId);\n return cloneEntryWithConsumers(entry, consumers);\n });\n }\n\n return {\n ...state,\n consumerKeys: {\n ...state.consumerKeys,\n [consumerId]: [...nextKeys],\n },\n entries: didChangeEntries\n ? evictLruEntries(nextEntries, maxEntries)\n : state.entries,\n };\n });\n },\n\n removeConsumer(consumerId) {\n const previousKeys = get().consumerKeys[consumerId];\n if (!previousKeys) {\n return;\n }\n\n set((state) => {\n let didChangeEntries = false;\n let nextEntries = state.entries;\n\n for (const cacheKey of previousKeys) {\n const entry = nextEntries[cacheKey];\n if (!entry) {\n continue;\n }\n\n const consumers = new Set(entry.consumers);\n consumers.delete(consumerId);\n\n if (!didChangeEntries) {\n nextEntries = {...nextEntries};\n didChangeEntries = true;\n }\n\n nextEntries[cacheKey] = cloneEntryWithConsumers(entry, consumers);\n }\n\n const nextConsumerKeys = {...state.consumerKeys};\n delete nextConsumerKeys[consumerId];\n\n return {\n ...state,\n consumerKeys: nextConsumerKeys,\n entries: didChangeEntries\n ? evictLruEntries(nextEntries, maxEntries)\n : state.entries,\n };\n });\n },\n\n syncDatasetsForConsumer({\n consumerId,\n datasets,\n executeSql,\n sqlSourceIdentity,\n }) {\n const descriptors = resolvePreparedDatasetDescriptors({\n datasets,\n sqlSourceIdentity,\n });\n const cacheKeys = descriptors\n .map((descriptor) => descriptor.cacheKey)\n .filter((cacheKey): cacheKey is string => Boolean(cacheKey));\n\n for (const descriptor of descriptors) {\n if (!descriptor.cacheKey) {\n continue;\n }\n\n get().ensureEntry({\n cacheKey: descriptor.cacheKey,\n datasetId: descriptor.datasetId,\n executeSql,\n input: descriptor.input,\n });\n }\n\n get().syncConsumer(consumerId, cacheKeys);\n },\n }));\n}\n\n/**\n * Resolve a shared prepared-store entry back into the dataset-state shape\n * consumed by `DeckJsonMap`.\n *\n * Prepared entries are shared by cache key, while `datasetId` stays a\n * view-level label used by layer binding and user-facing errors. When a shared\n * prepared entry is reused for a different dataset id, this helper remaps the\n * prepared payload so downstream callers still see the dataset id they asked\n * for.\n */\nexport function resolvePreparedDeckDatasetState(options: {\n datasetId: string;\n entry?: PreparedDatasetCacheEntry;\n}): PreparedDeckDatasetState {\n const {datasetId, entry} = options;\n\n if (!entry || entry.status === 'loading') {\n return {status: 'loading'};\n }\n\n if (entry.status === 'error') {\n return {status: 'error', error: entry.error};\n }\n\n return {\n status: 'ready',\n prepared:\n entry.prepared.datasetId === datasetId\n ? entry.prepared\n : {\n ...entry.prepared,\n datasetId,\n },\n };\n}\n\n/**\n * Resolve the full `datasetId -> state` map for a dataset registry.\n *\n * This mirrors the lookup logic used by `DeckJsonMap`: unresolved Arrow\n * datasets remain `loading`, while resolvable datasets reuse shared prepared\n * entries keyed by data identity rather than by dataset id.\n */\nexport function resolvePreparedDeckDatasetStates(options: {\n datasets: Record<string, DeckDatasetInput>;\n entries: Record<string, PreparedDatasetCacheEntry>;\n sqlSourceIdentity: object;\n}): Record<string, PreparedDeckDatasetState> {\n const {datasets, entries, sqlSourceIdentity} = options;\n\n return Object.fromEntries(\n resolvePreparedDatasetDescriptors({datasets, sqlSourceIdentity}).map(\n ({datasetId, cacheKey}) => [\n datasetId,\n resolvePreparedDeckDatasetState({\n datasetId,\n entry: cacheKey ? entries[cacheKey] : undefined,\n }),\n ],\n ),\n );\n}\n\n/**\n * Module-global prepared dataset cache shared by all `DeckJsonMap` instances.\n *\n * The cache stores only deck-specific prepared payloads, not raw query\n * results, and applies a small internal LRU policy so settled entries do not\n * grow without bound.\n */\nexport const preparedDatasetStore = createPreparedDatasetStore();\n"]}
@@ -1,5 +1,5 @@
1
1
  import type * as arrow from 'apache-arrow';
2
- import { type DeckDatasetInput } from '../types';
2
+ import { type DeckDatasetInput, type PreparedDeckDatasetState } from '../types';
3
3
  import type { PreparedDatasetCacheEntry } from './types';
4
4
  export declare const DEFAULT_MAX_PREPARED_DATASET_ENTRIES = 20;
5
5
  /** Return a monotonic access timestamp used by the prepared-dataset LRU. */
@@ -19,7 +19,44 @@ export declare function getTableIdentity(table: arrow.Table): string;
19
19
  * prepared results across different database instances.
20
20
  */
21
21
  export declare function getSqlSourceIdentity(sqlSourceIdentity: object): string;
22
- export declare function buildGeometryKey(input: DeckDatasetInput): string;
22
+ export declare function buildGeometryKey(options: {
23
+ geometryColumn?: string;
24
+ geometryEncodingHint?: string;
25
+ }): string;
26
+ /**
27
+ * Content identity for one dataset input, ignoring object-wrapper identity.
28
+ *
29
+ * Spec-only updates (slider opacity, radius, etc.) often recreate
30
+ * `{ tableName, transformSql }` literals even though the query did not change.
31
+ */
32
+ export declare function getDatasetInputFingerprint(input: DeckDatasetInput): string;
33
+ /** Sorted content identity for a dataset registry. */
34
+ export declare function getDatasetRegistryFingerprint(datasets: Record<string, DeckDatasetInput>): string;
35
+ /**
36
+ * Content equality for one dataset input, ignoring object-wrapper identity.
37
+ *
38
+ * Implemented via {@link getDatasetInputFingerprint} so normalization stays
39
+ * identical to the fingerprint path (`''` vs `undefined`, pending Arrow, etc.).
40
+ * A hand-rolled field compare previously treated those differently and caused
41
+ * `useStableDatasets` to churn, which desynced MapLibre from deck layers.
42
+ */
43
+ export declare function areDatasetInputsEqual(left: DeckDatasetInput, right: DeckDatasetInput): boolean;
44
+ /**
45
+ * Content equality for a dataset registry, ignoring object-wrapper identity.
46
+ *
47
+ * Prefer this at call sites that want a boolean compare; it is fingerprint-
48
+ * backed so behavior matches {@link getDatasetRegistryFingerprint}.
49
+ */
50
+ export declare function areDatasetRegistriesEqual(left: Record<string, DeckDatasetInput>, right: Record<string, DeckDatasetInput>): boolean;
51
+ /**
52
+ * Identity of prepared dataset *payloads*, not the wrapper object.
53
+ *
54
+ * Used so JSONConverter is not rebuilt when a new `datasetStates` record
55
+ * points at the same prepared tables. Geometry column and encoding are part
56
+ * of the identity so two cache entries that share an Arrow table but were
57
+ * prepared with different geometry options do not look interchangeable.
58
+ */
59
+ export declare function getPreparedDatasetStatesIdentity(datasetStates: Record<string, PreparedDeckDatasetState>): string;
23
60
  /**
24
61
  * Build the canonical cache key for one dataset input.
25
62
  *
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/datasets/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,oCAAoC,KAAK,CAAC;AASvD,4EAA4E;AAC5E,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAU3D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAUtE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAEhE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,KAAK,EAAE,gBAAgB,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,GAAG,SAAS,CAoCrB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,yBAAyB,EAChC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,yBAAyB,CA2B3B;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CACxB,KAAK,EAAE,yBAAyB,GAC/B,yBAAyB,CAE3B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAClD,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CA8B3C"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/datasets/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC9B,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,oCAAoC,KAAK,CAAC;AASvD,4EAA4E;AAC5E,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAU3D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAUtE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,MAAM,CAET;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAY1E;AAED,sDAAsD;AACtD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACzC,MAAM,CAQR;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAKT;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACtC,OAAO,CAOT;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC9C,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GACtD,MAAM,CAsBR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,KAAK,EAAE,gBAAgB,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,GAAG,SAAS,CAoCrB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,yBAAyB,EAChC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,yBAAyB,CA2B3B;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CACxB,KAAK,EAAE,yBAAyB,GAC/B,yBAAyB,CAE3B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAClD,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CA8B3C"}