@bicharts/chart-host 0.5.122 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-7RLI3VOM.mjs → chunk-RO6O22YG.mjs} +216 -216
- package/dist/geo.mjs +3 -3
- package/dist/index.mjs +1 -1
- package/dist/react.mjs +1 -1
- package/dist/testing.mjs +67 -0
- package/dist/types/host/services.d.ts +144 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/testing/index.d.ts +14 -0
- package/package.json +6 -1
|
@@ -23,7 +23,7 @@ var require_papaparse_min = __commonJS({
|
|
|
23
23
|
})(exports, function r() {
|
|
24
24
|
var n = "undefined" != typeof self ? self : "undefined" != typeof window ? window : void 0 !== n ? n : {};
|
|
25
25
|
var d2, s = !n.document && !!n.postMessage, a4 = n.IS_PAPA_WORKER || false, o = {}, h3 = 0, v2 = {};
|
|
26
|
-
function
|
|
26
|
+
function P4(e) {
|
|
27
27
|
return 65279 === e.charCodeAt(0) ? e.slice(1) : e;
|
|
28
28
|
}
|
|
29
29
|
function u2(e) {
|
|
@@ -142,15 +142,15 @@ var require_papaparse_min = __commonJS({
|
|
|
142
142
|
return "greedy" === m4.skipEmptyLines ? "" === e2.join("").trim() : 1 === e2.length && 0 === e2[0].length;
|
|
143
143
|
}
|
|
144
144
|
function g4() {
|
|
145
|
-
if (p4 && a5 && (
|
|
145
|
+
if (p4 && a5 && (k2("Delimiter", "UndetectableDelimiter", "Unable to auto-detect delimiting character; defaulted to '" + v2.DefaultDelimiter + "'"), a5 = false), m4.skipEmptyLines && (p4.data = p4.data.filter(function(e4) {
|
|
146
146
|
return !y6(e4);
|
|
147
|
-
})),
|
|
147
|
+
})), _3()) {
|
|
148
148
|
let t4 = function(e4, t5) {
|
|
149
|
-
e4 =
|
|
149
|
+
e4 = P4(e4), q4(m4.transformHeader) && (e4 = m4.transformHeader(e4, t5)), c4.push(e4);
|
|
150
150
|
};
|
|
151
151
|
var t2 = t4;
|
|
152
152
|
if (p4) if (Array.isArray(p4.data[0])) {
|
|
153
|
-
for (var e2 = 0;
|
|
153
|
+
for (var e2 = 0; _3() && e2 < p4.data.length; e2++) p4.data[e2].forEach(t4);
|
|
154
154
|
p4.data.splice(0, 1);
|
|
155
155
|
} else p4.data.forEach(t4);
|
|
156
156
|
}
|
|
@@ -164,26 +164,26 @@ var require_papaparse_min = __commonJS({
|
|
|
164
164
|
})(t5) ? parseFloat(t5) : d3.test(t5) ? new Date(t5) : "" === t5 ? null : t5) : t5)(n4 = m4.header ? r5 >= c4.length ? "__parsed_extra" : c4[r5] : n4, s4 = m4.transform ? m4.transform(s4, n4) : s4);
|
|
165
165
|
"__parsed_extra" === n4 ? (i5[n4] = i5[n4] || [], i5[n4].push(s4)) : i5[n4] = s4;
|
|
166
166
|
}
|
|
167
|
-
return m4.header && (r5 > c4.length ?
|
|
167
|
+
return m4.header && (r5 > c4.length ? k2("FieldMismatch", "TooManyFields", "Too many fields: expected " + c4.length + " fields but parsed " + r5, f5 + t4) : r5 < c4.length && k2("FieldMismatch", "TooFewFields", "Too few fields: expected " + c4.length + " fields but parsed " + r5, f5 + t4)), i5;
|
|
168
168
|
}
|
|
169
169
|
var r4;
|
|
170
170
|
p4 && (m4.header || m4.dynamicTyping || m4.transform) && (r4 = 1, !p4.data.length || Array.isArray(p4.data[0]) ? (p4.data = p4.data.map(i4), r4 = p4.data.length) : p4.data = i4(p4.data, 0), m4.header && p4.meta && (p4.meta.fields = c4), f5 += r4);
|
|
171
171
|
}
|
|
172
|
-
function
|
|
172
|
+
function _3() {
|
|
173
173
|
return m4.header && 0 === c4.length;
|
|
174
174
|
}
|
|
175
|
-
function
|
|
175
|
+
function k2(e2, t2, i4, r4) {
|
|
176
176
|
e2 = { type: e2, code: t2, message: i4 };
|
|
177
177
|
void 0 !== r4 && (e2.row = r4), p4.errors.push(e2);
|
|
178
178
|
}
|
|
179
179
|
q4(m4.step) && (t = m4.step, m4.step = function(e2) {
|
|
180
|
-
p4 = e2,
|
|
180
|
+
p4 = e2, _3() ? g4() : (g4(), 0 !== p4.data.length && (r2 += e2.data.length, m4.preview && r2 > m4.preview ? s2.abort() : (p4.data = p4.data[0], t(p4, i2))));
|
|
181
181
|
}), this.parse = function(e2, t2, i4) {
|
|
182
182
|
var r4 = m4.quoteChar || '"', r4 = (m4.newline || (m4.newline = this.guessLineEndings(e2, r4)), a5 = false, m4.delimiter ? q4(m4.delimiter) && (m4.delimiter = m4.delimiter(e2), p4.meta.delimiter = m4.delimiter) : ((r4 = ((e4, t4, i5, r5, n4) => {
|
|
183
183
|
var s4, a6, o4, h5;
|
|
184
184
|
n4 = n4 || [",", " ", "|", ";", v2.RECORD_SEP, v2.UNIT_SEP];
|
|
185
185
|
for (var u5 = 0; u5 < n4.length; u5++) {
|
|
186
|
-
for (var d4, f6 = n4[u5], l3 = 0, c5 = 0, p5 = 0, g5 = (o4 = void 0, new E4({ comments: r5, delimiter: f6, newline: t4, preview: 10 }).parse(e4)),
|
|
186
|
+
for (var d4, f6 = n4[u5], l3 = 0, c5 = 0, p5 = 0, g5 = (o4 = void 0, new E4({ comments: r5, delimiter: f6, newline: t4, preview: 10 }).parse(e4)), _4 = 0; _4 < g5.data.length; _4++) i5 && y6(g5.data[_4]) ? p5++ : (d4 = g5.data[_4].length, c5 += d4, void 0 === o4 ? o4 = d4 : 0 < d4 && (l3 += Math.abs(d4 - o4), o4 = d4));
|
|
187
187
|
0 < g5.data.length && (c5 /= g5.data.length - p5), (void 0 === a6 || l3 <= a6) && (void 0 === h5 || h5 < c5) && 1.99 < c5 && (a6 = l3, s4 = f6, h5 = c5);
|
|
188
188
|
}
|
|
189
189
|
return { successful: !!(m4.delimiter = s4), bestDelimiter: s4 };
|
|
@@ -211,58 +211,58 @@ var require_papaparse_min = __commonJS({
|
|
|
211
211
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
212
212
|
}
|
|
213
213
|
function E4(C) {
|
|
214
|
-
var S = (C = C || {}).delimiter, O3 = C.newline, x4 = C.comments, I2 = C.step,
|
|
214
|
+
var S = (C = C || {}).delimiter, O3 = C.newline, x4 = C.comments, I2 = C.step, A = C.preview, T3 = C.fastMode, D3 = null, L2 = false, F4 = null == C.quoteChar ? '"' : C.quoteChar, j3 = F4;
|
|
215
215
|
if (void 0 !== C.escapeChar && (j3 = C.escapeChar), ("string" != typeof S || -1 < v2.BAD_DELIMITERS.indexOf(S)) && (S = ","), x4 === S) throw new Error("Comment character same as delimiter");
|
|
216
216
|
true === x4 ? x4 = "#" : ("string" != typeof x4 || -1 < v2.BAD_DELIMITERS.indexOf(x4)) && (x4 = false), "\n" !== O3 && "\r" !== O3 && "\r\n" !== O3 && (O3 = "\n");
|
|
217
217
|
var z3 = 0, M2 = false;
|
|
218
218
|
this.parse = function(i2, t, r2) {
|
|
219
219
|
if ("string" != typeof i2) throw new Error("Input must be a string");
|
|
220
220
|
var n2 = i2.length, e = S.length, s2 = O3.length, a5 = x4.length, o2 = q4(I2), h4 = [], u4 = [], d3 = [], f5 = z3 = 0;
|
|
221
|
-
if (!i2) return
|
|
222
|
-
if (T3 || false !== T3 && -1 === i2.indexOf(
|
|
221
|
+
if (!i2) return w3();
|
|
222
|
+
if (T3 || false !== T3 && -1 === i2.indexOf(F4)) {
|
|
223
223
|
for (var l2 = i2.split(O3), c4 = 0; c4 < l2.length; c4++) {
|
|
224
224
|
if (d3 = l2[c4], z3 += d3.length, c4 !== l2.length - 1) z3 += O3.length;
|
|
225
|
-
else if (r2) return
|
|
225
|
+
else if (r2) return w3();
|
|
226
226
|
if (!x4 || d3.substring(0, a5) !== x4) {
|
|
227
227
|
if (o2) {
|
|
228
|
-
if (h4 = [],
|
|
229
|
-
} else
|
|
230
|
-
if (
|
|
228
|
+
if (h4 = [], k2(d3.split(S)), R2(), M2) return w3();
|
|
229
|
+
} else k2(d3.split(S));
|
|
230
|
+
if (A && A <= c4) return h4 = h4.slice(0, A), w3(true);
|
|
231
231
|
}
|
|
232
232
|
}
|
|
233
|
-
return
|
|
233
|
+
return w3();
|
|
234
234
|
}
|
|
235
|
-
for (var p4 = i2.indexOf(S, z3), g4 = i2.indexOf(O3, z3),
|
|
236
|
-
if (-1 === (m4 = i2.indexOf(
|
|
237
|
-
if (m4 === n2 - 1) return E5(i2.substring(z3, m4).replace(
|
|
238
|
-
if (
|
|
239
|
-
else if (
|
|
235
|
+
for (var p4 = i2.indexOf(S, z3), g4 = i2.indexOf(O3, z3), _3 = new RegExp(U2(j3) + U2(F4), "g"), m4 = i2.indexOf(F4, z3); ; ) if (i2[z3] === F4) for (m4 = z3, z3++; ; ) {
|
|
236
|
+
if (-1 === (m4 = i2.indexOf(F4, m4 + 1))) return r2 || u4.push({ type: "Quotes", code: "MissingQuotes", message: "Quoted field unterminated", row: h4.length, index: z3 }), E5();
|
|
237
|
+
if (m4 === n2 - 1) return E5(i2.substring(z3, m4).replace(_3, F4));
|
|
238
|
+
if (F4 === j3 && i2[m4 + 1] === j3) m4++;
|
|
239
|
+
else if (F4 === j3 || 0 === m4 || i2[m4 - 1] !== j3) {
|
|
240
240
|
-1 !== p4 && p4 < m4 + 1 && (p4 = i2.indexOf(S, m4 + 1));
|
|
241
241
|
var y6 = v3(-1 === (g4 = -1 !== g4 && g4 < m4 + 1 ? i2.indexOf(O3, m4 + 1) : g4) ? p4 : Math.min(p4, g4));
|
|
242
242
|
if (i2.substr(m4 + 1 + y6, e) === S) {
|
|
243
|
-
d3.push(i2.substring(z3, m4).replace(
|
|
243
|
+
d3.push(i2.substring(z3, m4).replace(_3, F4)), i2[z3 = m4 + 1 + y6 + e] !== F4 && (m4 = i2.indexOf(F4, z3)), p4 = i2.indexOf(S, z3), g4 = i2.indexOf(O3, z3);
|
|
244
244
|
break;
|
|
245
245
|
}
|
|
246
246
|
y6 = v3(g4);
|
|
247
247
|
if (i2.substring(m4 + 1 + y6, m4 + 1 + y6 + s2) === O3) {
|
|
248
|
-
if (d3.push(i2.substring(z3, m4).replace(
|
|
249
|
-
if (
|
|
248
|
+
if (d3.push(i2.substring(z3, m4).replace(_3, F4)), b5(m4 + 1 + y6 + s2), p4 = i2.indexOf(S, z3), m4 = i2.indexOf(F4, z3), o2 && (R2(), M2)) return w3();
|
|
249
|
+
if (A && h4.length >= A) return w3(true);
|
|
250
250
|
break;
|
|
251
251
|
}
|
|
252
252
|
u4.push({ type: "Quotes", code: "InvalidQuotes", message: "Trailing quote on quoted field is malformed", row: h4.length, index: z3 }), m4++;
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
255
|
else if (x4 && 0 === d3.length && i2.substring(z3, z3 + a5) === x4) {
|
|
256
|
-
if (-1 === g4) return
|
|
256
|
+
if (-1 === g4) return w3();
|
|
257
257
|
z3 = g4 + s2, g4 = i2.indexOf(O3, z3), p4 = i2.indexOf(S, z3);
|
|
258
258
|
} else if (-1 !== p4 && (p4 < g4 || -1 === g4)) d3.push(i2.substring(z3, p4)), z3 = p4 + e, p4 = i2.indexOf(S, z3);
|
|
259
259
|
else {
|
|
260
260
|
if (-1 === g4) break;
|
|
261
|
-
if (d3.push(i2.substring(z3, g4)), b5(g4 + s2), o2 && (R2(), M2)) return
|
|
262
|
-
if (
|
|
261
|
+
if (d3.push(i2.substring(z3, g4)), b5(g4 + s2), o2 && (R2(), M2)) return w3();
|
|
262
|
+
if (A && h4.length >= A) return w3(true);
|
|
263
263
|
}
|
|
264
264
|
return E5();
|
|
265
|
-
function
|
|
265
|
+
function k2(e2) {
|
|
266
266
|
h4.push(e2), f5 = z3;
|
|
267
267
|
}
|
|
268
268
|
function v3(e2) {
|
|
@@ -270,17 +270,17 @@ var require_papaparse_min = __commonJS({
|
|
|
270
270
|
return t2 = -1 !== e2 && (e2 = i2.substring(m4 + 1, e2)) && "" === e2.trim() ? e2.length : t2;
|
|
271
271
|
}
|
|
272
272
|
function E5(e2) {
|
|
273
|
-
return r2 || (void 0 === e2 && (e2 = i2.substring(z3)), d3.push(e2), z3 = n2,
|
|
273
|
+
return r2 || (void 0 === e2 && (e2 = i2.substring(z3)), d3.push(e2), z3 = n2, k2(d3), o2 && R2()), w3();
|
|
274
274
|
}
|
|
275
275
|
function b5(e2) {
|
|
276
|
-
z3 = e2,
|
|
276
|
+
z3 = e2, k2(d3), d3 = [], g4 = i2.indexOf(O3, z3);
|
|
277
277
|
}
|
|
278
|
-
function
|
|
278
|
+
function w3(e2) {
|
|
279
279
|
if (C.header && !t && h4.length && !L2) {
|
|
280
280
|
var s4 = h4[0], a6 = /* @__PURE__ */ Object.create(null), o4 = new Set(s4);
|
|
281
281
|
let n4 = false;
|
|
282
282
|
for (let r4 = 0; r4 < s4.length; r4++) {
|
|
283
|
-
let i4 =
|
|
283
|
+
let i4 = P4(s4[r4]);
|
|
284
284
|
if (a6[i4 = q4(C.transformHeader) ? C.transformHeader(i4, r4) : i4]) {
|
|
285
285
|
let e4, t2 = a6[i4];
|
|
286
286
|
for (; e4 = i4 + "_" + t2, t2++, o4.has(e4); ) ;
|
|
@@ -293,7 +293,7 @@ var require_papaparse_min = __commonJS({
|
|
|
293
293
|
return { data: h4, errors: u4, meta: { delimiter: S, linebreak: O3, aborted: M2, truncated: !!e2, cursor: f5 + (t || 0), renamedHeaders: D3 } };
|
|
294
294
|
}
|
|
295
295
|
function R2() {
|
|
296
|
-
I2(
|
|
296
|
+
I2(w3()), h4 = [], u4 = [];
|
|
297
297
|
}
|
|
298
298
|
}, this.abort = function() {
|
|
299
299
|
M2 = true;
|
|
@@ -306,16 +306,16 @@ var require_papaparse_min = __commonJS({
|
|
|
306
306
|
if (t.error) i2.userError(t.error, t.file);
|
|
307
307
|
else if (t.results && t.results.data) {
|
|
308
308
|
var n2 = { abort: function() {
|
|
309
|
-
r2 = true,
|
|
309
|
+
r2 = true, _2(t.workerId, { data: [], errors: [], meta: { aborted: true } });
|
|
310
310
|
}, pause: m2, resume: m2 };
|
|
311
311
|
if (q4(i2.userStep)) {
|
|
312
312
|
for (var s2 = 0; s2 < t.results.data.length && (i2.userStep({ data: t.results.data[s2], errors: t.results.errors, meta: t.results.meta }, n2), !r2); s2++) ;
|
|
313
313
|
delete t.results;
|
|
314
314
|
} else q4(i2.userChunk) && (i2.userChunk(t.results, n2, t.file), delete t.results);
|
|
315
315
|
}
|
|
316
|
-
t.finished && !r2 &&
|
|
316
|
+
t.finished && !r2 && _2(t.workerId, t.results);
|
|
317
317
|
}
|
|
318
|
-
function
|
|
318
|
+
function _2(e, t) {
|
|
319
319
|
var i2 = o[e];
|
|
320
320
|
q4(i2.userComplete) && i2.userComplete(t), i2.terminate(), delete o[e];
|
|
321
321
|
}
|
|
@@ -339,7 +339,7 @@ var require_papaparse_min = __commonJS({
|
|
|
339
339
|
return v2.parse = function(e, t) {
|
|
340
340
|
var i2 = (t = t || {}).dynamicTyping || false;
|
|
341
341
|
q4(i2) && (t.dynamicTypingFunction = i2, i2 = {});
|
|
342
|
-
if (t.dynamicTyping = i2, t.transform = !!q4(t.transform) && t.transform, !t.worker || !v2.WORKERS_SUPPORTED) return i2 = null, v2.NODE_STREAM_INPUT, "string" == typeof e ? (e =
|
|
342
|
+
if (t.dynamicTyping = i2, t.transform = !!q4(t.transform) && t.transform, !t.worker || !v2.WORKERS_SUPPORTED) return i2 = null, v2.NODE_STREAM_INPUT, "string" == typeof e ? (e = P4(e), i2 = new (t.download ? f4 : c2)(t)) : true === e.readable && q4(e.read) && q4(e.on) ? i2 = new p2(t) : (n.File && e instanceof File || e instanceof Object) && (i2 = new l(t)), i2.stream(e);
|
|
343
343
|
(i2 = (() => {
|
|
344
344
|
var e2;
|
|
345
345
|
return !!v2.WORKERS_SUPPORTED && (e2 = (() => {
|
|
@@ -348,11 +348,11 @@ var require_papaparse_min = __commonJS({
|
|
|
348
348
|
})(), (e2 = new n.Worker(e2)).onmessage = g3, e2.id = h3++, o[e2.id] = e2);
|
|
349
349
|
})()).userStep = t.step, i2.userChunk = t.chunk, i2.userComplete = t.complete, i2.userError = t.error, t.step = q4(t.step), t.chunk = q4(t.chunk), t.complete = q4(t.complete), t.error = q4(t.error), delete t.worker, i2.postMessage({ input: e, config: t, workerId: i2.id });
|
|
350
350
|
}, v2.unparse = function(e, t) {
|
|
351
|
-
var s2 = false,
|
|
351
|
+
var s2 = false, _3 = true, m4 = ",", y6 = "\r\n", a5 = '"', o2 = a5 + a5, i2 = false, r2 = null, h4 = false, u4 = ((() => {
|
|
352
352
|
if ("object" == typeof t) {
|
|
353
353
|
if ("string" != typeof t.delimiter || v2.BAD_DELIMITERS.filter(function(e2) {
|
|
354
354
|
return -1 !== t.delimiter.indexOf(e2);
|
|
355
|
-
}).length || (m4 = t.delimiter), "boolean" != typeof t.quotes && "function" != typeof t.quotes && !Array.isArray(t.quotes) || (s2 = t.quotes), "boolean" != typeof t.skipEmptyLines && "string" != typeof t.skipEmptyLines || (i2 = t.skipEmptyLines), "string" == typeof t.newline && (y6 = t.newline), "string" == typeof t.quoteChar && (a5 = t.quoteChar, o2 = a5 + a5), "boolean" == typeof t.header && (
|
|
355
|
+
}).length || (m4 = t.delimiter), "boolean" != typeof t.quotes && "function" != typeof t.quotes && !Array.isArray(t.quotes) || (s2 = t.quotes), "boolean" != typeof t.skipEmptyLines && "string" != typeof t.skipEmptyLines || (i2 = t.skipEmptyLines), "string" == typeof t.newline && (y6 = t.newline), "string" == typeof t.quoteChar && (a5 = t.quoteChar, o2 = a5 + a5), "boolean" == typeof t.header && (_3 = t.header), Array.isArray(t.columns)) {
|
|
356
356
|
if (0 === t.columns.length) throw new Error("Option columns is empty");
|
|
357
357
|
r2 = t.columns;
|
|
358
358
|
}
|
|
@@ -367,8 +367,8 @@ var require_papaparse_min = __commonJS({
|
|
|
367
367
|
throw new Error("Unable to serialize unrecognized input");
|
|
368
368
|
function n2(e2, t2, i4) {
|
|
369
369
|
var r4 = "", n4 = ("string" == typeof e2 && (e2 = JSON.parse(e2)), "string" == typeof t2 && (t2 = JSON.parse(t2)), Array.isArray(e2) && 0 < e2.length), s4 = !Array.isArray(t2[0]);
|
|
370
|
-
if (n4 &&
|
|
371
|
-
for (var a6 = 0; a6 < e2.length; a6++) 0 < a6 && (r4 += m4), r4 +=
|
|
370
|
+
if (n4 && _3) {
|
|
371
|
+
for (var a6 = 0; a6 < e2.length; a6++) 0 < a6 && (r4 += m4), r4 += k2(e2[a6], a6);
|
|
372
372
|
0 < t2.length && (r4 += y6);
|
|
373
373
|
}
|
|
374
374
|
for (var o4 = 0; o4 < t2.length; o4++) {
|
|
@@ -384,14 +384,14 @@ var require_papaparse_min = __commonJS({
|
|
|
384
384
|
for (var p4 = 0; p4 < h5; p4++) {
|
|
385
385
|
0 < p4 && !d3 && (r4 += m4);
|
|
386
386
|
var g4 = n4 && s4 ? e2[p4] : p4;
|
|
387
|
-
r4 +=
|
|
387
|
+
r4 += k2(t2[o4][g4], p4);
|
|
388
388
|
}
|
|
389
389
|
o4 < t2.length - 1 && (!i4 || 0 < h5 && !d3) && (r4 += y6);
|
|
390
390
|
}
|
|
391
391
|
}
|
|
392
392
|
return r4;
|
|
393
393
|
}
|
|
394
|
-
function
|
|
394
|
+
function k2(e2, t2) {
|
|
395
395
|
var i4, r4, n4;
|
|
396
396
|
return null == e2 ? "" : e2.constructor === Date ? JSON.stringify(e2).slice(1, 25) : (n4 = false, h4 && "string" == typeof e2 && h4.test(e2) && (e2 = "'" + e2, n4 = true), r4 = (i4 = e2.toString()).replace(u4, o2), (n4 = n4 || true === s2 || "function" == typeof s2 && s2(e2, t2) || Array.isArray(s2) && s2[t2] || ((e4, t4) => {
|
|
397
397
|
for (var i5 = 0; i5 < t4.length; i5++) if (-1 < e4.indexOf(t4[i5])) return true;
|
|
@@ -450,9 +450,9 @@ var CONTAINER_SLOT_UI_STATE = "__lchUiState";
|
|
|
450
450
|
var VIEW_ONLY_UI_STATE_KEYS = Object.freeze(["camera", "llmZoom"]);
|
|
451
451
|
function withoutViewOnlyKeys(bag) {
|
|
452
452
|
if (!bag || typeof bag !== "object") return bag;
|
|
453
|
-
if (!VIEW_ONLY_UI_STATE_KEYS.some((
|
|
453
|
+
if (!VIEW_ONLY_UI_STATE_KEYS.some((k2) => Object.prototype.hasOwnProperty.call(bag, k2))) return bag;
|
|
454
454
|
const out = { ...bag };
|
|
455
|
-
for (const
|
|
455
|
+
for (const k2 of VIEW_ONLY_UI_STATE_KEYS) delete out[k2];
|
|
456
456
|
return out;
|
|
457
457
|
}
|
|
458
458
|
var HOST_CONTAINER_CLASS = "bic-chart-host";
|
|
@@ -507,11 +507,11 @@ function f(t) {
|
|
|
507
507
|
return t > EPS ? Math.cbrt(t) : (KAPPA * t + 16) / 116;
|
|
508
508
|
}
|
|
509
509
|
function rgbToLab(r, g3, b4) {
|
|
510
|
-
const R2 = linearise(r),
|
|
511
|
-
const X2 = 0.4124564 * R2 + 0.3575761 *
|
|
512
|
-
const Y2 = 0.2126729 * R2 + 0.7151522 *
|
|
513
|
-
const
|
|
514
|
-
const fx = f(X2 / Xn), fy = f(Y2 / Yn), fz = f(
|
|
510
|
+
const R2 = linearise(r), G2 = linearise(g3), B2 = linearise(b4);
|
|
511
|
+
const X2 = 0.4124564 * R2 + 0.3575761 * G2 + 0.1804375 * B2;
|
|
512
|
+
const Y2 = 0.2126729 * R2 + 0.7151522 * G2 + 0.072175 * B2;
|
|
513
|
+
const Z3 = 0.0193339 * R2 + 0.119192 * G2 + 0.9503041 * B2;
|
|
514
|
+
const fx = f(X2 / Xn), fy = f(Y2 / Yn), fz = f(Z3 / Zn);
|
|
515
515
|
return { L: 116 * fy - 16, a: 500 * (fx - fy), b: 200 * (fy - fz) };
|
|
516
516
|
}
|
|
517
517
|
function hexToLab(hex2) {
|
|
@@ -527,8 +527,8 @@ function deltaE2000(c1, c2) {
|
|
|
527
527
|
const C1 = Math.hypot(c1.a, c1.b), C2 = Math.hypot(c2.a, c2.b);
|
|
528
528
|
const Cbar = (C1 + C2) / 2;
|
|
529
529
|
const C7 = Math.pow(Cbar, 7);
|
|
530
|
-
const
|
|
531
|
-
const a1p = (1 +
|
|
530
|
+
const G2 = 0.5 * (1 - Math.sqrt(C7 / (C7 + Math.pow(25, 7))));
|
|
531
|
+
const a1p = (1 + G2) * c1.a, a2p = (1 + G2) * c2.a;
|
|
532
532
|
const C1p = Math.hypot(a1p, c1.b), C2p = Math.hypot(a2p, c2.b);
|
|
533
533
|
const neutral = C1p < NEUTRAL_CHROMA || C2p < NEUTRAL_CHROMA;
|
|
534
534
|
const h1p = C1p < NEUTRAL_CHROMA ? 0 : (Math.atan2(c1.b, a1p) * DEG + 360) % 360;
|
|
@@ -568,11 +568,11 @@ function labToHex(lab) {
|
|
|
568
568
|
const fy = (lab.L + 16) / 116, fx = fy + lab.a / 500, fz = fy - lab.b / 200;
|
|
569
569
|
const X2 = Xn * finv(fx);
|
|
570
570
|
const Y2 = Yn * (lab.L > KAPPA * EPS ? fy * fy * fy : lab.L / KAPPA);
|
|
571
|
-
const
|
|
571
|
+
const Z3 = Zn * finv(fz);
|
|
572
572
|
const lin = [
|
|
573
|
-
3.2404542 * X2 - 1.5371385 * Y2 - 0.4985314 *
|
|
574
|
-
-0.969266 * X2 + 1.8760108 * Y2 + 0.041556 *
|
|
575
|
-
0.0556434 * X2 - 0.2040259 * Y2 + 1.0572252 *
|
|
573
|
+
3.2404542 * X2 - 1.5371385 * Y2 - 0.4985314 * Z3,
|
|
574
|
+
-0.969266 * X2 + 1.8760108 * Y2 + 0.041556 * Z3,
|
|
575
|
+
0.0556434 * X2 - 0.2040259 * Y2 + 1.0572252 * Z3
|
|
576
576
|
];
|
|
577
577
|
return "#" + lin.map((v2) => {
|
|
578
578
|
const c2 = Math.max(0, Math.min(1, v2));
|
|
@@ -665,10 +665,10 @@ function censusColourSpread(container, doc) {
|
|
|
665
665
|
for (const { rgb } of counted) {
|
|
666
666
|
marks++;
|
|
667
667
|
distinct.add(rgb.join(","));
|
|
668
|
-
const
|
|
669
|
-
const cur = cells.get(
|
|
668
|
+
const k2 = cellKey(rgb);
|
|
669
|
+
const cur = cells.get(k2);
|
|
670
670
|
if (cur) cur.n++;
|
|
671
|
-
else cells.set(
|
|
671
|
+
else cells.set(k2, { rgb, n: 1 });
|
|
672
672
|
}
|
|
673
673
|
if (marks < MIN_MARKS || distinct.size < MIN_RAMP_FILLS) return EMPTY;
|
|
674
674
|
const top = [...cells.values()].sort((a4, b4) => b4.n - a4.n).slice(0, MAX_CELLS);
|
|
@@ -747,8 +747,8 @@ function autoRampMinStep(low, high, canvas, classes = AUTO_RAMP_CLASSES, opacity
|
|
|
747
747
|
const bg = normHex(canvas);
|
|
748
748
|
if (!lo || !hi || !bg || classes < 2) return NaN;
|
|
749
749
|
let prev = null, min = Infinity;
|
|
750
|
-
for (let
|
|
751
|
-
const painted = paintedOver(labToHex(mixLab(lo, hi,
|
|
750
|
+
for (let k2 = 0; k2 < classes; k2++) {
|
|
751
|
+
const painted = paintedOver(labToHex(mixLab(lo, hi, k2 / (classes - 1))), bg, opacity);
|
|
752
752
|
if (prev) min = Math.min(min, deltaE2000(prev, painted));
|
|
753
753
|
prev = painted;
|
|
754
754
|
}
|
|
@@ -772,15 +772,15 @@ function resolveAutoColorScale(p2) {
|
|
|
772
772
|
};
|
|
773
773
|
const candidates = p2.isHighContrast ? [normHex(p2.themeAccent), normHex(p2.themeFg)] : [...palette.map(normHex), normHex(p2.themeAccent), normHex(p2.themeFg)];
|
|
774
774
|
const accent = candidates.find(usable) ?? FALLBACK_ACCENT;
|
|
775
|
-
const
|
|
775
|
+
const A = hexToLab(accent);
|
|
776
776
|
let t = 0.1;
|
|
777
|
-
let low = mixLab(bg,
|
|
777
|
+
let low = mixLab(bg, A, t);
|
|
778
778
|
while (t < 0.6 && deltaE2000(paintedOver(labToHex(low), canvas, AUTO_RAMP_DRAWN_OPACITY), bg) < SAME_SHADE_DELTA_E) {
|
|
779
779
|
t += 0.02;
|
|
780
|
-
low = mixLab(bg,
|
|
780
|
+
low = mixLab(bg, A, t);
|
|
781
781
|
}
|
|
782
782
|
const lowHex = labToHex(low);
|
|
783
|
-
let high = { ...
|
|
783
|
+
let high = { ...A };
|
|
784
784
|
let highHex = labToHex(high);
|
|
785
785
|
for (let step = 0; step < 80 && autoRampMinStep(lowHex, highHex, canvas) < AUTO_RAMP_MIN_STEP_DELTA_E; step++) {
|
|
786
786
|
const L2 = Math.max(4, Math.min(98, high.L + (darkCanvas ? 1 : -1)));
|
|
@@ -952,12 +952,12 @@ var byAsset = /* @__PURE__ */ new Map();
|
|
|
952
952
|
var _na;
|
|
953
953
|
function geoAssetFor(geoKind) {
|
|
954
954
|
if (!geoKind) return null;
|
|
955
|
-
const
|
|
956
|
-
if (/^country/.test(
|
|
957
|
-
if (
|
|
958
|
-
if (
|
|
959
|
-
if (
|
|
960
|
-
if (
|
|
955
|
+
const k2 = geoKind.toLowerCase();
|
|
956
|
+
if (/^country/.test(k2)) return "world";
|
|
957
|
+
if (k2 === "north-america") return "world";
|
|
958
|
+
if (k2 === "world") return "world";
|
|
959
|
+
if (k2 === "us-state-code" || k2 === "us-state-name") return "us-states";
|
|
960
|
+
if (k2 === "us-zip5") return "us-zip3";
|
|
961
961
|
return null;
|
|
962
962
|
}
|
|
963
963
|
var _worldBase;
|
|
@@ -1239,12 +1239,12 @@ function A3(n) {
|
|
|
1239
1239
|
if (f4 && f4.length) {
|
|
1240
1240
|
let d2 = n.state === void 0 || n.state === null ? "" : String(n.state).trim(), R2 = d2 ? u(d2) : "", g3 = d2 ? Y(d2) : null, S = [], m2 = -1;
|
|
1241
1241
|
for (let c2 of f4) {
|
|
1242
|
-
let l = c2.row,
|
|
1243
|
-
if (d2 && l.a1 !== "") if (g3 && l.a1 === g3 || u(l.a1) === R2)
|
|
1242
|
+
let l = c2.row, A = 0;
|
|
1243
|
+
if (d2 && l.a1 !== "") if (g3 && l.a1 === g3 || u(l.a1) === R2) A++;
|
|
1244
1244
|
else continue;
|
|
1245
|
-
if (i) if (T(l.cc) === i)
|
|
1245
|
+
if (i) if (T(l.cc) === i) A++;
|
|
1246
1246
|
else continue;
|
|
1247
|
-
|
|
1247
|
+
A > m2 ? (m2 = A, S = [c2]) : A === m2 && S.push(c2);
|
|
1248
1248
|
}
|
|
1249
1249
|
S.some((c2) => c2.primary) && (S = S.filter((c2) => c2.primary));
|
|
1250
1250
|
let p2 = /* @__PURE__ */ new Map();
|
|
@@ -1275,19 +1275,19 @@ var x = 8;
|
|
|
1275
1275
|
function y3(n, e) {
|
|
1276
1276
|
let t = new Array(n.length), o = new Array(n.length), i = new Array(n.length), r = /* @__PURE__ */ new Set(), a4 = [], s = /* @__PURE__ */ new Set(), f4 = [], d2 = /* @__PURE__ */ new Set(), R2 = [], g3 = { latlon: 0, city: 0, zip3: 0, state: 0, country: 0 }, S = 0, m2 = 0, p2 = null;
|
|
1277
1277
|
for (let l = 0; l < n.length; ++l) {
|
|
1278
|
-
let
|
|
1278
|
+
let A = n[l], C = A3({ ...A, mapKind: e });
|
|
1279
1279
|
if (S3(C)) {
|
|
1280
1280
|
t[l] = null, o[l] = null, i[l] = null, m2++;
|
|
1281
|
-
let M2 = K(
|
|
1281
|
+
let M2 = K(A);
|
|
1282
1282
|
M2 && !d2.has(M2.toLowerCase()) && (d2.add(M2.toLowerCase()), R2.length < x && R2.push(M2));
|
|
1283
1283
|
} else if (C) {
|
|
1284
1284
|
if (t[l] = C.lat, o[l] = C.lon, i[l] = C.precision, S++, g3[C.precision]++, (p2 === null || G[C.precision] > G[p2]) && (p2 = C.precision), G[C.precision] > G.city) {
|
|
1285
|
-
let M2 = K(
|
|
1285
|
+
let M2 = K(A);
|
|
1286
1286
|
M2 && !s.has(M2.toLowerCase()) && (s.add(M2.toLowerCase()), f4.length < x && f4.push(M2));
|
|
1287
1287
|
}
|
|
1288
1288
|
} else {
|
|
1289
1289
|
t[l] = null, o[l] = null, i[l] = null;
|
|
1290
|
-
let M2 = K(
|
|
1290
|
+
let M2 = K(A);
|
|
1291
1291
|
M2 && !r.has(M2.toLowerCase()) && (r.add(M2.toLowerCase()), a4.push(M2));
|
|
1292
1292
|
}
|
|
1293
1293
|
}
|
|
@@ -1558,147 +1558,147 @@ var ct2 = new RegExp([String.raw`\bisMeasure\b`, String.raw`\bdataType\b`, Strin
|
|
|
1558
1558
|
|
|
1559
1559
|
// ../shape-core/dist/index.mjs
|
|
1560
1560
|
/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */
|
|
1561
|
-
var
|
|
1562
|
-
var
|
|
1563
|
-
function O2(
|
|
1564
|
-
return !!E(
|
|
1565
|
-
}
|
|
1566
|
-
function
|
|
1567
|
-
let
|
|
1568
|
-
for (let t of
|
|
1561
|
+
var E2 = 2;
|
|
1562
|
+
var Z2 = 400;
|
|
1563
|
+
function O2(o) {
|
|
1564
|
+
return !!E(o);
|
|
1565
|
+
}
|
|
1566
|
+
function P2(o) {
|
|
1567
|
+
let e = /* @__PURE__ */ new Set();
|
|
1568
|
+
for (let t of o) {
|
|
1569
1569
|
if (t == null) continue;
|
|
1570
|
-
let
|
|
1571
|
-
if (!V(
|
|
1570
|
+
let i = u(String(t));
|
|
1571
|
+
if (!V(i) && !e.has(i) && (e.add(i), e.size >= Z2)) break;
|
|
1572
1572
|
}
|
|
1573
|
-
return Array.from(
|
|
1573
|
+
return Array.from(e);
|
|
1574
1574
|
}
|
|
1575
|
-
function x3(
|
|
1576
|
-
let
|
|
1577
|
-
if (
|
|
1578
|
-
let t =
|
|
1579
|
-
return t >= 1 && t >=
|
|
1575
|
+
function x3(o) {
|
|
1576
|
+
let e = P2(o);
|
|
1577
|
+
if (e.length === 0 || z2(o) < 95) return false;
|
|
1578
|
+
let t = e.filter((c2) => O2(c2) && !Y(c2)).length, i = e.filter((c2) => !O2(c2) && !!Y(c2)).length;
|
|
1579
|
+
return t >= 1 && t >= i;
|
|
1580
1580
|
}
|
|
1581
|
-
function
|
|
1582
|
-
if (!Y(
|
|
1583
|
-
let t = E(
|
|
1584
|
-
return t ?
|
|
1581
|
+
function j2(o, e) {
|
|
1582
|
+
if (!Y(o)) return false;
|
|
1583
|
+
let t = E(o);
|
|
1584
|
+
return t ? e === "world" ? true : s3.has(t) : false;
|
|
1585
1585
|
}
|
|
1586
|
-
function
|
|
1587
|
-
let
|
|
1588
|
-
if (
|
|
1586
|
+
function z2(o) {
|
|
1587
|
+
let e = P2(o);
|
|
1588
|
+
if (e.length === 0) return 0;
|
|
1589
1589
|
let t = 0;
|
|
1590
|
-
for (let
|
|
1591
|
-
return Math.round(t /
|
|
1590
|
+
for (let i of e) O2(i) && t++;
|
|
1591
|
+
return Math.round(t / e.length * 1e3) / 10;
|
|
1592
1592
|
}
|
|
1593
|
-
function
|
|
1594
|
-
let
|
|
1595
|
-
if (
|
|
1593
|
+
function w2(o) {
|
|
1594
|
+
let e = P2(o);
|
|
1595
|
+
if (e.length === 0) return 0;
|
|
1596
1596
|
let t = 0;
|
|
1597
|
-
for (let
|
|
1598
|
-
return Math.round(t /
|
|
1597
|
+
for (let i of e) Y(i) && t++;
|
|
1598
|
+
return Math.round(t / e.length * 1e3) / 10;
|
|
1599
1599
|
}
|
|
1600
|
-
function
|
|
1601
|
-
let
|
|
1602
|
-
for (let t of
|
|
1600
|
+
function H2(o) {
|
|
1601
|
+
let e = /* @__PURE__ */ new Set();
|
|
1602
|
+
for (let t of o) {
|
|
1603
1603
|
if (t == null) continue;
|
|
1604
|
-
let
|
|
1605
|
-
if (!V(u(
|
|
1604
|
+
let i = String(t).trim();
|
|
1605
|
+
if (!V(u(i)) && !e.has(i) && (e.add(i), e.size >= Z2)) break;
|
|
1606
1606
|
}
|
|
1607
|
-
return Array.from(
|
|
1607
|
+
return Array.from(e);
|
|
1608
1608
|
}
|
|
1609
|
-
function
|
|
1610
|
-
let
|
|
1611
|
-
if (
|
|
1609
|
+
function $2(o) {
|
|
1610
|
+
let e = H2(o);
|
|
1611
|
+
if (e.length === 0) return 0;
|
|
1612
1612
|
let t = 0;
|
|
1613
|
-
for (let
|
|
1614
|
-
return Math.round(t /
|
|
1613
|
+
for (let i of e) Z(i).length > 0 && t++;
|
|
1614
|
+
return Math.round(t / e.length * 1e3) / 10;
|
|
1615
1615
|
}
|
|
1616
|
-
function
|
|
1617
|
-
return y2(
|
|
1616
|
+
function q3(o, e) {
|
|
1617
|
+
return y2(e, rt) ? true : H2(o).some((t) => /^\d{5}(-\d{4})?$/.test(t.replace(/\.0+$/, "")));
|
|
1618
1618
|
}
|
|
1619
|
-
function yt2(
|
|
1620
|
-
let t =
|
|
1619
|
+
function yt2(o, e) {
|
|
1620
|
+
let t = P2(o);
|
|
1621
1621
|
if (t.length === 0) return 0;
|
|
1622
|
-
let
|
|
1623
|
-
for (let c2 of t) p3(c2,
|
|
1624
|
-
return Math.round(
|
|
1622
|
+
let i = 0;
|
|
1623
|
+
for (let c2 of t) p3(c2, e) && i++;
|
|
1624
|
+
return Math.round(i / t.length * 1e3) / 10;
|
|
1625
1625
|
}
|
|
1626
|
-
function
|
|
1626
|
+
function F3(o, e) {
|
|
1627
1627
|
let t = 0;
|
|
1628
|
-
for (let
|
|
1628
|
+
for (let i of P2(o)) e(i) && t++;
|
|
1629
1629
|
return t;
|
|
1630
1630
|
}
|
|
1631
|
-
function Ct(
|
|
1631
|
+
function Ct(o, e) {
|
|
1632
1632
|
let t = 0;
|
|
1633
|
-
for (let
|
|
1633
|
+
for (let i of H2(o)) e(i) && t++;
|
|
1634
1634
|
return t;
|
|
1635
1635
|
}
|
|
1636
|
-
function ht(
|
|
1637
|
-
let
|
|
1638
|
-
for (let
|
|
1639
|
-
let s = t?.[
|
|
1640
|
-
s && h3.has(s) && (
|
|
1636
|
+
function ht(o, e, t, i, c2) {
|
|
1637
|
+
let u2 = [], a4 = [], r = {}, T3 = {}, h3 = new Set(o), f4 = (n) => e.map((s) => s[n]);
|
|
1638
|
+
for (let n of ["city", "country"]) {
|
|
1639
|
+
let s = t?.[n];
|
|
1640
|
+
s && h3.has(s) && (r[n] = s);
|
|
1641
1641
|
}
|
|
1642
|
-
let Y2 = new Set(c2 ??
|
|
1643
|
-
for (let
|
|
1644
|
-
let s = t?.[
|
|
1645
|
-
s && Y2.has(s) && (
|
|
1642
|
+
let Y2 = new Set(c2 ?? o);
|
|
1643
|
+
for (let n of ["lat", "lon"]) {
|
|
1644
|
+
let s = t?.[n];
|
|
1645
|
+
s && Y2.has(s) && (r[n] = s);
|
|
1646
1646
|
}
|
|
1647
1647
|
let g3 = t?.zip;
|
|
1648
1648
|
if (g3 && h3.has(g3)) {
|
|
1649
|
-
let
|
|
1650
|
-
s < 95 ? a4.push(`zip=${g3} (only ${s}% of values read as ZIPs)`) :
|
|
1649
|
+
let n = f4(g3), s = $2(n);
|
|
1650
|
+
s < 95 ? a4.push(`zip=${g3} (only ${s}% of values read as ZIPs)`) : q3(n, g3) ? r.zip = g3 : a4.push(`zip=${g3} (all values are 3-4 digits with nothing to say they are postal)`);
|
|
1651
1651
|
}
|
|
1652
1652
|
let p2 = t?.state;
|
|
1653
1653
|
if (p2 && h3.has(p2)) {
|
|
1654
|
-
let
|
|
1655
|
-
s.length > 0 && s.every((
|
|
1656
|
-
}
|
|
1657
|
-
let y5 = new Set(Object.values(
|
|
1658
|
-
if (!
|
|
1659
|
-
let
|
|
1660
|
-
for (let s of
|
|
1661
|
-
let
|
|
1662
|
-
if (x3(
|
|
1663
|
-
let m2 =
|
|
1654
|
+
let n = f4(p2), s = P2(n);
|
|
1655
|
+
s.length > 0 && s.every((l) => j2(l, i)) ? a4.push(`state=${p2} (every value is "CA", which is both Canada and California)`) : x3(n) ? (a4.push(`state=${p2} (every value is a country, not a state)`), r.country || (r.country = p2)) : w2(n) < 95 ? a4.push(`state=${p2} (only ${w2(n)}% of values are states/provinces)`) : r.state = p2;
|
|
1656
|
+
}
|
|
1657
|
+
let y5 = new Set(Object.values(r).filter(Boolean)), A = o.filter((n) => !y5.has(n) && !n.startsWith("__"));
|
|
1658
|
+
if (!r.state) {
|
|
1659
|
+
let n = null;
|
|
1660
|
+
for (let s of A) {
|
|
1661
|
+
let l = f4(s);
|
|
1662
|
+
if (x3(l)) continue;
|
|
1663
|
+
let m2 = w2(l);
|
|
1664
1664
|
if (m2 < 95) continue;
|
|
1665
|
-
let
|
|
1666
|
-
|
|
1665
|
+
let D3 = F3(l, (R2) => !!Y(R2)), ee = F3(l, (R2) => !!Y(R2) && !j2(R2, i));
|
|
1666
|
+
D3 < E2 && ee < 1 || (!n || m2 > n.pct) && (n = { name: s, pct: m2 });
|
|
1667
1667
|
}
|
|
1668
|
-
|
|
1668
|
+
n && (r.state = n.name, y5.add(n.name), u2.push(`state=${n.name} (${n.pct}% states/provinces)`));
|
|
1669
1669
|
}
|
|
1670
|
-
if (!
|
|
1671
|
-
if (y5.has(
|
|
1672
|
-
let s = f4(
|
|
1673
|
-
if (!(
|
|
1674
|
-
|
|
1670
|
+
if (!r.zip) for (let n of A) {
|
|
1671
|
+
if (y5.has(n)) continue;
|
|
1672
|
+
let s = f4(n), l = $2(s);
|
|
1673
|
+
if (!(l < 95) && q3(s, n) && !(Ct(s, (m2) => Z(m2).length > 0) < E2)) {
|
|
1674
|
+
r.zip = n, y5.add(n), u2.push(`zip=${n} (${l}% ZIP codes)`);
|
|
1675
1675
|
break;
|
|
1676
1676
|
}
|
|
1677
1677
|
}
|
|
1678
|
-
let
|
|
1679
|
-
if (!
|
|
1680
|
-
let
|
|
1681
|
-
for (let s of
|
|
1678
|
+
let S = r.country;
|
|
1679
|
+
if (!S || !x3(f4(S))) {
|
|
1680
|
+
let n = null;
|
|
1681
|
+
for (let s of A) {
|
|
1682
1682
|
if (y5.has(s) || !x3(f4(s))) continue;
|
|
1683
|
-
let
|
|
1684
|
-
(!
|
|
1683
|
+
let l = z2(f4(s));
|
|
1684
|
+
(!n || l > n.pct) && (n = { name: s, pct: l });
|
|
1685
1685
|
}
|
|
1686
|
-
|
|
1686
|
+
n && (S && (a4.push(`country=${S} (only ${z2(f4(S))}% of values are country identifiers; using ${n.name} instead)`), T3.country = S), r.country = n.name, y5.add(n.name), u2.push(`country=${n.name}`));
|
|
1687
1687
|
}
|
|
1688
|
-
if (!
|
|
1689
|
-
let
|
|
1690
|
-
for (let s of
|
|
1688
|
+
if (!r.city) {
|
|
1689
|
+
let n = null;
|
|
1690
|
+
for (let s of A) {
|
|
1691
1691
|
if (y5.has(s)) continue;
|
|
1692
|
-
let
|
|
1693
|
-
m2 < m3 ||
|
|
1692
|
+
let l = f4(s), m2 = yt2(l, i);
|
|
1693
|
+
m2 < m3 || F3(l, (D3) => p3(D3, i)) < E2 || (!n || m2 > n.pct) && (n = { name: s, pct: m2 });
|
|
1694
1694
|
}
|
|
1695
|
-
|
|
1695
|
+
n && (r.city = n.name, u2.push(`city=${n.name} (${n.pct}% known cities)`));
|
|
1696
1696
|
}
|
|
1697
|
-
let B2 =
|
|
1698
|
-
let s = +String(
|
|
1699
|
-
return isFinite(s) && isFinite(
|
|
1697
|
+
let B2 = r.country ? f4(r.country) : [], k2 = !!r.country && x3(B2), Q3 = k2 ? new Set(B2.map((n) => E(n == null ? null : String(n))).filter(Boolean)).size : 0, K3 = k2 && Q3 >= 2, _2 = !!(r.lat && r.lon) && e.some((n) => {
|
|
1698
|
+
let s = +String(n[r.lat] ?? "").trim(), l = +String(n[r.lon] ?? "").trim();
|
|
1699
|
+
return isFinite(s) && isFinite(l) && s >= -90 && s <= 90 && l >= -180 && l <= 180 && String(n[r.lat] ?? "").trim() !== "" && String(n[r.lon] ?? "").trim() !== "";
|
|
1700
1700
|
});
|
|
1701
|
-
return
|
|
1701
|
+
return r.lat && r.lon && !_2 && a4.push(`lat/lon=${r.lat}/${r.lon} (no row holds a usable coordinate pair)`), r.country && !K3 && !(r.city || r.state || r.zip || _2) && a4.push(k2 ? `country=${r.country} (every row resolves to the same country - nothing to place apart)` : `country=${r.country} (values are not country identifiers)`), { bind: !!(r.city || r.state || r.zip || K3 || _2) ? r : null, backfilled: u2, refused: a4, ...Object.keys(T3).length ? { labelFallback: T3 } : {} };
|
|
1702
1702
|
}
|
|
1703
1703
|
|
|
1704
1704
|
// src/payload.ts
|
|
@@ -1808,20 +1808,20 @@ function buildRenderPayload(cols, rowObjs, geo, point, destination, opts) {
|
|
|
1808
1808
|
a4[c2] = v2 ?? null;
|
|
1809
1809
|
}
|
|
1810
1810
|
}
|
|
1811
|
-
let
|
|
1812
|
-
a4[
|
|
1813
|
-
if (geoIso) a4[
|
|
1811
|
+
let k2 = cols.length;
|
|
1812
|
+
a4[k2++] = r;
|
|
1813
|
+
if (geoIso) a4[k2++] = geoIso[r];
|
|
1814
1814
|
if (pLat && pLon) {
|
|
1815
|
-
a4[
|
|
1816
|
-
a4[
|
|
1817
|
-
a4[
|
|
1815
|
+
a4[k2++] = pLat[r];
|
|
1816
|
+
a4[k2++] = pLon[r];
|
|
1817
|
+
a4[k2++] = pPrec ? pPrec[r] : null;
|
|
1818
1818
|
}
|
|
1819
1819
|
if (dLat && dLon) {
|
|
1820
|
-
a4[
|
|
1821
|
-
a4[
|
|
1822
|
-
a4[
|
|
1820
|
+
a4[k2++] = dLat[r];
|
|
1821
|
+
a4[k2++] = dLon[r];
|
|
1822
|
+
a4[k2++] = dPrec ? dPrec[r] : null;
|
|
1823
1823
|
}
|
|
1824
|
-
for (const ac of aliasCols) a4[
|
|
1824
|
+
for (const ac of aliasCols) a4[k2++] = a4[ac.from];
|
|
1825
1825
|
out[r] = a4;
|
|
1826
1826
|
}
|
|
1827
1827
|
const colsOut = [...cols, { name: "__rowIdx__", dataType: "Integer", isMeasure: false, modelDesc: "" }];
|
|
@@ -2305,13 +2305,13 @@ function censusHitBands(container, doc) {
|
|
|
2305
2305
|
if (!OPEN_TAGS.has(tag)) continue;
|
|
2306
2306
|
const cs = styleOf2(el, ownerDoc);
|
|
2307
2307
|
const open = isUnfilled(attrOrComputed(el, "fill", cs));
|
|
2308
|
-
const
|
|
2308
|
+
const w3 = widthPx(attrOrComputed(el, "stroke-width", cs) || "1");
|
|
2309
2309
|
const geom = String(el.getAttribute?.("d") ?? "") || `${tag}#${String(el.getAttribute?.(ROW_IDX_ATTR) ?? "")}`;
|
|
2310
2310
|
const inert = String(cs?.pointerEvents ?? el.style?.pointerEvents ?? "") === "none";
|
|
2311
|
-
rows.push({ el, geom, w:
|
|
2312
|
-
if (isFinite(
|
|
2311
|
+
rows.push({ el, geom, w: w3, open, inert });
|
|
2312
|
+
if (isFinite(w3)) {
|
|
2313
2313
|
const prev = widestByGeom.get(geom);
|
|
2314
|
-
if (prev === void 0 ||
|
|
2314
|
+
if (prev === void 0 || w3 > prev) widestByGeom.set(geom, w3);
|
|
2315
2315
|
}
|
|
2316
2316
|
}
|
|
2317
2317
|
const out = { ...EMPTY3 };
|
|
@@ -2408,10 +2408,10 @@ function censusValuePlacement(container, data) {
|
|
|
2408
2408
|
for (const axis of ["x", "y"]) {
|
|
2409
2409
|
const keep = [];
|
|
2410
2410
|
const v2 = [], pos = [];
|
|
2411
|
-
dots.forEach((d2,
|
|
2412
|
-
if (!Number.isFinite(vals[
|
|
2413
|
-
keep.push(
|
|
2414
|
-
v2.push(log ? Math.log10(vals[
|
|
2411
|
+
dots.forEach((d2, k2) => {
|
|
2412
|
+
if (!Number.isFinite(vals[k2])) return;
|
|
2413
|
+
keep.push(k2);
|
|
2414
|
+
v2.push(log ? Math.log10(vals[k2]) : vals[k2]);
|
|
2415
2415
|
pos.push(axis === "x" ? d2.x : d2.y);
|
|
2416
2416
|
});
|
|
2417
2417
|
const line = robustLine(v2, pos);
|
|
@@ -2420,8 +2420,8 @@ function censusValuePlacement(container, data) {
|
|
|
2420
2420
|
if (hi - lo < MIN_AXIS_SPAN_PX) continue;
|
|
2421
2421
|
const mean = pos.reduce((s, p2) => s + p2, 0) / pos.length;
|
|
2422
2422
|
let ssRes = 0, ssTot = 0;
|
|
2423
|
-
const res = pos.map((p2,
|
|
2424
|
-
const e = p2 - (line.a + line.b * v2[
|
|
2423
|
+
const res = pos.map((p2, k2) => {
|
|
2424
|
+
const e = p2 - (line.a + line.b * v2[k2]);
|
|
2425
2425
|
ssRes += e * e;
|
|
2426
2426
|
ssTot += (p2 - mean) ** 2;
|
|
2427
2427
|
return e;
|
|
@@ -2430,8 +2430,8 @@ function censusValuePlacement(container, data) {
|
|
|
2430
2430
|
const fit = 1 - ssRes / ssTot;
|
|
2431
2431
|
if (fit >= VALUE_AXIS_MIN_FIT && (!best || fit > best.fit)) {
|
|
2432
2432
|
const full = new Array(dots.length).fill(NaN);
|
|
2433
|
-
keep.forEach((
|
|
2434
|
-
full[
|
|
2433
|
+
keep.forEach((k2, j3) => {
|
|
2434
|
+
full[k2] = res[j3];
|
|
2435
2435
|
});
|
|
2436
2436
|
best = { col: c2, axis, fit, res: full, log };
|
|
2437
2437
|
}
|
|
@@ -2441,8 +2441,8 @@ function censusValuePlacement(container, data) {
|
|
|
2441
2441
|
if (!best) return EMPTY4;
|
|
2442
2442
|
let off = 0, measured = 0;
|
|
2443
2443
|
const radii = [];
|
|
2444
|
-
dots.forEach((d2,
|
|
2445
|
-
const e = best.res[
|
|
2444
|
+
dots.forEach((d2, k2) => {
|
|
2445
|
+
const e = best.res[k2];
|
|
2446
2446
|
if (!Number.isFinite(e)) return;
|
|
2447
2447
|
measured++;
|
|
2448
2448
|
const inRadii = Math.abs(e) / Math.max(d2.r, 1);
|
|
@@ -2482,12 +2482,12 @@ function contentExtentOf(boxes) {
|
|
|
2482
2482
|
if (usable.length === 0) return { w: 0, h: 0, source: "none" };
|
|
2483
2483
|
const inFlow = usable.filter((b4) => !b4.floating);
|
|
2484
2484
|
const counted = inFlow.length > 0 ? inFlow : usable;
|
|
2485
|
-
let
|
|
2485
|
+
let w3 = 0, h3 = 0;
|
|
2486
2486
|
for (const b4 of counted) {
|
|
2487
|
-
if (b4.right >
|
|
2487
|
+
if (b4.right > w3) w3 = b4.right;
|
|
2488
2488
|
if (b4.bottom > h3) h3 = b4.bottom;
|
|
2489
2489
|
}
|
|
2490
|
-
return { w:
|
|
2490
|
+
return { w: w3, h: h3, source: inFlow.length > 0 ? "in-flow" : "all-floating" };
|
|
2491
2491
|
}
|
|
2492
2492
|
function scrollFitFor(contentW, contentH, viewportW, viewportH, slackPx = SCROLL_SLACK_PX) {
|
|
2493
2493
|
return {
|
|
@@ -2497,8 +2497,8 @@ function scrollFitFor(contentW, contentH, viewportW, viewportH, slackPx = SCROLL
|
|
|
2497
2497
|
}
|
|
2498
2498
|
var FIT_CONTENT_SELECTOR = "text, .d3-mark, .d3-legend-mark";
|
|
2499
2499
|
var PHANTOM_FRACTION = 0.95;
|
|
2500
|
-
function isPhantomBox(
|
|
2501
|
-
return
|
|
2500
|
+
function isPhantomBox(w3, h3, refW, refH) {
|
|
2501
|
+
return w3 > refW * PHANTOM_FRACTION || h3 > refH * PHANTOM_FRACTION;
|
|
2502
2502
|
}
|
|
2503
2503
|
var MAX_FRAME_GROW_FACTOR = 20;
|
|
2504
2504
|
function planFrameGrow(inkBottomPx, elHeightPx, viewBoxH, ctmScale, slackPx = SCROLL_SLACK_PX, maxFactor = MAX_FRAME_GROW_FACTOR) {
|
|
@@ -3017,8 +3017,8 @@ var NAMED = {
|
|
|
3017
3017
|
};
|
|
3018
3018
|
function toRGBA(c2) {
|
|
3019
3019
|
if (typeof c2 !== "string") return null;
|
|
3020
|
-
const
|
|
3021
|
-
if (
|
|
3020
|
+
const k2 = c2.trim().toLowerCase();
|
|
3021
|
+
if (k2 in NAMED) return NAMED[k2];
|
|
3022
3022
|
return parseRGBA(c2);
|
|
3023
3023
|
}
|
|
3024
3024
|
function compositeOver(fg, bg) {
|
|
@@ -3068,12 +3068,12 @@ var GLYPH_SAMPLE_N = 3;
|
|
|
3068
3068
|
function glyphSampleGrid(box, n = GLYPH_SAMPLE_N) {
|
|
3069
3069
|
const out = [];
|
|
3070
3070
|
if (!box || !(box.width > 0) || !(box.height > 0) || !(n >= 1)) return out;
|
|
3071
|
-
const
|
|
3072
|
-
for (let i = 0; i <
|
|
3073
|
-
for (let j3 = 0; j3 <
|
|
3071
|
+
const k2 = Math.floor(n);
|
|
3072
|
+
for (let i = 0; i < k2; i++) {
|
|
3073
|
+
for (let j3 = 0; j3 < k2; j3++) {
|
|
3074
3074
|
out.push({
|
|
3075
|
-
x: box.left + box.width * (i + 0.5) /
|
|
3076
|
-
y: box.top + box.height * (j3 + 0.5) /
|
|
3075
|
+
x: box.left + box.width * (i + 0.5) / k2,
|
|
3076
|
+
y: box.top + box.height * (j3 + 0.5) / k2
|
|
3077
3077
|
});
|
|
3078
3078
|
}
|
|
3079
3079
|
}
|
|
@@ -3288,7 +3288,7 @@ function sessionViewStateProvider(container) {
|
|
|
3288
3288
|
load: () => store,
|
|
3289
3289
|
save: (next) => {
|
|
3290
3290
|
if (!next || typeof next !== "object") return;
|
|
3291
|
-
for (const
|
|
3291
|
+
for (const k2 of Object.keys(store)) delete store[k2];
|
|
3292
3292
|
Object.assign(store, next);
|
|
3293
3293
|
}
|
|
3294
3294
|
};
|
package/dist/geo.mjs
CHANGED
|
@@ -7,12 +7,12 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
WORLD_110M
|
|
9
9
|
} from "./chunk-ABGDJ3NJ.mjs";
|
|
10
|
-
import {
|
|
11
|
-
US_STATES
|
|
12
|
-
} from "./chunk-75ZJSYIF.mjs";
|
|
13
10
|
import {
|
|
14
11
|
US_ZIP3
|
|
15
12
|
} from "./chunk-D3N3JUMK.mjs";
|
|
13
|
+
import {
|
|
14
|
+
US_STATES
|
|
15
|
+
} from "./chunk-75ZJSYIF.mjs";
|
|
16
16
|
import "./chunk-GHODWOAL.mjs";
|
|
17
17
|
|
|
18
18
|
// src/geo.ts
|
package/dist/index.mjs
CHANGED
package/dist/react.mjs
CHANGED
package/dist/testing.mjs
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
|
|
2
|
+
import "./chunk-GHODWOAL.mjs";
|
|
3
|
+
|
|
4
|
+
// src/testing/index.ts
|
|
5
|
+
var ConformanceError = class extends Error {
|
|
6
|
+
contract;
|
|
7
|
+
failures;
|
|
8
|
+
constructor(contract, failures) {
|
|
9
|
+
super(`${contract} conformance failed:
|
|
10
|
+
- ${failures.join("\n - ")}`);
|
|
11
|
+
this.name = "ConformanceError";
|
|
12
|
+
this.contract = contract;
|
|
13
|
+
this.failures = failures;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
function describeThrow(e) {
|
|
17
|
+
return e instanceof Error ? `${e.name}: ${e.message}` : String(e);
|
|
18
|
+
}
|
|
19
|
+
var PROBE_A = "__bicharts_conformance_marker_a__";
|
|
20
|
+
var PROBE_B = "__bicharts_conformance_marker_b__";
|
|
21
|
+
async function assertMarkerStoreConformance(store) {
|
|
22
|
+
const failures = [];
|
|
23
|
+
const done = () => {
|
|
24
|
+
if (failures.length) throw new ConformanceError("MarkerStore", failures);
|
|
25
|
+
};
|
|
26
|
+
if (!store || typeof store.read !== "function" || typeof store.write !== "function" || typeof store.clear !== "function") {
|
|
27
|
+
failures.push("the store is missing read(), write() or clear()");
|
|
28
|
+
done();
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
store.clear(PROBE_A);
|
|
32
|
+
store.clear(PROBE_B);
|
|
33
|
+
const absent = store.read(PROBE_A);
|
|
34
|
+
if (absent !== null) {
|
|
35
|
+
failures.push(`read() of a key never written returned ${JSON.stringify(absent)}, not null`);
|
|
36
|
+
}
|
|
37
|
+
const v1 = '{"at":1,"corr":"probe-1"}';
|
|
38
|
+
await store.write(PROBE_A, v1);
|
|
39
|
+
const r1 = store.read(PROBE_A);
|
|
40
|
+
if (r1 !== v1) failures.push(`read() after write() returned ${JSON.stringify(r1)}, not the value written`);
|
|
41
|
+
const other = store.read(PROBE_B);
|
|
42
|
+
if (other !== null) failures.push(`writing one key changed another: it reads ${JSON.stringify(other)}`);
|
|
43
|
+
const v2 = '{"at":2,"corr":"probe-2"}';
|
|
44
|
+
await store.write(PROBE_A, v2);
|
|
45
|
+
const r2 = store.read(PROBE_A);
|
|
46
|
+
if (r2 !== v2) failures.push(`a second write() did not replace the first: read ${JSON.stringify(r2)}`);
|
|
47
|
+
await store.write(PROBE_B, v1);
|
|
48
|
+
store.clear(PROBE_A);
|
|
49
|
+
const cleared = store.read(PROBE_A);
|
|
50
|
+
if (cleared !== null) failures.push(`read() after clear() returned ${JSON.stringify(cleared)}, not null`);
|
|
51
|
+
const kept = store.read(PROBE_B);
|
|
52
|
+
if (kept !== v1) failures.push(`clear() of one key disturbed another: it reads ${JSON.stringify(kept)}`);
|
|
53
|
+
} catch (e) {
|
|
54
|
+
failures.push(`the store threw during an ordinary read, write or clear: ${describeThrow(e)}`);
|
|
55
|
+
} finally {
|
|
56
|
+
try {
|
|
57
|
+
store.clear(PROBE_A);
|
|
58
|
+
store.clear(PROBE_B);
|
|
59
|
+
} catch {
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
done();
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
ConformanceError,
|
|
66
|
+
assertMarkerStoreConformance
|
|
67
|
+
};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { RenderOptions } from "../contract";
|
|
2
|
+
/** Signs an encoded request body. See @bicharts/shape-core's host/services.ts. */
|
|
3
|
+
export interface WireSigner {
|
|
4
|
+
sign(encodedBody: string): string;
|
|
5
|
+
}
|
|
6
|
+
/** The response half of a transport. See @bicharts/shape-core's host/services.ts. */
|
|
7
|
+
export interface WireResponse {
|
|
8
|
+
status: number;
|
|
9
|
+
contentType: string | null;
|
|
10
|
+
body: ReadableStream<Uint8Array> | null;
|
|
11
|
+
text(): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
/** Posts an encoded body. See @bicharts/shape-core's host/services.ts. */
|
|
14
|
+
export interface WireTransport {
|
|
15
|
+
post(url: string, encodedBody: string, headers: Record<string, string>, opts: {
|
|
16
|
+
timeoutMs: number;
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
}): Promise<WireResponse>;
|
|
19
|
+
}
|
|
20
|
+
/** The licence triple as the wire carries it. */
|
|
21
|
+
export interface CredentialTriple {
|
|
22
|
+
licensee: string;
|
|
23
|
+
licenseKey: string;
|
|
24
|
+
secretKey: string;
|
|
25
|
+
}
|
|
26
|
+
/** What a request is entitled by. See @bicharts/shape-core's host/services.ts. */
|
|
27
|
+
export interface CredentialSource {
|
|
28
|
+
triple(): CredentialTriple;
|
|
29
|
+
linkNonce?: (() => string | null) | null;
|
|
30
|
+
freemiumKey?: (() => string | null) | null;
|
|
31
|
+
instanceKey?: (() => string | null) | null;
|
|
32
|
+
}
|
|
33
|
+
/** The drawing area a request should be sized for, in CSS pixels. */
|
|
34
|
+
export interface ViewportSource {
|
|
35
|
+
measure(): {
|
|
36
|
+
width: number;
|
|
37
|
+
height: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Milliseconds since the epoch. */
|
|
41
|
+
export interface Clock {
|
|
42
|
+
now(): number;
|
|
43
|
+
}
|
|
44
|
+
/** One diagnostics breadcrumb. */
|
|
45
|
+
export interface DiagnosticEntry {
|
|
46
|
+
event: string;
|
|
47
|
+
detail?: unknown;
|
|
48
|
+
}
|
|
49
|
+
/** Where diagnostics breadcrumbs go. `record` never throws. */
|
|
50
|
+
export interface DiagnosticsSink {
|
|
51
|
+
record(entry: DiagnosticEntry): void;
|
|
52
|
+
}
|
|
53
|
+
/** A chart renderer a host can execute. */
|
|
54
|
+
export type RendererId = "D3" | "PLOTLY" | "VEGA" | "PYTHON";
|
|
55
|
+
/**
|
|
56
|
+
* Small string values that must outlive the page: the pending-generate marker is the first.
|
|
57
|
+
* The visual keeps them in the report, the add-in in the workbook. The MCP server holds a
|
|
58
|
+
* generate only for the length of one call and passes none; a demo page has nothing to
|
|
59
|
+
* recover and passes none.
|
|
60
|
+
*
|
|
61
|
+
* `read` returns null - not undefined, not "" - for a key never written or cleared. `write`
|
|
62
|
+
* replaces; it may complete asynchronously, and a caller that needs the value durable awaits
|
|
63
|
+
* it. `clear` removes the key.
|
|
64
|
+
*/
|
|
65
|
+
export interface MarkerStore {
|
|
66
|
+
read(key: string): string | null;
|
|
67
|
+
write(key: string, value: string): void | Promise<void>;
|
|
68
|
+
clear(key: string): void;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The reader's saved settings, read one key at a time. The visual reads its format pane, the
|
|
72
|
+
* add-in its task-pane preferences, a web page whatever its caller configured. The MCP server
|
|
73
|
+
* takes its options as arguments and passes none.
|
|
74
|
+
*
|
|
75
|
+
* Keyed on RenderOptions until the shared options vocabulary lands; `undefined` means the
|
|
76
|
+
* reader has not set the key and the shared default applies.
|
|
77
|
+
*/
|
|
78
|
+
export interface PreferenceSource<Vocab extends object = RenderOptions> {
|
|
79
|
+
get<K extends keyof Vocab & string>(key: K): Vocab[K] | undefined;
|
|
80
|
+
}
|
|
81
|
+
/** The surface a chart sits on, as colours a chart can use directly. */
|
|
82
|
+
export interface HostTheme {
|
|
83
|
+
/** Canvas colour, as a CSS colour string. */
|
|
84
|
+
background: string;
|
|
85
|
+
/** Default text colour, as a CSS colour string. */
|
|
86
|
+
foreground: string;
|
|
87
|
+
/** True when the host is in a forced high-contrast mode. */
|
|
88
|
+
isHighContrast: boolean;
|
|
89
|
+
/** The host's own categorical colours, when it has any (a report theme; a workbook's accents). */
|
|
90
|
+
palette?: readonly string[];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Reads the host's current theme. The visual reads the report theme, the add-in the Office
|
|
94
|
+
* theme. The MCP preview is not a product surface and passes none; a demo page that reads the
|
|
95
|
+
* browser's colour scheme passes one.
|
|
96
|
+
*/
|
|
97
|
+
export interface ThemeSource {
|
|
98
|
+
read(): HostTheme;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Whether a rendered chart may be captured as a thumbnail. `consented` is the reader's (or
|
|
102
|
+
* their administrator's) answer; `forced` is a host rule that captures regardless (a
|
|
103
|
+
* first-render capture a licence requires). The visual and the add-in provide it; the MCP
|
|
104
|
+
* server has no DOM and a demo page no credentials, so both pass none.
|
|
105
|
+
*/
|
|
106
|
+
export interface ThumbnailConsent {
|
|
107
|
+
consented(): boolean;
|
|
108
|
+
forced(): boolean;
|
|
109
|
+
}
|
|
110
|
+
/** The rendered chart's root <svg>, or null when the chart drew none (a canvas, a table). */
|
|
111
|
+
export interface SnapshotTarget {
|
|
112
|
+
svg(): SVGSVGElement | null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The whole services object a host constructs and passes to shared logic.
|
|
116
|
+
*
|
|
117
|
+
* Required members are the ones every host that sends requests provides today, so their
|
|
118
|
+
* absence is a compile error. An optional member that is absent - or null, which means the
|
|
119
|
+
* same - is the host declaring it cannot do that thing. What a host can do is derived from
|
|
120
|
+
* this object, never declared beside it, so a capability cannot be claimed without the service
|
|
121
|
+
* that backs it.
|
|
122
|
+
*
|
|
123
|
+
* Each optional member's host coverage today:
|
|
124
|
+
* - viewport: visual, add-in, web page; not the MCP server (sizes are arguments).
|
|
125
|
+
* - markers: visual, add-in; not the MCP server (in-call only) or a demo page.
|
|
126
|
+
* - prefs: visual, add-in, web page; not the MCP server (options are arguments).
|
|
127
|
+
* - theme: visual, add-in; a web page when it reads the browser's scheme; not the MCP server.
|
|
128
|
+
* - thumbnails and snapshot: visual, add-in; not the MCP server (no DOM) or a demo page.
|
|
129
|
+
* - diagnostics: visual, add-in; not the MCP server (stdio) or a demo page.
|
|
130
|
+
*/
|
|
131
|
+
export interface HostServices {
|
|
132
|
+
signer: WireSigner;
|
|
133
|
+
transport: WireTransport;
|
|
134
|
+
credentials: CredentialSource;
|
|
135
|
+
clock: Clock;
|
|
136
|
+
renderers: ReadonlySet<RendererId>;
|
|
137
|
+
viewport?: ViewportSource | null;
|
|
138
|
+
markers?: MarkerStore | null;
|
|
139
|
+
prefs?: PreferenceSource | null;
|
|
140
|
+
theme?: ThemeSource | null;
|
|
141
|
+
thumbnails?: ThumbnailConsent | null;
|
|
142
|
+
snapshot?: SnapshotTarget | null;
|
|
143
|
+
diagnostics?: DiagnosticsSink | null;
|
|
144
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -38,3 +38,4 @@ export { PENDING_RECOVERY_WINDOW_MS, PENDING_RECOVERY_POLL_MS, PENDING_RECOVERY_
|
|
|
38
38
|
export { stripJsComments } from "./codeComments";
|
|
39
39
|
export { reconcileChartPick, type ChartPickReconciliation } from "./chartPick";
|
|
40
40
|
export { stableFingerprintOptions, fingerprintComponentDigest, type ClientIdSource } from "./clientIdentity";
|
|
41
|
+
export type { HostServices, MarkerStore, PreferenceSource, HostTheme, ThemeSource, ThumbnailConsent, SnapshotTarget, WireSigner, WireTransport, WireResponse, CredentialTriple, CredentialSource, ViewportSource, Clock, DiagnosticEntry, DiagnosticsSink, RendererId, } from "./host/services";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MarkerStore } from "../host/services";
|
|
2
|
+
/** Thrown by every conformance check. `failures` names each property the adapter broke. */
|
|
3
|
+
export declare class ConformanceError extends Error {
|
|
4
|
+
readonly contract: string;
|
|
5
|
+
readonly failures: readonly string[];
|
|
6
|
+
constructor(contract: string, failures: readonly string[]);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A MarkerStore reads null for a key it does not hold, returns exactly what was written,
|
|
10
|
+
* replaces on a second write, keeps keys independent, and reads null again after a clear.
|
|
11
|
+
* Awaits every write, since a store may complete one asynchronously. Clears both probe keys
|
|
12
|
+
* before returning, whether or not the check passed.
|
|
13
|
+
*/
|
|
14
|
+
export declare function assertMarkerStoreConformance(store: MarkerStore): Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bicharts/chart-host",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Run a BIC-generated D3 chart in any web host: compiles the generated render() function, applies the shared option defaults, resolves mark clicks (through tooltip overlays), owns the selection affordance, and translates row indices between cross-filtered charts. The same contract the BIC Power BI visual implements, minus Power BI. React bindings at @bicharts/chart-host/react.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -39,6 +39,11 @@
|
|
|
39
39
|
"import": "./dist/geo-us-zip3.mjs",
|
|
40
40
|
"default": "./dist/geo-us-zip3.mjs"
|
|
41
41
|
},
|
|
42
|
+
"./testing": {
|
|
43
|
+
"types": "./dist/types/testing/index.d.ts",
|
|
44
|
+
"import": "./dist/testing.mjs",
|
|
45
|
+
"default": "./dist/testing.mjs"
|
|
46
|
+
},
|
|
42
47
|
"./package.json": "./package.json"
|
|
43
48
|
},
|
|
44
49
|
"files": [
|