@marimo-team/frontend 0.25.3-dev104 → 0.25.3-dev108

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 (112) hide show
  1. package/dist/assets/{CellStatus-DVrvejMC.js → CellStatus-_Aw9_foI.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-Dft8R6l5.js → ConnectedDataExplorerComponent-BRgqbAsc.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-0akNKvJm.js → ErrorBoundary-DxSzjvbx.js} +2 -2
  4. package/dist/assets/{JsonOutput-DeUmpc_f.js → JsonOutput-B7pGj79O.js} +2 -2
  5. package/dist/assets/{MarimoErrorOutput-BazxeAYV.js → MarimoErrorOutput-Bzo6Bkp5.js} +1 -1
  6. package/dist/assets/{RenderHTML-CbAdeual.js → RenderHTML-D6AC0IhC.js} +1 -1
  7. package/dist/assets/{RunButton-CjKwgCFU.js → RunButton-BjYsPiKa.js} +1 -1
  8. package/dist/assets/{add-cell-with-ai-BKVEws3J.js → add-cell-with-ai-DlpS2-wQ.js} +4 -4
  9. package/dist/assets/{add-connection-dialog-DS7LTz1T.js → add-connection-dialog-CyNAB_W2.js} +1 -1
  10. package/dist/assets/{agent-panel-B34QcdOK.js → agent-panel-_lzeDJ1g.js} +1 -1
  11. package/dist/assets/{ai-model-dropdown-DqFJCFVR.js → ai-model-dropdown-DSTTUxpi.js} +1 -1
  12. package/dist/assets/{app-config-button-CVh4UKi9.js → app-config-button-ChYKLsLO.js} +1 -1
  13. package/dist/assets/{blob-Bw0ZQoLx.js → blob-DTYOX-m5.js} +1 -1
  14. package/dist/assets/{cell-editor-DQ0io5Ye.js → cell-editor-Beg8ahPA.js} +2 -2
  15. package/dist/assets/{cell-link-DvOIu6A3.js → cell-link-D3rkqgbU.js} +1 -1
  16. package/dist/assets/{cells-Do-63MKT.js → cells-2HETnlvE.js} +5 -5
  17. package/dist/assets/{chat-display-DnkhBxdh.js → chat-display-0GIEXLvN.js} +1 -1
  18. package/dist/assets/{chat-panel-CN3qoX9G.js → chat-panel-BuWn4Z_F.js} +1 -1
  19. package/dist/assets/{chat-ui-B54K5qqr.js → chat-ui-X0s3vvdf.js} +1 -1
  20. package/dist/assets/{column-preview-DmxzHzaW.js → column-preview-yI7-INkZ.js} +1 -1
  21. package/dist/assets/{command-palette-CciCeRhy.js → command-palette-D6WLW1Ie.js} +1 -1
  22. package/dist/assets/{common-BCyx7t1i.js → common-DgXKwblm.js} +1 -1
  23. package/dist/assets/{components-CDvWXfXq.js → components-CuMhY4Sf.js} +1 -1
  24. package/dist/assets/{datasource-DieftweT.js → datasource-D9JMcEAP.js} +1 -1
  25. package/dist/assets/{dependency-graph-panel-IfcqTHgq.js → dependency-graph-panel-BVJWPCvw.js} +3 -3
  26. package/dist/assets/{documentation-panel-DeLCgVcq.js → documentation-panel--wI4XHso.js} +1 -1
  27. package/dist/assets/{download-BzfVCqUq.js → download-Dod42wfD.js} +1 -1
  28. package/dist/assets/{edit-page-HMyk4cWw.js → edit-page-EmacXgdB.js} +4 -4
  29. package/dist/assets/{error-entries-DjjWrbt4.js → error-entries-D00nWhWE.js} +1 -1
  30. package/dist/assets/{error-panel-CiG3JJA3.js → error-panel-CcN_1PWf.js} +1 -1
  31. package/dist/assets/{feedback-button-B8zVQEi6.js → feedback-button-ByGgqUsX.js} +1 -1
  32. package/dist/assets/feedback-button-tbWwJ_t6.js +1 -0
  33. package/dist/assets/{file-explorer-panel-BPD8Q0L-.js → file-explorer-panel-eTEqtMPW.js} +1 -1
  34. package/dist/assets/{file-name-input-CdkF9K3I.js → file-name-input-D5SfTNWh.js} +1 -1
  35. package/dist/assets/{floating-outline-TfDWJXBm.js → floating-outline-B-k3P_AO.js} +1 -1
  36. package/dist/assets/{gallery-page-BJpenPdQ.js → gallery-page-BzbMhDHi.js} +1 -1
  37. package/dist/assets/{glide-data-editor-DO15Nm-R.js → glide-data-editor-BMqhUrHI.js} +1 -1
  38. package/dist/assets/{home-page-mvqldGvD.js → home-page-BvA1BCmX.js} +1 -1
  39. package/dist/assets/{hooks-C4AJfqV0.js → hooks-CaRBg2ni.js} +1 -1
  40. package/dist/assets/{index-C2XzUsS7.js → index-hwaZTQ9l.js} +9 -9
  41. package/dist/assets/{layout-1kSh6fBF.js → layout-C-NAerIZ.js} +3 -3
  42. package/dist/assets/{logs-panel--QbHo7uS.js → logs-panel-B3T1GFBk.js} +1 -1
  43. package/dist/assets/{markdown-renderer-DJ7H8Rps.js → markdown-renderer-BhiTvxtL.js} +1 -1
  44. package/dist/assets/{name-cell-input-6Gd19S8T.js → name-cell-input-CgAObR6N.js} +1 -1
  45. package/dist/assets/{outline-panel-CjKvunvX.js → outline-panel-BhBb7Vqw.js} +1 -1
  46. package/dist/assets/{packages-panel-Gyrqi-MZ.js → packages-panel-Dz8rOIrh.js} +1 -1
  47. package/dist/assets/{panel-accordion-state-D49TNCLQ.js → panel-accordion-state-ZsUdpAYn.js} +1 -1
  48. package/dist/assets/{panels-DfbxoeGa.js → panels-B0lqLcI0.js} +1 -1
  49. package/dist/assets/{process-output-CgkoeA1-.js → process-output-CeOMwE17.js} +1 -1
  50. package/dist/assets/{readonly-code-display-BMbl_4BR.js → readonly-code-display-TvOC7ESE.js} +1 -1
  51. package/dist/assets/{readonly-python-code-BnPfpOJM.js → readonly-python-code-Cqkfdeyo.js} +1 -1
  52. package/dist/assets/{reveal-component-D84yAzG7.js → reveal-component-y06O6YuH.js} +1 -1
  53. package/dist/assets/{run-page-B10s8Pre.js → run-page-DHE6ET5K.js} +1 -1
  54. package/dist/assets/{runtime-details-state-Bkmgb59p.js → runtime-details-state-CKqJSfSR.js} +1 -1
  55. package/dist/assets/{scratchpad-panel-DtyjJ3yN.js → scratchpad-panel-BW_HfG5l.js} +1 -1
  56. package/dist/assets/{session-panel-Chaq1do8.js → session-panel-CdHdKUCF.js} +1 -1
  57. package/dist/assets/{snippets-panel-BaZmddOW.js → snippets-panel-DYLWOLYw.js} +1 -1
  58. package/dist/assets/{spec-uCpVvaAR.js → spec-DlH4Mp7d.js} +1 -1
  59. package/dist/assets/{state-Db73TZVD.js → state-DAqdiGqq.js} +1 -1
  60. package/dist/assets/{state-CqnCwHhY.js → state-DZN9vZ6z.js} +1 -1
  61. package/dist/assets/{tracing-C2vQMUI0.js → tracing-B0J2ctTm.js} +1 -1
  62. package/dist/assets/{tracing-panel-B4L2S2ac.js → tracing-panel-C1OCpoeE.js} +2 -2
  63. package/dist/assets/{tree-actions-JXDiioHK.js → tree-actions-sjBxIglc.js} +1 -1
  64. package/dist/assets/{useAddCell-CP3HIjGl.js → useAddCell-CaXnFGki.js} +1 -1
  65. package/dist/assets/{useCellActionButton-yi1_-emd.js → useCellActionButton-CJ90CMEj.js} +1 -1
  66. package/dist/assets/{useDeleteCell-BPLwyClM.js → useDeleteCell-D9N85822.js} +1 -1
  67. package/dist/assets/{useDependencyPanelTab-DmBiydXO.js → useDependencyPanelTab-CzAE0cm-.js} +1 -1
  68. package/dist/assets/{useNotebookActions-CfmgcJGx.js → useNotebookActions-CTKkktJB.js} +1 -1
  69. package/dist/assets/{useRunCells-jF-7tJkw.js → useRunCells-DGakx8hj.js} +1 -1
  70. package/dist/assets/{useSplitCell-B6zWL8Zf.js → useSplitCell-AK5BKPGM.js} +1 -1
  71. package/dist/index.html +21 -21
  72. package/package.json +2 -2
  73. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  74. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  75. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  76. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  77. package/src/components/data-table/charts/charts.tsx +5 -5
  78. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  79. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  80. package/src/components/dependency-graph/elements.ts +24 -21
  81. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  82. package/src/components/editor/output/ansi-reduce.ts +30 -23
  83. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  84. package/src/core/ai/tools/base.ts +16 -7
  85. package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
  86. package/src/core/ai/tools/registry.ts +13 -8
  87. package/src/core/ai/tools/sample-tool.ts +6 -7
  88. package/src/core/cells/__tests__/session.test.ts +117 -36
  89. package/src/core/codemirror/__tests__/setup.test.ts +28 -28
  90. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  91. package/src/core/codemirror/language/extension.ts +8 -8
  92. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  93. package/src/core/codemirror/language/languages/python.ts +13 -7
  94. package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
  95. package/src/core/codemirror/language/types.ts +7 -7
  96. package/src/core/codemirror/rtc/extension.ts +24 -12
  97. package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
  98. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  99. package/src/core/codemirror/utils.ts +1 -0
  100. package/src/core/host/__tests__/static.test.ts +167 -0
  101. package/src/core/host/backend.ts +10 -0
  102. package/src/core/host/static.ts +70 -0
  103. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  104. package/src/core/static/__tests__/files.test.ts +38 -10
  105. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  106. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  107. package/src/plugins/impl/DataTablePlugin.tsx +15 -18
  108. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
  109. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  110. package/src/plugins/impl/plotly/selection.ts +25 -19
  111. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  112. package/dist/assets/feedback-button-DQdMkSvR.js +0 -1
@@ -60,14 +60,14 @@ describe("ColumnChartSpecModel", () => {
60
60
  };
61
61
 
62
62
  it("should create an instance", () => {
63
- const model = new ColumnChartSpecModel(
64
- [],
65
- mockFieldTypes,
66
- mockStats,
67
- mockBinValues,
68
- mockValueCounts,
69
- { includeCharts: true },
70
- );
63
+ const model = new ColumnChartSpecModel({
64
+ data: [],
65
+ fieldTypes: mockFieldTypes,
66
+ stats: mockStats,
67
+ binValues: mockBinValues,
68
+ valueCounts: mockValueCounts,
69
+ opts: { includeCharts: true },
70
+ });
71
71
  expect(model).toBeInstanceOf(ColumnChartSpecModel);
72
72
  });
73
73
 
@@ -77,14 +77,14 @@ describe("ColumnChartSpecModel", () => {
77
77
  });
78
78
 
79
79
  it("should return header summary with spec when includeCharts is true", () => {
80
- const model = new ColumnChartSpecModel(
81
- [],
82
- mockFieldTypes,
83
- mockStats,
84
- mockBinValues,
85
- mockValueCounts,
86
- { includeCharts: true },
87
- );
80
+ const model = new ColumnChartSpecModel({
81
+ data: [],
82
+ fieldTypes: mockFieldTypes,
83
+ stats: mockStats,
84
+ binValues: mockBinValues,
85
+ valueCounts: mockValueCounts,
86
+ opts: { includeCharts: true },
87
+ });
88
88
  const dateSummary = model.getHeaderSummary("date");
89
89
  expect(dateSummary.stats).toEqual(mockStats.date);
90
90
  expect(dateSummary.type).toBe("date");
@@ -92,14 +92,14 @@ describe("ColumnChartSpecModel", () => {
92
92
  });
93
93
 
94
94
  it("should return header summary without spec when includeCharts is false", () => {
95
- const model = new ColumnChartSpecModel(
96
- [],
97
- mockFieldTypes,
98
- mockStats,
99
- mockBinValues,
100
- mockValueCounts,
101
- { includeCharts: false },
102
- );
95
+ const model = new ColumnChartSpecModel({
96
+ data: [],
97
+ fieldTypes: mockFieldTypes,
98
+ stats: mockStats,
99
+ binValues: mockBinValues,
100
+ valueCounts: mockValueCounts,
101
+ opts: { includeCharts: false },
102
+ });
103
103
  const numberSummary = model.getHeaderSummary("number");
104
104
  expect(numberSummary.stats).toEqual(mockStats.number);
105
105
  expect(numberSummary.type).toBe("number");
@@ -107,14 +107,14 @@ describe("ColumnChartSpecModel", () => {
107
107
  });
108
108
 
109
109
  it("should return null spec for unknown types", () => {
110
- const model = new ColumnChartSpecModel(
111
- [],
112
- mockFieldTypes,
113
- mockStats,
114
- mockBinValues,
115
- mockValueCounts,
116
- { includeCharts: true },
117
- );
110
+ const model = new ColumnChartSpecModel({
111
+ data: [],
112
+ fieldTypes: mockFieldTypes,
113
+ stats: mockStats,
114
+ binValues: mockBinValues,
115
+ valueCounts: mockValueCounts,
116
+ opts: { includeCharts: true },
117
+ });
118
118
  const unknownSummary = model.getHeaderSummary("unknown");
119
119
  expect(unknownSummary.spec).toBeNull();
120
120
  });
@@ -133,14 +133,14 @@ describe("ColumnChartSpecModel", () => {
133
133
  { bin_start: "2023-06-01", bin_end: "2023-12-31", count: 20 },
134
134
  ],
135
135
  };
136
- const model = new ColumnChartSpecModel(
137
- [],
138
- specialFieldTypes,
139
- specialStats,
140
- specialBinValues,
141
- mockValueCounts,
142
- { includeCharts: true },
143
- );
136
+ const model = new ColumnChartSpecModel({
137
+ data: [],
138
+ fieldTypes: specialFieldTypes,
139
+ stats: specialStats,
140
+ binValues: specialBinValues,
141
+ valueCounts: mockValueCounts,
142
+ opts: { includeCharts: true },
143
+ });
144
144
  const summary = model.getHeaderSummary("column.with[special:chars]");
145
145
  expect(summary.spec).toBeDefined();
146
146
  expect(
@@ -150,14 +150,14 @@ describe("ColumnChartSpecModel", () => {
150
150
  });
151
151
 
152
152
  it("should expect bin values to be used for number and integer columns", () => {
153
- const model = new ColumnChartSpecModel(
154
- [],
155
- mockFieldTypes,
156
- mockStats,
157
- mockBinValues,
158
- mockValueCounts,
159
- { includeCharts: true },
160
- );
153
+ const model = new ColumnChartSpecModel({
154
+ data: [],
155
+ fieldTypes: mockFieldTypes,
156
+ stats: mockStats,
157
+ binValues: mockBinValues,
158
+ valueCounts: mockValueCounts,
159
+ opts: { includeCharts: true },
160
+ });
161
161
  const summary = model.getHeaderSummary("number");
162
162
  expect(summary.spec).toBeDefined();
163
163
  // @ts-expect-error data.values should be available
@@ -185,14 +185,14 @@ describe("ColumnChartSpecModel", () => {
185
185
  const allNullBins: Record<ColumnName, BinValues> = {
186
186
  number: [],
187
187
  };
188
- const model = new ColumnChartSpecModel(
189
- [],
190
- mockFieldTypes,
191
- allNullStats,
192
- allNullBins,
193
- {},
194
- { includeCharts: true },
195
- );
188
+ const model = new ColumnChartSpecModel({
189
+ data: [],
190
+ fieldTypes: mockFieldTypes,
191
+ stats: allNullStats,
192
+ binValues: allNullBins,
193
+ valueCounts: {},
194
+ opts: { includeCharts: true },
195
+ });
196
196
  const summary = model.getHeaderSummary("number");
197
197
  expect(summary.spec).toBeDefined();
198
198
  // @ts-expect-error hconcat should be available
@@ -221,14 +221,14 @@ describe("ColumnChartSpecModel", () => {
221
221
  const stats: Record<ColumnName, Partial<ColumnHeaderStats>> = {
222
222
  number: { nulls: 12, total: 12 },
223
223
  };
224
- const model = new ColumnChartSpecModel(
225
- [],
226
- mockFieldTypes,
224
+ const model = new ColumnChartSpecModel({
225
+ data: [],
226
+ fieldTypes: mockFieldTypes,
227
227
  stats,
228
- nanOnlyBins,
229
- {},
230
- { includeCharts: true },
231
- );
228
+ binValues: nanOnlyBins,
229
+ valueCounts: {},
230
+ opts: { includeCharts: true },
231
+ });
232
232
  const first = model.getHeaderSummary("number");
233
233
  const second = model.getHeaderSummary("number");
234
234
  // All NaN bins are invalid → null-only chart
@@ -241,14 +241,14 @@ describe("ColumnChartSpecModel", () => {
241
241
  });
242
242
 
243
243
  it("should render a null bar for all-null temporal columns", () => {
244
- const model = new ColumnChartSpecModel(
245
- [],
246
- mockFieldTypes,
247
- { datetime: { nulls: 12, total: 12 } },
248
- { datetime: [] },
249
- {},
250
- { includeCharts: true },
251
- );
244
+ const model = new ColumnChartSpecModel({
245
+ data: [],
246
+ fieldTypes: mockFieldTypes,
247
+ stats: { datetime: { nulls: 12, total: 12 } },
248
+ binValues: { datetime: [] },
249
+ valueCounts: {},
250
+ opts: { includeCharts: true },
251
+ });
252
252
  const summary = model.getHeaderSummary("datetime");
253
253
  expect(summary.spec).toBeDefined();
254
254
  // @ts-expect-error data.values
@@ -265,26 +265,26 @@ describe("ColumnChartSpecModel", () => {
265
265
  });
266
266
 
267
267
  it("should return null when numeric bins are empty and there are no nulls", () => {
268
- const model = new ColumnChartSpecModel(
269
- [],
270
- mockFieldTypes,
271
- { number: { min: 0, max: 1 } },
272
- { number: [] },
273
- {},
274
- { includeCharts: true },
275
- );
268
+ const model = new ColumnChartSpecModel({
269
+ data: [],
270
+ fieldTypes: mockFieldTypes,
271
+ stats: { number: { min: 0, max: 1 } },
272
+ binValues: { number: [] },
273
+ valueCounts: {},
274
+ opts: { includeCharts: true },
275
+ });
276
276
  expect(model.getHeaderSummary("number").spec).toBeNull();
277
277
  });
278
278
 
279
279
  it("should handle datetime bin values", () => {
280
- const model = new ColumnChartSpecModel(
281
- [],
282
- mockFieldTypes,
283
- mockStats,
284
- mockBinValues,
285
- mockValueCounts,
286
- { includeCharts: true },
287
- );
280
+ const model = new ColumnChartSpecModel({
281
+ data: [],
282
+ fieldTypes: mockFieldTypes,
283
+ stats: mockStats,
284
+ binValues: mockBinValues,
285
+ valueCounts: mockValueCounts,
286
+ opts: { includeCharts: true },
287
+ });
288
288
 
289
289
  const summary = model.getHeaderSummary("datetime");
290
290
  expect(summary.spec).toBeDefined();
@@ -301,14 +301,14 @@ describe("ColumnChartSpecModel", () => {
301
301
  ...mockStats,
302
302
  datetime: { min: "2023-01-01", max: "2023-12-31" },
303
303
  };
304
- const model2 = new ColumnChartSpecModel(
305
- [],
306
- mockFieldTypes,
307
- mockStats2,
308
- mockBinValues,
309
- mockValueCounts,
310
- { includeCharts: true },
311
- );
304
+ const model2 = new ColumnChartSpecModel({
305
+ data: [],
306
+ fieldTypes: mockFieldTypes,
307
+ stats: mockStats2,
308
+ binValues: mockBinValues,
309
+ valueCounts: mockValueCounts,
310
+ opts: { includeCharts: true },
311
+ });
312
312
  const summary2 = model2.getHeaderSummary("datetime");
313
313
  expect(summary2.spec).toBeDefined();
314
314
 
@@ -318,14 +318,14 @@ describe("ColumnChartSpecModel", () => {
318
318
  });
319
319
 
320
320
  it("should handle boolean stats", () => {
321
- const model = new ColumnChartSpecModel(
322
- [],
323
- mockFieldTypes,
324
- mockStats,
325
- mockBinValues,
326
- mockValueCounts,
327
- { includeCharts: true },
328
- );
321
+ const model = new ColumnChartSpecModel({
322
+ data: [],
323
+ fieldTypes: mockFieldTypes,
324
+ stats: mockStats,
325
+ binValues: mockBinValues,
326
+ valueCounts: mockValueCounts,
327
+ opts: { includeCharts: true },
328
+ });
329
329
  const summary = model.getHeaderSummary("boolean");
330
330
  expect(summary.spec).toBeDefined();
331
331
  // @ts-expect-error data.values should be available
@@ -340,14 +340,14 @@ describe("ColumnChartSpecModel", () => {
340
340
  });
341
341
 
342
342
  it("should handle string value counts", () => {
343
- const model = new ColumnChartSpecModel(
344
- [],
345
- mockFieldTypes,
346
- mockStats,
347
- mockBinValues,
348
- mockValueCounts,
349
- { includeCharts: true },
350
- );
343
+ const model = new ColumnChartSpecModel({
344
+ data: [],
345
+ fieldTypes: mockFieldTypes,
346
+ stats: mockStats,
347
+ binValues: mockBinValues,
348
+ valueCounts: mockValueCounts,
349
+ opts: { includeCharts: true },
350
+ });
351
351
  const summary = model.getHeaderSummary("string");
352
352
  expect(summary.spec).toBeDefined();
353
353
  // @ts-expect-error data.values should be available
@@ -374,64 +374,64 @@ describe("ColumnChartSpecModel", () => {
374
374
  ]);
375
375
 
376
376
  it("url data", () => {
377
- const model = new ColumnChartSpecModel(
378
- mockData,
377
+ const model = new ColumnChartSpecModel({
378
+ data: mockData,
379
379
  fieldTypes,
380
- mockStats,
381
- mockBinValues,
382
- mockValueCounts,
383
- { includeCharts: true },
384
- );
380
+ stats: mockStats,
381
+ binValues: mockBinValues,
382
+ valueCounts: mockValueCounts,
383
+ opts: { includeCharts: true },
384
+ });
385
385
  expect(model.getHeaderSummary("date").spec).toMatchSnapshot();
386
386
  });
387
387
 
388
388
  it("csv data", () => {
389
- const model = new ColumnChartSpecModel(
390
- `data:text/csv;base64,${btoa("a,b,c\n1,2,3\n4,5,6")}`,
389
+ const model = new ColumnChartSpecModel({
390
+ data: `data:text/csv;base64,${btoa("a,b,c\n1,2,3\n4,5,6")}`,
391
391
  fieldTypes,
392
- mockStats,
393
- mockBinValues,
394
- mockValueCounts,
395
- { includeCharts: true },
396
- );
392
+ stats: mockStats,
393
+ binValues: mockBinValues,
394
+ valueCounts: mockValueCounts,
395
+ opts: { includeCharts: true },
396
+ });
397
397
  expect(model.getHeaderSummary("a").spec).toMatchSnapshot();
398
398
  });
399
399
 
400
400
  it("csv string", () => {
401
- const model = new ColumnChartSpecModel(
402
- "a,b,c\n1,2,3\n4,5,6",
401
+ const model = new ColumnChartSpecModel({
402
+ data: "a,b,c\n1,2,3\n4,5,6",
403
403
  fieldTypes,
404
- mockStats,
405
- mockBinValues,
406
- mockValueCounts,
407
- { includeCharts: true },
408
- );
404
+ stats: mockStats,
405
+ binValues: mockBinValues,
406
+ valueCounts: mockValueCounts,
407
+ opts: { includeCharts: true },
408
+ });
409
409
  expect(model.getHeaderSummary("a").spec).toMatchSnapshot();
410
410
  });
411
411
 
412
412
  it("array", () => {
413
- const model = new ColumnChartSpecModel(
414
- ["a", "b", "c"],
413
+ const model = new ColumnChartSpecModel({
414
+ data: ["a", "b", "c"],
415
415
  fieldTypes,
416
- mockStats,
417
- mockBinValues,
418
- mockValueCounts,
419
- { includeCharts: true },
420
- );
416
+ stats: mockStats,
417
+ binValues: mockBinValues,
418
+ valueCounts: mockValueCounts,
419
+ opts: { includeCharts: true },
420
+ });
421
421
  expect(model.getHeaderSummary("a").spec).toMatchSnapshot();
422
422
  });
423
423
  });
424
424
 
425
425
  describe("file URL handling", () => {
426
426
  it("should handle marimo file URLs with ./@file prefix", () => {
427
- const model = new ColumnChartSpecModel(
428
- "./@file/data.csv",
429
- mockFieldTypes,
430
- mockStats,
431
- mockBinValues,
432
- mockValueCounts,
433
- { includeCharts: true },
434
- );
427
+ const model = new ColumnChartSpecModel({
428
+ data: "./@file/data.csv",
429
+ fieldTypes: mockFieldTypes,
430
+ stats: mockStats,
431
+ binValues: mockBinValues,
432
+ valueCounts: mockValueCounts,
433
+ opts: { includeCharts: true },
434
+ });
435
435
 
436
436
  const summary = model.getHeaderSummary("date");
437
437
  expect(summary.spec).toBeDefined();
@@ -440,14 +440,14 @@ describe("ColumnChartSpecModel", () => {
440
440
  });
441
441
 
442
442
  it("should handle marimo file URLs with /@file prefix", () => {
443
- const model = new ColumnChartSpecModel(
444
- "/@file/data.csv",
445
- mockFieldTypes,
446
- mockStats,
447
- mockBinValues,
448
- mockValueCounts,
449
- { includeCharts: true },
450
- );
443
+ const model = new ColumnChartSpecModel({
444
+ data: "/@file/data.csv",
445
+ fieldTypes: mockFieldTypes,
446
+ stats: mockStats,
447
+ binValues: mockBinValues,
448
+ valueCounts: mockValueCounts,
449
+ opts: { includeCharts: true },
450
+ });
451
451
 
452
452
  const summary = model.getHeaderSummary("date");
453
453
  expect(summary.spec).toBeDefined();
@@ -456,14 +456,14 @@ describe("ColumnChartSpecModel", () => {
456
456
  });
457
457
 
458
458
  it("should handle absolute HTTP URLs", () => {
459
- const model = new ColumnChartSpecModel(
460
- "https://external.com/data.csv",
461
- mockFieldTypes,
462
- mockStats,
463
- mockBinValues,
464
- mockValueCounts,
465
- { includeCharts: true },
466
- );
459
+ const model = new ColumnChartSpecModel({
460
+ data: "https://external.com/data.csv",
461
+ fieldTypes: mockFieldTypes,
462
+ stats: mockStats,
463
+ binValues: mockBinValues,
464
+ valueCounts: mockValueCounts,
465
+ opts: { includeCharts: true },
466
+ });
467
467
 
468
468
  const summary = model.getHeaderSummary("date");
469
469
  expect(summary.spec).toBeDefined();
@@ -473,14 +473,14 @@ describe("ColumnChartSpecModel", () => {
473
473
 
474
474
  it("should handle data URLs", () => {
475
475
  const dataUrl = "data:text/csv;base64,YSxiLGMKMSwyLDMKNCw1LDY=";
476
- const model = new ColumnChartSpecModel(
477
- dataUrl,
478
- mockFieldTypes,
479
- mockStats,
480
- mockBinValues,
481
- mockValueCounts,
482
- { includeCharts: true },
483
- );
476
+ const model = new ColumnChartSpecModel({
477
+ data: dataUrl,
478
+ fieldTypes: mockFieldTypes,
479
+ stats: mockStats,
480
+ binValues: mockBinValues,
481
+ valueCounts: mockValueCounts,
482
+ opts: { includeCharts: true },
483
+ });
484
484
 
485
485
  const summary = model.getHeaderSummary("date");
486
486
  expect(summary.spec).toBeDefined();
@@ -491,14 +491,14 @@ describe("ColumnChartSpecModel", () => {
491
491
 
492
492
  it("should handle CSV string data", () => {
493
493
  const csvString = "a,b,c\n1,2,3\n4,5,6";
494
- const model = new ColumnChartSpecModel(
495
- csvString,
496
- mockFieldTypes,
497
- mockStats,
498
- mockBinValues,
499
- mockValueCounts,
500
- { includeCharts: true },
501
- );
494
+ const model = new ColumnChartSpecModel({
495
+ data: csvString,
496
+ fieldTypes: mockFieldTypes,
497
+ stats: mockStats,
498
+ binValues: mockBinValues,
499
+ valueCounts: mockValueCounts,
500
+ opts: { includeCharts: true },
501
+ });
502
502
 
503
503
  const summary = model.getHeaderSummary("date");
504
504
  expect(summary.spec).toBeDefined();
@@ -509,14 +509,14 @@ describe("ColumnChartSpecModel", () => {
509
509
 
510
510
  it("should handle arrow data", () => {
511
511
  const arrowData = "ARROW1\n";
512
- const model = new ColumnChartSpecModel(
513
- `data:text/plain;base64,${btoa(arrowData)}`,
514
- mockFieldTypes,
515
- mockStats,
516
- mockBinValues,
517
- mockValueCounts,
518
- { includeCharts: true },
519
- );
512
+ const model = new ColumnChartSpecModel({
513
+ data: `data:text/plain;base64,${btoa(arrowData)}`,
514
+ fieldTypes: mockFieldTypes,
515
+ stats: mockStats,
516
+ binValues: mockBinValues,
517
+ valueCounts: mockValueCounts,
518
+ opts: { includeCharts: true },
519
+ });
520
520
  const spec = model.getHeaderSummary("date").spec;
521
521
  expect(spec).toMatchSnapshot();
522
522
  expect(spec?.data?.format?.type).toBe("arrow");
@@ -529,14 +529,14 @@ describe("ColumnChartSpecModel", () => {
529
529
  { a: 1, b: 2, c: 3 },
530
530
  { a: 4, b: 5, c: 6 },
531
531
  ];
532
- const model = new ColumnChartSpecModel(
533
- arrayData,
534
- mockFieldTypes,
535
- mockStats,
536
- mockBinValues,
537
- mockValueCounts,
538
- { includeCharts: true },
539
- );
532
+ const model = new ColumnChartSpecModel({
533
+ data: arrayData,
534
+ fieldTypes: mockFieldTypes,
535
+ stats: mockStats,
536
+ binValues: mockBinValues,
537
+ valueCounts: mockValueCounts,
538
+ opts: { includeCharts: true },
539
+ });
540
540
 
541
541
  const summary = model.getHeaderSummary("date");
542
542
  expect(summary.spec).toBeDefined();
@@ -39,13 +39,13 @@ describe("create vega spec", () => {
39
39
  });
40
40
 
41
41
  it("should create and augment a spec", () => {
42
- const spec = createSpecWithoutData(
43
- ChartType.BAR,
44
- createBasicFormValues(),
45
- "light",
46
- 400,
47
- 300,
48
- );
42
+ const spec = createSpecWithoutData({
43
+ chartType: ChartType.BAR,
44
+ formValues: createBasicFormValues(),
45
+ theme: "light",
46
+ width: 400,
47
+ height: 300,
48
+ });
49
49
  expect(spec).toMatchSnapshot();
50
50
  expect(typeof spec !== "string").toBe(true); // Not error message
51
51
  expect((spec as TopLevelSpec).data).toEqual({ values: [] });
@@ -59,25 +59,25 @@ describe("create vega spec", () => {
59
59
  const formValues = createBasicFormValues();
60
60
  formValues.general!.xColumn!.field = undefined;
61
61
 
62
- const spec = createSpecWithoutData(
63
- ChartType.BAR,
62
+ const spec = createSpecWithoutData({
63
+ chartType: ChartType.BAR,
64
64
  formValues,
65
- "light",
66
- 400,
67
- 300,
68
- );
65
+ theme: "light",
66
+ width: 400,
67
+ height: 300,
68
+ });
69
69
  expect(spec).toEqual(X_AXIS_REQUIRED);
70
70
 
71
71
  // Undefined yColumn
72
72
  const formValues2 = createBasicFormValues();
73
73
  formValues2.general!.yColumn!.field = undefined;
74
- const spec2 = createSpecWithoutData(
75
- ChartType.BAR,
76
- formValues2,
77
- "light",
78
- 400,
79
- 300,
80
- );
74
+ const spec2 = createSpecWithoutData({
75
+ chartType: ChartType.BAR,
76
+ formValues: formValues2,
77
+ theme: "light",
78
+ width: 400,
79
+ height: 300,
80
+ });
81
81
  expect(spec2).toEqual(Y_AXIS_REQUIRED);
82
82
  });
83
83
  });