vega 0.1.1 → 0.1.2

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.
@@ -1,10 +1,10 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vega')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'vega'], factory) :
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vegaLite = {}));
5
5
  }(this, (function (exports) { 'use strict';
6
6
 
7
- var version = "4.16.2";
7
+ var version = "4.17.0";
8
8
 
9
9
  function accessor(fn, fields, name) {
10
10
  fn.fields = fields || [];
@@ -14637,7 +14637,7 @@
14637
14637
  function defaultLabelOverlap(type, scaleType, hasTimeUnit, sort) {
14638
14638
  // do not prevent overlap for nominal data because there is no way to infer what the missing labels are
14639
14639
  if (hasTimeUnit && !isObject(sort) || type !== 'nominal' && type !== 'ordinal') {
14640
- if (scaleType === 'log') {
14640
+ if (scaleType === 'log' || scaleType === 'symlog') {
14641
14641
  return 'greedy';
14642
14642
  }
14643
14643
 
@@ -15647,7 +15647,7 @@
15647
15647
  }
15648
15648
 
15649
15649
  function defaultLabelOverlap$1(scaleType) {
15650
- if (contains(['quantile', 'threshold', 'log'], scaleType)) {
15650
+ if (contains(['quantile', 'threshold', 'log', 'symlog'], scaleType)) {
15651
15651
  return 'greedy';
15652
15652
  }
15653
15653
 
@@ -17918,7 +17918,7 @@
17918
17918
 
17919
17919
  class RemoveUnusedSubtrees extends BottomUpOptimizer {
17920
17920
  run(node) {
17921
- if (node instanceof OutputNode || node.numChildren() > 0 || node instanceof FacetNode) ; else {
17921
+ if (node instanceof OutputNode || node.numChildren() > 0 || node instanceof FacetNode) ; else if (node instanceof SourceNode) ; else {
17922
17922
  this.setModified();
17923
17923
  node.remove();
17924
17924
  }
@@ -4,6 +4,88 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vega = {}));
5
5
  }(this, (function (exports) { 'use strict';
6
6
 
7
+ var name = "vega";
8
+ var version = "5.19.1";
9
+ var description = "The Vega visualization grammar.";
10
+ var keywords = [
11
+ "vega",
12
+ "visualization",
13
+ "interaction",
14
+ "dataflow",
15
+ "library",
16
+ "data",
17
+ "d3"
18
+ ];
19
+ var license = "BSD-3-Clause";
20
+ var author = "UW Interactive Data Lab (http://idl.cs.washington.edu)";
21
+ var main = "build/vega-node.js";
22
+ var module = "build/vega.module.js";
23
+ var unpkg = "build/vega.min.js";
24
+ var jsdelivr = "build/vega.min.js";
25
+ var types = "index.d.ts";
26
+ var repository = "vega/vega";
27
+ var scripts = {
28
+ bundle: "rollup -c --config-bundle",
29
+ prebuild: "rimraf build && rimraf build-es5",
30
+ build: "rollup -c --config-core --config-bundle --config-ie",
31
+ postbuild: "node schema-copy",
32
+ pretest: "yarn build --config-test",
33
+ test: "TZ=America/Los_Angeles tape 'test/**/*-test.js'",
34
+ prepublishOnly: "yarn test && yarn build",
35
+ postpublish: "./schema-deploy.sh"
36
+ };
37
+ var dependencies = {
38
+ "vega-crossfilter": "~4.0.5",
39
+ "vega-dataflow": "~5.7.3",
40
+ "vega-encode": "~4.8.3",
41
+ "vega-event-selector": "~2.0.6",
42
+ "vega-expression": "~4.0.1",
43
+ "vega-force": "~4.0.7",
44
+ "vega-format": "~1.0.4",
45
+ "vega-functions": "~5.12.0",
46
+ "vega-geo": "~4.3.8",
47
+ "vega-hierarchy": "~4.0.9",
48
+ "vega-label": "~1.0.0",
49
+ "vega-loader": "~4.4.0",
50
+ "vega-parser": "~6.1.3",
51
+ "vega-projection": "~1.4.5",
52
+ "vega-regression": "~1.0.9",
53
+ "vega-runtime": "~6.1.3",
54
+ "vega-scale": "~7.1.1",
55
+ "vega-scenegraph": "~4.9.3",
56
+ "vega-statistics": "~1.7.9",
57
+ "vega-time": "~2.0.4",
58
+ "vega-transforms": "~4.9.3",
59
+ "vega-typings": "~0.19.2",
60
+ "vega-util": "~1.16.0",
61
+ "vega-view": "~5.9.2",
62
+ "vega-view-transforms": "~4.5.8",
63
+ "vega-voronoi": "~4.1.5",
64
+ "vega-wordcloud": "~4.1.3"
65
+ };
66
+ var devDependencies = {
67
+ "vega-schema": "*"
68
+ };
69
+ var gitHead = "f112ee55fc5ddd025df8820fce371803106a3968";
70
+ var pkg = {
71
+ name: name,
72
+ version: version,
73
+ description: description,
74
+ keywords: keywords,
75
+ license: license,
76
+ author: author,
77
+ main: main,
78
+ module: module,
79
+ unpkg: unpkg,
80
+ jsdelivr: jsdelivr,
81
+ types: types,
82
+ repository: repository,
83
+ scripts: scripts,
84
+ dependencies: dependencies,
85
+ devDependencies: devDependencies,
86
+ gitHead: gitHead
87
+ };
88
+
7
89
  function accessor(fn, fields, name) {
8
90
  fn.fields = fields || [];
9
91
  fn.fname = name;
@@ -662,6 +744,10 @@
662
744
  return Object.prototype.toString.call(_) === '[object Date]';
663
745
  }
664
746
 
747
+ function isIterable(_) {
748
+ return _ && isFunction(_[Symbol.iterator]);
749
+ }
750
+
665
751
  function isNumber(_) {
666
752
  return typeof _ === 'number';
667
753
  }
@@ -851,6 +937,231 @@
851
937
  }
852
938
  }
853
939
 
940
+ // https://... file://... //...
941
+
942
+ const protocol_re = /^([A-Za-z]+:)?\/\//; // Matches allowed URIs. From https://github.com/cure53/DOMPurify/blob/master/src/regexp.js with added file://
943
+
944
+ const allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i; // eslint-disable-line no-useless-escape
945
+
946
+ const whitespace_re = /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g; // eslint-disable-line no-control-regex
947
+ // Special treatment in node.js for the file: protocol
948
+
949
+ const fileProtocol = 'file://';
950
+ /**
951
+ * Factory for a loader constructor that provides methods for requesting
952
+ * files from either the network or disk, and for sanitizing request URIs.
953
+ * @param {function} fetch - The Fetch API for HTTP network requests.
954
+ * If null or undefined, HTTP loading will be disabled.
955
+ * @param {object} fs - The file system interface for file loading.
956
+ * If null or undefined, local file loading will be disabled.
957
+ * @return {function} A loader constructor with the following signature:
958
+ * param {object} [options] - Optional default loading options to use.
959
+ * return {object} - A new loader instance.
960
+ */
961
+
962
+ function loaderFactory (fetch, fs) {
963
+ return options => ({
964
+ options: options || {},
965
+ sanitize: sanitize,
966
+ load: load,
967
+ fileAccess: !!fs,
968
+ file: fileLoader(fs),
969
+ http: httpLoader(fetch)
970
+ });
971
+ }
972
+ /**
973
+ * Load an external resource, typically either from the web or from the local
974
+ * filesystem. This function uses {@link sanitize} to first sanitize the uri,
975
+ * then calls either {@link http} (for web requests) or {@link file} (for
976
+ * filesystem loading).
977
+ * @param {string} uri - The resource indicator (e.g., URL or filename).
978
+ * @param {object} [options] - Optional loading options. These options will
979
+ * override any existing default options.
980
+ * @return {Promise} - A promise that resolves to the loaded content.
981
+ */
982
+
983
+ async function load(uri, options) {
984
+ const opt = await this.sanitize(uri, options),
985
+ url = opt.href;
986
+ return opt.localFile ? this.file(url) : this.http(url, options);
987
+ }
988
+ /**
989
+ * URI sanitizer function.
990
+ * @param {string} uri - The uri (url or filename) to check.
991
+ * @param {object} options - An options hash.
992
+ * @return {Promise} - A promise that resolves to an object containing
993
+ * sanitized uri data, or rejects it the input uri is deemed invalid.
994
+ * The properties of the resolved object are assumed to be
995
+ * valid attributes for an HTML 'a' tag. The sanitized uri *must* be
996
+ * provided by the 'href' property of the returned object.
997
+ */
998
+
999
+
1000
+ async function sanitize(uri, options) {
1001
+ options = extend({}, this.options, options);
1002
+ const fileAccess = this.fileAccess,
1003
+ result = {
1004
+ href: null
1005
+ };
1006
+ let isFile, loadFile, base;
1007
+ const isAllowed = allowed_re.test(uri.replace(whitespace_re, ''));
1008
+
1009
+ if (uri == null || typeof uri !== 'string' || !isAllowed) {
1010
+ error('Sanitize failure, invalid URI: ' + $(uri));
1011
+ }
1012
+
1013
+ const hasProtocol = protocol_re.test(uri); // if relative url (no protocol/host), prepend baseURL
1014
+
1015
+ if ((base = options.baseURL) && !hasProtocol) {
1016
+ // Ensure that there is a slash between the baseURL (e.g. hostname) and url
1017
+ if (!uri.startsWith('/') && base[base.length - 1] !== '/') {
1018
+ uri = '/' + uri;
1019
+ }
1020
+
1021
+ uri = base + uri;
1022
+ } // should we load from file system?
1023
+
1024
+
1025
+ loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === 'file' || options.mode !== 'http' && !hasProtocol && fileAccess;
1026
+
1027
+ if (isFile) {
1028
+ // strip file protocol
1029
+ uri = uri.slice(fileProtocol.length);
1030
+ } else if (uri.startsWith('//')) {
1031
+ if (options.defaultProtocol === 'file') {
1032
+ // if is file, strip protocol and set loadFile flag
1033
+ uri = uri.slice(2);
1034
+ loadFile = true;
1035
+ } else {
1036
+ // if relative protocol (starts with '//'), prepend default protocol
1037
+ uri = (options.defaultProtocol || 'http') + ':' + uri;
1038
+ }
1039
+ } // set non-enumerable mode flag to indicate local file load
1040
+
1041
+
1042
+ Object.defineProperty(result, 'localFile', {
1043
+ value: !!loadFile
1044
+ }); // set uri
1045
+
1046
+ result.href = uri; // set default result target, if specified
1047
+
1048
+ if (options.target) {
1049
+ result.target = options.target + '';
1050
+ } // set default result rel, if specified (#1542)
1051
+
1052
+
1053
+ if (options.rel) {
1054
+ result.rel = options.rel + '';
1055
+ } // provide control over cross-origin image handling (#2238)
1056
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image
1057
+
1058
+
1059
+ if (options.context === 'image' && options.crossOrigin) {
1060
+ result.crossOrigin = options.crossOrigin + '';
1061
+ } // return
1062
+
1063
+
1064
+ return result;
1065
+ }
1066
+ /**
1067
+ * File system loader factory.
1068
+ * @param {object} fs - The file system interface.
1069
+ * @return {function} - A file loader with the following signature:
1070
+ * param {string} filename - The file system path to load.
1071
+ * param {string} filename - The file system path to load.
1072
+ * return {Promise} A promise that resolves to the file contents.
1073
+ */
1074
+
1075
+
1076
+ function fileLoader(fs) {
1077
+ return fs ? filename => new Promise((accept, reject) => {
1078
+ fs.readFile(filename, (error, data) => {
1079
+ if (error) reject(error);else accept(data);
1080
+ });
1081
+ }) : fileReject;
1082
+ }
1083
+ /**
1084
+ * Default file system loader that simply rejects.
1085
+ */
1086
+
1087
+
1088
+ async function fileReject() {
1089
+ error('No file system access.');
1090
+ }
1091
+ /**
1092
+ * HTTP request handler factory.
1093
+ * @param {function} fetch - The Fetch API method.
1094
+ * @return {function} - An http loader with the following signature:
1095
+ * param {string} url - The url to request.
1096
+ * param {object} options - An options hash.
1097
+ * return {Promise} - A promise that resolves to the file contents.
1098
+ */
1099
+
1100
+
1101
+ function httpLoader(fetch) {
1102
+ return fetch ? async function (url, options) {
1103
+ const opt = extend({}, this.options.http, options),
1104
+ type = options && options.response,
1105
+ response = await fetch(url, opt);
1106
+ return !response.ok ? error(response.status + '' + response.statusText) : isFunction(response[type]) ? response[type]() : response.text();
1107
+ } : httpReject;
1108
+ }
1109
+ /**
1110
+ * Default http request handler that simply rejects.
1111
+ */
1112
+
1113
+
1114
+ async function httpReject() {
1115
+ error('No HTTP fetch method available.');
1116
+ }
1117
+
1118
+ const isValid = _ => _ != null && _ === _;
1119
+
1120
+ const isBoolean$1 = _ => _ === 'true' || _ === 'false' || _ === true || _ === false;
1121
+
1122
+ const isDate$1 = _ => !Number.isNaN(Date.parse(_));
1123
+
1124
+ const isNumber$1 = _ => !Number.isNaN(+_) && !(_ instanceof Date);
1125
+
1126
+ const isInteger = _ => isNumber$1(_) && Number.isInteger(+_);
1127
+
1128
+ const typeParsers = {
1129
+ boolean: toBoolean,
1130
+ integer: toNumber,
1131
+ number: toNumber,
1132
+ date: toDate,
1133
+ string: toString,
1134
+ unknown: identity
1135
+ };
1136
+ const typeTests = [isBoolean$1, isInteger, isNumber$1, isDate$1];
1137
+ const typeList = ['boolean', 'integer', 'number', 'date'];
1138
+ function inferType(values, field) {
1139
+ if (!values || !values.length) return 'unknown';
1140
+ const n = values.length,
1141
+ m = typeTests.length,
1142
+ a = typeTests.map((_, i) => i + 1);
1143
+
1144
+ for (let i = 0, t = 0, j, value; i < n; ++i) {
1145
+ value = field ? values[i][field] : values[i];
1146
+
1147
+ for (j = 0; j < m; ++j) {
1148
+ if (a[j] && isValid(value) && !typeTests[j](value)) {
1149
+ a[j] = 0;
1150
+ ++t;
1151
+ if (t === typeTests.length) return 'string';
1152
+ }
1153
+ }
1154
+ }
1155
+
1156
+ return typeList[a.reduce((u, v) => u === 0 ? v : u, 0) - 1];
1157
+ }
1158
+ function inferTypes(data, fields) {
1159
+ return fields.reduce((types, field) => {
1160
+ types[field] = inferType(data, field);
1161
+ return types;
1162
+ }, {});
1163
+ }
1164
+
854
1165
  var EOL = {},
855
1166
  EOF = {},
856
1167
  QUOTE = 34,
@@ -1019,6 +1330,44 @@
1019
1330
  };
1020
1331
  }
1021
1332
 
1333
+ function delimitedFormat(delimiter) {
1334
+ const parse = function (data, format) {
1335
+ const delim = {
1336
+ delimiter: delimiter
1337
+ };
1338
+ return dsv(data, format ? extend(format, delim) : delim);
1339
+ };
1340
+
1341
+ parse.responseType = 'text';
1342
+ return parse;
1343
+ }
1344
+ function dsv(data, format) {
1345
+ if (format.header) {
1346
+ data = format.header.map($).join(format.delimiter) + '\n' + data;
1347
+ }
1348
+
1349
+ return dsvFormat(format.delimiter).parse(data + '');
1350
+ }
1351
+ dsv.responseType = 'text';
1352
+
1353
+ function isBuffer(_) {
1354
+ return typeof Buffer === 'function' && isFunction(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;
1355
+ }
1356
+
1357
+ function json(data, format) {
1358
+ const prop = format && format.property ? field(format.property) : identity;
1359
+ return isObject(data) && !isBuffer(data) ? parseJSON(prop(data), format) : prop(JSON.parse(data));
1360
+ }
1361
+ json.responseType = 'json';
1362
+
1363
+ function parseJSON(data, format) {
1364
+ if (!isArray(data) && isIterable(data)) {
1365
+ data = [...data];
1366
+ }
1367
+
1368
+ return format && format.copy ? JSON.parse(JSON.stringify(data)) : data;
1369
+ }
1370
+
1022
1371
  function identity$1 (x) {
1023
1372
  return x;
1024
1373
  }
@@ -1325,6 +1674,50 @@
1325
1674
  return arcs;
1326
1675
  }
1327
1676
 
1677
+ const filters = {
1678
+ interior: (a, b) => a !== b,
1679
+ exterior: (a, b) => a === b
1680
+ };
1681
+ function topojson(data, format) {
1682
+ let method, object, property, filter;
1683
+ data = json(data, format);
1684
+
1685
+ if (format && format.feature) {
1686
+ method = feature;
1687
+ property = format.feature;
1688
+ } else if (format && format.mesh) {
1689
+ method = mesh;
1690
+ property = format.mesh;
1691
+ filter = filters[format.filter];
1692
+ } else {
1693
+ error('Missing TopoJSON feature or mesh parameter.');
1694
+ }
1695
+
1696
+ object = (object = data.objects[property]) ? method(data, object, filter) : error('Invalid TopoJSON object: ' + property);
1697
+ return object && object.features || [object];
1698
+ }
1699
+ topojson.responseType = 'json';
1700
+
1701
+ const format = {
1702
+ dsv: dsv,
1703
+ csv: delimitedFormat(','),
1704
+ tsv: delimitedFormat('\t'),
1705
+ json: json,
1706
+ topojson: topojson
1707
+ };
1708
+ function formats(name, reader) {
1709
+ if (arguments.length > 1) {
1710
+ format[name] = reader;
1711
+ return this;
1712
+ } else {
1713
+ return has(format, name) ? format[name] : null;
1714
+ }
1715
+ }
1716
+ function responseType(type) {
1717
+ const f = formats(type);
1718
+ return f && f.responseType || 'text';
1719
+ }
1720
+
1328
1721
  function ascending$1 (a, b) {
1329
1722
  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1330
1723
  }
@@ -2010,7 +2403,7 @@
2010
2403
  }
2011
2404
 
2012
2405
  var locale;
2013
- var format;
2406
+ var format$1;
2014
2407
  var formatPrefix;
2015
2408
  defaultLocale({
2016
2409
  thousands: ",",
@@ -2019,7 +2412,7 @@
2019
2412
  });
2020
2413
  function defaultLocale(definition) {
2021
2414
  locale = formatLocale(definition);
2022
- format = locale.format;
2415
+ format$1 = locale.format;
2023
2416
  formatPrefix = locale.formatPrefix;
2024
2417
  return locale;
2025
2418
  }
@@ -3480,7 +3873,7 @@
3480
3873
 
3481
3874
  function resetNumberFormatDefaultLocale() {
3482
3875
  return defaultNumberLocale = numberLocale({
3483
- format: format,
3876
+ format: format$1,
3484
3877
  formatPrefix: formatPrefix
3485
3878
  });
3486
3879
  }
@@ -3575,317 +3968,7 @@
3575
3968
  return defaultLocale$2();
3576
3969
  }
3577
3970
 
3578
- const protocol_re = /^([A-Za-z]+:)?\/\//; // Matches allowed URIs. From https://github.com/cure53/DOMPurify/blob/master/src/regexp.js with added file://
3579
-
3580
- const allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i; // eslint-disable-line no-useless-escape
3581
-
3582
- const whitespace_re = /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g; // eslint-disable-line no-control-regex
3583
- // Special treatment in node.js for the file: protocol
3584
-
3585
- const fileProtocol = 'file://';
3586
- /**
3587
- * Factory for a loader constructor that provides methods for requesting
3588
- * files from either the network or disk, and for sanitizing request URIs.
3589
- * @param {function} fetch - The Fetch API for HTTP network requests.
3590
- * If null or undefined, HTTP loading will be disabled.
3591
- * @param {object} fs - The file system interface for file loading.
3592
- * If null or undefined, local file loading will be disabled.
3593
- * @return {function} A loader constructor with the following signature:
3594
- * param {object} [options] - Optional default loading options to use.
3595
- * return {object} - A new loader instance.
3596
- */
3597
-
3598
- function loaderFactory(fetch, fs) {
3599
- return options => ({
3600
- options: options || {},
3601
- sanitize: sanitize,
3602
- load: load,
3603
- fileAccess: !!fs,
3604
- file: fileLoader(fs),
3605
- http: httpLoader(fetch)
3606
- });
3607
- }
3608
- /**
3609
- * Load an external resource, typically either from the web or from the local
3610
- * filesystem. This function uses {@link sanitize} to first sanitize the uri,
3611
- * then calls either {@link http} (for web requests) or {@link file} (for
3612
- * filesystem loading).
3613
- * @param {string} uri - The resource indicator (e.g., URL or filename).
3614
- * @param {object} [options] - Optional loading options. These options will
3615
- * override any existing default options.
3616
- * @return {Promise} - A promise that resolves to the loaded content.
3617
- */
3618
-
3619
-
3620
- async function load(uri, options) {
3621
- const opt = await this.sanitize(uri, options),
3622
- url = opt.href;
3623
- return opt.localFile ? this.file(url) : this.http(url, options);
3624
- }
3625
- /**
3626
- * URI sanitizer function.
3627
- * @param {string} uri - The uri (url or filename) to sanity check.
3628
- * @param {object} options - An options hash.
3629
- * @return {Promise} - A promise that resolves to an object containing
3630
- * sanitized uri data, or rejects it the input uri is deemed invalid.
3631
- * The properties of the resolved object are assumed to be
3632
- * valid attributes for an HTML 'a' tag. The sanitized uri *must* be
3633
- * provided by the 'href' property of the returned object.
3634
- */
3635
-
3636
-
3637
- async function sanitize(uri, options) {
3638
- options = extend({}, this.options, options);
3639
- const fileAccess = this.fileAccess,
3640
- result = {
3641
- href: null
3642
- };
3643
- let isFile, loadFile, base;
3644
- const isAllowed = allowed_re.test(uri.replace(whitespace_re, ''));
3645
-
3646
- if (uri == null || typeof uri !== 'string' || !isAllowed) {
3647
- error('Sanitize failure, invalid URI: ' + $(uri));
3648
- }
3649
-
3650
- const hasProtocol = protocol_re.test(uri); // if relative url (no protocol/host), prepend baseURL
3651
-
3652
- if ((base = options.baseURL) && !hasProtocol) {
3653
- // Ensure that there is a slash between the baseURL (e.g. hostname) and url
3654
- if (!uri.startsWith('/') && base[base.length - 1] !== '/') {
3655
- uri = '/' + uri;
3656
- }
3657
-
3658
- uri = base + uri;
3659
- } // should we load from file system?
3660
-
3661
-
3662
- loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === 'file' || options.mode !== 'http' && !hasProtocol && fileAccess;
3663
-
3664
- if (isFile) {
3665
- // strip file protocol
3666
- uri = uri.slice(fileProtocol.length);
3667
- } else if (uri.startsWith('//')) {
3668
- if (options.defaultProtocol === 'file') {
3669
- // if is file, strip protocol and set loadFile flag
3670
- uri = uri.slice(2);
3671
- loadFile = true;
3672
- } else {
3673
- // if relative protocol (starts with '//'), prepend default protocol
3674
- uri = (options.defaultProtocol || 'http') + ':' + uri;
3675
- }
3676
- } // set non-enumerable mode flag to indicate local file load
3677
-
3678
-
3679
- Object.defineProperty(result, 'localFile', {
3680
- value: !!loadFile
3681
- }); // set uri
3682
-
3683
- result.href = uri; // set default result target, if specified
3684
-
3685
- if (options.target) {
3686
- result.target = options.target + '';
3687
- } // set default result rel, if specified (#1542)
3688
-
3689
-
3690
- if (options.rel) {
3691
- result.rel = options.rel + '';
3692
- } // provide control over cross-origin image handling (#2238)
3693
- // https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image
3694
-
3695
-
3696
- if (options.context === 'image' && options.crossOrigin) {
3697
- result.crossOrigin = options.crossOrigin + '';
3698
- } // return
3699
-
3700
-
3701
- return result;
3702
- }
3703
- /**
3704
- * File system loader factory.
3705
- * @param {object} fs - The file system interface.
3706
- * @return {function} - A file loader with the following signature:
3707
- * param {string} filename - The file system path to load.
3708
- * param {string} filename - The file system path to load.
3709
- * return {Promise} A promise that resolves to the file contents.
3710
- */
3711
-
3712
-
3713
- function fileLoader(fs) {
3714
- return fs ? filename => new Promise((accept, reject) => {
3715
- fs.readFile(filename, (error, data) => {
3716
- if (error) reject(error);else accept(data);
3717
- });
3718
- }) : fileReject;
3719
- }
3720
- /**
3721
- * Default file system loader that simply rejects.
3722
- */
3723
-
3724
-
3725
- async function fileReject() {
3726
- error('No file system access.');
3727
- }
3728
- /**
3729
- * HTTP request handler factory.
3730
- * @param {function} fetch - The Fetch API method.
3731
- * @return {function} - An http loader with the following signature:
3732
- * param {string} url - The url to request.
3733
- * param {object} options - An options hash.
3734
- * return {Promise} - A promise that resolves to the file contents.
3735
- */
3736
-
3737
-
3738
- function httpLoader(fetch) {
3739
- return fetch ? async function (url, options) {
3740
- const opt = extend({}, this.options.http, options),
3741
- type = options && options.response,
3742
- response = await fetch(url, opt);
3743
- return !response.ok ? error(response.status + '' + response.statusText) : isFunction(response[type]) ? response[type]() : response.text();
3744
- } : httpReject;
3745
- }
3746
- /**
3747
- * Default http request handler that simply rejects.
3748
- */
3749
-
3750
-
3751
- async function httpReject() {
3752
- error('No HTTP fetch method available.');
3753
- }
3754
-
3755
- const isValid = _ => _ != null && _ === _;
3756
-
3757
- const isBoolean$1 = _ => _ === 'true' || _ === 'false' || _ === true || _ === false;
3758
-
3759
- const isDate$1 = _ => !Number.isNaN(Date.parse(_));
3760
-
3761
- const isNumber$1 = _ => !Number.isNaN(+_) && !(_ instanceof Date);
3762
-
3763
- const isInteger = _ => isNumber$1(_) && Number.isInteger(+_);
3764
-
3765
- const typeParsers = {
3766
- boolean: toBoolean,
3767
- integer: toNumber,
3768
- number: toNumber,
3769
- date: toDate,
3770
- string: toString,
3771
- unknown: identity
3772
- };
3773
- const typeTests = [isBoolean$1, isInteger, isNumber$1, isDate$1];
3774
- const typeList = ['boolean', 'integer', 'number', 'date'];
3775
-
3776
- function inferType(values, field) {
3777
- if (!values || !values.length) return 'unknown';
3778
- const n = values.length,
3779
- m = typeTests.length,
3780
- a = typeTests.map((_, i) => i + 1);
3781
-
3782
- for (let i = 0, t = 0, j, value; i < n; ++i) {
3783
- value = field ? values[i][field] : values[i];
3784
-
3785
- for (j = 0; j < m; ++j) {
3786
- if (a[j] && isValid(value) && !typeTests[j](value)) {
3787
- a[j] = 0;
3788
- ++t;
3789
- if (t === typeTests.length) return 'string';
3790
- }
3791
- }
3792
- }
3793
-
3794
- return typeList[a.reduce((u, v) => u === 0 ? v : u, 0) - 1];
3795
- }
3796
-
3797
- function inferTypes(data, fields) {
3798
- return fields.reduce((types, field) => {
3799
- types[field] = inferType(data, field);
3800
- return types;
3801
- }, {});
3802
- }
3803
-
3804
- function delimitedFormat(delimiter) {
3805
- const parse = function (data, format) {
3806
- const delim = {
3807
- delimiter: delimiter
3808
- };
3809
- return dsv(data, format ? extend(format, delim) : delim);
3810
- };
3811
-
3812
- parse.responseType = 'text';
3813
- return parse;
3814
- }
3815
-
3816
- function dsv(data, format) {
3817
- if (format.header) {
3818
- data = format.header.map($).join(format.delimiter) + '\n' + data;
3819
- }
3820
-
3821
- return dsvFormat(format.delimiter).parse(data + '');
3822
- }
3823
-
3824
- dsv.responseType = 'text';
3825
-
3826
- function isBuffer(_) {
3827
- return typeof Buffer === 'function' && isFunction(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;
3828
- }
3829
-
3830
- function json(data, format) {
3831
- const prop = format && format.property ? field(format.property) : identity;
3832
- return isObject(data) && !isBuffer(data) ? parseJSON(prop(data), format) : prop(JSON.parse(data));
3833
- }
3834
-
3835
- json.responseType = 'json';
3836
-
3837
- function parseJSON(data, format) {
3838
- return format && format.copy ? JSON.parse(JSON.stringify(data)) : data;
3839
- }
3840
-
3841
- const filters = {
3842
- interior: (a, b) => a !== b,
3843
- exterior: (a, b) => a === b
3844
- };
3845
-
3846
- function topojson(data, format) {
3847
- let method, object, property, filter;
3848
- data = json(data, format);
3849
-
3850
- if (format && format.feature) {
3851
- method = feature;
3852
- property = format.feature;
3853
- } else if (format && format.mesh) {
3854
- method = mesh;
3855
- property = format.mesh;
3856
- filter = filters[format.filter];
3857
- } else {
3858
- error('Missing TopoJSON feature or mesh parameter.');
3859
- }
3860
-
3861
- object = (object = data.objects[property]) ? method(data, object, filter) : error('Invalid TopoJSON object: ' + property);
3862
- return object && object.features || [object];
3863
- }
3864
-
3865
- topojson.responseType = 'json';
3866
- const format$1 = {
3867
- dsv: dsv,
3868
- csv: delimitedFormat(','),
3869
- tsv: delimitedFormat('\t'),
3870
- json: json,
3871
- topojson: topojson
3872
- };
3873
-
3874
- function formats(name, reader) {
3875
- if (arguments.length > 1) {
3876
- format$1[name] = reader;
3877
- return this;
3878
- } else {
3879
- return has(format$1, name) ? format$1[name] : null;
3880
- }
3881
- }
3882
-
3883
- function responseType(type) {
3884
- const f = formats(type);
3885
- return f && f.responseType || 'text';
3886
- }
3887
-
3888
- function read(data, schema, timeParser, utcParser) {
3971
+ function read (data, schema, timeParser, utcParser) {
3889
3972
  schema = schema || {};
3890
3973
  const reader = formats(schema.type || 'json');
3891
3974
  if (!reader) error('Unknown data format type: ' + schema.type);
@@ -13294,7 +13377,6 @@
13294
13377
 
13295
13378
  return null;
13296
13379
  }
13297
-
13298
13380
  const domImage = () => typeof Image !== 'undefined' ? Image : null;
13299
13381
 
13300
13382
  function initRange(domain, range) {
@@ -14662,7 +14744,7 @@
14662
14744
  }
14663
14745
  }
14664
14746
 
14665
- return format(specifier);
14747
+ return format$1(specifier);
14666
14748
  }
14667
14749
 
14668
14750
  function linearish(scale) {
@@ -14880,7 +14962,7 @@
14880
14962
 
14881
14963
  scale.tickFormat = function (count, specifier) {
14882
14964
  if (specifier == null) specifier = base === 10 ? ".0e" : ",";
14883
- if (typeof specifier !== "function") specifier = format(specifier);
14965
+ if (typeof specifier !== "function") specifier = format$1(specifier);
14884
14966
  if (count === Infinity) return specifier;
14885
14967
  if (count == null) count = 10;
14886
14968
  var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
@@ -18697,7 +18779,7 @@
18697
18779
 
18698
18780
  function useCanvas(use) {
18699
18781
  textMetrics.width = use && context$1 ? measureWidth : estimateWidth;
18700
- } // make dumb, simple estimate if no canvas is available
18782
+ } // make simple estimate if no canvas is available
18701
18783
 
18702
18784
 
18703
18785
  function estimateWidth(item, text) {
@@ -20301,7 +20383,8 @@
20301
20383
  'stroke-miterlimit': 10
20302
20384
  };
20303
20385
  const RootIndex = 0,
20304
- ns = metadata.xmlns;
20386
+ xmlns = 'http://www.w3.org/2000/xmlns/',
20387
+ svgns = metadata.xmlns;
20305
20388
 
20306
20389
  function SVGRenderer(loader) {
20307
20390
  Renderer.call(this, loader);
@@ -20332,14 +20415,19 @@
20332
20415
  this._clearDefs();
20333
20416
 
20334
20417
  if (el) {
20335
- this._svg = domChild(el, 0, 'svg', ns);
20336
- setAttributes(this._svg, metadata);
20418
+ this._svg = domChild(el, 0, 'svg', svgns);
20419
+
20420
+ this._svg.setAttributeNS(xmlns, 'xmlns', svgns);
20421
+
20422
+ this._svg.setAttributeNS(xmlns, 'xmlns:xlink', metadata['xmlns:xlink']);
20423
+
20424
+ this._svg.setAttribute('version', metadata['version']);
20337
20425
 
20338
20426
  this._svg.setAttribute('class', 'marks');
20339
20427
 
20340
20428
  domClear(el, 1); // set the svg root group
20341
20429
 
20342
- this._root = domChild(this._svg, RootIndex, 'g', ns);
20430
+ this._root = domChild(this._svg, RootIndex, 'g', svgns);
20343
20431
  setAttributes(this._root, rootAttributes); // ensure no additional child elements
20344
20432
 
20345
20433
  domClear(this._svg, RootIndex + 1);
@@ -20408,7 +20496,7 @@
20408
20496
 
20409
20497
  if (bg) {
20410
20498
  svg.removeAttribute('style');
20411
- node = domChild(svg, RootIndex, 'rect', ns);
20499
+ node = domChild(svg, RootIndex, 'rect', svgns);
20412
20500
  setAttributes(node, {
20413
20501
  width: this._width,
20414
20502
  height: this._height,
@@ -20647,12 +20735,12 @@
20647
20735
  index = 0;
20648
20736
 
20649
20737
  for (const id in defs.gradient) {
20650
- if (!el) defs.el = el = domChild(svg, RootIndex + 1, 'defs', ns);
20738
+ if (!el) defs.el = el = domChild(svg, RootIndex + 1, 'defs', svgns);
20651
20739
  index = updateGradient(el, defs.gradient[id], index);
20652
20740
  }
20653
20741
 
20654
20742
  for (const id in defs.clipping) {
20655
- if (!el) defs.el = el = domChild(svg, RootIndex + 1, 'defs', ns);
20743
+ if (!el) defs.el = el = domChild(svg, RootIndex + 1, 'defs', svgns);
20656
20744
  index = updateClipping(el, defs.clipping[id], index);
20657
20745
  } // clean-up
20658
20746
 
@@ -20692,7 +20780,7 @@
20692
20780
  // coordinates, in a way that is cumbersome to replicate in canvas.
20693
20781
  // We wrap the radial gradient in a pattern element, allowing us to
20694
20782
  // maintain a circular gradient that matches what canvas provides.
20695
- let pt = domChild(el, index++, 'pattern', ns);
20783
+ let pt = domChild(el, index++, 'pattern', svgns);
20696
20784
  setAttributes(pt, {
20697
20785
  id: patternPrefix + grad.id,
20698
20786
  viewBox: '0,0,1,1',
@@ -20700,13 +20788,13 @@
20700
20788
  height: '100%',
20701
20789
  preserveAspectRatio: 'xMidYMid slice'
20702
20790
  });
20703
- pt = domChild(pt, 0, 'rect', ns);
20791
+ pt = domChild(pt, 0, 'rect', svgns);
20704
20792
  setAttributes(pt, {
20705
20793
  width: 1,
20706
20794
  height: 1,
20707
20795
  fill: "url(".concat(href(), "#").concat(grad.id, ")")
20708
20796
  });
20709
- el = domChild(el, index++, 'radialGradient', ns);
20797
+ el = domChild(el, index++, 'radialGradient', svgns);
20710
20798
  setAttributes(el, {
20711
20799
  id: grad.id,
20712
20800
  fx: grad.x1,
@@ -20717,7 +20805,7 @@
20717
20805
  r: grad.r2
20718
20806
  });
20719
20807
  } else {
20720
- el = domChild(el, index++, 'linearGradient', ns);
20808
+ el = domChild(el, index++, 'linearGradient', svgns);
20721
20809
  setAttributes(el, {
20722
20810
  id: grad.id,
20723
20811
  x1: grad.x1,
@@ -20728,7 +20816,7 @@
20728
20816
  }
20729
20817
 
20730
20818
  for (i = 0, n = grad.stops.length; i < n; ++i) {
20731
- stop = domChild(el, i, 'stop', ns);
20819
+ stop = domChild(el, i, 'stop', svgns);
20732
20820
  stop.setAttribute('offset', grad.stops[i].offset);
20733
20821
  stop.setAttribute('stop-color', grad.stops[i].color);
20734
20822
  }
@@ -20740,14 +20828,14 @@
20740
20828
 
20741
20829
  function updateClipping(el, clip, index) {
20742
20830
  let mask;
20743
- el = domChild(el, index, 'clipPath', ns);
20831
+ el = domChild(el, index, 'clipPath', svgns);
20744
20832
  el.setAttribute('id', clip.id);
20745
20833
 
20746
20834
  if (clip.path) {
20747
- mask = domChild(el, 0, 'path', ns);
20835
+ mask = domChild(el, 0, 'path', svgns);
20748
20836
  mask.setAttribute('d', clip.path);
20749
20837
  } else {
20750
- mask = domChild(el, 0, 'rect', ns);
20838
+ mask = domChild(el, 0, 'rect', svgns);
20751
20839
  setAttributes(mask, {
20752
20840
  x: 0,
20753
20841
  y: 0,
@@ -20781,7 +20869,7 @@
20781
20869
 
20782
20870
  if (!node) {
20783
20871
  doc = el.ownerDocument;
20784
- node = domCreate(doc, tag, ns);
20872
+ node = domCreate(doc, tag, svgns);
20785
20873
  item._svg = node;
20786
20874
 
20787
20875
  if (item.mark) {
@@ -20791,13 +20879,13 @@
20791
20879
  }; // if group, create background, content, and foreground elements
20792
20880
 
20793
20881
  if (tag === 'g') {
20794
- const bg = domCreate(doc, 'path', ns);
20882
+ const bg = domCreate(doc, 'path', svgns);
20795
20883
  node.appendChild(bg);
20796
20884
  bg.__data__ = item;
20797
- const cg = domCreate(doc, 'g', ns);
20885
+ const cg = domCreate(doc, 'g', svgns);
20798
20886
  node.appendChild(cg);
20799
20887
  cg.__data__ = item;
20800
- const fg = domCreate(doc, 'path', ns);
20888
+ const fg = domCreate(doc, 'path', svgns);
20801
20889
  node.appendChild(fg);
20802
20890
  fg.__data__ = item;
20803
20891
  fg.__values__ = {
@@ -20887,7 +20975,7 @@
20887
20975
  doc = el.ownerDocument;
20888
20976
  lh = lineHeight(item);
20889
20977
  value.forEach((t, i) => {
20890
- const ts = domCreate(doc, 'tspan', ns);
20978
+ const ts = domCreate(doc, 'tspan', svgns);
20891
20979
  ts.__data__ = item; // data binding
20892
20980
 
20893
20981
  ts.textContent = t;
@@ -27175,7 +27263,7 @@
27175
27263
  stop = ex[1],
27176
27264
  span = stop - start,
27177
27265
  step = nice ? tickStep(start, stop, k) : span / (k + 1);
27178
- return range$1(step, stop, step);
27266
+ return range$1(start + step, stop, step);
27179
27267
  };
27180
27268
  }
27181
27269
  /**
@@ -35888,8 +35976,6 @@
35888
35976
  resolvefilter: ResolveFilter
35889
35977
  });
35890
35978
 
35891
- var version = "5.16.1";
35892
-
35893
35979
  const RawCode = 'RawCode';
35894
35980
  const Literal = 'Literal';
35895
35981
  const Property = 'Property';
@@ -36087,7 +36173,7 @@
36087
36173
  } // 7.6.1.1 Keywords
36088
36174
 
36089
36175
 
36090
- const keywords = {
36176
+ const keywords$1 = {
36091
36177
  'if': 1,
36092
36178
  'in': 1,
36093
36179
  'do': 1,
@@ -36279,7 +36365,7 @@
36279
36365
 
36280
36366
  if (id.length === 1) {
36281
36367
  type = TokenIdentifier;
36282
- } else if (keywords.hasOwnProperty(id)) {
36368
+ } else if (keywords$1.hasOwnProperty(id)) {
36283
36369
  // eslint-disable-line no-prototype-builtins
36284
36370
  type = TokenKeyword;
36285
36371
  } else if (id === 'null') {
@@ -36433,6 +36519,10 @@
36433
36519
  start: start,
36434
36520
  end: index$1
36435
36521
  };
36522
+ }
36523
+
36524
+ if (ch2 === '//') {
36525
+ throwError({}, MessageUnexpectedToken, ILLEGAL);
36436
36526
  } // 1-character punctuators: < > = ! + - * % & | ^ /
36437
36527
 
36438
36528
 
@@ -37535,13 +37625,6 @@
37535
37625
  utcmilliseconds: fn('getUTCMilliseconds', DATE, 0),
37536
37626
  // sequence functions
37537
37627
  length: fn('length', null, -1),
37538
- join: fn('join', null),
37539
- indexof: fn('indexOf', null),
37540
- lastindexof: fn('lastIndexOf', null),
37541
- slice: fn('slice', null),
37542
- reverse: function (args) {
37543
- return '(' + codegen(args[0]) + ').slice().reverse()';
37544
- },
37545
37628
  // STRING functions
37546
37629
  parseFloat: 'parseFloat',
37547
37630
  parseInt: 'parseInt',
@@ -37549,7 +37632,6 @@
37549
37632
  lower: fn('toLowerCase', STRING, 0),
37550
37633
  substring: fn('substring', STRING),
37551
37634
  split: fn('split', STRING),
37552
- replace: fn('replace', STRING),
37553
37635
  trim: fn('trim', STRING, 0),
37554
37636
  // REGEXP functions
37555
37637
  regexp: REGEXP,
@@ -37633,7 +37715,7 @@
37633
37715
  return isFunction(fn) ? fn(args) : fn + '(' + args.map(visit).join(',') + ')';
37634
37716
  },
37635
37717
  ArrayExpression: n => '[' + n.elements.map(visit).join(',') + ']',
37636
- BinaryExpression: n => '(' + visit(n.left) + n.operator + visit(n.right) + ')',
37718
+ BinaryExpression: n => '(' + visit(n.left) + ' ' + n.operator + ' ' + visit(n.right) + ')',
37637
37719
  UnaryExpression: n => '(' + n.operator + visit(n.argument) + ')',
37638
37720
  ConditionalExpression: n => '(' + visit(n.test) + '?' + visit(n.consequent) + ':' + visit(n.alternate) + ')',
37639
37721
  LogicalExpression: n => '(' + visit(n.left) + n.operator + visit(n.right) + ')',
@@ -37662,17 +37744,75 @@
37662
37744
  return codegen;
37663
37745
  }
37664
37746
 
37747
+ function ascending$3(a, b) {
37748
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
37749
+ }
37750
+
37751
+ function bisector$1(f) {
37752
+ let delta = f;
37753
+ let compare = f;
37754
+
37755
+ if (f.length === 1) {
37756
+ delta = (d, x) => f(d) - x;
37757
+
37758
+ compare = ascendingComparator$1(f);
37759
+ }
37760
+
37761
+ function left(a, x, lo, hi) {
37762
+ if (lo == null) lo = 0;
37763
+ if (hi == null) hi = a.length;
37764
+
37765
+ while (lo < hi) {
37766
+ const mid = lo + hi >>> 1;
37767
+ if (compare(a[mid], x) < 0) lo = mid + 1;else hi = mid;
37768
+ }
37769
+
37770
+ return lo;
37771
+ }
37772
+
37773
+ function right(a, x, lo, hi) {
37774
+ if (lo == null) lo = 0;
37775
+ if (hi == null) hi = a.length;
37776
+
37777
+ while (lo < hi) {
37778
+ const mid = lo + hi >>> 1;
37779
+ if (compare(a[mid], x) > 0) hi = mid;else lo = mid + 1;
37780
+ }
37781
+
37782
+ return lo;
37783
+ }
37784
+
37785
+ function center(a, x, lo, hi) {
37786
+ if (lo == null) lo = 0;
37787
+ if (hi == null) hi = a.length;
37788
+ const i = left(a, x, lo, hi - 1);
37789
+ return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;
37790
+ }
37791
+
37792
+ return {
37793
+ left,
37794
+ center,
37795
+ right
37796
+ };
37797
+ }
37798
+
37799
+ function ascendingComparator$1(f) {
37800
+ return (d, x) => ascending$3(f(d), x);
37801
+ }
37802
+
37665
37803
  const Intersect = 'intersect';
37666
37804
  const Union = 'union';
37667
37805
  const VlMulti = 'vlMulti';
37806
+ const VlPoint = 'vlPoint';
37668
37807
  const Or = 'or';
37669
37808
  const And = 'and';
37670
- var TYPE_ENUM = 'E',
37671
- TYPE_RANGE_INC = 'R',
37672
- TYPE_RANGE_EXC = 'R-E',
37673
- TYPE_RANGE_LE = 'R-LE',
37674
- TYPE_RANGE_RE = 'R-RE',
37675
- UNIT_INDEX = 'index:unit'; // TODO: revisit date coercion?
37809
+ const SELECTION_ID = '_vgsid_',
37810
+ TYPE_ENUM = 'E',
37811
+ TYPE_RANGE_INC = 'R',
37812
+ TYPE_RANGE_EXC = 'R-E',
37813
+ TYPE_RANGE_LE = 'R-LE',
37814
+ TYPE_RANGE_RE = 'R-RE',
37815
+ UNIT_INDEX = 'index:unit'; // TODO: revisit date coercion?
37676
37816
 
37677
37817
  function testPoint(datum, entry) {
37678
37818
  var fields = entry.fields,
@@ -37770,16 +37910,59 @@
37770
37910
 
37771
37911
  return n && intersect;
37772
37912
  }
37913
+
37914
+ const selectionId = field(SELECTION_ID),
37915
+ bisect = bisector$1(selectionId),
37916
+ bisectLeft$1 = bisect.left,
37917
+ bisectRight$1 = bisect.right;
37918
+
37919
+ function selectionIdTest(name, datum, op) {
37920
+ const data = this.context.data[name],
37921
+ entries = data ? data.values.value : [],
37922
+ unitIdx = data ? data[UNIT_INDEX] && data[UNIT_INDEX].value : undefined,
37923
+ intersect = op === Intersect,
37924
+ value = selectionId(datum),
37925
+ index = bisectLeft$1(entries, value);
37926
+ if (index === entries.length) return false;
37927
+ if (selectionId(entries[index]) !== value) return false;
37928
+
37929
+ if (unitIdx && intersect) {
37930
+ if (unitIdx.size === 1) return true;
37931
+ if (bisectRight$1(entries, value) - index < unitIdx.size) return false;
37932
+ }
37933
+
37934
+ return true;
37935
+ }
37936
+ /**
37937
+ * Maps an array of scene graph items to an array of selection tuples.
37938
+ * @param {string} name - The name of the dataset representing the selection.
37939
+ * @param {string} unit - The name of the unit view.
37940
+ *
37941
+ * @returns {array} An array of selection entries for the given unit.
37942
+ */
37943
+
37944
+
37945
+ function selectionTuples(array, base) {
37946
+ return array.map(x => extend({
37947
+ values: base.fields.map(f => (f.getter || (f.getter = field(f.field)))(x.datum))
37948
+ }, base));
37949
+ }
37773
37950
  /**
37774
37951
  * Resolves selection for use as a scale domain or reads via the API.
37775
37952
  * @param {string} name - The name of the dataset representing the selection
37776
37953
  * @param {string} [op='union'] - The set operation for combining selections.
37777
37954
  * One of 'intersect' or 'union' (default).
37955
+ * @param {boolean} isMulti - Identifies a "multi" selection to perform more
37956
+ * expensive resolution computation.
37957
+ * @param {boolean} vl5 - With Vega-Lite v5, "multi" selections are now called "point"
37958
+ * selections, and thus the resolved tuple should reflect this name.
37959
+ * This parameter allows us to reflect this change without triggering
37960
+ * a major version bump for Vega.
37778
37961
  * @returns {object} An object of selected fields and values.
37779
37962
  */
37780
37963
 
37781
37964
 
37782
- function selectionResolve(name, op, isMulti) {
37965
+ function selectionResolve(name, op, isMulti, vl5) {
37783
37966
  var data = this.context.data[name],
37784
37967
  entries = data ? data.values.value : [],
37785
37968
  resolved = {},
@@ -37834,7 +38017,8 @@
37834
38017
  entries = Object.keys(multiRes);
37835
38018
 
37836
38019
  if (isMulti && entries.length) {
37837
- resolved[VlMulti] = op === Union ? {
38020
+ const key = vl5 ? VlPoint : VlMulti;
38021
+ resolved[key] = op === Union ? {
37838
38022
  [Or]: entries.reduce((acc, k) => (acc.push(...multiRes[k]), acc), [])
37839
38023
  } : {
37840
38024
  [And]: entries.map(k => ({
@@ -38234,6 +38418,46 @@
38234
38418
  return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);
38235
38419
  }
38236
38420
 
38421
+ const accessors = {};
38422
+
38423
+ function pluck(data, name) {
38424
+ const accessor = accessors[name] || (accessors[name] = field(name));
38425
+ return isArray(data) ? data.map(accessor) : accessor(data);
38426
+ }
38427
+
38428
+ function array$5(seq) {
38429
+ return isArray(seq) || ArrayBuffer.isView(seq) ? seq : null;
38430
+ }
38431
+
38432
+ function sequence$1(seq) {
38433
+ return array$5(seq) || (isString(seq) ? seq : null);
38434
+ }
38435
+
38436
+ function join$1(seq, ...args) {
38437
+ return array$5(seq).join(...args);
38438
+ }
38439
+
38440
+ function indexof(seq, ...args) {
38441
+ return sequence$1(seq).indexOf(...args);
38442
+ }
38443
+
38444
+ function lastindexof(seq, ...args) {
38445
+ return sequence$1(seq).lastIndexOf(...args);
38446
+ }
38447
+
38448
+ function slice$1(seq, ...args) {
38449
+ return sequence$1(seq).slice(...args);
38450
+ }
38451
+
38452
+ function replace$1(str, pattern, repl) {
38453
+ if (isFunction(repl)) error('Function argument passed to replace.');
38454
+ return String(str).replace(pattern, repl);
38455
+ }
38456
+
38457
+ function reverse$1(seq) {
38458
+ return array$5(seq).slice().reverse();
38459
+ }
38460
+
38237
38461
  function bandspace(count, paddingInner, paddingOuter) {
38238
38462
  return bandSpace(count || 0, paddingInner || 0, paddingOuter || 0);
38239
38463
  }
@@ -38407,11 +38631,18 @@
38407
38631
  toDate,
38408
38632
  toNumber,
38409
38633
  toString,
38634
+ indexof,
38635
+ join: join$1,
38636
+ lastindexof,
38637
+ replace: replace$1,
38638
+ reverse: reverse$1,
38639
+ slice: slice$1,
38410
38640
  flush,
38411
38641
  lerp,
38412
38642
  merge: merge$3,
38413
38643
  pad,
38414
38644
  peek,
38645
+ pluck,
38415
38646
  span,
38416
38647
  inrange,
38417
38648
  truncate,
@@ -38535,7 +38766,9 @@
38535
38766
  expressionFunction('treeAncestors', treeAncestors, dataVisitor); // register Vega-Lite selection functions
38536
38767
 
38537
38768
  expressionFunction('vlSelectionTest', selectionTest, selectionVisitor);
38769
+ expressionFunction('vlSelectionIdTest', selectionIdTest, selectionVisitor);
38538
38770
  expressionFunction('vlSelectionResolve', selectionResolve, selectionVisitor);
38771
+ expressionFunction('vlSelectionTuples', selectionTuples);
38539
38772
 
38540
38773
  function parser$1(expr, scope) {
38541
38774
  const params = {}; // parse the expression to an abstract syntax tree (ast)
@@ -39473,12 +39706,8 @@
39473
39706
  item: constant(item || {}),
39474
39707
  group: group,
39475
39708
  xy: xy,
39476
- x: function (item) {
39477
- return xy(item)[0];
39478
- },
39479
- y: function (item) {
39480
- return xy(item)[1];
39481
- }
39709
+ x: item => xy(item)[0],
39710
+ y: item => xy(item)[1]
39482
39711
  };
39483
39712
  }
39484
39713
 
@@ -43389,8 +43618,8 @@
43389
43618
 
43390
43619
  if (data.values) {
43391
43620
  // hard-wired input data set
43392
- if (hasSignal(data.values) || hasSignal(data.format)) {
43393
- // if either values or format has signal, use dynamic loader
43621
+ if (isSignal(data.values) || hasSignal(data.format)) {
43622
+ // if either values is signal or format has signal, use dynamic loader
43394
43623
  output.push(load$1(scope, data));
43395
43624
  output.push(source = collect());
43396
43625
  } else {
@@ -44919,6 +45148,8 @@
44919
45148
  // -- Transforms -----
44920
45149
  extend(transforms, tx, vtx, encode, geo, force, label, tree$1, reg, voronoi, wordcloud, xf); // -- Exports -----
44921
45150
 
45151
+ const version$1 = pkg.version;
45152
+
44922
45153
  exports.Bounds = Bounds;
44923
45154
  exports.CanvasHandler = CanvasHandler;
44924
45155
  exports.CanvasRenderer = CanvasRenderer;
@@ -45003,7 +45234,7 @@
45003
45234
  exports.font = font;
45004
45235
  exports.fontFamily = fontFamily;
45005
45236
  exports.fontSize = fontSize;
45006
- exports.format = format$1;
45237
+ exports.format = format;
45007
45238
  exports.formatLocale = numberFormatDefaultLocale;
45008
45239
  exports.formats = formats;
45009
45240
  exports.hasOwnProperty = has;
@@ -45026,6 +45257,7 @@
45026
45257
  exports.isBoolean = isBoolean;
45027
45258
  exports.isDate = isDate;
45028
45259
  exports.isFunction = isFunction;
45260
+ exports.isIterable = isIterable;
45029
45261
  exports.isNumber = isNumber;
45030
45262
  exports.isObject = isObject;
45031
45263
  exports.isRegExp = isRegExp;
@@ -45132,7 +45364,7 @@
45132
45364
  exports.utcdayofyear = utcdayofyear;
45133
45365
  exports.utcquarter = utcquarter;
45134
45366
  exports.utcweek = utcweek;
45135
- exports.version = version;
45367
+ exports.version = version$1;
45136
45368
  exports.visitArray = visitArray;
45137
45369
  exports.week = week;
45138
45370
  exports.writeConfig = writeConfig;