@cosmotech/core 1.11.6 → 1.13.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,19 @@
1
+ ## **1.13.0** <sub><sup>2023-09-22 (9dd046f...45122b9)</sup></sub>
2
+
3
+ ### Features
4
+
5
+ - add utils functions for dates and timezones ([f784395](https://github.com/Cosmo-Tech/webapp-component-core/commit/f784395))
6
+
7
+ ## **1.12.0** <sub><sup>2023-09-05 (e96188d...05e2b63)</sup></sub>
8
+
9
+ ### Features
10
+
11
+ - add new function getFlattenColumnsWithoutGroups ([e96188d](https://github.com/Cosmo-Tech/webapp-component-core/commit/e96188d))
12
+
13
+ ### Bug Fixes
14
+
15
+ - fix import & export of CSV/XLSX files when some columns are grouped ([193ac62](https://github.com/Cosmo-Tech/webapp-component-core/commit/193ac62))
16
+
1
17
  ## **1.11.6** <sub><sup>2023-08-28 (a1a83d2...a1a83d2)</sup></sub>
2
18
 
3
19
  ### Bug Fixes
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,
@@ -41495,6 +41766,18 @@ let Error$1 = class Error {
41495
41766
  }
41496
41767
  };
41497
41768
 
41769
+ var getFlattenColumnsWithoutGroups = columns => {
41770
+ if (columns == null) {
41771
+ console.warn("Columns list shouldn't be null or undefined");
41772
+ return [];
41773
+ }
41774
+ return columns.flatMap(columnOrGroup => {
41775
+ if (columnOrGroup == null) {
41776
+ console.warn('Null or undefined values found in columns list');
41777
+ }
41778
+ return columnOrGroup !== null && columnOrGroup !== void 0 && columnOrGroup.children ? getFlattenColumnsWithoutGroups(columnOrGroup.children) : columnOrGroup;
41779
+ }).filter(column => column != null);
41780
+ };
41498
41781
  var _buildEmptyFieldError = (rowLineNumber, expectedCols, colIndex) => {
41499
41782
  var errorSummary = "Empty field";
41500
41783
  var errorLoc = "Line ".concat(rowLineNumber, ", Column ").concat(colIndex + 1, " (\"").concat(expectedCols[colIndex].field, "\")");
@@ -41637,9 +41920,9 @@ var _buildRows = (rows, hasHeader, cols) => {
41637
41920
  };
41638
41921
  var fromCSV = function fromCSV(dataStr) {
41639
41922
  var hasHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
41640
- var cols = arguments.length > 2 ? arguments[2] : undefined;
41923
+ var nestedCols = arguments.length > 2 ? arguments[2] : undefined;
41641
41924
  var options = arguments.length > 3 ? arguments[3] : undefined;
41642
- if (!hasHeader && !cols) {
41925
+ if (!hasHeader && !nestedCols) {
41643
41926
  return {
41644
41927
  error: [new Error$1('cols must be defined if hasHeader=false', null, null)]
41645
41928
  };
@@ -41650,6 +41933,7 @@ var fromCSV = function fromCSV(dataStr) {
41650
41933
  rows: []
41651
41934
  };
41652
41935
  }
41936
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41653
41937
  var rows = [];
41654
41938
  var csvLines;
41655
41939
  var emptyCols = _calculateEmptyCols(cols);
@@ -41660,7 +41944,7 @@ var fromCSV = function fromCSV(dataStr) {
41660
41944
  error: [err]
41661
41945
  };
41662
41946
  }
41663
- if (!cols) {
41947
+ if (!cols || cols.length === 0) {
41664
41948
  cols = _buildCols(csvLines[0]);
41665
41949
  }
41666
41950
  var errors = _validateFormat(csvLines, hasHeader, cols, options);
@@ -41689,12 +41973,13 @@ var _generateRows = function _generateRows(rows, cols) {
41689
41973
  var rowSep = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '\n';
41690
41974
  return rows.map(row => _generateRow(row, cols, colSep)).join(rowSep);
41691
41975
  };
41692
- var toCSV = (rows, cols, options) => {
41693
- if (cols == null || cols.length === 0) {
41976
+ var toCSV = (rows, nestedCols, options) => {
41977
+ if (nestedCols == null || nestedCols.length === 0) {
41694
41978
  return {
41695
41979
  error: ["Cols must be defined"]
41696
41980
  };
41697
41981
  }
41982
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41698
41983
  if (!rows) {
41699
41984
  rows = [];
41700
41985
  }
@@ -41712,10 +41997,11 @@ var toCSV = (rows, cols, options) => {
41712
41997
 
41713
41998
  // TODO: some metadata of cols & options ('acceptsEmptyFields', columns types, dates format, ...) are not used right
41714
41999
  // now, but they could be used in a future version to improve the format of the exported Excel file
41715
- var toXLSX = (rows, cols, options) => {
42000
+ var toXLSX = (rows, nestedCols, options) => {
41716
42001
  if (!rows) {
41717
42002
  rows = [];
41718
42003
  }
42004
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41719
42005
  options = _objectSpread2(_objectSpread2({}, DEFAULT_XLSX_EXPORT_OPTIONS), options);
41720
42006
  var header = options.writeHeader ? cols.map(col => col.field) : null;
41721
42007
  return XLSXUtils.write(rows, header);
@@ -41723,9 +42009,9 @@ var toXLSX = (rows, cols, options) => {
41723
42009
  var fromXLSX = /*#__PURE__*/function () {
41724
42010
  var _ref2 = _asyncToGenerator(function* (fileBlob) {
41725
42011
  var hasHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
41726
- var cols = arguments.length > 2 ? arguments[2] : undefined;
42012
+ var nestedCols = arguments.length > 2 ? arguments[2] : undefined;
41727
42013
  var options = arguments.length > 3 ? arguments[3] : undefined;
41728
- if (!hasHeader && !cols) {
42014
+ if (!hasHeader && !nestedCols) {
41729
42015
  return {
41730
42016
  error: [new Error$1('cols must be defined if hasHeader=false', null, null)]
41731
42017
  };
@@ -41736,6 +42022,7 @@ var fromXLSX = /*#__PURE__*/function () {
41736
42022
  rows: []
41737
42023
  };
41738
42024
  }
42025
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41739
42026
  var rows = [];
41740
42027
  var xlsxLines;
41741
42028
  var emptyCols = _calculateEmptyCols(cols);
@@ -41747,7 +42034,7 @@ var fromXLSX = /*#__PURE__*/function () {
41747
42034
  error: [new Error$1((err === null || err === void 0 ? void 0 : err.message) || err, fileBlob.name, (err === null || err === void 0 ? void 0 : err.stack) || null)]
41748
42035
  };
41749
42036
  }
41750
- if (!cols) {
42037
+ if (!cols || cols.length === 0) {
41751
42038
  cols = _buildCols(xlsxLines[0]);
41752
42039
  }
41753
42040
  var errors = _validateFormat(xlsxLines, hasHeader, cols, options);
@@ -41767,6 +42054,7 @@ var fromXLSX = /*#__PURE__*/function () {
41767
42054
  var AgGridUtils = {
41768
42055
  fromCSV,
41769
42056
  fromXLSX,
42057
+ getFlattenColumnsWithoutGroups,
41770
42058
  toCSV,
41771
42059
  toXLSX
41772
42060
  };
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,
@@ -41493,6 +41764,18 @@ let Error$1 = class Error {
41493
41764
  }
41494
41765
  };
41495
41766
 
41767
+ var getFlattenColumnsWithoutGroups = columns => {
41768
+ if (columns == null) {
41769
+ console.warn("Columns list shouldn't be null or undefined");
41770
+ return [];
41771
+ }
41772
+ return columns.flatMap(columnOrGroup => {
41773
+ if (columnOrGroup == null) {
41774
+ console.warn('Null or undefined values found in columns list');
41775
+ }
41776
+ return columnOrGroup !== null && columnOrGroup !== void 0 && columnOrGroup.children ? getFlattenColumnsWithoutGroups(columnOrGroup.children) : columnOrGroup;
41777
+ }).filter(column => column != null);
41778
+ };
41496
41779
  var _buildEmptyFieldError = (rowLineNumber, expectedCols, colIndex) => {
41497
41780
  var errorSummary = "Empty field";
41498
41781
  var errorLoc = "Line ".concat(rowLineNumber, ", Column ").concat(colIndex + 1, " (\"").concat(expectedCols[colIndex].field, "\")");
@@ -41635,9 +41918,9 @@ var _buildRows = (rows, hasHeader, cols) => {
41635
41918
  };
41636
41919
  var fromCSV = function fromCSV(dataStr) {
41637
41920
  var hasHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
41638
- var cols = arguments.length > 2 ? arguments[2] : undefined;
41921
+ var nestedCols = arguments.length > 2 ? arguments[2] : undefined;
41639
41922
  var options = arguments.length > 3 ? arguments[3] : undefined;
41640
- if (!hasHeader && !cols) {
41923
+ if (!hasHeader && !nestedCols) {
41641
41924
  return {
41642
41925
  error: [new Error$1('cols must be defined if hasHeader=false', null, null)]
41643
41926
  };
@@ -41648,6 +41931,7 @@ var fromCSV = function fromCSV(dataStr) {
41648
41931
  rows: []
41649
41932
  };
41650
41933
  }
41934
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41651
41935
  var rows = [];
41652
41936
  var csvLines;
41653
41937
  var emptyCols = _calculateEmptyCols(cols);
@@ -41658,7 +41942,7 @@ var fromCSV = function fromCSV(dataStr) {
41658
41942
  error: [err]
41659
41943
  };
41660
41944
  }
41661
- if (!cols) {
41945
+ if (!cols || cols.length === 0) {
41662
41946
  cols = _buildCols(csvLines[0]);
41663
41947
  }
41664
41948
  var errors = _validateFormat(csvLines, hasHeader, cols, options);
@@ -41687,12 +41971,13 @@ var _generateRows = function _generateRows(rows, cols) {
41687
41971
  var rowSep = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '\n';
41688
41972
  return rows.map(row => _generateRow(row, cols, colSep)).join(rowSep);
41689
41973
  };
41690
- var toCSV = (rows, cols, options) => {
41691
- if (cols == null || cols.length === 0) {
41974
+ var toCSV = (rows, nestedCols, options) => {
41975
+ if (nestedCols == null || nestedCols.length === 0) {
41692
41976
  return {
41693
41977
  error: ["Cols must be defined"]
41694
41978
  };
41695
41979
  }
41980
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41696
41981
  if (!rows) {
41697
41982
  rows = [];
41698
41983
  }
@@ -41710,10 +41995,11 @@ var toCSV = (rows, cols, options) => {
41710
41995
 
41711
41996
  // TODO: some metadata of cols & options ('acceptsEmptyFields', columns types, dates format, ...) are not used right
41712
41997
  // now, but they could be used in a future version to improve the format of the exported Excel file
41713
- var toXLSX = (rows, cols, options) => {
41998
+ var toXLSX = (rows, nestedCols, options) => {
41714
41999
  if (!rows) {
41715
42000
  rows = [];
41716
42001
  }
42002
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41717
42003
  options = _objectSpread2(_objectSpread2({}, DEFAULT_XLSX_EXPORT_OPTIONS), options);
41718
42004
  var header = options.writeHeader ? cols.map(col => col.field) : null;
41719
42005
  return XLSXUtils.write(rows, header);
@@ -41721,9 +42007,9 @@ var toXLSX = (rows, cols, options) => {
41721
42007
  var fromXLSX = /*#__PURE__*/function () {
41722
42008
  var _ref2 = _asyncToGenerator(function* (fileBlob) {
41723
42009
  var hasHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
41724
- var cols = arguments.length > 2 ? arguments[2] : undefined;
42010
+ var nestedCols = arguments.length > 2 ? arguments[2] : undefined;
41725
42011
  var options = arguments.length > 3 ? arguments[3] : undefined;
41726
- if (!hasHeader && !cols) {
42012
+ if (!hasHeader && !nestedCols) {
41727
42013
  return {
41728
42014
  error: [new Error$1('cols must be defined if hasHeader=false', null, null)]
41729
42015
  };
@@ -41734,6 +42020,7 @@ var fromXLSX = /*#__PURE__*/function () {
41734
42020
  rows: []
41735
42021
  };
41736
42022
  }
42023
+ var cols = getFlattenColumnsWithoutGroups(nestedCols);
41737
42024
  var rows = [];
41738
42025
  var xlsxLines;
41739
42026
  var emptyCols = _calculateEmptyCols(cols);
@@ -41745,7 +42032,7 @@ var fromXLSX = /*#__PURE__*/function () {
41745
42032
  error: [new Error$1((err === null || err === void 0 ? void 0 : err.message) || err, fileBlob.name, (err === null || err === void 0 ? void 0 : err.stack) || null)]
41746
42033
  };
41747
42034
  }
41748
- if (!cols) {
42035
+ if (!cols || cols.length === 0) {
41749
42036
  cols = _buildCols(xlsxLines[0]);
41750
42037
  }
41751
42038
  var errors = _validateFormat(xlsxLines, hasHeader, cols, options);
@@ -41765,6 +42052,7 @@ var fromXLSX = /*#__PURE__*/function () {
41765
42052
  var AgGridUtils = {
41766
42053
  fromCSV,
41767
42054
  fromXLSX,
42055
+ getFlattenColumnsWithoutGroups,
41768
42056
  toCSV,
41769
42057
  toXLSX
41770
42058
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cosmotech/core",
3
3
  "private": false,
4
- "version": "1.11.6",
4
+ "version": "1.13.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",