@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.
Files changed (154) hide show
  1. package/README.md +193 -35
  2. package/dist/BlockMapSettings.d.ts.map +1 -1
  3. package/dist/BlockMapSettings.js +4 -16
  4. package/dist/BlockMapSettings.js.map +1 -1
  5. package/dist/DashboardMapSettings.d.ts.map +1 -1
  6. package/dist/DashboardMapSettings.js +7 -10
  7. package/dist/DashboardMapSettings.js.map +1 -1
  8. package/dist/DeckJsonMap.d.ts.map +1 -1
  9. package/dist/DeckJsonMap.js +75 -23
  10. package/dist/DeckJsonMap.js.map +1 -1
  11. package/dist/DeckJsonMapSpec.d.ts +41 -0
  12. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  13. package/dist/DeckJsonMapSpec.js +2 -0
  14. package/dist/DeckJsonMapSpec.js.map +1 -1
  15. package/dist/DeckMapBasemapSelect.d.ts +9 -0
  16. package/dist/DeckMapBasemapSelect.d.ts.map +1 -0
  17. package/dist/DeckMapBasemapSelect.js +20 -0
  18. package/dist/DeckMapBasemapSelect.js.map +1 -0
  19. package/dist/DeckMapDefaultStylesProvider.d.ts +13 -19
  20. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
  21. package/dist/DeckMapDefaultStylesProvider.js +11 -18
  22. package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
  23. package/dist/DeckMapSurface.d.ts +1 -1
  24. package/dist/DeckMapSurface.js +1 -1
  25. package/dist/DeckMapSurface.js.map +1 -1
  26. package/dist/DeckMapsSlice.d.ts +5 -0
  27. package/dist/DeckMapsSlice.d.ts.map +1 -1
  28. package/dist/DeckMapsSlice.js +6 -3
  29. package/dist/DeckMapsSlice.js.map +1 -1
  30. package/dist/MapSettings.d.ts +14 -0
  31. package/dist/MapSettings.d.ts.map +1 -1
  32. package/dist/MapSettings.js +548 -192
  33. package/dist/MapSettings.js.map +1 -1
  34. package/dist/MapSettingsControls.d.ts +8 -1
  35. package/dist/MapSettingsControls.d.ts.map +1 -1
  36. package/dist/MapSettingsControls.js +24 -2
  37. package/dist/MapSettingsControls.js.map +1 -1
  38. package/dist/ai.d.ts.map +1 -1
  39. package/dist/ai.js +20 -12
  40. package/dist/ai.js.map +1 -1
  41. package/dist/aiNormalize.d.ts.map +1 -1
  42. package/dist/aiNormalize.js +2 -1
  43. package/dist/aiNormalize.js.map +1 -1
  44. package/dist/basemap.d.ts +23 -0
  45. package/dist/basemap.d.ts.map +1 -0
  46. package/dist/basemap.js +23 -0
  47. package/dist/basemap.js.map +1 -0
  48. package/dist/block.d.ts +1 -1
  49. package/dist/block.d.ts.map +1 -1
  50. package/dist/block.js +13 -9
  51. package/dist/block.js.map +1 -1
  52. package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
  53. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
  54. package/dist/createOrUpdateDeckMapResource.js +57 -4
  55. package/dist/createOrUpdateDeckMapResource.js.map +1 -1
  56. package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
  57. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
  58. package/dist/datasets/PreparedDatasetStore.js +4 -8
  59. package/dist/datasets/PreparedDatasetStore.js.map +1 -1
  60. package/dist/datasets/helpers.d.ts +39 -2
  61. package/dist/datasets/helpers.d.ts.map +1 -1
  62. package/dist/datasets/helpers.js +86 -3
  63. package/dist/datasets/helpers.js.map +1 -1
  64. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
  65. package/dist/datasets/usePreparedDatasetStates.js +12 -8
  66. package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
  67. package/dist/index.d.ts +6 -3
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +5 -2
  70. package/dist/index.js.map +1 -1
  71. package/dist/json/colorScaleFunction.d.ts +12 -4
  72. package/dist/json/colorScaleFunction.d.ts.map +1 -1
  73. package/dist/json/colorScaleFunction.js.map +1 -1
  74. package/dist/json/compileColorScale.d.ts +3 -2
  75. package/dist/json/compileColorScale.d.ts.map +1 -1
  76. package/dist/json/compileColorScale.js +16 -1
  77. package/dist/json/compileColorScale.js.map +1 -1
  78. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  79. package/dist/json/createDeckJsonConfiguration.js +235 -175
  80. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  81. package/dist/json/defaultClasses.d.ts.map +1 -1
  82. package/dist/json/defaultClasses.js +3 -3
  83. package/dist/json/defaultClasses.js.map +1 -1
  84. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  85. package/dist/json/extractColorScaleLegends.js +41 -26
  86. package/dist/json/extractColorScaleLegends.js.map +1 -1
  87. package/dist/json/heatmapDefaults.d.ts +17 -7
  88. package/dist/json/heatmapDefaults.d.ts.map +1 -1
  89. package/dist/json/heatmapDefaults.js +54 -12
  90. package/dist/json/heatmapDefaults.js.map +1 -1
  91. package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
  92. package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
  93. package/dist/json/layers/DeckHeatmapLayer.js +69 -0
  94. package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
  95. package/dist/json/layers/index.d.ts +1 -0
  96. package/dist/json/layers/index.d.ts.map +1 -1
  97. package/dist/json/layers/index.js +1 -0
  98. package/dist/json/layers/index.js.map +1 -1
  99. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  100. package/dist/json/rewriteGeoArrowAccessors.js +13 -5
  101. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  102. package/dist/json/scaleFunction.d.ts +5 -8
  103. package/dist/json/scaleFunction.d.ts.map +1 -1
  104. package/dist/json/scaleFunction.js +30 -5
  105. package/dist/json/scaleFunction.js.map +1 -1
  106. package/dist/mapAiConfig.d.ts +6 -0
  107. package/dist/mapAiConfig.d.ts.map +1 -1
  108. package/dist/mapAiConfig.js +7 -0
  109. package/dist/mapAiConfig.js.map +1 -1
  110. package/dist/mapAiSharedInstructions.d.ts +1 -1
  111. package/dist/mapAiSharedInstructions.d.ts.map +1 -1
  112. package/dist/mapAiSharedInstructions.js +4 -3
  113. package/dist/mapAiSharedInstructions.js.map +1 -1
  114. package/dist/mapConfig.d.ts +6 -1
  115. package/dist/mapConfig.d.ts.map +1 -1
  116. package/dist/mapConfig.js +28 -3
  117. package/dist/mapConfig.js.map +1 -1
  118. package/dist/mapConfigUtils.d.ts +22 -0
  119. package/dist/mapConfigUtils.d.ts.map +1 -1
  120. package/dist/mapConfigUtils.js +152 -5
  121. package/dist/mapConfigUtils.js.map +1 -1
  122. package/dist/mapLayerConfigUtils.d.ts +55 -0
  123. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  124. package/dist/mapLayerConfigUtils.js +222 -11
  125. package/dist/mapLayerConfigUtils.js.map +1 -1
  126. package/dist/mapResourceAuthoring.d.ts +1 -1
  127. package/dist/mapResourceAuthoring.d.ts.map +1 -1
  128. package/dist/mapResourceAuthoring.js +14 -7
  129. package/dist/mapResourceAuthoring.js.map +1 -1
  130. package/dist/mapStyles.d.ts +16 -0
  131. package/dist/mapStyles.d.ts.map +1 -0
  132. package/dist/mapStyles.js +32 -0
  133. package/dist/mapStyles.js.map +1 -0
  134. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
  135. package/dist/prepare/prepareDeckDataset.js +1 -0
  136. package/dist/prepare/prepareDeckDataset.js.map +1 -1
  137. package/dist/prepare/types.d.ts +3 -0
  138. package/dist/prepare/types.d.ts.map +1 -1
  139. package/dist/prepare/types.js.map +1 -1
  140. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  141. package/dist/prepare/wkbDecoder.js +62 -16
  142. package/dist/prepare/wkbDecoder.js.map +1 -1
  143. package/dist/prepare/wkbParser.d.ts +2 -0
  144. package/dist/prepare/wkbParser.d.ts.map +1 -1
  145. package/dist/prepare/wkbParser.js +1 -0
  146. package/dist/prepare/wkbParser.js.map +1 -1
  147. package/dist/protomapsStyles.d.ts +18 -0
  148. package/dist/protomapsStyles.d.ts.map +1 -0
  149. package/dist/protomapsStyles.js +38 -0
  150. package/dist/protomapsStyles.js.map +1 -0
  151. package/dist/types.d.ts +13 -0
  152. package/dist/types.d.ts.map +1 -1
  153. package/dist/types.js.map +1 -1
  154. 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"]}
@@ -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;AAwCtB,kFAAkF;AAClF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBN,CAAC;AAEtC,mFAAmF;AACnF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBxC,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"}
@@ -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()
@@ -1 +1 @@
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';\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\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 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
+ {"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,3 +1,3 @@
1
- /** Shared Deck map AI rules for dashboard and worksheet prompts. */
1
+ /** Shared Deck map AI rules for dashboard and document prompts. */
2
2
  export declare function getDeckMapSharedAiContractRules(): string;
3
3
  //# sourceMappingURL=mapAiSharedInstructions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapAiSharedInstructions.d.ts","sourceRoot":"","sources":["../src/mapAiSharedInstructions.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,wBAAgB,+BAA+B,IAAI,MAAM,CAYxD"}
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 worksheet prompts. */
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 worksheet):
6
- - Scatterplot/Heatmap/Column require Point positions — do not bind them to Polygon/MultiPolygon geom. Prefer GeoArrowPolygonLayer / GeoArrowSolidPolygonLayer 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.
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,oEAAoE;AACpE,MAAM,UAAU,+BAA+B;IAC7C,MAAM,GAAG,GAAG,kCAAkC,CAAC;IAC/C,OAAO;kYACyX,GAAG;;;;;;;;qlBAQgN,CAAC;AACtlB,CAAC","sourcesContent":["import {DECK_TABLE_DATASET_SOURCE_RELATION} from './datasets/tableDatasetSql';\n\n/** Shared Deck map AI rules for dashboard and worksheet prompts. */\nexport function getDeckMapSharedAiContractRules(): string {\n const src = DECK_TABLE_DATASET_SOURCE_RELATION;\n return `Shared Deck map authoring rules (dashboard and worksheet):\n- Scatterplot/Heatmap/Column require Point positions — do not bind them to Polygon/MultiPolygon geom. Prefer GeoArrowPolygonLayer / GeoArrowSolidPolygonLayer 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- 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"]}
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"]}
@@ -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; worksheet resources never store it. */
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;
@@ -1 +1 @@
1
- {"version":3,"file":"mapConfig.d.ts","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"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"}
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mapConfig.js","sourceRoot":"","sources":["../src/mapConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAO9C,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;AA2CD,wEAAwE;AACxE,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,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;AACJ,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,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAA4B;KACtE,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 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 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/** Creates the portable empty configuration used for a new Deck map. */\nexport function createEmptyDeckMapConfig(): DeckMapConfig {\n return {\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; worksheet 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(JSON.stringify(config)) 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"]}
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"]}
@@ -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":"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"}
1
+ {"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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"}
@@ -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
- ...layer,
217
+ ...pointLayer,
211
218
  _sqlroomsBinding: {
212
- ...binding,
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
- ...(options.mapStyle ? { mapStyle: options.mapStyle } : {}),
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 nextConfig;
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