vega 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -506,7 +506,6 @@
506
506
  results[i] = applyOperation(document, patch[i], validateOperation, true, banPrototypeModifications, i);
507
507
  document = results[i].newDocument; // in case root was replaced
508
508
  }
509
-
510
509
  results.newDocument = document;
511
510
  return results;
512
511
  }
@@ -877,6 +876,10 @@
877
876
  unescapePathComponent
878
877
  });
879
878
 
879
+ function getDefaultExportFromCjs (x) {
880
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
881
+ }
882
+
880
883
  // Note: This regex matches even invalid JSON strings, but since we’re
881
884
  // working on the output of `JSON.stringify` we know that only valid strings
882
885
  // are present (unless the user supplied a weird `options.indent` but in
@@ -943,676 +946,59 @@
943
946
  return string;
944
947
  }(passedObj, "", 0);
945
948
  };
949
+ var stringify$1 = /*@__PURE__*/getDefaultExportFromCjs(jsonStringifyPrettyCompact);
946
950
 
947
- var iterator;
948
- var hasRequiredIterator;
949
- function requireIterator() {
950
- if (hasRequiredIterator) return iterator;
951
- hasRequiredIterator = 1;
952
- iterator = function (Yallist) {
953
- Yallist.prototype[Symbol.iterator] = function* () {
954
- for (let walker = this.head; walker; walker = walker.next) {
955
- yield walker.value;
956
- }
957
- };
958
- };
959
- return iterator;
960
- }
961
-
962
- var yallist = Yallist$1;
963
- Yallist$1.Node = Node;
964
- Yallist$1.create = Yallist$1;
965
- function Yallist$1(list) {
966
- var self = this;
967
- if (!(self instanceof Yallist$1)) {
968
- self = new Yallist$1();
969
- }
970
- self.tail = null;
971
- self.head = null;
972
- self.length = 0;
973
- if (list && typeof list.forEach === 'function') {
974
- list.forEach(function (item) {
975
- self.push(item);
976
- });
977
- } else if (arguments.length > 0) {
978
- for (var i = 0, l = arguments.length; i < l; i++) {
979
- self.push(arguments[i]);
980
- }
981
- }
982
- return self;
983
- }
984
- Yallist$1.prototype.removeNode = function (node) {
985
- if (node.list !== this) {
986
- throw new Error('removing node which does not belong to this list');
987
- }
988
- var next = node.next;
989
- var prev = node.prev;
990
- if (next) {
991
- next.prev = prev;
992
- }
993
- if (prev) {
994
- prev.next = next;
995
- }
996
- if (node === this.head) {
997
- this.head = next;
998
- }
999
- if (node === this.tail) {
1000
- this.tail = prev;
1001
- }
1002
- node.list.length--;
1003
- node.next = null;
1004
- node.prev = null;
1005
- node.list = null;
1006
- return next;
1007
- };
1008
- Yallist$1.prototype.unshiftNode = function (node) {
1009
- if (node === this.head) {
1010
- return;
1011
- }
1012
- if (node.list) {
1013
- node.list.removeNode(node);
1014
- }
1015
- var head = this.head;
1016
- node.list = this;
1017
- node.next = head;
1018
- if (head) {
1019
- head.prev = node;
1020
- }
1021
- this.head = node;
1022
- if (!this.tail) {
1023
- this.tail = node;
1024
- }
1025
- this.length++;
1026
- };
1027
- Yallist$1.prototype.pushNode = function (node) {
1028
- if (node === this.tail) {
1029
- return;
1030
- }
1031
- if (node.list) {
1032
- node.list.removeNode(node);
1033
- }
1034
- var tail = this.tail;
1035
- node.list = this;
1036
- node.prev = tail;
1037
- if (tail) {
1038
- tail.next = node;
1039
- }
1040
- this.tail = node;
1041
- if (!this.head) {
1042
- this.head = node;
1043
- }
1044
- this.length++;
1045
- };
1046
- Yallist$1.prototype.push = function () {
1047
- for (var i = 0, l = arguments.length; i < l; i++) {
1048
- push(this, arguments[i]);
1049
- }
1050
- return this.length;
1051
- };
1052
- Yallist$1.prototype.unshift = function () {
1053
- for (var i = 0, l = arguments.length; i < l; i++) {
1054
- unshift(this, arguments[i]);
1055
- }
1056
- return this.length;
1057
- };
1058
- Yallist$1.prototype.pop = function () {
1059
- if (!this.tail) {
1060
- return undefined;
1061
- }
1062
- var res = this.tail.value;
1063
- this.tail = this.tail.prev;
1064
- if (this.tail) {
1065
- this.tail.next = null;
1066
- } else {
1067
- this.head = null;
1068
- }
1069
- this.length--;
1070
- return res;
1071
- };
1072
- Yallist$1.prototype.shift = function () {
1073
- if (!this.head) {
1074
- return undefined;
1075
- }
1076
- var res = this.head.value;
1077
- this.head = this.head.next;
1078
- if (this.head) {
1079
- this.head.prev = null;
1080
- } else {
1081
- this.tail = null;
1082
- }
1083
- this.length--;
1084
- return res;
1085
- };
1086
- Yallist$1.prototype.forEach = function (fn, thisp) {
1087
- thisp = thisp || this;
1088
- for (var walker = this.head, i = 0; walker !== null; i++) {
1089
- fn.call(thisp, walker.value, i, this);
1090
- walker = walker.next;
1091
- }
1092
- };
1093
- Yallist$1.prototype.forEachReverse = function (fn, thisp) {
1094
- thisp = thisp || this;
1095
- for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
1096
- fn.call(thisp, walker.value, i, this);
1097
- walker = walker.prev;
1098
- }
1099
- };
1100
- Yallist$1.prototype.get = function (n) {
1101
- for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
1102
- // abort out of the list early if we hit a cycle
1103
- walker = walker.next;
1104
- }
1105
- if (i === n && walker !== null) {
1106
- return walker.value;
1107
- }
1108
- };
1109
- Yallist$1.prototype.getReverse = function (n) {
1110
- for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
1111
- // abort out of the list early if we hit a cycle
1112
- walker = walker.prev;
1113
- }
1114
- if (i === n && walker !== null) {
1115
- return walker.value;
1116
- }
1117
- };
1118
- Yallist$1.prototype.map = function (fn, thisp) {
1119
- thisp = thisp || this;
1120
- var res = new Yallist$1();
1121
- for (var walker = this.head; walker !== null;) {
1122
- res.push(fn.call(thisp, walker.value, this));
1123
- walker = walker.next;
1124
- }
1125
- return res;
1126
- };
1127
- Yallist$1.prototype.mapReverse = function (fn, thisp) {
1128
- thisp = thisp || this;
1129
- var res = new Yallist$1();
1130
- for (var walker = this.tail; walker !== null;) {
1131
- res.push(fn.call(thisp, walker.value, this));
1132
- walker = walker.prev;
1133
- }
1134
- return res;
1135
- };
1136
- Yallist$1.prototype.reduce = function (fn, initial) {
1137
- var acc;
1138
- var walker = this.head;
1139
- if (arguments.length > 1) {
1140
- acc = initial;
1141
- } else if (this.head) {
1142
- walker = this.head.next;
1143
- acc = this.head.value;
1144
- } else {
1145
- throw new TypeError('Reduce of empty list with no initial value');
1146
- }
1147
- for (var i = 0; walker !== null; i++) {
1148
- acc = fn(acc, walker.value, i);
1149
- walker = walker.next;
1150
- }
1151
- return acc;
1152
- };
1153
- Yallist$1.prototype.reduceReverse = function (fn, initial) {
1154
- var acc;
1155
- var walker = this.tail;
1156
- if (arguments.length > 1) {
1157
- acc = initial;
1158
- } else if (this.tail) {
1159
- walker = this.tail.prev;
1160
- acc = this.tail.value;
1161
- } else {
1162
- throw new TypeError('Reduce of empty list with no initial value');
1163
- }
1164
- for (var i = this.length - 1; walker !== null; i--) {
1165
- acc = fn(acc, walker.value, i);
1166
- walker = walker.prev;
1167
- }
1168
- return acc;
1169
- };
1170
- Yallist$1.prototype.toArray = function () {
1171
- var arr = new Array(this.length);
1172
- for (var i = 0, walker = this.head; walker !== null; i++) {
1173
- arr[i] = walker.value;
1174
- walker = walker.next;
1175
- }
1176
- return arr;
1177
- };
1178
- Yallist$1.prototype.toArrayReverse = function () {
1179
- var arr = new Array(this.length);
1180
- for (var i = 0, walker = this.tail; walker !== null; i++) {
1181
- arr[i] = walker.value;
1182
- walker = walker.prev;
1183
- }
1184
- return arr;
1185
- };
1186
- Yallist$1.prototype.slice = function (from, to) {
1187
- to = to || this.length;
1188
- if (to < 0) {
1189
- to += this.length;
1190
- }
1191
- from = from || 0;
1192
- if (from < 0) {
1193
- from += this.length;
1194
- }
1195
- var ret = new Yallist$1();
1196
- if (to < from || to < 0) {
1197
- return ret;
1198
- }
1199
- if (from < 0) {
1200
- from = 0;
1201
- }
1202
- if (to > this.length) {
1203
- to = this.length;
1204
- }
1205
- for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
1206
- walker = walker.next;
1207
- }
1208
- for (; walker !== null && i < to; i++, walker = walker.next) {
1209
- ret.push(walker.value);
1210
- }
1211
- return ret;
1212
- };
1213
- Yallist$1.prototype.sliceReverse = function (from, to) {
1214
- to = to || this.length;
1215
- if (to < 0) {
1216
- to += this.length;
1217
- }
1218
- from = from || 0;
1219
- if (from < 0) {
1220
- from += this.length;
1221
- }
1222
- var ret = new Yallist$1();
1223
- if (to < from || to < 0) {
1224
- return ret;
1225
- }
1226
- if (from < 0) {
1227
- from = 0;
1228
- }
1229
- if (to > this.length) {
1230
- to = this.length;
1231
- }
1232
- for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
1233
- walker = walker.prev;
1234
- }
1235
- for (; walker !== null && i > from; i--, walker = walker.prev) {
1236
- ret.push(walker.value);
1237
- }
1238
- return ret;
1239
- };
1240
- Yallist$1.prototype.splice = function (start, deleteCount) {
1241
- if (start > this.length) {
1242
- start = this.length - 1;
1243
- }
1244
- if (start < 0) {
1245
- start = this.length + start;
1246
- }
1247
- for (var i = 0, walker = this.head; walker !== null && i < start; i++) {
1248
- walker = walker.next;
1249
- }
1250
- var ret = [];
1251
- for (var i = 0; walker && i < deleteCount; i++) {
1252
- ret.push(walker.value);
1253
- walker = this.removeNode(walker);
1254
- }
1255
- if (walker === null) {
1256
- walker = this.tail;
1257
- }
1258
- if (walker !== this.head && walker !== this.tail) {
1259
- walker = walker.prev;
1260
- }
1261
- for (var i = 0; i < (arguments.length <= 2 ? 0 : arguments.length - 2); i++) {
1262
- walker = insert(this, walker, i + 2 < 2 || arguments.length <= i + 2 ? undefined : arguments[i + 2]);
1263
- }
1264
- return ret;
1265
- };
1266
- Yallist$1.prototype.reverse = function () {
1267
- var head = this.head;
1268
- var tail = this.tail;
1269
- for (var walker = head; walker !== null; walker = walker.prev) {
1270
- var p = walker.prev;
1271
- walker.prev = walker.next;
1272
- walker.next = p;
1273
- }
1274
- this.head = tail;
1275
- this.tail = head;
1276
- return this;
1277
- };
1278
- function insert(self, node, value) {
1279
- var inserted = node === self.head ? new Node(value, null, node, self) : new Node(value, node, node.next, self);
1280
- if (inserted.next === null) {
1281
- self.tail = inserted;
1282
- }
1283
- if (inserted.prev === null) {
1284
- self.head = inserted;
1285
- }
1286
- self.length++;
1287
- return inserted;
1288
- }
1289
- function push(self, item) {
1290
- self.tail = new Node(item, self.tail, null, self);
1291
- if (!self.head) {
1292
- self.head = self.tail;
1293
- }
1294
- self.length++;
1295
- }
1296
- function unshift(self, item) {
1297
- self.head = new Node(item, null, self.head, self);
1298
- if (!self.tail) {
1299
- self.tail = self.head;
1300
- }
1301
- self.length++;
1302
- }
1303
- function Node(value, prev, next, list) {
1304
- if (!(this instanceof Node)) {
1305
- return new Node(value, prev, next, list);
1306
- }
1307
- this.list = list;
1308
- this.value = value;
1309
- if (prev) {
1310
- prev.next = this;
1311
- this.prev = prev;
1312
- } else {
1313
- this.prev = null;
1314
- }
1315
- if (next) {
1316
- next.prev = this;
1317
- this.next = next;
1318
- } else {
1319
- this.next = null;
1320
- }
1321
- }
1322
- try {
1323
- // add if support for Symbol.iterator is present
1324
- requireIterator()(Yallist$1);
1325
- } catch (er) {}
1326
-
1327
- // A linked list to keep track of recently-used-ness
1328
- const Yallist = yallist;
1329
- const MAX = Symbol('max');
1330
- const LENGTH = Symbol('length');
1331
- const LENGTH_CALCULATOR = Symbol('lengthCalculator');
1332
- const ALLOW_STALE = Symbol('allowStale');
1333
- const MAX_AGE = Symbol('maxAge');
1334
- const DISPOSE = Symbol('dispose');
1335
- const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet');
1336
- const LRU_LIST = Symbol('lruList');
1337
- const CACHE = Symbol('cache');
1338
- const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet');
1339
- const naiveLength = () => 1;
1340
-
1341
- // lruList is a yallist where the head is the youngest
1342
- // item, and the tail is the oldest. the list contains the Hit
1343
- // objects as the entries.
1344
- // Each Hit object has a reference to its Yallist.Node. This
1345
- // never changes.
1346
- //
1347
- // cache is a Map (or PseudoMap) that matches the keys to
1348
- // the Yallist.Node object.
1349
951
  class LRUCache {
1350
- constructor(options) {
1351
- if (typeof options === 'number') options = {
1352
- max: options
1353
- };
1354
- if (!options) options = {};
1355
- if (options.max && (typeof options.max !== 'number' || options.max < 0)) throw new TypeError('max must be a non-negative number');
1356
- // Kind of weird to have a default max of Infinity, but oh well.
1357
- this[MAX] = options.max || Infinity;
1358
- const lc = options.length || naiveLength;
1359
- this[LENGTH_CALCULATOR] = typeof lc !== 'function' ? naiveLength : lc;
1360
- this[ALLOW_STALE] = options.stale || false;
1361
- if (options.maxAge && typeof options.maxAge !== 'number') throw new TypeError('maxAge must be a number');
1362
- this[MAX_AGE] = options.maxAge || 0;
1363
- this[DISPOSE] = options.dispose;
1364
- this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false;
1365
- this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false;
1366
- this.reset();
1367
- }
1368
-
1369
- // resize the cache when the max changes.
1370
- set max(mL) {
1371
- if (typeof mL !== 'number' || mL < 0) throw new TypeError('max must be a non-negative number');
1372
- this[MAX] = mL || Infinity;
1373
- trim(this);
1374
- }
1375
- get max() {
1376
- return this[MAX];
1377
- }
1378
- set allowStale(allowStale) {
1379
- this[ALLOW_STALE] = !!allowStale;
1380
- }
1381
- get allowStale() {
1382
- return this[ALLOW_STALE];
1383
- }
1384
- set maxAge(mA) {
1385
- if (typeof mA !== 'number') throw new TypeError('maxAge must be a non-negative number');
1386
- this[MAX_AGE] = mA;
1387
- trim(this);
1388
- }
1389
- get maxAge() {
1390
- return this[MAX_AGE];
1391
- }
1392
-
1393
- // resize the cache when the lengthCalculator changes.
1394
- set lengthCalculator(lC) {
1395
- if (typeof lC !== 'function') lC = naiveLength;
1396
- if (lC !== this[LENGTH_CALCULATOR]) {
1397
- this[LENGTH_CALCULATOR] = lC;
1398
- this[LENGTH] = 0;
1399
- this[LRU_LIST].forEach(hit => {
1400
- hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key);
1401
- this[LENGTH] += hit.length;
1402
- });
1403
- }
1404
- trim(this);
1405
- }
1406
- get lengthCalculator() {
1407
- return this[LENGTH_CALCULATOR];
1408
- }
1409
- get length() {
1410
- return this[LENGTH];
1411
- }
1412
- get itemCount() {
1413
- return this[LRU_LIST].length;
1414
- }
1415
- rforEach(fn, thisp) {
1416
- thisp = thisp || this;
1417
- for (let walker = this[LRU_LIST].tail; walker !== null;) {
1418
- const prev = walker.prev;
1419
- forEachStep(this, fn, walker, thisp);
1420
- walker = prev;
1421
- }
1422
- }
1423
- forEach(fn, thisp) {
1424
- thisp = thisp || this;
1425
- for (let walker = this[LRU_LIST].head; walker !== null;) {
1426
- const next = walker.next;
1427
- forEachStep(this, fn, walker, thisp);
1428
- walker = next;
1429
- }
1430
- }
1431
- keys() {
1432
- return this[LRU_LIST].toArray().map(k => k.key);
1433
- }
1434
- values() {
1435
- return this[LRU_LIST].toArray().map(k => k.value);
1436
- }
1437
- reset() {
1438
- if (this[DISPOSE] && this[LRU_LIST] && this[LRU_LIST].length) {
1439
- this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value));
1440
- }
1441
- this[CACHE] = new Map(); // hash of items by key
1442
- this[LRU_LIST] = new Yallist(); // list of items in order of use recency
1443
- this[LENGTH] = 0; // length of items in the list
1444
- }
1445
-
1446
- dump() {
1447
- return this[LRU_LIST].map(hit => isStale(this, hit) ? false : {
1448
- k: hit.key,
1449
- v: hit.value,
1450
- e: hit.now + (hit.maxAge || 0)
1451
- }).toArray().filter(h => h);
1452
- }
1453
- dumpLru() {
1454
- return this[LRU_LIST];
1455
- }
1456
- set(key, value, maxAge) {
1457
- maxAge = maxAge || this[MAX_AGE];
1458
- if (maxAge && typeof maxAge !== 'number') throw new TypeError('maxAge must be a number');
1459
- const now = maxAge ? Date.now() : 0;
1460
- const len = this[LENGTH_CALCULATOR](value, key);
1461
- if (this[CACHE].has(key)) {
1462
- if (len > this[MAX]) {
1463
- del(this, this[CACHE].get(key));
1464
- return false;
1465
- }
1466
- const node = this[CACHE].get(key);
1467
- const item = node.value;
1468
-
1469
- // dispose of the old one before overwriting
1470
- // split out into 2 ifs for better coverage tracking
1471
- if (this[DISPOSE]) {
1472
- if (!this[NO_DISPOSE_ON_SET]) this[DISPOSE](key, item.value);
1473
- }
1474
- item.now = now;
1475
- item.maxAge = maxAge;
1476
- item.value = value;
1477
- this[LENGTH] += len - item.length;
1478
- item.length = len;
1479
- this.get(key);
1480
- trim(this);
1481
- return true;
1482
- }
1483
- const hit = new Entry(key, value, len, now, maxAge);
1484
-
1485
- // oversized objects fall out of cache automatically.
1486
- if (hit.length > this[MAX]) {
1487
- if (this[DISPOSE]) this[DISPOSE](key, value);
1488
- return false;
1489
- }
1490
- this[LENGTH] += hit.length;
1491
- this[LRU_LIST].unshift(hit);
1492
- this[CACHE].set(key, this[LRU_LIST].head);
1493
- trim(this);
1494
- return true;
1495
- }
1496
- has(key) {
1497
- if (!this[CACHE].has(key)) return false;
1498
- const hit = this[CACHE].get(key).value;
1499
- return !isStale(this, hit);
952
+ constructor() {
953
+ this.max = 1000;
954
+ this.map = new Map();
1500
955
  }
1501
956
  get(key) {
1502
- return get(this, key, true);
1503
- }
1504
- peek(key) {
1505
- return get(this, key, false);
1506
- }
1507
- pop() {
1508
- const node = this[LRU_LIST].tail;
1509
- if (!node) return null;
1510
- del(this, node);
1511
- return node.value;
1512
- }
1513
- del(key) {
1514
- del(this, this[CACHE].get(key));
1515
- }
1516
- load(arr) {
1517
- // reset the cache
1518
- this.reset();
1519
- const now = Date.now();
1520
- // A previous serialized cache has the most recent items first
1521
- for (let l = arr.length - 1; l >= 0; l--) {
1522
- const hit = arr[l];
1523
- const expiresAt = hit.e || 0;
1524
- if (expiresAt === 0)
1525
- // the item was created without expiration in a non aged cache
1526
- this.set(hit.k, hit.v);else {
1527
- const maxAge = expiresAt - now;
1528
- // dont add already expired items
1529
- if (maxAge > 0) {
1530
- this.set(hit.k, hit.v, maxAge);
1531
- }
1532
- }
957
+ const value = this.map.get(key);
958
+ if (value === undefined) {
959
+ return undefined;
960
+ } else {
961
+ // Remove the key from the map and add it to the end
962
+ this.map.delete(key);
963
+ this.map.set(key, value);
964
+ return value;
1533
965
  }
1534
966
  }
1535
- prune() {
1536
- this[CACHE].forEach((value, key) => get(this, key, false));
967
+ delete(key) {
968
+ return this.map.delete(key);
1537
969
  }
1538
- }
1539
- const get = (self, key, doUse) => {
1540
- const node = self[CACHE].get(key);
1541
- if (node) {
1542
- const hit = node.value;
1543
- if (isStale(self, hit)) {
1544
- del(self, node);
1545
- if (!self[ALLOW_STALE]) return undefined;
1546
- } else {
1547
- if (doUse) {
1548
- if (self[UPDATE_AGE_ON_GET]) node.value.now = Date.now();
1549
- self[LRU_LIST].unshiftNode(node);
970
+ set(key, value) {
971
+ const deleted = this.delete(key);
972
+ if (!deleted && value !== undefined) {
973
+ // If cache is full, delete the least recently used item
974
+ if (this.map.size >= this.max) {
975
+ const firstKey = this.map.keys().next().value;
976
+ this.delete(firstKey);
1550
977
  }
978
+ this.map.set(key, value);
1551
979
  }
1552
- return hit.value;
1553
- }
1554
- };
1555
- const isStale = (self, hit) => {
1556
- if (!hit || !hit.maxAge && !self[MAX_AGE]) return false;
1557
- const diff = Date.now() - hit.now;
1558
- return hit.maxAge ? diff > hit.maxAge : self[MAX_AGE] && diff > self[MAX_AGE];
1559
- };
1560
- const trim = self => {
1561
- if (self[LENGTH] > self[MAX]) {
1562
- for (let walker = self[LRU_LIST].tail; self[LENGTH] > self[MAX] && walker !== null;) {
1563
- // We know that we're about to delete this one, and also
1564
- // what the next least recently used key will be, so just
1565
- // go ahead and set it now.
1566
- const prev = walker.prev;
1567
- del(self, walker);
1568
- walker = prev;
1569
- }
1570
- }
1571
- };
1572
- const del = (self, node) => {
1573
- if (node) {
1574
- const hit = node.value;
1575
- if (self[DISPOSE]) self[DISPOSE](hit.key, hit.value);
1576
- self[LENGTH] -= hit.length;
1577
- self[CACHE].delete(hit.key);
1578
- self[LRU_LIST].removeNode(node);
1579
- }
1580
- };
1581
- class Entry {
1582
- constructor(key, value, length, now, maxAge) {
1583
- this.key = key;
1584
- this.value = value;
1585
- this.length = length;
1586
- this.now = now;
1587
- this.maxAge = maxAge || 0;
980
+ return this;
1588
981
  }
1589
982
  }
1590
- const forEachStep = (self, fn, node, thisp) => {
1591
- let hit = node.value;
1592
- if (isStale(self, hit)) {
1593
- del(self, node);
1594
- if (!self[ALLOW_STALE]) hit = undefined;
1595
- }
1596
- if (hit) fn.call(thisp, hit.value, hit.key, self);
1597
- };
1598
- var lruCache = LRUCache;
983
+ var lrucache = LRUCache;
1599
984
 
1600
- // parse out just the options we care about so we always get a consistent
1601
- // obj with keys in a consistent order.
1602
- const opts = ['includePrerelease', 'loose', 'rtl'];
1603
- const parseOptions$1 = options => !options ? {} : typeof options !== 'object' ? {
985
+ // parse out just the options we care about
986
+ const looseOption = Object.freeze({
1604
987
  loose: true
1605
- } : opts.filter(k => options[k]).reduce((o, k) => {
1606
- o[k] = true;
1607
- return o;
1608
- }, {});
988
+ });
989
+ const emptyOpts = Object.freeze({});
990
+ const parseOptions$1 = options => {
991
+ if (!options) {
992
+ return emptyOpts;
993
+ }
994
+ if (typeof options !== 'object') {
995
+ return looseOption;
996
+ }
997
+ return options;
998
+ };
1609
999
  var parseOptions_1 = parseOptions$1;
1610
1000
 
1611
- var reExports = {};
1612
- var re$1 = {
1613
- get exports(){ return reExports; },
1614
- set exports(v){ reExports = v; },
1615
- };
1001
+ var re$1 = {exports: {}};
1616
1002
 
1617
1003
  // Note: this is the semver.org version of the spec that it implements
1618
1004
  // Not necessarily the package version of this code.
@@ -1622,39 +1008,63 @@
1622
1008
 
1623
1009
  // Max safe segment length for coercion.
1624
1010
  const MAX_SAFE_COMPONENT_LENGTH = 16;
1011
+
1012
+ // Max safe length for a build identifier. The max length minus 6 characters for
1013
+ // the shortest version with a build 0.0.0+BUILD.
1014
+ const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH$1 - 6;
1015
+ const RELEASE_TYPES = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease'];
1625
1016
  var constants = {
1626
- SEMVER_SPEC_VERSION,
1627
1017
  MAX_LENGTH: MAX_LENGTH$1,
1018
+ MAX_SAFE_COMPONENT_LENGTH,
1019
+ MAX_SAFE_BUILD_LENGTH,
1628
1020
  MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1,
1629
- MAX_SAFE_COMPONENT_LENGTH
1021
+ RELEASE_TYPES,
1022
+ SEMVER_SPEC_VERSION,
1023
+ FLAG_INCLUDE_PRERELEASE: 0b001,
1024
+ FLAG_LOOSE: 0b010
1630
1025
  };
1631
1026
 
1632
- const debug$1 = typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? function () {
1633
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
1634
- args[_key] = arguments[_key];
1635
- }
1636
- return console.error('SEMVER', ...args);
1637
- } : () => {};
1027
+ const debug$1 = typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error('SEMVER', ...args) : () => {};
1638
1028
  var debug_1 = debug$1;
1639
1029
 
1640
1030
  (function (module, exports) {
1641
1031
  const {
1642
- MAX_SAFE_COMPONENT_LENGTH
1032
+ MAX_SAFE_COMPONENT_LENGTH,
1033
+ MAX_SAFE_BUILD_LENGTH,
1034
+ MAX_LENGTH
1643
1035
  } = constants;
1644
1036
  const debug = debug_1;
1645
1037
  exports = module.exports = {};
1646
1038
 
1647
1039
  // The actual regexps go on exports.re
1648
1040
  const re = exports.re = [];
1041
+ const safeRe = exports.safeRe = [];
1649
1042
  const src = exports.src = [];
1650
1043
  const t = exports.t = {};
1651
1044
  let R = 0;
1045
+ const LETTERDASHNUMBER = '[a-zA-Z0-9-]';
1046
+
1047
+ // Replace some greedy regex tokens to prevent regex dos issues. These regex are
1048
+ // used internally via the safeRe object since all inputs in this library get
1049
+ // normalized first to trim and collapse all extra whitespace. The original
1050
+ // regexes are exported for userland consumption and lower level usage. A
1051
+ // future breaking change could export the safer regex only with a note that
1052
+ // all input should have extra whitespace removed.
1053
+ const safeRegexReplacements = [['\\s', 1], ['\\d', MAX_LENGTH], [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]];
1054
+ const makeSafeRegex = value => {
1055
+ for (const [token, max] of safeRegexReplacements) {
1056
+ value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
1057
+ }
1058
+ return value;
1059
+ };
1652
1060
  const createToken = (name, value, isGlobal) => {
1061
+ const safe = makeSafeRegex(value);
1653
1062
  const index = R++;
1654
1063
  debug(name, index, value);
1655
1064
  t[name] = index;
1656
1065
  src[index] = value;
1657
1066
  re[index] = new RegExp(value, isGlobal ? 'g' : undefined);
1067
+ safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined);
1658
1068
  };
1659
1069
 
1660
1070
  // The following Regular Expressions can be used for tokenizing,
@@ -1664,13 +1074,13 @@
1664
1074
  // A single `0`, or a non-zero digit followed by zero or more digits.
1665
1075
 
1666
1076
  createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*');
1667
- createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+');
1077
+ createToken('NUMERICIDENTIFIERLOOSE', '\\d+');
1668
1078
 
1669
1079
  // ## Non-numeric Identifier
1670
1080
  // Zero or more digits, followed by a letter or hyphen, and then zero or
1671
1081
  // more letters, digits, or hyphens.
1672
1082
 
1673
- createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*');
1083
+ createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
1674
1084
 
1675
1085
  // ## Main Version
1676
1086
  // Three dot-separated numeric identifiers.
@@ -1694,7 +1104,7 @@
1694
1104
  // ## Build Metadata Identifier
1695
1105
  // Any combination of digits, letters, or hyphens.
1696
1106
 
1697
- createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+');
1107
+ createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`);
1698
1108
 
1699
1109
  // ## Build Metadata
1700
1110
  // Plus sign, followed by one or more period-separated build metadata
@@ -1733,8 +1143,11 @@
1733
1143
 
1734
1144
  // Coercion.
1735
1145
  // Extract anything that could conceivably be a part of a valid semver
1736
- createToken('COERCE', `${'(^|[^\\d])' + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:$|[^\\d])`);
1146
+ createToken('COERCEPLAIN', `${'(^|[^\\d])' + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
1147
+ createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
1148
+ createToken('COERCEFULL', src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
1737
1149
  createToken('COERCERTL', src[t.COERCE], true);
1150
+ createToken('COERCERTLFULL', src[t.COERCEFULL], true);
1738
1151
 
1739
1152
  // Tilde ranges.
1740
1153
  // Meaning is "reasonably at or greater than"
@@ -1773,7 +1186,8 @@
1773
1186
  // >=0.0.0 is like a star
1774
1187
  createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$');
1775
1188
  createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$');
1776
- })(re$1, reExports);
1189
+ })(re$1, re$1.exports);
1190
+ var reExports = re$1.exports;
1777
1191
 
1778
1192
  const numeric = /^[0-9]+$/;
1779
1193
  const compareIdentifiers$1 = (a, b) => {
@@ -1797,7 +1211,7 @@
1797
1211
  MAX_SAFE_INTEGER
1798
1212
  } = constants;
1799
1213
  const {
1800
- re,
1214
+ safeRe: re,
1801
1215
  t
1802
1216
  } = reExports;
1803
1217
  const parseOptions = parseOptions_1;
@@ -1814,7 +1228,7 @@
1814
1228
  version = version.version;
1815
1229
  }
1816
1230
  } else if (typeof version !== 'string') {
1817
- throw new TypeError(`Invalid Version: ${version}`);
1231
+ throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
1818
1232
  }
1819
1233
  if (version.length > MAX_LENGTH) {
1820
1234
  throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
@@ -1930,7 +1344,7 @@
1930
1344
  do {
1931
1345
  const a = this.build[i];
1932
1346
  const b = other.build[i];
1933
- debug('prerelease compare', i, a, b);
1347
+ debug('build compare', i, a, b);
1934
1348
  if (a === undefined && b === undefined) {
1935
1349
  return 0;
1936
1350
  } else if (b === undefined) {
@@ -1947,36 +1361,36 @@
1947
1361
 
1948
1362
  // preminor will bump the version up to the next minor release, and immediately
1949
1363
  // down to pre-release. premajor and prepatch work the same way.
1950
- inc(release, identifier) {
1364
+ inc(release, identifier, identifierBase) {
1951
1365
  switch (release) {
1952
1366
  case 'premajor':
1953
1367
  this.prerelease.length = 0;
1954
1368
  this.patch = 0;
1955
1369
  this.minor = 0;
1956
1370
  this.major++;
1957
- this.inc('pre', identifier);
1371
+ this.inc('pre', identifier, identifierBase);
1958
1372
  break;
1959
1373
  case 'preminor':
1960
1374
  this.prerelease.length = 0;
1961
1375
  this.patch = 0;
1962
1376
  this.minor++;
1963
- this.inc('pre', identifier);
1377
+ this.inc('pre', identifier, identifierBase);
1964
1378
  break;
1965
1379
  case 'prepatch':
1966
1380
  // If this is already a prerelease, it will bump to the next version
1967
1381
  // drop any prereleases that might already exist, since they are not
1968
1382
  // relevant at this point.
1969
1383
  this.prerelease.length = 0;
1970
- this.inc('patch', identifier);
1971
- this.inc('pre', identifier);
1384
+ this.inc('patch', identifier, identifierBase);
1385
+ this.inc('pre', identifier, identifierBase);
1972
1386
  break;
1973
1387
  // If the input is a non-prerelease version, this acts the same as
1974
1388
  // prepatch.
1975
1389
  case 'prerelease':
1976
1390
  if (this.prerelease.length === 0) {
1977
- this.inc('patch', identifier);
1391
+ this.inc('patch', identifier, identifierBase);
1978
1392
  }
1979
- this.inc('pre', identifier);
1393
+ this.inc('pre', identifier, identifierBase);
1980
1394
  break;
1981
1395
  case 'major':
1982
1396
  // If this is a pre-major version, bump up to the same major version.
@@ -2014,38 +1428,53 @@
2014
1428
  // This probably shouldn't be used publicly.
2015
1429
  // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
2016
1430
  case 'pre':
2017
- if (this.prerelease.length === 0) {
2018
- this.prerelease = [0];
2019
- } else {
2020
- let i = this.prerelease.length;
2021
- while (--i >= 0) {
2022
- if (typeof this.prerelease[i] === 'number') {
2023
- this.prerelease[i]++;
2024
- i = -2;
2025
- }
1431
+ {
1432
+ const base = Number(identifierBase) ? 1 : 0;
1433
+ if (!identifier && identifierBase === false) {
1434
+ throw new Error('invalid increment argument: identifier is empty');
2026
1435
  }
2027
- if (i === -1) {
2028
- // didn't increment anything
2029
- this.prerelease.push(0);
1436
+ if (this.prerelease.length === 0) {
1437
+ this.prerelease = [base];
1438
+ } else {
1439
+ let i = this.prerelease.length;
1440
+ while (--i >= 0) {
1441
+ if (typeof this.prerelease[i] === 'number') {
1442
+ this.prerelease[i]++;
1443
+ i = -2;
1444
+ }
1445
+ }
1446
+ if (i === -1) {
1447
+ // didn't increment anything
1448
+ if (identifier === this.prerelease.join('.') && identifierBase === false) {
1449
+ throw new Error('invalid increment argument: identifier already exists');
1450
+ }
1451
+ this.prerelease.push(base);
1452
+ }
2030
1453
  }
2031
- }
2032
- if (identifier) {
2033
- // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
2034
- // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
2035
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
2036
- if (isNaN(this.prerelease[1])) {
2037
- this.prerelease = [identifier, 0];
1454
+ if (identifier) {
1455
+ // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
1456
+ // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
1457
+ let prerelease = [identifier, base];
1458
+ if (identifierBase === false) {
1459
+ prerelease = [identifier];
1460
+ }
1461
+ if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
1462
+ if (isNaN(this.prerelease[1])) {
1463
+ this.prerelease = prerelease;
1464
+ }
1465
+ } else {
1466
+ this.prerelease = prerelease;
2038
1467
  }
2039
- } else {
2040
- this.prerelease = [identifier, 0];
2041
1468
  }
1469
+ break;
2042
1470
  }
2043
- break;
2044
1471
  default:
2045
1472
  throw new Error(`invalid increment argument: ${release}`);
2046
1473
  }
2047
- this.format();
2048
- this.raw = this.version;
1474
+ this.raw = this.format();
1475
+ if (this.build.length) {
1476
+ this.raw += `+${this.build.join('.')}`;
1477
+ }
2049
1478
  return this;
2050
1479
  }
2051
1480
  };
@@ -2143,6 +1572,7 @@
2143
1572
  comp = comp.value;
2144
1573
  }
2145
1574
  }
1575
+ comp = comp.trim().split(/\s+/).join(' ');
2146
1576
  debug('comparator', comp, options);
2147
1577
  this.options = options;
2148
1578
  this.loose = !!options.loose;
@@ -2193,12 +1623,6 @@
2193
1623
  if (!(comp instanceof Comparator)) {
2194
1624
  throw new TypeError('a Comparator is required');
2195
1625
  }
2196
- if (!options || typeof options !== 'object') {
2197
- options = {
2198
- loose: !!options,
2199
- includePrerelease: false
2200
- };
2201
- }
2202
1626
  if (this.operator === '') {
2203
1627
  if (this.value === '') {
2204
1628
  return true;
@@ -2210,19 +1634,43 @@
2210
1634
  }
2211
1635
  return new Range(this.value, options).test(comp.semver);
2212
1636
  }
2213
- const sameDirectionIncreasing = (this.operator === '>=' || this.operator === '>') && (comp.operator === '>=' || comp.operator === '>');
2214
- const sameDirectionDecreasing = (this.operator === '<=' || this.operator === '<') && (comp.operator === '<=' || comp.operator === '<');
2215
- const sameSemVer = this.semver.version === comp.semver.version;
2216
- const differentDirectionsInclusive = (this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<=');
2217
- const oppositeDirectionsLessThan = cmp(this.semver, '<', comp.semver, options) && (this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<');
2218
- const oppositeDirectionsGreaterThan = cmp(this.semver, '>', comp.semver, options) && (this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>');
2219
- return sameDirectionIncreasing || sameDirectionDecreasing || sameSemVer && differentDirectionsInclusive || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
1637
+ options = parseOptions(options);
1638
+
1639
+ // Special cases where nothing can possibly be lower
1640
+ if (options.includePrerelease && (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
1641
+ return false;
1642
+ }
1643
+ if (!options.includePrerelease && (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
1644
+ return false;
1645
+ }
1646
+
1647
+ // Same direction increasing (> or >=)
1648
+ if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
1649
+ return true;
1650
+ }
1651
+ // Same direction decreasing (< or <=)
1652
+ if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
1653
+ return true;
1654
+ }
1655
+ // same SemVer and both sides are inclusive (<= or >=)
1656
+ if (this.semver.version === comp.semver.version && this.operator.includes('=') && comp.operator.includes('=')) {
1657
+ return true;
1658
+ }
1659
+ // opposite directions less than
1660
+ if (cmp(this.semver, '<', comp.semver, options) && this.operator.startsWith('>') && comp.operator.startsWith('<')) {
1661
+ return true;
1662
+ }
1663
+ // opposite directions greater than
1664
+ if (cmp(this.semver, '>', comp.semver, options) && this.operator.startsWith('<') && comp.operator.startsWith('>')) {
1665
+ return true;
1666
+ }
1667
+ return false;
2220
1668
  }
2221
1669
  }
2222
1670
  comparator = Comparator;
2223
1671
  const parseOptions = parseOptions_1;
2224
1672
  const {
2225
- re,
1673
+ safeRe: re,
2226
1674
  t
2227
1675
  } = reExports;
2228
1676
  const cmp = cmp_1;
@@ -2259,9 +1707,13 @@
2259
1707
  this.loose = !!options.loose;
2260
1708
  this.includePrerelease = !!options.includePrerelease;
2261
1709
 
2262
- // First, split based on boolean or ||
2263
- this.raw = range;
2264
- this.set = range.split('||')
1710
+ // First reduce all whitespace as much as possible so we do not have to rely
1711
+ // on potentially slow regexes like \s*. This is then stored and used for
1712
+ // future error messages as well.
1713
+ this.raw = range.trim().split(/\s+/).join(' ');
1714
+
1715
+ // First, split on ||
1716
+ this.set = this.raw.split('||')
2265
1717
  // map the range to a 2d array of comparators
2266
1718
  .map(r => this.parseRange(r.trim()))
2267
1719
  // throw out any comparator lists that are empty
@@ -2269,7 +1721,7 @@
2269
1721
  // in loose mode, but will still throw if the WHOLE range is invalid.
2270
1722
  .filter(c => c.length);
2271
1723
  if (!this.set.length) {
2272
- throw new TypeError(`Invalid SemVer Range: ${range}`);
1724
+ throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
2273
1725
  }
2274
1726
 
2275
1727
  // if we have any that are not the null set, throw out null sets.
@@ -2292,21 +1744,17 @@
2292
1744
  this.format();
2293
1745
  }
2294
1746
  format() {
2295
- this.range = this.set.map(comps => {
2296
- return comps.join(' ').trim();
2297
- }).join('||').trim();
1747
+ this.range = this.set.map(comps => comps.join(' ').trim()).join('||').trim();
2298
1748
  return this.range;
2299
1749
  }
2300
1750
  toString() {
2301
1751
  return this.range;
2302
1752
  }
2303
1753
  parseRange(range) {
2304
- range = range.trim();
2305
-
2306
1754
  // memoize range parsing for performance.
2307
1755
  // this is a very hot path, and fully deterministic.
2308
- const memoOpts = Object.keys(this.options).join(',');
2309
- const memoKey = `parseRange:${memoOpts}:${range}`;
1756
+ const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
1757
+ const memoKey = memoOpts + ':' + range;
2310
1758
  const cached = cache.get(memoKey);
2311
1759
  if (cached) {
2312
1760
  return cached;
@@ -2316,18 +1764,18 @@
2316
1764
  const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
2317
1765
  range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
2318
1766
  debug('hyphen replace', range);
1767
+
2319
1768
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
2320
1769
  range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
2321
1770
  debug('comparator trim', range);
2322
1771
 
2323
1772
  // `~ 1.2.3` => `~1.2.3`
2324
1773
  range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
1774
+ debug('tilde trim', range);
2325
1775
 
2326
1776
  // `^ 1.2.3` => `^1.2.3`
2327
1777
  range = range.replace(re[t.CARETTRIM], caretTrimReplace);
2328
-
2329
- // normalize spaces
2330
- range = range.split(/\s+/).join(' ');
1778
+ debug('caret trim', range);
2331
1779
 
2332
1780
  // At this point, the range is completely trimmed and
2333
1781
  // ready to be split into comparators.
@@ -2398,21 +1846,23 @@
2398
1846
  }
2399
1847
  }
2400
1848
  range = Range;
2401
- const LRU = lruCache;
2402
- const cache = new LRU({
2403
- max: 1000
2404
- });
1849
+ const LRU = lrucache;
1850
+ const cache = new LRU();
2405
1851
  const parseOptions = parseOptions_1;
2406
1852
  const Comparator = requireComparator();
2407
1853
  const debug = debug_1;
2408
1854
  const SemVer = semver;
2409
1855
  const {
2410
- re,
1856
+ safeRe: re,
2411
1857
  t,
2412
1858
  comparatorTrimReplace,
2413
1859
  tildeTrimReplace,
2414
1860
  caretTrimReplace
2415
1861
  } = reExports;
1862
+ const {
1863
+ FLAG_INCLUDE_PRERELEASE,
1864
+ FLAG_LOOSE
1865
+ } = constants;
2416
1866
  const isNullSet = c => c.value === '<0.0.0-0';
2417
1867
  const isAny = c => c.value === '';
2418
1868
 
@@ -2455,9 +1905,9 @@
2455
1905
  // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
2456
1906
  // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
2457
1907
  // ~0.0.1 --> >=0.0.1 <0.1.0-0
2458
- const replaceTildes = (comp, options) => comp.trim().split(/\s+/).map(c => {
2459
- return replaceTilde(c, options);
2460
- }).join(' ');
1908
+ const replaceTildes = (comp, options) => {
1909
+ return comp.trim().split(/\s+/).map(c => replaceTilde(c, options)).join(' ');
1910
+ };
2461
1911
  const replaceTilde = (comp, options) => {
2462
1912
  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
2463
1913
  return comp.replace(r, (_, M, m, p, pr) => {
@@ -2490,9 +1940,9 @@
2490
1940
  // ^1.2.0 --> >=1.2.0 <2.0.0-0
2491
1941
  // ^0.0.1 --> >=0.0.1 <0.0.2-0
2492
1942
  // ^0.1.0 --> >=0.1.0 <0.2.0-0
2493
- const replaceCarets = (comp, options) => comp.trim().split(/\s+/).map(c => {
2494
- return replaceCaret(c, options);
2495
- }).join(' ');
1943
+ const replaceCarets = (comp, options) => {
1944
+ return comp.trim().split(/\s+/).map(c => replaceCaret(c, options)).join(' ');
1945
+ };
2496
1946
  const replaceCaret = (comp, options) => {
2497
1947
  debug('caret', comp, options);
2498
1948
  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
@@ -2539,9 +1989,7 @@
2539
1989
  };
2540
1990
  const replaceXRanges = (comp, options) => {
2541
1991
  debug('replaceXRanges', comp, options);
2542
- return comp.split(/\s+/).map(c => {
2543
- return replaceXRange(c, options);
2544
- }).join(' ');
1992
+ return comp.split(/\s+/).map(c => replaceXRange(c, options)).join(' ');
2545
1993
  };
2546
1994
  const replaceXRange = (comp, options) => {
2547
1995
  comp = comp.trim();
@@ -2627,7 +2075,8 @@
2627
2075
  // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
2628
2076
  // 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
2629
2077
  // 1.2 - 3.4 => >=1.2.0 <3.5.0-0
2630
- const hyphenReplace = incPr => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) => {
2078
+ // TODO build?
2079
+ const hyphenReplace = incPr => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
2631
2080
  if (isX(fM)) {
2632
2081
  from = '';
2633
2082
  } else if (isX(fm)) {
@@ -2697,6 +2146,7 @@
2697
2146
  return range.test(version);
2698
2147
  };
2699
2148
  var satisfies_1 = satisfies;
2149
+ var satisfies$1 = /*@__PURE__*/getDefaultExportFromCjs(satisfies_1);
2700
2150
 
2701
2151
  function adjustSpatial(item, encode, swap) {
2702
2152
  let t;
@@ -2857,6 +2307,8 @@
2857
2307
  test: (r, t) => RegExp(r).test(t)
2858
2308
  };
2859
2309
  const EventFunctions = ['view', 'item', 'group', 'xy', 'x', 'y'];
2310
+ const DisallowedMethods = new Set([Function, eval, setTimeout, setInterval]);
2311
+ if (typeof setImmediate === 'function') DisallowedMethods.add(setImmediate);
2860
2312
  const Visitors = {
2861
2313
  Literal: ($, n) => n.value,
2862
2314
  Identifier: ($, n) => {
@@ -2869,17 +2321,24 @@
2869
2321
  if (d) $.memberDepth += 1;
2870
2322
  const p = $(n.property);
2871
2323
  if (d) $.memberDepth -= 1;
2324
+ if (DisallowedMethods.has(o[p])) {
2325
+ // eslint-disable-next-line no-console
2326
+ console.error(`Prevented interpretation of member "${p}" which could lead to insecure code execution`);
2327
+ return;
2328
+ }
2872
2329
  return o[p];
2873
2330
  },
2874
2331
  CallExpression: ($, n) => {
2875
2332
  const args = n.arguments;
2876
- let name = n.callee.name; // handle special internal functions used by encoders
2877
- // re-route to corresponding standard function
2333
+ let name = n.callee.name;
2878
2334
 
2335
+ // handle special internal functions used by encoders
2336
+ // re-route to corresponding standard function
2879
2337
  if (name.startsWith('_')) {
2880
2338
  name = name.slice(1);
2881
- } // special case "if" due to conditional evaluation of branches
2339
+ }
2882
2340
 
2341
+ // special case "if" due to conditional evaluation of branches
2883
2342
  return name === 'if' ? $(args[0]) ? $(args[1]) : $(args[2]) : ($.fn[name] || Functions[name]).apply($.fn, args.map($));
2884
2343
  },
2885
2344
  ArrayExpression: ($, n) => n.elements.map($),
@@ -2891,7 +2350,12 @@
2891
2350
  $.memberDepth += 1;
2892
2351
  const k = $(p.key);
2893
2352
  $.memberDepth -= 1;
2894
- o[k] = $(p.value);
2353
+ if (DisallowedMethods.has($(p.value))) {
2354
+ // eslint-disable-next-line no-console
2355
+ console.error(`Prevented interpretation of property "${k}" which could lead to insecure code execution`);
2356
+ } else {
2357
+ o[k] = $(p.value);
2358
+ }
2895
2359
  return o;
2896
2360
  }, {})
2897
2361
  };
@@ -2902,8 +2366,9 @@
2902
2366
  $.params = params;
2903
2367
  $.datum = datum;
2904
2368
  $.event = event;
2905
- $.item = item; // route event functions to annotated vega event context
2369
+ $.item = item;
2906
2370
 
2371
+ // route event functions to annotated vega event context
2907
2372
  EventFunctions.forEach(f => $.fn[f] = function () {
2908
2373
  return event.vega[f](...arguments);
2909
2374
  });
@@ -2983,7 +2448,7 @@
2983
2448
  }
2984
2449
 
2985
2450
  var name$1 = "vega-themes";
2986
- var version$1$1 = "2.12.1";
2451
+ var version$1$1 = "2.15.0";
2987
2452
  var description$1 = "Themes for stylized Vega and Vega-Lite visualizations.";
2988
2453
  var keywords$1 = ["vega", "vega-lite", "themes", "style"];
2989
2454
  var license$1 = "BSD-3-Clause";
@@ -3024,28 +2489,35 @@
3024
2489
  preversion: "yarn lint",
3025
2490
  serve: "browser-sync start -s -f build examples --serveStatic examples",
3026
2491
  start: "yarn build && concurrently --kill-others -n Server,Rollup 'yarn serve' 'rollup -c -w'",
3027
- prepare: "beemo create-config",
3028
- eslintbase: "beemo eslint .",
3029
- format: "yarn eslintbase --fix",
3030
- lint: "yarn eslintbase",
2492
+ format: "eslint . --fix",
2493
+ lint: "eslint .",
3031
2494
  release: "release-it"
3032
2495
  };
3033
2496
  var devDependencies$1 = {
3034
- "@release-it/conventional-changelog": "^5.1.1",
3035
- "@rollup/plugin-json": "^6.0.0",
3036
- "@rollup/plugin-node-resolve": "^15.0.1",
3037
- "@rollup/plugin-terser": "^0.4.0",
3038
- "browser-sync": "^2.27.10",
3039
- concurrently: "^7.3.0",
3040
- "gh-pages": "^5.0.0",
3041
- "release-it": "^15.6.0",
2497
+ "@babel/core": "^7.24.6",
2498
+ "@babel/plugin-transform-runtime": "^7.24.6",
2499
+ "@babel/preset-env": "^7.24.6",
2500
+ "@babel/preset-typescript": "^7.24.6",
2501
+ "@release-it/conventional-changelog": "^8.0.1",
2502
+ "@rollup/plugin-json": "^6.1.0",
2503
+ "@rollup/plugin-node-resolve": "^15.2.3",
2504
+ "@rollup/plugin-terser": "^0.4.4",
2505
+ "@typescript-eslint/eslint-plugin": "^7.11.0",
2506
+ "@typescript-eslint/parser": "^7.11.0",
2507
+ "browser-sync": "^3.0.2",
2508
+ concurrently: "^8.2.2",
2509
+ eslint: "^8.45.0",
2510
+ "eslint-config-prettier": "^9.1.0",
2511
+ "eslint-plugin-prettier": "^5.1.3",
2512
+ "gh-pages": "^6.1.1",
2513
+ prettier: "^3.2.5",
2514
+ "release-it": "^17.3.0",
2515
+ rollup: "^4.18.0",
3042
2516
  "rollup-plugin-bundle-size": "^1.0.3",
3043
- "rollup-plugin-ts": "^3.0.2",
3044
- rollup: "^3.15.0",
3045
- typescript: "^4.7.4",
3046
- "vega-lite-dev-config": "^0.21.0",
3047
- "vega-lite": "^5.0.0",
3048
- vega: "^5.19.1"
2517
+ "rollup-plugin-ts": "^3.4.5",
2518
+ typescript: "^5.4.5",
2519
+ vega: "^5.25.0",
2520
+ "vega-lite": "^5.9.3"
3049
2521
  };
3050
2522
  var peerDependencies$1 = {
3051
2523
  vega: "*",
@@ -3622,9 +3094,10 @@
3622
3094
  * license that can be found in the LICENSE file or at
3623
3095
  * https://developers.google.com/open-source/licenses/bsd
3624
3096
  */
3097
+
3625
3098
  const markColor = '#3366CC';
3626
3099
  const gridColor = '#ccc';
3627
- const defaultFont = 'Arial, sans-serif';
3100
+ const defaultFont$1 = 'Arial, sans-serif';
3628
3101
  const googlechartsTheme = {
3629
3102
  arc: {
3630
3103
  fill: markColor
@@ -3656,20 +3129,20 @@
3656
3129
  },
3657
3130
  style: {
3658
3131
  'guide-label': {
3659
- font: defaultFont,
3132
+ font: defaultFont$1,
3660
3133
  fontSize: 12
3661
3134
  },
3662
3135
  'guide-title': {
3663
- font: defaultFont,
3136
+ font: defaultFont$1,
3664
3137
  fontSize: 12
3665
3138
  },
3666
3139
  'group-title': {
3667
- font: defaultFont,
3140
+ font: defaultFont$1,
3668
3141
  fontSize: 12
3669
3142
  }
3670
3143
  },
3671
3144
  title: {
3672
- font: defaultFont,
3145
+ font: defaultFont$1,
3673
3146
  fontSize: 14,
3674
3147
  fontWeight: 'bold',
3675
3148
  dy: -3,
@@ -3807,10 +3280,151 @@
3807
3280
  ordinal: ordinalPalette
3808
3281
  }
3809
3282
  };
3283
+ const defaultFont = 'IBM Plex Sans,system-ui,-apple-system,BlinkMacSystemFont,".sfnstext-regular",sans-serif';
3284
+ const condensedFont = 'IBM Plex Sans Condensed, system-ui, -apple-system, BlinkMacSystemFont, ".SFNSText-Regular", sans-serif';
3285
+ const fontWeight = 400;
3286
+ const TOKENS = {
3287
+ textPrimary: {
3288
+ g90: '#f4f4f4',
3289
+ g100: '#f4f4f4',
3290
+ white: '#161616',
3291
+ g10: '#161616'
3292
+ },
3293
+ textSecondary: {
3294
+ g90: '#c6c6c6',
3295
+ g100: '#c6c6c6',
3296
+ white: '#525252',
3297
+ g10: '#525252'
3298
+ },
3299
+ // layer
3300
+ layerAccent01: {
3301
+ white: '#e0e0e0',
3302
+ g10: '#e0e0e0',
3303
+ g90: '#525252',
3304
+ g100: '#393939'
3305
+ },
3306
+ // grid
3307
+ gridBg: {
3308
+ white: '#ffffff',
3309
+ g10: '#ffffff',
3310
+ g90: '#161616',
3311
+ g100: '#161616'
3312
+ }
3313
+ };
3314
+ const darkCategories = ['#8a3ffc', '#33b1ff', '#007d79', '#ff7eb6', '#fa4d56', '#fff1f1', '#6fdc8c', '#4589ff', '#d12771', '#d2a106', '#08bdba', '#bae6ff', '#ba4e00', '#d4bbff'];
3315
+ const lightCategories = ['#6929c4', '#1192e8', '#005d5d', '#9f1853', '#fa4d56', '#570408', '#198038', '#002d9c', '#ee538b', '#b28600', '#009d9a', '#012749', '#8a3800', '#a56eff'];
3316
+ function genCarbonConfig({
3317
+ theme,
3318
+ background
3319
+ }) {
3320
+ const type = ['white', 'g10'].includes(theme) ? 'light' : 'dark';
3321
+ const viewbg = TOKENS.gridBg[theme];
3322
+ const titleColor = TOKENS.textPrimary[theme];
3323
+ const textColor = TOKENS.textSecondary[theme];
3324
+ const category = type === 'dark' ? darkCategories : lightCategories;
3325
+ const markColor = type === 'dark' ? '#d4bbff' : '#6929c4';
3326
+ return {
3327
+ background,
3328
+ arc: {
3329
+ fill: markColor
3330
+ },
3331
+ area: {
3332
+ fill: markColor
3333
+ },
3334
+ path: {
3335
+ stroke: markColor
3336
+ },
3337
+ rect: {
3338
+ fill: markColor
3339
+ },
3340
+ shape: {
3341
+ stroke: markColor
3342
+ },
3343
+ symbol: {
3344
+ stroke: markColor
3345
+ },
3346
+ circle: {
3347
+ fill: markColor
3348
+ },
3349
+ view: {
3350
+ fill: viewbg,
3351
+ stroke: viewbg
3352
+ },
3353
+ group: {
3354
+ fill: viewbg
3355
+ },
3356
+ title: {
3357
+ color: titleColor,
3358
+ anchor: 'start',
3359
+ dy: -15,
3360
+ fontSize: 16,
3361
+ font: defaultFont,
3362
+ fontWeight: 600
3363
+ },
3364
+ axis: {
3365
+ // Axis labels
3366
+ labelColor: textColor,
3367
+ labelFontSize: 12,
3368
+ labelFont: condensedFont,
3369
+ labelFontWeight: fontWeight,
3370
+ // Axis titles
3371
+ titleColor: titleColor,
3372
+ titleFontWeight: 600,
3373
+ titleFontSize: 12,
3374
+ // MISC
3375
+ grid: true,
3376
+ gridColor: TOKENS.layerAccent01[theme],
3377
+ labelAngle: 0
3378
+ },
3379
+ axisX: {
3380
+ titlePadding: 10
3381
+ },
3382
+ axisY: {
3383
+ titlePadding: 2.5
3384
+ },
3385
+ style: {
3386
+ 'guide-label': {
3387
+ font: defaultFont,
3388
+ fill: textColor,
3389
+ fontWeight: fontWeight
3390
+ },
3391
+ 'guide-title': {
3392
+ font: defaultFont,
3393
+ fill: textColor,
3394
+ fontWeight: fontWeight
3395
+ }
3396
+ },
3397
+ range: {
3398
+ category,
3399
+ diverging: ['#750e13', '#a2191f', '#da1e28', '#fa4d56', '#ff8389', '#ffb3b8', '#ffd7d9', '#fff1f1', '#e5f6ff', '#bae6ff', '#82cfff', '#33b1ff', '#1192e8', '#0072c3', '#00539a', '#003a6d'],
3400
+ heatmap: ['#f6f2ff', '#e8daff', '#d4bbff', '#be95ff', '#a56eff', '#8a3ffc', '#6929c4', '#491d8b', '#31135e', '#1c0f30']
3401
+ }
3402
+ };
3403
+ }
3404
+ const carbonwhite = genCarbonConfig({
3405
+ theme: 'white',
3406
+ background: '#ffffff'
3407
+ });
3408
+ const carbong10 = genCarbonConfig({
3409
+ theme: 'g10',
3410
+ background: '#f4f4f4'
3411
+ });
3412
+ const carbong90 = genCarbonConfig({
3413
+ theme: 'g90',
3414
+ background: '#262626'
3415
+ });
3416
+ const carbong100 = genCarbonConfig({
3417
+ theme: 'g100',
3418
+ background: '#161616'
3419
+ });
3810
3420
  const version$2 = pkg$1.version;
3811
3421
 
3812
3422
  var themes = /*#__PURE__*/Object.freeze({
3813
3423
  __proto__: null,
3424
+ carbong10: carbong10,
3425
+ carbong100: carbong100,
3426
+ carbong90: carbong90,
3427
+ carbonwhite: carbonwhite,
3814
3428
  dark: darkTheme,
3815
3429
  excel: excelTheme,
3816
3430
  fivethirtyeight: fiveThirtyEightTheme,
@@ -3865,8 +3479,7 @@
3865
3479
  for (i = j = 0; j < n; ++j) {
3866
3480
  c = p[j];
3867
3481
  if (c === '\\') {
3868
- s += p.substring(i, j);
3869
- s += p.substring(++j, ++j);
3482
+ s += p.substring(i, j++);
3870
3483
  i = j;
3871
3484
  } else if (c === q) {
3872
3485
  push();
@@ -3907,7 +3520,7 @@
3907
3520
  function field(field, name, opt) {
3908
3521
  const path = splitAccessPath(field);
3909
3522
  field = path.length === 1 ? path[0] : field;
3910
- return accessor((opt && opt.get || getter)(path), [field], name || field);
3523
+ return accessor((getter)(path), [field], field);
3911
3524
  }
3912
3525
  field('id');
3913
3526
  accessor(_ => _, [], 'identity');
@@ -3923,59 +3536,35 @@
3923
3536
  return typeof _ === 'string';
3924
3537
  }
3925
3538
 
3926
- /******************************************************************************
3927
- Copyright (c) Microsoft Corporation.
3928
-
3929
- Permission to use, copy, modify, and/or distribute this software for any
3930
- purpose with or without fee is hereby granted.
3931
-
3932
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
3933
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
3934
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
3935
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
3936
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
3937
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
3938
- PERFORMANCE OF THIS SOFTWARE.
3939
- ***************************************************************************** */
3940
-
3941
- function __rest(s, e) {
3942
- var t = {};
3943
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
3944
- if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
3945
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
3946
- }
3947
- return t;
3948
- }
3949
-
3950
3539
  /**
3951
3540
  * Format the value to be shown in the tooltip.
3952
3541
  *
3953
3542
  * @param value The value to show in the tooltip.
3954
3543
  * @param valueToHtml Function to convert a single cell value to an HTML string
3955
3544
  */
3956
- function formatValue(value, valueToHtml, maxDepth) {
3545
+ function formatValue(value, valueToHtml, maxDepth, baseURL) {
3957
3546
  if (isArray(value)) {
3958
3547
  return `[${value.map(v => valueToHtml(isString(v) ? v : stringify(v, maxDepth))).join(', ')}]`;
3959
3548
  }
3960
3549
  if (isObject(value)) {
3961
3550
  let content = '';
3962
- const _a = value,
3963
- {
3964
- title,
3965
- image
3966
- } = _a,
3967
- rest = __rest(_a, ["title", "image"]);
3551
+ const {
3552
+ title,
3553
+ image,
3554
+ ...rest
3555
+ } = value;
3968
3556
  if (title) {
3969
3557
  content += `<h2>${valueToHtml(title)}</h2>`;
3970
3558
  }
3971
3559
  if (image) {
3972
- content += `<img src="${valueToHtml(image)}">`;
3560
+ content += `<img src="${new URL(valueToHtml(image), baseURL || location.href).href}">`;
3973
3561
  }
3974
3562
  const keys = Object.keys(rest);
3975
3563
  if (keys.length > 0) {
3976
3564
  content += '<table>';
3977
3565
  for (const key of keys) {
3978
3566
  let val = rest[key];
3567
+
3979
3568
  // ignore undefined properties
3980
3569
  if (val === undefined) {
3981
3570
  continue;
@@ -3983,13 +3572,12 @@
3983
3572
  if (isObject(val)) {
3984
3573
  val = stringify(val, maxDepth);
3985
3574
  }
3986
- content += `<tr><td class="key">${valueToHtml(key)}:</td><td class="value">${valueToHtml(val)}</td></tr>`;
3575
+ content += `<tr><td class="key">${valueToHtml(key)}</td><td class="value">${valueToHtml(val)}</td></tr>`;
3987
3576
  }
3988
3577
  content += `</table>`;
3989
3578
  }
3990
3579
  return content || '{}'; // show empty object if there are no properties
3991
3580
  }
3992
-
3993
3581
  return valueToHtml(value);
3994
3582
  }
3995
3583
  function replacer(maxDepth) {
@@ -4010,6 +3598,7 @@
4010
3598
  return value;
4011
3599
  };
4012
3600
  }
3601
+
4013
3602
  /**
4014
3603
  * Stringify any JS object to valid JSON
4015
3604
  */
@@ -4040,10 +3629,6 @@
4040
3629
  margin-bottom: 10px;
4041
3630
  font-size: 13px;
4042
3631
  }
4043
- #vg-tooltip-element img {
4044
- max-width: 200px;
4045
- max-height: 200px;
4046
- }
4047
3632
  #vg-tooltip-element table {
4048
3633
  border-spacing: 0;
4049
3634
  }
@@ -4119,9 +3704,14 @@
4119
3704
  * A function to customize the rendered HTML of the tooltip.
4120
3705
  * @param value A value string, or object of value strings keyed by field
4121
3706
  * @param sanitize The `sanitize` function from `options.sanitize`
3707
+ * @param baseURL The `baseURL` from `options.baseURL`
4122
3708
  * @returns {string} The returned string will become the `innerHTML` of the tooltip element
4123
3709
  */
4124
- formatTooltip: formatValue
3710
+ formatTooltip: formatValue,
3711
+ /**
3712
+ * The baseurl to use in image paths.
3713
+ */
3714
+ baseURL: ''
4125
3715
  };
4126
3716
  /**
4127
3717
  * Escape special HTML characters.
@@ -4166,17 +3756,34 @@
4166
3756
  * The tooltip handler class.
4167
3757
  */
4168
3758
  class Handler {
3759
+ /**
3760
+ * The handler function. We bind this to this function in the constructor.
3761
+ */
3762
+
3763
+ /**
3764
+ * Complete tooltip options.
3765
+ */
3766
+
3767
+ /**
3768
+ * The tooltip html element.
3769
+ */
3770
+
4169
3771
  /**
4170
3772
  * Create the tooltip handler and initialize the element and style.
4171
3773
  *
4172
3774
  * @param options Tooltip Options
4173
3775
  */
4174
3776
  constructor(options) {
4175
- this.options = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options);
3777
+ this.options = {
3778
+ ...DEFAULT_OPTIONS,
3779
+ ...options
3780
+ };
4176
3781
  const elementId = this.options.id;
4177
3782
  this.el = null;
3783
+
4178
3784
  // bind this to call
4179
3785
  this.call = this.tooltipHandler.bind(this);
3786
+
4180
3787
  // prepend a default stylesheet for tooltips to the head
4181
3788
  if (!this.options.disableDefaultStyle && !document.getElementById(this.options.styleId)) {
4182
3789
  const style = document.createElement('style');
@@ -4190,28 +3797,32 @@
4190
3797
  }
4191
3798
  }
4192
3799
  }
3800
+
4193
3801
  /**
4194
3802
  * The tooltip handler function.
4195
3803
  */
4196
3804
  tooltipHandler(handler, event, item, value) {
4197
3805
  // console.log(handler, event, item, value);
4198
- var _a;
3806
+
4199
3807
  // append a div element that we use as a tooltip unless it already exists
4200
3808
  this.el = document.getElementById(this.options.id);
4201
3809
  if (!this.el) {
4202
3810
  this.el = document.createElement('div');
4203
3811
  this.el.setAttribute('id', this.options.id);
4204
3812
  this.el.classList.add('vg-tooltip');
4205
- const tooltipContainer = (_a = document.fullscreenElement) !== null && _a !== void 0 ? _a : document.body;
3813
+ const tooltipContainer = document.fullscreenElement ?? document.body;
4206
3814
  tooltipContainer.appendChild(this.el);
4207
3815
  }
3816
+
4208
3817
  // hide tooltip for null, undefined, or empty string values
4209
3818
  if (value == null || value === '') {
4210
3819
  this.el.classList.remove('visible', `${this.options.theme}-theme`);
4211
3820
  return;
4212
3821
  }
3822
+
4213
3823
  // set the tooltip content
4214
- this.el.innerHTML = this.options.formatTooltip(value, this.options.sanitize, this.options.maxDepth);
3824
+ this.el.innerHTML = this.options.formatTooltip(value, this.options.sanitize, this.options.maxDepth, this.options.baseURL);
3825
+
4215
3826
  // make the tooltip visible
4216
3827
  this.el.classList.add('visible', `${this.options.theme}-theme`);
4217
3828
  const {
@@ -4378,20 +3989,10 @@
4378
3989
  }
4379
3990
  `;
4380
3991
 
4381
- // polyfill for IE
4382
- if (!String.prototype.startsWith) {
4383
- // eslint-disable-next-line no-extend-native,func-names
4384
- String.prototype.startsWith = function (search, pos) {
4385
- return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
4386
- };
4387
- }
4388
3992
  function isURL(s) {
4389
3993
  return s.startsWith('http://') || s.startsWith('https://') || s.startsWith('//');
4390
3994
  }
4391
- function mergeDeep(dest) {
4392
- for (var _len = arguments.length, src = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
4393
- src[_key - 1] = arguments[_key];
4394
- }
3995
+ function mergeDeep(dest, ...src) {
4395
3996
  for (const s of src) {
4396
3997
  deepMerge_(dest, s);
4397
3998
  }
@@ -4404,7 +4005,7 @@
4404
4005
  }
4405
4006
 
4406
4007
  var name = "vega-embed";
4407
- var version$1 = "6.21.3";
4008
+ var version$1 = "6.26.0";
4408
4009
  var description = "Publish Vega visualizations as embedded web components.";
4409
4010
  var keywords = ["vega", "data", "visualization", "component", "embed"];
4410
4011
  var repository = {
@@ -4429,31 +4030,53 @@
4429
4030
  var unpkg = "build/vega-embed.min.js";
4430
4031
  var jsdelivr = "build/vega-embed.min.js";
4431
4032
  var types = "build/vega-embed.module.d.ts";
4432
- var files = ["src", "build", "build-es5", "patches"];
4033
+ var files = ["src", "build"];
4034
+ var exports$1 = {
4035
+ ".": {
4036
+ "import": {
4037
+ types: "./build/vega-embed.module.d.ts",
4038
+ "default": "./build/vega-embed.module.js"
4039
+ },
4040
+ require: {
4041
+ "default": "./build/vega-embed.js"
4042
+ }
4043
+ }
4044
+ };
4433
4045
  var devDependencies = {
4434
- "@babel/plugin-transform-runtime": "^7.19.6",
4435
- "@release-it/conventional-changelog": "^5.1.1",
4436
- "@rollup/plugin-commonjs": "24.0.1",
4437
- "@rollup/plugin-json": "^6.0.0",
4438
- "@rollup/plugin-node-resolve": "^15.0.1",
4439
- "@rollup/plugin-terser": "^0.4.0",
4440
- "@types/semver": "^7.3.13",
4441
- "browser-sync": "^2.27.11",
4442
- concurrently: "^7.6.0",
4443
- "del-cli": "^5.0.0",
4444
- "jest-canvas-mock": "^2.4.0",
4445
- "jest-environment-jsdom": "^29.4.3",
4446
- "patch-package": "^6.5.1",
4046
+ "@babel/core": "^7.24.7",
4047
+ "@babel/eslint-parser": "^7.24.7",
4048
+ "@babel/plugin-transform-runtime": "^7.24.7",
4049
+ "@babel/preset-env": "^7.24.7",
4050
+ "@babel/preset-typescript": "^7.24.7",
4051
+ "@release-it/conventional-changelog": "^8.0.1",
4052
+ "@rollup/plugin-commonjs": "26.0.1",
4053
+ "@rollup/plugin-json": "^6.1.0",
4054
+ "@rollup/plugin-node-resolve": "^15.2.3",
4055
+ "@rollup/plugin-terser": "^0.4.4",
4056
+ "@types/semver": "^7.5.8",
4057
+ "@typescript-eslint/parser": "^7.15.0",
4058
+ "@vitest/coverage-v8": "^1.6.0",
4059
+ "browser-sync": "^3.0.2",
4060
+ concurrently: "^8.2.2",
4061
+ "del-cli": "^5.1.0",
4062
+ eslint: "^9.6.0",
4063
+ "eslint-config-prettier": "^9.1.0",
4064
+ "eslint-plugin-prettier": "^5.1.3",
4065
+ "eslint-plugin-vitest": "^0.5.4",
4066
+ jsdom: "^24.1.0",
4447
4067
  "postinstall-postinstall": "^2.1.0",
4448
- "release-it": "^15.6.0",
4068
+ prettier: "^3.3.2",
4069
+ "release-it": "^17.4.1",
4070
+ rollup: "4.18.0",
4449
4071
  "rollup-plugin-bundle-size": "^1.0.3",
4450
- "rollup-plugin-ts": "^3.2.0",
4451
- rollup: "3.15.0",
4452
- sass: "^1.58.1",
4453
- typescript: "^4.9.5",
4454
- "vega-lite-dev-config": "^0.21.0",
4455
- "vega-lite": "^5.2.0",
4456
- vega: "^5.22.1"
4072
+ "rollup-plugin-ts": "^3.4.5",
4073
+ sass: "^1.77.6",
4074
+ typescript: "^5.5.3",
4075
+ "typescript-eslint": "^7.15.0",
4076
+ vega: "^5.30.0",
4077
+ "vega-lite": "^5.19.0",
4078
+ vitest: "^1.6.0",
4079
+ "vitest-canvas-mock": "^0.3.3"
4457
4080
  };
4458
4081
  var peerDependencies = {
4459
4082
  vega: "^5.21.0",
@@ -4462,31 +4085,27 @@
4462
4085
  var dependencies = {
4463
4086
  "fast-json-patch": "^3.1.1",
4464
4087
  "json-stringify-pretty-compact": "^3.0.0",
4465
- semver: "^7.3.8",
4466
- tslib: "^2.5.0",
4467
- "vega-interpreter": "^1.0.4",
4088
+ semver: "^7.6.2",
4089
+ tslib: "^2.6.3",
4090
+ "vega-interpreter": "^1.0.5",
4468
4091
  "vega-schema-url-parser": "^2.2.0",
4469
- "vega-themes": "^2.12.1",
4470
- "vega-tooltip": "^0.30.1"
4092
+ "vega-themes": "^2.15.0",
4093
+ "vega-tooltip": "^0.34.0"
4471
4094
  };
4472
- var bundledDependencies = ["yallist"];
4473
4095
  var scripts = {
4474
4096
  prebuild: "yarn clean && yarn build:style",
4475
4097
  build: "rollup -c",
4476
4098
  "build:style": "./build-style.sh",
4477
- clean: "del-cli build build-es5 src/style.ts",
4099
+ clean: "del-cli build src/style.ts",
4478
4100
  prepublishOnly: "yarn clean && yarn build",
4479
4101
  preversion: "yarn lint && yarn test",
4480
4102
  serve: "browser-sync start --directory -s -f build *.html",
4481
4103
  start: "yarn build && concurrently --kill-others -n Server,Rollup 'yarn serve' 'rollup -c -w'",
4482
4104
  pretest: "yarn build:style",
4483
- test: "beemo jest --stdio stream",
4484
- "test:inspect": "node --inspect-brk ./node_modules/.bin/jest --runInBand",
4485
- prepare: "beemo create-config && npx patch-package",
4486
- prettierbase: "beemo prettier '*.{css,scss,html}'",
4487
- eslintbase: "beemo eslint .",
4488
- format: "yarn eslintbase --fix && yarn prettierbase --write",
4489
- lint: "yarn eslintbase && yarn prettierbase --check",
4105
+ test: "vitest run",
4106
+ prettierbase: "prettier '*.{css,scss,html}'",
4107
+ format: "eslint . --fix && yarn prettierbase --write",
4108
+ lint: "eslint . && yarn prettierbase --check",
4490
4109
  release: "release-it"
4491
4110
  };
4492
4111
  var pkg = {
@@ -4506,21 +4125,20 @@
4506
4125
  jsdelivr: jsdelivr,
4507
4126
  types: types,
4508
4127
  files: files,
4128
+ exports: exports$1,
4509
4129
  devDependencies: devDependencies,
4510
4130
  peerDependencies: peerDependencies,
4511
4131
  dependencies: dependencies,
4512
- bundledDependencies: bundledDependencies,
4513
4132
  scripts: scripts
4514
4133
  };
4515
4134
 
4516
- var _w$vl;
4517
4135
  const version = pkg.version;
4518
4136
  const vega = vegaImport__namespace;
4519
4137
  let vegaLite = vegaLiteImport__namespace;
4520
4138
 
4521
4139
  // For backwards compatibility with Vega-Lite before v4.
4522
4140
  const w = typeof window !== 'undefined' ? window : undefined;
4523
- if (vegaLite === undefined && w !== null && w !== void 0 && (_w$vl = w.vl) !== null && _w$vl !== void 0 && _w$vl.compile) {
4141
+ if (vegaLite === undefined && w?.vl?.compile) {
4524
4142
  vegaLite = w.vl;
4525
4143
  }
4526
4144
  const DEFAULT_ACTIONS = {
@@ -4586,7 +4204,7 @@
4586
4204
  console.warn(`The given visualization spec is written in ${NAMES[parsed.library]}, but mode argument sets ${NAMES[providedMode] ?? providedMode}.`);
4587
4205
  }
4588
4206
  const mode = parsed.library;
4589
- if (!satisfies_1(VERSION[mode], `^${parsed.version.slice(1)}`)) {
4207
+ if (!satisfies$1(VERSION[mode], `^${parsed.version.slice(1)}`)) {
4590
4208
  console.warn(`The input spec uses ${NAMES[mode]} ${parsed.version}, but the current version of ${NAMES[mode]} is v${VERSION[mode]}.`);
4591
4209
  }
4592
4210
  return mode;
@@ -4608,8 +4226,7 @@
4608
4226
  return isLoader(opts) ? opts : vega.loader(opts);
4609
4227
  }
4610
4228
  function embedOptionsFromUsermeta(parsedSpec) {
4611
- var _parsedSpec$usermeta;
4612
- const opts = ((_parsedSpec$usermeta = parsedSpec.usermeta) === null || _parsedSpec$usermeta === void 0 ? void 0 : _parsedSpec$usermeta.embedOptions) ?? {};
4229
+ const opts = parsedSpec.usermeta?.embedOptions ?? {};
4613
4230
  if (vegaImport.isString(opts.defaultStyle)) {
4614
4231
  // we don't allow styles set via usermeta since it would allow injection of logic (we set the style via innerHTML)
4615
4232
  opts.defaultStyle = false;
@@ -4625,8 +4242,7 @@
4625
4242
  * Object : The Vega/Vega-Lite specification as a parsed JSON object.
4626
4243
  * @param opts A JavaScript object containing options for embedding.
4627
4244
  */
4628
- async function embed(el, spec) {
4629
- let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
4245
+ async function embed(el, spec, opts = {}) {
4630
4246
  let parsedSpec;
4631
4247
  let loader;
4632
4248
  if (vegaImport.isString(spec)) {
@@ -4673,9 +4289,7 @@
4673
4289
  rootContainer: document.head ?? document.body
4674
4290
  };
4675
4291
  }
4676
- async function _embed(el, spec) {
4677
- let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
4678
- let loader = arguments.length > 3 ? arguments[3] : undefined;
4292
+ async function _embed(el, spec, opts = {}, loader) {
4679
4293
  const config = opts.theme ? vegaImport.mergeConfig(themes[opts.theme], opts.config ?? {}) : opts.config;
4680
4294
  const actions = vegaImport.isBoolean(opts.actions) ? opts.actions : mergeDeep({}, DEFAULT_ACTIONS, opts.actions ?? {});
4681
4295
  const i18n = {
@@ -4707,7 +4321,7 @@
4707
4321
  if (mode === 'vega-lite') {
4708
4322
  if (vgSpec.$schema) {
4709
4323
  const parsed = e(vgSpec.$schema);
4710
- if (!satisfies_1(VERSION.vega, `^${parsed.version.slice(1)}`)) {
4324
+ if (!satisfies$1(VERSION.vega, `^${parsed.version.slice(1)}`)) {
4711
4325
  console.warn(`The compiled spec uses Vega ${parsed.version}, but current version is v${VERSION.vega}.`);
4712
4326
  }
4713
4327
  }
@@ -4783,9 +4397,17 @@
4783
4397
  }
4784
4398
  });
4785
4399
  if (opts.tooltip !== false) {
4786
- const handler = isTooltipHandler(opts.tooltip) ? opts.tooltip :
4400
+ const {
4401
+ loader: loader_,
4402
+ tooltip
4403
+ } = opts;
4404
+ const baseURL = loader_ && !isLoader(loader_) ? loader_?.baseURL : undefined;
4405
+ const handler = isTooltipHandler(tooltip) ? tooltip :
4787
4406
  // user provided boolean true or tooltip options
4788
- new Handler(opts.tooltip === true ? {} : opts.tooltip).call;
4407
+ new Handler({
4408
+ baseURL,
4409
+ ...(tooltip === true ? {} : tooltip)
4410
+ }).call;
4789
4411
  view.tooltip(handler);
4790
4412
  }
4791
4413
  let {
@@ -4816,7 +4438,7 @@
4816
4438
  let documentClickHandler;
4817
4439
  if (actions !== false) {
4818
4440
  let wrapper = element;
4819
- if (opts.defaultStyle !== false) {
4441
+ if (opts.defaultStyle !== false || opts.forceActionsMenu) {
4820
4442
  const details = document.createElement('details');
4821
4443
  details.title = i18n.CLICK_TO_VIEW_ACTIONS;
4822
4444
  element.append(details);
@@ -4863,7 +4485,7 @@
4863
4485
  viewSourceLink.text = i18n.SOURCE_ACTION;
4864
4486
  viewSourceLink.href = '#';
4865
4487
  viewSourceLink.addEventListener('click', function (e) {
4866
- viewSource(jsonStringifyPrettyCompact(spec), opts.sourceHeader ?? '', opts.sourceFooter ?? '', mode);
4488
+ viewSource(stringify$1(spec), opts.sourceHeader ?? '', opts.sourceFooter ?? '', mode);
4867
4489
  e.preventDefault();
4868
4490
  });
4869
4491
  ctrl.append(viewSourceLink);
@@ -4875,7 +4497,7 @@
4875
4497
  compileLink.text = i18n.COMPILED_ACTION;
4876
4498
  compileLink.href = '#';
4877
4499
  compileLink.addEventListener('click', function (e) {
4878
- viewSource(jsonStringifyPrettyCompact(vgSpec), opts.sourceHeader ?? '', opts.sourceFooter ?? '', 'vega');
4500
+ viewSource(stringify$1(vgSpec), opts.sourceHeader ?? '', opts.sourceFooter ?? '', 'vega');
4879
4501
  e.preventDefault();
4880
4502
  });
4881
4503
  ctrl.append(compileLink);
@@ -4890,9 +4512,9 @@
4890
4512
  editorLink.addEventListener('click', function (e) {
4891
4513
  post(window, editorUrl, {
4892
4514
  config: config,
4893
- mode,
4515
+ mode: patch ? 'vega' : mode,
4894
4516
  renderer,
4895
- spec: jsonStringifyPrettyCompact(spec)
4517
+ spec: stringify$1(patch ? vgSpec : spec)
4896
4518
  });
4897
4519
  e.preventDefault();
4898
4520
  });
@@ -4920,8 +4542,7 @@
4920
4542
  *
4921
4543
  * The main use case is in [Observable](https://observablehq.com/).
4922
4544
  */
4923
- async function container (spec) {
4924
- let opt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
4545
+ async function container (spec, opt = {}) {
4925
4546
  const wrapper = document.createElement('div');
4926
4547
  wrapper.classList.add('vega-embed-wrapper');
4927
4548
  const div = document.createElement('div');
@@ -4931,11 +4552,11 @@
4931
4552
  source: false,
4932
4553
  compiled: true,
4933
4554
  editor: true,
4934
- ...(opt.actions ?? {})
4555
+ ...opt.actions
4935
4556
  };
4936
4557
  const result = await embed(div, spec, {
4937
4558
  actions,
4938
- ...(opt ?? {})
4559
+ ...opt
4939
4560
  });
4940
4561
  wrapper.value = result.view;
4941
4562
  return wrapper;
@@ -4947,11 +4568,11 @@
4947
4568
  function isElement(obj) {
4948
4569
  return obj instanceof HTMLElement;
4949
4570
  }
4950
- const wrapper = function () {
4951
- if (arguments.length > 1 && (vegaImport.isString(arguments.length <= 0 ? undefined : arguments[0]) && !isURL(arguments.length <= 0 ? undefined : arguments[0]) || isElement(arguments.length <= 0 ? undefined : arguments[0]) || arguments.length === 3)) {
4952
- return embed(arguments.length <= 0 ? undefined : arguments[0], arguments.length <= 1 ? undefined : arguments[1], arguments.length <= 2 ? undefined : arguments[2]);
4571
+ const wrapper = (...args) => {
4572
+ if (args.length > 1 && (vegaImport.isString(args[0]) && !isURL(args[0]) || isElement(args[0]) || args.length === 3)) {
4573
+ return embed(args[0], args[1], args[2]);
4953
4574
  }
4954
- return container(arguments.length <= 0 ? undefined : arguments[0], arguments.length <= 1 ? undefined : arguments[1]);
4575
+ return container(args[0], args[1]);
4955
4576
  };
4956
4577
  wrapper.vegaLite = vegaLite;
4957
4578
  wrapper.vl = vegaLite; // backwards compatibility