chrono-node 2.7.4 → 2.7.6

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 (122) hide show
  1. package/dist/cjs/common/parsers/AbstractTimeExpressionParser.js +11 -2
  2. package/dist/cjs/common/parsers/AbstractTimeExpressionParser.js.map +1 -1
  3. package/dist/cjs/index.d.ts +1 -1
  4. package/dist/cjs/locales/de/index.d.ts +2 -2
  5. package/dist/cjs/locales/de/index.js.map +1 -1
  6. package/dist/cjs/locales/en/constants.js +3 -2
  7. package/dist/cjs/locales/en/constants.js.map +1 -1
  8. package/dist/cjs/locales/en/index.d.ts +2 -2
  9. package/dist/cjs/locales/en/index.js.map +1 -1
  10. package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
  11. package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
  12. package/dist/cjs/locales/en/parsers/ENMonthNameMiddleEndianParser.js +1 -1
  13. package/dist/cjs/locales/en/parsers/ENMonthNameMiddleEndianParser.js.map +1 -1
  14. package/dist/cjs/locales/en/parsers/ENTimeUnitLaterFormatParser.js +1 -1
  15. package/dist/cjs/locales/en/parsers/ENTimeUnitLaterFormatParser.js.map +1 -1
  16. package/dist/cjs/locales/en/refiners/ENMergeDateTimeRefiner.js +1 -1
  17. package/dist/cjs/locales/en/refiners/ENMergeDateTimeRefiner.js.map +1 -1
  18. package/dist/cjs/locales/es/index.d.ts +2 -2
  19. package/dist/cjs/locales/es/index.js.map +1 -1
  20. package/dist/cjs/locales/fr/index.d.ts +2 -2
  21. package/dist/cjs/locales/fr/index.js.map +1 -1
  22. package/dist/cjs/locales/ja/index.d.ts +2 -2
  23. package/dist/cjs/locales/ja/index.js.map +1 -1
  24. package/dist/cjs/locales/nl/index.d.ts +2 -2
  25. package/dist/cjs/locales/nl/index.js.map +1 -1
  26. package/dist/cjs/locales/pt/index.d.ts +2 -2
  27. package/dist/cjs/locales/pt/index.js.map +1 -1
  28. package/dist/cjs/locales/ru/index.d.ts +2 -2
  29. package/dist/cjs/locales/ru/index.js.map +1 -1
  30. package/dist/cjs/locales/uk/index.d.ts +2 -2
  31. package/dist/cjs/locales/uk/index.js.map +1 -1
  32. package/dist/cjs/locales/zh/hans/index.d.ts +2 -2
  33. package/dist/cjs/locales/zh/hans/index.js.map +1 -1
  34. package/dist/cjs/locales/zh/hant/index.d.ts +2 -2
  35. package/dist/cjs/locales/zh/hant/index.js.map +1 -1
  36. package/dist/cjs/locales/zh/index.d.ts +12 -1
  37. package/dist/cjs/locales/zh/index.js +65 -5
  38. package/dist/cjs/locales/zh/index.js.map +1 -1
  39. package/dist/cjs/utils/pattern.d.ts +1 -1
  40. package/dist/cjs/utils/pattern.js +2 -2
  41. package/dist/cjs/utils/pattern.js.map +1 -1
  42. package/dist/esm/common/parsers/AbstractTimeExpressionParser.js +11 -2
  43. package/dist/esm/common/parsers/AbstractTimeExpressionParser.js.map +1 -1
  44. package/dist/esm/index.d.ts +1 -1
  45. package/dist/esm/locales/de/index.d.ts +2 -2
  46. package/dist/esm/locales/de/index.js.map +1 -1
  47. package/dist/esm/locales/en/constants.js +3 -2
  48. package/dist/esm/locales/en/constants.js.map +1 -1
  49. package/dist/esm/locales/en/index.d.ts +2 -2
  50. package/dist/esm/locales/en/index.js.map +1 -1
  51. package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
  52. package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
  53. package/dist/esm/locales/en/parsers/ENMonthNameMiddleEndianParser.js +1 -1
  54. package/dist/esm/locales/en/parsers/ENMonthNameMiddleEndianParser.js.map +1 -1
  55. package/dist/esm/locales/en/parsers/ENTimeUnitLaterFormatParser.js +1 -1
  56. package/dist/esm/locales/en/parsers/ENTimeUnitLaterFormatParser.js.map +1 -1
  57. package/dist/esm/locales/en/refiners/ENMergeDateTimeRefiner.js +1 -1
  58. package/dist/esm/locales/en/refiners/ENMergeDateTimeRefiner.js.map +1 -1
  59. package/dist/esm/locales/es/index.d.ts +2 -2
  60. package/dist/esm/locales/es/index.js.map +1 -1
  61. package/dist/esm/locales/fr/index.d.ts +2 -2
  62. package/dist/esm/locales/fr/index.js.map +1 -1
  63. package/dist/esm/locales/ja/index.d.ts +2 -2
  64. package/dist/esm/locales/ja/index.js.map +1 -1
  65. package/dist/esm/locales/nl/index.d.ts +2 -2
  66. package/dist/esm/locales/nl/index.js.map +1 -1
  67. package/dist/esm/locales/pt/index.d.ts +2 -2
  68. package/dist/esm/locales/pt/index.js.map +1 -1
  69. package/dist/esm/locales/ru/index.d.ts +2 -2
  70. package/dist/esm/locales/ru/index.js.map +1 -1
  71. package/dist/esm/locales/uk/index.d.ts +2 -2
  72. package/dist/esm/locales/uk/index.js.map +1 -1
  73. package/dist/esm/locales/zh/hans/index.d.ts +2 -2
  74. package/dist/esm/locales/zh/hans/index.js.map +1 -1
  75. package/dist/esm/locales/zh/hant/index.d.ts +2 -2
  76. package/dist/esm/locales/zh/hant/index.js.map +1 -1
  77. package/dist/esm/locales/zh/index.d.ts +12 -1
  78. package/dist/esm/locales/zh/index.js +53 -1
  79. package/dist/esm/locales/zh/index.js.map +1 -1
  80. package/dist/esm/utils/pattern.d.ts +1 -1
  81. package/dist/esm/utils/pattern.js +2 -2
  82. package/dist/esm/utils/pattern.js.map +1 -1
  83. package/package.json +1 -1
  84. package/src/common/parsers/AbstractTimeExpressionParser.ts +16 -2
  85. package/src/index.ts +1 -1
  86. package/src/locales/de/index.ts +2 -2
  87. package/src/locales/en/constants.ts +9 -2
  88. package/src/locales/en/index.ts +2 -2
  89. package/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts +1 -1
  90. package/src/locales/en/parsers/ENMonthNameMiddleEndianParser.ts +5 -4
  91. package/src/locales/en/parsers/ENTimeUnitLaterFormatParser.ts +1 -4
  92. package/src/locales/en/refiners/ENMergeDateTimeRefiner.ts +1 -1
  93. package/src/locales/es/index.ts +2 -2
  94. package/src/locales/fr/index.ts +2 -2
  95. package/src/locales/ja/index.ts +2 -2
  96. package/src/locales/nl/index.ts +2 -2
  97. package/src/locales/pt/index.ts +2 -2
  98. package/src/locales/ru/index.ts +2 -2
  99. package/src/locales/uk/index.ts +2 -2
  100. package/src/locales/zh/hans/index.ts +2 -2
  101. package/src/locales/zh/hant/index.ts +2 -2
  102. package/src/locales/zh/index.ts +73 -1
  103. package/src/utils/pattern.ts +6 -2
  104. package/test/en/en_casual.test.ts +6 -0
  105. package/test/en/en_month.test.ts +6 -1
  106. package/test/en/en_month_name_middle_endian.test.ts +2 -0
  107. package/test/en/en_slash.test.ts +15 -0
  108. package/test/en/en_time_exp.test.ts +30 -0
  109. package/test/en/en_time_units_later.test.ts +12 -0
  110. package/test/en/en_time_units_within.test.ts +42 -0
  111. package/test/system_timezone.test.ts +11 -0
  112. package/test/zh/{zh_hans_casual.test.ts → hans/zh_hans_casual.test.ts} +2 -2
  113. package/test/zh/{zh_hans_date.test.ts → hans/zh_hans_date.test.ts} +2 -2
  114. package/test/zh/{zh_hans_deadline.test.ts → hans/zh_hans_deadline.test.ts} +2 -2
  115. package/test/zh/{zh_hans_time_exp.test.ts → hans/zh_hans_time_exp.test.ts} +16 -2
  116. package/test/zh/{zh_hans_weekday.test.ts → hans/zh_hans_weekday.test.ts} +2 -2
  117. package/test/zh/{zh_hant_casual.test.ts → hant/zh_hant_casual.test.ts} +2 -2
  118. package/test/zh/{zh_hant_date.test.ts → hant/zh_hant_date.test.ts} +2 -2
  119. package/test/zh/{zh_hant_deadline.test.ts → hant/zh_hant_deadline.test.ts} +2 -2
  120. package/test/zh/{zh_hant_time_exp.test.ts → hant/zh_hant_time_exp.test.ts} +2 -2
  121. package/test/zh/{zh_hant_weekday.test.ts → hant/zh_hant_weekday.test.ts} +2 -2
  122. package/test/zh/zh.test.ts +18 -0
@@ -1,7 +1,7 @@
1
1
  declare type DictionaryLike = string[] | {
2
2
  [word: string]: unknown;
3
3
  } | Map<string, unknown>;
4
- export declare function repeatedTimeunitPattern(prefix: string, singleTimeunitPattern: string): string;
4
+ export declare function repeatedTimeunitPattern(prefix: string, singleTimeunitPattern: string, connectorPattern?: string): string;
5
5
  export declare function extractTerms(dictionary: DictionaryLike): string[];
6
6
  export declare function matchAnyPattern(dictionary: DictionaryLike): string;
7
7
  export {};
@@ -1,6 +1,6 @@
1
- export function repeatedTimeunitPattern(prefix, singleTimeunitPattern) {
1
+ export function repeatedTimeunitPattern(prefix, singleTimeunitPattern, connectorPattern = "\\s{0,5},?\\s{0,5}") {
2
2
  const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:");
3
- return `${prefix}${singleTimeunitPatternNoCapture}\\s{0,5}(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`;
3
+ return `${prefix}${singleTimeunitPatternNoCapture}(?:${connectorPattern}${singleTimeunitPatternNoCapture}){0,10}`;
4
4
  }
5
5
  export function extractTerms(dictionary) {
6
6
  let keys;
@@ -1 +1 @@
1
- {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../../src/utils/pattern.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,qBAA6B;IACjF,MAAM,8BAA8B,GAAG,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzF,OAAO,GAAG,MAAM,GAAG,8BAA8B,wBAAwB,8BAA8B,SAAS,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAA0B;IACnD,IAAI,IAAc,CAAC;IACnB,IAAI,UAAU,YAAY,KAAK,EAAE;QAC7B,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;KAC1B;SAAM,IAAI,UAAU,YAAY,GAAG,EAAE;QAClC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAE,UAAmC,CAAC,IAAI,EAAE,CAAC,CAAC;KAClE;SAAM;QACH,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAClC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAA0B;IAGtD,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;SACnC,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE3B,OAAO,MAAM,WAAW,GAAG,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../../src/utils/pattern.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CACnC,MAAc,EACd,qBAA6B,EAC7B,gBAAgB,GAAG,oBAAoB;IAEvC,MAAM,8BAA8B,GAAG,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzF,OAAO,GAAG,MAAM,GAAG,8BAA8B,MAAM,gBAAgB,GAAG,8BAA8B,SAAS,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAA0B;IACnD,IAAI,IAAc,CAAC;IACnB,IAAI,UAAU,YAAY,KAAK,EAAE;QAC7B,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;KAC1B;SAAM,IAAI,UAAU,YAAY,GAAG,EAAE;QAClC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAE,UAAmC,CAAC,IAAI,EAAE,CAAC,CAAC;KAClE;SAAM;QACH,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAClC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAA0B;IAGtD,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;SACnC,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE3B,OAAO,MAAM,WAAW,GAAG,CAAC;AAChC,CAAC"}
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "preset": "ts-jest"
16
16
  },
17
17
  "license": "MIT",
18
- "version": "2.7.4",
18
+ "version": "2.7.6",
19
19
  "directories": {
20
20
  "source": "./src",
21
21
  "test": "./test"
@@ -80,6 +80,13 @@ export abstract class AbstractTimeExpressionParser implements Parser {
80
80
  extract(context: ParsingContext, match: RegExpMatchArray): ParsingResult {
81
81
  const startComponents = this.extractPrimaryTimeComponents(context, match);
82
82
  if (!startComponents) {
83
+ // If the match seem like a year e.g. "2013.12:...",
84
+ // then skips the year part and try matching again.
85
+ if (match[0].match(/^\d{4}/)) {
86
+ match.index += 4; // Skip over potential overlapping pattern
87
+ return null;
88
+ }
89
+
83
90
  match.index += match[0].length; // Skip over potential overlapping pattern
84
91
  return null;
85
92
  }
@@ -94,8 +101,15 @@ export abstract class AbstractTimeExpressionParser implements Parser {
94
101
  const followingMatch = followingPattern.exec(remainingText);
95
102
 
96
103
  // Pattern "456-12", "2022-12" should not be time without proper context
97
- if (text.match(/^\d{3,4}/) && followingMatch && followingMatch[0].match(/^\s*([+-])\s*\d{2,4}$/)) {
98
- return null;
104
+ if (text.match(/^\d{3,4}/) && followingMatch) {
105
+ // e.g. "2022-12"
106
+ if (followingMatch[0].match(/^\s*([+-])\s*\d{2,4}$/)) {
107
+ return null;
108
+ }
109
+ // e.g. "2022-12:01..."
110
+ if (followingMatch[0].match(/^\s*([+-])\s*\d{2}\W\d{2}/)) {
111
+ return null;
112
+ }
99
113
  }
100
114
 
101
115
  if (
package/src/index.ts CHANGED
@@ -39,6 +39,6 @@ export function parse(text: string, ref?: ParsingReference | Date, option?: Pars
39
39
  /**
40
40
  * A shortcut for {@link en | chrono.en.casual.parseDate()}
41
41
  */
42
- export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
42
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date | null {
43
43
  return casual.parseDate(text, ref, option);
44
44
  }
@@ -22,11 +22,11 @@ export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Wee
22
22
  export const casual = new Chrono(createCasualConfiguration());
23
23
  export const strict = new Chrono(createConfiguration(true));
24
24
 
25
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
25
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
26
26
  return casual.parse(text, ref, option);
27
27
  }
28
28
 
29
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
29
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
30
30
  return casual.parseDate(text, ref, option);
31
31
  }
32
32
 
@@ -264,10 +264,17 @@ const SINGLE_TIME_UNIT_NO_ABBR_PATTERN = `(${NUMBER_PATTERN})\\s{0,3}(${matchAny
264
264
  TIME_UNIT_DICTIONARY_NO_ABBR
265
265
  )})`;
266
266
 
267
- export const TIME_UNITS_PATTERN = repeatedTimeunitPattern(`(?:(?:about|around)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN);
267
+ const TIME_UNIT_CONNECTOR_PATTERN = `\\s{0,5},?(?:\\s*and)?\\s{0,5}`;
268
+
269
+ export const TIME_UNITS_PATTERN = repeatedTimeunitPattern(
270
+ `(?:(?:about|around)\\s{0,3})?`,
271
+ SINGLE_TIME_UNIT_PATTERN,
272
+ TIME_UNIT_CONNECTOR_PATTERN
273
+ );
268
274
  export const TIME_UNITS_NO_ABBR_PATTERN = repeatedTimeunitPattern(
269
275
  `(?:(?:about|around)\\s{0,3})?`,
270
- SINGLE_TIME_UNIT_NO_ABBR_PATTERN
276
+ SINGLE_TIME_UNIT_NO_ABBR_PATTERN,
277
+ TIME_UNIT_CONNECTOR_PATTERN
271
278
  );
272
279
 
273
280
  export function parseTimeUnits(timeunitText): TimeUnits {
@@ -33,13 +33,13 @@ export const GB = new Chrono(configuration.createCasualConfiguration(true));
33
33
  /**
34
34
  * A shortcut for en.casual.parse()
35
35
  */
36
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
36
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
37
37
  return casual.parse(text, ref, option);
38
38
  }
39
39
 
40
40
  /**
41
41
  * A shortcut for en.casual.parseDate()
42
42
  */
43
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
43
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
44
44
  return casual.parseDate(text, ref, option);
45
45
  }
@@ -19,7 +19,7 @@ const PATTERN = new RegExp(
19
19
  `(${matchAnyPattern(MONTH_DICTIONARY)})` +
20
20
  "(?:" +
21
21
  `(?:-|/|,?\\s{0,3})` +
22
- `(${YEAR_PATTERN}(?![^\\s]\\d))` +
22
+ `(${YEAR_PATTERN}(?!\\w))` +
23
23
  ")?" +
24
24
  "(?=\\W|$)",
25
25
  "i"
@@ -6,17 +6,18 @@ import { YEAR_PATTERN, parseYear } from "../constants";
6
6
  import { matchAnyPattern } from "../../../utils/pattern";
7
7
  import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
8
8
 
9
+ // prettier-ignore
9
10
  const PATTERN = new RegExp(
10
11
  `(${matchAnyPattern(MONTH_DICTIONARY)})` +
11
12
  "(?:-|/|\\s*,?\\s*)" +
12
13
  `(${ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*` +
13
14
  "(?:" +
14
- "(?:to|\\-)\\s*" +
15
- `(${ORDINAL_NUMBER_PATTERN})\\s*` +
15
+ "(?:to|\\-)\\s*" +
16
+ `(${ORDINAL_NUMBER_PATTERN})\\s*` +
16
17
  ")?" +
17
18
  "(?:" +
18
- "(?:-|/|\\s*,?\\s*)" +
19
- `(${YEAR_PATTERN})` +
19
+ `(?:-|/|\\s*,\\s*|\\s+)` +
20
+ `(${YEAR_PATTERN})` +
20
21
  ")?" +
21
22
  "(?=\\W|$)(?!\\:\\d)",
22
23
  "i"
@@ -8,10 +8,7 @@ const PATTERN = new RegExp(
8
8
  "i"
9
9
  );
10
10
 
11
- const STRICT_PATTERN = new RegExp(
12
- "" + "(" + TIME_UNITS_NO_ABBR_PATTERN + ")" + "(later|from now)" + "(?=(?:\\W|$))",
13
- "i"
14
- );
11
+ const STRICT_PATTERN = new RegExp(`(${TIME_UNITS_NO_ABBR_PATTERN})\\s{0,5}(later|after|from now)(?=\\W|$)`, "i");
15
12
  const GROUP_NUM_TIMEUNITS = 1;
16
13
 
17
14
  export default class ENTimeUnitLaterFormatParser extends AbstractParserWithWordBoundaryChecking {
@@ -8,6 +8,6 @@ import AbstractMergeDateTimeRefiner from "../../../common/refiners/AbstractMerge
8
8
  */
9
9
  export default class ENMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner {
10
10
  patternBetween(): RegExp {
11
- return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$");
11
+ return new RegExp("^\\s*(T|at|after|before|on|of|,|-|\\.|:)?\\s*$");
12
12
  }
13
13
  }
@@ -25,11 +25,11 @@ export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Wee
25
25
  export const casual = new Chrono(createCasualConfiguration());
26
26
  export const strict = new Chrono(createConfiguration(true));
27
27
 
28
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
28
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
29
29
  return casual.parse(text, ref, option);
30
30
  }
31
31
 
32
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
32
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
33
33
  return casual.parseDate(text, ref, option);
34
34
  }
35
35
 
@@ -28,11 +28,11 @@ export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Wee
28
28
  export const casual = new Chrono(createCasualConfiguration());
29
29
  export const strict = new Chrono(createConfiguration(true));
30
30
 
31
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
31
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
32
32
  return casual.parse(text, ref, option);
33
33
  }
34
34
 
35
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
35
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
36
36
  return casual.parseDate(text, ref, option);
37
37
  }
38
38
 
@@ -19,11 +19,11 @@ export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Wee
19
19
  export const casual = new Chrono(createCasualConfiguration());
20
20
  export const strict = new Chrono(createConfiguration());
21
21
 
22
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
22
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
23
23
  return casual.parse(text, ref, option);
24
24
  }
25
25
 
26
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
26
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
27
27
  return casual.parseDate(text, ref, option);
28
28
  }
29
29
 
@@ -33,11 +33,11 @@ export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Wee
33
33
  export const casual = new Chrono(createCasualConfiguration());
34
34
  export const strict = new Chrono(createConfiguration(true));
35
35
 
36
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
36
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
37
37
  return casual.parse(text, ref, option);
38
38
  }
39
39
 
40
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
40
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
41
41
  return casual.parseDate(text, ref, option);
42
42
  }
43
43
 
@@ -24,11 +24,11 @@ export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Wee
24
24
  export const casual = new Chrono(createCasualConfiguration());
25
25
  export const strict = new Chrono(createConfiguration(true));
26
26
 
27
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
27
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
28
28
  return casual.parse(text, ref, option);
29
29
  }
30
30
 
31
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
31
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
32
32
  return casual.parseDate(text, ref, option);
33
33
  }
34
34
 
@@ -40,14 +40,14 @@ export const strict = new Chrono(createConfiguration(true));
40
40
  /**
41
41
  * A shortcut for ru.casual.parse()
42
42
  */
43
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
43
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
44
44
  return casual.parse(text, ref, option);
45
45
  }
46
46
 
47
47
  /**
48
48
  * A shortcut for ru.casual.parseDate()
49
49
  */
50
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
50
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
51
51
  return casual.parseDate(text, ref, option);
52
52
  }
53
53
 
@@ -78,13 +78,13 @@ export function createConfiguration(strictMode: boolean): Configuration {
78
78
  /**
79
79
  * A shortcut for uk.casual.parse()
80
80
  */
81
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
81
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
82
82
  return casual.parse(text, ref, option);
83
83
  }
84
84
 
85
85
  /**
86
86
  * A shortcut for uk.casual.parseDate()
87
87
  */
88
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
88
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
89
89
  return casual.parseDate(text, ref, option);
90
90
  }
@@ -25,11 +25,11 @@ export const hans = new Chrono(createCasualConfiguration());
25
25
  export const casual = new Chrono(createCasualConfiguration());
26
26
  export const strict = new Chrono(createConfiguration());
27
27
 
28
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
28
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
29
29
  return casual.parse(text, ref, option);
30
30
  }
31
31
 
32
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
32
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
33
33
  return casual.parseDate(text, ref, option);
34
34
  }
35
35
 
@@ -26,11 +26,11 @@ export const hant = new Chrono(createCasualConfiguration());
26
26
  export const casual = new Chrono(createCasualConfiguration());
27
27
  export const strict = new Chrono(createConfiguration());
28
28
 
29
- export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
29
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
30
30
  return casual.parse(text, ref, option);
31
31
  }
32
32
 
33
- export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
33
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
34
34
  return casual.parseDate(text, ref, option);
35
35
  }
36
36
 
@@ -1,2 +1,74 @@
1
- export * from "./hant";
1
+ import { includeCommonConfiguration } from "../../configurations";
2
+ import { Chrono, Configuration, Parser, Refiner } from "../../chrono";
3
+ import { ParsingResult, ParsingComponents, ReferenceWithTimezone } from "../../results";
4
+ import { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Weekday } from "../../types";
5
+ import ExtractTimezoneOffsetRefiner from "../../common/refiners/ExtractTimezoneOffsetRefiner";
6
+
7
+ import ZHHansCasualDateParser from "./hans/parsers/ZHHansCasualDateParser";
8
+ import ZHHansDateParser from "./hans/parsers/ZHHansDateParser";
9
+ import ZHHansDeadlineFormatParser from "./hans/parsers/ZHHansDeadlineFormatParser";
10
+ import ZHHansRelationWeekdayParser from "./hans/parsers/ZHHansRelationWeekdayParser";
11
+ import ZHHansTimeExpressionParser from "./hans/parsers/ZHHansTimeExpressionParser";
12
+ import ZHHansWeekdayParser from "./hans/parsers/ZHHansWeekdayParser";
13
+
14
+ import ZHHantCasualDateParser from "./hant/parsers/ZHHantCasualDateParser";
15
+ import ZHHantDateParser from "./hant/parsers/ZHHantDateParser";
16
+ import ZHHantDeadlineFormatParser from "./hant/parsers/ZHHantDeadlineFormatParser";
17
+ import ZHHantRelationWeekdayParser from "./hant/parsers/ZHHantRelationWeekdayParser";
18
+ import ZHHantTimeExpressionParser from "./hant/parsers/ZHHantTimeExpressionParser";
19
+ import ZHHantWeekdayParser from "./hant/parsers/ZHHantWeekdayParser";
20
+ import ZHHantMergeDateRangeRefiner from "./hant/refiners/ZHHantMergeDateRangeRefiner";
21
+ import ZHHantMergeDateTimeRefiner from "./hant/refiners/ZHHantMergeDateTimeRefiner";
22
+
23
+ export * as hant from "./hant";
2
24
  export * as hans from "./hans";
25
+ export { Chrono, Parser, Refiner, ParsingResult, ParsingComponents, ReferenceWithTimezone };
26
+ export { Component, ParsedResult, ParsingOption, ParsingReference, Meridiem, Weekday };
27
+
28
+ export const casual = new Chrono(createCasualConfiguration());
29
+ export const strict = new Chrono(createConfiguration());
30
+
31
+ export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
32
+ return casual.parse(text, ref, option);
33
+ }
34
+
35
+ export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
36
+ return casual.parseDate(text, ref, option);
37
+ }
38
+
39
+ /**
40
+ * @ignore (to be documented later)
41
+ */
42
+ export function createCasualConfiguration(): Configuration {
43
+ const option = createConfiguration();
44
+ option.parsers.unshift(new ZHHantCasualDateParser());
45
+ return option;
46
+ }
47
+
48
+ /**
49
+ * @ignore (to be documented later)
50
+ */
51
+ export function createConfiguration(): Configuration {
52
+ const configuration = includeCommonConfiguration({
53
+ parsers: [
54
+ new ZHHantDateParser(),
55
+ new ZHHansDateParser(),
56
+ new ZHHantRelationWeekdayParser(),
57
+ new ZHHansRelationWeekdayParser(),
58
+ new ZHHantWeekdayParser(),
59
+ new ZHHansWeekdayParser(),
60
+ new ZHHantTimeExpressionParser(),
61
+ new ZHHansTimeExpressionParser(),
62
+ new ZHHantDeadlineFormatParser(),
63
+ new ZHHansDeadlineFormatParser(),
64
+ ],
65
+ refiners: [new ZHHantMergeDateRangeRefiner(), new ZHHantMergeDateTimeRefiner()],
66
+ });
67
+
68
+ // REMOVE ExtractTimezoneOffsetRefiner
69
+ configuration.refiners = configuration.refiners.filter(
70
+ (refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner)
71
+ );
72
+
73
+ return configuration;
74
+ }
@@ -1,8 +1,12 @@
1
1
  type DictionaryLike = string[] | { [word: string]: unknown } | Map<string, unknown>;
2
2
 
3
- export function repeatedTimeunitPattern(prefix: string, singleTimeunitPattern: string): string {
3
+ export function repeatedTimeunitPattern(
4
+ prefix: string,
5
+ singleTimeunitPattern: string,
6
+ connectorPattern = "\\s{0,5},?\\s{0,5}"
7
+ ): string {
4
8
  const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:");
5
- return `${prefix}${singleTimeunitPatternNoCapture}\\s{0,5}(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`;
9
+ return `${prefix}${singleTimeunitPatternNoCapture}(?:${connectorPattern}${singleTimeunitPatternNoCapture}){0,10}`;
6
10
  }
7
11
 
8
12
  export function extractTerms(dictionary: DictionaryLike): string[] {
@@ -409,4 +409,10 @@ test("Test - Random negative text", () => {
409
409
  testUnexpectedResult(chrono, "mar");
410
410
 
411
411
  testUnexpectedResult(chrono, "jan");
412
+
413
+ testUnexpectedResult(chrono, "do I have the money");
414
+
415
+ testUnexpectedResult(chrono.casual, "do I have the money");
416
+
417
+ testUnexpectedResult(chrono.en.GB, "do I have the money");
412
418
  });
@@ -70,9 +70,14 @@ test("Test - Month-Year expression", function () {
70
70
  });
71
71
 
72
72
  testSingleCase(chrono, "Statement of comprehensive income for the year ended Dec. 2021", (result) => {
73
+ expect(result.text).toBe("Dec. 2021");
74
+
73
75
  expect(result.start.get("year")).toBe(2021);
74
76
  expect(result.start.get("month")).toBe(12);
75
- expect(result.text).toBe("Dec. 2021");
77
+
78
+ expect(result.start.isCertain("year")).toBe(true);
79
+ expect(result.start.isCertain("month")).toBe(true);
80
+ expect(result.start.isCertain("day")).toBe(false);
76
81
  });
77
82
  });
78
83
 
@@ -381,4 +381,6 @@ test("Test - Impossible Dates (Strict Mode)", () => {
381
381
  testUnexpectedResult(chrono.strict, "August 32", new Date(2012, 7, 10));
382
382
 
383
383
  testUnexpectedResult(chrono.strict, "February 29", new Date(2014, 7, 10));
384
+
385
+ testUnexpectedResult(chrono.strict, "February 151998", new Date(2014, 7, 10));
384
386
  });
@@ -136,6 +136,21 @@ test("Test - Single Expression Little-Endian with Month name", function () {
136
136
 
137
137
  expect(result.start).toBeDate(new Date(2012, 10 - 1, 8, 12));
138
138
  });
139
+
140
+ testSingleCase(chrono.strict, "06/Nov/2023", (result) => {
141
+ expect(result.text).toBe("06/Nov/2023");
142
+ expect(result).toBeDate(new Date(2023, 11 - 1, 6, 12));
143
+ });
144
+
145
+ testSingleCase(chrono.strict, "06/Nov/2023:06:36:02", (result) => {
146
+ expect(result.text).toBe("06/Nov/2023:06:36:02");
147
+ expect(result).toBeDate(new Date(2023, 11 - 1, 6, 6, 36, 2));
148
+ });
149
+
150
+ testSingleCase(chrono.strict, "06/Nov/2023:06:36:02 +0200", (result) => {
151
+ expect(result.text).toBe("06/Nov/2023:06:36:02 +0200");
152
+ expect(result).toBeDate(new Date("Mon Nov 06 2023 06:36:02 GMT+0200"));
153
+ });
139
154
  });
140
155
 
141
156
  test("Test - Range Expression", function () {
@@ -24,6 +24,36 @@ test("Test - Time expression", function () {
24
24
  });
25
25
  });
26
26
 
27
+ test("Test - Time expression after date", function () {
28
+ testSingleCase(chrono, "05/31/2024 14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
29
+ expect(result.text).toBe(text);
30
+ expect(result.start.get("hour")).toBe(14);
31
+ expect(result.start.get("minute")).toBe(15);
32
+ expect(result.start.get("meridiem")).toBe(Meridiem.PM);
33
+ });
34
+
35
+ testSingleCase(chrono, "05/31/2024.14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
36
+ expect(result.text).toBe(text);
37
+ expect(result.start.get("hour")).toBe(14);
38
+ expect(result.start.get("minute")).toBe(15);
39
+ expect(result.start.get("meridiem")).toBe(Meridiem.PM);
40
+ });
41
+
42
+ testSingleCase(chrono, "05/31/2024:14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
43
+ expect(result.text).toBe(text);
44
+ expect(result.start.get("hour")).toBe(14);
45
+ expect(result.start.get("minute")).toBe(15);
46
+ expect(result.start.get("meridiem")).toBe(Meridiem.PM);
47
+ });
48
+
49
+ testSingleCase(chrono, "05/31/2024-14:15", new Date(2016, 10 - 1, 1, 8), (result, text) => {
50
+ expect(result.text).toBe(text);
51
+ expect(result.start.get("hour")).toBe(14);
52
+ expect(result.start.get("minute")).toBe(15);
53
+ expect(result.start.get("meridiem")).toBe(Meridiem.PM);
54
+ });
55
+ });
56
+
27
57
  test("Test - Time range expression", function () {
28
58
  testSingleCase(chrono, "10:00:00 - 21:45:00", new Date(2016, 10 - 1, 1, 8), (result, text) => {
29
59
  expect(result.text).toBe(text);
@@ -249,7 +249,9 @@ test("Test - From now Expression", () => {
249
249
 
250
250
  expect(result.start).toBeDate(new Date(2012, 7, 10, 14, 10));
251
251
  });
252
+ });
252
253
 
254
+ test("Test - The later expression with multiple time units", function () {
253
255
  testSingleCase(chrono, "in 1d 2hr 5min", new Date(2012, 7, 10, 12, 40), (result) => {
254
256
  expect(result.index).toBe(0);
255
257
  expect(result.text).toBe("in 1d 2hr 5min");
@@ -259,6 +261,16 @@ test("Test - From now Expression", () => {
259
261
 
260
262
  expect(result.start).toBeDate(new Date(2012, 7, 11, 14, 45));
261
263
  });
264
+
265
+ testSingleCase(chrono, "in 1d, 2hr, and 5min", new Date(2012, 7, 10, 12, 40), (result) => {
266
+ expect(result.index).toBe(0);
267
+ expect(result.text).toBe("in 1d, 2hr, and 5min");
268
+ expect(result.start.get("day")).toBe(11);
269
+ expect(result.start.get("hour")).toBe(14);
270
+ expect(result.start.get("minute")).toBe(45);
271
+
272
+ expect(result.start).toBeDate(new Date(2012, 7, 11, 14, 45));
273
+ });
262
274
  });
263
275
 
264
276
  test("Test - Strict mode", function () {
@@ -174,6 +174,48 @@ test("Test - The normal within expression", () => {
174
174
  });
175
175
  });
176
176
 
177
+ test("Test - The within expression with multiple time units", function () {
178
+ testSingleCase(chrono, "set a timer for 5 minutes 30 seconds", new Date(2012, 7, 10, 12, 14), (result) => {
179
+ expect(result.index).toBe(12);
180
+ expect(result.text).toBe("for 5 minutes 30 seconds");
181
+
182
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19, 30));
183
+ });
184
+
185
+ testSingleCase(chrono, "set a timer for 5 minutes, 30 seconds", new Date(2012, 7, 10, 12, 14), (result) => {
186
+ expect(result.index).toBe(12);
187
+ expect(result.text).toBe("for 5 minutes, 30 seconds");
188
+
189
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19, 30));
190
+ });
191
+
192
+ testSingleCase(chrono, "set a timer for 1 hour, 5 minutes, 30 seconds", new Date(2012, 7, 10, 12, 14), (result) => {
193
+ expect(result.index).toBe(12);
194
+ expect(result.text).toBe("for 1 hour, 5 minutes, 30 seconds");
195
+
196
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 13, 19, 30));
197
+ });
198
+
199
+ testSingleCase(chrono, "set a timer for 5 minutes and 30 seconds", new Date(2012, 7, 10, 12, 14), (result) => {
200
+ expect(result.index).toBe(12);
201
+ expect(result.text).toBe("for 5 minutes and 30 seconds");
202
+
203
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19, 30));
204
+ });
205
+
206
+ testSingleCase(
207
+ chrono,
208
+ "set a timer for 1 hour, 5 minutes, and 30 seconds",
209
+ new Date(2012, 7, 10, 12, 14),
210
+ (result) => {
211
+ expect(result.index).toBe(12);
212
+ expect(result.text).toBe("for 1 hour, 5 minutes, and 30 seconds");
213
+
214
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 13, 19, 30));
215
+ }
216
+ );
217
+ });
218
+
177
219
  test("Test - The within expression with certain keywords", () => {
178
220
  testSingleCase(chrono, "In about 5 hours", new Date(2012, 8 - 1, 10, 12, 49), (result, text) => {
179
221
  expect(result.text).toBe(text);
@@ -54,6 +54,17 @@ test("Test - Timezone difference on reference date", function () {
54
54
  });
55
55
  });
56
56
 
57
+ test("Test - Timezone difference on reference date #2", function () {
58
+ const refInstant = new Date("2024-02-21T10:00:00+1300");
59
+
60
+ testSingleCase(chrono, "yesterday 18:00", { instant: refInstant, timezone: 780 }, (result) => {
61
+ // expect(result.start.get("year")).toBe(2024);
62
+ // expect(result.start.get("month")).toBe(2);
63
+ // expect(result.start.get("day")).toBe(20);
64
+ // expect(result).toBeDate(new Date("2024-02-20T18:00:00+1300"));
65
+ });
66
+ });
67
+
57
68
  test("Test - Timezone difference on written date", function () {
58
69
  // Sun Jun 06 2021 19:00:00 GMT+0900 (JST)
59
70
  // Sun Jun 06 2021 11:00:00 GMT+0100 (BST)
@@ -1,5 +1,5 @@
1
- import * as chrono from "../../src";
2
- import { testSingleCase } from "../test_util";
1
+ import * as chrono from "../../../src";
2
+ import { testSingleCase } from "../../test_util";
3
3
 
4
4
  test("Test - Single Expression", function () {
5
5
  testSingleCase(chrono.zh.hans, "我今天要打游戏", new Date(2012, 7, 10, 12), (result) => {
@@ -1,5 +1,5 @@
1
- import * as chrono from "../../src";
2
- import { testSingleCase } from "../test_util";
1
+ import * as chrono from "../../../src";
2
+ import { testSingleCase } from "../../test_util";
3
3
 
4
4
  test("Test - Single Expression", function () {
5
5
  testSingleCase(chrono.zh.hans, "我2016年9月3号要打游戏", new Date(2012, 8 - 1, 10), (result) => {