@cosmotech/core 1.12.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## **1.14.0**&emsp;<sub><sup>2023-09-29 (bbcde1f419e4df5189974e7e9f0bbdb50c29f34d...07ada074524a18d23c39792b735590832414324e)</sup></sub>
2
+
3
+ ### Features
4
+ * add isExtensionInFileTypeFilter function ([bbcde1f](https://github.com/Cosmo-Tech/webapp-component-core/commit/bbcde1f419e4df5189974e7e9f0bbdb50c29f34d))
5
+ * add a function to assign headerName to all columns ([6dff900](https://github.com/Cosmo-Tech/webapp-component-core/commit/6dff900755e3900e03145ca8ae3b1d7edb0d434b))
6
+
7
+ ### Bug Fixes
8
+ * fix error thrown by getExtensionFromFileName when input is not a string ([ad604df](https://github.com/Cosmo-Tech/webapp-component-core/commit/ad604df1facb1155ccc51aac1edadaf71721f779))
9
+ * fix Excel file parsing when columns don't have types defined ([4037f68](https://github.com/Cosmo-Tech/webapp-component-core/commit/4037f689e81d0a5e9719feb500445729fa904064))
10
+
11
+ <br>
12
+
13
+ ## **1.13.0** <sub><sup>2023-09-22 (9dd046f...45122b9)</sup></sub>
14
+
15
+ ### Features
16
+
17
+ - add utils functions for dates and timezones ([f784395](https://github.com/Cosmo-Tech/webapp-component-core/commit/f784395))
18
+
1
19
  ## **1.12.0** <sub><sup>2023-09-05 (e96188d...05e2b63)</sup></sub>
2
20
 
3
21
  ### Features
package/dist/index.cjs.js CHANGED
@@ -3985,7 +3985,7 @@ var pdre1 = /^(\d+):(\d+)(:\d+)?(\.\d+)?$/; // HH:MM[:SS[.UUU]]
3985
3985
  var pdre2 = /^(\d+)-(\d+)-(\d+)$/; // YYYY-mm-dd
3986
3986
  var pdre3 = /^(\d+)-(\d+)-(\d+)[T ](\d+):(\d+)(:\d+)?(\.\d+)?$/; // YYYY-mm-dd(T or space)HH:MM[:SS[.UUU]], sans "Z"
3987
3987
  /* parses a date string as a UTC date */
3988
- function parseDate(str/*:string*/, date1904/*:boolean*/)/*:Date*/ {
3988
+ function parseDate$1(str/*:string*/, date1904/*:boolean*/)/*:Date*/ {
3989
3989
  if(str instanceof Date) return str;
3990
3990
  var m = str.match(pdre1);
3991
3991
  if(m) return new Date((date1904 ? dnthresh2 : dnthresh1) + ((parseInt(m[1], 10)*60 + parseInt(m[2], 10))*60 + (m[3] ? parseInt(m[3].slice(1), 10) : 0))*1000 + (m[4] ? parseInt((m[4]+"000").slice(1,4), 10) : 0));
@@ -6203,7 +6203,7 @@ function parse_core_props(data) {
6203
6203
  for(var i = 0; i < CORE_PROPS.length; ++i) {
6204
6204
  var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);
6205
6205
  if(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);
6206
- if(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);
6206
+ if(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate$1(p[f[1]]);
6207
6207
  }
6208
6208
 
6209
6209
  return p;
@@ -6389,7 +6389,7 @@ function parse_cust_props(data/*:string*/, opts) {
6389
6389
  p[name] = parseFloat(text);
6390
6390
  break;
6391
6391
  case 'filetime': case 'date':
6392
- p[name] = parseDate(text);
6392
+ p[name] = parseDate$1(text);
6393
6393
  break;
6394
6394
  case 'cy': case 'error':
6395
6395
  p[name] = unescapexml(text);
@@ -6754,7 +6754,7 @@ function parse_PropertySet(blob, PIDSI) {
6754
6754
  case 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;
6755
6755
  case 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;
6756
6756
  case 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;
6757
- case 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break;
6757
+ case 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate$1(parse_FILETIME(blob)); break;
6758
6758
  default: throw new Error("unparsed value: " + blob[blob.l]);
6759
6759
  }
6760
6760
  PropH[name] = val;
@@ -8930,7 +8930,7 @@ var SYLK = /*#__PURE__*/(function() {
8930
8930
  if(cell.f && !cell.F) o += ";E" + a1_to_rc(cell.f, {r:R, c:C}); break;
8931
8931
  case 'b': o += cell.v ? "TRUE" : "FALSE"; break;
8932
8932
  case 'e': o += cell.w || cell.v; break;
8933
- case 'd': o += datenum(parseDate(cell.v, date1904), date1904); break;
8933
+ case 'd': o += datenum(parseDate$1(cell.v, date1904), date1904); break;
8934
8934
  case 's': o += '"' + (cell.v == null ? "" : String(cell.v)).replace(/"/g,"").replace(/;/g, ";;") + '"'; break;
8935
8935
  }
8936
8936
  return o;
@@ -9053,7 +9053,7 @@ var DIF = /*#__PURE__*/(function() {
9053
9053
  else if(data === 'FALSE') arr[R][C] = false;
9054
9054
  else if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);
9055
9055
  else if(!isNaN(fuzzydate(value).getDate())) {
9056
- arr[R][C] = parseDate(value);
9056
+ arr[R][C] = parseDate$1(value);
9057
9057
  if(!(opts && opts.UTC)) { arr[R][C] = utc_to_local(arr[R][C]); }
9058
9058
  }
9059
9059
  else arr[R][C] = value;
@@ -9111,7 +9111,7 @@ var DIF = /*#__PURE__*/(function() {
9111
9111
  p +=(make_value_str((isNaN(+cell.v)) ? cell.v : '="' + cell.v + '"'));
9112
9112
  break;
9113
9113
  case 'd':
9114
- if(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate(cell.v)));
9114
+ if(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate$1(cell.v)));
9115
9115
  p +=(make_value(cell.w, "V"));
9116
9116
  break;
9117
9117
  default: p +=("1,0\r\n\"\"");
@@ -9202,7 +9202,7 @@ var ETH = /*#__PURE__*/(function() {
9202
9202
  oo[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));
9203
9203
  break;
9204
9204
  case 'd':
9205
- var t = datenum(parseDate(cell.v));
9205
+ var t = datenum(parseDate$1(cell.v));
9206
9206
  oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t;
9207
9207
  oo[5] = cell.w || SSF_format(cell.z || table_fmt[14], t);
9208
9208
  break;
@@ -9236,7 +9236,7 @@ var PRN = /*#__PURE__*/(function() {
9236
9236
  else if(data === 'TRUE') arr[R][C] = true;
9237
9237
  else if(data === 'FALSE') arr[R][C] = false;
9238
9238
  else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);
9239
- else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);
9239
+ else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate$1(data);
9240
9240
  else arr[R][C] = data;
9241
9241
  }
9242
9242
 
@@ -9347,7 +9347,7 @@ var PRN = /*#__PURE__*/(function() {
9347
9347
  else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; cell.v = v; }
9348
9348
  else if(!isNaN((v = fuzzydate(s)).getDate()) || _re && s.match(_re)) {
9349
9349
  cell.z = o.dateNF || table_fmt[14];
9350
- if(_re && s.match(_re)){ var news=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); v = parseDate(news); if(o && o.UTC === false) v = utc_to_local(v); }
9350
+ if(_re && s.match(_re)){ var news=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); v = parseDate$1(news); if(o && o.UTC === false) v = utc_to_local(v); }
9351
9351
  else if(o && o.UTC === false) v = utc_to_local(v);
9352
9352
  else if(o.cellText !== false && o.dateNF) cell.w = SSF_format(cell.z, v);
9353
9353
  if(o.cellDates) { cell.t = 'd'; cell.v = v; }
@@ -16044,7 +16044,7 @@ function safe_format(p/*:Cell*/, fmtid/*:number*/, fillid/*:?number*/, opts, the
16044
16044
  if(opts.cellNF) p.z = table_fmt[fmtid];
16045
16045
  } catch(e) { if(opts.WTF) throw e; }
16046
16046
  if(p.t === 'z' && !opts.cellStyles) return;
16047
- if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
16047
+ if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate$1(p.v);
16048
16048
  if((!opts || opts.cellText !== false) && p.t !== 'z') try {
16049
16049
  if(table_fmt[fmtid] == null) SSF__load(SSFImplicit[fmtid] || "General", fmtid);
16050
16050
  if(p.t === 'e') p.w = p.w || BErr[p.v];
@@ -16361,13 +16361,13 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts, idx, wb, date1904)/*:st
16361
16361
  case 'e': vv = BErr[cell.v]; break;
16362
16362
  case 'd':
16363
16363
  if(opts && opts.cellDates) {
16364
- var _vv = parseDate(cell.v, date1904);
16364
+ var _vv = parseDate$1(cell.v, date1904);
16365
16365
  vv = _vv.toISOString();
16366
16366
  if(_vv.getUTCFullYear() < 1900) vv = vv.slice(vv.indexOf("T") + 1).replace("Z","");
16367
16367
  } else {
16368
16368
  cell = dup(cell);
16369
16369
  cell.t = 'n';
16370
- vv = ''+(cell.v = datenum(parseDate(cell.v, date1904), date1904));
16370
+ vv = ''+(cell.v = datenum(parseDate$1(cell.v, date1904), date1904));
16371
16371
  }
16372
16372
  if(typeof cell.z === 'undefined') cell.z = table_fmt[14];
16373
16373
  break;
@@ -16566,8 +16566,8 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th
16566
16566
  break;
16567
16567
  case 'b': p.v = parsexmlbool(p.v); break;
16568
16568
  case 'd':
16569
- if(opts.cellDates) p.v = parseDate(p.v, date1904);
16570
- else { p.v = datenum(parseDate(p.v, date1904), date1904); p.t = 'n'; }
16569
+ if(opts.cellDates) p.v = parseDate$1(p.v, date1904);
16570
+ else { p.v = datenum(parseDate$1(p.v, date1904), date1904); p.t = 'n'; }
16571
16571
  break;
16572
16572
  /* error string in .w, number in .v */
16573
16573
  case 'e':
@@ -17589,7 +17589,7 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num
17589
17589
  case 'd': // no BrtCellDate :(
17590
17590
  cell = dup(cell);
17591
17591
  cell.z = cell.z || table_fmt[14];
17592
- cell.v = datenum(parseDate(cell.v, date1904), date1904); cell.t = 'n';
17592
+ cell.v = datenum(parseDate$1(cell.v, date1904), date1904); cell.t = 'n';
17593
17593
  break;
17594
17594
  /* falls through */
17595
17595
  case 'n': case 'e': vv = ''+cell.v; break;
@@ -18826,7 +18826,7 @@ function xlml_set_custprop(Custprops, key, cp, val/*:string*/) {
18826
18826
  case "boolean": oval = parsexmlbool(val); break;
18827
18827
  case "i2": case "int": oval = parseInt(val, 10); break;
18828
18828
  case "r4": case "float": oval = parseFloat(val); break;
18829
- case "date": case "dateTime.tz": oval = parseDate(val); break;
18829
+ case "date": case "dateTime.tz": oval = parseDate$1(val); break;
18830
18830
  case "i8": case "string": case "fixed": case "uuid": case "bin.base64": break;
18831
18831
  default: throw new Error("bad custprop:" + cp[0]);
18832
18832
  }
@@ -18889,7 +18889,7 @@ function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, a
18889
18889
  break;
18890
18890
  case 'DateTime':
18891
18891
  if(xml.slice(-1) != "Z") xml += "Z";
18892
- cell.v = datenum(parseDate(xml, date1904), date1904);
18892
+ cell.v = datenum(parseDate$1(xml, date1904), date1904);
18893
18893
  if(cell.v !== cell.v) cell.v = unescapexml(xml);
18894
18894
  if(!nf || nf == "General") nf = "yyyy-mm-dd";
18895
18895
  /* falls through */
@@ -22169,7 +22169,7 @@ function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n
22169
22169
  }
22170
22170
  if(cell.v != null) switch(cell.t) {
22171
22171
  case 'd': case 'n':
22172
- var v = cell.t == 'd' ? datenum(parseDate(cell.v, date1904), date1904) : cell.v;
22172
+ var v = cell.t == 'd' ? datenum(parseDate$1(cell.v, date1904), date1904) : cell.v;
22173
22173
  if(opts.biff == 2 && (v == (v|0)) && (v >= 0) && (v < 65536))
22174
22174
  // 0x027E (RK) in BIFF3/4
22175
22175
  write_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v, ixfe, ifmt));
@@ -22579,7 +22579,7 @@ function write_ws_biff8_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n
22579
22579
  if(cell.bf) write_biff_rec(ba, 0x0006 /* Formula */, write_Formula(cell, R, C, opts, os));
22580
22580
  else switch(cell.t) {
22581
22581
  case 'd': case 'n':
22582
- var v = cell.t == 'd' ? datenum(parseDate(cell.v, date1904), date1904) : cell.v;
22582
+ var v = cell.t == 'd' ? datenum(parseDate$1(cell.v, date1904), date1904) : cell.v;
22583
22583
  if(isNaN(v)) write_biff_rec(ba, 0x0205 /* BoolErr */, write_BoolErr(R, C, 0x24, os, opts, "e")); // #NUM!
22584
22584
  else if(!isFinite(v)) write_biff_rec(ba, 0x0205 /* BoolErr */, write_BoolErr(R, C, 0x07, os, opts, "e")); // #DIV/0!
22585
22585
  /* TODO: emit RK as appropriate */
@@ -22853,7 +22853,7 @@ function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ {
22853
22853
  else if(m === 'FALSE') o = {t:'b', v:false};
22854
22854
  else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
22855
22855
  else if(!isNaN(fuzzydate(m).getDate())) {
22856
- o = ({t:'d', v:parseDate(m)}/*:any*/);
22856
+ o = ({t:'d', v:parseDate$1(m)}/*:any*/);
22857
22857
  if(opts.UTC === false) o.v = utc_to_local(o.v);
22858
22858
  if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);
22859
22859
  o.z = opts.dateNF || table_fmt[14];
@@ -22998,7 +22998,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/
22998
22998
  else if(v === 'FALSE') o = {t:'b', v:false};
22999
22999
  else if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};
23000
23000
  else if(!isNaN(fuzzydate(v).getDate())) {
23001
- o = ({t:'d', v:parseDate(v)}/*:any*/);
23001
+ o = ({t:'d', v:parseDate$1(v)}/*:any*/);
23002
23002
  if(opts.UTC) o.v = local_to_utc(o.v);
23003
23003
  if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);
23004
23004
  o.z = opts.dateNF || table_fmt[14];
@@ -23428,7 +23428,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ {
23428
23428
  break;
23429
23429
  case 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break;
23430
23430
  case 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break;
23431
- case 'date': q.t = 'd'; q.v = parseDate(ctag['date-value'], WB.WBProps.date1904);
23431
+ case 'date': q.t = 'd'; q.v = parseDate$1(ctag['date-value'], WB.WBProps.date1904);
23432
23432
  if(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v, WB.WBProps.date1904); }
23433
23433
  if(!q.z) q.z = 'm/d/yy'; break;
23434
23434
  /* NOTE: for `time`, Excel ODS export incorrectly uses durations relative to 1900 epoch even if 1904 is specified */
@@ -24114,9 +24114,9 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function
24114
24114
  ct['office:value-type'] = "string";
24115
24115
  break;
24116
24116
  case 'd':
24117
- textp = (cell.w||(parseDate(cell.v, date1904).toISOString()));
24117
+ textp = (cell.w||(parseDate$1(cell.v, date1904).toISOString()));
24118
24118
  ct['office:value-type'] = "date";
24119
- ct['office:date-value'] = (parseDate(cell.v, date1904).toISOString());
24119
+ ct['office:date-value'] = (parseDate$1(cell.v, date1904).toISOString());
24120
24120
  ct['table:style-name'] = "ce1";
24121
24121
  break;
24122
24122
  //case 'e': // TODO: translate to ODS errors
@@ -30680,7 +30680,7 @@ function normalizeTwoDigitYear(twoDigitYear, currentYear) {
30680
30680
  }
30681
30681
  return isCommonEra ? result : 1 - result;
30682
30682
  }
30683
- function isLeapYearIndex(year) {
30683
+ function isLeapYearIndex$1(year) {
30684
30684
  return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
30685
30685
  }
30686
30686
 
@@ -31319,7 +31319,7 @@ var DateParser = /*#__PURE__*/function (_Parser) {
31319
31319
  key: "validate",
31320
31320
  value: function validate(date, value) {
31321
31321
  var year = date.getUTCFullYear();
31322
- var isLeapYear = isLeapYearIndex(year);
31322
+ var isLeapYear = isLeapYearIndex$1(year);
31323
31323
  var month = date.getUTCMonth();
31324
31324
  if (isLeapYear) {
31325
31325
  return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];
@@ -31372,7 +31372,7 @@ var DayOfYearParser = /*#__PURE__*/function (_Parser) {
31372
31372
  key: "validate",
31373
31373
  value: function validate(date, value) {
31374
31374
  var year = date.getUTCFullYear();
31375
- var isLeapYear = isLeapYearIndex(year);
31375
+ var isLeapYear = isLeapYearIndex$1(year);
31376
31376
  if (isLeapYear) {
31377
31377
  return value >= 1 && value <= 366;
31378
31378
  } else {
@@ -33274,9 +33274,256 @@ function isMatch(dateString, formatString, options) {
33274
33274
  return isValid$2(parse$1(dateString, formatString, new Date(), options));
33275
33275
  }
33276
33276
 
33277
+ /**
33278
+ * @name parseISO
33279
+ * @category Common Helpers
33280
+ * @summary Parse ISO string
33281
+ *
33282
+ * @description
33283
+ * Parse the given string in ISO 8601 format and return an instance of Date.
33284
+ *
33285
+ * Function accepts complete ISO 8601 formats as well as partial implementations.
33286
+ * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601
33287
+ *
33288
+ * If the argument isn't a string, the function cannot parse the string or
33289
+ * the values are invalid, it returns Invalid Date.
33290
+ *
33291
+ * @param {String} argument - the value to convert
33292
+ * @param {Object} [options] - an object with options.
33293
+ * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format
33294
+ * @returns {Date} the parsed date in the local time zone
33295
+ * @throws {TypeError} 1 argument required
33296
+ * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2
33297
+ *
33298
+ * @example
33299
+ * // Convert string '2014-02-11T11:30:30' to date:
33300
+ * const result = parseISO('2014-02-11T11:30:30')
33301
+ * //=> Tue Feb 11 2014 11:30:30
33302
+ *
33303
+ * @example
33304
+ * // Convert string '+02014101' to date,
33305
+ * // if the additional number of digits in the extended year format is 1:
33306
+ * const result = parseISO('+02014101', { additionalDigits: 1 })
33307
+ * //=> Fri Apr 11 2014 00:00:00
33308
+ */
33309
+ function parseISO$1(argument, options) {
33310
+ var _options$additionalDi;
33311
+ requiredArgs(1, arguments);
33312
+ var additionalDigits = toInteger((_options$additionalDi = options === null || options === void 0 ? void 0 : options.additionalDigits) !== null && _options$additionalDi !== void 0 ? _options$additionalDi : 2);
33313
+ if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {
33314
+ throw new RangeError('additionalDigits must be 0, 1 or 2');
33315
+ }
33316
+ if (!(typeof argument === 'string' || Object.prototype.toString.call(argument) === '[object String]')) {
33317
+ return new Date(NaN);
33318
+ }
33319
+ var dateStrings = splitDateString(argument);
33320
+ var date;
33321
+ if (dateStrings.date) {
33322
+ var parseYearResult = parseYear(dateStrings.date, additionalDigits);
33323
+ date = parseDate(parseYearResult.restDateString, parseYearResult.year);
33324
+ }
33325
+ if (!date || isNaN(date.getTime())) {
33326
+ return new Date(NaN);
33327
+ }
33328
+ var timestamp = date.getTime();
33329
+ var time = 0;
33330
+ var offset;
33331
+ if (dateStrings.time) {
33332
+ time = parseTime(dateStrings.time);
33333
+ if (isNaN(time)) {
33334
+ return new Date(NaN);
33335
+ }
33336
+ }
33337
+ if (dateStrings.timezone) {
33338
+ offset = parseTimezone(dateStrings.timezone);
33339
+ if (isNaN(offset)) {
33340
+ return new Date(NaN);
33341
+ }
33342
+ } else {
33343
+ var dirtyDate = new Date(timestamp + time);
33344
+ // js parsed string assuming it's in UTC timezone
33345
+ // but we need it to be parsed in our timezone
33346
+ // so we use utc values to build date in our timezone.
33347
+ // Year values from 0 to 99 map to the years 1900 to 1999
33348
+ // so set year explicitly with setFullYear.
33349
+ var result = new Date(0);
33350
+ result.setFullYear(dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate());
33351
+ result.setHours(dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds());
33352
+ return result;
33353
+ }
33354
+ return new Date(timestamp + time + offset);
33355
+ }
33356
+ var patterns$1 = {
33357
+ dateTimeDelimiter: /[T ]/,
33358
+ timeZoneDelimiter: /[Z ]/i,
33359
+ timezone: /([Z+-].*)$/
33360
+ };
33361
+ var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/;
33362
+ var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/;
33363
+ var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/;
33364
+ function splitDateString(dateString) {
33365
+ var dateStrings = {};
33366
+ var array = dateString.split(patterns$1.dateTimeDelimiter);
33367
+ var timeString;
33368
+
33369
+ // The regex match should only return at maximum two array elements.
33370
+ // [date], [time], or [date, time].
33371
+ if (array.length > 2) {
33372
+ return dateStrings;
33373
+ }
33374
+ if (/:/.test(array[0])) {
33375
+ timeString = array[0];
33376
+ } else {
33377
+ dateStrings.date = array[0];
33378
+ timeString = array[1];
33379
+ if (patterns$1.timeZoneDelimiter.test(dateStrings.date)) {
33380
+ dateStrings.date = dateString.split(patterns$1.timeZoneDelimiter)[0];
33381
+ timeString = dateString.substr(dateStrings.date.length, dateString.length);
33382
+ }
33383
+ }
33384
+ if (timeString) {
33385
+ var token = patterns$1.timezone.exec(timeString);
33386
+ if (token) {
33387
+ dateStrings.time = timeString.replace(token[1], '');
33388
+ dateStrings.timezone = token[1];
33389
+ } else {
33390
+ dateStrings.time = timeString;
33391
+ }
33392
+ }
33393
+ return dateStrings;
33394
+ }
33395
+ function parseYear(dateString, additionalDigits) {
33396
+ var regex = new RegExp('^(?:(\\d{4}|[+-]\\d{' + (4 + additionalDigits) + '})|(\\d{2}|[+-]\\d{' + (2 + additionalDigits) + '})$)');
33397
+ var captures = dateString.match(regex);
33398
+ // Invalid ISO-formatted year
33399
+ if (!captures) return {
33400
+ year: NaN,
33401
+ restDateString: ''
33402
+ };
33403
+ var year = captures[1] ? parseInt(captures[1]) : null;
33404
+ var century = captures[2] ? parseInt(captures[2]) : null;
33405
+
33406
+ // either year or century is null, not both
33407
+ return {
33408
+ year: century === null ? year : century * 100,
33409
+ restDateString: dateString.slice((captures[1] || captures[2]).length)
33410
+ };
33411
+ }
33412
+ function parseDate(dateString, year) {
33413
+ // Invalid ISO-formatted year
33414
+ if (year === null) return new Date(NaN);
33415
+ var captures = dateString.match(dateRegex);
33416
+ // Invalid ISO-formatted string
33417
+ if (!captures) return new Date(NaN);
33418
+ var isWeekDate = !!captures[4];
33419
+ var dayOfYear = parseDateUnit(captures[1]);
33420
+ var month = parseDateUnit(captures[2]) - 1;
33421
+ var day = parseDateUnit(captures[3]);
33422
+ var week = parseDateUnit(captures[4]);
33423
+ var dayOfWeek = parseDateUnit(captures[5]) - 1;
33424
+ if (isWeekDate) {
33425
+ if (!validateWeekDate(year, week, dayOfWeek)) {
33426
+ return new Date(NaN);
33427
+ }
33428
+ return dayOfISOWeekYear(year, week, dayOfWeek);
33429
+ } else {
33430
+ var date = new Date(0);
33431
+ if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) {
33432
+ return new Date(NaN);
33433
+ }
33434
+ date.setUTCFullYear(year, month, Math.max(dayOfYear, day));
33435
+ return date;
33436
+ }
33437
+ }
33438
+ function parseDateUnit(value) {
33439
+ return value ? parseInt(value) : 1;
33440
+ }
33441
+ function parseTime(timeString) {
33442
+ var captures = timeString.match(timeRegex);
33443
+ if (!captures) return NaN; // Invalid ISO-formatted time
33444
+
33445
+ var hours = parseTimeUnit(captures[1]);
33446
+ var minutes = parseTimeUnit(captures[2]);
33447
+ var seconds = parseTimeUnit(captures[3]);
33448
+ if (!validateTime(hours, minutes, seconds)) {
33449
+ return NaN;
33450
+ }
33451
+ return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000;
33452
+ }
33453
+ function parseTimeUnit(value) {
33454
+ return value && parseFloat(value.replace(',', '.')) || 0;
33455
+ }
33456
+ function parseTimezone(timezoneString) {
33457
+ if (timezoneString === 'Z') return 0;
33458
+ var captures = timezoneString.match(timezoneRegex);
33459
+ if (!captures) return 0;
33460
+ var sign = captures[1] === '+' ? -1 : 1;
33461
+ var hours = parseInt(captures[2]);
33462
+ var minutes = captures[3] && parseInt(captures[3]) || 0;
33463
+ if (!validateTimezone(hours, minutes)) {
33464
+ return NaN;
33465
+ }
33466
+ return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);
33467
+ }
33468
+ function dayOfISOWeekYear(isoWeekYear, week, day) {
33469
+ var date = new Date(0);
33470
+ date.setUTCFullYear(isoWeekYear, 0, 4);
33471
+ var fourthOfJanuaryDay = date.getUTCDay() || 7;
33472
+ var diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;
33473
+ date.setUTCDate(date.getUTCDate() + diff);
33474
+ return date;
33475
+ }
33476
+
33477
+ // Validation functions
33478
+
33479
+ // February is null to handle the leap year (using ||)
33480
+ var daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
33481
+ function isLeapYearIndex(year) {
33482
+ return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
33483
+ }
33484
+ function validateDate(year, month, date) {
33485
+ return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));
33486
+ }
33487
+ function validateDayOfYearDate(year, dayOfYear) {
33488
+ return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);
33489
+ }
33490
+ function validateWeekDate(_year, week, day) {
33491
+ return week >= 1 && week <= 53 && day >= 0 && day <= 6;
33492
+ }
33493
+ function validateTime(hours, minutes, seconds) {
33494
+ if (hours === 24) {
33495
+ return minutes === 0 && seconds === 0;
33496
+ }
33497
+ return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;
33498
+ }
33499
+ function validateTimezone(_hours, minutes) {
33500
+ return minutes >= 0 && minutes <= 59;
33501
+ }
33502
+
33277
33503
  // Copyright (c) Cosmo Tech.
33278
33504
  // Licensed under the MIT license.
33279
33505
 
33506
+ var decreaseDateByOffset = (date, offset) => {
33507
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33508
+ return new Date(date - offset * 60 * 1000);
33509
+ };
33510
+ var increaseDateByOffset = (date, offset) => {
33511
+ return decreaseDateByOffset(date, -offset);
33512
+ };
33513
+ var addLocalDateToUTCOffset = date => {
33514
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33515
+ // Example: if local time is 15:00, UTC time is 13:00, timezoneOffset is -120, then we need to "increase" the local
33516
+ // datetime by -120 to find UTC time
33517
+ return increaseDateByOffset(date, date.getTimezoneOffset());
33518
+ };
33519
+ var addUTCToLocalDateOffset = date => {
33520
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33521
+ return decreaseDateByOffset(date, date.getTimezoneOffset());
33522
+ };
33523
+ var getDateAtMidnightUTC = date => {
33524
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33525
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0));
33526
+ };
33280
33527
  var parse = (dateStr, dateFormat) => {
33281
33528
  try {
33282
33529
  return parse$1(dateStr, dateFormat, new Date());
@@ -33284,6 +33531,7 @@ var parse = (dateStr, dateFormat) => {
33284
33531
  console.error(error);
33285
33532
  }
33286
33533
  };
33534
+ var parseISO = dateStr => parseISO$1(dateStr);
33287
33535
  var format = function format(date) {
33288
33536
  var dateFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "yyyy-MM-dd'T'HH:mm:ss.SSSX";
33289
33537
  if (date) {
@@ -33295,9 +33543,24 @@ var format = function format(date) {
33295
33543
  }
33296
33544
  return '';
33297
33545
  };
33546
+ var formatUTCDateAsLocal = function formatUTCDateAsLocal(date) {
33547
+ var dateFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "yyyy-MM-dd'T'HH:mm:ss.SSSX";
33548
+ try {
33549
+ var dateWithReverseOffset = addLocalDateToUTCOffset(date);
33550
+ return format(dateWithReverseOffset, dateFormat);
33551
+ } catch (error) {
33552
+ console.error(error);
33553
+ }
33554
+ return '';
33555
+ };
33556
+
33557
+ // TODO: (breaking change) rename to something like "isFormatValid" to prevent confusion with the check of invalid dates
33298
33558
  var isValid$1 = (dateStr, dateFormat) => {
33299
33559
  return isMatch(dateStr, dateFormat);
33300
33560
  };
33561
+ var isValidDate = date => {
33562
+ return isValid$2(date);
33563
+ };
33301
33564
  var min = (dateA, dateB) => {
33302
33565
  if (dateA && dateB) {
33303
33566
  return dateA < dateB ? dateA : dateB;
@@ -33327,9 +33590,17 @@ var strMax = (dateStrA, dateStrB, dateFormat) => {
33327
33590
  }
33328
33591
  };
33329
33592
  var DateUtils = {
33593
+ decreaseDateByOffset,
33594
+ increaseDateByOffset,
33595
+ addLocalDateToUTCOffset,
33596
+ addUTCToLocalDateOffset,
33597
+ getDateAtMidnightUTC,
33330
33598
  parse,
33599
+ parseISO,
33331
33600
  format,
33601
+ formatUTCDateAsLocal,
33332
33602
  isValid: isValid$1,
33603
+ isValidDate,
33333
33604
  min,
33334
33605
  max,
33335
33606
  strMin,
@@ -33344,7 +33615,8 @@ var _castCellValueToStr = cellValue => {
33344
33615
  };
33345
33616
  var _dateCellsToString = (cols, data, hasHeader, dateFormat) => {
33346
33617
  cols.forEach((column, i) => {
33347
- if (column.type.includes('date')) {
33618
+ var _column$type;
33619
+ if (column !== null && column !== void 0 && (_column$type = column.type) !== null && _column$type !== void 0 && _column$type.includes('date')) {
33348
33620
  for (var j = 0 + hasHeader; j < data.length; j++) {
33349
33621
  var dateCell = data[j][i];
33350
33622
  if (dateCell instanceof Date) {
@@ -41507,6 +41779,18 @@ var getFlattenColumnsWithoutGroups = columns => {
41507
41779
  return columnOrGroup !== null && columnOrGroup !== void 0 && columnOrGroup.children ? getFlattenColumnsWithoutGroups(columnOrGroup.children) : columnOrGroup;
41508
41780
  }).filter(column => column != null);
41509
41781
  };
41782
+ var getColumnsWithHeaderName = columns => {
41783
+ if (!Array.isArray(columns)) {
41784
+ console.warn('Columns list must be an array');
41785
+ return [];
41786
+ }
41787
+ columns.forEach(columnOrGroup => {
41788
+ if (columnOrGroup !== null && columnOrGroup !== void 0 && columnOrGroup.children) getColumnsWithHeaderName(columnOrGroup.children);else {
41789
+ if (columnOrGroup.headerName === undefined) columnOrGroup.headerName = columnOrGroup.field;
41790
+ }
41791
+ });
41792
+ return columns;
41793
+ };
41510
41794
  var _buildEmptyFieldError = (rowLineNumber, expectedCols, colIndex) => {
41511
41795
  var errorSummary = "Empty field";
41512
41796
  var errorLoc = "Line ".concat(rowLineNumber, ", Column ").concat(colIndex + 1, " (\"").concat(expectedCols[colIndex].field, "\")");
@@ -41784,6 +42068,7 @@ var AgGridUtils = {
41784
42068
  fromCSV,
41785
42069
  fromXLSX,
41786
42070
  getFlattenColumnsWithoutGroups,
42071
+ getColumnsWithHeaderName,
41787
42072
  toCSV,
41788
42073
  toXLSX
41789
42074
  };
@@ -41863,7 +42148,7 @@ var getBaseNameFromFileName = fileName => {
41863
42148
  return baseName;
41864
42149
  };
41865
42150
  var getExtensionFromFileName = fileName => {
41866
- if (fileName.indexOf('.') === -1) {
42151
+ if (typeof fileName !== 'string' || fileName.indexOf('.') === -1) {
41867
42152
  return '';
41868
42153
  }
41869
42154
  var nameParts = fileName.split('.');
@@ -41874,9 +42159,15 @@ var getExtensionFromFileName = fileName => {
41874
42159
  }
41875
42160
  return extension;
41876
42161
  };
42162
+ var isExtensionInFileTypeFilter = (extension, fileTypeFilter) => {
42163
+ if (typeof extension !== 'string' || typeof fileTypeFilter !== 'string') return false;
42164
+ var fileTypes = fileTypeFilter.split(',').map(fileType => fileType.replace('.', '').trim());
42165
+ return fileTypes.includes(extension);
42166
+ };
41877
42167
  var PathUtils = {
41878
42168
  getBaseNameFromFileName,
41879
- getExtensionFromFileName
42169
+ getExtensionFromFileName,
42170
+ isExtensionInFileTypeFilter
41880
42171
  };
41881
42172
 
41882
42173
  // Copyright (c) Cosmo Tech.
package/dist/index.esm.js CHANGED
@@ -3983,7 +3983,7 @@ var pdre1 = /^(\d+):(\d+)(:\d+)?(\.\d+)?$/; // HH:MM[:SS[.UUU]]
3983
3983
  var pdre2 = /^(\d+)-(\d+)-(\d+)$/; // YYYY-mm-dd
3984
3984
  var pdre3 = /^(\d+)-(\d+)-(\d+)[T ](\d+):(\d+)(:\d+)?(\.\d+)?$/; // YYYY-mm-dd(T or space)HH:MM[:SS[.UUU]], sans "Z"
3985
3985
  /* parses a date string as a UTC date */
3986
- function parseDate(str/*:string*/, date1904/*:boolean*/)/*:Date*/ {
3986
+ function parseDate$1(str/*:string*/, date1904/*:boolean*/)/*:Date*/ {
3987
3987
  if(str instanceof Date) return str;
3988
3988
  var m = str.match(pdre1);
3989
3989
  if(m) return new Date((date1904 ? dnthresh2 : dnthresh1) + ((parseInt(m[1], 10)*60 + parseInt(m[2], 10))*60 + (m[3] ? parseInt(m[3].slice(1), 10) : 0))*1000 + (m[4] ? parseInt((m[4]+"000").slice(1,4), 10) : 0));
@@ -6201,7 +6201,7 @@ function parse_core_props(data) {
6201
6201
  for(var i = 0; i < CORE_PROPS.length; ++i) {
6202
6202
  var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);
6203
6203
  if(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);
6204
- if(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);
6204
+ if(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate$1(p[f[1]]);
6205
6205
  }
6206
6206
 
6207
6207
  return p;
@@ -6387,7 +6387,7 @@ function parse_cust_props(data/*:string*/, opts) {
6387
6387
  p[name] = parseFloat(text);
6388
6388
  break;
6389
6389
  case 'filetime': case 'date':
6390
- p[name] = parseDate(text);
6390
+ p[name] = parseDate$1(text);
6391
6391
  break;
6392
6392
  case 'cy': case 'error':
6393
6393
  p[name] = unescapexml(text);
@@ -6752,7 +6752,7 @@ function parse_PropertySet(blob, PIDSI) {
6752
6752
  case 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;
6753
6753
  case 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;
6754
6754
  case 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;
6755
- case 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break;
6755
+ case 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate$1(parse_FILETIME(blob)); break;
6756
6756
  default: throw new Error("unparsed value: " + blob[blob.l]);
6757
6757
  }
6758
6758
  PropH[name] = val;
@@ -8928,7 +8928,7 @@ var SYLK = /*#__PURE__*/(function() {
8928
8928
  if(cell.f && !cell.F) o += ";E" + a1_to_rc(cell.f, {r:R, c:C}); break;
8929
8929
  case 'b': o += cell.v ? "TRUE" : "FALSE"; break;
8930
8930
  case 'e': o += cell.w || cell.v; break;
8931
- case 'd': o += datenum(parseDate(cell.v, date1904), date1904); break;
8931
+ case 'd': o += datenum(parseDate$1(cell.v, date1904), date1904); break;
8932
8932
  case 's': o += '"' + (cell.v == null ? "" : String(cell.v)).replace(/"/g,"").replace(/;/g, ";;") + '"'; break;
8933
8933
  }
8934
8934
  return o;
@@ -9051,7 +9051,7 @@ var DIF = /*#__PURE__*/(function() {
9051
9051
  else if(data === 'FALSE') arr[R][C] = false;
9052
9052
  else if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);
9053
9053
  else if(!isNaN(fuzzydate(value).getDate())) {
9054
- arr[R][C] = parseDate(value);
9054
+ arr[R][C] = parseDate$1(value);
9055
9055
  if(!(opts && opts.UTC)) { arr[R][C] = utc_to_local(arr[R][C]); }
9056
9056
  }
9057
9057
  else arr[R][C] = value;
@@ -9109,7 +9109,7 @@ var DIF = /*#__PURE__*/(function() {
9109
9109
  p +=(make_value_str((isNaN(+cell.v)) ? cell.v : '="' + cell.v + '"'));
9110
9110
  break;
9111
9111
  case 'd':
9112
- if(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate(cell.v)));
9112
+ if(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate$1(cell.v)));
9113
9113
  p +=(make_value(cell.w, "V"));
9114
9114
  break;
9115
9115
  default: p +=("1,0\r\n\"\"");
@@ -9200,7 +9200,7 @@ var ETH = /*#__PURE__*/(function() {
9200
9200
  oo[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));
9201
9201
  break;
9202
9202
  case 'd':
9203
- var t = datenum(parseDate(cell.v));
9203
+ var t = datenum(parseDate$1(cell.v));
9204
9204
  oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t;
9205
9205
  oo[5] = cell.w || SSF_format(cell.z || table_fmt[14], t);
9206
9206
  break;
@@ -9234,7 +9234,7 @@ var PRN = /*#__PURE__*/(function() {
9234
9234
  else if(data === 'TRUE') arr[R][C] = true;
9235
9235
  else if(data === 'FALSE') arr[R][C] = false;
9236
9236
  else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);
9237
- else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);
9237
+ else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate$1(data);
9238
9238
  else arr[R][C] = data;
9239
9239
  }
9240
9240
 
@@ -9345,7 +9345,7 @@ var PRN = /*#__PURE__*/(function() {
9345
9345
  else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; cell.v = v; }
9346
9346
  else if(!isNaN((v = fuzzydate(s)).getDate()) || _re && s.match(_re)) {
9347
9347
  cell.z = o.dateNF || table_fmt[14];
9348
- if(_re && s.match(_re)){ var news=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); v = parseDate(news); if(o && o.UTC === false) v = utc_to_local(v); }
9348
+ if(_re && s.match(_re)){ var news=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); v = parseDate$1(news); if(o && o.UTC === false) v = utc_to_local(v); }
9349
9349
  else if(o && o.UTC === false) v = utc_to_local(v);
9350
9350
  else if(o.cellText !== false && o.dateNF) cell.w = SSF_format(cell.z, v);
9351
9351
  if(o.cellDates) { cell.t = 'd'; cell.v = v; }
@@ -16042,7 +16042,7 @@ function safe_format(p/*:Cell*/, fmtid/*:number*/, fillid/*:?number*/, opts, the
16042
16042
  if(opts.cellNF) p.z = table_fmt[fmtid];
16043
16043
  } catch(e) { if(opts.WTF) throw e; }
16044
16044
  if(p.t === 'z' && !opts.cellStyles) return;
16045
- if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
16045
+ if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate$1(p.v);
16046
16046
  if((!opts || opts.cellText !== false) && p.t !== 'z') try {
16047
16047
  if(table_fmt[fmtid] == null) SSF__load(SSFImplicit[fmtid] || "General", fmtid);
16048
16048
  if(p.t === 'e') p.w = p.w || BErr[p.v];
@@ -16359,13 +16359,13 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts, idx, wb, date1904)/*:st
16359
16359
  case 'e': vv = BErr[cell.v]; break;
16360
16360
  case 'd':
16361
16361
  if(opts && opts.cellDates) {
16362
- var _vv = parseDate(cell.v, date1904);
16362
+ var _vv = parseDate$1(cell.v, date1904);
16363
16363
  vv = _vv.toISOString();
16364
16364
  if(_vv.getUTCFullYear() < 1900) vv = vv.slice(vv.indexOf("T") + 1).replace("Z","");
16365
16365
  } else {
16366
16366
  cell = dup(cell);
16367
16367
  cell.t = 'n';
16368
- vv = ''+(cell.v = datenum(parseDate(cell.v, date1904), date1904));
16368
+ vv = ''+(cell.v = datenum(parseDate$1(cell.v, date1904), date1904));
16369
16369
  }
16370
16370
  if(typeof cell.z === 'undefined') cell.z = table_fmt[14];
16371
16371
  break;
@@ -16564,8 +16564,8 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th
16564
16564
  break;
16565
16565
  case 'b': p.v = parsexmlbool(p.v); break;
16566
16566
  case 'd':
16567
- if(opts.cellDates) p.v = parseDate(p.v, date1904);
16568
- else { p.v = datenum(parseDate(p.v, date1904), date1904); p.t = 'n'; }
16567
+ if(opts.cellDates) p.v = parseDate$1(p.v, date1904);
16568
+ else { p.v = datenum(parseDate$1(p.v, date1904), date1904); p.t = 'n'; }
16569
16569
  break;
16570
16570
  /* error string in .w, number in .v */
16571
16571
  case 'e':
@@ -17587,7 +17587,7 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num
17587
17587
  case 'd': // no BrtCellDate :(
17588
17588
  cell = dup(cell);
17589
17589
  cell.z = cell.z || table_fmt[14];
17590
- cell.v = datenum(parseDate(cell.v, date1904), date1904); cell.t = 'n';
17590
+ cell.v = datenum(parseDate$1(cell.v, date1904), date1904); cell.t = 'n';
17591
17591
  break;
17592
17592
  /* falls through */
17593
17593
  case 'n': case 'e': vv = ''+cell.v; break;
@@ -18824,7 +18824,7 @@ function xlml_set_custprop(Custprops, key, cp, val/*:string*/) {
18824
18824
  case "boolean": oval = parsexmlbool(val); break;
18825
18825
  case "i2": case "int": oval = parseInt(val, 10); break;
18826
18826
  case "r4": case "float": oval = parseFloat(val); break;
18827
- case "date": case "dateTime.tz": oval = parseDate(val); break;
18827
+ case "date": case "dateTime.tz": oval = parseDate$1(val); break;
18828
18828
  case "i8": case "string": case "fixed": case "uuid": case "bin.base64": break;
18829
18829
  default: throw new Error("bad custprop:" + cp[0]);
18830
18830
  }
@@ -18887,7 +18887,7 @@ function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, a
18887
18887
  break;
18888
18888
  case 'DateTime':
18889
18889
  if(xml.slice(-1) != "Z") xml += "Z";
18890
- cell.v = datenum(parseDate(xml, date1904), date1904);
18890
+ cell.v = datenum(parseDate$1(xml, date1904), date1904);
18891
18891
  if(cell.v !== cell.v) cell.v = unescapexml(xml);
18892
18892
  if(!nf || nf == "General") nf = "yyyy-mm-dd";
18893
18893
  /* falls through */
@@ -22167,7 +22167,7 @@ function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n
22167
22167
  }
22168
22168
  if(cell.v != null) switch(cell.t) {
22169
22169
  case 'd': case 'n':
22170
- var v = cell.t == 'd' ? datenum(parseDate(cell.v, date1904), date1904) : cell.v;
22170
+ var v = cell.t == 'd' ? datenum(parseDate$1(cell.v, date1904), date1904) : cell.v;
22171
22171
  if(opts.biff == 2 && (v == (v|0)) && (v >= 0) && (v < 65536))
22172
22172
  // 0x027E (RK) in BIFF3/4
22173
22173
  write_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v, ixfe, ifmt));
@@ -22577,7 +22577,7 @@ function write_ws_biff8_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n
22577
22577
  if(cell.bf) write_biff_rec(ba, 0x0006 /* Formula */, write_Formula(cell, R, C, opts, os));
22578
22578
  else switch(cell.t) {
22579
22579
  case 'd': case 'n':
22580
- var v = cell.t == 'd' ? datenum(parseDate(cell.v, date1904), date1904) : cell.v;
22580
+ var v = cell.t == 'd' ? datenum(parseDate$1(cell.v, date1904), date1904) : cell.v;
22581
22581
  if(isNaN(v)) write_biff_rec(ba, 0x0205 /* BoolErr */, write_BoolErr(R, C, 0x24, os, opts, "e")); // #NUM!
22582
22582
  else if(!isFinite(v)) write_biff_rec(ba, 0x0205 /* BoolErr */, write_BoolErr(R, C, 0x07, os, opts, "e")); // #DIV/0!
22583
22583
  /* TODO: emit RK as appropriate */
@@ -22851,7 +22851,7 @@ function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ {
22851
22851
  else if(m === 'FALSE') o = {t:'b', v:false};
22852
22852
  else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
22853
22853
  else if(!isNaN(fuzzydate(m).getDate())) {
22854
- o = ({t:'d', v:parseDate(m)}/*:any*/);
22854
+ o = ({t:'d', v:parseDate$1(m)}/*:any*/);
22855
22855
  if(opts.UTC === false) o.v = utc_to_local(o.v);
22856
22856
  if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);
22857
22857
  o.z = opts.dateNF || table_fmt[14];
@@ -22996,7 +22996,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/
22996
22996
  else if(v === 'FALSE') o = {t:'b', v:false};
22997
22997
  else if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};
22998
22998
  else if(!isNaN(fuzzydate(v).getDate())) {
22999
- o = ({t:'d', v:parseDate(v)}/*:any*/);
22999
+ o = ({t:'d', v:parseDate$1(v)}/*:any*/);
23000
23000
  if(opts.UTC) o.v = local_to_utc(o.v);
23001
23001
  if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);
23002
23002
  o.z = opts.dateNF || table_fmt[14];
@@ -23426,7 +23426,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ {
23426
23426
  break;
23427
23427
  case 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break;
23428
23428
  case 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break;
23429
- case 'date': q.t = 'd'; q.v = parseDate(ctag['date-value'], WB.WBProps.date1904);
23429
+ case 'date': q.t = 'd'; q.v = parseDate$1(ctag['date-value'], WB.WBProps.date1904);
23430
23430
  if(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v, WB.WBProps.date1904); }
23431
23431
  if(!q.z) q.z = 'm/d/yy'; break;
23432
23432
  /* NOTE: for `time`, Excel ODS export incorrectly uses durations relative to 1900 epoch even if 1904 is specified */
@@ -24112,9 +24112,9 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function
24112
24112
  ct['office:value-type'] = "string";
24113
24113
  break;
24114
24114
  case 'd':
24115
- textp = (cell.w||(parseDate(cell.v, date1904).toISOString()));
24115
+ textp = (cell.w||(parseDate$1(cell.v, date1904).toISOString()));
24116
24116
  ct['office:value-type'] = "date";
24117
- ct['office:date-value'] = (parseDate(cell.v, date1904).toISOString());
24117
+ ct['office:date-value'] = (parseDate$1(cell.v, date1904).toISOString());
24118
24118
  ct['table:style-name'] = "ce1";
24119
24119
  break;
24120
24120
  //case 'e': // TODO: translate to ODS errors
@@ -30678,7 +30678,7 @@ function normalizeTwoDigitYear(twoDigitYear, currentYear) {
30678
30678
  }
30679
30679
  return isCommonEra ? result : 1 - result;
30680
30680
  }
30681
- function isLeapYearIndex(year) {
30681
+ function isLeapYearIndex$1(year) {
30682
30682
  return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
30683
30683
  }
30684
30684
 
@@ -31317,7 +31317,7 @@ var DateParser = /*#__PURE__*/function (_Parser) {
31317
31317
  key: "validate",
31318
31318
  value: function validate(date, value) {
31319
31319
  var year = date.getUTCFullYear();
31320
- var isLeapYear = isLeapYearIndex(year);
31320
+ var isLeapYear = isLeapYearIndex$1(year);
31321
31321
  var month = date.getUTCMonth();
31322
31322
  if (isLeapYear) {
31323
31323
  return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];
@@ -31370,7 +31370,7 @@ var DayOfYearParser = /*#__PURE__*/function (_Parser) {
31370
31370
  key: "validate",
31371
31371
  value: function validate(date, value) {
31372
31372
  var year = date.getUTCFullYear();
31373
- var isLeapYear = isLeapYearIndex(year);
31373
+ var isLeapYear = isLeapYearIndex$1(year);
31374
31374
  if (isLeapYear) {
31375
31375
  return value >= 1 && value <= 366;
31376
31376
  } else {
@@ -33272,9 +33272,256 @@ function isMatch(dateString, formatString, options) {
33272
33272
  return isValid$2(parse$1(dateString, formatString, new Date(), options));
33273
33273
  }
33274
33274
 
33275
+ /**
33276
+ * @name parseISO
33277
+ * @category Common Helpers
33278
+ * @summary Parse ISO string
33279
+ *
33280
+ * @description
33281
+ * Parse the given string in ISO 8601 format and return an instance of Date.
33282
+ *
33283
+ * Function accepts complete ISO 8601 formats as well as partial implementations.
33284
+ * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601
33285
+ *
33286
+ * If the argument isn't a string, the function cannot parse the string or
33287
+ * the values are invalid, it returns Invalid Date.
33288
+ *
33289
+ * @param {String} argument - the value to convert
33290
+ * @param {Object} [options] - an object with options.
33291
+ * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format
33292
+ * @returns {Date} the parsed date in the local time zone
33293
+ * @throws {TypeError} 1 argument required
33294
+ * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2
33295
+ *
33296
+ * @example
33297
+ * // Convert string '2014-02-11T11:30:30' to date:
33298
+ * const result = parseISO('2014-02-11T11:30:30')
33299
+ * //=> Tue Feb 11 2014 11:30:30
33300
+ *
33301
+ * @example
33302
+ * // Convert string '+02014101' to date,
33303
+ * // if the additional number of digits in the extended year format is 1:
33304
+ * const result = parseISO('+02014101', { additionalDigits: 1 })
33305
+ * //=> Fri Apr 11 2014 00:00:00
33306
+ */
33307
+ function parseISO$1(argument, options) {
33308
+ var _options$additionalDi;
33309
+ requiredArgs(1, arguments);
33310
+ var additionalDigits = toInteger((_options$additionalDi = options === null || options === void 0 ? void 0 : options.additionalDigits) !== null && _options$additionalDi !== void 0 ? _options$additionalDi : 2);
33311
+ if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {
33312
+ throw new RangeError('additionalDigits must be 0, 1 or 2');
33313
+ }
33314
+ if (!(typeof argument === 'string' || Object.prototype.toString.call(argument) === '[object String]')) {
33315
+ return new Date(NaN);
33316
+ }
33317
+ var dateStrings = splitDateString(argument);
33318
+ var date;
33319
+ if (dateStrings.date) {
33320
+ var parseYearResult = parseYear(dateStrings.date, additionalDigits);
33321
+ date = parseDate(parseYearResult.restDateString, parseYearResult.year);
33322
+ }
33323
+ if (!date || isNaN(date.getTime())) {
33324
+ return new Date(NaN);
33325
+ }
33326
+ var timestamp = date.getTime();
33327
+ var time = 0;
33328
+ var offset;
33329
+ if (dateStrings.time) {
33330
+ time = parseTime(dateStrings.time);
33331
+ if (isNaN(time)) {
33332
+ return new Date(NaN);
33333
+ }
33334
+ }
33335
+ if (dateStrings.timezone) {
33336
+ offset = parseTimezone(dateStrings.timezone);
33337
+ if (isNaN(offset)) {
33338
+ return new Date(NaN);
33339
+ }
33340
+ } else {
33341
+ var dirtyDate = new Date(timestamp + time);
33342
+ // js parsed string assuming it's in UTC timezone
33343
+ // but we need it to be parsed in our timezone
33344
+ // so we use utc values to build date in our timezone.
33345
+ // Year values from 0 to 99 map to the years 1900 to 1999
33346
+ // so set year explicitly with setFullYear.
33347
+ var result = new Date(0);
33348
+ result.setFullYear(dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate());
33349
+ result.setHours(dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds());
33350
+ return result;
33351
+ }
33352
+ return new Date(timestamp + time + offset);
33353
+ }
33354
+ var patterns$1 = {
33355
+ dateTimeDelimiter: /[T ]/,
33356
+ timeZoneDelimiter: /[Z ]/i,
33357
+ timezone: /([Z+-].*)$/
33358
+ };
33359
+ var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/;
33360
+ var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/;
33361
+ var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/;
33362
+ function splitDateString(dateString) {
33363
+ var dateStrings = {};
33364
+ var array = dateString.split(patterns$1.dateTimeDelimiter);
33365
+ var timeString;
33366
+
33367
+ // The regex match should only return at maximum two array elements.
33368
+ // [date], [time], or [date, time].
33369
+ if (array.length > 2) {
33370
+ return dateStrings;
33371
+ }
33372
+ if (/:/.test(array[0])) {
33373
+ timeString = array[0];
33374
+ } else {
33375
+ dateStrings.date = array[0];
33376
+ timeString = array[1];
33377
+ if (patterns$1.timeZoneDelimiter.test(dateStrings.date)) {
33378
+ dateStrings.date = dateString.split(patterns$1.timeZoneDelimiter)[0];
33379
+ timeString = dateString.substr(dateStrings.date.length, dateString.length);
33380
+ }
33381
+ }
33382
+ if (timeString) {
33383
+ var token = patterns$1.timezone.exec(timeString);
33384
+ if (token) {
33385
+ dateStrings.time = timeString.replace(token[1], '');
33386
+ dateStrings.timezone = token[1];
33387
+ } else {
33388
+ dateStrings.time = timeString;
33389
+ }
33390
+ }
33391
+ return dateStrings;
33392
+ }
33393
+ function parseYear(dateString, additionalDigits) {
33394
+ var regex = new RegExp('^(?:(\\d{4}|[+-]\\d{' + (4 + additionalDigits) + '})|(\\d{2}|[+-]\\d{' + (2 + additionalDigits) + '})$)');
33395
+ var captures = dateString.match(regex);
33396
+ // Invalid ISO-formatted year
33397
+ if (!captures) return {
33398
+ year: NaN,
33399
+ restDateString: ''
33400
+ };
33401
+ var year = captures[1] ? parseInt(captures[1]) : null;
33402
+ var century = captures[2] ? parseInt(captures[2]) : null;
33403
+
33404
+ // either year or century is null, not both
33405
+ return {
33406
+ year: century === null ? year : century * 100,
33407
+ restDateString: dateString.slice((captures[1] || captures[2]).length)
33408
+ };
33409
+ }
33410
+ function parseDate(dateString, year) {
33411
+ // Invalid ISO-formatted year
33412
+ if (year === null) return new Date(NaN);
33413
+ var captures = dateString.match(dateRegex);
33414
+ // Invalid ISO-formatted string
33415
+ if (!captures) return new Date(NaN);
33416
+ var isWeekDate = !!captures[4];
33417
+ var dayOfYear = parseDateUnit(captures[1]);
33418
+ var month = parseDateUnit(captures[2]) - 1;
33419
+ var day = parseDateUnit(captures[3]);
33420
+ var week = parseDateUnit(captures[4]);
33421
+ var dayOfWeek = parseDateUnit(captures[5]) - 1;
33422
+ if (isWeekDate) {
33423
+ if (!validateWeekDate(year, week, dayOfWeek)) {
33424
+ return new Date(NaN);
33425
+ }
33426
+ return dayOfISOWeekYear(year, week, dayOfWeek);
33427
+ } else {
33428
+ var date = new Date(0);
33429
+ if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) {
33430
+ return new Date(NaN);
33431
+ }
33432
+ date.setUTCFullYear(year, month, Math.max(dayOfYear, day));
33433
+ return date;
33434
+ }
33435
+ }
33436
+ function parseDateUnit(value) {
33437
+ return value ? parseInt(value) : 1;
33438
+ }
33439
+ function parseTime(timeString) {
33440
+ var captures = timeString.match(timeRegex);
33441
+ if (!captures) return NaN; // Invalid ISO-formatted time
33442
+
33443
+ var hours = parseTimeUnit(captures[1]);
33444
+ var minutes = parseTimeUnit(captures[2]);
33445
+ var seconds = parseTimeUnit(captures[3]);
33446
+ if (!validateTime(hours, minutes, seconds)) {
33447
+ return NaN;
33448
+ }
33449
+ return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000;
33450
+ }
33451
+ function parseTimeUnit(value) {
33452
+ return value && parseFloat(value.replace(',', '.')) || 0;
33453
+ }
33454
+ function parseTimezone(timezoneString) {
33455
+ if (timezoneString === 'Z') return 0;
33456
+ var captures = timezoneString.match(timezoneRegex);
33457
+ if (!captures) return 0;
33458
+ var sign = captures[1] === '+' ? -1 : 1;
33459
+ var hours = parseInt(captures[2]);
33460
+ var minutes = captures[3] && parseInt(captures[3]) || 0;
33461
+ if (!validateTimezone(hours, minutes)) {
33462
+ return NaN;
33463
+ }
33464
+ return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);
33465
+ }
33466
+ function dayOfISOWeekYear(isoWeekYear, week, day) {
33467
+ var date = new Date(0);
33468
+ date.setUTCFullYear(isoWeekYear, 0, 4);
33469
+ var fourthOfJanuaryDay = date.getUTCDay() || 7;
33470
+ var diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;
33471
+ date.setUTCDate(date.getUTCDate() + diff);
33472
+ return date;
33473
+ }
33474
+
33475
+ // Validation functions
33476
+
33477
+ // February is null to handle the leap year (using ||)
33478
+ var daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
33479
+ function isLeapYearIndex(year) {
33480
+ return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
33481
+ }
33482
+ function validateDate(year, month, date) {
33483
+ return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));
33484
+ }
33485
+ function validateDayOfYearDate(year, dayOfYear) {
33486
+ return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);
33487
+ }
33488
+ function validateWeekDate(_year, week, day) {
33489
+ return week >= 1 && week <= 53 && day >= 0 && day <= 6;
33490
+ }
33491
+ function validateTime(hours, minutes, seconds) {
33492
+ if (hours === 24) {
33493
+ return minutes === 0 && seconds === 0;
33494
+ }
33495
+ return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;
33496
+ }
33497
+ function validateTimezone(_hours, minutes) {
33498
+ return minutes >= 0 && minutes <= 59;
33499
+ }
33500
+
33275
33501
  // Copyright (c) Cosmo Tech.
33276
33502
  // Licensed under the MIT license.
33277
33503
 
33504
+ var decreaseDateByOffset = (date, offset) => {
33505
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33506
+ return new Date(date - offset * 60 * 1000);
33507
+ };
33508
+ var increaseDateByOffset = (date, offset) => {
33509
+ return decreaseDateByOffset(date, -offset);
33510
+ };
33511
+ var addLocalDateToUTCOffset = date => {
33512
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33513
+ // Example: if local time is 15:00, UTC time is 13:00, timezoneOffset is -120, then we need to "increase" the local
33514
+ // datetime by -120 to find UTC time
33515
+ return increaseDateByOffset(date, date.getTimezoneOffset());
33516
+ };
33517
+ var addUTCToLocalDateOffset = date => {
33518
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33519
+ return decreaseDateByOffset(date, date.getTimezoneOffset());
33520
+ };
33521
+ var getDateAtMidnightUTC = date => {
33522
+ if (date instanceof Date === false) throw new TypeError('"date" parameter must be a Date object');
33523
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0));
33524
+ };
33278
33525
  var parse = (dateStr, dateFormat) => {
33279
33526
  try {
33280
33527
  return parse$1(dateStr, dateFormat, new Date());
@@ -33282,6 +33529,7 @@ var parse = (dateStr, dateFormat) => {
33282
33529
  console.error(error);
33283
33530
  }
33284
33531
  };
33532
+ var parseISO = dateStr => parseISO$1(dateStr);
33285
33533
  var format = function format(date) {
33286
33534
  var dateFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "yyyy-MM-dd'T'HH:mm:ss.SSSX";
33287
33535
  if (date) {
@@ -33293,9 +33541,24 @@ var format = function format(date) {
33293
33541
  }
33294
33542
  return '';
33295
33543
  };
33544
+ var formatUTCDateAsLocal = function formatUTCDateAsLocal(date) {
33545
+ var dateFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "yyyy-MM-dd'T'HH:mm:ss.SSSX";
33546
+ try {
33547
+ var dateWithReverseOffset = addLocalDateToUTCOffset(date);
33548
+ return format(dateWithReverseOffset, dateFormat);
33549
+ } catch (error) {
33550
+ console.error(error);
33551
+ }
33552
+ return '';
33553
+ };
33554
+
33555
+ // TODO: (breaking change) rename to something like "isFormatValid" to prevent confusion with the check of invalid dates
33296
33556
  var isValid$1 = (dateStr, dateFormat) => {
33297
33557
  return isMatch(dateStr, dateFormat);
33298
33558
  };
33559
+ var isValidDate = date => {
33560
+ return isValid$2(date);
33561
+ };
33299
33562
  var min = (dateA, dateB) => {
33300
33563
  if (dateA && dateB) {
33301
33564
  return dateA < dateB ? dateA : dateB;
@@ -33325,9 +33588,17 @@ var strMax = (dateStrA, dateStrB, dateFormat) => {
33325
33588
  }
33326
33589
  };
33327
33590
  var DateUtils = {
33591
+ decreaseDateByOffset,
33592
+ increaseDateByOffset,
33593
+ addLocalDateToUTCOffset,
33594
+ addUTCToLocalDateOffset,
33595
+ getDateAtMidnightUTC,
33328
33596
  parse,
33597
+ parseISO,
33329
33598
  format,
33599
+ formatUTCDateAsLocal,
33330
33600
  isValid: isValid$1,
33601
+ isValidDate,
33331
33602
  min,
33332
33603
  max,
33333
33604
  strMin,
@@ -33342,7 +33613,8 @@ var _castCellValueToStr = cellValue => {
33342
33613
  };
33343
33614
  var _dateCellsToString = (cols, data, hasHeader, dateFormat) => {
33344
33615
  cols.forEach((column, i) => {
33345
- if (column.type.includes('date')) {
33616
+ var _column$type;
33617
+ if (column !== null && column !== void 0 && (_column$type = column.type) !== null && _column$type !== void 0 && _column$type.includes('date')) {
33346
33618
  for (var j = 0 + hasHeader; j < data.length; j++) {
33347
33619
  var dateCell = data[j][i];
33348
33620
  if (dateCell instanceof Date) {
@@ -41505,6 +41777,18 @@ var getFlattenColumnsWithoutGroups = columns => {
41505
41777
  return columnOrGroup !== null && columnOrGroup !== void 0 && columnOrGroup.children ? getFlattenColumnsWithoutGroups(columnOrGroup.children) : columnOrGroup;
41506
41778
  }).filter(column => column != null);
41507
41779
  };
41780
+ var getColumnsWithHeaderName = columns => {
41781
+ if (!Array.isArray(columns)) {
41782
+ console.warn('Columns list must be an array');
41783
+ return [];
41784
+ }
41785
+ columns.forEach(columnOrGroup => {
41786
+ if (columnOrGroup !== null && columnOrGroup !== void 0 && columnOrGroup.children) getColumnsWithHeaderName(columnOrGroup.children);else {
41787
+ if (columnOrGroup.headerName === undefined) columnOrGroup.headerName = columnOrGroup.field;
41788
+ }
41789
+ });
41790
+ return columns;
41791
+ };
41508
41792
  var _buildEmptyFieldError = (rowLineNumber, expectedCols, colIndex) => {
41509
41793
  var errorSummary = "Empty field";
41510
41794
  var errorLoc = "Line ".concat(rowLineNumber, ", Column ").concat(colIndex + 1, " (\"").concat(expectedCols[colIndex].field, "\")");
@@ -41782,6 +42066,7 @@ var AgGridUtils = {
41782
42066
  fromCSV,
41783
42067
  fromXLSX,
41784
42068
  getFlattenColumnsWithoutGroups,
42069
+ getColumnsWithHeaderName,
41785
42070
  toCSV,
41786
42071
  toXLSX
41787
42072
  };
@@ -41861,7 +42146,7 @@ var getBaseNameFromFileName = fileName => {
41861
42146
  return baseName;
41862
42147
  };
41863
42148
  var getExtensionFromFileName = fileName => {
41864
- if (fileName.indexOf('.') === -1) {
42149
+ if (typeof fileName !== 'string' || fileName.indexOf('.') === -1) {
41865
42150
  return '';
41866
42151
  }
41867
42152
  var nameParts = fileName.split('.');
@@ -41872,9 +42157,15 @@ var getExtensionFromFileName = fileName => {
41872
42157
  }
41873
42158
  return extension;
41874
42159
  };
42160
+ var isExtensionInFileTypeFilter = (extension, fileTypeFilter) => {
42161
+ if (typeof extension !== 'string' || typeof fileTypeFilter !== 'string') return false;
42162
+ var fileTypes = fileTypeFilter.split(',').map(fileType => fileType.replace('.', '').trim());
42163
+ return fileTypes.includes(extension);
42164
+ };
41875
42165
  var PathUtils = {
41876
42166
  getBaseNameFromFileName,
41877
- getExtensionFromFileName
42167
+ getExtensionFromFileName,
42168
+ isExtensionInFileTypeFilter
41878
42169
  };
41879
42170
 
41880
42171
  // Copyright (c) Cosmo Tech.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cosmotech/core",
3
3
  "private": false,
4
- "version": "1.12.0",
4
+ "version": "1.14.0",
5
5
  "description": "",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.esm.js",
@@ -46,7 +46,8 @@
46
46
  "rollup": "^3.12.0",
47
47
  "rollup-plugin-peer-deps-external": "^2.2.4",
48
48
  "rollup-plugin-postcss": "^4.0.0",
49
- "rollup-plugin-visualizer": "^5.5.0"
49
+ "rollup-plugin-visualizer": "^5.5.0",
50
+ "timezone-mock": "^1.3.6"
50
51
  },
51
52
  "dependencies": {
52
53
  "csv-string": "^4.0.1",