@altertable/data-app 0.65.0 → 0.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/AGENTS.md +38 -1
  2. package/CONTRIBUTING.md +37 -3
  3. package/README.md +1 -1
  4. package/dist/chunks/{contract-sm7j7k95.js → contract-13j5zb3c.js} +2 -144
  5. package/dist/chunks/contract-13j5zb3c.js.map +13 -0
  6. package/dist/chunks/contract-19ckn3n7.js +78 -0
  7. package/dist/chunks/contract-19ckn3n7.js.map +10 -0
  8. package/dist/chunks/{contract-a061yj6r.js → contract-e11m4y7f.js} +34 -70
  9. package/dist/chunks/contract-e11m4y7f.js.map +12 -0
  10. package/dist/chunks/{contract-g6hky7x6.js → contract-h8a6f559.js} +8 -4
  11. package/dist/chunks/contract-h8a6f559.js.map +12 -0
  12. package/dist/chunks/contract-havnjmdr.js +13011 -0
  13. package/dist/chunks/contract-havnjmdr.js.map +99 -0
  14. package/dist/chunks/{contract-txjy0en2.js → contract-m6n8ctfc.js} +64 -72
  15. package/dist/chunks/contract-m6n8ctfc.js.map +10 -0
  16. package/dist/chunks/contract-pk603qj7.js +146 -0
  17. package/dist/chunks/contract-pk603qj7.js.map +10 -0
  18. package/dist/chunks/{contract-yxbjea23.js → contract-rfbakka4.js} +179 -2
  19. package/dist/chunks/contract-rfbakka4.js.map +13 -0
  20. package/dist/client/index.js +11 -6
  21. package/dist/client/index.js.map +1 -1
  22. package/dist/core/appearance.js +1 -1
  23. package/dist/core/contract.js +13 -3
  24. package/dist/core/contract.js.map +1 -1
  25. package/dist/embed/index.js +9 -7
  26. package/dist/embed/index.js.map +2 -2
  27. package/dist/local.js +1 -1
  28. package/dist/local.js.map +2 -2
  29. package/dist/react/embed/index.js +1 -1
  30. package/dist/react/index.js +2532 -11545
  31. package/dist/react/index.js.map +16 -91
  32. package/dist/react/ui/index.js +1614 -0
  33. package/dist/react/ui/index.js.map +22 -0
  34. package/dist/server.js +1 -1
  35. package/dist/server.js.map +2 -2
  36. package/dist/types/client/annotations.d.ts +23 -0
  37. package/dist/types/client/index.d.ts +1 -0
  38. package/dist/types/core/annotations.d.ts +92 -0
  39. package/dist/types/core/appearance.d.ts +2 -2
  40. package/dist/types/core/contract.d.ts +2 -0
  41. package/dist/types/core/presentation.d.ts +2 -0
  42. package/dist/types/core/variables.d.ts +2 -5
  43. package/dist/types/react/annotations/AnnotationBar.d.ts +24 -0
  44. package/dist/types/react/annotations/AnnotationControls.d.ts +10 -0
  45. package/dist/types/react/annotations/AnnotationEditor.d.ts +15 -0
  46. package/dist/types/react/annotations/AnnotationMarkers.d.ts +19 -0
  47. package/dist/types/react/annotations/AnnotationSelectionLayer.d.ts +12 -0
  48. package/dist/types/react/annotations/AnnotationTarget.d.ts +9 -0
  49. package/dist/types/react/annotations/AnnotationTooltip.d.ts +9 -0
  50. package/dist/types/react/annotations/AnnotationTrigger.d.ts +10 -0
  51. package/dist/types/react/annotations/annotation-editor-state.d.ts +56 -0
  52. package/dist/types/react/annotations/annotation-screenshot.d.ts +4 -0
  53. package/dist/types/react/annotations/annotation-targets.d.ts +33 -0
  54. package/dist/types/react/annotations/getAnnotationProps.d.ts +15 -0
  55. package/dist/types/react/annotations/styles.d.ts +3 -0
  56. package/dist/types/react/annotations/useAnnotationGeometry.d.ts +22 -0
  57. package/dist/types/react/annotations/useDataAppAnnotations.d.ts +19 -0
  58. package/dist/types/react/bindings.d.ts +110 -0
  59. package/dist/types/react/content.d.ts +24 -11
  60. package/dist/types/react/hooks.d.ts +29 -787
  61. package/dist/types/react/index.d.ts +30 -105
  62. package/dist/types/react/source-owner.d.ts +2 -0
  63. package/dist/types/react/style-contract.d.ts +60 -0
  64. package/dist/types/react/style-validation.d.ts +2 -0
  65. package/dist/types/react/ui/AboutData.d.ts +9 -1
  66. package/dist/types/react/ui/AppHeader.d.ts +1 -2
  67. package/dist/types/react/ui/AppLayout.d.ts +3 -9
  68. package/dist/types/react/ui/AppToolbar.d.ts +5 -8
  69. package/dist/types/react/ui/AreaChart.d.ts +7 -0
  70. package/dist/types/react/ui/BarChart.d.ts +6 -0
  71. package/dist/types/react/ui/{ComparisonVisual.d.ts → Comparison.d.ts} +3 -3
  72. package/dist/types/react/ui/ContentSkeleton.d.ts +2 -0
  73. package/dist/types/react/ui/DataApp.d.ts +17 -58
  74. package/dist/types/react/ui/DataAppFrame.d.ts +42 -0
  75. package/dist/types/react/ui/DataBoundary.d.ts +4 -5
  76. package/dist/types/react/ui/DataSection.d.ts +6 -18
  77. package/dist/types/react/ui/DataSectionBoundary.d.ts +30 -0
  78. package/dist/types/react/ui/DataValue.d.ts +9 -0
  79. package/dist/types/react/ui/DataWidget.d.ts +2 -1
  80. package/dist/types/react/ui/DateTimeTooltip.d.ts +1 -1
  81. package/dist/types/react/ui/ExportControl.d.ts +1 -1
  82. package/dist/types/react/ui/HelpPopover.d.ts +3 -4
  83. package/dist/types/react/ui/InspectionContext.d.ts +2 -0
  84. package/dist/types/react/ui/InspectionProvider.d.ts +29 -0
  85. package/dist/types/react/ui/LineChart.d.ts +7 -0
  86. package/dist/types/react/ui/MetricWidget.d.ts +4 -3
  87. package/dist/types/react/ui/PieChart.d.ts +8 -0
  88. package/dist/types/react/ui/PresentStory.d.ts +2 -5
  89. package/dist/types/react/ui/RefreshControl.d.ts +1 -2
  90. package/dist/types/react/ui/ScatterChart.d.ts +17 -0
  91. package/dist/types/react/ui/SearchField.d.ts +1 -2
  92. package/dist/types/react/ui/SearchInput.d.ts +3 -1
  93. package/dist/types/react/ui/Sheet.d.ts +2 -1
  94. package/dist/types/react/ui/Skeleton.d.ts +5 -2
  95. package/dist/types/react/ui/StaticDataApp.d.ts +4 -0
  96. package/dist/types/react/ui/TableWidget.d.ts +19 -16
  97. package/dist/types/react/ui/Tabs.d.ts +6 -2
  98. package/dist/types/react/ui/TextWidget.d.ts +2 -1
  99. package/dist/types/react/ui/Tooltip.d.ts +4 -3
  100. package/dist/types/react/ui/TrendChart.d.ts +5 -0
  101. package/dist/types/react/ui/UpdatedAt.d.ts +1 -1
  102. package/dist/types/react/ui/VisualizationWidget.d.ts +12 -13
  103. package/dist/types/react/ui/WidgetViewTabs.d.ts +1 -1
  104. package/dist/types/react/ui/chart-data.d.ts +25 -0
  105. package/dist/types/react/ui/data-context.d.ts +18 -7
  106. package/dist/types/react/ui/icons.d.ts +1 -0
  107. package/dist/types/react/ui/index.d.ts +74 -0
  108. package/dist/types/react/ui/metric.d.ts +1 -1
  109. package/dist/types/react/ui/presentation.d.ts +5 -1
  110. package/dist/types/react/ui/shortcuts.d.ts +7 -1
  111. package/dist/types/react/view-runtime.d.ts +29 -0
  112. package/dist/types/react/view.d.ts +21 -4
  113. package/dist/types/react/widgets.d.ts +79 -0
  114. package/docs/app-authoring.md +58 -50
  115. package/docs/data-context.md +89 -0
  116. package/docs/formatting-and-appearance.md +52 -0
  117. package/docs/hosted-apps.md +0 -13
  118. package/docs/layout.md +4 -2
  119. package/docs/react-embed.md +2 -2
  120. package/docs/react.md +20 -316
  121. package/docs/stories-and-export.md +52 -0
  122. package/docs/styling.md +55 -0
  123. package/docs/ui-quality.md +20 -0
  124. package/docs/ui.md +41 -0
  125. package/docs/variables.md +98 -0
  126. package/docs/views.md +127 -0
  127. package/docs/widgets.md +142 -0
  128. package/examples/starter-data-app/index.tsx +82 -55
  129. package/package.json +12 -4
  130. package/dist/chunks/contract-a061yj6r.js.map +0 -12
  131. package/dist/chunks/contract-g6hky7x6.js.map +0 -12
  132. package/dist/chunks/contract-sm7j7k95.js.map +0 -14
  133. package/dist/chunks/contract-txjy0en2.js.map +0 -10
  134. package/dist/chunks/contract-yxbjea23.js.map +0 -12
  135. package/dist/types/react/ui/RefreshRegion.d.ts +0 -9
  136. package/dist/types/react/ui/SelectableBarChart.d.ts +0 -15
  137. package/docs/releasing.md +0 -79
  138. /package/dist/types/react/ui/{comparison.d.ts → metric-comparison.d.ts} +0 -0
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/contract.ts", "../src/core/invariant.ts", "../src/core/dimension.ts", "../src/core/annotations.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Shared operation contracts and input/output validation for browser and server.\n * @module @altertable/data-app/contract\n * @see https://github.com/altertable-ai/data-app/blob/main/docs/contract.md\n */\nimport { parseDate, today } from '@internationalized/date';\nimport { formatDateRange } from '@/src/core/format';\nimport { invariant } from '@/src/core/invariant';\nimport type { DateRange as DateRangeInput } from '@/src/core/date-range';\nimport type {\n QueryResult,\n DataOperation,\n OperationContext,\n} from '@/src/core/operation-types';\nexport type {\n QueryResult,\n DisclosedQuery,\n Lakehouse,\n OperationContext,\n DataOperation,\n DataOperations,\n} from '@/src/core/operation-types';\n\nexport function parseEmptyInput(value: unknown): Record<string, never> {\n invariant(\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0,\n 'This operation takes no inputs.'\n );\n\n return {};\n}\n\nexport function parseTrue(value: unknown): true {\n invariant(value === true, 'Expected a successful check.');\n\n return true;\n}\n\nexport type { DateRange as DateRangeInput } from '@/src/core/date-range';\nexport type DateRangeRequest = {\n range: DateRangeInput;\n comparison: DateRangeInput | null;\n};\n\n/** The immediately preceding, equally long set of calendar days. */\nexport function previousDateRange({\n start,\n end,\n}: DateRangeInput): DateRangeInput {\n const first = parseDate(start);\n const last = parseDate(end);\n const days =\n (last.toDate('UTC').getTime() - first.toDate('UTC').getTime()) /\n 86_400_000 +\n 1;\n invariant(days >= 1, 'Date range must start before it ends.');\n const previousEnd = first.subtract({ days: 1 });\n\n return {\n start: previousEnd.subtract({ days: days - 1 }).toString(),\n end: previousEnd.toString(),\n };\n}\n\nexport type ReportingPeriod =\n | { kind: 'rolling'; amount: number; unit: 'hour' | 'day'; end: string }\n | { kind: 'calendar'; start: string; end: string; timeZone: string };\n\nexport type DateRangeContractOptions = {\n minDate?: string;\n maxDate?: string | (() => string);\n maxRangeDays: number;\n timeZone: string;\n completeDays?: boolean;\n};\n\n/** One source policy for the server parser, URL variable, and displayed reporting period. */\nexport function defineDateRangeContract(options: DateRangeContractOptions) {\n invariant(\n Number.isInteger(options.maxRangeDays) && options.maxRangeDays > 0,\n 'Date range needs a positive maxRangeDays.'\n );\n if (options.minDate) parseDate(options.minDate);\n if (typeof options.maxDate === 'string') parseDate(options.maxDate);\n today(options.timeZone);\n\n function bounds() {\n const latest = today(options.timeZone).subtract({\n days: options.completeDays === false ? 0 : 1,\n });\n const sourceMax =\n typeof options.maxDate === 'function'\n ? options.maxDate()\n : options.maxDate;\n const maxDate =\n sourceMax && parseDate(sourceMax).compare(latest) < 0\n ? parseDate(sourceMax).toString()\n : latest.toString();\n\n return {\n minDate: options.minDate,\n maxDate,\n maxRangeDays: options.maxRangeDays,\n timeZone: options.timeZone,\n };\n }\n\n function period({ start, end }: DateRangeInput): ReportingPeriod {\n return {\n kind: 'calendar',\n start,\n end,\n timeZone: options.timeZone,\n };\n }\n\n function describeInput(input: DateRangeInput) {\n return `${formatDateRange(input)} ${options.timeZone}`;\n }\n\n function comparison(input: DateRangeInput): DateRangeInput | null {\n const previous = previousDateRange(input);\n\n return options.minDate && previous.start < options.minDate\n ? null\n : previous;\n }\n\n function request(value: unknown, compare = false): DateRangeRequest {\n const range = parseDateRangeInput(value, bounds());\n const previous = compare ? comparison(range) : null;\n invariant(\n !compare || previous,\n 'Comparison is outside available source coverage.'\n );\n\n return { range, comparison: previous };\n }\n\n function parseRequest(value: unknown): DateRangeRequest {\n invariant(value && typeof value === 'object', 'Choose a date range.');\n const input = value as Record<string, unknown>;\n const parsed = request(input.range, input.comparison != null);\n if (input.comparison != null) {\n const supplied = parseDateRangeInput(input.comparison, bounds());\n invariant(\n supplied.start === parsed.comparison?.start &&\n supplied.end === parsed.comparison?.end,\n 'Comparison must be the preceding equal-length range.'\n );\n }\n\n return parsed;\n }\n\n return {\n request,\n parseRequest,\n bounds,\n parse(value: unknown) {\n return parseDateRangeInput(value, bounds());\n },\n period,\n comparison,\n describeInput,\n view: { period, describeInput },\n };\n}\n\nexport type DateRangeContract = ReturnType<typeof defineDateRangeContract>;\n\n/** Validate calendar dates and a bounded inclusive range on the server. */\nexport function parseDateRangeInput(\n value: unknown,\n {\n minDate,\n maxDate,\n maxRangeDays,\n }: { minDate?: string; maxDate?: string; maxRangeDays: number }\n): DateRangeInput {\n invariant(\n value && typeof value === 'object' && !Array.isArray(value),\n 'Choose a date range.'\n );\n const { start, end } = value as Record<string, unknown>;\n\n function day(input: unknown): number {\n invariant(\n typeof input === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(input),\n 'Dates must be YYYY-MM-DD.'\n );\n const timestamp = Date.parse(`${input}T00:00:00Z`);\n invariant(\n Number.isFinite(timestamp) &&\n new Date(timestamp).toISOString().slice(0, 10) === input,\n 'Choose valid calendar dates.'\n );\n\n return timestamp;\n }\n const first = day(start);\n const last = day(end);\n invariant(\n Number.isInteger(maxRangeDays) && maxRangeDays > 0,\n 'Maximum range days must be positive.'\n );\n invariant(\n first <= last &&\n (last - first) / 86_400_000 < maxRangeDays &&\n (minDate === undefined || first >= day(minDate)) &&\n (maxDate === undefined || last <= day(maxDate)),\n `Choose up to ${maxRangeDays} days within the available range.`\n );\n\n return { start: start as string, end: end as string };\n}\n\n/** Accepts numeric strings from DuckDB; rejects negative, fractional, and unsafe integers. */\nexport function parseCount(value: unknown): number {\n const number =\n typeof value === 'number' || typeof value === 'string'\n ? Number(value)\n : NaN;\n invariant(\n Number.isSafeInteger(number) &&\n number >= 0 &&\n (typeof value !== 'string' || !!value.trim()),\n 'Invalid count in query result.'\n );\n\n return number;\n}\n\nexport function parseLabel(value: unknown, maxLength = 100): string {\n invariant(\n typeof value === 'string' && !!value && value.length <= maxLength,\n 'Invalid label in query result.'\n );\n\n return value;\n}\n\n/** Rejects missing or duplicate columns and rows whose width differs from the column list. */\nexport function rowsAsRecords(\n result: QueryResult,\n requiredColumns: readonly string[]\n): Record<string, unknown>[] {\n const names = result.columns.map(column => column.name);\n invariant(\n new Set(names).size === names.length &&\n requiredColumns.every(name => names.includes(name)),\n 'Query result columns do not match the expected shape.'\n );\n\n return result.rows.map(row => {\n invariant(\n row.length === names.length,\n 'Query result row has the wrong width.'\n );\n\n return Object.fromEntries(names.map((name, index) => [name, row[index]]));\n });\n}\n\nexport function defineQueryNames<const Names extends Record<string, string>>(\n names: Names\n): Names {\n const values = Object.values(names);\n invariant(\n values.every(name => !!name.trim()) &&\n new Set(values).size === values.length,\n 'Query names must be nonempty and unique.'\n );\n\n return names;\n}\n\nconst sourceErrorBrand = Symbol.for('@altertable/data-app/DataSourceError');\n\nexport class DataSourceError extends Error {\n readonly [sourceErrorBrand] = true;\n queryName?: string;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n return (\n value instanceof Error &&\n (value as { [sourceErrorBrand]?: unknown })[sourceErrorBrand] === true\n );\n }\n\n constructor(\n public readonly reason:\n | 'unauthorized'\n | 'forbidden'\n | 'rate_limited'\n | 'query_rejected'\n | 'unavailable',\n public readonly status?: number\n ) {\n super(`Data source ${reason}${status ? ` (${status})` : ''}.`);\n this.name = 'DataSourceError';\n }\n}\n\nexport type OperationQuery<Names extends Readonly<Record<string, string>>> = (\n name: Names[keyof Names],\n statement: string,\n options?: { limit?: number }\n) => Promise<QueryResult>;\n\nexport function defineOperation<\n Input,\n Output,\n const Names extends Readonly<Record<string, string>> = Record<string, never>,\n>(\n operation: Omit<DataOperation<Input, Output>, 'run' | 'queryNames'> & {\n queryNames?: Names;\n run: (\n context: OperationContext & { query: OperationQuery<NoInfer<Names>> },\n input: Input\n ) => Promise<Output>;\n }\n): DataOperation<Input, Output> & { queryNames?: Names } {\n invariant(\n Array.isArray(operation.checks) &&\n operation.checks.length > 0 &&\n Number.isInteger(operation.policy.maxQueryRows) &&\n operation.policy.maxQueryRows > 0 &&\n Number.isInteger(operation.policy.maxDurationMs) &&\n operation.policy.maxDurationMs > 0 &&\n (operation.policy.maxResponseBytes === undefined ||\n (Number.isInteger(operation.policy.maxResponseBytes) &&\n operation.policy.maxResponseBytes > 0)),\n 'Each data operation needs check inputs and positive row and duration limits.'\n );\n if (operation.queryNames) defineQueryNames(operation.queryNames);\n for (const input of operation.checks) operation.input(input);\n\n return {\n ...operation,\n run(context, input) {\n function query(\n name: Names[keyof Names],\n statement: string,\n options?: { limit?: number }\n ): Promise<QueryResult> {\n invariant(\n operation.queryNames &&\n Object.values(operation.queryNames).includes(name),\n `Unknown query name: ${name}.`\n );\n\n return context.lakehouse.queryAll(statement, {\n name,\n limit: options?.limit ?? operation.policy.maxQueryRows,\n signal: context.signal,\n });\n }\n\n return operation.run({ ...context, query }, input);\n },\n };\n}\n\nexport const connectionQueryNames = defineQueryNames({\n connection: 'connection-check',\n});\n\n/** Success requires a bounded SQL query; it does not establish access to a particular dataset. */\nexport function connectionCheck(): DataOperation<Record<string, never>, true> {\n return defineOperation({\n input: parseEmptyInput,\n output: parseTrue,\n checks: [{}],\n queryNames: connectionQueryNames,\n policy: { maxQueryRows: 1, maxDurationMs: 15_000, exposeSql: true },\n async run({ query }): Promise<true> {\n await query(\n connectionQueryNames.connection,\n 'SELECT 1 AS connection_check'\n );\n\n return true;\n },\n });\n}\n\nexport {\n dimensionFilter,\n parseDimensionSelection,\n parseFacetOptions,\n dimensionPredicate,\n} from '@/src/core/dimension';\nexport type {\n DimensionSelection,\n DimensionMember,\n DimensionOption,\n DimensionVariable,\n DimensionFilterOptions,\n} from '@/src/core/dimension';\n\nexport {\n createMessageRouter,\n defineMessageRoute,\n defineDataQueryRoute,\n MessageRoutingError,\n dataAppRoutes,\n navigationUpdateRoute,\n sqlQueryRoute,\n} from '@/src/core/messages';\nexport type {\n MessageContext,\n RoutedMessage,\n MessageDispatcher,\n MessageTransport,\n MessageRoute,\n MessageRoutes,\n MessageInput,\n MessageHandlers,\n MessageOutput,\n OperationContracts,\n DataQueryInput,\n DataQueryBody,\n DataQueryRoute,\n NavigationUpdate,\n SqlQueryInput,\n} from '@/src/core/messages';\nexport type { TransportResponse } from '@/src/core/bridge';\n\nexport {\n annotationDraftRoute,\n annotationModeRoute,\n annotationEditorStateRoute,\n annotationUpdateRoute,\n parseDataAppAnnotationDraft,\n} from '@/src/core/annotations';\nexport type {\n DataAppAnnotationDraft,\n DataAppAnnotationPresentation,\n} from '@/src/core/annotations';\n",
6
+ "/** Assert an author or data contract while preserving a useful failure message. */\nexport function invariant(\n condition: unknown,\n message: string\n): asserts condition {\n if (!condition) throw new Error(`Invariant failed: ${message}`);\n}\n",
7
+ "import type { AppVariable, HistoryMode } from '@/src/core/variables';\nimport { invariant } from '@/src/core/invariant';\n\nexport type DimensionValue = string | number;\nexport type DimensionMember<T extends DimensionValue = DimensionValue> =\n | { kind: 'value'; value: T }\n | { kind: 'missing' };\nexport type DimensionSelection<T extends DimensionValue = DimensionValue> =\n | { kind: 'all' }\n | { kind: 'include'; members: readonly DimensionMember<T>[] };\nexport type DimensionOption<T extends DimensionValue = DimensionValue> = {\n value: T;\n label: string;\n count?: number;\n};\nexport type DimensionVariable<T extends DimensionValue = DimensionValue> = Omit<\n AppVariable<DimensionSelection<T>, 'dimension'>,\n 'options'\n> & {\n label: string;\n selection: 'single' | 'multiple';\n valueType: 'string' | 'number';\n allowMissing: boolean;\n maxSelected: number;\n options: readonly DimensionOption<T>[];\n facet?: {\n operation: string;\n input: (values: Record<string, unknown>) => unknown;\n };\n describe: (selection: DimensionSelection<T>) => string;\n};\n\nconst allSelection: DimensionSelection<never> = { kind: 'all' };\n\nexport function dimensionMemberKey(member: DimensionMember) {\n return member.kind === 'missing'\n ? 'missing'\n : `value:${typeof member.value}:${member.value}`;\n}\n\nexport type DimensionFilterOptions<T extends DimensionValue> = {\n key: string;\n label: string;\n valueType: T extends number ? 'number' : 'string';\n selection: 'single' | 'multiple';\n allowMissing?: boolean;\n maxSelected?: number;\n history?: HistoryMode;\n} & (\n | { options: readonly DimensionOption<T>[]; facet?: never }\n | {\n /** A bounded operation supplies options and counts; input chooses other filters affecting counts. */\n facet: {\n operation: string;\n input: (values: Record<string, unknown>) => unknown;\n };\n options?: never;\n }\n);\n\n/** A bounded categorical filter. URL tags distinguish missing from literal \"null\". */\nexport function dimensionFilter<const T extends DimensionValue>(\n config: DimensionFilterOptions<T>\n): DimensionVariable<T> {\n const { key, label, selection, valueType } = config;\n const options = config.options ?? [];\n const optionKeys = options.map(option =>\n dimensionMemberKey({ kind: 'value', value: option.value })\n );\n invariant(\n !!key &&\n options.length <= 200 &&\n new Set(optionKeys).size === options.length,\n 'Dimension options need a key, at most 200 distinct values.'\n );\n invariant(\n options.every(\n option =>\n typeof option.value === valueType &&\n !!option.label.trim() &&\n (option.count === undefined ||\n (Number.isSafeInteger(option.count) && option.count >= 0))\n ),\n 'Dimension options need typed values, labels, and nonnegative counts.'\n );\n const allowed = new Set(optionKeys);\n const maxSelected = config.maxSelected ?? (selection === 'single' ? 1 : 20);\n invariant(\n Number.isInteger(maxSelected) &&\n maxSelected >= 1 &&\n maxSelected <= 50 &&\n (selection !== 'single' || maxSelected === 1),\n 'Dimension selection limit is invalid.'\n );\n const allowMissing = config.allowMissing ?? false;\n const defaultValue = allSelection;\n\n function validMember(member: DimensionMember<T>): boolean {\n if (member.kind === 'missing') return allowMissing;\n if (member.kind !== 'value' || typeof member.value !== valueType)\n return false;\n if (!config.facet) return allowed.has(dimensionMemberKey(member));\n\n return typeof member.value === 'number'\n ? Number.isFinite(member.value)\n : member.value.length <= 100;\n }\n\n function valid(value: DimensionSelection<T>): boolean {\n if (!value || typeof value !== 'object') return false;\n if (value.kind === 'all') return true;\n if (\n value.kind !== 'include' ||\n !Array.isArray(value.members) ||\n !value.members.length ||\n value.members.length > maxSelected\n )\n return false;\n const ids = value.members.map(dimensionMemberKey);\n\n return new Set(ids).size === ids.length && value.members.every(validMember);\n }\n\n function encode(value: DimensionSelection<T>) {\n return value.kind === 'all'\n ? null\n : JSON.stringify(\n value.members.map(member =>\n member.kind === 'missing' ? ['m'] : ['v', member.value]\n )\n );\n }\n\n function parse(raw: string | null): DimensionSelection<T> {\n if (raw === null) return defaultValue;\n if (raw.length > 4096) return defaultValue;\n try {\n const tokens = JSON.parse(raw);\n if (!Array.isArray(tokens)) return defaultValue;\n const value = {\n kind: 'include' as const,\n members: tokens.map(token =>\n Array.isArray(token) && token.length === 1 && token[0] === 'm'\n ? { kind: 'missing' as const }\n : Array.isArray(token) && token.length === 2 && token[0] === 'v'\n ? { kind: 'value' as const, value: token[1] as T }\n : { kind: 'invalid' as const }\n ),\n };\n\n return valid(value as DimensionSelection<T>)\n ? (value as DimensionSelection<T>)\n : defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n return {\n kind: 'dimension',\n label,\n valueType,\n selection,\n options,\n facet: config.facet,\n allowMissing,\n maxSelected,\n urlKeys: [key],\n defaultValue,\n history: config.history ?? 'push',\n valid,\n same(left, right) {\n return encode(left) === encode(right);\n },\n read(params) {\n return parse(params.get(key));\n },\n write(value) {\n return { [key]: encode(value) };\n },\n describe(value) {\n return value.kind === 'all'\n ? `All ${label.toLocaleLowerCase()}`\n : value.members\n .map(member =>\n member.kind === 'missing'\n ? 'Missing'\n : (options.find(option => option.value === member.value)\n ?.label ?? String(member.value))\n )\n .join(', ');\n },\n };\n}\n\n/** Server-side parser; call from the operation input parser before building SQL. */\nexport function parseDimensionSelection<T extends DimensionValue>(\n value: unknown,\n filter: DimensionVariable<T>\n): DimensionSelection<T> {\n invariant(\n filter.valid(value as DimensionSelection<T>),\n `Invalid ${filter.label} selection.`\n );\n\n return value as DimensionSelection<T>;\n}\n\n/** Validate bounded facet results before showing them in a picker. */\nexport function parseFacetOptions<T extends DimensionValue>(\n value: unknown,\n filter: DimensionVariable<T>\n): DimensionOption<T>[] {\n invariant(\n Array.isArray(value) && value.length <= 200,\n 'Facet options exceed their bound.'\n );\n const options: DimensionOption<T>[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n invariant(item && typeof item === 'object', 'Invalid facet option.');\n const option = item as DimensionOption<T>;\n invariant(\n typeof option.value === filter.valueType &&\n filter.valid({\n kind: 'include',\n members: [{ kind: 'value', value: option.value }],\n }) &&\n typeof option.label === 'string' &&\n !!option.label.trim() &&\n option.label.length <= 100 &&\n (option.count === undefined ||\n (Number.isSafeInteger(option.count) && option.count >= 0)),\n 'Invalid facet option.'\n );\n const id = dimensionMemberKey({ kind: 'value', value: option.value });\n invariant(!seen.has(id), 'Duplicate facet option.');\n seen.add(id);\n options.push(option);\n }\n\n return options;\n}\n\n/** Central SQL literal encoding for transports without bound parameters. Column is an allowlisted identifier. */\nexport function dimensionPredicate<\n T extends DimensionValue,\n const Columns extends readonly string[],\n>(\n column: Columns[number],\n selection: DimensionSelection<T>,\n allowedColumns: Columns\n): string {\n invariant(\n allowedColumns.includes(column) &&\n /^[A-Za-z_][A-Za-z_0-9]*(?:\\.[A-Za-z_][A-Za-z_0-9]*)*$/.test(column),\n 'Invalid dimension column.'\n );\n if (selection.kind === 'all') return '';\n invariant(\n selection.members.length > 0,\n 'Empty dimension inclusion is invalid.'\n );\n const values = selection.members.filter(\n (member): member is Extract<DimensionMember<T>, { kind: 'value' }> =>\n member.kind === 'value'\n );\n const missing = selection.members.some(member => member.kind === 'missing');\n const literals = values.map(({ value }) => {\n if (typeof value === 'number') {\n invariant(Number.isFinite(value), 'Invalid numeric dimension value.');\n\n return String(value);\n }\n const text = value as string;\n for (let index = 0; index < text.length; index++)\n invariant(\n text.charCodeAt(index) >= 32 && text.charCodeAt(index) !== 127,\n 'Invalid control character in dimension value.'\n );\n\n return `'${text.replaceAll(\"'\", \"''\")}'`;\n });\n const clauses = [\n ...(literals.length ? [`${column} IN (${literals.join(', ')})`] : []),\n ...(missing ? [`${column} IS NULL`] : []),\n ];\n\n return `(${clauses.join(' OR ')})`;\n}\n",
8
+ "import { defineMessageRoute } from '@/src/core/messages';\n\nexport type DataAppAnnotationDraft = {\n id: string;\n target: {\n id: string;\n label: string;\n kind: 'widget' | 'element' | 'app';\n text: string;\n queryNames: string[];\n glossaryIds: string[];\n };\n context: {\n search: string;\n hash: string;\n displayedInput?: unknown;\n /** Normalized position within the selected target, stable across scrolling/resizing. */\n anchor?: { x: number; y: number };\n cursor?: { x: number; y: number };\n /** Normalized custom selection rectangle within the iframe document. */\n region?: { x: number; y: number; width: number; height: number };\n screenshot?: {\n mimeType: 'image/png';\n dataUrl: string;\n width: number;\n height: number;\n };\n view?: string;\n viewport: { width: number; height: number };\n rect: { x: number; y: number; width: number; height: number };\n };\n comment: string;\n};\n\nexport type DataAppAnnotationPresentation = {\n enabled: boolean;\n /** When provided, the host owns the mode and renders the annotation trigger. */\n active?: boolean;\n pinsVisible?: boolean;\n showHint?: boolean;\n readOnly?: boolean;\n targets?: {\n id: string;\n targetId: string;\n number: number;\n comment?: string;\n anchor?: { x: number; y: number };\n region?: { x: number; y: number; width: number; height: number };\n }[];\n selectedAnnotationId?: string;\n selectedTargetId?: string;\n selectionId?: string;\n};\n\nfunction object(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error('Invalid annotation.');\n return value as Record<string, unknown>;\n}\nfunction text(value: unknown, limit: number, required = false): string {\n if (\n typeof value !== 'string' ||\n value.length > limit ||\n (required && !value.trim())\n )\n throw new Error('Invalid annotation text.');\n return value;\n}\nfunction names(value: unknown): string[] {\n if (!Array.isArray(value) || value.length > 20)\n throw new Error('Invalid annotation references.');\n return value.map(name => text(name, 128, true));\n}\nfunction number(value: unknown, positive = false): number {\n if (\n typeof value !== 'number' ||\n !Number.isFinite(value) ||\n Math.abs(value) > 1_000_000 ||\n (positive && value < 0)\n )\n throw new Error('Invalid annotation geometry.');\n return value;\n}\n\n/** Reconstruct at the boundary; discard extra fields and bound the entire JSON payload. */\nexport function parseDataAppAnnotationDraft(\n value: unknown\n): DataAppAnnotationDraft {\n const input = object(value);\n const target = object(input.target);\n const context = object(input.context);\n const viewport = object(context.viewport);\n const rect = object(context.rect);\n if (\n target.kind !== 'widget' &&\n target.kind !== 'element' &&\n target.kind !== 'app'\n )\n throw new Error('Invalid annotation target.');\n let screenshot: DataAppAnnotationDraft['context']['screenshot'];\n if (context.screenshot !== undefined) {\n const image = object(context.screenshot);\n const dataUrl = text(image.dataUrl, 350_000, true);\n if (\n image.mimeType !== 'image/png' ||\n !/^data:image\\/png;base64,iVBORw0KGgo[A-Za-z0-9+/]*={0,2}$/.test(dataUrl)\n )\n throw new Error('Invalid annotation screenshot.');\n const width = number(image.width, true);\n const height = number(image.height, true);\n if (\n !Number.isInteger(width) ||\n !Number.isInteger(height) ||\n width < 1 ||\n height < 1 ||\n width > 1024 ||\n height > 1024\n )\n throw new Error('Invalid screenshot dimensions.');\n const encoded = dataUrl.slice('data:image/png;base64,'.length);\n if (\n encoded.length % 4 !== 0 ||\n (encoded.length / 4) * 3 -\n (encoded.endsWith('==') ? 2 : encoded.endsWith('=') ? 1 : 0) >\n 262_144\n )\n throw new Error('Screenshot is too large.');\n const header = atob(encoded.slice(0, 44));\n if (header.length < 24 || header.slice(12, 16) !== 'IHDR')\n throw new Error('Invalid PNG header.');\n const bytes = Uint8Array.from(header, character => character.charCodeAt(0));\n const dimensions = new DataView(bytes.buffer);\n if (\n dimensions.getUint32(16) !== width ||\n dimensions.getUint32(20) !== height\n )\n throw new Error('Screenshot dimensions do not match the image.');\n screenshot = { mimeType: 'image/png', dataUrl, width, height };\n }\n let anchor: { x: number; y: number } | undefined;\n if (context.anchor !== undefined) {\n const point = object(context.anchor);\n const x = number(point.x, true);\n const y = number(point.y, true);\n if (x > 1 || y > 1) throw new Error('Invalid annotation anchor.');\n anchor = { x, y };\n }\n let cursor: { x: number; y: number } | undefined;\n if (context.cursor !== undefined) {\n const point = object(context.cursor);\n cursor = { x: number(point.x), y: number(point.y) };\n }\n let region: DataAppAnnotationDraft['context']['region'];\n if (context.region !== undefined) {\n const area = object(context.region);\n region = {\n x: number(area.x, true),\n y: number(area.y, true),\n width: number(area.width, true),\n height: number(area.height, true),\n };\n if (\n target.kind !== 'app' ||\n region.width <= 0 ||\n region.height <= 0 ||\n region.x + region.width > 1.000001 ||\n region.y + region.height > 1.000001\n )\n throw new Error('Invalid annotation selection.');\n }\n const draft: DataAppAnnotationDraft = {\n id: text(input.id, 128, true),\n target: {\n id: text(target.id, 128, true),\n label: text(target.label, 256, true),\n kind: target.kind,\n text: text(target.text, 1024),\n queryNames: names(target.queryNames),\n glossaryIds: names(target.glossaryIds),\n },\n context: {\n ...(anchor ? { anchor } : {}),\n ...(region ? { region } : {}),\n ...(cursor ? { cursor } : {}),\n ...(screenshot ? { screenshot } : {}),\n search: text(context.search, 2048),\n hash: text(context.hash, 1024),\n viewport: {\n width: number(viewport.width, true),\n height: number(viewport.height, true),\n },\n rect: {\n x: number(rect.x),\n y: number(rect.y),\n width: number(rect.width, true),\n height: number(rect.height, true),\n },\n ...(context.view === undefined ? {} : { view: text(context.view, 128) }),\n ...(context.displayedInput === undefined\n ? {}\n : { displayedInput: context.displayedInput }),\n },\n comment: text(input.comment, 2000, true).trim(),\n };\n const json = JSON.stringify({\n ...draft,\n context: { ...draft.context, screenshot: undefined },\n });\n if (new TextEncoder().encode(json).byteLength > 12_000)\n throw new Error('Annotation is too large.');\n return JSON.parse(JSON.stringify(draft)) as DataAppAnnotationDraft;\n}\n\nexport const annotationDraftRoute = /* @__PURE__ */ defineMessageRoute({\n input: parseDataAppAnnotationDraft,\n output(value: unknown): null {\n if (value !== null) throw new Error('Invalid annotation response.');\n return null;\n },\n});\n\nexport const annotationEditorStateRoute = /* @__PURE__ */ defineMessageRoute({\n input(value: unknown): { hasUnsavedChanges: boolean } {\n const input = object(value);\n if (typeof input.hasUnsavedChanges !== 'boolean')\n throw new Error('Invalid annotation editor state.');\n return { hasUnsavedChanges: input.hasUnsavedChanges };\n },\n output(value: unknown): null {\n if (value !== null) throw new Error('Invalid annotation response.');\n return null;\n },\n});\n\nexport const annotationUpdateRoute = /* @__PURE__ */ defineMessageRoute({\n input(value: unknown): { id: string; comment: string } {\n const input = object(value);\n return {\n id: text(input.id, 128, true),\n comment: text(input.comment, 2000, true).trim(),\n };\n },\n output(value: unknown): null {\n if (value !== null) throw new Error('Invalid annotation response.');\n return null;\n },\n});\n\n/** A controlled shell acknowledges local exits (for example Escape). */\nexport const annotationModeRoute = /* @__PURE__ */ defineMessageRoute({\n input(value: unknown): { active: boolean } {\n const input = object(value);\n if (typeof input.active !== 'boolean')\n throw new Error('Invalid annotation mode.');\n return { active: input.active };\n },\n output(value: unknown): null {\n if (value !== null) throw new Error('Invalid annotation response.');\n return null;\n },\n});\n\nexport function isAnnotationPresentation(\n value: unknown\n): value is DataAppAnnotationPresentation {\n if (!value || typeof value !== 'object') return false;\n const input = value as DataAppAnnotationPresentation;\n return (\n typeof input.enabled === 'boolean' &&\n (input.active === undefined || typeof input.active === 'boolean') &&\n (input.pinsVisible === undefined ||\n typeof input.pinsVisible === 'boolean') &&\n (input.showHint === undefined || typeof input.showHint === 'boolean') &&\n (input.readOnly === undefined || typeof input.readOnly === 'boolean') &&\n (input.selectedAnnotationId === undefined ||\n (typeof input.selectedAnnotationId === 'string' &&\n input.selectedAnnotationId.length <= 128)) &&\n (input.selectionId === undefined ||\n (typeof input.selectionId === 'string' &&\n input.selectionId.length <= 128)) &&\n (input.selectedTargetId === undefined ||\n (typeof input.selectedTargetId === 'string' &&\n input.selectedTargetId.length <= 128)) &&\n (input.targets === undefined ||\n (Array.isArray(input.targets) &&\n input.targets.length <= 50 &&\n input.targets.every(\n target =>\n target &&\n typeof target.id === 'string' &&\n target.id.length <= 128 &&\n typeof target.targetId === 'string' &&\n target.targetId.length <= 128 &&\n Number.isSafeInteger(target.number) &&\n target.number > 0 &&\n (target.anchor === undefined ||\n (typeof target.anchor.x === 'number' &&\n Number.isFinite(target.anchor.x) &&\n target.anchor.x >= 0 &&\n target.anchor.x <= 1 &&\n typeof target.anchor.y === 'number' &&\n Number.isFinite(target.anchor.y) &&\n target.anchor.y >= 0 &&\n target.anchor.y <= 1)) &&\n (target.region === undefined ||\n (typeof target.region === 'object' &&\n target.region !== null &&\n ['x', 'y', 'width', 'height'].every(key => {\n const value = (target.region as Record<string, unknown>)[key];\n return (\n typeof value === 'number' &&\n Number.isFinite(value) &&\n value >= 0 &&\n value <= 1\n );\n }) &&\n target.region.width > 0 &&\n target.region.height > 0 &&\n target.region.x + target.region.width <= 1.000001 &&\n target.region.y + target.region.height <= 1.000001)) &&\n (target.comment === undefined ||\n (typeof target.comment === 'string' &&\n target.comment.length <= 2000))\n )))\n );\n}\n"
9
+ ],
10
+ "mappings": "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",
11
+ "debugId": "876507C08B805AF964756E2164756E21",
12
+ "names": []
13
+ }
@@ -1,10 +1,14 @@
1
1
  import"../chunks/contract-mev09s5v.js";
2
- import"../chunks/contract-yxbjea23.js";
2
+ import"../chunks/contract-rfbakka4.js";
3
+ import {
4
+ createDataClient2
5
+ } from "../chunks/contract-19ckn3n7.js";
6
+ import"../chunks/contract-pk603qj7.js";
3
7
  import {
4
- createDataClient2,
5
8
  createDataAppNavigation2,
6
- getDataAppNavigation2
7
- } from "../chunks/contract-a061yj6r.js";
9
+ getDataAppNavigation2,
10
+ createAnnotationClient2
11
+ } from "../chunks/contract-e11m4y7f.js";
8
12
  import {
9
13
  DataAppError2,
10
14
  createHttpTransport2,
@@ -12,9 +16,10 @@ import {
12
16
  createIframeTransport2,
13
17
  installDataAppTransport2,
14
18
  getDataAppTransport2
15
- } from "../chunks/contract-sm7j7k95.js";
19
+ } from "../chunks/contract-13j5zb3c.js";
16
20
  export {
17
21
  DataAppError2 as DataAppError,
22
+ createAnnotationClient2 as createAnnotationClient,
18
23
  createDataAppNavigation2 as createDataAppNavigation,
19
24
  createDataClient2 as createDataClient,
20
25
  createHttpTransport2 as createHttpTransport,
@@ -25,4 +30,4 @@ export {
25
30
  installDataAppTransport2 as installDataAppTransport
26
31
  };
27
32
 
28
- //# debugId=88DF02CCA4F0E63864756E2164756E21
33
+ //# debugId=51C8B2874175323464756E2164756E21
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "88DF02CCA4F0E63864756E2164756E21",
7
+ "debugId": "51C8B2874175323464756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -3,7 +3,7 @@ import {
3
3
  normalizeAppearance2,
4
4
  applyAppearance2,
5
5
  createThemeController2
6
- } from "../chunks/contract-txjy0en2.js";
6
+ } from "../chunks/contract-m6n8ctfc.js";
7
7
  export {
8
8
  applyAppearance2 as applyAppearance,
9
9
  createThemeController2 as createThemeController,
@@ -3,6 +3,11 @@ import {
3
3
  parseDimensionSelection2,
4
4
  parseFacetOptions2,
5
5
  dimensionPredicate2,
6
+ parseDataAppAnnotationDraft2,
7
+ annotationDraftRoute2,
8
+ annotationEditorStateRoute2,
9
+ annotationUpdateRoute2,
10
+ annotationModeRoute2,
6
11
  parseEmptyInput2,
7
12
  parseTrue2,
8
13
  previousDateRange2,
@@ -16,8 +21,7 @@ import {
16
21
  defineOperation2,
17
22
  connectionQueryNames2,
18
23
  connectionCheck2
19
- } from "../chunks/contract-yxbjea23.js";
20
- import"../chunks/contract-mev09s5v.js";
24
+ } from "../chunks/contract-rfbakka4.js";
21
25
  import {
22
26
  MessageRoutingError2,
23
27
  defineMessageRoute2,
@@ -27,9 +31,14 @@ import {
27
31
  sqlQueryRoute2,
28
32
  dataAppRoutes2
29
33
  } from "../chunks/contract-tf8c3qpv.js";
34
+ import"../chunks/contract-mev09s5v.js";
30
35
  export {
31
36
  DataSourceError2 as DataSourceError,
32
37
  MessageRoutingError2 as MessageRoutingError,
38
+ annotationDraftRoute2 as annotationDraftRoute,
39
+ annotationEditorStateRoute2 as annotationEditorStateRoute,
40
+ annotationModeRoute2 as annotationModeRoute,
41
+ annotationUpdateRoute2 as annotationUpdateRoute,
33
42
  connectionCheck2 as connectionCheck,
34
43
  connectionQueryNames2 as connectionQueryNames,
35
44
  createMessageRouter2 as createMessageRouter,
@@ -43,6 +52,7 @@ export {
43
52
  dimensionPredicate2 as dimensionPredicate,
44
53
  navigationUpdateRoute2 as navigationUpdateRoute,
45
54
  parseCount2 as parseCount,
55
+ parseDataAppAnnotationDraft2 as parseDataAppAnnotationDraft,
46
56
  parseDateRangeInput2 as parseDateRangeInput,
47
57
  parseDimensionSelection2 as parseDimensionSelection,
48
58
  parseEmptyInput2 as parseEmptyInput,
@@ -54,4 +64,4 @@ export {
54
64
  sqlQueryRoute2 as sqlQueryRoute
55
65
  };
56
66
 
57
- //# debugId=7902CE650ED22CFA64756E2164756E21
67
+ //# debugId=649F65BA0E25DA4F64756E2164756E21
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "7902CE650ED22CFA64756E2164756E21",
7
+ "debugId": "649F65BA0E25DA4F64756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -1,13 +1,15 @@
1
1
  import"../chunks/contract-mev09s5v.js";
2
- import"../chunks/contract-yxbjea23.js";
2
+ import"../chunks/contract-rfbakka4.js";
3
+ import {
4
+ attachDataAppBridge2
5
+ } from "../chunks/contract-h8a6f559.js";
3
6
  import {
4
- createIframeTransport2,
5
- installDataAppTransport2,
6
7
  toDataOperationFailure
7
- } from "../chunks/contract-sm7j7k95.js";
8
+ } from "../chunks/contract-pk603qj7.js";
8
9
  import {
9
- attachDataAppBridge2
10
- } from "../chunks/contract-g6hky7x6.js";
10
+ createIframeTransport2,
11
+ installDataAppTransport2
12
+ } from "../chunks/contract-13j5zb3c.js";
11
13
  import {
12
14
  PARENT_PARAM
13
15
  } from "../chunks/contract-awa2d5b1.js";
@@ -130,4 +132,4 @@ export {
130
132
  startDataAppBootstrap
131
133
  };
132
134
 
133
- //# debugId=7CE51753C032335E64756E2164756E21
135
+ //# debugId=F2CF00E7F4701B1364756E2164756E21
@@ -6,7 +6,7 @@
6
6
  "import { PARENT_PARAM } from '@/src/core/bridge';\nimport type { NavigationUpdate } from '@/src/core/messages';\n\n/** Override this handler for framework routers. Reserved host parameters survive app navigation. */\nexport function createNavigationHandler({\n window: host = window,\n reservedSearchParams = [],\n}: {\n window?: Window;\n reservedSearchParams?: readonly string[];\n} = {}) {\n function navigate(input: NavigationUpdate): null {\n const previous = new URL(host.location.href);\n const url = new URL(previous);\n url.search = input.search;\n url.searchParams.delete(PARENT_PARAM);\n for (const name of reservedSearchParams) {\n url.searchParams.delete(name);\n for (const value of previous.searchParams.getAll(name))\n url.searchParams.append(name, value);\n }\n url.hash = input.hash;\n if (url.href !== host.location.href)\n host.history[input.mode === 'push' ? 'pushState' : 'replaceState'](\n null,\n '',\n url\n );\n if (input.title !== undefined) host.document.title = input.title;\n\n return null;\n }\n\n return navigate;\n}\n",
7
7
  "import type { Lakehouse } from '@/src/core/contract';\nimport { toDataOperationFailure } from '@/src/core/operation';\nimport {\n MessageRoutingError,\n type MessageContext,\n type SqlQueryInput,\n} from '@/src/core/messages';\n\n/** Authorize every SQL request and supply a backend that independently enforces access and query limits. */\nexport function createSqlQueryHandler(\n authorize: (\n query: SqlQueryInput,\n context: MessageContext\n ) => Promise<Lakehouse>\n) {\n async function handleSqlQuery(input: SqlQueryInput, context: MessageContext) {\n const requestId = crypto.randomUUID();\n context.signal.throwIfAborted();\n let lakehouse: Lakehouse;\n try {\n lakehouse = await authorize(input, context);\n } catch {\n context.signal.throwIfAborted();\n throw new MessageRoutingError(\n 'forbidden',\n 'You cannot run this query.',\n requestId\n );\n }\n context.signal.throwIfAborted();\n try {\n return await lakehouse.queryAll(input.statement, {\n limit: input.limit,\n signal: context.signal,\n });\n } catch (error) {\n context.signal.throwIfAborted();\n if (error instanceof MessageRoutingError) throw error;\n const failure = toDataOperationFailure(error);\n throw new MessageRoutingError(failure.code, failure.message, requestId);\n }\n }\n\n return handleSqlQuery;\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "7CE51753C032335E64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "F2CF00E7F4701B1364756E2164756E21",
11
11
  "names": []
12
12
  }
package/dist/local.js CHANGED
@@ -417,4 +417,4 @@ export {
417
417
  serveLocalApp
418
418
  };
419
419
 
420
- //# debugId=FEF1CCB4D9E6AAED64756E2164756E21
420
+ //# debugId=FB183031B1F856D564756E2164756E21
package/dist/local.js.map CHANGED
@@ -2,13 +2,13 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/core/contract.ts", "../src/core/invariant.ts", "../src/core/operation.ts", "../src/server/handler.ts", "../src/server/local.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Shared operation contracts and input/output validation for browser and server.\n * @module @altertable/data-app/contract\n * @see https://github.com/altertable-ai/data-app/blob/main/docs/contract.md\n */\nimport { parseDate, today } from '@internationalized/date';\nimport { formatDateRange } from '@/src/core/format';\nimport { invariant } from '@/src/core/invariant';\nimport type { DateRange as DateRangeInput } from '@/src/core/date-range';\nimport type {\n QueryResult,\n DataOperation,\n OperationContext,\n} from '@/src/core/operation-types';\nexport type {\n QueryResult,\n DisclosedQuery,\n Lakehouse,\n OperationContext,\n DataOperation,\n DataOperations,\n} from '@/src/core/operation-types';\n\nexport function parseEmptyInput(value: unknown): Record<string, never> {\n invariant(\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0,\n 'This operation takes no inputs.'\n );\n\n return {};\n}\n\nexport function parseTrue(value: unknown): true {\n invariant(value === true, 'Expected a successful check.');\n\n return true;\n}\n\nexport type { DateRange as DateRangeInput } from '@/src/core/date-range';\nexport type DateRangeRequest = {\n range: DateRangeInput;\n comparison: DateRangeInput | null;\n};\n\n/** The immediately preceding, equally long set of calendar days. */\nexport function previousDateRange({\n start,\n end,\n}: DateRangeInput): DateRangeInput {\n const first = parseDate(start);\n const last = parseDate(end);\n const days =\n (last.toDate('UTC').getTime() - first.toDate('UTC').getTime()) /\n 86_400_000 +\n 1;\n invariant(days >= 1, 'Date range must start before it ends.');\n const previousEnd = first.subtract({ days: 1 });\n\n return {\n start: previousEnd.subtract({ days: days - 1 }).toString(),\n end: previousEnd.toString(),\n };\n}\n\nexport type ReportingPeriod =\n | { kind: 'rolling'; amount: number; unit: 'hour' | 'day'; end: string }\n | { kind: 'calendar'; start: string; end: string; timeZone: string };\n\nexport type DateRangeContractOptions = {\n minDate?: string;\n maxDate?: string | (() => string);\n maxRangeDays: number;\n timeZone: string;\n completeDays?: boolean;\n};\n\n/** One source policy for the server parser, URL variable, and displayed reporting period. */\nexport function defineDateRangeContract(options: DateRangeContractOptions) {\n invariant(\n Number.isInteger(options.maxRangeDays) && options.maxRangeDays > 0,\n 'Date range needs a positive maxRangeDays.'\n );\n if (options.minDate) parseDate(options.minDate);\n if (typeof options.maxDate === 'string') parseDate(options.maxDate);\n today(options.timeZone);\n\n function bounds() {\n const latest = today(options.timeZone).subtract({\n days: options.completeDays === false ? 0 : 1,\n });\n const sourceMax =\n typeof options.maxDate === 'function'\n ? options.maxDate()\n : options.maxDate;\n const maxDate =\n sourceMax && parseDate(sourceMax).compare(latest) < 0\n ? parseDate(sourceMax).toString()\n : latest.toString();\n\n return {\n minDate: options.minDate,\n maxDate,\n maxRangeDays: options.maxRangeDays,\n timeZone: options.timeZone,\n };\n }\n\n function period({ start, end }: DateRangeInput): ReportingPeriod {\n return {\n kind: 'calendar',\n start,\n end,\n timeZone: options.timeZone,\n };\n }\n\n function describeInput(input: DateRangeInput) {\n return `${formatDateRange(input)} ${options.timeZone}`;\n }\n\n function comparison(input: DateRangeInput): DateRangeInput | null {\n const previous = previousDateRange(input);\n\n return options.minDate && previous.start < options.minDate\n ? null\n : previous;\n }\n\n function request(value: unknown, compare = false): DateRangeRequest {\n const range = parseDateRangeInput(value, bounds());\n const previous = compare ? comparison(range) : null;\n invariant(\n !compare || previous,\n 'Comparison is outside available source coverage.'\n );\n\n return { range, comparison: previous };\n }\n\n function parseRequest(value: unknown): DateRangeRequest {\n invariant(value && typeof value === 'object', 'Choose a date range.');\n const input = value as Record<string, unknown>;\n const parsed = request(input.range, input.comparison != null);\n if (input.comparison != null) {\n const supplied = parseDateRangeInput(input.comparison, bounds());\n invariant(\n supplied.start === parsed.comparison?.start &&\n supplied.end === parsed.comparison?.end,\n 'Comparison must be the preceding equal-length range.'\n );\n }\n\n return parsed;\n }\n\n return {\n request,\n parseRequest,\n bounds,\n parse(value: unknown) {\n return parseDateRangeInput(value, bounds());\n },\n period,\n comparison,\n describeInput,\n view: { period, describeInput },\n };\n}\n\nexport type DateRangeContract = ReturnType<typeof defineDateRangeContract>;\n\n/** Validate calendar dates and a bounded inclusive range on the server. */\nexport function parseDateRangeInput(\n value: unknown,\n {\n minDate,\n maxDate,\n maxRangeDays,\n }: { minDate?: string; maxDate?: string; maxRangeDays: number }\n): DateRangeInput {\n invariant(\n value && typeof value === 'object' && !Array.isArray(value),\n 'Choose a date range.'\n );\n const { start, end } = value as Record<string, unknown>;\n\n function day(input: unknown): number {\n invariant(\n typeof input === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(input),\n 'Dates must be YYYY-MM-DD.'\n );\n const timestamp = Date.parse(`${input}T00:00:00Z`);\n invariant(\n Number.isFinite(timestamp) &&\n new Date(timestamp).toISOString().slice(0, 10) === input,\n 'Choose valid calendar dates.'\n );\n\n return timestamp;\n }\n const first = day(start);\n const last = day(end);\n invariant(\n Number.isInteger(maxRangeDays) && maxRangeDays > 0,\n 'Maximum range days must be positive.'\n );\n invariant(\n first <= last &&\n (last - first) / 86_400_000 < maxRangeDays &&\n (minDate === undefined || first >= day(minDate)) &&\n (maxDate === undefined || last <= day(maxDate)),\n `Choose up to ${maxRangeDays} days within the available range.`\n );\n\n return { start: start as string, end: end as string };\n}\n\n/** Accepts numeric strings from DuckDB; rejects negative, fractional, and unsafe integers. */\nexport function parseCount(value: unknown): number {\n const number =\n typeof value === 'number' || typeof value === 'string'\n ? Number(value)\n : NaN;\n invariant(\n Number.isSafeInteger(number) &&\n number >= 0 &&\n (typeof value !== 'string' || !!value.trim()),\n 'Invalid count in query result.'\n );\n\n return number;\n}\n\nexport function parseLabel(value: unknown, maxLength = 100): string {\n invariant(\n typeof value === 'string' && !!value && value.length <= maxLength,\n 'Invalid label in query result.'\n );\n\n return value;\n}\n\n/** Rejects missing or duplicate columns and rows whose width differs from the column list. */\nexport function rowsAsRecords(\n result: QueryResult,\n requiredColumns: readonly string[]\n): Record<string, unknown>[] {\n const names = result.columns.map(column => column.name);\n invariant(\n new Set(names).size === names.length &&\n requiredColumns.every(name => names.includes(name)),\n 'Query result columns do not match the expected shape.'\n );\n\n return result.rows.map(row => {\n invariant(\n row.length === names.length,\n 'Query result row has the wrong width.'\n );\n\n return Object.fromEntries(names.map((name, index) => [name, row[index]]));\n });\n}\n\nexport function defineQueryNames<const Names extends Record<string, string>>(\n names: Names\n): Names {\n const values = Object.values(names);\n invariant(\n values.every(name => !!name.trim()) &&\n new Set(values).size === values.length,\n 'Query names must be nonempty and unique.'\n );\n\n return names;\n}\n\nconst sourceErrorBrand = Symbol.for('@altertable/data-app/DataSourceError');\n\nexport class DataSourceError extends Error {\n readonly [sourceErrorBrand] = true;\n queryName?: string;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n return (\n value instanceof Error &&\n (value as { [sourceErrorBrand]?: unknown })[sourceErrorBrand] === true\n );\n }\n\n constructor(\n public readonly reason:\n | 'unauthorized'\n | 'forbidden'\n | 'rate_limited'\n | 'query_rejected'\n | 'unavailable',\n public readonly status?: number\n ) {\n super(`Data source ${reason}${status ? ` (${status})` : ''}.`);\n this.name = 'DataSourceError';\n }\n}\n\nexport type OperationQuery<Names extends Readonly<Record<string, string>>> = (\n name: Names[keyof Names],\n statement: string,\n options?: { limit?: number }\n) => Promise<QueryResult>;\n\nexport function defineOperation<\n Input,\n Output,\n const Names extends Readonly<Record<string, string>> = Record<string, never>,\n>(\n operation: Omit<DataOperation<Input, Output>, 'run' | 'queryNames'> & {\n queryNames?: Names;\n run: (\n context: OperationContext & { query: OperationQuery<NoInfer<Names>> },\n input: Input\n ) => Promise<Output>;\n }\n): DataOperation<Input, Output> & { queryNames?: Names } {\n invariant(\n Array.isArray(operation.checks) &&\n operation.checks.length > 0 &&\n Number.isInteger(operation.policy.maxQueryRows) &&\n operation.policy.maxQueryRows > 0 &&\n Number.isInteger(operation.policy.maxDurationMs) &&\n operation.policy.maxDurationMs > 0 &&\n (operation.policy.maxResponseBytes === undefined ||\n (Number.isInteger(operation.policy.maxResponseBytes) &&\n operation.policy.maxResponseBytes > 0)),\n 'Each data operation needs check inputs and positive row and duration limits.'\n );\n if (operation.queryNames) defineQueryNames(operation.queryNames);\n for (const input of operation.checks) operation.input(input);\n\n return {\n ...operation,\n run(context, input) {\n function query(\n name: Names[keyof Names],\n statement: string,\n options?: { limit?: number }\n ): Promise<QueryResult> {\n invariant(\n operation.queryNames &&\n Object.values(operation.queryNames).includes(name),\n `Unknown query name: ${name}.`\n );\n\n return context.lakehouse.queryAll(statement, {\n name,\n limit: options?.limit ?? operation.policy.maxQueryRows,\n signal: context.signal,\n });\n }\n\n return operation.run({ ...context, query }, input);\n },\n };\n}\n\nexport const connectionQueryNames = defineQueryNames({\n connection: 'connection-check',\n});\n\n/** Success requires a bounded SQL query; it does not establish access to a particular dataset. */\nexport function connectionCheck(): DataOperation<Record<string, never>, true> {\n return defineOperation({\n input: parseEmptyInput,\n output: parseTrue,\n checks: [{}],\n queryNames: connectionQueryNames,\n policy: { maxQueryRows: 1, maxDurationMs: 15_000, exposeSql: true },\n async run({ query }): Promise<true> {\n await query(\n connectionQueryNames.connection,\n 'SELECT 1 AS connection_check'\n );\n\n return true;\n },\n });\n}\n\nexport {\n dimensionFilter,\n parseDimensionSelection,\n parseFacetOptions,\n dimensionPredicate,\n} from '@/src/core/dimension';\nexport type {\n DimensionSelection,\n DimensionMember,\n DimensionOption,\n DimensionVariable,\n DimensionFilterOptions,\n} from '@/src/core/dimension';\n\nexport {\n createMessageRouter,\n defineMessageRoute,\n defineDataQueryRoute,\n MessageRoutingError,\n dataAppRoutes,\n navigationUpdateRoute,\n sqlQueryRoute,\n} from '@/src/core/messages';\nexport type {\n MessageContext,\n RoutedMessage,\n MessageDispatcher,\n MessageTransport,\n MessageRoute,\n MessageRoutes,\n MessageInput,\n MessageHandlers,\n MessageOutput,\n OperationContracts,\n DataQueryInput,\n DataQueryBody,\n DataQueryRoute,\n NavigationUpdate,\n SqlQueryInput,\n} from '@/src/core/messages';\nexport type { TransportResponse } from '@/src/core/bridge';\n",
5
+ "/**\n * Shared operation contracts and input/output validation for browser and server.\n * @module @altertable/data-app/contract\n * @see https://github.com/altertable-ai/data-app/blob/main/docs/contract.md\n */\nimport { parseDate, today } from '@internationalized/date';\nimport { formatDateRange } from '@/src/core/format';\nimport { invariant } from '@/src/core/invariant';\nimport type { DateRange as DateRangeInput } from '@/src/core/date-range';\nimport type {\n QueryResult,\n DataOperation,\n OperationContext,\n} from '@/src/core/operation-types';\nexport type {\n QueryResult,\n DisclosedQuery,\n Lakehouse,\n OperationContext,\n DataOperation,\n DataOperations,\n} from '@/src/core/operation-types';\n\nexport function parseEmptyInput(value: unknown): Record<string, never> {\n invariant(\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0,\n 'This operation takes no inputs.'\n );\n\n return {};\n}\n\nexport function parseTrue(value: unknown): true {\n invariant(value === true, 'Expected a successful check.');\n\n return true;\n}\n\nexport type { DateRange as DateRangeInput } from '@/src/core/date-range';\nexport type DateRangeRequest = {\n range: DateRangeInput;\n comparison: DateRangeInput | null;\n};\n\n/** The immediately preceding, equally long set of calendar days. */\nexport function previousDateRange({\n start,\n end,\n}: DateRangeInput): DateRangeInput {\n const first = parseDate(start);\n const last = parseDate(end);\n const days =\n (last.toDate('UTC').getTime() - first.toDate('UTC').getTime()) /\n 86_400_000 +\n 1;\n invariant(days >= 1, 'Date range must start before it ends.');\n const previousEnd = first.subtract({ days: 1 });\n\n return {\n start: previousEnd.subtract({ days: days - 1 }).toString(),\n end: previousEnd.toString(),\n };\n}\n\nexport type ReportingPeriod =\n | { kind: 'rolling'; amount: number; unit: 'hour' | 'day'; end: string }\n | { kind: 'calendar'; start: string; end: string; timeZone: string };\n\nexport type DateRangeContractOptions = {\n minDate?: string;\n maxDate?: string | (() => string);\n maxRangeDays: number;\n timeZone: string;\n completeDays?: boolean;\n};\n\n/** One source policy for the server parser, URL variable, and displayed reporting period. */\nexport function defineDateRangeContract(options: DateRangeContractOptions) {\n invariant(\n Number.isInteger(options.maxRangeDays) && options.maxRangeDays > 0,\n 'Date range needs a positive maxRangeDays.'\n );\n if (options.minDate) parseDate(options.minDate);\n if (typeof options.maxDate === 'string') parseDate(options.maxDate);\n today(options.timeZone);\n\n function bounds() {\n const latest = today(options.timeZone).subtract({\n days: options.completeDays === false ? 0 : 1,\n });\n const sourceMax =\n typeof options.maxDate === 'function'\n ? options.maxDate()\n : options.maxDate;\n const maxDate =\n sourceMax && parseDate(sourceMax).compare(latest) < 0\n ? parseDate(sourceMax).toString()\n : latest.toString();\n\n return {\n minDate: options.minDate,\n maxDate,\n maxRangeDays: options.maxRangeDays,\n timeZone: options.timeZone,\n };\n }\n\n function period({ start, end }: DateRangeInput): ReportingPeriod {\n return {\n kind: 'calendar',\n start,\n end,\n timeZone: options.timeZone,\n };\n }\n\n function describeInput(input: DateRangeInput) {\n return `${formatDateRange(input)} ${options.timeZone}`;\n }\n\n function comparison(input: DateRangeInput): DateRangeInput | null {\n const previous = previousDateRange(input);\n\n return options.minDate && previous.start < options.minDate\n ? null\n : previous;\n }\n\n function request(value: unknown, compare = false): DateRangeRequest {\n const range = parseDateRangeInput(value, bounds());\n const previous = compare ? comparison(range) : null;\n invariant(\n !compare || previous,\n 'Comparison is outside available source coverage.'\n );\n\n return { range, comparison: previous };\n }\n\n function parseRequest(value: unknown): DateRangeRequest {\n invariant(value && typeof value === 'object', 'Choose a date range.');\n const input = value as Record<string, unknown>;\n const parsed = request(input.range, input.comparison != null);\n if (input.comparison != null) {\n const supplied = parseDateRangeInput(input.comparison, bounds());\n invariant(\n supplied.start === parsed.comparison?.start &&\n supplied.end === parsed.comparison?.end,\n 'Comparison must be the preceding equal-length range.'\n );\n }\n\n return parsed;\n }\n\n return {\n request,\n parseRequest,\n bounds,\n parse(value: unknown) {\n return parseDateRangeInput(value, bounds());\n },\n period,\n comparison,\n describeInput,\n view: { period, describeInput },\n };\n}\n\nexport type DateRangeContract = ReturnType<typeof defineDateRangeContract>;\n\n/** Validate calendar dates and a bounded inclusive range on the server. */\nexport function parseDateRangeInput(\n value: unknown,\n {\n minDate,\n maxDate,\n maxRangeDays,\n }: { minDate?: string; maxDate?: string; maxRangeDays: number }\n): DateRangeInput {\n invariant(\n value && typeof value === 'object' && !Array.isArray(value),\n 'Choose a date range.'\n );\n const { start, end } = value as Record<string, unknown>;\n\n function day(input: unknown): number {\n invariant(\n typeof input === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(input),\n 'Dates must be YYYY-MM-DD.'\n );\n const timestamp = Date.parse(`${input}T00:00:00Z`);\n invariant(\n Number.isFinite(timestamp) &&\n new Date(timestamp).toISOString().slice(0, 10) === input,\n 'Choose valid calendar dates.'\n );\n\n return timestamp;\n }\n const first = day(start);\n const last = day(end);\n invariant(\n Number.isInteger(maxRangeDays) && maxRangeDays > 0,\n 'Maximum range days must be positive.'\n );\n invariant(\n first <= last &&\n (last - first) / 86_400_000 < maxRangeDays &&\n (minDate === undefined || first >= day(minDate)) &&\n (maxDate === undefined || last <= day(maxDate)),\n `Choose up to ${maxRangeDays} days within the available range.`\n );\n\n return { start: start as string, end: end as string };\n}\n\n/** Accepts numeric strings from DuckDB; rejects negative, fractional, and unsafe integers. */\nexport function parseCount(value: unknown): number {\n const number =\n typeof value === 'number' || typeof value === 'string'\n ? Number(value)\n : NaN;\n invariant(\n Number.isSafeInteger(number) &&\n number >= 0 &&\n (typeof value !== 'string' || !!value.trim()),\n 'Invalid count in query result.'\n );\n\n return number;\n}\n\nexport function parseLabel(value: unknown, maxLength = 100): string {\n invariant(\n typeof value === 'string' && !!value && value.length <= maxLength,\n 'Invalid label in query result.'\n );\n\n return value;\n}\n\n/** Rejects missing or duplicate columns and rows whose width differs from the column list. */\nexport function rowsAsRecords(\n result: QueryResult,\n requiredColumns: readonly string[]\n): Record<string, unknown>[] {\n const names = result.columns.map(column => column.name);\n invariant(\n new Set(names).size === names.length &&\n requiredColumns.every(name => names.includes(name)),\n 'Query result columns do not match the expected shape.'\n );\n\n return result.rows.map(row => {\n invariant(\n row.length === names.length,\n 'Query result row has the wrong width.'\n );\n\n return Object.fromEntries(names.map((name, index) => [name, row[index]]));\n });\n}\n\nexport function defineQueryNames<const Names extends Record<string, string>>(\n names: Names\n): Names {\n const values = Object.values(names);\n invariant(\n values.every(name => !!name.trim()) &&\n new Set(values).size === values.length,\n 'Query names must be nonempty and unique.'\n );\n\n return names;\n}\n\nconst sourceErrorBrand = Symbol.for('@altertable/data-app/DataSourceError');\n\nexport class DataSourceError extends Error {\n readonly [sourceErrorBrand] = true;\n queryName?: string;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n return (\n value instanceof Error &&\n (value as { [sourceErrorBrand]?: unknown })[sourceErrorBrand] === true\n );\n }\n\n constructor(\n public readonly reason:\n | 'unauthorized'\n | 'forbidden'\n | 'rate_limited'\n | 'query_rejected'\n | 'unavailable',\n public readonly status?: number\n ) {\n super(`Data source ${reason}${status ? ` (${status})` : ''}.`);\n this.name = 'DataSourceError';\n }\n}\n\nexport type OperationQuery<Names extends Readonly<Record<string, string>>> = (\n name: Names[keyof Names],\n statement: string,\n options?: { limit?: number }\n) => Promise<QueryResult>;\n\nexport function defineOperation<\n Input,\n Output,\n const Names extends Readonly<Record<string, string>> = Record<string, never>,\n>(\n operation: Omit<DataOperation<Input, Output>, 'run' | 'queryNames'> & {\n queryNames?: Names;\n run: (\n context: OperationContext & { query: OperationQuery<NoInfer<Names>> },\n input: Input\n ) => Promise<Output>;\n }\n): DataOperation<Input, Output> & { queryNames?: Names } {\n invariant(\n Array.isArray(operation.checks) &&\n operation.checks.length > 0 &&\n Number.isInteger(operation.policy.maxQueryRows) &&\n operation.policy.maxQueryRows > 0 &&\n Number.isInteger(operation.policy.maxDurationMs) &&\n operation.policy.maxDurationMs > 0 &&\n (operation.policy.maxResponseBytes === undefined ||\n (Number.isInteger(operation.policy.maxResponseBytes) &&\n operation.policy.maxResponseBytes > 0)),\n 'Each data operation needs check inputs and positive row and duration limits.'\n );\n if (operation.queryNames) defineQueryNames(operation.queryNames);\n for (const input of operation.checks) operation.input(input);\n\n return {\n ...operation,\n run(context, input) {\n function query(\n name: Names[keyof Names],\n statement: string,\n options?: { limit?: number }\n ): Promise<QueryResult> {\n invariant(\n operation.queryNames &&\n Object.values(operation.queryNames).includes(name),\n `Unknown query name: ${name}.`\n );\n\n return context.lakehouse.queryAll(statement, {\n name,\n limit: options?.limit ?? operation.policy.maxQueryRows,\n signal: context.signal,\n });\n }\n\n return operation.run({ ...context, query }, input);\n },\n };\n}\n\nexport const connectionQueryNames = defineQueryNames({\n connection: 'connection-check',\n});\n\n/** Success requires a bounded SQL query; it does not establish access to a particular dataset. */\nexport function connectionCheck(): DataOperation<Record<string, never>, true> {\n return defineOperation({\n input: parseEmptyInput,\n output: parseTrue,\n checks: [{}],\n queryNames: connectionQueryNames,\n policy: { maxQueryRows: 1, maxDurationMs: 15_000, exposeSql: true },\n async run({ query }): Promise<true> {\n await query(\n connectionQueryNames.connection,\n 'SELECT 1 AS connection_check'\n );\n\n return true;\n },\n });\n}\n\nexport {\n dimensionFilter,\n parseDimensionSelection,\n parseFacetOptions,\n dimensionPredicate,\n} from '@/src/core/dimension';\nexport type {\n DimensionSelection,\n DimensionMember,\n DimensionOption,\n DimensionVariable,\n DimensionFilterOptions,\n} from '@/src/core/dimension';\n\nexport {\n createMessageRouter,\n defineMessageRoute,\n defineDataQueryRoute,\n MessageRoutingError,\n dataAppRoutes,\n navigationUpdateRoute,\n sqlQueryRoute,\n} from '@/src/core/messages';\nexport type {\n MessageContext,\n RoutedMessage,\n MessageDispatcher,\n MessageTransport,\n MessageRoute,\n MessageRoutes,\n MessageInput,\n MessageHandlers,\n MessageOutput,\n OperationContracts,\n DataQueryInput,\n DataQueryBody,\n DataQueryRoute,\n NavigationUpdate,\n SqlQueryInput,\n} from '@/src/core/messages';\nexport type { TransportResponse } from '@/src/core/bridge';\n\nexport {\n annotationDraftRoute,\n annotationModeRoute,\n annotationEditorStateRoute,\n annotationUpdateRoute,\n parseDataAppAnnotationDraft,\n} from '@/src/core/annotations';\nexport type {\n DataAppAnnotationDraft,\n DataAppAnnotationPresentation,\n} from '@/src/core/annotations';\n",
6
6
  "/** Assert an author or data contract while preserving a useful failure message. */\nexport function invariant(\n condition: unknown,\n message: string\n): asserts condition {\n if (!condition) throw new Error(`Invariant failed: ${message}`);\n}\n",
7
7
  "import { DataSourceError } from '@/src/core/contract';\nimport type {\n DataOperations,\n DisclosedQuery,\n Lakehouse,\n OperationContext,\n DataQueryBody,\n} from '@/src/core/operation-types';\n\ntype Operation = DataOperations[string];\ntype OperationExecutionOptions = {\n operationName: string;\n lakehouse: Lakehouse;\n signal: AbortSignal;\n /** Include query evidence in the response; this does not keep browser-owned SQL private. */\n includeSql: boolean;\n requestId: string;\n};\n\n/** Shared operation execution. Adapters own authorization, delivery, and public errors. */\nexport async function executeDataOperation(\n operation: Operation,\n value: unknown,\n {\n operationName,\n lakehouse,\n signal: requestSignal,\n includeSql,\n requestId,\n }: OperationExecutionOptions\n) {\n requestSignal.throwIfAborted();\n let input: unknown;\n try {\n input = operation.input(value);\n } catch {\n throw new OperationInputError();\n }\n\n const signal = AbortSignal.any([\n requestSignal,\n AbortSignal.timeout(operation.policy.maxDurationMs),\n ]);\n const execution = createOperationLakehouse(\n operation,\n lakehouse,\n signal,\n operationName\n );\n try {\n const output = await runOperation(operation, input, {\n lakehouse: execution.lakehouse,\n signal,\n });\n const body: DataQueryBody<unknown> = {\n data: operation.output(output),\n requestId,\n queriedAt: new Date().toISOString(),\n queryIds: execution.queryIds,\n ...(operation.policy.exposeSql && includeSql\n ? { queries: execution.queries }\n : {}),\n };\n const serializedBody = JSON.stringify(body);\n const responseBytes = new TextEncoder().encode(serializedBody).byteLength;\n if (responseBytes > (operation.policy.maxResponseBytes ?? 1_000_000))\n throw new Error('Response exceeds byte limit.');\n\n return { body, serializedBody };\n } catch (error) {\n if (signal.aborted && !(error instanceof DataSourceError))\n throw new OperationTimeoutError();\n throw error;\n }\n}\n\n/** Query evidence follows statement invocation order; query IDs retain completion order. */\nfunction createOperationLakehouse(\n operation: Operation,\n source: Lakehouse,\n signal: AbortSignal,\n operationName: string\n) {\n const queryIds: string[] = [];\n const queries: DisclosedQuery[] = [];\n const lakehouse: Lakehouse = {\n async queryAll(statement, options) {\n if (!Number.isInteger(options.limit) || options.limit < 1)\n throw new Error('Query needs a positive row limit.');\n if (\n operation.queryNames &&\n !Object.values(operation.queryNames).includes(options.name ?? '')\n )\n throw new Error(\n `Query name is not registered for operation ${operationName}.`\n );\n const query: DisclosedQuery = {\n name: options.name ?? `Query ${queries.length + 1}`,\n statement,\n };\n queries.push(query);\n const limit = Math.min(options.limit, operation.policy.maxQueryRows);\n let result;\n try {\n result = await source.queryAll(statement, {\n limit,\n signal: AbortSignal.any([signal, options.signal]),\n });\n } catch (error) {\n if (error instanceof DataSourceError) error.queryName = query.name;\n throw error;\n }\n if (result.rows.length > limit)\n throw new Error('Result exceeds row limit.');\n if (result.queryId) {\n query.queryId = result.queryId;\n queryIds.push(result.queryId);\n }\n\n return result;\n },\n };\n\n return { lakehouse, queries, queryIds };\n}\n\n/** Settle cancellation even when operation code or its lakehouse ignores the signal. */\nasync function runOperation(\n operation: Operation,\n input: unknown,\n { lakehouse, signal }: OperationContext\n) {\n let abort: (() => void) | undefined;\n try {\n signal.throwIfAborted();\n const cancelled = new Promise<never>((_, reject) => {\n function rejectAborted() {\n reject(new Error('Request aborted.'));\n }\n abort = rejectAborted;\n signal.addEventListener('abort', rejectAborted, { once: true });\n if (signal.aborted) rejectAborted();\n });\n\n return await Promise.race([\n cancelled,\n Promise.resolve().then(() => {\n signal.throwIfAborted();\n\n return operation.run({ lakehouse, signal }, input as never);\n }),\n ]);\n } finally {\n if (abort) signal.removeEventListener('abort', abort);\n }\n}\n\nclass OperationTimeoutError extends Error {}\n\nclass OperationInputError extends Error {}\n\nconst sourceErrorMessages = {\n unauthorized:\n 'This app could not authenticate its data connection. Contact the app owner.',\n forbidden:\n 'This app cannot access the requested data. Contact the app owner.',\n rate_limited: 'The lakehouse is busy. Wait a moment and retry.',\n query_rejected:\n \"A lakehouse query was rejected. Check the app's data operation.\",\n unavailable: 'The lakehouse is unavailable. Check the connection and retry.',\n};\n\nexport function toDataOperationFailure(error: unknown, aborted = false) {\n if (error instanceof OperationInputError)\n return {\n status: 400,\n code: 'invalid_input',\n message: \"Check this operation's inputs.\",\n };\n if (error instanceof DataSourceError)\n return {\n status: error.reason === 'rate_limited' ? 429 : 502,\n code: `source_${error.reason}`,\n message: sourceErrorMessages[error.reason],\n };\n const timedOut = aborted || error instanceof OperationTimeoutError;\n return {\n status: timedOut ? 504 : 502,\n code: timedOut ? 'timeout' : 'query_failed',\n message: timedOut\n ? 'The data request timed out.'\n : 'The data request failed.',\n };\n}\n",
8
8
  "import {\n executeDataOperation,\n toDataOperationFailure,\n} from '@/src/core/operation';\nimport {\n DataSourceError,\n type DataOperations,\n type Lakehouse,\n} from '@/src/core/contract';\n\n/** Authorization result for one viewer request. A hosted adapter must scope its lakehouse client. */\nexport type RequestAccess = { lakehouse: Lakehouse; canDiscloseSql: boolean };\n\n/**\n * Execute named operations on the server. The app supplies operations and viewer authorization.\n * JSON, Origin, and Fetch Metadata checks reject cross-site browser POSTs; they do not\n * authenticate another local process. SQL is returned only when both the operation and\n * authorization result permit disclosure.\n */\nexport function createDataHandler(\n operations: DataOperations,\n authorize: (request: Request, operation: string) => Promise<RequestAccess>\n) {\n async function handleDataRequest(request: Request): Promise<Response> {\n const requestId = crypto.randomUUID();\n const url = new URL(request.url);\n if (!url.pathname.startsWith('/api/data/'))\n return new Response('Not found', { status: 404 });\n const encodedName = url.pathname.slice('/api/data/'.length);\n if (!encodedName || encodedName.includes('/'))\n return problem(404, 'not_found', 'Unknown data operation.', requestId);\n let name: string;\n try {\n name = decodeURIComponent(encodedName);\n } catch {\n return problem(404, 'not_found', 'Unknown data operation.', requestId);\n }\n if (!Object.hasOwn(operations, name))\n return problem(404, 'not_found', 'Unknown data operation.', requestId);\n if (request.method !== 'POST')\n return problem(405, 'method_not_allowed', 'Use POST.', requestId);\n if (\n request.headers\n .get('content-type')\n ?.split(';')[0]\n ?.trim()\n .toLowerCase() !== 'application/json'\n )\n return problem(\n 415,\n 'unsupported_media_type',\n 'Use application/json.',\n requestId\n );\n const origin = request.headers.get('origin');\n const fetchSite = request.headers.get('sec-fetch-site');\n const fetchMode = request.headers.get('sec-fetch-mode');\n if (\n (origin !== null && origin !== url.origin) ||\n (fetchSite !== null && fetchSite !== 'same-origin') ||\n (fetchSite !== null && origin === null) ||\n (fetchMode !== null &&\n fetchMode !== 'cors' &&\n fetchMode !== 'same-origin')\n )\n return problem(\n 403,\n 'cross_origin_request',\n 'The data request must come from this app.',\n requestId\n );\n let access: RequestAccess;\n try {\n access = await authorize(request, name);\n } catch {\n return problem(\n 403,\n 'forbidden',\n 'You cannot run this data operation.',\n requestId\n );\n }\n const operation = operations[name]!;\n let input: unknown;\n if (request.signal.aborted)\n return problem(504, 'timeout', 'The data request timed out.', requestId);\n try {\n const body = await readInput(request);\n input = JSON.parse(body);\n } catch (error) {\n if (error instanceof InputTooLargeError)\n return problem(\n 413,\n 'input_too_large',\n 'Input is too large.',\n requestId\n );\n\n return problem(\n 400,\n 'invalid_input',\n \"Check this operation's inputs.\",\n requestId\n );\n }\n const signal = request.signal;\n try {\n const { serializedBody } = await executeDataOperation(operation, input, {\n lakehouse: access.lakehouse,\n includeSql: access.canDiscloseSql,\n signal,\n requestId,\n operationName: name,\n });\n return new Response(serializedBody, {\n headers: {\n 'cache-control': 'no-store',\n 'content-type': 'application/json',\n },\n });\n } catch (error) {\n const source = error instanceof DataSourceError ? error : null;\n console.error(\n `Data operation ${name} failed (${requestId}): ${source ? `${source.reason}${source.status ? ` (${source.status})` : ''}${source.queryName ? ` in ${source.queryName}` : ''}` : error instanceof Error ? error.name : 'unknown'}`\n );\n const failure = toDataOperationFailure(error, signal.aborted);\n\n return problem(failure.status, failure.code, failure.message, requestId);\n }\n }\n\n return handleDataRequest;\n}\n\nfunction problem(\n status: number,\n code: string,\n message: string,\n requestId: string\n): Response {\n return Response.json(\n { error: { code, message, requestId } },\n { status, headers: { 'cache-control': 'no-store' } }\n );\n}\n\nconst MAX_INPUT_BYTES = 16_384;\nclass InputTooLargeError extends Error {}\n\n/** Count encoded bytes before retaining chunks; cancellation also interrupts waiting reads. */\nasync function readInput(request: Request): Promise<string> {\n const reader = request.body?.getReader();\n if (!reader) return '';\n const chunks: Uint8Array[] = [];\n let size = 0;\n let abort: (() => void) | undefined;\n\n function cancelReader() {\n // The source's cancel algorithm may never settle; the handler must still respond.\n void reader!.cancel().catch(() => {});\n }\n\n try {\n request.signal.throwIfAborted();\n const cancelled = new Promise<never>((_, reject) => {\n function rejectAborted() {\n reject(new Error('Request aborted.'));\n cancelReader();\n }\n abort = rejectAborted;\n request.signal.addEventListener('abort', rejectAborted, { once: true });\n if (request.signal.aborted) rejectAborted();\n });\n while (true) {\n const { done, value } = await Promise.race([reader.read(), cancelled]);\n if (done) break;\n size += value.byteLength;\n if (size > MAX_INPUT_BYTES) {\n cancelReader();\n throw new InputTooLargeError();\n }\n chunks.push(value);\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return new TextDecoder().decode(bytes);\n } finally {\n if (abort) request.signal.removeEventListener('abort', abort);\n reader.releaseLock();\n }\n}\n",
9
9
  "/**\n * Bun local-development serving and server-only lakehouse access.\n * @module @altertable/data-app/server/bun\n * @see https://github.com/altertable-ai/data-app/blob/main/docs/server-bun.md\n */\nimport {\n DataSourceError,\n type Lakehouse,\n type QueryResult,\n} from '@/src/core/contract';\nimport type { DataOperations } from '@/src/core/contract';\nimport { createDataHandler } from '@/src/server/handler';\n\n/** Serve one app on localhost through the CLI's lakehouse proxy during development.\n * Hosted servers must authorize every viewer and must use `createDataHandler` directly. */\nexport function serveLocalApp({\n page,\n operations,\n title,\n port = Number(process.env.PORT ?? 25837),\n}: {\n page: Bun.HTMLBundle;\n operations: DataOperations;\n title: string;\n port?: number;\n}) {\n const server = Bun.serve({\n hostname: '127.0.0.1',\n port,\n development: process.env.NODE_ENV !== 'production',\n idleTimeout: 60,\n routes: { '/': page },\n fetch: createDataHandler(operations, async () => ({\n lakehouse: localLakehouse(),\n canDiscloseSql: true,\n })),\n });\n console.log(`${title} running at ${server.url}`);\n\n return server;\n}\n\n/** Server-only lakehouse adapter. Local development uses the selected CLI profile's proxy. */\nexport function localLakehouse(\n environment: Record<string, string | undefined> = process.env,\n request: typeof fetch = fetch\n): Lakehouse {\n return {\n async queryAll(statement, { limit, signal }) {\n const proxyUrl = environment.ALTERTABLE_DATA_PROXY_URL;\n const proxyToken = environment.ALTERTABLE_DATA_PROXY_TOKEN;\n const username = environment.ALTERTABLE_LAKEHOUSE_USERNAME;\n const password = environment.ALTERTABLE_LAKEHOUSE_PASSWORD;\n if (!proxyUrl && (!username || !password))\n throw new DataSourceError('unauthorized');\n if (proxyUrl && !proxyToken) throw new DataSourceError('unauthorized');\n const base =\n proxyUrl ??\n environment.ALTERTABLE_API_BASE ??\n 'https://api.altertable.ai';\n let response: Response;\n try {\n response = await request(\n new URL('query', `${base.replace(/\\/$/, '')}/`),\n {\n method: 'POST',\n headers: {\n authorization: proxyUrl\n ? `Bearer ${proxyToken}`\n : `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ statement, limit }),\n signal,\n }\n );\n } catch (error) {\n if (signal.aborted) throw error;\n throw new DataSourceError('unavailable');\n }\n if (!response.ok) {\n const reason =\n response.status === 401\n ? 'unauthorized'\n : response.status === 403\n ? 'forbidden'\n : response.status === 429\n ? 'rate_limited'\n : response.status === 400 || response.status === 422\n ? 'query_rejected'\n : 'unavailable';\n throw new DataSourceError(reason, response.status);\n }\n const body = await readQueryBody(response);\n\n return parseQueryResult(body, limit);\n },\n };\n}\n\nasync function readQueryBody(response: Response): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) throw new Error('Query response is empty.');\n const decoder = new TextDecoder();\n let body = '';\n let bytes = 0;\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > 5_000_000) {\n await reader.cancel();\n throw new Error('Query response is too large.');\n }\n body += decoder.decode(chunk.value, { stream: true });\n }\n body += decoder.decode();\n\n return body;\n}\n\nfunction parseQueryResult(body: string, limit: number): QueryResult {\n const lines = body\n .trimEnd()\n .split('\\n')\n .filter(line => line.trim());\n if (!lines.length) throw new Error('Query response is empty.');\n const metadata: unknown = JSON.parse(lines[0]!);\n if (\n !metadata ||\n typeof metadata !== 'object' ||\n Array.isArray(metadata) ||\n ('query_id' in metadata &&\n metadata.query_id !== undefined &&\n typeof metadata.query_id !== 'string')\n )\n throw new Error('Invalid query metadata.');\n const queryId =\n 'query_id' in metadata\n ? (metadata.query_id as string | undefined)\n : undefined;\n let firstRowIndex = 1;\n let columns: QueryResult['columns'] = [];\n if (lines[firstRowIndex]) {\n const columnDefinitions = JSON.parse(lines[firstRowIndex]!) as unknown;\n if (\n Array.isArray(columnDefinitions) &&\n columnDefinitions.every(\n value =>\n typeof value === 'string' ||\n (typeof value === 'object' && value !== null && 'name' in value)\n )\n ) {\n columns = columnDefinitions.map(value =>\n typeof value === 'string' ? { name: value } : parseColumn(value)\n );\n firstRowIndex++;\n }\n }\n const rows = lines.slice(firstRowIndex).map(line => {\n const row: unknown = JSON.parse(line);\n if (\n !Array.isArray(row) ||\n (firstRowIndex === 2 && row.length !== columns.length)\n )\n throw new Error('Invalid query row.');\n\n return row;\n });\n if (rows.length > limit)\n throw new Error('Lakehouse returned more rows than requested.');\n\n return { columns, rows, queryId };\n}\n\nfunction parseColumn(value: unknown): QueryResult['columns'][number] {\n if (\n !value ||\n typeof value !== 'object' ||\n !('name' in value) ||\n typeof value.name !== 'string' ||\n ('type' in value &&\n value.type !== undefined &&\n typeof value.type !== 'string')\n )\n throw new Error('Invalid query column.');\n\n return {\n name: value.name,\n ...('type' in value && value.type !== undefined\n ? { type: value.type as string }\n : {}),\n };\n}\n"
10
10
  ],
11
11
  "mappings": ";;AAKA;;;ACJO,SAAS,SAAS,CACvB,WACA,SACmB;AAAA,EACnB,IAAI,CAAC;AAAA,IAAW,MAAM,IAAI,MAAM,qBAAqB,SAAS;AAAA;;;ADsQzD,SAAS,gBAA4D,CAC1E,OACO;AAAA,EACP,MAAM,SAAS,OAAO,OAAO,KAAK;AAAA,EAClC,UACE,OAAO,MAAM,UAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,KAChC,IAAI,IAAI,MAAM,EAAE,SAAS,OAAO,QAClC,0CACF;AAAA,EAEA,OAAO;AAAA;AAGT,IAAM,mBAAmB,OAAO,IAAI,sCAAsC;AAAA;AAEnE,MAAM,wBAAwB,MAAM;AAAA,EAYvB;AAAA,EAMA;AAAA,GAjBR,oBAAoB;AAAA,EAC9B;AAAA,UAEQ,OAAO,YAAY,CAAC,OAAyB;AAAA,IACnD,OACE,iBAAiB,SAChB,MAA2C,sBAAsB;AAAA;AAAA,EAItE,WAAW,CACO,QAMA,QAChB;AAAA,IACA,MAAM,eAAe,SAAS,SAAS,KAAK,YAAY,KAAK;AAAA,IAR7C;AAAA,IAMA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEhB;AA8DO,IAAM,uBAAuB,iBAAiB;AAAA,EACnD,YAAY;AACd,CAAC;;;AE7VD,eAAsB,oBAAoB,CACxC,WACA;AAAA,EAEE;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,GAEF;AAAA,EACA,cAAc,eAAe;AAAA,EAC7B,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,UAAU,MAAM,KAAK;AAAA,IAC7B,MAAM;AAAA,IACN,MAAM,IAAI;AAAA;AAAA,EAGZ,MAAM,SAAS,YAAY,IAAI;AAAA,IAC7B;AAAA,IACA,YAAY,QAAQ,UAAU,OAAO,aAAa;AAAA,EACpD,CAAC;AAAA,EACD,MAAM,YAAY,yBAChB,WACA,WACA,QACA,aACF;AAAA,EACA,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,aAAa,WAAW,OAAO;AAAA,MAClD,WAAW,UAAU;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,IACD,MAAM,OAA+B;AAAA,MACnC,MAAM,UAAU,OAAO,MAAM;AAAA,MAC7B;AAAA,MACA,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,MAClC,UAAU,UAAU;AAAA,SAChB,UAAU,OAAO,aAAa,aAC9B,EAAE,SAAS,UAAU,QAAQ,IAC7B,CAAC;AAAA,IACP;AAAA,IACA,MAAM,iBAAiB,KAAK,UAAU,IAAI;AAAA,IAC1C,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,cAAc,EAAE;AAAA,IAC/D,IAAI,iBAAiB,UAAU,OAAO,oBAAoB;AAAA,MACxD,MAAM,IAAI,MAAM,8BAA8B;AAAA,IAEhD,OAAO,EAAE,MAAM,eAAe;AAAA,IAC9B,OAAO,OAAO;AAAA,IACd,IAAI,OAAO,WAAW,EAAE,iBAAiB;AAAA,MACvC,MAAM,IAAI;AAAA,IACZ,MAAM;AAAA;AAAA;AAKV,SAAS,wBAAwB,CAC/B,WACA,QACA,QACA,eACA;AAAA,EACA,MAAM,WAAqB,CAAC;AAAA,EAC5B,MAAM,UAA4B,CAAC;AAAA,EACnC,MAAM,YAAuB;AAAA,SACrB,SAAQ,CAAC,WAAW,SAAS;AAAA,MACjC,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,KAAK,QAAQ,QAAQ;AAAA,QACtD,MAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD,IACE,UAAU,cACV,CAAC,OAAO,OAAO,UAAU,UAAU,EAAE,SAAS,QAAQ,QAAQ,EAAE;AAAA,QAEhE,MAAM,IAAI,MACR,8CAA8C,gBAChD;AAAA,MACF,MAAM,QAAwB;AAAA,QAC5B,MAAM,QAAQ,QAAQ,SAAS,QAAQ,SAAS;AAAA,QAChD;AAAA,MACF;AAAA,MACA,QAAQ,KAAK,KAAK;AAAA,MAClB,MAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,OAAO,YAAY;AAAA,MACnE,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,SAAS,MAAM,OAAO,SAAS,WAAW;AAAA,UACxC;AAAA,UACA,QAAQ,YAAY,IAAI,CAAC,QAAQ,QAAQ,MAAM,CAAC;AAAA,QAClD,CAAC;AAAA,QACD,OAAO,OAAO;AAAA,QACd,IAAI,iBAAiB;AAAA,UAAiB,MAAM,YAAY,MAAM;AAAA,QAC9D,MAAM;AAAA;AAAA,MAER,IAAI,OAAO,KAAK,SAAS;AAAA,QACvB,MAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C,IAAI,OAAO,SAAS;AAAA,QAClB,MAAM,UAAU,OAAO;AAAA,QACvB,SAAS,KAAK,OAAO,OAAO;AAAA,MAC9B;AAAA,MAEA,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO,EAAE,WAAW,SAAS,SAAS;AAAA;AAIxC,eAAe,YAAY,CACzB,WACA,SACE,WAAW,UACb;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,OAAO,eAAe;AAAA,IACtB,MAAM,YAAY,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,MAClD,SAAS,aAAa,GAAG;AAAA,QACvB,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA;AAAA,MAEtC,QAAQ;AAAA,MACR,OAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,MAC9D,IAAI,OAAO;AAAA,QAAS,cAAc;AAAA,KACnC;AAAA,IAED,OAAO,MAAM,QAAQ,KAAK;AAAA,MACxB;AAAA,MACA,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAAA,QAC3B,OAAO,eAAe;AAAA,QAEtB,OAAO,UAAU,IAAI,EAAE,WAAW,OAAO,GAAG,KAAc;AAAA,OAC3D;AAAA,IACH,CAAC;AAAA,YACD;AAAA,IACA,IAAI;AAAA,MAAO,OAAO,oBAAoB,SAAS,KAAK;AAAA;AAAA;AAAA;AAIxD,MAAM,8BAA8B,MAAM;AAAC;AAAA;AAE3C,MAAM,4BAA4B,MAAM;AAAC;AAEzC,IAAM,sBAAsB;AAAA,EAC1B,cACE;AAAA,EACF,WACE;AAAA,EACF,cAAc;AAAA,EACd,gBACE;AAAA,EACF,aAAa;AACf;AAEO,SAAS,sBAAsB,CAAC,OAAgB,UAAU,OAAO;AAAA,EACtE,IAAI,iBAAiB;AAAA,IACnB,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF,IAAI,iBAAiB;AAAA,IACnB,OAAO;AAAA,MACL,QAAQ,MAAM,WAAW,iBAAiB,MAAM;AAAA,MAChD,MAAM,UAAU,MAAM;AAAA,MACtB,SAAS,oBAAoB,MAAM;AAAA,IACrC;AAAA,EACF,MAAM,WAAW,WAAW,iBAAiB;AAAA,EAC7C,OAAO;AAAA,IACL,QAAQ,WAAW,MAAM;AAAA,IACzB,MAAM,WAAW,YAAY;AAAA,IAC7B,SAAS,WACL,gCACA;AAAA,EACN;AAAA;;;AC7KK,SAAS,iBAAiB,CAC/B,YACA,WACA;AAAA,EACA,eAAe,iBAAiB,CAAC,SAAqC;AAAA,IACpE,MAAM,YAAY,OAAO,WAAW;AAAA,IACpC,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC/B,IAAI,CAAC,IAAI,SAAS,WAAW,YAAY;AAAA,MACvC,OAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,IAClD,MAAM,cAAc,IAAI,SAAS,MAAM,aAAa,MAAM;AAAA,IAC1D,IAAI,CAAC,eAAe,YAAY,SAAS,GAAG;AAAA,MAC1C,OAAO,QAAQ,KAAK,aAAa,2BAA2B,SAAS;AAAA,IACvE,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,OAAO,mBAAmB,WAAW;AAAA,MACrC,MAAM;AAAA,MACN,OAAO,QAAQ,KAAK,aAAa,2BAA2B,SAAS;AAAA;AAAA,IAEvE,IAAI,CAAC,OAAO,OAAO,YAAY,IAAI;AAAA,MACjC,OAAO,QAAQ,KAAK,aAAa,2BAA2B,SAAS;AAAA,IACvE,IAAI,QAAQ,WAAW;AAAA,MACrB,OAAO,QAAQ,KAAK,sBAAsB,aAAa,SAAS;AAAA,IAClE,IACE,QAAQ,QACL,IAAI,cAAc,GACjB,MAAM,GAAG,EAAE,IACX,KAAK,EACN,YAAY,MAAM;AAAA,MAErB,OAAO,QACL,KACA,0BACA,yBACA,SACF;AAAA,IACF,MAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ;AAAA,IAC3C,MAAM,YAAY,QAAQ,QAAQ,IAAI,gBAAgB;AAAA,IACtD,MAAM,YAAY,QAAQ,QAAQ,IAAI,gBAAgB;AAAA,IACtD,IACG,WAAW,QAAQ,WAAW,IAAI,UAClC,cAAc,QAAQ,cAAc,iBACpC,cAAc,QAAQ,WAAW,QACjC,cAAc,QACb,cAAc,UACd,cAAc;AAAA,MAEhB,OAAO,QACL,KACA,wBACA,6CACA,SACF;AAAA,IACF,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,MAAM,UAAU,SAAS,IAAI;AAAA,MACtC,MAAM;AAAA,MACN,OAAO,QACL,KACA,aACA,uCACA,SACF;AAAA;AAAA,IAEF,MAAM,YAAY,WAAW;AAAA,IAC7B,IAAI;AAAA,IACJ,IAAI,QAAQ,OAAO;AAAA,MACjB,OAAO,QAAQ,KAAK,WAAW,+BAA+B,SAAS;AAAA,IACzE,IAAI;AAAA,MACF,MAAM,OAAO,MAAM,UAAU,OAAO;AAAA,MACpC,QAAQ,KAAK,MAAM,IAAI;AAAA,MACvB,OAAO,OAAO;AAAA,MACd,IAAI,iBAAiB;AAAA,QACnB,OAAO,QACL,KACA,mBACA,uBACA,SACF;AAAA,MAEF,OAAO,QACL,KACA,iBACA,kCACA,SACF;AAAA;AAAA,IAEF,MAAM,SAAS,QAAQ;AAAA,IACvB,IAAI;AAAA,MACF,QAAQ,mBAAmB,MAAM,qBAAqB,WAAW,OAAO;AAAA,QACtE,WAAW,OAAO;AAAA,QAClB,YAAY,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,IAAI,SAAS,gBAAgB;AAAA,QAClC,SAAS;AAAA,UACP,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MACD,OAAO,OAAO;AAAA,MACd,MAAM,SAAS,iBAAiB,kBAAkB,QAAQ;AAAA,MAC1D,QAAQ,MACN,kBAAkB,gBAAgB,eAAe,SAAS,GAAG,OAAO,SAAS,OAAO,SAAS,KAAK,OAAO,YAAY,KAAK,OAAO,YAAY,OAAO,OAAO,cAAc,OAAO,iBAAiB,QAAQ,MAAM,OAAO,WACxN;AAAA,MACA,MAAM,UAAU,uBAAuB,OAAO,OAAO,OAAO;AAAA,MAE5D,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS,SAAS;AAAA;AAAA;AAAA,EAI3E,OAAO;AAAA;AAGT,SAAS,OAAO,CACd,QACA,MACA,SACA,WACU;AAAA,EACV,OAAO,SAAS,KACd,EAAE,OAAO,EAAE,MAAM,SAAS,UAAU,EAAE,GACtC,EAAE,QAAQ,SAAS,EAAE,iBAAiB,WAAW,EAAE,CACrD;AAAA;AAGF,IAAM,kBAAkB;AAAA;AACxB,MAAM,2BAA2B,MAAM;AAAC;AAGxC,eAAe,SAAS,CAAC,SAAmC;AAAA,EAC1D,MAAM,SAAS,QAAQ,MAAM,UAAU;AAAA,EACvC,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EACpB,MAAM,SAAuB,CAAC;AAAA,EAC9B,IAAI,OAAO;AAAA,EACX,IAAI;AAAA,EAEJ,SAAS,YAAY,GAAG;AAAA,IAEjB,OAAQ,OAAO,EAAE,MAAM,MAAM,EAAE;AAAA;AAAA,EAGtC,IAAI;AAAA,IACF,QAAQ,OAAO,eAAe;AAAA,IAC9B,MAAM,YAAY,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,MAClD,SAAS,aAAa,GAAG;AAAA,QACvB,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA,QACpC,aAAa;AAAA;AAAA,MAEf,QAAQ;AAAA,MACR,QAAQ,OAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,MACtE,IAAI,QAAQ,OAAO;AAAA,QAAS,cAAc;AAAA,KAC3C;AAAA,IACD,OAAO,MAAM;AAAA,MACX,QAAQ,MAAM,UAAU,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,SAAS,CAAC;AAAA,MACrE,IAAI;AAAA,QAAM;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,IAAI,OAAO,iBAAiB;AAAA,QAC1B,aAAa;AAAA,QACb,MAAM,IAAI;AAAA,MACZ;AAAA,MACA,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,MAAM,QAAQ,IAAI,WAAW,IAAI;AAAA,IACjC,IAAI,SAAS;AAAA,IACb,WAAW,SAAS,QAAQ;AAAA,MAC1B,MAAM,IAAI,OAAO,MAAM;AAAA,MACvB,UAAU,MAAM;AAAA,IAClB;AAAA,IAEA,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,YACrC;AAAA,IACA,IAAI;AAAA,MAAO,QAAQ,OAAO,oBAAoB,SAAS,KAAK;AAAA,IAC5D,OAAO,YAAY;AAAA;AAAA;;;AClLhB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,OAAO,QAAQ,IAAI,QAAQ,KAAK;AAAA,GAMtC;AAAA,EACD,MAAM,SAAS,IAAI,MAAM;AAAA,IACvB,UAAU;AAAA,IACV;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ,EAAE,KAAK,KAAK;AAAA,IACpB,OAAO,kBAAkB,YAAY,aAAa;AAAA,MAChD,WAAW,eAAe;AAAA,MAC1B,gBAAgB;AAAA,IAClB,EAAE;AAAA,EACJ,CAAC;AAAA,EACD,QAAQ,IAAI,GAAG,oBAAoB,OAAO,KAAK;AAAA,EAE/C,OAAO;AAAA;AAIF,SAAS,cAAc,CAC5B,cAAkD,QAAQ,KAC1D,UAAwB,OACb;AAAA,EACX,OAAO;AAAA,SACC,SAAQ,CAAC,aAAa,OAAO,UAAU;AAAA,MAC3C,MAAM,WAAW,YAAY;AAAA,MAC7B,MAAM,aAAa,YAAY;AAAA,MAC/B,MAAM,WAAW,YAAY;AAAA,MAC7B,MAAM,WAAW,YAAY;AAAA,MAC7B,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;AAAA,QAC9B,MAAM,IAAI,gBAAgB,cAAc;AAAA,MAC1C,IAAI,YAAY,CAAC;AAAA,QAAY,MAAM,IAAI,gBAAgB,cAAc;AAAA,MACrE,MAAM,OACJ,YACA,YAAY,uBACZ;AAAA,MACF,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,WAAW,MAAM,QACf,IAAI,IAAI,SAAS,GAAG,KAAK,QAAQ,OAAO,EAAE,IAAI,GAC9C;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe,WACX,UAAU,eACV,SAAS,OAAO,KAAK,GAAG,YAAY,UAAU,EAAE,SAAS,QAAQ;AAAA,YACrE,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,WAAW,MAAM,CAAC;AAAA,UACzC;AAAA,QACF,CACF;AAAA,QACA,OAAO,OAAO;AAAA,QACd,IAAI,OAAO;AAAA,UAAS,MAAM;AAAA,QAC1B,MAAM,IAAI,gBAAgB,aAAa;AAAA;AAAA,MAEzC,IAAI,CAAC,SAAS,IAAI;AAAA,QAChB,MAAM,SACJ,SAAS,WAAW,MAChB,iBACA,SAAS,WAAW,MAClB,cACA,SAAS,WAAW,MAClB,iBACA,SAAS,WAAW,OAAO,SAAS,WAAW,MAC7C,mBACA;AAAA,QACZ,MAAM,IAAI,gBAAgB,QAAQ,SAAS,MAAM;AAAA,MACnD;AAAA,MACA,MAAM,OAAO,MAAM,cAAc,QAAQ;AAAA,MAEzC,OAAO,iBAAiB,MAAM,KAAK;AAAA;AAAA,EAEvC;AAAA;AAGF,eAAe,aAAa,CAAC,UAAqC;AAAA,EAChE,MAAM,SAAS,SAAS,MAAM,UAAU;AAAA,EACxC,IAAI,CAAC;AAAA,IAAQ,MAAM,IAAI,MAAM,0BAA0B;AAAA,EACvD,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI,OAAO;AAAA,EACX,IAAI,QAAQ;AAAA,EACZ,OAAO,MAAM;AAAA,IACX,MAAM,QAAQ,MAAM,OAAO,KAAK;AAAA,IAChC,IAAI,MAAM;AAAA,MAAM;AAAA,IAChB,SAAS,MAAM,MAAM;AAAA,IACrB,IAAI,QAAQ,SAAW;AAAA,MACrB,MAAM,OAAO,OAAO;AAAA,MACpB,MAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAAA,IACA,QAAQ,QAAQ,OAAO,MAAM,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,EACtD;AAAA,EACA,QAAQ,QAAQ,OAAO;AAAA,EAEvB,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,MAAc,OAA4B;AAAA,EAClE,MAAM,QAAQ,KACX,QAAQ,EACR,MAAM;AAAA,CAAI,EACV,OAAO,UAAQ,KAAK,KAAK,CAAC;AAAA,EAC7B,IAAI,CAAC,MAAM;AAAA,IAAQ,MAAM,IAAI,MAAM,0BAA0B;AAAA,EAC7D,MAAM,WAAoB,KAAK,MAAM,MAAM,EAAG;AAAA,EAC9C,IACE,CAAC,YACD,OAAO,aAAa,YACpB,MAAM,QAAQ,QAAQ,KACrB,cAAc,YACb,SAAS,aAAa,aACtB,OAAO,SAAS,aAAa;AAAA,IAE/B,MAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C,MAAM,UACJ,cAAc,WACT,SAAS,WACV;AAAA,EACN,IAAI,gBAAgB;AAAA,EACpB,IAAI,UAAkC,CAAC;AAAA,EACvC,IAAI,MAAM,gBAAgB;AAAA,IACxB,MAAM,oBAAoB,KAAK,MAAM,MAAM,cAAe;AAAA,IAC1D,IACE,MAAM,QAAQ,iBAAiB,KAC/B,kBAAkB,MAChB,WACE,OAAO,UAAU,YAChB,OAAO,UAAU,YAAY,UAAU,SAAQ,UAAU,MAC9D,GACA;AAAA,MACA,UAAU,kBAAkB,IAAI,WAC9B,OAAO,UAAU,WAAW,EAAE,MAAM,MAAM,IAAI,YAAY,KAAK,CACjE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,MAAM,MAAM,aAAa,EAAE,IAAI,UAAQ;AAAA,IAClD,MAAM,MAAe,KAAK,MAAM,IAAI;AAAA,IACpC,IACE,CAAC,MAAM,QAAQ,GAAG,KACjB,kBAAkB,KAAK,IAAI,WAAW,QAAQ;AAAA,MAE/C,MAAM,IAAI,MAAM,oBAAoB;AAAA,IAEtC,OAAO;AAAA,GACR;AAAA,EACD,IAAI,KAAK,SAAS;AAAA,IAChB,MAAM,IAAI,MAAM,8CAA8C;AAAA,EAEhE,OAAO,EAAE,SAAS,MAAM,QAAQ;AAAA;AAGlC,SAAS,WAAW,CAAC,OAAgD;AAAA,EACnE,IACE,CAAC,SACD,OAAO,UAAU,YACjB,EAAE,UAAU,UACZ,OAAO,MAAM,SAAS,YACrB,UAAU,SACT,MAAM,SAAS,aACf,OAAO,MAAM,SAAS;AAAA,IAExB,MAAM,IAAI,MAAM,uBAAuB;AAAA,EAEzC,OAAO;AAAA,IACL,MAAM,MAAM;AAAA,OACR,UAAU,SAAS,MAAM,SAAS,YAClC,EAAE,MAAM,MAAM,KAAe,IAC7B,CAAC;AAAA,EACP;AAAA;",
12
- "debugId": "FEF1CCB4D9E6AAED64756E2164756E21",
12
+ "debugId": "FB183031B1F856D564756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  attachDataAppBridge2
3
- } from "../../chunks/contract-g6hky7x6.js";
3
+ } from "../../chunks/contract-h8a6f559.js";
4
4
 
5
5
  // src/react/embed/bridge.tsx
6
6
  import {