@sqlrooms/deck 0.29.0-rc.11 → 0.29.0-rc.13
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 +193 -35
- 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 +75 -23
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +41 -0
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +2 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/DeckMapBasemapSelect.d.ts +9 -0
- package/dist/DeckMapBasemapSelect.d.ts.map +1 -0
- package/dist/DeckMapBasemapSelect.js +20 -0
- package/dist/DeckMapBasemapSelect.js.map +1 -0
- package/dist/DeckMapDefaultStylesProvider.d.ts +13 -19
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.js +11 -18
- 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/DeckMapsSlice.d.ts +5 -0
- package/dist/DeckMapsSlice.d.ts.map +1 -1
- package/dist/DeckMapsSlice.js +6 -3
- package/dist/DeckMapsSlice.js.map +1 -1
- package/dist/MapSettings.d.ts +14 -0
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +548 -192
- 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.map +1 -1
- package/dist/ai.js +20 -12
- package/dist/ai.js.map +1 -1
- package/dist/aiNormalize.d.ts.map +1 -1
- package/dist/aiNormalize.js +2 -1
- package/dist/aiNormalize.js.map +1 -1
- package/dist/basemap.d.ts +23 -0
- package/dist/basemap.d.ts.map +1 -0
- package/dist/basemap.js +23 -0
- package/dist/basemap.js.map +1 -0
- package/dist/block.d.ts +1 -1
- package/dist/block.d.ts.map +1 -1
- package/dist/block.js +13 -9
- 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/datasets/PreparedDatasetStore.d.ts +3 -4
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
- package/dist/datasets/PreparedDatasetStore.js +4 -8
- 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/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- 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/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +235 -175
- 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 +41 -26
- 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/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/index.d.ts +1 -0
- package/dist/json/layers/index.d.ts.map +1 -1
- package/dist/json/layers/index.js +1 -0
- package/dist/json/layers/index.js.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +13 -5
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/json/scaleFunction.d.ts +5 -8
- package/dist/json/scaleFunction.d.ts.map +1 -1
- package/dist/json/scaleFunction.js +30 -5
- package/dist/json/scaleFunction.js.map +1 -1
- package/dist/mapAiConfig.d.ts +6 -0
- package/dist/mapAiConfig.d.ts.map +1 -1
- package/dist/mapAiConfig.js +7 -0
- package/dist/mapAiConfig.js.map +1 -1
- package/dist/mapAiSharedInstructions.d.ts +1 -1
- package/dist/mapAiSharedInstructions.d.ts.map +1 -1
- package/dist/mapAiSharedInstructions.js +4 -3
- package/dist/mapAiSharedInstructions.js.map +1 -1
- package/dist/mapConfig.d.ts +6 -1
- package/dist/mapConfig.d.ts.map +1 -1
- package/dist/mapConfig.js +28 -3
- 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 +152 -5
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +55 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +222 -11
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/mapResourceAuthoring.d.ts +1 -1
- package/dist/mapResourceAuthoring.d.ts.map +1 -1
- package/dist/mapResourceAuthoring.js +14 -7
- package/dist/mapResourceAuthoring.js.map +1 -1
- package/dist/mapStyles.d.ts +16 -0
- package/dist/mapStyles.d.ts.map +1 -0
- package/dist/mapStyles.js +32 -0
- package/dist/mapStyles.js.map +1 -0
- 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.map +1 -1
- package/dist/prepare/wkbDecoder.js +62 -16
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +2 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +1 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/protomapsStyles.d.ts +18 -0
- package/dist/protomapsStyles.d.ts.map +1 -0
- package/dist/protomapsStyles.js +38 -0
- package/dist/protomapsStyles.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +11 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaleFunction.js","sourceRoot":"","sources":["../../src/json/scaleFunction.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {isBindableGeoArrowFieldIdentifier} from './compileGeoArrowAccessor';\n\nconst SQLROOMS_SCALE_MARKER = Symbol.for('@sqlrooms/deck/sqlrooms-scale');\n\nexport type LinearScaleConfig = {\n field: string;\n type?: 'linear';\n domain?: 'auto' | [number, number];\n /** When set, map domain → range. When omitted, use raw field minus domain min. */\n range?: [number, number];\n};\n\nexport type ScaleMarker = LinearScaleConfig & {\n [SQLROOMS_SCALE_MARKER]: true;\n};\n\n/** Marker returned by the Deck JSON `scale` function before table-aware compile. */\nexport function createScaleMarker(\n props: Record<string, unknown>,\n): ScaleMarker | undefined {\n const field = typeof props.field === 'string' ? props.field.trim() : '';\n if (!field) return undefined;\n\n const domain =\n props.domain === 'auto'\n ? 'auto'\n : Array.isArray(props.domain) &&\n props.domain.length === 2 &&\n typeof props.domain[0] === 'number' &&\n typeof props.domain[1] === 'number'\n ? ([props.domain[0], props.domain[1]] as [number, number])\n : 'auto';\n\n const range =\n Array.isArray(props.range) &&\n props.range.length === 2 &&\n typeof props.range[0] === 'number' &&\n typeof props.range[1] === 'number'\n ? ([props.range[0], props.range[1]] as [number, number])\n : undefined;\n\n return {\n [SQLROOMS_SCALE_MARKER]: true,\n field,\n type: 'linear',\n domain,\n ...(range ? {range} : {}),\n };\n}\n\nexport function isScaleMarker(value: unknown): value is ScaleMarker {\n return Boolean(\n value &&\n typeof value === 'object' &&\n (value as {[SQLROOMS_SCALE_MARKER]?: boolean})[SQLROOMS_SCALE_MARKER],\n );\n}\n\nfunction readNumericDomain(vector: arrow.Vector): [number, number] | null {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < vector.length; i++) {\n // Arrow/SQL NULL must not become 0 via Number(null).\n if (typeof vector.isValid === 'function' && !vector.isValid(i)) {\n continue;\n }\n const raw = vector.get(i);\n if (raw == null) continue;\n const v = Number(raw);\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n return [min, max];\n}\n\n/**\n * Linear scale `@@=` expression. Non-identifier fields need\n * {@link compileLinearScaleAccessor}.\n */\nexport function compileLinearScaleExpression(\n table: arrow.Table,\n scale: LinearScaleConfig,\n): string | undefined {\n const field = scale.field.trim();\n if (!field || !isBindableGeoArrowFieldIdentifier(field)) return undefined;\n\n const vector = table.getChild(field);\n if (!vector) return undefined;\n\n const domain =\n scale.domain === 'auto' || scale.domain === undefined\n ? readNumericDomain(vector)\n : scale.domain;\n if (!domain) return undefined;\n\n const [d0, d1] = domain;\n\n if (!scale.range) {\n if (d0 === 0) return `@@=${field}`;\n return `@@=Math.max(0, ${field} - ${d0})`;\n }\n\n const [r0, r1] = scale.range;\n const span = d1 - d0;\n if (span === 0) {\n return `@@=${r0}`;\n }\n\n const lo = Math.min(r0, r1);\n const hi = Math.max(r0, r1);\n // Clamp after linear map (bigint coercion lives in compileGeoArrowAccessor).\n return `@@=Math.max(${lo}, Math.min(${hi}, ${r0} + (${field} - ${d0}) / ${span} * ${r1 - r0}))`;\n}\n\n/** Elevation accessor for any Arrow column name (incl. non-identifiers). */\nexport function compileLinearScaleAccessor(\n table: arrow.Table,\n scale: LinearScaleConfig,\n):\n | ((info: {index: number; data: {data: unknown}; target: number[]}) => number)\n | undefined {\n const field = scale.field.trim();\n if (!field) return undefined;\n\n const vector = table.getChild(field);\n if (!vector) return undefined;\n\n const domain =\n scale.domain === 'auto' || scale.domain === undefined\n ? readNumericDomain(vector)\n : scale.domain;\n if (!domain) return undefined;\n\n const [d0, d1] = domain;\n const range = scale.range;\n\n return ({index, data}) => {\n const batch = data.data as arrow.Table | arrow.RecordBatch;\n const child = batch.getChild?.(field) ?? vector;\n const raw = child?.get(index);\n if (raw == null) return 0;\n const v = Number(raw);\n if (!Number.isFinite(v)) return 0;\n\n if (!range) {\n return Math.max(0, v - d0);\n }\n\n const [r0, r1] = range;\n const span = d1 - d0;\n if (span === 0) return r0;\n const lo = Math.min(r0, r1);\n const hi = Math.max(r0, r1);\n return Math.max(lo, Math.min(hi, r0 + ((v - d0) / span) * (r1 - r0)));\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scaleFunction.js","sourceRoot":"","sources":["../../src/json/scaleFunction.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,iCAAiC,EAAC,MAAM,2BAA2B,CAAC;AAE5E,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAc1E,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAC/B,KAA8B;IAE9B,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,MAAM;QACrB,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YACzB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;YACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;YACrC,CAAC,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAsB;YAC1D,CAAC,CAAC,MAAM,CAAC;IAEf,MAAM,KAAK,GACT,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QACxB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;QAChC,CAAC,CAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAsB;QACxD,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,CAAC,qBAAqB,CAAC,EAAE,IAAI;QAC7B,KAAK;QACL,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,CACZ,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACxB,KAA6C,CAAC,qBAAqB,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,qDAAqD;QACrD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,IAAI,IAAI;YAAE,SAAS;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,GAAG,GAAG;YAAE,GAAG,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG;YAAE,GAAG,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,KAAwB;IAExB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1E,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QACnD,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACnB,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;IAExB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,MAAM,KAAK,EAAE,CAAC;QACnC,OAAO,kBAAkB,KAAK,MAAM,EAAE,GAAG,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7B,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,OAAO,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AAClG,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAc,EACd,KAAa,EACb,MAAoB;IAEpB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE1D,MAAM,MAAM,GAAG,KAId,CAAC;IAEF,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QAChC,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,wEAAwE;YACxE,0BAA0B;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAiC,CAAC,CAAC;IACvE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAkB,EAClB,KAAwB;IAExB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QACnD,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACnB,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;QACrB,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {isBindableGeoArrowFieldIdentifier} from './compileGeoArrowAccessor';\n\nconst SQLROOMS_SCALE_MARKER = Symbol.for('@sqlrooms/deck/sqlrooms-scale');\n\nexport type LinearScaleConfig = {\n field: string;\n type?: 'linear';\n domain?: 'auto' | [number, number];\n /** When set, map domain → range. When omitted, use raw field minus domain min. */\n range?: [number, number];\n};\n\nexport type ScaleMarker = LinearScaleConfig & {\n [SQLROOMS_SCALE_MARKER]: true;\n};\n\n/** Marker returned by the Deck JSON `scale` function before table-aware compile. */\nexport function createScaleMarker(\n props: Record<string, unknown>,\n): ScaleMarker | undefined {\n const field = typeof props.field === 'string' ? props.field.trim() : '';\n if (!field) return undefined;\n\n const domain =\n props.domain === 'auto'\n ? 'auto'\n : Array.isArray(props.domain) &&\n props.domain.length === 2 &&\n typeof props.domain[0] === 'number' &&\n typeof props.domain[1] === 'number'\n ? ([props.domain[0], props.domain[1]] as [number, number])\n : 'auto';\n\n const range =\n Array.isArray(props.range) &&\n props.range.length === 2 &&\n typeof props.range[0] === 'number' &&\n typeof props.range[1] === 'number'\n ? ([props.range[0], props.range[1]] as [number, number])\n : undefined;\n\n return {\n [SQLROOMS_SCALE_MARKER]: true,\n field,\n type: 'linear',\n domain,\n ...(range ? {range} : {}),\n };\n}\n\nexport function isScaleMarker(value: unknown): value is ScaleMarker {\n return Boolean(\n value &&\n typeof value === 'object' &&\n (value as {[SQLROOMS_SCALE_MARKER]?: boolean})[SQLROOMS_SCALE_MARKER],\n );\n}\n\nfunction readNumericDomain(vector: arrow.Vector): [number, number] | null {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < vector.length; i++) {\n // Arrow/SQL NULL must not become 0 via Number(null).\n if (typeof vector.isValid === 'function' && !vector.isValid(i)) {\n continue;\n }\n const raw = vector.get(i);\n if (raw == null) continue;\n const v = Number(raw);\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n return [min, max];\n}\n\n/**\n * Linear scale `@@=` expression. Non-identifier fields need\n * {@link compileLinearScaleAccessor}.\n */\nexport function compileLinearScaleExpression(\n table: arrow.Table,\n scale: LinearScaleConfig,\n): string | undefined {\n const field = scale.field.trim();\n if (!field || !isBindableGeoArrowFieldIdentifier(field)) return undefined;\n\n const vector = table.getChild(field);\n if (!vector) return undefined;\n\n const domain =\n scale.domain === 'auto' || scale.domain === undefined\n ? readNumericDomain(vector)\n : scale.domain;\n if (!domain) return undefined;\n\n const [d0, d1] = domain;\n\n if (!scale.range) {\n if (d0 === 0) return `@@=${field}`;\n return `@@=Math.max(0, ${field} - ${d0})`;\n }\n\n const [r0, r1] = scale.range;\n const span = d1 - d0;\n if (span === 0) {\n return `@@=${r0}`;\n }\n\n const lo = Math.min(r0, r1);\n const hi = Math.max(r0, r1);\n // Clamp after linear map (bigint coercion lives in compileGeoArrowAccessor).\n return `@@=Math.max(${lo}, Math.min(${hi}, ${r0} + (${field} - ${d0}) / ${span} * ${r1 - r0}))`;\n}\n\nfunction readLinearScaleRawValue(\n value: unknown,\n field: string,\n vector: arrow.Vector,\n): unknown {\n if (!value || typeof value !== 'object') return undefined;\n\n const object = value as {\n index?: unknown;\n data?: {data?: {getChild?: (name: string) => arrow.Vector | null}};\n properties?: Record<string, unknown>;\n };\n\n if (typeof object.index === 'number') {\n const batch = object.data?.data;\n if (batch?.getChild) {\n return batch.getChild(field)?.get(object.index);\n }\n if (batch) {\n // Batch-local index (GeoArrow) without this field — do not fall back to\n // the table-level vector.\n return undefined;\n }\n return vector.get(object.index);\n }\n\n const sources = [object.properties, object as Record<string, unknown>];\n for (const source of sources) {\n if (source && typeof source === 'object' && field in source) {\n return source[field];\n }\n }\n\n return undefined;\n}\n\n/**\n * Elevation accessor for any Arrow column name (incl. non-identifiers).\n * Reads GeoArrow `{index, data}` callbacks or GeoJSON `{properties}` features.\n */\nexport function compileLinearScaleAccessor(\n table: arrow.Table,\n scale: LinearScaleConfig,\n): ((value: unknown) => number) | undefined {\n const field = scale.field.trim();\n if (!field) return undefined;\n\n const vector = table.getChild(field);\n if (!vector) return undefined;\n\n const domain =\n scale.domain === 'auto' || scale.domain === undefined\n ? readNumericDomain(vector)\n : scale.domain;\n if (!domain) return undefined;\n\n const [d0, d1] = domain;\n const range = scale.range;\n\n return (value) => {\n const raw = readLinearScaleRawValue(value, field, vector);\n if (raw == null) return 0;\n const v = Number(raw);\n if (!Number.isFinite(v)) return 0;\n\n if (!range) {\n return Math.max(0, v - d0);\n }\n\n const [r0, r1] = range;\n const span = d1 - d0;\n if (span === 0) return r0;\n const lo = Math.min(r0, r1);\n const hi = Math.max(r0, r1);\n return Math.max(lo, Math.min(hi, r0 + ((v - d0) / span) * (r1 - r0)));\n };\n}\n"]}
|
package/dist/mapAiConfig.d.ts
CHANGED
|
@@ -105,6 +105,12 @@ export declare const DeckMapResourceToolParameters: z.ZodObject<{
|
|
|
105
105
|
}, z.core.$loose>>;
|
|
106
106
|
settingsOpen: z.ZodOptional<z.ZodBoolean>;
|
|
107
107
|
}, z.core.$loose>;
|
|
108
|
+
pointBinding: z.ZodOptional<z.ZodObject<{
|
|
109
|
+
dataset: z.ZodString;
|
|
110
|
+
longitudeColumn: z.ZodString;
|
|
111
|
+
latitudeColumn: z.ZodString;
|
|
112
|
+
geometryColumn: z.ZodOptional<z.ZodString>;
|
|
113
|
+
}, z.core.$strip>>;
|
|
108
114
|
tableName: z.ZodOptional<z.ZodString>;
|
|
109
115
|
replaceLayers: z.ZodOptional<z.ZodBoolean>;
|
|
110
116
|
replaceDatasets: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapAiConfig.d.ts","sourceRoot":"","sources":["../src/mapAiConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"mapAiConfig.d.ts","sourceRoot":"","sources":["../src/mapAiConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAgDtB,kFAAkF;AAClF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBN,CAAC;AAEtC,mFAAmF;AACnF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBxC,CAAC"}
|
package/dist/mapAiConfig.js
CHANGED
|
@@ -31,6 +31,12 @@ const DeckMapFitToDataConfig = z.looseObject({
|
|
|
31
31
|
padding: z.number().optional(),
|
|
32
32
|
maxZoom: z.number().optional(),
|
|
33
33
|
});
|
|
34
|
+
const DeckMapPointBindingParameter = z.object({
|
|
35
|
+
dataset: z.string().trim().min(1),
|
|
36
|
+
longitudeColumn: z.string().trim().min(1),
|
|
37
|
+
latitudeColumn: z.string().trim().min(1),
|
|
38
|
+
geometryColumn: z.string().trim().min(1).optional(),
|
|
39
|
+
});
|
|
34
40
|
/** Validates the portable Deck map config accepted from commands and AI tools. */
|
|
35
41
|
export const DeckMapResourceConfigParameter = z.looseObject({
|
|
36
42
|
spec: z.union([z.string(), z.record(z.string(), z.unknown())]),
|
|
@@ -56,6 +62,7 @@ export const DeckMapResourceConfigParameter = z.looseObject({
|
|
|
56
62
|
export const DeckMapResourceToolParameters = z.object({
|
|
57
63
|
title: z.string().optional().default('Map'),
|
|
58
64
|
config: DeckMapResourceConfigParameter,
|
|
65
|
+
pointBinding: DeckMapPointBindingParameter.optional().describe('Structured point provenance for a table-backed dataset. Prefer this over authoring transformSql when longitude and latitude columns should become WKB point geometry.'),
|
|
59
66
|
tableName: z.string().optional(),
|
|
60
67
|
replaceLayers: z
|
|
61
68
|
.boolean()
|
package/dist/mapAiConfig.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapAiConfig.js","sourceRoot":"","sources":["../src/mapAiConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"mapAiConfig.js","sourceRoot":"","sources":["../src/mapAiConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {z} from 'zod';\nimport type {DeckMapConfig} from './mapConfig';\nimport type {DeckMapPointBinding} from './mapConfigUtils';\n\nconst DeckMapDatasetSource = z.union([\n z.looseObject({\n sqlQuery: z.string(),\n }),\n z.looseObject({\n tableName: z.string(),\n transformSql: z.string().optional(),\n }),\n]);\nconst DeckMapDatasetConfig = z.looseObject({\n source: DeckMapDatasetSource.optional().describe(\n 'Dataset source. Required for new maps; may be omitted only by a sparse update patch that retains an existing source.',\n ),\n geometryColumn: z.string().optional(),\n geometryEncodingHint: z.enum(['geoarrow', 'wkb', 'wkt']).optional(),\n});\n\nconst DeckMapInteractionConfig = z.looseObject({\n type: z.literal('point-radius-brush'),\n dataset: z.string(),\n longitudeColumn: z.string(),\n latitudeColumn: z.string(),\n radiusMeters: z.number().optional(),\n event: z.enum(['hover', 'click']).optional(),\n});\n\nconst DeckMapFitToDataConfig = z.looseObject({\n dataset: z.string(),\n longitudeColumn: z.string().optional(),\n latitudeColumn: z.string().optional(),\n geometryColumn: z.string().optional(),\n geometryColumns: z.array(z.string()).optional(),\n h3Column: z.string().optional(),\n padding: z.number().optional(),\n maxZoom: z.number().optional(),\n});\n\nconst DeckMapPointBindingParameter = z.object({\n dataset: z.string().trim().min(1),\n longitudeColumn: z.string().trim().min(1),\n latitudeColumn: z.string().trim().min(1),\n geometryColumn: z.string().trim().min(1).optional(),\n}) satisfies z.ZodType<DeckMapPointBinding>;\n\n/** Validates the portable Deck map config accepted from commands and AI tools. */\nexport const DeckMapResourceConfigParameter = z.looseObject({\n spec: z.union([z.string(), z.record(z.string(), z.unknown())]),\n datasets: z\n .record(z.string(), DeckMapDatasetConfig)\n .describe(\n 'Resource datasets keyed by id. Every dataset in a new map must define source.tableName or source.sqlQuery. For visual-only updates send an empty object {} so merge keeps the existing registry — do not omit this field.',\n ),\n configMode: z.enum(['basic', 'custom']).optional(),\n mapStyle: z.string().optional(),\n mapProps: z.record(z.string(), z.unknown()).optional(),\n showLegends: z.boolean().optional(),\n interaction: DeckMapInteractionConfig.optional(),\n fitToData: DeckMapFitToDataConfig.optional(),\n dataPolicy: z\n .looseObject({\n disabled: z.boolean().optional(),\n maxRows: z.number().int().min(1).optional(),\n reason: z.string().optional(),\n })\n .optional(),\n settingsOpen: z.boolean().optional(),\n}) satisfies z.ZodType<DeckMapConfig>;\n\n/** Validates inputs for an AI or command invocation that writes a map resource. */\nexport const DeckMapResourceToolParameters = z.object({\n title: z.string().optional().default('Map'),\n config: DeckMapResourceConfigParameter,\n pointBinding: DeckMapPointBindingParameter.optional().describe(\n 'Structured point provenance for a table-backed dataset. Prefer this over authoring transformSql when longitude and latitude columns should become WKB point geometry.',\n ),\n tableName: z.string().optional(),\n replaceLayers: z\n .boolean()\n .optional()\n .describe(\n 'Set true when config.spec.layers is the complete desired list and omitted existing layers should be removed.',\n ),\n replaceDatasets: z\n .boolean()\n .optional()\n .describe(\n 'Set true when config.datasets is the complete desired registry and omitted existing datasets should be removed.',\n ),\n reasoning: z.string(),\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapAiSharedInstructions.d.ts","sourceRoot":"","sources":["../src/mapAiSharedInstructions.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"mapAiSharedInstructions.d.ts","sourceRoot":"","sources":["../src/mapAiSharedInstructions.ts"],"names":[],"mappings":"AAEA,mEAAmE;AACnE,wBAAgB,+BAA+B,IAAI,MAAM,CAaxD"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { DECK_TABLE_DATASET_SOURCE_RELATION } from './datasets/tableDatasetSql';
|
|
2
|
-
/** Shared Deck map AI rules for dashboard and
|
|
2
|
+
/** Shared Deck map AI rules for dashboard and document prompts. */
|
|
3
3
|
export function getDeckMapSharedAiContractRules() {
|
|
4
4
|
const src = DECK_TABLE_DATASET_SOURCE_RELATION;
|
|
5
|
-
return `Shared Deck map authoring rules (dashboard and
|
|
6
|
-
- Scatterplot/Heatmap/Column require Point positions — do not bind them to Polygon/MultiPolygon geom. Prefer GeoArrowPolygonLayer
|
|
5
|
+
return `Shared Deck map authoring rules (dashboard and document):
|
|
6
|
+
- Scatterplot/Heatmap/Column require Point positions — do not bind them to Polygon/MultiPolygon geom. Prefer GeoArrowPolygonLayer for Polygon, GeoJsonLayer for WKB/WKT MultiPolygon, or transformSql with ST_AsWKB(ST_Centroid(geom)) / ST_PointOnSurface(geom) when the user wants points (e.g. SELECT * EXCLUDE (geom), ST_AsWKB(ST_Centroid(geom)) AS geom FROM ${src}). The runtime will not invent centroids.
|
|
7
7
|
- Mixed Point/LineString/Polygon columns: use GeoJsonLayer. Typed GeoArrowPolygon/Path/Scatterplot layers need a uniform geometry type. To keep one class, filter with WHERE ST_GeometryType(geom) IN (...) then use the matching typed layer.
|
|
8
8
|
- Never write SELECT *, ST_AsWKB(col) AS col — DuckDB keeps the original column and the WKB alias collides. Use SELECT * EXCLUDE (col), ST_AsWKB(...) AS col, or omit transformSql when geom already exists. Bare ST_Point(...) / table GEOMETRY columns are projected to WKB by the dataset pipeline; prefer explicit ST_AsWKB when practical.
|
|
9
9
|
- GeoArrowHeatmapLayer: omit colorRange (UI scheme selector owns it) and omit getWeight (default uniform density). Do not bind getWeight to a column — basic mode has no weight-column control.
|
|
10
10
|
- Never set mapStyle to a mapbox:// URL — MapLibre cannot load that scheme. Omit mapStyle for the host basemap, or use a token-free MapLibre https:// style URL.
|
|
11
|
+
- Built-in mapStyle IDs are light and dark. New maps default to the app theme at creation; omit mapStyle on updates to preserve the saved selection. Never put tile API keys in map configs.
|
|
11
12
|
- GeoArrowH3HexagonLayer: set getHexagon to "@@=h3_column" (or _sqlroomsBinding.hexagonColumn). When aggregating lon/lat, prefer h3_h3_to_string(h3_latlng_to_cell(lat, lon, res)) AS h3_cell (lat before lon).
|
|
12
13
|
- GeoArrowArcLayer: bind WKB via _sqlroomsBinding.sourceGeometryColumn / targetGeometryColumn only (do not set getSourcePosition/getTargetPosition). Use ST_AsWKB(ST_Point(...)); set geometryEncodingHint to "wkb".
|
|
13
14
|
- GeoArrowTripsLayer = animated path over time; GeoArrowArcLayer = static OD curve. Prefer TripsLayer for animated/trips/moving routes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapAiSharedInstructions.js","sourceRoot":"","sources":["../src/mapAiSharedInstructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kCAAkC,EAAC,MAAM,4BAA4B,CAAC;AAE9E,
|
|
1
|
+
{"version":3,"file":"mapAiSharedInstructions.js","sourceRoot":"","sources":["../src/mapAiSharedInstructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kCAAkC,EAAC,MAAM,4BAA4B,CAAC;AAE9E,mEAAmE;AACnE,MAAM,UAAU,+BAA+B;IAC7C,MAAM,GAAG,GAAG,kCAAkC,CAAC;IAC/C,OAAO;sWAC6V,GAAG;;;;;;;;;qlBAS4O,CAAC;AACtlB,CAAC","sourcesContent":["import {DECK_TABLE_DATASET_SOURCE_RELATION} from './datasets/tableDatasetSql';\n\n/** Shared Deck map AI rules for dashboard and document prompts. */\nexport function getDeckMapSharedAiContractRules(): string {\n const src = DECK_TABLE_DATASET_SOURCE_RELATION;\n return `Shared Deck map authoring rules (dashboard and document):\n- Scatterplot/Heatmap/Column require Point positions — do not bind them to Polygon/MultiPolygon geom. Prefer GeoArrowPolygonLayer for Polygon, GeoJsonLayer for WKB/WKT MultiPolygon, or transformSql with ST_AsWKB(ST_Centroid(geom)) / ST_PointOnSurface(geom) when the user wants points (e.g. SELECT * EXCLUDE (geom), ST_AsWKB(ST_Centroid(geom)) AS geom FROM ${src}). The runtime will not invent centroids.\n- Mixed Point/LineString/Polygon columns: use GeoJsonLayer. Typed GeoArrowPolygon/Path/Scatterplot layers need a uniform geometry type. To keep one class, filter with WHERE ST_GeometryType(geom) IN (...) then use the matching typed layer.\n- Never write SELECT *, ST_AsWKB(col) AS col — DuckDB keeps the original column and the WKB alias collides. Use SELECT * EXCLUDE (col), ST_AsWKB(...) AS col, or omit transformSql when geom already exists. Bare ST_Point(...) / table GEOMETRY columns are projected to WKB by the dataset pipeline; prefer explicit ST_AsWKB when practical.\n- GeoArrowHeatmapLayer: omit colorRange (UI scheme selector owns it) and omit getWeight (default uniform density). Do not bind getWeight to a column — basic mode has no weight-column control.\n- Never set mapStyle to a mapbox:// URL — MapLibre cannot load that scheme. Omit mapStyle for the host basemap, or use a token-free MapLibre https:// style URL.\n- Built-in mapStyle IDs are light and dark. New maps default to the app theme at creation; omit mapStyle on updates to preserve the saved selection. Never put tile API keys in map configs.\n- GeoArrowH3HexagonLayer: set getHexagon to \"@@=h3_column\" (or _sqlroomsBinding.hexagonColumn). When aggregating lon/lat, prefer h3_h3_to_string(h3_latlng_to_cell(lat, lon, res)) AS h3_cell (lat before lon).\n- GeoArrowArcLayer: bind WKB via _sqlroomsBinding.sourceGeometryColumn / targetGeometryColumn only (do not set getSourcePosition/getTargetPosition). Use ST_AsWKB(ST_Point(...)); set geometryEncodingHint to \"wkb\".\n- GeoArrowTripsLayer = animated path over time; GeoArrowArcLayer = static OD curve. Prefer TripsLayer for animated/trips/moving routes.\n- COLOR SCALE FIELD VARIANCE: Before choosing a numeric colorScale field, confirm it has real range (min < max / not all zeros or a single constant). Prefer SUMMARIZE table_name or SELECT min(col), max(col), count(DISTINCT col) FROM ... when unsure. Do NOT color by a flat column unless the user explicitly asks for that column by name. If no varying column exists, use a flat fill color instead of colorScale. Categorical fields need more than one distinct non-null value to be useful. Geometry, lon/lat, H3 index, and opaque ID columns are not useful color fields unless the user asks for them.`;\n}\n"]}
|
package/dist/mapConfig.d.ts
CHANGED
|
@@ -43,6 +43,7 @@ export type DeckMapConfig = {
|
|
|
43
43
|
spec: DeckJsonMapProps['spec'];
|
|
44
44
|
datasets: Record<string, DeckMapDatasetConfig>;
|
|
45
45
|
configMode?: DeckMapConfigMode;
|
|
46
|
+
/** Built-in basemap ID (`light`/`dark`) or custom style URL. */
|
|
46
47
|
mapStyle?: string;
|
|
47
48
|
mapProps?: Record<string, unknown>;
|
|
48
49
|
showLegends?: boolean;
|
|
@@ -51,9 +52,13 @@ export type DeckMapConfig = {
|
|
|
51
52
|
dataPolicy?: DeckMapDataPolicyOverride;
|
|
52
53
|
settingsOpen?: boolean;
|
|
53
54
|
};
|
|
55
|
+
/** Adds a creation-time basemap default while preserving explicit custom styles. */
|
|
56
|
+
export declare function withDefaultDeckMapStyle(config: DeckMapConfig): DeckMapConfig;
|
|
57
|
+
/** Retains a map's basemap on config replacement unless a new style is supplied. */
|
|
58
|
+
export declare function withPreservedDeckMapStyle(config: DeckMapConfig, previousConfig: DeckMapConfig | null): DeckMapConfig;
|
|
54
59
|
/** Creates the portable empty configuration used for a new Deck map. */
|
|
55
60
|
export declare function createEmptyDeckMapConfig(): DeckMapConfig;
|
|
56
|
-
/** Adapter-facing dashboard panel shape;
|
|
61
|
+
/** Adapter-facing dashboard panel shape; document resources never store it. */
|
|
57
62
|
export type DeckMapDashboardPanelConfig = DeckMapConfig;
|
|
58
63
|
export type DeckMapDashboardDatasetConfig = DeckMapDatasetConfig;
|
|
59
64
|
export type DeckMapDashboardDatasetSource = DeckMapDatasetSource;
|
package/dist/mapConfig.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfig.d.ts","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapConfig.d.ts","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"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"}
|
package/dist/mapConfig.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createId } from '@paralleldrive/cuid2';
|
|
2
|
+
import { getDefaultDeckMapStyle } from './mapStyles';
|
|
2
3
|
export const DECK_MAP_DASHBOARD_PANEL_TYPE = 'deck-json-map';
|
|
3
4
|
export const DEFAULT_DECK_MAP_MAX_DATA_POINTS = 100_000;
|
|
4
5
|
/** Returns whether a map dataset source is a pinned literal SQL query. */
|
|
@@ -9,15 +10,39 @@ export function isDeckMapSqlDatasetSource(source) {
|
|
|
9
10
|
export function isDeckMapTableDatasetSource(source) {
|
|
10
11
|
return Boolean(source && 'tableName' in source);
|
|
11
12
|
}
|
|
13
|
+
/** Adds a creation-time basemap default while preserving explicit custom styles. */
|
|
14
|
+
export function withDefaultDeckMapStyle(config) {
|
|
15
|
+
return config.mapStyle || config.mapProps?.mapStyle
|
|
16
|
+
? config
|
|
17
|
+
: { ...config, mapStyle: getDefaultDeckMapStyle() };
|
|
18
|
+
}
|
|
19
|
+
/** Retains a map's basemap on config replacement unless a new style is supplied. */
|
|
20
|
+
export function withPreservedDeckMapStyle(config, previousConfig) {
|
|
21
|
+
if (config.mapStyle || config.mapProps?.mapStyle)
|
|
22
|
+
return config;
|
|
23
|
+
if (previousConfig?.mapStyle) {
|
|
24
|
+
return { ...config, mapStyle: previousConfig.mapStyle };
|
|
25
|
+
}
|
|
26
|
+
if (previousConfig?.mapProps?.mapStyle) {
|
|
27
|
+
return {
|
|
28
|
+
...config,
|
|
29
|
+
mapProps: {
|
|
30
|
+
...config.mapProps,
|
|
31
|
+
mapStyle: previousConfig.mapProps.mapStyle,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return config;
|
|
36
|
+
}
|
|
12
37
|
/** Creates the portable empty configuration used for a new Deck map. */
|
|
13
38
|
export function createEmptyDeckMapConfig() {
|
|
14
|
-
return {
|
|
39
|
+
return withDefaultDeckMapStyle({
|
|
15
40
|
spec: {
|
|
16
41
|
initialViewState: { longitude: 0, latitude: 20, zoom: 1.5 },
|
|
17
42
|
layers: [],
|
|
18
43
|
},
|
|
19
44
|
datasets: {},
|
|
20
|
-
};
|
|
45
|
+
});
|
|
21
46
|
}
|
|
22
47
|
export const isDeckMapDashboardSqlDatasetSource = isDeckMapSqlDatasetSource;
|
|
23
48
|
export const isDeckMapDashboardTableDatasetSource = isDeckMapTableDatasetSource;
|
|
@@ -28,7 +53,7 @@ export function createDeckMapDashboardPanelConfig(options) {
|
|
|
28
53
|
id: createId(),
|
|
29
54
|
type: DECK_MAP_DASHBOARD_PANEL_TYPE,
|
|
30
55
|
title: title ?? 'Map',
|
|
31
|
-
config: JSON.parse(JSON.stringify(config)),
|
|
56
|
+
config: JSON.parse(JSON.stringify(withDefaultDeckMapStyle(config))),
|
|
32
57
|
};
|
|
33
58
|
}
|
|
34
59
|
/**
|
package/dist/mapConfig.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfig.js","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"mapConfig.js","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAOnD,MAAM,CAAC,MAAM,6BAA6B,GAAG,eAAe,CAAC;AAC7D,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAgBxD,0EAA0E;AAC1E,MAAM,UAAU,yBAAyB,CACvC,MAAwC;IAExC,OAAO,OAAO,CAAC,MAAM,IAAI,UAAU,IAAI,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,2BAA2B,CACzC,MAAwC;IAExC,OAAO,OAAO,CAAC,MAAM,IAAI,WAAW,IAAI,MAAM,CAAC,CAAC;AAClD,CAAC;AA4CD,oFAAoF;AACpF,MAAM,UAAU,uBAAuB,CAAC,MAAqB;IAC3D,OAAO,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ;QACjD,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,EAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,sBAAsB,EAAE,EAAC,CAAC;AACtD,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,yBAAyB,CACvC,MAAqB,EACrB,cAAoC;IAEpC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ;QAAE,OAAO,MAAM,CAAC;IAChE,IAAI,cAAc,EAAE,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAC,CAAC;IACxD,CAAC;IACD,IAAI,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACvC,OAAO;YACL,GAAG,MAAM;YACT,QAAQ,EAAE;gBACR,GAAG,MAAM,CAAC,QAAQ;gBAClB,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,QAAQ;aAC3C;SACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,wBAAwB;IACtC,OAAO,uBAAuB,CAAC;QAC7B,IAAI,EAAE;YACJ,gBAAgB,EAAE,EAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAC;YACzD,MAAM,EAAE,EAAE;SACX;QACD,QAAQ,EAAE,EAAE;KACb,CAAC,CAAC;AACL,CAAC;AASD,MAAM,CAAC,MAAM,kCAAkC,GAAG,yBAAyB,CAAC;AAC5E,MAAM,CAAC,MAAM,oCAAoC,GAAG,2BAA2B,CAAC;AAMhF,oEAAoE;AACpE,MAAM,UAAU,iCAAiC,CAC/C,OAAiD;IAEjD,MAAM,EAAC,KAAK,EAAE,GAAG,MAAM,EAAC,GAAG,OAAO,CAAC;IACnC,OAAO;QACL,EAAE,EAAE,QAAQ,EAAE;QACd,IAAI,EAAE,6BAA6B;QACnC,KAAK,EAAE,KAAK,IAAI,KAAK;QACrB,MAAM,EAAE,IAAI,CAAC,KAAK,CAChB,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CACrB;KAC7B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA+B;IAE/B,IACE,CAAC,MAAM,CAAC,IAAI;QACZ,CAAC,MAAM,CAAC,QAAQ;QAChB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAuB,CAAC;AACjC,CAAC","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {getDefaultDeckMapStyle} from './mapStyles';\nimport type {\n DeckJsonMapProps,\n DeckSqlDatasetInput,\n DeckTableDatasetInput,\n} from './types';\n\nexport const DECK_MAP_DASHBOARD_PANEL_TYPE = 'deck-json-map';\nexport const DEFAULT_DECK_MAP_MAX_DATA_POINTS = 100_000;\n\nexport type DeckMapDataPolicyOverride = {\n disabled?: boolean;\n maxRows?: number;\n reason?: string;\n};\n\nexport type DeckMapDatasetSource =\n | Pick<DeckSqlDatasetInput, 'sqlQuery'>\n | Pick<DeckTableDatasetInput, 'tableName' | 'transformSql'>;\n\nexport type DeckMapDatasetConfig = Omit<DeckSqlDatasetInput, 'sqlQuery'> & {\n source?: DeckMapDatasetSource;\n};\n\n/** Returns whether a map dataset source is a pinned literal SQL query. */\nexport function isDeckMapSqlDatasetSource(\n source: DeckMapDatasetSource | undefined,\n): source is Pick<DeckSqlDatasetInput, 'sqlQuery'> {\n return Boolean(source && 'sqlQuery' in source);\n}\n\n/** Returns whether a map dataset source is backed by a named table. */\nexport function isDeckMapTableDatasetSource(\n source: DeckMapDatasetSource | undefined,\n): source is Pick<DeckTableDatasetInput, 'tableName' | 'transformSql'> {\n return Boolean(source && 'tableName' in source);\n}\n\nexport type DeckMapInteractionConfig = {\n type: 'point-radius-brush';\n dataset: string;\n longitudeColumn: string;\n latitudeColumn: string;\n radiusMeters?: number;\n event?: 'hover' | 'click';\n};\n\nexport type DeckMapFitToDataConfig = {\n dataset: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n /**\n * Multiple geometry columns whose extents should be combined when fitting\n * the view. Used for arc layers that have separate source and target\n * geometries — a single `geometryColumn` would only cover one endpoint.\n */\n geometryColumns?: string[];\n h3Column?: string;\n padding?: number;\n maxZoom?: number;\n};\n\nexport type DeckMapConfigMode = 'basic' | 'custom';\n\n/** Durable, host-neutral Deck map configuration. */\nexport type DeckMapConfig = {\n spec: DeckJsonMapProps['spec'];\n datasets: Record<string, DeckMapDatasetConfig>;\n configMode?: DeckMapConfigMode;\n /** Built-in basemap ID (`light`/`dark`) or custom style URL. */\n mapStyle?: string;\n mapProps?: Record<string, unknown>;\n showLegends?: boolean;\n interaction?: DeckMapInteractionConfig;\n fitToData?: DeckMapFitToDataConfig;\n dataPolicy?: DeckMapDataPolicyOverride;\n settingsOpen?: boolean;\n};\n\n/** Adds a creation-time basemap default while preserving explicit custom styles. */\nexport function withDefaultDeckMapStyle(config: DeckMapConfig): DeckMapConfig {\n return config.mapStyle || config.mapProps?.mapStyle\n ? config\n : {...config, mapStyle: getDefaultDeckMapStyle()};\n}\n\n/** Retains a map's basemap on config replacement unless a new style is supplied. */\nexport function withPreservedDeckMapStyle(\n config: DeckMapConfig,\n previousConfig: DeckMapConfig | null,\n): DeckMapConfig {\n if (config.mapStyle || config.mapProps?.mapStyle) return config;\n if (previousConfig?.mapStyle) {\n return {...config, mapStyle: previousConfig.mapStyle};\n }\n if (previousConfig?.mapProps?.mapStyle) {\n return {\n ...config,\n mapProps: {\n ...config.mapProps,\n mapStyle: previousConfig.mapProps.mapStyle,\n },\n };\n }\n return config;\n}\n\n/** Creates the portable empty configuration used for a new Deck map. */\nexport function createEmptyDeckMapConfig(): DeckMapConfig {\n return withDefaultDeckMapStyle({\n spec: {\n initialViewState: {longitude: 0, latitude: 20, zoom: 1.5},\n layers: [],\n },\n datasets: {},\n });\n}\n\n/** Adapter-facing dashboard panel shape; document resources never store it. */\nexport type DeckMapDashboardPanelConfig = DeckMapConfig;\nexport type DeckMapDashboardDatasetConfig = DeckMapDatasetConfig;\nexport type DeckMapDashboardDatasetSource = DeckMapDatasetSource;\nexport type DeckMapDashboardInteractionConfig = DeckMapInteractionConfig;\nexport type DeckMapDashboardFitToDataConfig = DeckMapFitToDataConfig;\n\nexport const isDeckMapDashboardSqlDatasetSource = isDeckMapSqlDatasetSource;\nexport const isDeckMapDashboardTableDatasetSource = isDeckMapTableDatasetSource;\n\nexport type CreateDeckMapDashboardPanelConfigOptions = DeckMapConfig & {\n title?: string;\n};\n\n/** Creates a Mosaic panel only for the opt-in dashboard adapter. */\nexport function createDeckMapDashboardPanelConfig(\n options: CreateDeckMapDashboardPanelConfigOptions,\n) {\n const {title, ...config} = options;\n return {\n id: createId(),\n type: DECK_MAP_DASHBOARD_PANEL_TYPE,\n title: title ?? 'Map',\n config: JSON.parse(\n JSON.stringify(withDefaultDeckMapStyle(config)),\n ) as Record<string, unknown>,\n };\n}\n\n/**\n * Returns a record as a Deck map config when it has the required top-level\n * spec and dataset registry, otherwise returns `null`.\n */\nexport function asDeckJsonMapConfig(\n config: Record<string, unknown>,\n): DeckMapConfig | null {\n if (\n !config.spec ||\n !config.datasets ||\n typeof config.datasets !== 'object' ||\n Array.isArray(config.datasets)\n ) {\n return null;\n }\n return config as DeckMapConfig;\n}\n"]}
|
package/dist/mapConfigUtils.d.ts
CHANGED
|
@@ -38,6 +38,23 @@ export declare function createDeckMapPointTransformSql(options: {
|
|
|
38
38
|
latitudeColumn: string;
|
|
39
39
|
geometryColumn: string;
|
|
40
40
|
}): string;
|
|
41
|
+
/** Structured provenance for a table-backed longitude/latitude point dataset. */
|
|
42
|
+
export type DeckMapPointBinding = {
|
|
43
|
+
dataset: string;
|
|
44
|
+
longitudeColumn: string;
|
|
45
|
+
latitudeColumn: string;
|
|
46
|
+
geometryColumn?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Applies a structured longitude/latitude point binding to a native Deck map
|
|
50
|
+
* config. The generated geometry SQL intentionally comes from the same
|
|
51
|
+
* canonical helper used by first-party map builders.
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyDeckMapPointBinding<T extends DeckMapDashboardPanelConfig>(options: {
|
|
54
|
+
config: T;
|
|
55
|
+
pointBinding: DeckMapPointBinding;
|
|
56
|
+
sourceColumns: readonly DeckMapConfigColumn[];
|
|
57
|
+
}): T;
|
|
41
58
|
/**
|
|
42
59
|
* Post-normalizes an existing Deck map config so table-backed lon/lat datasets
|
|
43
60
|
* without `transformSql`, `sqlQuery`, or a native geometry column get a WKB
|
|
@@ -108,4 +125,9 @@ export declare function regenerateMapConfigForTable(panel: {
|
|
|
108
125
|
dataPolicy?: import("./mapConfig").DeckMapDataPolicyOverride;
|
|
109
126
|
settingsOpen?: boolean;
|
|
110
127
|
};
|
|
128
|
+
/**
|
|
129
|
+
* Applies a document map table pick: regenerate geospatial config when
|
|
130
|
+
* possible, otherwise retarget the single table-backed dataset.
|
|
131
|
+
*/
|
|
132
|
+
export declare function applyDeckMapTableSelection(config: DeckMapConfig, table: DataTable, longitudeColumn?: string, latitudeColumn?: string): DeckMapConfig;
|
|
111
133
|
//# sourceMappingURL=mapConfigUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/mapConfigUtils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getRawSqlTableReference, makeQualifiedTableName, quoteParsedRawSqlTableReference, } from '@sqlrooms/duckdb';
|
|
2
|
-
import { createDeckMapDashboardPanelConfig, } from './mapConfig';
|
|
2
|
+
import { createDeckMapDashboardPanelConfig, isDeckMapTableDatasetSource, } from './mapConfig';
|
|
3
3
|
import { DECK_TABLE_DATASET_SOURCE_RELATION } from './datasets/tableDatasetSql';
|
|
4
|
+
import { getDefaultDeckMapStyle } from './mapStyles';
|
|
4
5
|
const LONGITUDE_COLUMN_NAMES = ['longitude', 'lon', 'lng', 'long', 'x'];
|
|
5
6
|
const LATITUDE_COLUMN_NAMES = ['latitude', 'lat', 'y'];
|
|
6
7
|
const GEOMETRY_COLUMN_NAMES = ['geometry', 'geom'];
|
|
@@ -172,6 +173,7 @@ const DECK_MAP_POINT_LAYER_TYPES = new Set([
|
|
|
172
173
|
'GeoArrowScatterplotLayer',
|
|
173
174
|
'GeoArrowHeatmapLayer',
|
|
174
175
|
'GeoArrowColumnLayer',
|
|
176
|
+
'GeoJsonLayer',
|
|
175
177
|
]);
|
|
176
178
|
function isDeckMapConfigRecord(value) {
|
|
177
179
|
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
@@ -206,10 +208,15 @@ function normalizeDeckMapPointLayers(options) {
|
|
|
206
208
|
const binding = isDeckMapConfigRecord(layer._sqlroomsBinding)
|
|
207
209
|
? layer._sqlroomsBinding
|
|
208
210
|
: {};
|
|
211
|
+
const geometryBinding = { ...binding };
|
|
212
|
+
delete geometryBinding.longitudeColumn;
|
|
213
|
+
delete geometryBinding.latitudeColumn;
|
|
214
|
+
const pointLayer = { ...layer };
|
|
215
|
+
delete pointLayer.getPosition;
|
|
209
216
|
return {
|
|
210
|
-
...
|
|
217
|
+
...pointLayer,
|
|
211
218
|
_sqlroomsBinding: {
|
|
212
|
-
...
|
|
219
|
+
...geometryBinding,
|
|
213
220
|
dataset: typeof binding.dataset === 'string'
|
|
214
221
|
? binding.dataset
|
|
215
222
|
: options.datasetId,
|
|
@@ -219,6 +226,108 @@ function normalizeDeckMapPointLayers(options) {
|
|
|
219
226
|
});
|
|
220
227
|
return (changed ? layers : options.layers);
|
|
221
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Applies a structured longitude/latitude point binding to a native Deck map
|
|
231
|
+
* config. The generated geometry SQL intentionally comes from the same
|
|
232
|
+
* canonical helper used by first-party map builders.
|
|
233
|
+
*/
|
|
234
|
+
export function applyDeckMapPointBinding(options) {
|
|
235
|
+
const { config, pointBinding } = options;
|
|
236
|
+
const datasetId = pointBinding.dataset.trim();
|
|
237
|
+
const longitudeColumn = pointBinding.longitudeColumn.trim();
|
|
238
|
+
const latitudeColumn = pointBinding.latitudeColumn.trim();
|
|
239
|
+
if (!datasetId || !longitudeColumn || !latitudeColumn) {
|
|
240
|
+
throw new Error('Point binding requires dataset, longitudeColumn, and latitudeColumn.');
|
|
241
|
+
}
|
|
242
|
+
const dataset = config.datasets[datasetId];
|
|
243
|
+
if (!dataset) {
|
|
244
|
+
throw new Error(`Point binding references unknown dataset "${datasetId}".`);
|
|
245
|
+
}
|
|
246
|
+
if (!isDeckMapTableDatasetSource(dataset.source)) {
|
|
247
|
+
throw new Error(`Point binding dataset "${datasetId}" must use source.tableName.`);
|
|
248
|
+
}
|
|
249
|
+
const geometryColumn = pointBinding.geometryColumn?.trim() || DEFAULT_GEOMETRY_COLUMN;
|
|
250
|
+
const sourceColumnNames = new Set(options.sourceColumns.map((column) => column.name.toLowerCase()));
|
|
251
|
+
for (const [bindingName, columnName] of [
|
|
252
|
+
['longitudeColumn', longitudeColumn],
|
|
253
|
+
['latitudeColumn', latitudeColumn],
|
|
254
|
+
]) {
|
|
255
|
+
if (!sourceColumnNames.has(columnName.toLowerCase())) {
|
|
256
|
+
throw new Error(`Point binding ${bindingName} "${columnName}" was not found in source columns.`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (sourceColumnNames.has(geometryColumn.toLowerCase())) {
|
|
260
|
+
throw new Error(`Point binding geometryColumn "${geometryColumn}" conflicts with an existing source column.`);
|
|
261
|
+
}
|
|
262
|
+
const datasetIds = Object.keys(config.datasets);
|
|
263
|
+
let parsedSpec = config.spec;
|
|
264
|
+
if (typeof parsedSpec === 'string') {
|
|
265
|
+
try {
|
|
266
|
+
parsedSpec = JSON.parse(parsedSpec);
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Durable resource validation reports the invalid serialized spec.
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const spec = isDeckMapConfigRecord(parsedSpec)
|
|
273
|
+
? {
|
|
274
|
+
...parsedSpec,
|
|
275
|
+
...(Array.isArray(parsedSpec.layers)
|
|
276
|
+
? {
|
|
277
|
+
layers: normalizeDeckMapPointLayers({
|
|
278
|
+
layers: parsedSpec.layers,
|
|
279
|
+
datasetId,
|
|
280
|
+
datasetIds,
|
|
281
|
+
geometryColumn,
|
|
282
|
+
}),
|
|
283
|
+
}
|
|
284
|
+
: {}),
|
|
285
|
+
}
|
|
286
|
+
: parsedSpec;
|
|
287
|
+
let fitToData = config.fitToData;
|
|
288
|
+
if (isDeckMapConfigRecord(fitToData) && fitToData.dataset === datasetId) {
|
|
289
|
+
const geometryFit = { ...fitToData };
|
|
290
|
+
delete geometryFit.longitudeColumn;
|
|
291
|
+
delete geometryFit.latitudeColumn;
|
|
292
|
+
delete geometryFit.geometryColumns;
|
|
293
|
+
delete geometryFit.h3Column;
|
|
294
|
+
fitToData = { ...geometryFit, geometryColumn };
|
|
295
|
+
}
|
|
296
|
+
else if (!fitToData) {
|
|
297
|
+
fitToData = {
|
|
298
|
+
dataset: datasetId,
|
|
299
|
+
geometryColumn,
|
|
300
|
+
padding: 40,
|
|
301
|
+
maxZoom: 12,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
const interaction = config.interaction?.type === 'point-radius-brush' &&
|
|
305
|
+
config.interaction.dataset === datasetId
|
|
306
|
+
? { ...config.interaction, longitudeColumn, latitudeColumn }
|
|
307
|
+
: config.interaction;
|
|
308
|
+
return {
|
|
309
|
+
...config,
|
|
310
|
+
spec,
|
|
311
|
+
...(interaction !== config.interaction ? { interaction } : {}),
|
|
312
|
+
datasets: {
|
|
313
|
+
...config.datasets,
|
|
314
|
+
[datasetId]: {
|
|
315
|
+
...dataset,
|
|
316
|
+
source: {
|
|
317
|
+
tableName: dataset.source.tableName,
|
|
318
|
+
transformSql: createDeckMapPointTransformSql({
|
|
319
|
+
longitudeColumn,
|
|
320
|
+
latitudeColumn,
|
|
321
|
+
geometryColumn,
|
|
322
|
+
}),
|
|
323
|
+
},
|
|
324
|
+
geometryColumn,
|
|
325
|
+
geometryEncodingHint: 'wkb',
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
fitToData,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
222
331
|
/**
|
|
223
332
|
* Post-normalizes an existing Deck map config so table-backed lon/lat datasets
|
|
224
333
|
* without `transformSql`, `sqlQuery`, or a native geometry column get a WKB
|
|
@@ -441,7 +550,7 @@ export function createDeckMapConfigForTable(options) {
|
|
|
441
550
|
},
|
|
442
551
|
}
|
|
443
552
|
: {}),
|
|
444
|
-
|
|
553
|
+
mapStyle: options.mapStyle ?? getDefaultDeckMapStyle(),
|
|
445
554
|
};
|
|
446
555
|
}
|
|
447
556
|
export const createDeckMapDashboardConfigForTable = createDeckMapConfigForTable;
|
|
@@ -480,7 +589,11 @@ export function regenerateMapConfigForTable(panel, table, longitudeColumn, latit
|
|
|
480
589
|
});
|
|
481
590
|
const nextDataset = Object.values(nextConfig.datasets)[0];
|
|
482
591
|
if (existingDatasetIds.length === 0) {
|
|
483
|
-
return
|
|
592
|
+
return {
|
|
593
|
+
...nextConfig,
|
|
594
|
+
mapStyle: existingConfig.mapStyle,
|
|
595
|
+
mapProps: existingConfig.mapProps,
|
|
596
|
+
};
|
|
484
597
|
}
|
|
485
598
|
if (existingDatasetIds.length === 1 && nextDataset) {
|
|
486
599
|
const datasetId = existingDatasetIds[0];
|
|
@@ -501,4 +614,38 @@ export function regenerateMapConfigForTable(panel, table, longitudeColumn, latit
|
|
|
501
614
|
fitToData: nextConfig.fitToData ?? existingConfig.fitToData,
|
|
502
615
|
};
|
|
503
616
|
}
|
|
617
|
+
/**
|
|
618
|
+
* Applies a document map table pick: regenerate geospatial config when
|
|
619
|
+
* possible, otherwise retarget the single table-backed dataset.
|
|
620
|
+
*/
|
|
621
|
+
export function applyDeckMapTableSelection(config, table, longitudeColumn, latitudeColumn) {
|
|
622
|
+
const regenerated = regenerateMapConfigForTable({ config }, table, longitudeColumn, latitudeColumn);
|
|
623
|
+
if (regenerated !== config) {
|
|
624
|
+
return regenerated;
|
|
625
|
+
}
|
|
626
|
+
const datasetIds = Object.keys(config.datasets ?? {});
|
|
627
|
+
if (datasetIds.length !== 1)
|
|
628
|
+
return config;
|
|
629
|
+
const datasetId = datasetIds[0];
|
|
630
|
+
const dataset = config.datasets[datasetId];
|
|
631
|
+
if (!dataset || !isDeckMapTableDatasetSource(dataset.source)) {
|
|
632
|
+
return config;
|
|
633
|
+
}
|
|
634
|
+
const tableName = quoteDeckMapSqlTableReference(table.table);
|
|
635
|
+
if (dataset.source.tableName === tableName)
|
|
636
|
+
return config;
|
|
637
|
+
return {
|
|
638
|
+
...config,
|
|
639
|
+
datasets: {
|
|
640
|
+
...config.datasets,
|
|
641
|
+
[datasetId]: {
|
|
642
|
+
...dataset,
|
|
643
|
+
source: {
|
|
644
|
+
...dataset.source,
|
|
645
|
+
tableName,
|
|
646
|
+
},
|
|
647
|
+
},
|
|
648
|
+
},
|
|
649
|
+
};
|
|
650
|
+
}
|
|
504
651
|
//# sourceMappingURL=mapConfigUtils.js.map
|