chrono-node 2.7.3 → 2.7.4

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.
Files changed (73) hide show
  1. package/dist/cjs/common/refiners/OverlapRemovalRefiner.js +16 -6
  2. package/dist/cjs/common/refiners/OverlapRemovalRefiner.js.map +1 -1
  3. package/dist/cjs/locales/en/configuration.js +13 -8
  4. package/dist/cjs/locales/en/configuration.js.map +1 -1
  5. package/dist/cjs/locales/en/constants.d.ts +1 -1
  6. package/dist/cjs/locales/en/constants.js +1 -1
  7. package/dist/cjs/locales/en/constants.js.map +1 -1
  8. package/dist/cjs/locales/en/index.d.ts +2 -0
  9. package/dist/cjs/locales/en/index.js +5 -5
  10. package/dist/cjs/locales/en/index.js.map +1 -1
  11. package/dist/cjs/locales/en/parsers/ENMonthNameMiddleEndianParser.d.ts +2 -0
  12. package/dist/cjs/locales/en/parsers/ENMonthNameMiddleEndianParser.js +13 -2
  13. package/dist/cjs/locales/en/parsers/ENMonthNameMiddleEndianParser.js.map +1 -1
  14. package/dist/cjs/locales/en/parsers/ENMonthNameParser.js +1 -0
  15. package/dist/cjs/locales/en/parsers/ENMonthNameParser.js.map +1 -1
  16. package/dist/cjs/locales/en/parsers/ENTimeUnitWithinFormatParser.js +3 -0
  17. package/dist/cjs/locales/en/parsers/ENTimeUnitWithinFormatParser.js.map +1 -1
  18. package/dist/cjs/locales/en/refiners/ENMergeRelativeAfterDateRefiner.d.ts +6 -0
  19. package/dist/cjs/locales/en/refiners/ENMergeRelativeAfterDateRefiner.js +30 -0
  20. package/dist/cjs/locales/en/refiners/ENMergeRelativeAfterDateRefiner.js.map +1 -0
  21. package/dist/cjs/locales/en/refiners/{ENMergeRelativeDateRefiner.d.ts → ENMergeRelativeFollowByDateRefiner.d.ts} +1 -1
  22. package/dist/cjs/locales/en/refiners/{ENMergeRelativeDateRefiner.js → ENMergeRelativeFollowByDateRefiner.js} +3 -3
  23. package/dist/cjs/locales/en/refiners/ENMergeRelativeFollowByDateRefiner.js.map +1 -0
  24. package/dist/cjs/locales/nl/parsers/NLRelativeDateFormatParser.js +3 -3
  25. package/dist/cjs/locales/nl/parsers/NLRelativeDateFormatParser.js.map +1 -1
  26. package/dist/cjs/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js +6 -4
  27. package/dist/cjs/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js.map +1 -1
  28. package/dist/esm/common/refiners/OverlapRemovalRefiner.js +16 -6
  29. package/dist/esm/common/refiners/OverlapRemovalRefiner.js.map +1 -1
  30. package/dist/esm/locales/en/configuration.js +13 -8
  31. package/dist/esm/locales/en/configuration.js.map +1 -1
  32. package/dist/esm/locales/en/constants.d.ts +1 -1
  33. package/dist/esm/locales/en/constants.js +1 -1
  34. package/dist/esm/locales/en/constants.js.map +1 -1
  35. package/dist/esm/locales/en/index.d.ts +2 -0
  36. package/dist/esm/locales/en/index.js +4 -4
  37. package/dist/esm/locales/en/index.js.map +1 -1
  38. package/dist/esm/locales/en/parsers/ENMonthNameMiddleEndianParser.d.ts +2 -0
  39. package/dist/esm/locales/en/parsers/ENMonthNameMiddleEndianParser.js +13 -2
  40. package/dist/esm/locales/en/parsers/ENMonthNameMiddleEndianParser.js.map +1 -1
  41. package/dist/esm/locales/en/parsers/ENMonthNameParser.js +1 -0
  42. package/dist/esm/locales/en/parsers/ENMonthNameParser.js.map +1 -1
  43. package/dist/esm/locales/en/parsers/ENTimeUnitWithinFormatParser.js +3 -0
  44. package/dist/esm/locales/en/parsers/ENTimeUnitWithinFormatParser.js.map +1 -1
  45. package/dist/esm/locales/en/refiners/ENMergeRelativeAfterDateRefiner.d.ts +6 -0
  46. package/dist/esm/locales/en/refiners/ENMergeRelativeAfterDateRefiner.js +27 -0
  47. package/dist/esm/locales/en/refiners/ENMergeRelativeAfterDateRefiner.js.map +1 -0
  48. package/dist/esm/locales/en/refiners/{ENMergeRelativeDateRefiner.d.ts → ENMergeRelativeFollowByDateRefiner.d.ts} +1 -1
  49. package/dist/esm/locales/en/refiners/{ENMergeRelativeDateRefiner.js → ENMergeRelativeFollowByDateRefiner.js} +2 -2
  50. package/dist/esm/locales/en/refiners/ENMergeRelativeFollowByDateRefiner.js.map +1 -0
  51. package/dist/esm/locales/nl/parsers/NLRelativeDateFormatParser.js +3 -3
  52. package/dist/esm/locales/nl/parsers/NLRelativeDateFormatParser.js.map +1 -1
  53. package/dist/esm/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js +6 -4
  54. package/dist/esm/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js.map +1 -1
  55. package/package.json +1 -1
  56. package/src/common/refiners/OverlapRemovalRefiner.ts +16 -7
  57. package/src/locales/en/configuration.ts +15 -8
  58. package/src/locales/en/constants.ts +1 -1
  59. package/src/locales/en/index.ts +4 -4
  60. package/src/locales/en/parsers/ENMonthNameMiddleEndianParser.ts +20 -5
  61. package/src/locales/en/parsers/ENMonthNameParser.ts +1 -0
  62. package/src/locales/en/parsers/ENTimeUnitWithinFormatParser.ts +5 -0
  63. package/src/locales/en/refiners/ENMergeRelativeAfterDateRefiner.ts +46 -0
  64. package/src/locales/en/refiners/{ENMergeRelativeDateRefiner.ts → ENMergeRelativeFollowByDateRefiner.ts} +4 -4
  65. package/src/locales/nl/parsers/NLRelativeDateFormatParser.ts +3 -3
  66. package/src/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.ts +10 -4
  67. package/test/en/en_month.test.ts +6 -0
  68. package/test/en/en_month_name_middle_endian.test.ts +23 -0
  69. package/test/en/en_time_units_later.test.ts +22 -0
  70. package/test/en/negative_cases.test.ts +4 -0
  71. package/test/nl/nl_relative.test.ts +16 -2
  72. package/dist/cjs/locales/en/refiners/ENMergeRelativeDateRefiner.js.map +0 -1
  73. package/dist/esm/locales/en/refiners/ENMergeRelativeDateRefiner.js.map +0 -1
@@ -1,8 +1,10 @@
1
1
  import { Chrono, Parser, Refiner } from "../../chrono.js";
2
2
  import { ParsingResult, ParsingComponents, ReferenceWithTimezone } from "../../results.js";
3
3
  import { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Weekday } from "../../types.js";
4
+ import ENDefaultConfiguration from "./configuration.js";
4
5
  export { Chrono, Parser, Refiner, ParsingResult, ParsingComponents, ReferenceWithTimezone };
5
6
  export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Weekday };
7
+ export declare const configuration: ENDefaultConfiguration;
6
8
  export declare const casual: Chrono;
7
9
  export declare const strict: Chrono;
8
10
  export declare const GB: Chrono;
@@ -4,10 +4,10 @@ import { Meridiem, Weekday } from "../../types.js";
4
4
  import ENDefaultConfiguration from "./configuration.js";
5
5
  export { Chrono, ParsingResult, ParsingComponents, ReferenceWithTimezone };
6
6
  export { Meridiem, Weekday };
7
- const enConfig = new ENDefaultConfiguration();
8
- export const casual = new Chrono(enConfig.createCasualConfiguration(false));
9
- export const strict = new Chrono(enConfig.createConfiguration(true, false));
10
- export const GB = new Chrono(enConfig.createConfiguration(false, true));
7
+ export const configuration = new ENDefaultConfiguration();
8
+ export const casual = new Chrono(configuration.createCasualConfiguration(false));
9
+ export const strict = new Chrono(configuration.createConfiguration(true, false));
10
+ export const GB = new Chrono(configuration.createCasualConfiguration(true));
11
11
  export function parse(text, ref, option) {
12
12
  return casual.parse(text, ref, option);
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/locales/en/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAmB,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAA4D,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1G,OAAO,sBAAsB,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAmB,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;AAC5F,OAAO,EAA4D,QAAQ,EAAE,OAAO,EAAE,CAAC;AAEvF,MAAM,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;AAK9C,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;AAK5E,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAK5E,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAKxE,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,GAAU,EAAE,MAAsB;IAClE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAKD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,GAAU,EAAE,MAAsB;IACtE,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/locales/en/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAmB,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAA4D,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1G,OAAO,sBAAsB,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAmB,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;AAC5F,OAAO,EAA4D,QAAQ,EAAE,OAAO,EAAE,CAAC;AAEvF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,sBAAsB,EAAE,CAAC;AAK1D,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;AAKjF,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAKjF,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;AAK5E,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,GAAU,EAAE,MAAsB;IAClE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAKD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,GAAU,EAAE,MAAsB;IACtE,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { ParsingContext } from "../../../chrono.js";
2
2
  import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary.js";
3
3
  export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking {
4
+ shouldSkipYearLikeDate: boolean;
5
+ constructor(shouldSkipYearLikeDate: boolean);
4
6
  innerPattern(): RegExp;
5
7
  innerExtract(context: ParsingContext, match: RegExpMatchArray): import("../index.js").ParsingComponents | import("../index.js").ParsingResult;
6
8
  }
@@ -21,6 +21,10 @@ const DATE_GROUP = 2;
21
21
  const DATE_TO_GROUP = 3;
22
22
  const YEAR_GROUP = 4;
23
23
  export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking {
24
+ constructor(shouldSkipYearLikeDate) {
25
+ super();
26
+ this.shouldSkipYearLikeDate = shouldSkipYearLikeDate;
27
+ }
24
28
  innerPattern() {
25
29
  return PATTERN;
26
30
  }
@@ -30,10 +34,17 @@ export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWor
30
34
  if (day > 31) {
31
35
  return null;
32
36
  }
33
- const components = context.createParsingComponents({
37
+ if (this.shouldSkipYearLikeDate) {
38
+ if (!match[DATE_TO_GROUP] && !match[YEAR_GROUP] && match[DATE_GROUP].match(/^2[0-5]$/)) {
39
+ return null;
40
+ }
41
+ }
42
+ const components = context
43
+ .createParsingComponents({
34
44
  day: day,
35
45
  month: month,
36
- });
46
+ })
47
+ .addTag("parser/ENMonthNameMiddleEndianParser");
37
48
  if (match[YEAR_GROUP]) {
38
49
  const year = parseYear(match[YEAR_GROUP]);
39
50
  components.assign("year", year);
@@ -1 +1 @@
1
- {"version":3,"file":"ENMonthNameMiddleEndianParser.js","sourceRoot":"","sources":["../../../../../src/locales/en/parsers/ENMonthNameMiddleEndianParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAEhH,MAAM,OAAO,GAAG,IAAI,MAAM,CACtB,IAAI,eAAe,CAAC,gBAAgB,CAAC,GAAG;IACpC,oBAAoB;IACpB,IAAI,sBAAsB,wBAAwB;IAClD,KAAK;IACL,gBAAgB;IAChB,IAAI,sBAAsB,OAAO;IACjC,IAAI;IACJ,KAAK;IACL,oBAAoB;IACpB,IAAI,YAAY,GAAG;IACnB,IAAI;IACJ,qBAAqB,EACzB,GAAG,CACN,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,UAAU,GAAG,CAAC,CAAC;AAYrB,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,sCAAsC;IAC7F,YAAY;QACR,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,yBAAyB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,IAAI,GAAG,GAAG,EAAE,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC;YAC/C,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;YACnB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1C,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACnC;aAAM;YACH,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/D,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SAClC;QAED,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YACvB,OAAO,UAAU,CAAC;SACrB;QAGD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC;QAC1B,MAAM,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAElC,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
1
+ {"version":3,"file":"ENMonthNameMiddleEndianParser.js","sourceRoot":"","sources":["../../../../../src/locales/en/parsers/ENMonthNameMiddleEndianParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAEhH,MAAM,OAAO,GAAG,IAAI,MAAM,CACtB,IAAI,eAAe,CAAC,gBAAgB,CAAC,GAAG;IACpC,oBAAoB;IACpB,IAAI,sBAAsB,wBAAwB;IAClD,KAAK;IACL,gBAAgB;IAChB,IAAI,sBAAsB,OAAO;IACjC,IAAI;IACJ,KAAK;IACL,oBAAoB;IACpB,IAAI,YAAY,GAAG;IACnB,IAAI;IACJ,qBAAqB,EACzB,GAAG,CACN,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,UAAU,GAAG,CAAC,CAAC;AAarB,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,sCAAsC;IAG7F,YAAY,sBAA+B;QACvC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACzD,CAAC;IAED,YAAY;QACR,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,yBAAyB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,IAAI,GAAG,GAAG,EAAE,EAAE;YACV,OAAO,IAAI,CAAC;SACf;QAGD,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;gBACpF,OAAO,IAAI,CAAC;aACf;SACJ;QACD,MAAM,UAAU,GAAG,OAAO;aACrB,uBAAuB,CAAC;YACrB,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,KAAK;SACf,CAAC;aACD,MAAM,CAAC,sCAAsC,CAAC,CAAC;QAEpD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;YACnB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1C,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACnC;aAAM;YACH,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/D,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SAClC;QACD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YACvB,OAAO,UAAU,CAAC;SACrB;QAGD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC;QAC1B,MAAM,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAElC,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -24,6 +24,7 @@ export default class ENMonthNameParser extends AbstractParserWithWordBoundaryChe
24
24
  }
25
25
  const result = context.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length);
26
26
  result.start.imply("day", 1);
27
+ result.start.addTag("parser/ENMonthNameParser");
27
28
  const month = MONTH_DICTIONARY[monthName];
28
29
  result.start.assign("month", month);
29
30
  if (match[YEAR_GROUP]) {
@@ -1 +1 @@
1
- {"version":3,"file":"ENMonthNameParser.js","sourceRoot":"","sources":["../../../../../src/locales/en/parsers/ENMonthNameParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAEhH,MAAM,OAAO,GAAG,IAAI,MAAM,CACtB,eAAe;IACX,IAAI,eAAe,CAAC,gBAAgB,CAAC,GAAG;IACxC,MAAM;IACN,KAAK;IACL,aAAa,YAAY,IAAI;IAC7B,IAAI;IACJ,kCAAkC,EACtC,GAAG,CACN,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,UAAU,GAAG,CAAC,CAAC;AASrB,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,sCAAsC;IACjF,YAAY;QACR,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAGxD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE;YAChE,OAAO,IAAI,CAAC;SACf;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CACtC,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAChD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAChC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEpC,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;YACnB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACrC;aAAM;YACH,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACpC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
1
+ {"version":3,"file":"ENMonthNameParser.js","sourceRoot":"","sources":["../../../../../src/locales/en/parsers/ENMonthNameParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAEhH,MAAM,OAAO,GAAG,IAAI,MAAM,CACtB,eAAe;IACX,IAAI,eAAe,CAAC,gBAAgB,CAAC,GAAG;IACxC,MAAM;IACN,KAAK;IACL,aAAa,YAAY,IAAI;IAC7B,IAAI;IACJ,kCAAkC,EACtC,GAAG,CACN,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,UAAU,GAAG,CAAC,CAAC;AASrB,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,sCAAsC;IACjF,YAAY;QACR,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAGxD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE;YAChE,OAAO,IAAI,CAAC;SACf;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CACtC,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAChD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAChC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAEhD,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEpC,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;YACnB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACrC;aAAM;YACH,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACpC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -19,6 +19,9 @@ export default class ENTimeUnitWithinFormatParser extends AbstractParserWithWord
19
19
  return context.option.forwardDate ? PATTERN_WITH_OPTIONAL_PREFIX : PATTERN_WITH_PREFIX;
20
20
  }
21
21
  innerExtract(context, match) {
22
+ if (match[0].match(/^for\s*the\s*\w+/)) {
23
+ return null;
24
+ }
22
25
  const timeUnits = parseTimeUnits(match[1]);
23
26
  return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
24
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ENTimeUnitWithinFormatParser.js","sourceRoot":"","sources":["../../../../../src/locales/en/parsers/ENTimeUnitWithinFormatParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAEhH,MAAM,4BAA4B,GAAG,IAAI,MAAM,CAC3C,4BAA4B;IACxB,kEAAkE,kBAAkB,YAAY,EACpG,GAAG,CACN,CAAC;AAEF,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAClC,uBAAuB;IACnB,kEAAkE,kBAAkB,YAAY,EACpG,GAAG,CACN,CAAC;AAEF,MAAM,0BAA0B,GAAG,IAAI,MAAM,CACzC,uBAAuB;IACnB,kEAAkE,0BAA0B,YAAY,EAC5G,GAAG,CACN,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,sCAAsC;IAC5F,YAAoB,UAAmB;QACnC,KAAK,EAAE,CAAC;QADQ,eAAU,GAAV,UAAU,CAAS;IAEvC,CAAC;IAED,YAAY,CAAC,OAAuB;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,OAAO,0BAA0B,CAAC;SACrC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC3F,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvF,CAAC;CACJ"}
1
+ {"version":3,"file":"ENTimeUnitWithinFormatParser.js","sourceRoot":"","sources":["../../../../../src/locales/en/parsers/ENTimeUnitWithinFormatParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAEhH,MAAM,4BAA4B,GAAG,IAAI,MAAM,CAC3C,4BAA4B;IACxB,kEAAkE,kBAAkB,YAAY,EACpG,GAAG,CACN,CAAC;AAEF,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAClC,uBAAuB;IACnB,kEAAkE,kBAAkB,YAAY,EACpG,GAAG,CACN,CAAC;AAEF,MAAM,0BAA0B,GAAG,IAAI,MAAM,CACzC,uBAAuB;IACnB,kEAAkE,0BAA0B,YAAY,EAC5G,GAAG,CACN,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,sCAAsC;IAC5F,YAAoB,UAAmB;QACnC,KAAK,EAAE,CAAC;QADQ,eAAU,GAAV,UAAU,CAAS;IAEvC,CAAC;IAED,YAAY,CAAC,OAAuB;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,OAAO,0BAA0B,CAAC;SACrC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC3F,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QAEzD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE;YACpC,OAAO,IAAI,CAAC;SACf;QAED,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvF,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ import { MergingRefiner } from "../../../common/abstractRefiners.js";
2
+ import { ParsingResult } from "../../../results.js";
3
+ export default class ENMergeRelativeAfterDateRefiner extends MergingRefiner {
4
+ shouldMergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult): boolean;
5
+ mergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult, context: any): ParsingResult;
6
+ }
@@ -0,0 +1,27 @@
1
+ import { MergingRefiner } from "../../../common/abstractRefiners.js";
2
+ import { ParsingComponents, ParsingResult, ReferenceWithTimezone } from "../../../results.js";
3
+ import { parseTimeUnits } from "../constants.js";
4
+ import { reverseTimeUnits } from "../../../utils/timeunits.js";
5
+ function IsPositiveFollowingReference(result) {
6
+ return result.text.match(/^[+-]/i) != null;
7
+ }
8
+ function IsNegativeFollowingReference(result) {
9
+ return result.text.match(/^-/i) != null;
10
+ }
11
+ export default class ENMergeRelativeAfterDateRefiner extends MergingRefiner {
12
+ shouldMergeResults(textBetween, currentResult, nextResult) {
13
+ if (!textBetween.match(/^\s*$/i)) {
14
+ return false;
15
+ }
16
+ return IsPositiveFollowingReference(nextResult) || IsNegativeFollowingReference(nextResult);
17
+ }
18
+ mergeResults(textBetween, currentResult, nextResult, context) {
19
+ let timeUnits = parseTimeUnits(nextResult.text);
20
+ if (IsNegativeFollowingReference(nextResult)) {
21
+ timeUnits = reverseTimeUnits(timeUnits);
22
+ }
23
+ const components = ParsingComponents.createRelativeFromReference(new ReferenceWithTimezone(currentResult.start.date()), timeUnits);
24
+ return new ParsingResult(currentResult.reference, currentResult.index, `${currentResult.text}${textBetween}${nextResult.text}`, components);
25
+ }
26
+ }
27
+ //# sourceMappingURL=ENMergeRelativeAfterDateRefiner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ENMergeRelativeAfterDateRefiner.js","sourceRoot":"","sources":["../../../../../src/locales/en/refiners/ENMergeRelativeAfterDateRefiner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,SAAS,4BAA4B,CAAC,MAAqB;IACvD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAqB;IACvD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC5C,CAAC;AAOD,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,cAAc;IACvE,kBAAkB,CAAC,WAAmB,EAAE,aAA4B,EAAE,UAAyB;QAC3F,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YAC9B,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,4BAA4B,CAAC,UAAU,CAAC,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAChG,CAAC;IAED,YAAY,CAAC,WAAmB,EAAE,aAA4B,EAAE,UAAyB,EAAE,OAAO;QAC9F,IAAI,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,4BAA4B,CAAC,UAAU,CAAC,EAAE;YAC1C,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;SAC3C;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,2BAA2B,CAC5D,IAAI,qBAAqB,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EACrD,SAAS,CACZ,CAAC;QAEF,OAAO,IAAI,aAAa,CACpB,aAAa,CAAC,SAAS,EACvB,aAAa,CAAC,KAAK,EACnB,GAAG,aAAa,CAAC,IAAI,GAAG,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,EACvD,UAAU,CACb,CAAC;IACN,CAAC;CACJ"}
@@ -1,6 +1,6 @@
1
1
  import { MergingRefiner } from "../../../common/abstractRefiners.js";
2
2
  import { ParsingResult } from "../../../results.js";
3
- export default class ENMergeRelativeDateRefiner extends MergingRefiner {
3
+ export default class ENMergeRelativeFollowByDateRefiner extends MergingRefiner {
4
4
  patternBetween(): RegExp;
5
5
  shouldMergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult): boolean;
6
6
  mergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult): ParsingResult;
@@ -8,7 +8,7 @@ function hasImpliedEarlierReferenceDate(result) {
8
8
  function hasImpliedLaterReferenceDate(result) {
9
9
  return result.text.match(/\s+(after|since)$/i) != null;
10
10
  }
11
- export default class ENMergeRelativeDateRefiner extends MergingRefiner {
11
+ export default class ENMergeRelativeFollowByDateRefiner extends MergingRefiner {
12
12
  patternBetween() {
13
13
  return /^\s*$/i;
14
14
  }
@@ -30,4 +30,4 @@ export default class ENMergeRelativeDateRefiner extends MergingRefiner {
30
30
  return new ParsingResult(nextResult.reference, currentResult.index, `${currentResult.text}${textBetween}${nextResult.text}`, components);
31
31
  }
32
32
  }
33
- //# sourceMappingURL=ENMergeRelativeDateRefiner.js.map
33
+ //# sourceMappingURL=ENMergeRelativeFollowByDateRefiner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ENMergeRelativeFollowByDateRefiner.js","sourceRoot":"","sources":["../../../../../src/locales/en/refiners/ENMergeRelativeFollowByDateRefiner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,SAAS,8BAA8B,CAAC,MAAqB;IACzD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAqB;IACvD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;AAC3D,CAAC;AAOD,MAAM,CAAC,OAAO,OAAO,kCAAmC,SAAQ,cAAc;IAC1E,cAAc;QACV,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,kBAAkB,CAAC,WAAmB,EAAE,aAA4B,EAAE,UAAyB;QAE3F,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE;YAC3C,OAAO,KAAK,CAAC;SAChB;QAID,IAAI,CAAC,8BAA8B,CAAC,aAAa,CAAC,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,EAAE;YAChG,OAAO,KAAK,CAAC;SAChB;QAGD,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9G,CAAC;IAED,YAAY,CAAC,WAAmB,EAAE,aAA4B,EAAE,UAAyB;QACrF,IAAI,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,8BAA8B,CAAC,aAAa,CAAC,EAAE;YAC/C,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;SAC3C;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,2BAA2B,CAC5D,IAAI,qBAAqB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAClD,SAAS,CACZ,CAAC;QAEF,OAAO,IAAI,aAAa,CACpB,UAAU,CAAC,SAAS,EACpB,aAAa,CAAC,KAAK,EACnB,GAAG,aAAa,CAAC,IAAI,GAAG,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,EACvD,UAAU,CACb,CAAC;IACN,CAAC;CACJ"}
@@ -3,7 +3,7 @@ import { ParsingComponents } from "../../../results.js";
3
3
  import dayjs from "dayjs";
4
4
  import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary.js";
5
5
  import { matchAnyPattern } from "../../../utils/pattern.js";
6
- const PATTERN = new RegExp(`(dit|deze|komende|volgend|volgende|afgelopen|vorige)\\s*(${matchAnyPattern(TIME_UNIT_DICTIONARY)})(?=\\s*)` +
6
+ const PATTERN = new RegExp(`(dit|deze|(?:aan)?komend|volgend|afgelopen|vorig)e?\\s*(${matchAnyPattern(TIME_UNIT_DICTIONARY)})(?=\\s*)` +
7
7
  "(?=\\W|$)", "i");
8
8
  const MODIFIER_WORD_GROUP = 1;
9
9
  const RELATIVE_WORD_GROUP = 2;
@@ -15,12 +15,12 @@ export default class NLRelativeDateFormatParser extends AbstractParserWithWordBo
15
15
  const modifier = match[MODIFIER_WORD_GROUP].toLowerCase();
16
16
  const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase();
17
17
  const timeunit = TIME_UNIT_DICTIONARY[unitWord];
18
- if (modifier == "volgend" || modifier == "volgende" || modifier == "komende") {
18
+ if (modifier == "volgend" || modifier == "komend" || modifier == "aankomend") {
19
19
  const timeUnits = {};
20
20
  timeUnits[timeunit] = 1;
21
21
  return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
22
22
  }
23
- if (modifier == "afgelopen" || modifier == "vorige") {
23
+ if (modifier == "afgelopen" || modifier == "vorig") {
24
24
  const timeUnits = {};
25
25
  timeUnits[timeunit] = -1;
26
26
  return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
@@ -1 +1 @@
1
- {"version":3,"file":"NLRelativeDateFormatParser.js","sourceRoot":"","sources":["../../../../../src/locales/nl/parsers/NLRelativeDateFormatParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NLRelativeDateFormatParser.js","sourceRoot":"","sources":["../../../../../src/locales/nl/parsers/NLRelativeDateFormatParser.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,18 @@ import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants.js";
2
2
  import { ParsingComponents } from "../../../results.js";
3
3
  import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary.js";
4
4
  import { reverseTimeUnits } from "../../../utils/timeunits.js";
5
- const PATTERN = new RegExp(`(deze|vorige|afgelopen|komende|over|\\+|-)\\s*(${TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
5
+ const PATTERN = new RegExp(`(dit|deze|vorig|afgelopen|(?:aan)?komend|over|\\+|-)e?\\s*(${TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
6
+ const PREFIX_WORD_GROUP = 1;
7
+ const TIME_UNIT_WORD_GROUP = 2;
6
8
  export default class NLTimeUnitCasualRelativeFormatParser extends AbstractParserWithWordBoundaryChecking {
7
9
  innerPattern() {
8
10
  return PATTERN;
9
11
  }
10
12
  innerExtract(context, match) {
11
- const prefix = match[1].toLowerCase();
12
- let timeUnits = parseTimeUnits(match[2]);
13
+ const prefix = match[PREFIX_WORD_GROUP].toLowerCase();
14
+ let timeUnits = parseTimeUnits(match[TIME_UNIT_WORD_GROUP]);
13
15
  switch (prefix) {
14
- case "vorige":
16
+ case "vorig":
15
17
  case "afgelopen":
16
18
  case "-":
17
19
  timeUnits = reverseTimeUnits(timeUnits);
@@ -1 +1 @@
1
- {"version":3,"file":"NLTimeUnitCasualRelativeFormatParser.js","sourceRoot":"","sources":["../../../../../src/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAChH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,kDAAkD,kBAAkB,YAAY,EAAE,GAAG,CAAC,CAAC;AAElH,MAAM,CAAC,OAAO,OAAO,oCAAqC,SAAQ,sCAAsC;IACpG,YAAY;QACR,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,QAAQ,MAAM,EAAE;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,WAAW,CAAC;YACjB,KAAK,GAAG;gBACJ,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACxC,MAAM;SACb;QAED,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvF,CAAC;CACJ"}
1
+ {"version":3,"file":"NLTimeUnitCasualRelativeFormatParser.js","sourceRoot":"","sources":["../../../../../src/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sCAAsC,EAAE,MAAM,wDAAwD,CAAC;AAChH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,OAAO,GAAG,IAAI,MAAM,CACtB,8DAA8D,kBAAkB,YAAY,EAC5F,GAAG,CACN,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,MAAM,CAAC,OAAO,OAAO,oCAAqC,SAAQ,sCAAsC;IACpG,YAAY;QACR,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAuB,EAAE,KAAuB;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC5D,QAAQ,MAAM,EAAE;YACZ,KAAK,OAAO,CAAC;YACb,KAAK,WAAW,CAAC;YACjB,KAAK,GAAG;gBACJ,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACxC,MAAM;SACb;QAED,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvF,CAAC;CACJ"}
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "preset": "ts-jest"
16
16
  },
17
17
  "license": "MIT",
18
- "version": "2.7.3",
18
+ "version": "2.7.4",
19
19
  "directories": {
20
20
  "source": "./src",
21
21
  "test": "./test"
@@ -12,20 +12,29 @@ export default class OverlapRemovalRefiner implements Refiner {
12
12
  }
13
13
 
14
14
  const filteredResults = [];
15
-
16
15
  let prevResult = results[0];
17
16
  for (let i = 1; i < results.length; i++) {
18
17
  const result = results[i];
18
+ if (result.index >= prevResult.index + prevResult.text.length) {
19
+ filteredResults.push(prevResult);
20
+ prevResult = result;
21
+ continue;
22
+ }
19
23
 
20
24
  // If overlap, compare the length and discard the shorter one
21
- if (result.index < prevResult.index + prevResult.text.length) {
22
- if (result.text.length > prevResult.text.length) {
23
- prevResult = result;
24
- }
25
+ let kept = null;
26
+ let removed = null;
27
+ if (result.text.length > prevResult.text.length) {
28
+ kept = result;
29
+ removed = prevResult;
25
30
  } else {
26
- filteredResults.push(prevResult);
27
- prevResult = result;
31
+ kept = prevResult;
32
+ removed = result;
28
33
  }
34
+ context.debug(() => {
35
+ console.log(`${this.constructor.name} remove ${removed} by ${kept}`);
36
+ });
37
+ prevResult = kept;
29
38
  }
30
39
 
31
40
  // The last one
@@ -20,7 +20,9 @@ import ENRelativeDateFormatParser from "./parsers/ENRelativeDateFormatParser";
20
20
 
21
21
  import SlashDateFormatParser from "../../common/parsers/SlashDateFormatParser";
22
22
  import ENTimeUnitCasualRelativeFormatParser from "./parsers/ENTimeUnitCasualRelativeFormatParser";
23
- import ENMergeRelativeDateRefiner from "./refiners/ENMergeRelativeDateRefiner";
23
+ import ENMergeRelativeAfterDateRefiner from "./refiners/ENMergeRelativeAfterDateRefiner";
24
+ import ENMergeRelativeFollowByDateRefiner from "./refiners/ENMergeRelativeFollowByDateRefiner";
25
+ import OverlapRemovalRefiner from "../../common/refiners/OverlapRemovalRefiner";
24
26
 
25
27
  export default class ENDefaultConfiguration {
26
28
  /**
@@ -29,11 +31,11 @@ export default class ENDefaultConfiguration {
29
31
  */
30
32
  createCasualConfiguration(littleEndian = false): Configuration {
31
33
  const option = this.createConfiguration(false, littleEndian);
32
- option.parsers.unshift(new ENCasualDateParser());
33
- option.parsers.unshift(new ENCasualTimeParser());
34
- option.parsers.unshift(new ENMonthNameParser());
35
- option.parsers.unshift(new ENRelativeDateFormatParser());
36
- option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser());
34
+ option.parsers.push(new ENCasualDateParser());
35
+ option.parsers.push(new ENCasualTimeParser());
36
+ option.parsers.push(new ENMonthNameParser());
37
+ option.parsers.push(new ENRelativeDateFormatParser());
38
+ option.parsers.push(new ENTimeUnitCasualRelativeFormatParser());
37
39
  return option;
38
40
  }
39
41
 
@@ -50,7 +52,7 @@ export default class ENDefaultConfiguration {
50
52
  new SlashDateFormatParser(littleEndian),
51
53
  new ENTimeUnitWithinFormatParser(strictMode),
52
54
  new ENMonthNameLittleEndianParser(),
53
- new ENMonthNameMiddleEndianParser(),
55
+ new ENMonthNameMiddleEndianParser(/*shouldSkipYearLikeDate=*/ littleEndian),
54
56
  new ENWeekdayParser(),
55
57
  new ENCasualYearMonthDayParser(),
56
58
  new ENSlashMonthFormatParser(),
@@ -58,10 +60,15 @@ export default class ENDefaultConfiguration {
58
60
  new ENTimeUnitAgoFormatParser(strictMode),
59
61
  new ENTimeUnitLaterFormatParser(strictMode),
60
62
  ],
61
- refiners: [new ENMergeRelativeDateRefiner(), new ENMergeDateTimeRefiner()],
63
+ refiners: [new ENMergeDateTimeRefiner()],
62
64
  },
63
65
  strictMode
64
66
  );
67
+ // These relative-dates consideration should be done before other common refiners.
68
+ options.refiners.unshift(new ENMergeRelativeFollowByDateRefiner());
69
+ options.refiners.unshift(new ENMergeRelativeAfterDateRefiner());
70
+ options.refiners.unshift(new OverlapRemovalRefiner());
71
+
65
72
  // Re-apply the date time refiner again after the timezone refinement and exclusion in common refiners.
66
73
  options.refiners.push(new ENMergeDateTimeRefiner());
67
74
  // Keep the date range refiner at the end (after all other refinements).
@@ -231,7 +231,7 @@ export function parseOrdinalNumberPattern(match: string): number {
231
231
 
232
232
  //-----------------------------
233
233
 
234
- export const YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])`;
234
+ export const YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9]|2[0-5])`;
235
235
  export function parseYear(match: string): number {
236
236
  if (/BE/i.test(match)) {
237
237
  // Buddhist Era
@@ -13,22 +13,22 @@ import ENDefaultConfiguration from "./configuration";
13
13
  export { Chrono, Parser, Refiner, ParsingResult, ParsingComponents, ReferenceWithTimezone };
14
14
  export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Weekday };
15
15
 
16
- const enConfig = new ENDefaultConfiguration();
16
+ export const configuration = new ENDefaultConfiguration();
17
17
 
18
18
  /**
19
19
  * Chrono object configured for parsing *casual* English
20
20
  */
21
- export const casual = new Chrono(enConfig.createCasualConfiguration(false));
21
+ export const casual = new Chrono(configuration.createCasualConfiguration(false));
22
22
 
23
23
  /**
24
24
  * Chrono object configured for parsing *strict* English
25
25
  */
26
- export const strict = new Chrono(enConfig.createConfiguration(true, false));
26
+ export const strict = new Chrono(configuration.createConfiguration(true, false));
27
27
 
28
28
  /**
29
29
  * Chrono object configured for parsing *UK-style* English
30
30
  */
31
- export const GB = new Chrono(enConfig.createConfiguration(false, true));
31
+ export const GB = new Chrono(configuration.createCasualConfiguration(true));
32
32
 
33
33
  /**
34
34
  * A shortcut for en.casual.parse()
@@ -36,8 +36,16 @@ const YEAR_GROUP = 4;
36
36
  * - January 12:00
37
37
  * - January 12.44
38
38
  * - January 1222344
39
+ * - January 21 (when shouldSkipYearLikeDate=true)
39
40
  */
40
41
  export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking {
42
+ shouldSkipYearLikeDate: boolean;
43
+
44
+ constructor(shouldSkipYearLikeDate: boolean) {
45
+ super();
46
+ this.shouldSkipYearLikeDate = shouldSkipYearLikeDate;
47
+ }
48
+
41
49
  innerPattern(): RegExp {
42
50
  return PATTERN;
43
51
  }
@@ -49,10 +57,18 @@ export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWor
49
57
  return null;
50
58
  }
51
59
 
52
- const components = context.createParsingComponents({
53
- day: day,
54
- month: month,
55
- });
60
+ // Skip the case where the day looks like a year (ex: January 21)
61
+ if (this.shouldSkipYearLikeDate) {
62
+ if (!match[DATE_TO_GROUP] && !match[YEAR_GROUP] && match[DATE_GROUP].match(/^2[0-5]$/)) {
63
+ return null;
64
+ }
65
+ }
66
+ const components = context
67
+ .createParsingComponents({
68
+ day: day,
69
+ month: month,
70
+ })
71
+ .addTag("parser/ENMonthNameMiddleEndianParser");
56
72
 
57
73
  if (match[YEAR_GROUP]) {
58
74
  const year = parseYear(match[YEAR_GROUP]);
@@ -61,7 +77,6 @@ export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWor
61
77
  const year = findYearClosestToRef(context.refDate, day, month);
62
78
  components.imply("year", year);
63
79
  }
64
-
65
80
  if (!match[DATE_TO_GROUP]) {
66
81
  return components;
67
82
  }
@@ -45,6 +45,7 @@ export default class ENMonthNameParser extends AbstractParserWithWordBoundaryChe
45
45
  match.index + match[0].length
46
46
  );
47
47
  result.start.imply("day", 1);
48
+ result.start.addTag("parser/ENMonthNameParser");
48
49
 
49
50
  const month = MONTH_DICTIONARY[monthName];
50
51
  result.start.assign("month", month);
@@ -34,6 +34,11 @@ export default class ENTimeUnitWithinFormatParser extends AbstractParserWithWord
34
34
  }
35
35
 
36
36
  innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents {
37
+ // Exclude "for the unit" phases, e.g. "for the year"
38
+ if (match[0].match(/^for\s*the\s*\w+/)) {
39
+ return null;
40
+ }
41
+
37
42
  const timeUnits = parseTimeUnits(match[1]);
38
43
  return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
39
44
  }
@@ -0,0 +1,46 @@
1
+ import { MergingRefiner } from "../../../common/abstractRefiners";
2
+ import { ParsingComponents, ParsingResult, ReferenceWithTimezone } from "../../../results";
3
+ import { parseTimeUnits } from "../constants";
4
+ import { reverseTimeUnits } from "../../../utils/timeunits";
5
+
6
+ function IsPositiveFollowingReference(result: ParsingResult): boolean {
7
+ return result.text.match(/^[+-]/i) != null;
8
+ }
9
+
10
+ function IsNegativeFollowingReference(result: ParsingResult): boolean {
11
+ return result.text.match(/^-/i) != null;
12
+ }
13
+
14
+ /**
15
+ * Merges a relative data/time that comes after an absolute date.
16
+ * - [2020-02-13] [+2 weeks]
17
+ * - [next tuesday] [+10 days]
18
+ */
19
+ export default class ENMergeRelativeAfterDateRefiner extends MergingRefiner {
20
+ shouldMergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult): boolean {
21
+ if (!textBetween.match(/^\s*$/i)) {
22
+ return false;
23
+ }
24
+
25
+ return IsPositiveFollowingReference(nextResult) || IsNegativeFollowingReference(nextResult);
26
+ }
27
+
28
+ mergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult, context): ParsingResult {
29
+ let timeUnits = parseTimeUnits(nextResult.text);
30
+ if (IsNegativeFollowingReference(nextResult)) {
31
+ timeUnits = reverseTimeUnits(timeUnits);
32
+ }
33
+
34
+ const components = ParsingComponents.createRelativeFromReference(
35
+ new ReferenceWithTimezone(currentResult.start.date()),
36
+ timeUnits
37
+ );
38
+
39
+ return new ParsingResult(
40
+ currentResult.reference,
41
+ currentResult.index,
42
+ `${currentResult.text}${textBetween}${nextResult.text}`,
43
+ components
44
+ );
45
+ }
46
+ }
@@ -12,11 +12,11 @@ function hasImpliedLaterReferenceDate(result: ParsingResult): boolean {
12
12
  }
13
13
 
14
14
  /**
15
- * Merges an absolute date with a relative date.
16
- * - 2 weeks before 2020-02-13
17
- * - 2 days after next Friday
15
+ * Merges a relative data/time that follow by an absolute date.
16
+ * - [2 weeks before] [2020-02-13]
17
+ * - [2 days after] [next Friday]
18
18
  */
19
- export default class ENMergeRelativeDateRefiner extends MergingRefiner {
19
+ export default class ENMergeRelativeFollowByDateRefiner extends MergingRefiner {
20
20
  patternBetween(): RegExp {
21
21
  return /^\s*$/i;
22
22
  }
@@ -6,7 +6,7 @@ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/
6
6
  import { matchAnyPattern } from "../../../utils/pattern";
7
7
 
8
8
  const PATTERN = new RegExp(
9
- `(dit|deze|komende|volgend|volgende|afgelopen|vorige)\\s*(${matchAnyPattern(TIME_UNIT_DICTIONARY)})(?=\\s*)` +
9
+ `(dit|deze|(?:aan)?komend|volgend|afgelopen|vorig)e?\\s*(${matchAnyPattern(TIME_UNIT_DICTIONARY)})(?=\\s*)` +
10
10
  "(?=\\W|$)",
11
11
  "i"
12
12
  );
@@ -24,13 +24,13 @@ export default class NLRelativeDateFormatParser extends AbstractParserWithWordBo
24
24
  const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase();
25
25
  const timeunit = TIME_UNIT_DICTIONARY[unitWord];
26
26
 
27
- if (modifier == "volgend" || modifier == "volgende" || modifier == "komende") {
27
+ if (modifier == "volgend" || modifier == "komend" || modifier == "aankomend") {
28
28
  const timeUnits = {};
29
29
  timeUnits[timeunit] = 1;
30
30
  return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
31
31
  }
32
32
 
33
- if (modifier == "afgelopen" || modifier == "vorige") {
33
+ if (modifier == "afgelopen" || modifier == "vorig") {
34
34
  const timeUnits = {};
35
35
  timeUnits[timeunit] = -1;
36
36
  return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
@@ -4,7 +4,13 @@ import { ParsingComponents } from "../../../results";
4
4
  import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
5
5
  import { reverseTimeUnits } from "../../../utils/timeunits";
6
6
 
7
- const PATTERN = new RegExp(`(deze|vorige|afgelopen|komende|over|\\+|-)\\s*(${TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
7
+ const PATTERN = new RegExp(
8
+ `(dit|deze|vorig|afgelopen|(?:aan)?komend|over|\\+|-)e?\\s*(${TIME_UNITS_PATTERN})(?=\\W|$)`,
9
+ "i"
10
+ );
11
+
12
+ const PREFIX_WORD_GROUP = 1;
13
+ const TIME_UNIT_WORD_GROUP = 2;
8
14
 
9
15
  export default class NLTimeUnitCasualRelativeFormatParser extends AbstractParserWithWordBoundaryChecking {
10
16
  innerPattern(): RegExp {
@@ -12,10 +18,10 @@ export default class NLTimeUnitCasualRelativeFormatParser extends AbstractParser
12
18
  }
13
19
 
14
20
  innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents {
15
- const prefix = match[1].toLowerCase();
16
- let timeUnits = parseTimeUnits(match[2]);
21
+ const prefix = match[PREFIX_WORD_GROUP].toLowerCase();
22
+ let timeUnits = parseTimeUnits(match[TIME_UNIT_WORD_GROUP]);
17
23
  switch (prefix) {
18
- case "vorige":
24
+ case "vorig":
19
25
  case "afgelopen":
20
26
  case "-":
21
27
  timeUnits = reverseTimeUnits(timeUnits);
@@ -68,6 +68,12 @@ test("Test - Month-Year expression", function () {
68
68
 
69
69
  expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12));
70
70
  });
71
+
72
+ testSingleCase(chrono, "Statement of comprehensive income for the year ended Dec. 2021", (result) => {
73
+ expect(result.start.get("year")).toBe(2021);
74
+ expect(result.start.get("month")).toBe(12);
75
+ expect(result.text).toBe("Dec. 2021");
76
+ });
71
77
  });
72
78
 
73
79
  test("Test - Month-Only expression", function () {