@sqlrooms/deck 0.29.0-rc.10 → 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.
- package/README.md +88 -16
- package/dist/BlockMapSettings.d.ts.map +1 -1
- package/dist/BlockMapSettings.js +4 -16
- package/dist/BlockMapSettings.js.map +1 -1
- package/dist/DashboardMapSettings.d.ts.map +1 -1
- package/dist/DashboardMapSettings.js +7 -10
- package/dist/DashboardMapSettings.js.map +1 -1
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +20 -18
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +916 -53
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +9 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.d.ts +3 -4
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.js +13 -7
- package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
- package/dist/DeckMapSurface.d.ts +1 -1
- package/dist/DeckMapSurface.js +1 -1
- package/dist/DeckMapSurface.js.map +1 -1
- package/dist/MapSettings.d.ts +14 -0
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +555 -186
- package/dist/MapSettings.js.map +1 -1
- package/dist/MapSettingsControls.d.ts +8 -1
- package/dist/MapSettingsControls.d.ts.map +1 -1
- package/dist/MapSettingsControls.js +24 -2
- package/dist/MapSettingsControls.js.map +1 -1
- package/dist/ai.d.ts +19 -5
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +63 -112
- package/dist/ai.js.map +1 -1
- package/dist/aiNormalize.d.ts +31 -0
- package/dist/aiNormalize.d.ts.map +1 -0
- package/dist/aiNormalize.js +630 -0
- package/dist/aiNormalize.js.map +1 -0
- package/dist/block.d.ts +1 -1
- package/dist/block.d.ts.map +1 -1
- package/dist/block.js +1 -1
- package/dist/block.js.map +1 -1
- package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
- package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
- package/dist/createOrUpdateDeckMapResource.js +57 -4
- package/dist/createOrUpdateDeckMapResource.js.map +1 -1
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +72 -8
- package/dist/dashboard.js.map +1 -1
- package/dist/dashboardConfig.d.ts +10 -1
- package/dist/dashboardConfig.d.ts.map +1 -1
- package/dist/dashboardConfig.js +55 -22
- package/dist/dashboardConfig.js.map +1 -1
- package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
- package/dist/datasets/PreparedDatasetStore.js +35 -10
- package/dist/datasets/PreparedDatasetStore.js.map +1 -1
- package/dist/datasets/helpers.d.ts +39 -2
- package/dist/datasets/helpers.d.ts.map +1 -1
- package/dist/datasets/helpers.js +86 -3
- package/dist/datasets/helpers.js.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.js +12 -8
- package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
- package/dist/datasets/wrapGeometryAsWkb.d.ts +20 -0
- package/dist/datasets/wrapGeometryAsWkb.d.ts.map +1 -0
- package/dist/datasets/wrapGeometryAsWkb.js +65 -0
- package/dist/datasets/wrapGeometryAsWkb.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/json/colorScaleFunction.d.ts +12 -4
- package/dist/json/colorScaleFunction.d.ts.map +1 -1
- package/dist/json/colorScaleFunction.js.map +1 -1
- package/dist/json/compileColorScale.d.ts +3 -2
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +16 -1
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/compileGeoArrowAccessor.d.ts +5 -0
- package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
- package/dist/json/compileGeoArrowAccessor.js +17 -3
- package/dist/json/compileGeoArrowAccessor.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +278 -151
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +3 -3
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +43 -14
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/heatmapDefaults.d.ts +17 -7
- package/dist/json/heatmapDefaults.d.ts.map +1 -1
- package/dist/json/heatmapDefaults.js +54 -12
- package/dist/json/heatmapDefaults.js.map +1 -1
- package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -1
- package/dist/json/layers/DeckH3HexagonLayer.js +9 -14
- package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -1
- package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
- package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckHeatmapLayer.js +69 -0
- package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
- package/dist/json/layers/h3IndexFormat.d.ts +6 -0
- package/dist/json/layers/h3IndexFormat.d.ts.map +1 -0
- package/dist/json/layers/h3IndexFormat.js +17 -0
- package/dist/json/layers/h3IndexFormat.js.map +1 -0
- package/dist/json/layers/index.d.ts +2 -0
- package/dist/json/layers/index.d.ts.map +1 -1
- package/dist/json/layers/index.js +2 -0
- package/dist/json/layers/index.js.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +22 -5
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/json/scaleFunction.d.ts +27 -0
- package/dist/json/scaleFunction.d.ts.map +1 -0
- package/dist/json/scaleFunction.js +151 -0
- package/dist/json/scaleFunction.js.map +1 -0
- package/dist/mapAiConfig.d.ts +8 -0
- package/dist/mapAiConfig.d.ts.map +1 -1
- package/dist/mapAiConfig.js +9 -1
- package/dist/mapAiConfig.js.map +1 -1
- package/dist/mapAiSharedInstructions.d.ts +3 -0
- package/dist/mapAiSharedInstructions.d.ts.map +1 -0
- package/dist/mapAiSharedInstructions.js +16 -0
- package/dist/mapAiSharedInstructions.js.map +1 -0
- package/dist/mapConfig.d.ts +7 -1
- package/dist/mapConfig.d.ts.map +1 -1
- package/dist/mapConfig.js.map +1 -1
- package/dist/mapConfigUtils.d.ts +22 -0
- package/dist/mapConfigUtils.d.ts.map +1 -1
- package/dist/mapConfigUtils.js +147 -3
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapFit.d.ts +16 -0
- package/dist/mapFit.d.ts.map +1 -1
- package/dist/mapFit.js +208 -30
- package/dist/mapFit.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +64 -1
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +277 -16
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/mapResourceAuthoring.d.ts +3 -1
- package/dist/mapResourceAuthoring.d.ts.map +1 -1
- package/dist/mapResourceAuthoring.js +413 -20
- package/dist/mapResourceAuthoring.js.map +1 -1
- package/dist/mosaic.d.ts +1 -1
- package/dist/mosaic.d.ts.map +1 -1
- package/dist/mosaic.js.map +1 -1
- package/dist/prepare/geoarrow.js.map +1 -1
- package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
- package/dist/prepare/prepareDeckDataset.js +1 -0
- package/dist/prepare/prepareDeckDataset.js.map +1 -1
- package/dist/prepare/types.d.ts +3 -0
- package/dist/prepare/types.d.ts.map +1 -1
- package/dist/prepare/types.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts +10 -0
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +141 -20
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +9 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +22 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/selectStarAsWkbCollision.d.ts +3 -0
- package/dist/selectStarAsWkbCollision.d.ts.map +1 -0
- package/dist/selectStarAsWkbCollision.js +78 -0
- package/dist/selectStarAsWkbCollision.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useDeckMapFitToBounds.d.ts.map +1 -1
- package/dist/useDeckMapFitToBounds.js +1 -1
- package/dist/useDeckMapFitToBounds.js.map +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapResourceAuthoring.js","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"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","sourcesContent":["import {DeckJsonMapSpec} from './DeckJsonMapSpec';\nimport type {DeckMapConfig} from './mapConfig';\nimport {\n isDeckMapSqlDatasetSource,\n isDeckMapTableDatasetSource,\n} from './mapConfig';\n\nexport type DeckMapResourceConfigIssue = {\n path: string;\n message: string;\n};\n\nexport type DeckMapResourceConfigValidationOptions = {\n /** Empty resources are valid while waiting for a user-selected table. */\n allowEmpty?: boolean;\n};\n\n/** Controls how an incoming map config patch is merged with durable state. */\nexport type DeckMapResourceConfigMergeOptions = {\n /** Treat an incoming `spec.layers` array as the complete replacement list. */\n replaceLayers?: boolean;\n /** Treat incoming `datasets` as the complete replacement registry. */\n replaceDatasets?: boolean;\n};\n\n/** Error raised before an invalid map resource can be durably written. */\nexport class DeckMapResourceConfigError extends Error {\n readonly issues: DeckMapResourceConfigIssue[];\n\n constructor(issues: DeckMapResourceConfigIssue[]) {\n super(\n `Invalid Deck map resource config: ${issues\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ')}`,\n );\n this.name = 'DeckMapResourceConfigError';\n this.issues = issues;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction hasEntries(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && Object.keys(value).length > 0;\n}\n\nfunction mergeOptionalRecord(\n existing: unknown,\n incoming: unknown,\n): Record<string, unknown> | undefined {\n if (isRecord(existing) && isRecord(incoming)) {\n return {...existing, ...incoming};\n }\n if (isRecord(incoming)) return incoming;\n return isRecord(existing) ? existing : undefined;\n}\n\nfunction mergeLayerPatch(existingLayer: unknown, incomingLayer: unknown) {\n if (!isRecord(existingLayer) || !isRecord(incomingLayer)) {\n return incomingLayer;\n }\n return {\n ...existingLayer,\n ...incomingLayer,\n _sqlroomsBinding: mergeOptionalRecord(\n existingLayer._sqlroomsBinding,\n incomingLayer._sqlroomsBinding,\n ),\n };\n}\n\nfunction mergeLayerPatches(\n existingLayers: unknown[] | undefined,\n incomingLayers: unknown[] | undefined,\n) {\n if (!incomingLayers || incomingLayers.length === 0) return existingLayers;\n if (!existingLayers || existingLayers.length === 0) return incomingLayers;\n\n const nextLayers = [...existingLayers];\n for (const [incomingIndex, incomingLayer] of incomingLayers.entries()) {\n const incomingId = isRecord(incomingLayer)\n ? (incomingLayer.id as string | undefined)\n : undefined;\n const existingIndex = incomingId\n ? existingLayers.findIndex(\n (layer) => isRecord(layer) && layer.id === incomingId,\n )\n : incomingIndex < existingLayers.length\n ? incomingIndex\n : -1;\n if (existingIndex >= 0) {\n nextLayers[existingIndex] = mergeLayerPatch(\n existingLayers[existingIndex],\n incomingLayer,\n );\n } else {\n nextLayers.push(incomingLayer);\n }\n }\n return nextLayers;\n}\n\nfunction mergeSpecPatch(\n existingSpec: unknown,\n incomingSpec: unknown,\n options: DeckMapResourceConfigMergeOptions,\n) {\n if (typeof incomingSpec === 'string') return incomingSpec;\n const existing = isRecord(existingSpec) ? existingSpec : undefined;\n const incoming = isRecord(incomingSpec) ? incomingSpec : undefined;\n if (!existing && !incoming) return incomingSpec ?? existingSpec;\n\n const existingLayers = Array.isArray(existing?.layers)\n ? existing.layers\n : undefined;\n const incomingLayers = Array.isArray(incoming?.layers)\n ? incoming.layers\n : undefined;\n const layers =\n options.replaceLayers && incomingLayers !== undefined\n ? incomingLayers\n : mergeLayerPatches(existingLayers, incomingLayers);\n return {\n ...(existing ?? {}),\n ...(incoming ?? {}),\n ...(layers ? {layers} : {}),\n };\n}\n\nfunction mergeDatasetRegistry(\n existingDatasets: DeckMapConfig['datasets'],\n incomingDatasets: DeckMapConfig['datasets'],\n replaceDatasets: boolean,\n): DeckMapConfig['datasets'] {\n if (replaceDatasets) return incomingDatasets;\n if (!hasEntries(incomingDatasets)) return existingDatasets;\n const datasets = {...existingDatasets};\n for (const [datasetId, incomingDataset] of Object.entries(incomingDatasets)) {\n const existingDataset = existingDatasets[datasetId];\n datasets[datasetId] = existingDataset\n ? {\n ...existingDataset,\n ...incomingDataset,\n source: incomingDataset.source ?? existingDataset.source,\n }\n : incomingDataset;\n }\n return datasets;\n}\n\n/**\n * Merges a sparse map-tool patch with durable state. Empty dataset registries\n * and layer arrays mean \"preserve\" only when an existing resource is present.\n */\nexport function mergeDeckMapResourceConfigPatch(\n existingConfig: DeckMapConfig | undefined,\n incomingConfig: DeckMapConfig,\n options: DeckMapResourceConfigMergeOptions = {},\n): DeckMapConfig {\n if (!existingConfig) return incomingConfig;\n return {\n ...existingConfig,\n ...incomingConfig,\n spec: mergeSpecPatch(existingConfig.spec, incomingConfig.spec, options),\n datasets: mergeDatasetRegistry(\n existingConfig.datasets,\n incomingConfig.datasets,\n options.replaceDatasets === true,\n ),\n mapProps: mergeOptionalRecord(\n existingConfig.mapProps,\n incomingConfig.mapProps,\n ),\n dataPolicy: mergeOptionalRecord(\n existingConfig.dataPolicy,\n incomingConfig.dataPolicy,\n ),\n } as DeckMapConfig;\n}\n\nfunction parseSpec(config: DeckMapConfig): {\n layers: Record<string, unknown>[];\n issues: DeckMapResourceConfigIssue[];\n} {\n let spec: unknown = config.spec;\n if (typeof spec === 'string') {\n try {\n spec = JSON.parse(spec);\n } catch {\n return {\n layers: [],\n issues: [{path: 'spec', message: 'must be valid JSON'}],\n };\n }\n }\n\n const parsed = DeckJsonMapSpec.safeParse(spec);\n if (!parsed.success) {\n return {\n layers: [],\n issues: parsed.error.issues.map((issue) => ({\n path: ['spec', ...issue.path].join('.'),\n message: issue.message,\n })),\n };\n }\n\n return {\n layers: (parsed.data.layers ?? []) as Record<string, unknown>[],\n issues: [],\n };\n}\n\n/**\n * Validates the post-merge invariants of a renderable, resource-native map.\n * Patch inputs may be sparse, but the durable result must have supported\n * dataset sources and dataset-backed layers.\n */\nexport function getDeckMapResourceConfigIssues(\n config: DeckMapConfig,\n options: DeckMapResourceConfigValidationOptions = {},\n): DeckMapResourceConfigIssue[] {\n const issues: DeckMapResourceConfigIssue[] = [];\n const datasetEntries = Object.entries(config.datasets);\n const datasetIds = datasetEntries.map(([datasetId]) => datasetId);\n const datasetIdSet = new Set(datasetIds);\n const parsedSpec = parseSpec(config);\n issues.push(...parsedSpec.issues);\n\n const isEmpty = datasetEntries.length === 0 && parsedSpec.layers.length === 0;\n if (isEmpty) {\n return options.allowEmpty\n ? issues\n : [\n ...issues,\n {\n path: 'datasets',\n message: 'must contain at least one dataset for a map write',\n },\n {\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n },\n ];\n }\n\n if (datasetEntries.length === 0) {\n issues.push({\n path: 'datasets',\n message: 'must contain at least one dataset',\n });\n }\n\n for (const [datasetId, dataset] of datasetEntries) {\n const source = dataset.source;\n const hasSqlSource =\n isDeckMapSqlDatasetSource(source) && source.sqlQuery.trim().length > 0;\n const hasTableSource =\n isDeckMapTableDatasetSource(source) && source.tableName.trim().length > 0;\n if (!hasSqlSource && !hasTableSource) {\n const legacySql = (dataset as unknown as Record<string, unknown>).sql;\n issues.push({\n path: `datasets.${datasetId}.source`,\n message:\n typeof legacySql === 'string'\n ? 'must define source.tableName or source.sqlQuery; top-level sql is not supported'\n : 'must define source.tableName or source.sqlQuery',\n });\n }\n }\n\n if (parsedSpec.layers.length === 0) {\n issues.push({\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n });\n }\n\n parsedSpec.layers.forEach((layer, index) => {\n const layerType = layer['@@type'];\n if (typeof layerType !== 'string' || layerType.trim().length === 0) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: 'must name a Deck JSON layer class',\n });\n }\n\n const binding =\n layer._sqlroomsBinding && typeof layer._sqlroomsBinding === 'object'\n ? (layer._sqlroomsBinding as Record<string, unknown>)\n : undefined;\n const boundDataset =\n typeof binding?.dataset === 'string' && binding.dataset.trim()\n ? binding.dataset\n : undefined;\n\n if (boundDataset) {\n if (!datasetIdSet.has(boundDataset)) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message: `references unknown dataset \"${boundDataset}\"`,\n });\n }\n return;\n }\n\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message:\n 'must bind the layer to a config.datasets entry; layer data references and implicit bindings are not durable resource bindings',\n });\n });\n\n const fitDataset = config.fitToData?.dataset;\n if (fitDataset && !datasetIdSet.has(fitDataset)) {\n issues.push({\n path: 'fitToData.dataset',\n message: `references unknown dataset \"${fitDataset}\"`,\n });\n }\n\n return issues;\n}\n\n/** Rejects invalid durable map writes after sparse patches have been merged. */\nexport function assertDeckMapResourceConfig(config: DeckMapConfig): void {\n const issues = getDeckMapResourceConfigIssues(config);\n if (issues.length > 0) throw new DeckMapResourceConfigError(issues);\n}\n\n/**\n * Returns the package-owned authoring contract for hosts with direct worksheet\n * map capability. Host adapters opt into it; they do not maintain prompt copies.\n */\nexport function getDeckMapResourceAiInstructions(): string {\n return `## Direct worksheet Deck map resources\n\nWhen authoring a worksheet map config, use the resource-native Deck JSON contract:\n- A new map must contain at least one config.datasets entry and at least one spec.layers entry.\n- Every dataset must define source.tableName, source.tableName plus source.transformSql, or source.sqlQuery. Never put sql directly on the dataset object.\n- Bind every layer to a dataset with _sqlroomsBinding.dataset. Never use data: \"@@#datasetId\" or an implicit single-dataset binding as a durable resource binding.\n- Use supported Deck JSON layer classes such as GeoArrowScatterplotLayer, GeoArrowHeatmapLayer, GeoArrowPolygonLayer, GeoArrowPathLayer, GeoArrowTripsLayer, GeoArrowArcLayer, GeoArrowColumnLayer, GeoArrowH3HexagonLayer, or GeoJsonLayer.\n- For table-backed datasets, also pass the same table through the tool's top-level tableName field. A selected table does not replace the required dataset source.\n- transformSql must be a single SELECT and must read from __sqlrooms_source. Use source.sqlQuery only for a standalone pinned query.\n- Use configMode \"basic\" for a straightforward single-layer map. Use \"custom\" only for advanced properties the basic settings cannot represent; custom mode does not relax dataset-source or layer-binding requirements.\n- For a point geometry column, prefer GeoArrowScatterplotLayer with dataset.geometryColumn and _sqlroomsBinding.geometryColumn set to the exact geometry column. For longitude/latitude columns, use source.transformSql to produce WKB geometry and bind that output column.\n- For updates, sparse config patches are allowed because they are merged with the existing resource. For creates, never send empty datasets or layers.\n- To remove existing layers or datasets, set replaceLayers and/or replaceDatasets to true and send the complete desired list or registry. Omit them for additive sparse updates.\n- If a map write reports an invalid resource config, repair the reported paths and retry the same direct map operation; do not replace it with a dashboard-backed map.\n\nMinimal table-backed point map shape:\n{\"configMode\":\"basic\",\"datasets\":{\"places\":{\"source\":{\"tableName\":\"places\"},\"geometryColumn\":\"geom\",\"geometryEncodingHint\":\"wkb\"}},\"spec\":{\"layers\":[{\"@@type\":\"GeoArrowScatterplotLayer\",\"id\":\"places\",\"_sqlroomsBinding\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"},\"getRadius\":4,\"radiusUnits\":\"pixels\",\"pickable\":true}]},\"fitToData\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"}}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mapResourceAuthoring.js","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n binnedNumericSchemes,\n categoricalSchemes,\n continuousDivergingSchemes,\n continuousSequentialSchemes,\n formatColorSchemePromptLists,\n} from '@sqlrooms/color-scales/colorSchemeNames';\nimport {DeckJsonMapSpec} from './DeckJsonMapSpec';\nimport type {DeckMapConfig, DeckMapDatasetSource} from './mapConfig';\nimport {\n isDeckMapSqlDatasetSource,\n isDeckMapTableDatasetSource,\n} from './mapConfig';\nimport {hasSelectStarAsWkbCollision} from './selectStarAsWkbCollision';\nimport {getDeckMapSharedAiContractRules} from './mapAiSharedInstructions';\nimport {DECK_MAP_LAYER_TYPE_OPTIONS} from './mapLayerConfigUtils';\n\nexport type DeckMapResourceConfigIssue = {\n path: string;\n message: string;\n};\n\nexport type DeckMapResourceConfigValidationOptions = {\n /** Empty resources are valid while waiting for a user-selected table. */\n allowEmpty?: boolean;\n};\n\n/** Controls how an incoming map config patch is merged with durable state. */\nexport type DeckMapResourceConfigMergeOptions = {\n /** Treat an incoming `spec.layers` array as the complete replacement list. */\n replaceLayers?: boolean;\n /** Treat incoming `datasets` as the complete replacement registry. */\n replaceDatasets?: boolean;\n};\n\n/** Error raised before an invalid map resource can be durably written. */\nexport class DeckMapResourceConfigError extends Error {\n readonly issues: DeckMapResourceConfigIssue[];\n\n constructor(issues: DeckMapResourceConfigIssue[]) {\n super(\n `Invalid Deck map resource config: ${issues\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ')}`,\n );\n this.name = 'DeckMapResourceConfigError';\n this.issues = issues;\n }\n}\n\nconst BINNED_SCHEME_NAMES = new Set<string>(binnedNumericSchemes);\nconst SEQUENTIAL_SCHEME_NAMES = new Set<string>(continuousSequentialSchemes);\nconst DIVERGING_SCHEME_NAMES = new Set<string>(continuousDivergingSchemes);\nconst CATEGORICAL_SCHEME_NAMES = new Set<string>(categoricalSchemes);\n\n/** Issue when colorScale `type` and `scheme` disagree or are incomplete. */\nexport function getColorScaleTypeSchemeIssue(\n type: unknown,\n scheme: unknown,\n): string | undefined {\n if (typeof type !== 'string' || !type.trim()) {\n return 'colorScale requires a \"type\" (sequential, diverging, quantize, quantile, threshold, or categorical)';\n }\n if (typeof scheme !== 'string' || !scheme.trim()) {\n return 'colorScale requires a \"scheme\" (exact name such as Viridis, YlOrRd, Blues, or Tableau10)';\n }\n if (type !== type.trim()) {\n return 'colorScale type must not have leading or trailing whitespace';\n }\n if (scheme !== scheme.trim()) {\n return 'colorScale scheme must not have leading or trailing whitespace';\n }\n\n const scaleType = type;\n const schemeName = scheme;\n\n const allowedForType = (allowed: Set<string>, label: string) => {\n if (allowed.has(schemeName)) return undefined;\n if (SEQUENTIAL_SCHEME_NAMES.has(schemeName)) {\n return `scheme \"${schemeName}\" requires type \"sequential\" (not \"${scaleType}\") — use type \"sequential\", or pick a ${label}`;\n }\n if (DIVERGING_SCHEME_NAMES.has(schemeName)) {\n return `scheme \"${schemeName}\" requires type \"diverging\" (not \"${scaleType}\") — use type \"diverging\", or pick a ${label}`;\n }\n if (CATEGORICAL_SCHEME_NAMES.has(schemeName)) {\n return `scheme \"${schemeName}\" requires type \"categorical\" (not \"${scaleType}\") — use type \"categorical\", or pick a ${label}`;\n }\n return `scheme \"${schemeName}\" is not valid for type \"${scaleType}\" — use a ${label}`;\n };\n\n switch (scaleType) {\n case 'quantile':\n case 'quantize':\n case 'threshold':\n return allowedForType(\n BINNED_SCHEME_NAMES,\n 'ColorBrewer binned ramp such as YlOrRd, Blues, Greens, or RdYlBu',\n );\n case 'sequential':\n return allowedForType(\n SEQUENTIAL_SCHEME_NAMES,\n 'sequential scheme such as Viridis, Plasma, Blues, or YlOrRd',\n );\n case 'diverging':\n return allowedForType(\n DIVERGING_SCHEME_NAMES,\n 'diverging scheme such as RdBu, Spectral, or BrBG',\n );\n case 'categorical':\n return allowedForType(\n CATEGORICAL_SCHEME_NAMES,\n 'categorical scheme such as Tableau10, Set2, or Category10',\n );\n default:\n return `colorScale type \"${scaleType}\" is not supported — use sequential, diverging, quantize, quantile, threshold, or categorical`;\n }\n}\n\nfunction getColorScaleThresholdsIssue(\n type: unknown,\n thresholds: unknown,\n): string | undefined {\n if (type !== 'threshold') return undefined;\n if (\n !Array.isArray(thresholds) ||\n thresholds.length === 0 ||\n !thresholds.every(\n (value) => typeof value === 'number' && Number.isFinite(value),\n )\n ) {\n return 'colorScale type \"threshold\" requires a non-empty numeric \"thresholds\" array';\n }\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction hasEntries(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && Object.keys(value).length > 0;\n}\n\n/** True for invalid `ST_MakeLine(ST_Point(...) ORDER BY ...)` (ORDER BY belongs in LIST). */\nfunction hasBadStMakeLinePointOrderBy(sql: string): boolean {\n const re = /\\bST_MakeLine\\s*\\(/gi;\n let match: RegExpExecArray | null;\n while ((match = re.exec(sql)) !== null) {\n let i = match.index + match[0].length;\n while (i < sql.length && /\\s/.test(sql[i]!)) i += 1;\n if (/^LIST\\s*\\(/i.test(sql.slice(i))) continue;\n const pointMatch = sql.slice(i).match(/^ST_Point\\s*\\(/i);\n if (!pointMatch) continue;\n i += pointMatch[0].length;\n let depth = 1;\n while (i < sql.length && depth > 0) {\n const ch = sql[i];\n if (ch === '(') depth += 1;\n else if (ch === ')') depth -= 1;\n i += 1;\n }\n if (depth !== 0) continue;\n if (/^\\s+ORDER\\s+BY\\b/i.test(sql.slice(i))) {\n return true;\n }\n }\n return false;\n}\n\nfunction mergeOptionalRecord(\n existing: unknown,\n incoming: unknown,\n): Record<string, unknown> | undefined {\n if (isRecord(existing) && isRecord(incoming)) {\n return {...existing, ...incoming};\n }\n if (isRecord(incoming)) return incoming;\n return isRecord(existing) ? existing : undefined;\n}\n\nfunction mergeLayerPatch(existingLayer: unknown, incomingLayer: unknown) {\n if (!isRecord(existingLayer) || !isRecord(incomingLayer)) {\n return incomingLayer;\n }\n return {\n ...existingLayer,\n ...incomingLayer,\n _sqlroomsBinding: mergeOptionalRecord(\n existingLayer._sqlroomsBinding,\n incomingLayer._sqlroomsBinding,\n ),\n };\n}\n\nfunction mergeLayerPatches(\n existingLayers: unknown[] | undefined,\n incomingLayers: unknown[] | undefined,\n) {\n if (!incomingLayers || incomingLayers.length === 0) return existingLayers;\n if (!existingLayers || existingLayers.length === 0) return incomingLayers;\n\n const nextLayers = [...existingLayers];\n for (const [incomingIndex, incomingLayer] of incomingLayers.entries()) {\n const incomingId = isRecord(incomingLayer)\n ? (incomingLayer.id as string | undefined)\n : undefined;\n const existingIndex = incomingId\n ? existingLayers.findIndex(\n (layer) => isRecord(layer) && layer.id === incomingId,\n )\n : incomingIndex < existingLayers.length\n ? incomingIndex\n : -1;\n if (existingIndex >= 0) {\n nextLayers[existingIndex] = mergeLayerPatch(\n existingLayers[existingIndex],\n incomingLayer,\n );\n } else {\n nextLayers.push(incomingLayer);\n }\n }\n return nextLayers;\n}\n\nfunction mergeSpecPatch(\n existingSpec: unknown,\n incomingSpec: unknown,\n options: DeckMapResourceConfigMergeOptions,\n) {\n if (typeof incomingSpec === 'string') return incomingSpec;\n const existing = isRecord(existingSpec) ? existingSpec : undefined;\n const incoming = isRecord(incomingSpec) ? incomingSpec : undefined;\n if (!existing && !incoming) return incomingSpec ?? existingSpec;\n\n const existingLayers = Array.isArray(existing?.layers)\n ? existing.layers\n : undefined;\n const incomingLayers = Array.isArray(incoming?.layers)\n ? incoming.layers\n : undefined;\n const layers =\n options.replaceLayers && incomingLayers !== undefined\n ? incomingLayers\n : mergeLayerPatches(existingLayers, incomingLayers);\n return {\n ...(existing ?? {}),\n ...(incoming ?? {}),\n ...(layers ? {layers} : {}),\n };\n}\n\n/** True when a bare `{tableName}` patch would wipe existing geometry SQL. */\nfunction isSourceDowngrade(\n existingSource: DeckMapDatasetSource | undefined,\n incomingSource: DeckMapDatasetSource | undefined,\n): boolean {\n if (!existingSource || !incomingSource) return false;\n\n const incomingIsBareTableName =\n isDeckMapTableDatasetSource(incomingSource) &&\n !(\n 'transformSql' in incomingSource &&\n typeof incomingSource.transformSql === 'string' &&\n incomingSource.transformSql.trim().length > 0\n );\n if (!incomingIsBareTableName) return false;\n\n if (isDeckMapSqlDatasetSource(existingSource)) return true;\n\n return (\n isDeckMapTableDatasetSource(existingSource) &&\n typeof existingSource.transformSql === 'string' &&\n existingSource.transformSql.trim().length > 0\n );\n}\n\nfunction mergeDatasetRegistry(\n existingDatasets: DeckMapConfig['datasets'],\n incomingDatasets: DeckMapConfig['datasets'],\n replaceDatasets: boolean,\n): DeckMapConfig['datasets'] {\n if (replaceDatasets) return incomingDatasets;\n if (!hasEntries(incomingDatasets)) return existingDatasets;\n const datasets = {...existingDatasets};\n for (const [datasetId, incomingDataset] of Object.entries(incomingDatasets)) {\n const existingDataset = existingDatasets[datasetId];\n if (!existingDataset) {\n datasets[datasetId] = incomingDataset;\n continue;\n }\n const resolvedSource = isSourceDowngrade(\n existingDataset.source,\n incomingDataset.source,\n )\n ? existingDataset.source\n : (incomingDataset.source ?? existingDataset.source);\n datasets[datasetId] = {\n ...existingDataset,\n ...incomingDataset,\n source: resolvedSource,\n };\n }\n return datasets;\n}\n\n/**\n * Merges a sparse map-tool patch with durable state. Empty dataset registries\n * and layer arrays mean \"preserve\" only when an existing resource is present.\n */\nexport function mergeDeckMapResourceConfigPatch(\n existingConfig: DeckMapConfig | undefined,\n incomingConfig: DeckMapConfig,\n options: DeckMapResourceConfigMergeOptions = {},\n): DeckMapConfig {\n if (!existingConfig) return incomingConfig;\n return {\n ...existingConfig,\n ...incomingConfig,\n spec: mergeSpecPatch(existingConfig.spec, incomingConfig.spec, options),\n datasets: mergeDatasetRegistry(\n existingConfig.datasets,\n incomingConfig.datasets,\n options.replaceDatasets === true,\n ),\n mapProps: mergeOptionalRecord(\n existingConfig.mapProps,\n incomingConfig.mapProps,\n ),\n dataPolicy: mergeOptionalRecord(\n existingConfig.dataPolicy,\n incomingConfig.dataPolicy,\n ),\n } as DeckMapConfig;\n}\n\nfunction parseSpec(config: DeckMapConfig): {\n layers: Record<string, unknown>[];\n issues: DeckMapResourceConfigIssue[];\n} {\n let spec: unknown = config.spec;\n if (typeof spec === 'string') {\n try {\n spec = JSON.parse(spec);\n } catch {\n return {\n layers: [],\n issues: [{path: 'spec', message: 'must be valid JSON'}],\n };\n }\n }\n\n const parsed = DeckJsonMapSpec.safeParse(spec);\n if (!parsed.success) {\n return {\n layers: [],\n issues: parsed.error.issues.map((issue) => ({\n path: ['spec', ...issue.path].join('.'),\n message: issue.message,\n })),\n };\n }\n\n return {\n layers: (parsed.data.layers ?? []) as Record<string, unknown>[],\n issues: [],\n };\n}\n\nconst DECK_MAP_LAYER_CLASS_ALIASES: Record<string, string> = {\n ScatterplotLayer: 'GeoArrowScatterplotLayer',\n HeatmapLayer: 'GeoArrowHeatmapLayer',\n ColumnLayer: 'GeoArrowColumnLayer',\n PathLayer: 'GeoArrowPathLayer',\n PolygonLayer: 'GeoArrowPolygonLayer',\n ArcLayer: 'GeoArrowArcLayer',\n TripsLayer: 'GeoArrowTripsLayer',\n H3HexagonLayer: 'GeoArrowH3HexagonLayer',\n};\n\nconst DECK_MAP_SUPPORTED_LAYER_TYPES = new Set<string>(\n DECK_MAP_LAYER_TYPE_OPTIONS.map((option) => option.value),\n);\n\nconst COLOR_SCALE_ACCESSOR_PROPS = [\n 'getFillColor',\n 'getLineColor',\n 'getColor',\n 'getSourceColor',\n 'getTargetColor',\n] as const;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\n/**\n * Validates the post-merge invariants of a renderable, resource-native map.\n * Patch inputs may be sparse, but the durable result must have supported\n * dataset sources and dataset-backed layers.\n */\nexport function getDeckMapResourceConfigIssues(\n config: DeckMapConfig,\n options: DeckMapResourceConfigValidationOptions = {},\n): DeckMapResourceConfigIssue[] {\n const issues: DeckMapResourceConfigIssue[] = [];\n const datasetEntries = Object.entries(config.datasets);\n const datasetIds = datasetEntries.map(([datasetId]) => datasetId);\n const datasetIdSet = new Set(datasetIds);\n const parsedSpec = parseSpec(config);\n issues.push(...parsedSpec.issues);\n\n const isEmpty = datasetEntries.length === 0 && parsedSpec.layers.length === 0;\n if (isEmpty) {\n return options.allowEmpty\n ? issues\n : [\n ...issues,\n {\n path: 'datasets',\n message: 'must contain at least one dataset for a map write',\n },\n {\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n },\n ];\n }\n\n if (datasetEntries.length === 0) {\n issues.push({\n path: 'datasets',\n message: 'must contain at least one dataset',\n });\n }\n\n for (const [datasetId, dataset] of datasetEntries) {\n const source = dataset.source;\n const hasSqlSource =\n isDeckMapSqlDatasetSource(source) && source.sqlQuery.trim().length > 0;\n const hasTableSource =\n isDeckMapTableDatasetSource(source) && source.tableName.trim().length > 0;\n if (!hasSqlSource && !hasTableSource) {\n const legacySql = (dataset as unknown as Record<string, unknown>).sql;\n issues.push({\n path: `datasets.${datasetId}.source`,\n message:\n typeof legacySql === 'string'\n ? 'must define source.tableName or source.sqlQuery; top-level sql is not supported'\n : 'must define source.tableName or source.sqlQuery',\n });\n }\n\n const sqlParts = [\n isDeckMapTableDatasetSource(source) ? source.transformSql : undefined,\n isDeckMapSqlDatasetSource(source) ? source.sqlQuery : undefined,\n ].filter(\n (part): part is string =>\n typeof part === 'string' && part.trim().length > 0,\n );\n const sql = sqlParts.join('\\n');\n if (sql && hasSelectStarAsWkbCollision(sql)) {\n issues.push({\n path: `datasets.${datasetId}.source`,\n message:\n 'Do not use SELECT *, ST_AsWKB(col) AS col — DuckDB keeps the original column and the WKB alias collides, producing empty maps. Use SELECT * EXCLUDE (col), ST_AsWKB(col) AS col, or omit transformSql when the geometry column already exists.',\n });\n }\n }\n\n if (parsedSpec.layers.length === 0) {\n issues.push({\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n });\n }\n\n parsedSpec.layers.forEach((layer, index) => {\n const layerType = layer['@@type'];\n if (typeof layerType !== 'string' || layerType.trim().length === 0) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: 'must name a Deck JSON layer class',\n });\n } else {\n const aliased = DECK_MAP_LAYER_CLASS_ALIASES[layerType];\n if (aliased) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: `use \"${aliased}\" — plain \"${layerType}\" is not a registered Deck JSON layer class`,\n });\n } else if (!DECK_MAP_SUPPORTED_LAYER_TYPES.has(layerType)) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: `use a supported Deck map layer type (${[...DECK_MAP_SUPPORTED_LAYER_TYPES].join(', ')}) — \"${layerType}\" is not allowed`,\n });\n }\n }\n\n for (const prop of COLOR_SCALE_ACCESSOR_PROPS) {\n const value = layer[prop];\n if (!isPlainObject(value)) continue;\n\n if (\n value['@@type'] === 'ColorScale' &&\n value['@@function'] !== 'colorScale'\n ) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message:\n 'use {\"@@function\":\"colorScale\",\"field\":\"<column>\",\"type\":\"...\",\"scheme\":\"...\",\"domain\":\"auto\"} — {\"@@type\":\"ColorScale\",\"column\":\"...\"} is not valid colorScale syntax',\n });\n continue;\n }\n\n if (value['@@function'] === 'colorScale') {\n if (typeof value.field !== 'string' || !value.field.trim()) {\n if (typeof value.column === 'string' && value.column.trim()) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message:\n 'colorScale uses \"field\" for the column name, not \"column\" — rename column → field',\n });\n } else {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message:\n 'colorScale requires a non-empty string \"field\" with the exact column name',\n });\n }\n }\n const schemeIssue = getColorScaleTypeSchemeIssue(\n value.type,\n value.scheme,\n );\n if (schemeIssue) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message: schemeIssue,\n });\n }\n const thresholdsIssue = getColorScaleThresholdsIssue(\n value.type,\n value.thresholds,\n );\n if (thresholdsIssue) {\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message: thresholdsIssue,\n });\n }\n }\n }\n\n const binding =\n layer._sqlroomsBinding && typeof layer._sqlroomsBinding === 'object'\n ? (layer._sqlroomsBinding as Record<string, unknown>)\n : undefined;\n const boundDataset =\n typeof binding?.dataset === 'string' && binding.dataset.trim()\n ? binding.dataset\n : undefined;\n\n if (boundDataset) {\n if (!datasetIdSet.has(boundDataset)) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message: `references unknown dataset \"${boundDataset}\"`,\n });\n }\n } else {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message:\n 'must bind the layer to a config.datasets entry; layer data references and implicit bindings are not durable resource bindings',\n });\n }\n\n if (layerType === 'GeoArrowHeatmapLayer' && 'getWeight' in layer) {\n // Basic: omit getWeight. Custom: numeric constant only.\n const getWeight = layer.getWeight;\n if (config.configMode !== 'custom') {\n issues.push({\n path: `spec.layers.${index}.getWeight`,\n message:\n 'omit getWeight for default density — the basic settings panel has no weight-column control; do not bind a column',\n });\n } else if (\n isPlainObject(getWeight) ||\n (typeof getWeight === 'string' && getWeight.trim().length > 0)\n ) {\n issues.push({\n path: `spec.layers.${index}.getWeight`,\n message:\n 'omit getWeight for default density, or use a numeric constant — column / object accessors are not supported',\n });\n }\n }\n\n // Basic mode: numeric sizes (elevation may use @@=col / scale).\n if (config.configMode !== 'custom') {\n const rejectNonNumericSize = (\n prop: string,\n value: unknown,\n message: string,\n ) => {\n if (value === undefined) return;\n if (typeof value === 'number' && Number.isFinite(value)) return;\n issues.push({\n path: `spec.layers.${index}.${prop}`,\n message,\n });\n };\n\n if (layerType === 'GeoArrowScatterplotLayer') {\n rejectNonNumericSize(\n 'getRadius',\n layer.getRadius,\n 'use a positive number (e.g. 4) with radiusUnits \"pixels\" — string/object size accessors are not supported in basic mode',\n );\n }\n\n const LINE_LAYER_TYPES = new Set([\n 'GeoArrowPathLayer',\n 'GeoArrowArcLayer',\n 'GeoArrowTripsLayer',\n ]);\n if (typeof layerType === 'string' && LINE_LAYER_TYPES.has(layerType)) {\n rejectNonNumericSize(\n 'getWidth',\n layer.getWidth,\n 'use a number (e.g. 2) with widthUnits \"pixels\" — string/object size accessors are not supported in basic mode',\n );\n }\n\n if (layerType === 'GeoArrowHeatmapLayer') {\n rejectNonNumericSize(\n 'radiusPixels',\n layer.radiusPixels,\n 'use a positive number (e.g. 30) — string/object size accessors are not supported in basic mode',\n );\n }\n\n if (layerType === 'GeoArrowColumnLayer') {\n rejectNonNumericSize(\n 'radius',\n layer.radius,\n 'use a positive number in meters (e.g. 50) — string/object size accessors are not supported in basic mode',\n );\n }\n\n const ELEVATION_LAYER_TYPES = new Set([\n 'GeoArrowPolygonLayer',\n 'GeoArrowColumnLayer',\n 'GeoArrowH3HexagonLayer',\n ]);\n if (\n typeof layerType === 'string' &&\n ELEVATION_LAYER_TYPES.has(layerType) &&\n layer.getElevation !== undefined\n ) {\n const elev = layer.getElevation;\n if (typeof elev === 'string') {\n const isColumnAccessor = /^@@=[A-Za-z_][\\w]*$/.test(elev.trim());\n if (!isColumnAccessor) {\n issues.push({\n path: `spec.layers.${index}.getElevation`,\n message:\n 'in basic mode use a number (0 for flat), a column accessor \"@@=columnName\", or {\"@@function\":\"scale\",\"field\":\"...\",\"type\":\"linear\",\"domain\":\"auto\",\"range\":[0,200]} — free-form string expressions require configMode \"custom\"',\n });\n }\n } else if (isPlainObject(elev)) {\n const fn = elev['@@function'];\n const field = typeof elev.field === 'string' ? elev.field.trim() : '';\n const typeOk =\n elev.type === undefined ||\n elev.type === 'linear' ||\n (typeof elev.type === 'string' && elev.type.trim() === 'linear');\n if ((fn !== 'scale' && fn !== 'scaleLinear') || !field || !typeOk) {\n issues.push({\n path: `spec.layers.${index}.getElevation`,\n message:\n 'in basic mode use {\"@@function\":\"scale\",\"field\":\"...\",\"type\":\"linear\",\"domain\":\"auto\",\"range\":[0,200]} (or a column accessor \"@@=columnName\")',\n });\n }\n } else if (!(typeof elev === 'number' && Number.isFinite(elev))) {\n issues.push({\n path: `spec.layers.${index}.getElevation`,\n message:\n 'in basic mode use a number (0 for flat), a column accessor \"@@=columnName\", or {\"@@function\":\"scale\",\"field\":\"...\",\"type\":\"linear\",\"domain\":\"auto\",\"range\":[0,200]}',\n });\n }\n }\n }\n\n if (layerType === 'GeoArrowH3HexagonLayer') {\n const getHexagon = layer.getHexagon;\n if (isPlainObject(getHexagon)) {\n issues.push({\n path: `spec.layers.${index}.getHexagon`,\n message:\n 'use getHexagon as a deck.gl attribute string \"@@=h3_column_name\" (or set _sqlroomsBinding.hexagonColumn) — object accessors like {\"@@function\":\"...\",\"column\":\"...\"} are not valid',\n });\n } else {\n const hasHexagonBinding =\n typeof binding?.hexagonColumn === 'string' &&\n (binding.hexagonColumn as string).trim().length > 0;\n const getHexagonAccessor =\n typeof getHexagon === 'string' ? getHexagon.trim() : '';\n const hasGetHexagonAccessor = /^@@=[A-Za-z_][\\w]*$/.test(\n getHexagonAccessor,\n );\n if (\n getHexagonAccessor &&\n !hasGetHexagonAccessor &&\n !hasHexagonBinding\n ) {\n issues.push({\n path: `spec.layers.${index}.getHexagon`,\n message:\n 'use getHexagon as \"@@=h3_column_name\" (a simple column accessor) or set _sqlroomsBinding.hexagonColumn — bare names and expressions are not valid',\n });\n } else if (!hasGetHexagonAccessor && !hasHexagonBinding) {\n issues.push({\n path: `spec.layers.${index}.getHexagon`,\n message:\n 'GeoArrowH3HexagonLayer requires getHexagon (e.g. \"@@=h3_column_name\") or _sqlroomsBinding.hexagonColumn set to the H3 index column',\n });\n }\n }\n }\n\n if (layerType === 'GeoArrowArcLayer') {\n if (layer.getSourcePosition !== undefined) {\n issues.push({\n path: `spec.layers.${index}.getSourcePosition`,\n message:\n 'do not set getSourcePosition — bind the source geometry via _sqlroomsBinding.sourceGeometryColumn only',\n });\n }\n if (layer.getTargetPosition !== undefined) {\n issues.push({\n path: `spec.layers.${index}.getTargetPosition`,\n message:\n 'do not set getTargetPosition — bind the target geometry via _sqlroomsBinding.targetGeometryColumn only',\n });\n }\n const hasSource =\n typeof binding?.sourceGeometryColumn === 'string' &&\n (binding.sourceGeometryColumn as string).trim().length > 0;\n const hasTarget =\n typeof binding?.targetGeometryColumn === 'string' &&\n (binding.targetGeometryColumn as string).trim().length > 0;\n if (!hasSource) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.sourceGeometryColumn`,\n message:\n 'GeoArrowArcLayer requires _sqlroomsBinding.sourceGeometryColumn set to the source geometry column name',\n });\n }\n if (!hasTarget) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.targetGeometryColumn`,\n message:\n 'GeoArrowArcLayer requires _sqlroomsBinding.targetGeometryColumn set to the target geometry column name',\n });\n }\n }\n\n if (layerType === 'GeoArrowTripsLayer') {\n const hasTimestampColumn =\n typeof binding?.timestampColumn === 'string' &&\n (binding.timestampColumn as string).trim().length > 0;\n if (!hasTimestampColumn) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.timestampColumn`,\n message:\n 'GeoArrowTripsLayer requires _sqlroomsBinding.timestampColumn set to the timestamps list column, e.g. \"timestamps\"',\n });\n }\n }\n\n if (\n layerType === 'GeoArrowTripsLayer' ||\n layerType === 'GeoArrowPathLayer'\n ) {\n // LIST(...)/ST_MakeLine needs GROUP BY path/trip id.\n if (boundDataset && config.datasets[boundDataset]) {\n const source = config.datasets[boundDataset]?.source as\n | {transformSql?: string; sqlQuery?: string}\n | undefined;\n const sql = `${source?.transformSql ?? ''} ${source?.sqlQuery ?? ''}`;\n if (hasBadStMakeLinePointOrderBy(sql)) {\n issues.push({\n path: `datasets.${boundDataset}.source`,\n message:\n 'ST_MakeLine is a scalar that takes a LIST of points. Use ST_MakeLine(LIST(ST_Point(lon, lat) ORDER BY waypoint_order)) — never ST_MakeLine(ST_Point(...) ORDER BY ...). ORDER BY is only valid inside LIST.',\n });\n }\n const usesListAgg =\n /\\bST_MakeLine\\s*\\(\\s*LIST\\s*\\(/i.test(sql) ||\n /\\bLIST\\s*\\([^)]*ORDER\\s+BY/i.test(sql);\n const hasGroupBy = /\\bGROUP\\s+BY\\b/i.test(sql);\n if (usesListAgg && !hasGroupBy) {\n issues.push({\n path: `datasets.${boundDataset}.source`,\n message: `${layerType} waypoint aggregation using LIST(...)/ST_MakeLine must include GROUP BY the trip/path/route id column so each trip becomes one linestring. Without GROUP BY, waypoints are not split per trip.`,\n });\n }\n }\n }\n });\n\n const fitDataset = config.fitToData?.dataset;\n if (fitDataset && !datasetIdSet.has(fitDataset)) {\n issues.push({\n path: 'fitToData.dataset',\n message: `references unknown dataset \"${fitDataset}\"`,\n });\n }\n\n if (\n typeof config.mapStyle === 'string' &&\n /^mapbox:/i.test(config.mapStyle.trim())\n ) {\n issues.push({\n path: 'mapStyle',\n message:\n 'mapbox:// styles are not supported (MapLibre cannot fetch that URL scheme). Omit mapStyle to use the host basemap, or use a token-free MapLibre-compatible https:// style URL',\n });\n }\n\n return issues;\n}\n\n/** Rejects invalid durable map writes after sparse patches have been merged. */\nexport function assertDeckMapResourceConfig(config: DeckMapConfig): void {\n const issues = getDeckMapResourceConfigIssues(config);\n if (issues.length > 0) throw new DeckMapResourceConfigError(issues);\n}\n\n/**\n * Returns the package-owned authoring contract for hosts with direct document\n * map capability. Host adapters opt into it; they do not maintain prompt copies.\n */\nexport function getDeckMapResourceAiInstructions(): string {\n return `## Direct document Deck map resources\n\nWhen authoring a document map config, use the resource-native Deck JSON contract:\n- A new map must contain at least one config.datasets entry and at least one spec.layers entry.\n- Every dataset must define source.tableName, source.tableName plus source.transformSql, or source.sqlQuery. Never put sql directly on the dataset object.\n- Bind every layer to a dataset with _sqlroomsBinding.dataset. Never use data: \"@@#datasetId\" or an implicit single-dataset binding as a durable resource binding.\n- Use supported Deck JSON layer classes such as GeoArrowScatterplotLayer, GeoArrowHeatmapLayer, GeoArrowPolygonLayer, GeoArrowPathLayer, GeoArrowTripsLayer, GeoArrowArcLayer, GeoArrowColumnLayer, GeoArrowH3HexagonLayer, or GeoJsonLayer. Prefer typed GeoArrow* layers when geometry type is known; GeoJsonLayer is valid for table-backed WKB/GeoJSON via _sqlroomsBinding.\n- For a standard table-backed longitude/latitude point map, pass the tool's top-level pointBinding with dataset, longitudeColumn, and latitudeColumn. Do not author transformSql, geometryColumn, geometryEncodingHint, or layer geometryColumn for that dataset; the resource writer generates and aligns canonical WKB point geometry. Set geometryColumn in pointBinding only when the default __sqlrooms_geom name is unsuitable.\n${getDeckMapSharedAiContractRules()}\n- For table-backed datasets, also pass the same table through the tool's top-level tableName field. A selected table does not replace the required dataset source.\n- transformSql must be a single SELECT and must read from __sqlrooms_source. Use source.sqlQuery only for a standalone pinned query.\n- Use configMode \"basic\" for a straightforward single-layer map (including extruded column/polygon maps with one elevation column via \"@@=col\" or a scale accessor). Use \"custom\" only for advanced properties the basic settings cannot represent; custom mode disables the settings panel and does not relax dataset-source or layer-binding requirements.\n- Prefer data-driven color when a useful varying column exists: getFillColor (or getColor/getSourceColor/getTargetColor for arcs) with {\"@@function\":\"colorScale\",\"field\":\"<column>\",\"type\":\"sequential\"|\"quantile\"|\"categorical\",\"scheme\":\"<name>\",\"domain\":\"auto\"}. Use quantile for skewed numeric, sequential for uniform, categorical for strings. Skip numeric columns where min = max (or all zeros) unless the user names that column; otherwise use flat fill. Exact scheme names (case-sensitive): ${formatColorSchemePromptLists()} — do not invent names. Viridis/Plasma/Inferno require type \"sequential\"; quantile/quantize schemes must be ColorBrewer ramps (YlOrRd, Blues, …).\n- For updates, sparse config patches are allowed because they are merged with the existing resource. For creates, never send empty datasets or layers.\n- When updating only visual properties (color scale, scheme, radius, width, elevation scale, visibility, opacity), send datasets as an empty object {} so the tool schema stays valid and merge keeps the existing dataset registry. Do not omit datasets entirely. Never re-send bare source.tableName without transformSql/sqlQuery — that overwrites geometry SQL and breaks the map. Include real dataset entries only when changing a data source.\n- To remove existing layers or datasets, set replaceLayers and/or replaceDatasets to true and send the complete desired list or registry. Omit them for additive sparse updates. For layer-type switches, set replaceLayers: true with only the new layer — do not keep the old layer as visible: false.\n- If a map write reports an invalid resource config, repair the reported paths and retry the same direct map operation; do not replace it with a dashboard-backed map.\n\nMinimal table-backed point map shape:\n{\"tableName\":\"places\",\"pointBinding\":{\"dataset\":\"places\",\"longitudeColumn\":\"longitude\",\"latitudeColumn\":\"latitude\"},\"config\":{\"configMode\":\"basic\",\"datasets\":{\"places\":{\"source\":{\"tableName\":\"places\"}}},\"spec\":{\"layers\":[{\"@@type\":\"GeoArrowScatterplotLayer\",\"id\":\"places\",\"_sqlroomsBinding\":{\"dataset\":\"places\"},\"getRadius\":4,\"radiusUnits\":\"pixels\",\"pickable\":true}]}}}`;\n}\n"]}
|
package/dist/mosaic.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Opt-in Mosaic dashboard adapter for Deck map panels. */
|
|
2
2
|
export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, createDeckMapPanelFromNativeConfig, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
|
|
3
|
-
export type { DeckMapConfigToolParams, DeckMapDashboardConfigToolConfig, DeckMapDashboardToolParams, } from './ai';
|
|
3
|
+
export type { CreateDashboardAgentToolWithDeckMapsOptions, CreateDashboardWithDeckMapAiToolsOptions, CreateDeckMapDashboardToolParams, DeckMapConfigToolParams, DeckMapDashboardConfigToolConfig, DeckMapDashboardToolParams, } from './ai';
|
|
4
4
|
export { deckMapDashboardAddPanelAction, deckMapDashboardPanelRenderer, } from './dashboard';
|
|
5
5
|
export { DeckMapDashboardSettings } from './DashboardMapSettings';
|
|
6
6
|
export { DeckMapSettingsPanel } from './MapSettings';
|
package/dist/mosaic.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mosaic.d.ts","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AACd,YAAY,EACV,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,MAAM,CAAC;AACd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"mosaic.d.ts","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AACd,YAAY,EACV,2CAA2C,EAC3C,wCAAwC,EACxC,gCAAgC,EAChC,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,MAAM,CAAC;AACd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC"}
|
package/dist/mosaic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mosaic.js","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"mosaic.js","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AASd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC","sourcesContent":["/** Opt-in Mosaic dashboard adapter for Deck map panels. */\nexport {\n DECK_MAP_AI_INSTRUCTIONS,\n createDashboardAgentToolWithDeckMaps,\n createDashboardWithDeckMapAiTools,\n createDeckMapAiTools,\n createDeckMapDashboardAiTools,\n createDeckMapDashboardTool,\n createDeckMapConfigTool,\n createDeckMapPanelFromNativeConfig,\n DeckMapDashboardConfigParameter,\n DeckMapConfigToolParameters,\n DeckMapDashboardToolParameters,\n getDashboardWithDeckMapAiInstructions,\n} from './ai';\nexport type {\n CreateDashboardAgentToolWithDeckMapsOptions,\n CreateDashboardWithDeckMapAiToolsOptions,\n CreateDeckMapDashboardToolParams,\n DeckMapConfigToolParams,\n DeckMapDashboardConfigToolConfig,\n DeckMapDashboardToolParams,\n} from './ai';\nexport {\n deckMapDashboardAddPanelAction,\n deckMapDashboardPanelRenderer,\n} from './dashboard';\nexport {DeckMapDashboardSettings} from './DashboardMapSettings';\nexport {DeckMapSettingsPanel} from './MapSettings';\nexport {createDeckMapDashboardSliceOptions} from './dashboardIntegration';\nexport * from './dashboardConfig';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geoarrow.js","sourceRoot":"","sources":["../../src/prepare/geoarrow.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAGzD,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAE,KAA0B,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,KAAa;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACzD,OAAQ,KAA2C,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAyB,EAAE,CAAC,UAAU,EAAE,EAAE,CAC1D,MAAM,CAAC,UAAU,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,EAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,EAAC,CAAC;AAC5D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"geoarrow.js","sourceRoot":"","sources":["../../src/prepare/geoarrow.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {ResolvedGeometryColumn, ResolvedGeometryEncoding} from './types';\n\nfunction itemLength(value: unknown) {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (value && typeof value === 'object' && 'length' in value) {\n return Number((value as {length: number}).length);\n }\n return 0;\n}\n\nfunction itemAt(value: unknown, index: number): unknown {\n if (Array.isArray(value)) {\n return value[index];\n }\n if (value && typeof value === 'object' && 'get' in value) {\n return (value as {get: (index: number) => unknown}).get(index);\n }\n return undefined;\n}\n\nfunction toCoordinates(value: unknown): number[] {\n return Array.from(value as Iterable<number>, (coordinate) =>\n Number(coordinate),\n );\n}\n\nfunction pointToGeometry(value: unknown) {\n return {type: 'Point', coordinates: toCoordinates(value)};\n}\n\nfunction multiPointToGeometry(value: unknown) {\n const coordinates: number[][] = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'MultiPoint', coordinates};\n}\n\nfunction lineStringToGeometry(value: unknown) {\n const coordinates: number[][] = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'LineString', coordinates};\n}\n\nfunction multiLineStringToGeometry(value: unknown) {\n const coordinates: number[][][] = [];\n for (let index = 0; index < itemLength(value); index++) {\n const lineString = itemAt(value, index);\n if (lineString) {\n coordinates.push(lineStringToGeometry(lineString).coordinates);\n }\n }\n return {type: 'MultiLineString', coordinates};\n}\n\nfunction polygonToGeometry(value: unknown) {\n const coordinates: number[][][] = [];\n for (let ringIndex = 0; ringIndex < itemLength(value); ringIndex++) {\n const ring = itemAt(value, ringIndex);\n if (ring) {\n coordinates.push(lineStringToGeometry(ring).coordinates);\n }\n }\n return {type: 'Polygon', coordinates};\n}\n\nfunction multiPolygonToGeometry(value: unknown) {\n const coordinates: number[][][][] = [];\n for (let polygonIndex = 0; polygonIndex < itemLength(value); polygonIndex++) {\n const polygon = itemAt(value, polygonIndex);\n if (polygon) {\n coordinates.push(polygonToGeometry(polygon).coordinates);\n }\n }\n return {type: 'MultiPolygon', coordinates};\n}\n\nexport function isDirectGeoArrowEncoding(\n encoding: ResolvedGeometryEncoding,\n): boolean {\n return [\n 'geoarrow.point',\n 'geoarrow.multipoint',\n 'geoarrow.linestring',\n 'geoarrow.multilinestring',\n 'geoarrow.polygon',\n 'geoarrow.multipolygon',\n ].includes(encoding);\n}\n\nexport function convertGeoArrowCellToGeometry(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) {\n return null;\n }\n\n switch (encoding) {\n case 'geoarrow.point':\n return pointToGeometry(value);\n case 'geoarrow.multipoint':\n return multiPointToGeometry(value);\n case 'geoarrow.linestring':\n return lineStringToGeometry(value);\n case 'geoarrow.multilinestring':\n return multiLineStringToGeometry(value);\n case 'geoarrow.polygon':\n return polygonToGeometry(value);\n case 'geoarrow.multipolygon':\n return multiPolygonToGeometry(value);\n default:\n return null;\n }\n}\n\nexport function buildNativeGeoArrowBinaryData(\n table: arrow.Table,\n geometry: ResolvedGeometryColumn,\n): unknown {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: geometry.columnName,\n getGeometryAt: (rowIndex) =>\n convertGeoArrowCellToGeometry(\n geometry.vector.get(rowIndex),\n geometry.encoding,\n ),\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareDeckDataset.d.ts","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAM3C,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,SAAS,CAAC;AAGjB,KAAK,yBAAyB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"prepareDeckDataset.d.ts","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAM3C,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,SAAS,CAAC;AAGjB,KAAK,yBAAyB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,mBAAmB,CA6ErB"}
|
|
@@ -70,6 +70,7 @@ export function prepareDeckDataset(options) {
|
|
|
70
70
|
datasetId,
|
|
71
71
|
table,
|
|
72
72
|
datasetGeometryColumn: geometryColumn,
|
|
73
|
+
datasetGeometryEncodingHint: geometryEncodingHint,
|
|
73
74
|
resolveGeometry,
|
|
74
75
|
getGeoArrowLayerData(geometryColumnOverride) {
|
|
75
76
|
const cacheKey = geometryColumnOverride ?? '__default__';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareDeckDataset.js","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {detectGeometryColumn} from './detectGeometryColumn';\nimport {\n buildNativeGeoArrowBinaryData,\n isDirectGeoArrowEncoding,\n} from './geoarrow';\nimport type {\n GeometryEncodingHint,\n PreparedDeckDataset,\n PreparedGeoArrowLayerData,\n ResolvedGeometryColumn,\n} from './types';\nimport {wkbGeometryDecoder} from './wkbDecoder';\n\ntype PrepareDeckDatasetOptions = {\n datasetId: string;\n table: arrow.Table;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\n/**\n * Build the reusable deck-facing geometry helpers for one resolved Arrow table.\n *\n * This is the expensive preparation step that `preparedDatasetStore` caches.\n * It accepts one resolved Arrow table plus a geometry column/hint and turns\n * the source geometry into canonical deck-facing outputs that can be reused by\n * multiple layers and multiple `DeckJsonMap` instances.\n *\n * Supported input geometry forms:\n *\n * - native GeoArrow columns\n * Already columnar and geometry-aware. These are the cheapest inputs:\n * preparation mainly does geometry-column detection plus lightweight wrapper\n * shaping so GeoArrow-capable deck layers can consume the Arrow table/vector\n * directly.\n * - WKB / GeoArrow WKB columns\n * Binary geometry needs decoding because deck layers cannot render raw WKB\n * bytes. Preparation promotes the binary values into deck-ready geometry\n * structures for GeoArrow layers and GeoJSON-binary fallback layers.\n * - WKT / GeoArrow WKT columns\n * Text geometry likewise needs parsing before deck can render it. This has a\n * similar cost profile to WKB, but starts from text parsing rather than\n * binary decoding.\n *\n * These transformations are necessary because the input table shape is chosen\n * by the query/data source, while deck expects render-oriented geometry\n * payloads. The canonical outputs produced here are:\n *\n * - GeoArrow layer data\n * A `PreparedGeoArrowLayerData` payload for GeoArrow-native deck layers,\n * either forwarded directly from native GeoArrow inputs or promoted from\n * WKB/WKT into a GeoArrow-like representation.\n * - GeoJSON-binary data\n * A binary GeoJSON-style payload for layers such as `GeoJsonLayer` that do\n * not consume GeoArrow inputs directly.\n *\n * The returned object also memoizes:\n *\n * - geometry column detection\n * - GeoArrow layer payloads\n * - GeoJSON-binary fallbacks\n *\n * Caching at this level lets deck reuse geometry decoding and shaping work\n * even when the upstream query result is already cached by another system such\n * as Mosaic's query manager.\n */\nexport function prepareDeckDataset(\n options: PrepareDeckDatasetOptions,\n): PreparedDeckDataset {\n const {datasetId, table, geometryColumn, geometryEncodingHint} = options;\n const resolvedGeometryCache = new Map<string, ResolvedGeometryColumn>();\n const geoArrowCache = new Map<string, PreparedGeoArrowLayerData>();\n const geoJsonBinaryCache = new Map<string, unknown>();\n\n const resolveGeometry = (geometryColumnOverride?: string) => {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = resolvedGeometryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = detectGeometryColumn({\n table,\n geometryColumn: geometryColumnOverride ?? geometryColumn,\n geometryEncodingHint,\n });\n resolvedGeometryCache.set(cacheKey, resolved);\n return resolved;\n };\n\n return {\n datasetId,\n table,\n datasetGeometryColumn: geometryColumn,\n resolveGeometry,\n getGeoArrowLayerData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoArrowCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n let prepared: PreparedGeoArrowLayerData;\n\n if (isDirectGeoArrowEncoding(resolved.encoding)) {\n prepared = {\n table,\n geometryColumnName: resolved.columnName,\n geometryColumn: resolved.vector,\n encoding: resolved.encoding,\n source: 'native',\n };\n } else {\n prepared = wkbGeometryDecoder.toGeoArrowLike(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n }\n\n geoArrowCache.set(cacheKey, prepared);\n return prepared;\n },\n getGeoJsonBinaryData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoJsonBinaryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n const binaryData = resolved.nativeGeoArrow\n ? buildNativeGeoArrowBinaryData(table, resolved)\n : wkbGeometryDecoder.toGeoJsonBinary(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n\n geoJsonBinaryCache.set(cacheKey, binaryData);\n return binaryData;\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"prepareDeckDataset.js","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {detectGeometryColumn} from './detectGeometryColumn';\nimport {\n buildNativeGeoArrowBinaryData,\n isDirectGeoArrowEncoding,\n} from './geoarrow';\nimport type {\n GeometryEncodingHint,\n PreparedDeckDataset,\n PreparedGeoArrowLayerData,\n ResolvedGeometryColumn,\n} from './types';\nimport {wkbGeometryDecoder} from './wkbDecoder';\n\ntype PrepareDeckDatasetOptions = {\n datasetId: string;\n table: arrow.Table;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\n/**\n * Build the reusable deck-facing geometry helpers for one resolved Arrow table.\n *\n * This is the expensive preparation step that `preparedDatasetStore` caches.\n * It accepts one resolved Arrow table plus a geometry column/hint and turns\n * the source geometry into canonical deck-facing outputs that can be reused by\n * multiple layers and multiple `DeckJsonMap` instances.\n *\n * Supported input geometry forms:\n *\n * - native GeoArrow columns\n * Already columnar and geometry-aware. These are the cheapest inputs:\n * preparation mainly does geometry-column detection plus lightweight wrapper\n * shaping so GeoArrow-capable deck layers can consume the Arrow table/vector\n * directly.\n * - WKB / GeoArrow WKB columns\n * Binary geometry needs decoding because deck layers cannot render raw WKB\n * bytes. Preparation promotes the binary values into deck-ready geometry\n * structures for GeoArrow layers and GeoJSON-binary fallback layers.\n * - WKT / GeoArrow WKT columns\n * Text geometry likewise needs parsing before deck can render it. This has a\n * similar cost profile to WKB, but starts from text parsing rather than\n * binary decoding.\n *\n * These transformations are necessary because the input table shape is chosen\n * by the query/data source, while deck expects render-oriented geometry\n * payloads. The canonical outputs produced here are:\n *\n * - GeoArrow layer data\n * A `PreparedGeoArrowLayerData` payload for GeoArrow-native deck layers,\n * either forwarded directly from native GeoArrow inputs or promoted from\n * WKB/WKT into a GeoArrow-like representation.\n * - GeoJSON-binary data\n * A binary GeoJSON-style payload for layers such as `GeoJsonLayer` that do\n * not consume GeoArrow inputs directly.\n *\n * The returned object also memoizes:\n *\n * - geometry column detection\n * - GeoArrow layer payloads\n * - GeoJSON-binary fallbacks\n *\n * Caching at this level lets deck reuse geometry decoding and shaping work\n * even when the upstream query result is already cached by another system such\n * as Mosaic's query manager.\n */\nexport function prepareDeckDataset(\n options: PrepareDeckDatasetOptions,\n): PreparedDeckDataset {\n const {datasetId, table, geometryColumn, geometryEncodingHint} = options;\n const resolvedGeometryCache = new Map<string, ResolvedGeometryColumn>();\n const geoArrowCache = new Map<string, PreparedGeoArrowLayerData>();\n const geoJsonBinaryCache = new Map<string, unknown>();\n\n const resolveGeometry = (geometryColumnOverride?: string) => {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = resolvedGeometryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = detectGeometryColumn({\n table,\n geometryColumn: geometryColumnOverride ?? geometryColumn,\n geometryEncodingHint,\n });\n resolvedGeometryCache.set(cacheKey, resolved);\n return resolved;\n };\n\n return {\n datasetId,\n table,\n datasetGeometryColumn: geometryColumn,\n datasetGeometryEncodingHint: geometryEncodingHint,\n resolveGeometry,\n getGeoArrowLayerData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoArrowCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n let prepared: PreparedGeoArrowLayerData;\n\n if (isDirectGeoArrowEncoding(resolved.encoding)) {\n prepared = {\n table,\n geometryColumnName: resolved.columnName,\n geometryColumn: resolved.vector,\n encoding: resolved.encoding,\n source: 'native',\n };\n } else {\n prepared = wkbGeometryDecoder.toGeoArrowLike(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n }\n\n geoArrowCache.set(cacheKey, prepared);\n return prepared;\n },\n getGeoJsonBinaryData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoJsonBinaryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n const binaryData = resolved.nativeGeoArrow\n ? buildNativeGeoArrowBinaryData(table, resolved)\n : wkbGeometryDecoder.toGeoJsonBinary(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n\n geoJsonBinaryCache.set(cacheKey, binaryData);\n return binaryData;\n },\n };\n}\n"]}
|
package/dist/prepare/types.d.ts
CHANGED
|
@@ -17,7 +17,10 @@ export type PreparedGeoArrowLayerData = {
|
|
|
17
17
|
export type PreparedDeckDataset = {
|
|
18
18
|
datasetId: string;
|
|
19
19
|
table: arrow.Table;
|
|
20
|
+
/** Dataset-level geometry column used when preparing this payload. */
|
|
20
21
|
datasetGeometryColumn?: string;
|
|
22
|
+
/** Dataset-level encoding hint used when preparing this payload. */
|
|
23
|
+
datasetGeometryEncodingHint?: GeometryEncodingHint;
|
|
21
24
|
resolveGeometry: (geometryColumn?: string) => ResolvedGeometryColumn;
|
|
22
25
|
getGeoArrowLayerData: (geometryColumn?: string) => PreparedGeoArrowLayerData;
|
|
23
26
|
getGeoJsonBinaryData: (geometryColumn?: string) => unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAChC,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,0BAA0B,GAC1B,kBAAkB,GAClB,uBAAuB,GACvB,cAAc,GACd,cAAc,GACd,KAAK,GACL,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IAKtC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACrE,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,yBAAyB,CAAC;IAC7E,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAChC,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,0BAA0B,GAC1B,kBAAkB,GAClB,uBAAuB,GACvB,cAAc,GACd,cAAc,GACd,KAAK,GACL,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IAKtC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,wBAAwB,CAAC;IACnC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,2BAA2B,CAAC,EAAE,oBAAoB,CAAC;IACnD,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACrE,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,yBAAyB,CAAC;IAC7E,oBAAoB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as arrow from 'apache-arrow';\n\nexport type GeometryEncodingHint = 'geoarrow' | 'wkb' | 'wkt';\n\nexport type ResolvedGeometryEncoding =\n | 'geoarrow.point'\n | 'geoarrow.multipoint'\n | 'geoarrow.linestring'\n | 'geoarrow.multilinestring'\n | 'geoarrow.polygon'\n | 'geoarrow.multipolygon'\n | 'geoarrow.wkb'\n | 'geoarrow.wkt'\n | 'wkb'\n | 'wkt'\n | 'unknown';\n\nexport type ResolvedGeometryColumn = {\n columnName: string;\n vector: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n nativeGeoArrow: boolean;\n};\n\nexport type PreparedGeoArrowLayerData = {\n // NOTE: This `Table` + `Vector` payload shape was used by the old\n // `@geoarrow/deck.gl-layers@0.3.x`. The current `@geoarrow/deck.gl-geoarrow@0.4.x`\n // prefers RecordBatch inputs, but our custom layer wrappers still consume\n // Table/Vector and chunk internally.\n table: arrow.Table;\n geometryColumnName: string;\n geometryColumn: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n source: 'native' | 'promoted';\n};\n\nexport type PreparedDeckDataset = {\n datasetId: string;\n table: arrow.Table;\n datasetGeometryColumn?: string;\n resolveGeometry: (geometryColumn?: string) => ResolvedGeometryColumn;\n getGeoArrowLayerData: (geometryColumn?: string) => PreparedGeoArrowLayerData;\n getGeoJsonBinaryData: (geometryColumn?: string) => unknown;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prepare/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as arrow from 'apache-arrow';\n\nexport type GeometryEncodingHint = 'geoarrow' | 'wkb' | 'wkt';\n\nexport type ResolvedGeometryEncoding =\n | 'geoarrow.point'\n | 'geoarrow.multipoint'\n | 'geoarrow.linestring'\n | 'geoarrow.multilinestring'\n | 'geoarrow.polygon'\n | 'geoarrow.multipolygon'\n | 'geoarrow.wkb'\n | 'geoarrow.wkt'\n | 'wkb'\n | 'wkt'\n | 'unknown';\n\nexport type ResolvedGeometryColumn = {\n columnName: string;\n vector: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n nativeGeoArrow: boolean;\n};\n\nexport type PreparedGeoArrowLayerData = {\n // NOTE: This `Table` + `Vector` payload shape was used by the old\n // `@geoarrow/deck.gl-layers@0.3.x`. The current `@geoarrow/deck.gl-geoarrow@0.4.x`\n // prefers RecordBatch inputs, but our custom layer wrappers still consume\n // Table/Vector and chunk internally.\n table: arrow.Table;\n geometryColumnName: string;\n geometryColumn: arrow.Vector;\n encoding: ResolvedGeometryEncoding;\n source: 'native' | 'promoted';\n};\n\nexport type PreparedDeckDataset = {\n datasetId: string;\n table: arrow.Table;\n /** Dataset-level geometry column used when preparing this payload. */\n datasetGeometryColumn?: string;\n /** Dataset-level encoding hint used when preparing this payload. */\n datasetGeometryEncodingHint?: GeometryEncodingHint;\n resolveGeometry: (geometryColumn?: string) => ResolvedGeometryColumn;\n getGeoArrowLayerData: (geometryColumn?: string) => PreparedGeoArrowLayerData;\n getGeoJsonBinaryData: (geometryColumn?: string) => unknown;\n};\n"]}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import type * as arrow from 'apache-arrow';
|
|
1
2
|
import type { GeometryDecoder } from './geometryDecoder';
|
|
3
|
+
import type { PreparedGeoArrowLayerData, ResolvedGeometryEncoding } from './types';
|
|
4
|
+
/** Promote WKB/WKT Points only — no silent polygon centroid. */
|
|
5
|
+
export declare function promoteToPointPositions(table: arrow.Table, columnName: string, encoding: ResolvedGeometryEncoding): PreparedGeoArrowLayerData | null;
|
|
6
|
+
export declare function isPointPositionLayer(layerType: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Extra guidance when a typed GeoArrow layer cannot promote WKB/WKT geometry.
|
|
9
|
+
* Mixed geometry columns must use GeoJsonLayer or an ST_GeometryType filter.
|
|
10
|
+
*/
|
|
11
|
+
export declare function describeGeoArrowPromotionFailure(layerType: string, encoding: ResolvedGeometryEncoding, table: arrow.Table, columnName: string): string;
|
|
2
12
|
export declare const wkbGeometryDecoder: GeometryDecoder;
|
|
3
13
|
//# sourceMappingURL=wkbDecoder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wkbDecoder.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wkbDecoder.d.ts","sourceRoot":"","sources":["../../src/prepare/wkbDecoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAU3C,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAsbjB,gEAAgE;AAChE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,wBAAwB,GACjC,yBAAyB,GAAG,IAAI,CAElC;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAsCD;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,wBAAwB,EAClC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CA4BR;AA8GD,eAAO,MAAM,kBAAkB,EAAE,eAsFhC,CAAC"}
|