parse-temporal 0.0.1 → 0.1.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.
Files changed (76) hide show
  1. package/dist/index.d.ts +6 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/parseMonthFromName.d.ts +7 -0
  6. package/dist/parseMonthFromName.d.ts.map +1 -0
  7. package/dist/parseMonthFromName.js +24 -0
  8. package/dist/parseMonthFromName.js.map +1 -0
  9. package/dist/parseMonthFromName.test.d.ts +2 -0
  10. package/dist/parseMonthFromName.test.d.ts.map +1 -0
  11. package/dist/parseMonthFromName.test.js +19 -0
  12. package/dist/parseMonthFromName.test.js.map +1 -0
  13. package/dist/parseMonthLike.d.ts +2 -0
  14. package/dist/parseMonthLike.d.ts.map +1 -0
  15. package/dist/parseMonthLike.js +9 -0
  16. package/dist/parseMonthLike.js.map +1 -0
  17. package/dist/parsePlainDate.d.ts +4 -0
  18. package/dist/parsePlainDate.d.ts.map +1 -0
  19. package/dist/parsePlainDate.js +33 -0
  20. package/dist/parsePlainDate.js.map +1 -0
  21. package/dist/parsePlainDate.test.d.ts +2 -0
  22. package/dist/parsePlainDate.test.d.ts.map +1 -0
  23. package/dist/parsePlainDate.test.js +15 -0
  24. package/dist/parsePlainDate.test.js.map +1 -0
  25. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.d.ts +7 -0
  26. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.d.ts.map +1 -0
  27. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.js +22 -0
  28. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.js.map +1 -0
  29. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.d.ts +2 -0
  30. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.d.ts.map +1 -0
  31. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.js +32 -0
  32. package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.js.map +1 -0
  33. package/dist/parsePlainTimeHHMM.d.ts +13 -0
  34. package/dist/parsePlainTimeHHMM.d.ts.map +1 -0
  35. package/dist/parsePlainTimeHHMM.js +20 -0
  36. package/dist/parsePlainTimeHHMM.js.map +1 -0
  37. package/dist/parsePlainTimeHHMM.test.d.ts +2 -0
  38. package/dist/parsePlainTimeHHMM.test.d.ts.map +1 -0
  39. package/dist/parsePlainTimeHHMM.test.js +30 -0
  40. package/dist/parsePlainTimeHHMM.test.js.map +1 -0
  41. package/dist/parseYearLike.d.ts +2 -0
  42. package/dist/parseYearLike.d.ts.map +1 -0
  43. package/dist/parseYearLike.js +11 -0
  44. package/dist/parseYearLike.js.map +1 -0
  45. package/dist/utils/splitNonNumeric.d.ts +2 -0
  46. package/dist/utils/splitNonNumeric.d.ts.map +1 -0
  47. package/dist/utils/splitNonNumeric.js +2 -0
  48. package/dist/utils/splitNonNumeric.js.map +1 -0
  49. package/dist/utils/tokenizeAlphanumeric.d.ts +2 -0
  50. package/dist/utils/tokenizeAlphanumeric.d.ts.map +1 -0
  51. package/dist/utils/tokenizeAlphanumeric.js +2 -0
  52. package/dist/utils/tokenizeAlphanumeric.js.map +1 -0
  53. package/package.json +7 -7
  54. package/src/index.ts +6 -1
  55. package/src/parseMonthFromName.test.ts +20 -0
  56. package/src/parseMonthFromName.ts +24 -0
  57. package/src/parseMonthLike.ts +9 -0
  58. package/src/parsePlainDate.test.ts +24 -0
  59. package/src/parsePlainDate.ts +43 -0
  60. package/src/parsePlainDateTimeYYYYMMDDHHMMp.test.ts +39 -0
  61. package/src/parsePlainDateTimeYYYYMMDDHHMMp.ts +30 -0
  62. package/src/parsePlainTimeHHMM.test.ts +40 -0
  63. package/src/parsePlainTimeHHMM.ts +23 -0
  64. package/src/parseYearLike.ts +10 -0
  65. package/src/utils/splitNonNumeric.ts +1 -0
  66. package/src/utils/tokenizeAlphanumeric.ts +2 -0
  67. package/dist/parseMMDDYYYYToPlainDate.d.ts +0 -8
  68. package/dist/parseMMDDYYYYToPlainDate.d.ts.map +0 -1
  69. package/dist/parseMMDDYYYYToPlainDate.js +0 -21
  70. package/dist/parseMMDDYYYYToPlainDate.js.map +0 -1
  71. package/dist/parseMMDDYYYYToPlainDate.test.d.ts +0 -2
  72. package/dist/parseMMDDYYYYToPlainDate.test.d.ts.map +0 -1
  73. package/dist/parseMMDDYYYYToPlainDate.test.js +0 -17
  74. package/dist/parseMMDDYYYYToPlainDate.test.js.map +0 -1
  75. package/src/parseMMDDYYYYToPlainDate.test.ts +0 -21
  76. package/src/parseMMDDYYYYToPlainDate.ts +0 -24
package/dist/index.d.ts CHANGED
@@ -1,2 +1,7 @@
1
- export * from "./parseMMDDYYYYToPlainDate.js";
1
+ export * from "./parseMonthFromName.js";
2
+ export * from "./parseMonthLike.js";
3
+ export * from "./parsePlainDate.js";
4
+ export * from "./parsePlainDateTimeYYYYMMDDHHMMp.js";
5
+ export * from "./parsePlainTimeHHMM.js";
6
+ export * from "./parseYearLike.js";
2
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,7 @@
1
- export * from "./parseMMDDYYYYToPlainDate.js";
1
+ export * from "./parseMonthFromName.js";
2
+ export * from "./parseMonthLike.js";
3
+ export * from "./parsePlainDate.js";
4
+ export * from "./parsePlainDateTimeYYYYMMDDHHMMp.js";
5
+ export * from "./parsePlainTimeHHMM.js";
6
+ export * from "./parseYearLike.js";
2
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC","sourcesContent":["export * from \"./parseMMDDYYYYToPlainDate.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC","sourcesContent":["export * from \"./parseMonthFromName.js\";\nexport * from \"./parseMonthLike.js\";\nexport * from \"./parsePlainDate.js\";\nexport * from \"./parsePlainDateTimeYYYYMMDDHHMMp.js\";\nexport * from \"./parsePlainTimeHHMM.js\";\nexport * from \"./parseYearLike.js\";\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Parses a month name to a number.
3
+ * @param month
4
+ * @returns
5
+ */
6
+ export declare const parseMonthFromName: (month: string) => number | null;
7
+ //# sourceMappingURL=parseMonthFromName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMonthFromName.d.ts","sourceRoot":"","sources":["../src/parseMonthFromName.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,MAAM,GAAG,IAG3D,CAAC"}
@@ -0,0 +1,24 @@
1
+ const monthMap = {
2
+ jan: 1,
3
+ feb: 2,
4
+ mar: 3,
5
+ apr: 4,
6
+ may: 5,
7
+ jun: 6,
8
+ jul: 7,
9
+ aug: 8,
10
+ sep: 9,
11
+ oct: 10,
12
+ nov: 11,
13
+ dec: 12,
14
+ };
15
+ /**
16
+ * Parses a month name to a number.
17
+ * @param month
18
+ * @returns
19
+ */
20
+ export const parseMonthFromName = (month) => {
21
+ const lowerCaseMonth = month.slice(0, 3).toLowerCase();
22
+ return monthMap[lowerCaseMonth] ?? null;
23
+ };
24
+ //# sourceMappingURL=parseMonthFromName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMonthFromName.js","sourceRoot":"","sources":["../src/parseMonthFromName.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAA2B;IACvC,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;CACR,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAiB,EAAE;IACjE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;AAC1C,CAAC,CAAC","sourcesContent":["const monthMap: Record<string, number> = {\n jan: 1,\n feb: 2,\n mar: 3,\n apr: 4,\n may: 5,\n jun: 6,\n jul: 7,\n aug: 8,\n sep: 9,\n oct: 10,\n nov: 11,\n dec: 12,\n};\n\n/**\n * Parses a month name to a number.\n * @param month\n * @returns\n */\nexport const parseMonthFromName = (month: string): number | null => {\n const lowerCaseMonth = month.slice(0, 3).toLowerCase();\n return monthMap[lowerCaseMonth] ?? null;\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parseMonthFromName.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMonthFromName.test.d.ts","sourceRoot":"","sources":["../src/parseMonthFromName.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseMonthFromName } from "./parseMonthFromName.js";
3
+ describe("parseMonthFromName", () => {
4
+ it("should return the correct month number for valid month names", () => {
5
+ expect(parseMonthFromName("January")).toBe(1);
6
+ expect(parseMonthFromName("February")).toBe(2);
7
+ expect(parseMonthFromName("March")).toBe(3);
8
+ expect(parseMonthFromName("April")).toBe(4);
9
+ expect(parseMonthFromName("May")).toBe(5);
10
+ expect(parseMonthFromName("June")).toBe(6);
11
+ expect(parseMonthFromName("July")).toBe(7);
12
+ expect(parseMonthFromName("August")).toBe(8);
13
+ expect(parseMonthFromName("September")).toBe(9);
14
+ expect(parseMonthFromName("October")).toBe(10);
15
+ expect(parseMonthFromName("November")).toBe(11);
16
+ expect(parseMonthFromName("December")).toBe(12);
17
+ });
18
+ });
19
+ //# sourceMappingURL=parseMonthFromName.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMonthFromName.test.js","sourceRoot":"","sources":["../src/parseMonthFromName.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\n\nimport { parseMonthFromName } from \"./parseMonthFromName.js\";\n\ndescribe(\"parseMonthFromName\", () => {\n it(\"should return the correct month number for valid month names\", () => {\n expect(parseMonthFromName(\"January\")).toBe(1);\n expect(parseMonthFromName(\"February\")).toBe(2);\n expect(parseMonthFromName(\"March\")).toBe(3);\n expect(parseMonthFromName(\"April\")).toBe(4);\n expect(parseMonthFromName(\"May\")).toBe(5);\n expect(parseMonthFromName(\"June\")).toBe(6);\n expect(parseMonthFromName(\"July\")).toBe(7);\n expect(parseMonthFromName(\"August\")).toBe(8);\n expect(parseMonthFromName(\"September\")).toBe(9);\n expect(parseMonthFromName(\"October\")).toBe(10);\n expect(parseMonthFromName(\"November\")).toBe(11);\n expect(parseMonthFromName(\"December\")).toBe(12);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const parseMonthLike: (monthLike: string) => number;
2
+ //# sourceMappingURL=parseMonthLike.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMonthLike.d.ts","sourceRoot":"","sources":["../src/parseMonthLike.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,cAAe,MAAM,KAAG,MAMlD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { parseMonthFromName } from "./parseMonthFromName.js";
2
+ export const parseMonthLike = (monthLike) => {
3
+ const month = parseMonthFromName(monthLike) ?? parseInt(monthLike);
4
+ if (isNaN(month)) {
5
+ throw new Error(`Invalid month: ${monthLike}`);
6
+ }
7
+ return month;
8
+ };
9
+ //# sourceMappingURL=parseMonthLike.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMonthLike.js","sourceRoot":"","sources":["../src/parseMonthLike.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAU,EAAE;IAC1D,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC","sourcesContent":["import { parseMonthFromName } from \"./parseMonthFromName.js\";\n\nexport const parseMonthLike = (monthLike: string): number => {\n const month = parseMonthFromName(monthLike) ?? parseInt(monthLike);\n if (isNaN(month)) {\n throw new Error(`Invalid month: ${monthLike}`);\n }\n return month;\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ export type PlainDatePartOrder = "MDY" | "DMY" | "YMD";
3
+ export declare const parsePlainDate: (date: string, partOrder?: PlainDatePartOrder) => Temporal.PlainDate;
4
+ //# sourceMappingURL=parsePlainDate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDate.d.ts","sourceRoot":"","sources":["../src/parsePlainDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7C,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AA2BvD,eAAO,MAAM,cAAc,SACnB,MAAM,cACD,kBAAkB,KAC5B,QAAQ,CAAC,SAMX,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { parseMonthLike } from "./parseMonthLike.js";
3
+ import { parseYearLike } from "./parseYearLike.js";
4
+ import { tokenizeAlphanumeric } from "./utils/tokenizeAlphanumeric.js";
5
+ /**
6
+ * Returns year, month. day
7
+ * @param date
8
+ * @param partOrder
9
+ * @returns
10
+ */
11
+ const getYMD = (date, partOrder) => {
12
+ const parts = tokenizeAlphanumeric(date);
13
+ const [a, b, c] = parts;
14
+ if (!a || !b || !c) {
15
+ throw new Error(`Invalid date: ${date}`);
16
+ }
17
+ switch (partOrder) {
18
+ case "MDY":
19
+ return [c, a, b];
20
+ case "DMY":
21
+ return [c, b, a];
22
+ case "YMD":
23
+ return [a, b, c];
24
+ }
25
+ };
26
+ export const parsePlainDate = (date, partOrder = "MDY") => {
27
+ const [yearStr, monthStr, dayStr] = getYMD(date, partOrder);
28
+ const month = parseMonthLike(monthStr);
29
+ const day = parseInt(dayStr);
30
+ const year = parseYearLike(yearStr);
31
+ return new Temporal.PlainDate(year, month, day);
32
+ };
33
+ //# sourceMappingURL=parsePlainDate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDate.js","sourceRoot":"","sources":["../src/parsePlainDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAIvE;;;;;GAKG;AACH,MAAM,MAAM,GAAG,CACb,IAAY,EACZ,SAA6B,EACH,EAAE;IAC5B,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAAY,EACZ,YAAgC,KAAK,EACjB,EAAE;IACtB,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\n\nimport { parseMonthLike } from \"./parseMonthLike.js\";\nimport { parseYearLike } from \"./parseYearLike.js\";\nimport { tokenizeAlphanumeric } from \"./utils/tokenizeAlphanumeric.js\";\n\nexport type PlainDatePartOrder = \"MDY\" | \"DMY\" | \"YMD\";\n\n/**\n * Returns year, month. day\n * @param date\n * @param partOrder\n * @returns\n */\nconst getYMD = (\n date: string,\n partOrder: PlainDatePartOrder,\n): [string, string, string] => {\n const parts = tokenizeAlphanumeric(date);\n const [a, b, c] = parts;\n if (!a || !b || !c) {\n throw new Error(`Invalid date: ${date}`);\n }\n switch (partOrder) {\n case \"MDY\":\n return [c, a, b];\n case \"DMY\":\n return [c, b, a];\n case \"YMD\":\n return [a, b, c];\n }\n};\n\nexport const parsePlainDate = (\n date: string,\n partOrder: PlainDatePartOrder = \"MDY\",\n): Temporal.PlainDate => {\n const [yearStr, monthStr, dayStr] = getYMD(date, partOrder);\n const month = parseMonthLike(monthStr);\n const day = parseInt(dayStr);\n const year = parseYearLike(yearStr);\n return new Temporal.PlainDate(year, month, day);\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parsePlainDate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDate.test.d.ts","sourceRoot":"","sources":["../src/parsePlainDate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { describe, expect, it } from "vitest";
3
+ import { parsePlainDate } from "./parsePlainDate.js";
4
+ describe("parsePlainDate", () => {
5
+ it("should parse a date", () => {
6
+ expect(parsePlainDate("Nov 12, 2024", "MDY")).toEqual(new Temporal.PlainDate(2024, 11, 12));
7
+ });
8
+ it("should parse 23-NOV-24", () => {
9
+ expect(parsePlainDate("23-NOV-24", "DMY")).toEqual(new Temporal.PlainDate(2024, 11, 23));
10
+ });
11
+ it("should parse Oct 12, 2024", () => {
12
+ expect(parsePlainDate("Oct 12, 2024", "MDY")).toEqual(new Temporal.PlainDate(2024, 10, 12));
13
+ });
14
+ });
15
+ //# sourceMappingURL=parsePlainDate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDate.test.js","sourceRoot":"","sources":["../src/parsePlainDate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CACnD,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAChD,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CACnD,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { parsePlainDate } from \"./parsePlainDate.js\";\n\ndescribe(\"parsePlainDate\", () => {\n it(\"should parse a date\", () => {\n expect(parsePlainDate(\"Nov 12, 2024\", \"MDY\")).toEqual(\n new Temporal.PlainDate(2024, 11, 12),\n );\n });\n\n it(\"should parse 23-NOV-24\", () => {\n expect(parsePlainDate(\"23-NOV-24\", \"DMY\")).toEqual(\n new Temporal.PlainDate(2024, 11, 23),\n );\n });\n\n it(\"should parse Oct 12, 2024\", () => {\n expect(parsePlainDate(\"Oct 12, 2024\", \"MDY\")).toEqual(\n new Temporal.PlainDate(2024, 10, 12),\n );\n });\n});\n"]}
@@ -0,0 +1,7 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ /**
3
+ * Parses a date like 2025/01/04 12:50 PM
4
+ * @param date
5
+ */
6
+ export declare const parsePlainDateTimeYYYYMMDDHHMMp: (dateTime: string) => Temporal.PlainDateTime;
7
+ //# sourceMappingURL=parsePlainDateTimeYYYYMMDDHHMMp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDateTimeYYYYMMDDHHMMp.d.ts","sourceRoot":"","sources":["../src/parsePlainDateTimeYYYYMMDDHHMMp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI7C;;;GAGG;AACH,eAAO,MAAM,+BAA+B,aAChC,MAAM,KACf,QAAQ,CAAC,aAmBX,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { parsePlainDate } from "./parsePlainDate.js";
3
+ /**
4
+ * Parses a date like 2025/01/04 12:50 PM
5
+ * @param date
6
+ */
7
+ export const parsePlainDateTimeYYYYMMDDHHMMp = (dateTime) => {
8
+ const [datePart, timePart, amOrPm] = dateTime.split(/\s+/);
9
+ if (!datePart || !timePart || !amOrPm) {
10
+ throw new Error("Invalid date of extraction");
11
+ }
12
+ const date = parsePlainDate(datePart, "YMD");
13
+ const [hours, minutes] = timePart.split(":").map(Number);
14
+ if (hours === undefined || minutes === undefined) {
15
+ throw new Error("Invalid date of extraction");
16
+ }
17
+ return date.toPlainDateTime(Temporal.PlainTime.from({
18
+ hour: hours + (amOrPm === "PM" && hours < 12 ? 12 : 0),
19
+ minute: minutes,
20
+ }, { overflow: "reject" }));
21
+ };
22
+ //# sourceMappingURL=parsePlainDateTimeYYYYMMDDHHMMp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDateTimeYYYYMMDDHHMMp.js","sourceRoot":"","sources":["../src/parsePlainDateTimeYYYYMMDDHHMMp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,QAAgB,EACQ,EAAE;IAC1B,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC,eAAe,CACzB,QAAQ,CAAC,SAAS,CAAC,IAAI,CACrB;QACE,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,EAAE,OAAO;KAChB,EACD,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACvB,CACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\n\nimport { parsePlainDate } from \"./parsePlainDate.js\";\n\n/**\n * Parses a date like 2025/01/04 12:50 PM\n * @param date\n */\nexport const parsePlainDateTimeYYYYMMDDHHMMp = (\n dateTime: string,\n): Temporal.PlainDateTime => {\n const [datePart, timePart, amOrPm] = dateTime.split(/\\s+/);\n if (!datePart || !timePart || !amOrPm) {\n throw new Error(\"Invalid date of extraction\");\n }\n const date = parsePlainDate(datePart, \"YMD\");\n const [hours, minutes] = timePart.split(\":\").map(Number);\n if (hours === undefined || minutes === undefined) {\n throw new Error(\"Invalid date of extraction\");\n }\n return date.toPlainDateTime(\n Temporal.PlainTime.from(\n {\n hour: hours + (amOrPm === \"PM\" && hours < 12 ? 12 : 0),\n minute: minutes,\n },\n { overflow: \"reject\" },\n ),\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parsePlainDateTimeYYYYMMDDHHMMp.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDateTimeYYYYMMDDHHMMp.test.d.ts","sourceRoot":"","sources":["../src/parsePlainDateTimeYYYYMMDDHHMMp.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { describe, expect, it } from "vitest";
3
+ import { parsePlainDateTimeYYYYMMDDHHMMp } from "./parsePlainDateTimeYYYYMMDDHHMMp.js";
4
+ describe("parsePlainDateTimeYYYYMMDDHHMMp", () => {
5
+ it("should parse a valid date-time string", () => {
6
+ const dateTime = "2024/12/30 12:50 PM";
7
+ expect(parsePlainDateTimeYYYYMMDDHHMMp(dateTime)).toEqual(Temporal.PlainDateTime.from({
8
+ year: 2024,
9
+ month: 12,
10
+ day: 30,
11
+ hour: 12,
12
+ minute: 50,
13
+ second: 0,
14
+ }));
15
+ });
16
+ it("should throw an error for an invalid date-time string", () => {
17
+ const invalidDateTime = "invalid-date-time";
18
+ expect(() => parsePlainDateTimeYYYYMMDDHHMMp(invalidDateTime)).toThrow();
19
+ });
20
+ it("should handle edge cases like leap years", () => {
21
+ const leapYearDateTime = "2024/02/29 12:50 PM";
22
+ expect(parsePlainDateTimeYYYYMMDDHHMMp(leapYearDateTime)).toEqual(Temporal.PlainDateTime.from({
23
+ year: 2024,
24
+ month: 2,
25
+ day: 29,
26
+ hour: 0,
27
+ minute: 0,
28
+ second: 0,
29
+ }));
30
+ });
31
+ });
32
+ //# sourceMappingURL=parsePlainDateTimeYYYYMMDDHHMMp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainDateTimeYYYYMMDDHHMMp.test.js","sourceRoot":"","sources":["../src/parsePlainDateTimeYYYYMMDDHHMMp.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAEvF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,qBAAqB,CAAC;QACvC,MAAM,CAAC,+BAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CACvD,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC;YAC1B,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,EAAE;YACT,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,CAAC;SACV,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,eAAe,GAAG,mBAAmB,CAAC;QAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;QAC/C,MAAM,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAC/D,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC;YAC1B,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;SACV,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { parsePlainDateTimeYYYYMMDDHHMMp } from \"./parsePlainDateTimeYYYYMMDDHHMMp.js\";\n\ndescribe(\"parsePlainDateTimeYYYYMMDDHHMMp\", () => {\n it(\"should parse a valid date-time string\", () => {\n const dateTime = \"2024/12/30 12:50 PM\";\n expect(parsePlainDateTimeYYYYMMDDHHMMp(dateTime)).toEqual(\n Temporal.PlainDateTime.from({\n year: 2024,\n month: 12,\n day: 30,\n hour: 12,\n minute: 50,\n second: 0,\n }),\n );\n });\n\n it(\"should throw an error for an invalid date-time string\", () => {\n const invalidDateTime = \"invalid-date-time\";\n expect(() => parsePlainDateTimeYYYYMMDDHHMMp(invalidDateTime)).toThrow();\n });\n\n it(\"should handle edge cases like leap years\", () => {\n const leapYearDateTime = \"2024/02/29 12:50 PM\";\n expect(parsePlainDateTimeYYYYMMDDHHMMp(leapYearDateTime)).toEqual(\n Temporal.PlainDateTime.from({\n year: 2024,\n month: 2,\n day: 29,\n hour: 0,\n minute: 0,\n second: 0,\n }),\n );\n });\n});\n"]}
@@ -0,0 +1,13 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ /**
3
+ * Parses a time in HHMM to a {@link Temporal.PlainTime}.
4
+ *
5
+ * E.g.
6
+ * - 1225 -> 12:25
7
+ * - 1321 -> 13:21
8
+ *
9
+ * @param time
10
+ * @returns
11
+ */
12
+ export declare const parsePlainTimeHHMM: (time: string) => Temporal.PlainTime;
13
+ //# sourceMappingURL=parsePlainTimeHHMM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainTimeHHMM.d.ts","sourceRoot":"","sources":["../src/parsePlainTimeHHMM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,QAAQ,CAAC,SAU1D,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ /**
3
+ * Parses a time in HHMM to a {@link Temporal.PlainTime}.
4
+ *
5
+ * E.g.
6
+ * - 1225 -> 12:25
7
+ * - 1321 -> 13:21
8
+ *
9
+ * @param time
10
+ * @returns
11
+ */
12
+ export const parsePlainTimeHHMM = (time) => {
13
+ const paddedTime = time.replaceAll(/[^\d]/g, "").padStart(4, "0");
14
+ const [hours, minutes] = [paddedTime.slice(0, 2), paddedTime.slice(2, 4)];
15
+ return Temporal.PlainTime.from({
16
+ hour: parseInt(hours),
17
+ minute: parseInt(minutes),
18
+ }, { overflow: "reject" });
19
+ };
20
+ //# sourceMappingURL=parsePlainTimeHHMM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainTimeHHMM.js","sourceRoot":"","sources":["../src/parsePlainTimeHHMM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAsB,EAAE;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAC5B;QACE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC;QACrB,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC;KAC1B,EACD,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACvB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\n\n/**\n * Parses a time in HHMM to a {@link Temporal.PlainTime}.\n *\n * E.g.\n * - 1225 -> 12:25\n * - 1321 -> 13:21\n *\n * @param time\n * @returns\n */\nexport const parsePlainTimeHHMM = (time: string): Temporal.PlainTime => {\n const paddedTime = time.replaceAll(/[^\\d]/g, \"\").padStart(4, \"0\");\n const [hours, minutes] = [paddedTime.slice(0, 2), paddedTime.slice(2, 4)];\n return Temporal.PlainTime.from(\n {\n hour: parseInt(hours),\n minute: parseInt(minutes),\n },\n { overflow: \"reject\" },\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parsePlainTimeHHMM.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainTimeHHMM.test.d.ts","sourceRoot":"","sources":["../src/parsePlainTimeHHMM.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { describe, expect, it } from "vitest";
3
+ import { parsePlainTimeHHMM } from "./parsePlainTimeHHMM.js";
4
+ describe("parsePlainTimeHHMM", () => {
5
+ it("should work for normal times", () => {
6
+ const time = "1225";
7
+ expect(parsePlainTimeHHMM(time)).toEqual(Temporal.PlainTime.from({
8
+ hour: 12,
9
+ minute: 25,
10
+ }));
11
+ });
12
+ it("should allow for separators", () => {
13
+ const time = "12:25";
14
+ expect(parsePlainTimeHHMM(time)).toEqual(Temporal.PlainTime.from({
15
+ hour: 12,
16
+ minute: 25,
17
+ }));
18
+ });
19
+ it("should work for times in 12AM", () => {
20
+ const time = "56";
21
+ expect(parsePlainTimeHHMM(time)).toEqual(Temporal.PlainTime.from({
22
+ hour: 0,
23
+ minute: 56,
24
+ }));
25
+ });
26
+ it("should fail on invalid times", () => {
27
+ expect(() => parsePlainTimeHHMM("5682")).toThrow();
28
+ });
29
+ });
30
+ //# sourceMappingURL=parsePlainTimeHHMM.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePlainTimeHHMM.test.js","sourceRoot":"","sources":["../src/parsePlainTimeHHMM.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC;QACpB,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CACtC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC;QACrB,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CACtC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CACtC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { parsePlainTimeHHMM } from \"./parsePlainTimeHHMM.js\";\n\ndescribe(\"parsePlainTimeHHMM\", () => {\n it(\"should work for normal times\", () => {\n const time = \"1225\";\n expect(parsePlainTimeHHMM(time)).toEqual(\n Temporal.PlainTime.from({\n hour: 12,\n minute: 25,\n }),\n );\n });\n\n it(\"should allow for separators\", () => {\n const time = \"12:25\";\n expect(parsePlainTimeHHMM(time)).toEqual(\n Temporal.PlainTime.from({\n hour: 12,\n minute: 25,\n }),\n );\n });\n\n it(\"should work for times in 12AM\", () => {\n const time = \"56\";\n expect(parsePlainTimeHHMM(time)).toEqual(\n Temporal.PlainTime.from({\n hour: 0,\n minute: 56,\n }),\n );\n });\n\n it(\"should fail on invalid times\", () => {\n expect(() => parsePlainTimeHHMM(\"5682\")).toThrow();\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const parseYearLike: (yearLike: string) => number;
2
+ //# sourceMappingURL=parseYearLike.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseYearLike.d.ts","sourceRoot":"","sources":["../src/parseYearLike.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,aAAc,MAAM,KAAG,MAShD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const parseYearLike = (yearLike) => {
2
+ const num = parseInt(yearLike);
3
+ if (isNaN(num)) {
4
+ throw new Error(`Invalid year: ${yearLike}`);
5
+ }
6
+ if (yearLike.length === 2) {
7
+ return num + 2000;
8
+ }
9
+ return num;
10
+ };
11
+ //# sourceMappingURL=parseYearLike.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseYearLike.js","sourceRoot":"","sources":["../src/parseYearLike.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAU,EAAE;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC","sourcesContent":["export const parseYearLike = (yearLike: string): number => {\n const num = parseInt(yearLike);\n if (isNaN(num)) {\n throw new Error(`Invalid year: ${yearLike}`);\n }\n if (yearLike.length === 2) {\n return num + 2000;\n }\n return num;\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const splitNonNumeric: (s: string) => string[];
2
+ //# sourceMappingURL=splitNonNumeric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitNonNumeric.d.ts","sourceRoot":"","sources":["../../src/utils/splitNonNumeric.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,MAAO,MAAM,KAAG,MAAM,EAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const splitNonNumeric = (s) => s.split(/[^\d]+/);
2
+ //# sourceMappingURL=splitNonNumeric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitNonNumeric.js","sourceRoot":"","sources":["../../src/utils/splitNonNumeric.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC","sourcesContent":["export const splitNonNumeric = (s: string): string[] => s.split(/[^\\d]+/);\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const tokenizeAlphanumeric: (s: string) => string[];
2
+ //# sourceMappingURL=tokenizeAlphanumeric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizeAlphanumeric.d.ts","sourceRoot":"","sources":["../../src/utils/tokenizeAlphanumeric.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,MAAO,MAAM,KAAG,MAAM,EAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const tokenizeAlphanumeric = (s) => s.split(/[^\dA-Za-z]+/);
2
+ //# sourceMappingURL=tokenizeAlphanumeric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizeAlphanumeric.js","sourceRoot":"","sources":["../../src/utils/tokenizeAlphanumeric.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAS,EAAY,EAAE,CAC1D,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC","sourcesContent":["export const tokenizeAlphanumeric = (s: string): string[] =>\n s.split(/[^\\dA-Za-z]+/);\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "parse-temporal",
3
3
  "description": "Parse Temporal objects from strings.",
4
4
  "author": "Ian Macalinao <me@ianm.com>",
5
- "version": "0.0.1",
5
+ "version": "0.1.0",
6
6
  "license": "Apache-2.0",
7
7
  "type": "module",
8
8
  "sideEffects": false,
@@ -18,19 +18,19 @@
18
18
  },
19
19
  "keywords": [
20
20
  "temporal",
21
- "format"
21
+ "parse"
22
22
  ],
23
23
  "dependencies": {
24
24
  "tslib": "^2.8.1"
25
25
  },
26
26
  "devDependencies": {
27
- "@macalinao/eslint-config": "^4.0.1",
28
- "@macalinao/tsconfig": "^3.0.0",
29
- "eslint": "^9.17.0",
27
+ "@macalinao/eslint-config": "^4.1.2",
28
+ "@macalinao/tsconfig": "^3.1.0",
29
+ "eslint": "^9.18.0",
30
30
  "temporal-polyfill": "^0.2.5",
31
31
  "temporal-spec": "^0.2.4",
32
- "typescript": "^5.7.2",
33
- "vitest": "^2.1.8"
32
+ "typescript": "^5.7.3",
33
+ "vitest": "^3.0.3"
34
34
  },
35
35
  "main": "dist/index.js",
36
36
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -1 +1,6 @@
1
- export * from "./parseMMDDYYYYToPlainDate.js";
1
+ export * from "./parseMonthFromName.js";
2
+ export * from "./parseMonthLike.js";
3
+ export * from "./parsePlainDate.js";
4
+ export * from "./parsePlainDateTimeYYYYMMDDHHMMp.js";
5
+ export * from "./parsePlainTimeHHMM.js";
6
+ export * from "./parseYearLike.js";
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { parseMonthFromName } from "./parseMonthFromName.js";
4
+
5
+ describe("parseMonthFromName", () => {
6
+ it("should return the correct month number for valid month names", () => {
7
+ expect(parseMonthFromName("January")).toBe(1);
8
+ expect(parseMonthFromName("February")).toBe(2);
9
+ expect(parseMonthFromName("March")).toBe(3);
10
+ expect(parseMonthFromName("April")).toBe(4);
11
+ expect(parseMonthFromName("May")).toBe(5);
12
+ expect(parseMonthFromName("June")).toBe(6);
13
+ expect(parseMonthFromName("July")).toBe(7);
14
+ expect(parseMonthFromName("August")).toBe(8);
15
+ expect(parseMonthFromName("September")).toBe(9);
16
+ expect(parseMonthFromName("October")).toBe(10);
17
+ expect(parseMonthFromName("November")).toBe(11);
18
+ expect(parseMonthFromName("December")).toBe(12);
19
+ });
20
+ });
@@ -0,0 +1,24 @@
1
+ const monthMap: Record<string, number> = {
2
+ jan: 1,
3
+ feb: 2,
4
+ mar: 3,
5
+ apr: 4,
6
+ may: 5,
7
+ jun: 6,
8
+ jul: 7,
9
+ aug: 8,
10
+ sep: 9,
11
+ oct: 10,
12
+ nov: 11,
13
+ dec: 12,
14
+ };
15
+
16
+ /**
17
+ * Parses a month name to a number.
18
+ * @param month
19
+ * @returns
20
+ */
21
+ export const parseMonthFromName = (month: string): number | null => {
22
+ const lowerCaseMonth = month.slice(0, 3).toLowerCase();
23
+ return monthMap[lowerCaseMonth] ?? null;
24
+ };
@@ -0,0 +1,9 @@
1
+ import { parseMonthFromName } from "./parseMonthFromName.js";
2
+
3
+ export const parseMonthLike = (monthLike: string): number => {
4
+ const month = parseMonthFromName(monthLike) ?? parseInt(monthLike);
5
+ if (isNaN(month)) {
6
+ throw new Error(`Invalid month: ${monthLike}`);
7
+ }
8
+ return month;
9
+ };
@@ -0,0 +1,24 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { parsePlainDate } from "./parsePlainDate.js";
5
+
6
+ describe("parsePlainDate", () => {
7
+ it("should parse a date", () => {
8
+ expect(parsePlainDate("Nov 12, 2024", "MDY")).toEqual(
9
+ new Temporal.PlainDate(2024, 11, 12),
10
+ );
11
+ });
12
+
13
+ it("should parse 23-NOV-24", () => {
14
+ expect(parsePlainDate("23-NOV-24", "DMY")).toEqual(
15
+ new Temporal.PlainDate(2024, 11, 23),
16
+ );
17
+ });
18
+
19
+ it("should parse Oct 12, 2024", () => {
20
+ expect(parsePlainDate("Oct 12, 2024", "MDY")).toEqual(
21
+ new Temporal.PlainDate(2024, 10, 12),
22
+ );
23
+ });
24
+ });
@@ -0,0 +1,43 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+
3
+ import { parseMonthLike } from "./parseMonthLike.js";
4
+ import { parseYearLike } from "./parseYearLike.js";
5
+ import { tokenizeAlphanumeric } from "./utils/tokenizeAlphanumeric.js";
6
+
7
+ export type PlainDatePartOrder = "MDY" | "DMY" | "YMD";
8
+
9
+ /**
10
+ * Returns year, month. day
11
+ * @param date
12
+ * @param partOrder
13
+ * @returns
14
+ */
15
+ const getYMD = (
16
+ date: string,
17
+ partOrder: PlainDatePartOrder,
18
+ ): [string, string, string] => {
19
+ const parts = tokenizeAlphanumeric(date);
20
+ const [a, b, c] = parts;
21
+ if (!a || !b || !c) {
22
+ throw new Error(`Invalid date: ${date}`);
23
+ }
24
+ switch (partOrder) {
25
+ case "MDY":
26
+ return [c, a, b];
27
+ case "DMY":
28
+ return [c, b, a];
29
+ case "YMD":
30
+ return [a, b, c];
31
+ }
32
+ };
33
+
34
+ export const parsePlainDate = (
35
+ date: string,
36
+ partOrder: PlainDatePartOrder = "MDY",
37
+ ): Temporal.PlainDate => {
38
+ const [yearStr, monthStr, dayStr] = getYMD(date, partOrder);
39
+ const month = parseMonthLike(monthStr);
40
+ const day = parseInt(dayStr);
41
+ const year = parseYearLike(yearStr);
42
+ return new Temporal.PlainDate(year, month, day);
43
+ };
@@ -0,0 +1,39 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { parsePlainDateTimeYYYYMMDDHHMMp } from "./parsePlainDateTimeYYYYMMDDHHMMp.js";
5
+
6
+ describe("parsePlainDateTimeYYYYMMDDHHMMp", () => {
7
+ it("should parse a valid date-time string", () => {
8
+ const dateTime = "2024/12/30 12:50 PM";
9
+ expect(parsePlainDateTimeYYYYMMDDHHMMp(dateTime)).toEqual(
10
+ Temporal.PlainDateTime.from({
11
+ year: 2024,
12
+ month: 12,
13
+ day: 30,
14
+ hour: 12,
15
+ minute: 50,
16
+ second: 0,
17
+ }),
18
+ );
19
+ });
20
+
21
+ it("should throw an error for an invalid date-time string", () => {
22
+ const invalidDateTime = "invalid-date-time";
23
+ expect(() => parsePlainDateTimeYYYYMMDDHHMMp(invalidDateTime)).toThrow();
24
+ });
25
+
26
+ it("should handle edge cases like leap years", () => {
27
+ const leapYearDateTime = "2024/02/29 12:50 PM";
28
+ expect(parsePlainDateTimeYYYYMMDDHHMMp(leapYearDateTime)).toEqual(
29
+ Temporal.PlainDateTime.from({
30
+ year: 2024,
31
+ month: 2,
32
+ day: 29,
33
+ hour: 0,
34
+ minute: 0,
35
+ second: 0,
36
+ }),
37
+ );
38
+ });
39
+ });
@@ -0,0 +1,30 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+
3
+ import { parsePlainDate } from "./parsePlainDate.js";
4
+
5
+ /**
6
+ * Parses a date like 2025/01/04 12:50 PM
7
+ * @param date
8
+ */
9
+ export const parsePlainDateTimeYYYYMMDDHHMMp = (
10
+ dateTime: string,
11
+ ): Temporal.PlainDateTime => {
12
+ const [datePart, timePart, amOrPm] = dateTime.split(/\s+/);
13
+ if (!datePart || !timePart || !amOrPm) {
14
+ throw new Error("Invalid date of extraction");
15
+ }
16
+ const date = parsePlainDate(datePart, "YMD");
17
+ const [hours, minutes] = timePart.split(":").map(Number);
18
+ if (hours === undefined || minutes === undefined) {
19
+ throw new Error("Invalid date of extraction");
20
+ }
21
+ return date.toPlainDateTime(
22
+ Temporal.PlainTime.from(
23
+ {
24
+ hour: hours + (amOrPm === "PM" && hours < 12 ? 12 : 0),
25
+ minute: minutes,
26
+ },
27
+ { overflow: "reject" },
28
+ ),
29
+ );
30
+ };
@@ -0,0 +1,40 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { parsePlainTimeHHMM } from "./parsePlainTimeHHMM.js";
5
+
6
+ describe("parsePlainTimeHHMM", () => {
7
+ it("should work for normal times", () => {
8
+ const time = "1225";
9
+ expect(parsePlainTimeHHMM(time)).toEqual(
10
+ Temporal.PlainTime.from({
11
+ hour: 12,
12
+ minute: 25,
13
+ }),
14
+ );
15
+ });
16
+
17
+ it("should allow for separators", () => {
18
+ const time = "12:25";
19
+ expect(parsePlainTimeHHMM(time)).toEqual(
20
+ Temporal.PlainTime.from({
21
+ hour: 12,
22
+ minute: 25,
23
+ }),
24
+ );
25
+ });
26
+
27
+ it("should work for times in 12AM", () => {
28
+ const time = "56";
29
+ expect(parsePlainTimeHHMM(time)).toEqual(
30
+ Temporal.PlainTime.from({
31
+ hour: 0,
32
+ minute: 56,
33
+ }),
34
+ );
35
+ });
36
+
37
+ it("should fail on invalid times", () => {
38
+ expect(() => parsePlainTimeHHMM("5682")).toThrow();
39
+ });
40
+ });
@@ -0,0 +1,23 @@
1
+ import { Temporal } from "temporal-polyfill";
2
+
3
+ /**
4
+ * Parses a time in HHMM to a {@link Temporal.PlainTime}.
5
+ *
6
+ * E.g.
7
+ * - 1225 -> 12:25
8
+ * - 1321 -> 13:21
9
+ *
10
+ * @param time
11
+ * @returns
12
+ */
13
+ export const parsePlainTimeHHMM = (time: string): Temporal.PlainTime => {
14
+ const paddedTime = time.replaceAll(/[^\d]/g, "").padStart(4, "0");
15
+ const [hours, minutes] = [paddedTime.slice(0, 2), paddedTime.slice(2, 4)];
16
+ return Temporal.PlainTime.from(
17
+ {
18
+ hour: parseInt(hours),
19
+ minute: parseInt(minutes),
20
+ },
21
+ { overflow: "reject" },
22
+ );
23
+ };
@@ -0,0 +1,10 @@
1
+ export const parseYearLike = (yearLike: string): number => {
2
+ const num = parseInt(yearLike);
3
+ if (isNaN(num)) {
4
+ throw new Error(`Invalid year: ${yearLike}`);
5
+ }
6
+ if (yearLike.length === 2) {
7
+ return num + 2000;
8
+ }
9
+ return num;
10
+ };
@@ -0,0 +1 @@
1
+ export const splitNonNumeric = (s: string): string[] => s.split(/[^\d]+/);
@@ -0,0 +1,2 @@
1
+ export const tokenizeAlphanumeric = (s: string): string[] =>
2
+ s.split(/[^\dA-Za-z]+/);
@@ -1,8 +0,0 @@
1
- import { Temporal } from "temporal-polyfill";
2
- /**
3
- * Parses a date in MM/DD/YYYY to a {@link Temporal.PlainDate}.
4
- * @param date
5
- * @returns
6
- */
7
- export declare const parseMMDDYYYYToPlainDate: (date: string) => Temporal.PlainDate;
8
- //# sourceMappingURL=parseMMDDYYYYToPlainDate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseMMDDYYYYToPlainDate.d.ts","sourceRoot":"","sources":["../src/parseMMDDYYYYToPlainDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,SAAU,MAAM,KAAG,QAAQ,CAAC,SAgBhE,CAAC"}
@@ -1,21 +0,0 @@
1
- import { Temporal } from "temporal-polyfill";
2
- /**
3
- * Parses a date in MM/DD/YYYY to a {@link Temporal.PlainDate}.
4
- * @param date
5
- * @returns
6
- */
7
- export const parseMMDDYYYYToPlainDate = (date) => {
8
- const [monthStr, dayStr, yearStr] = date.split(/[^\d]/);
9
- if (!monthStr || !dayStr || !yearStr) {
10
- throw new Error(`Invalid date string: ${date}`);
11
- }
12
- const month = parseInt(monthStr);
13
- const day = parseInt(dayStr);
14
- const year = parseInt(yearStr);
15
- return Temporal.PlainDate.from({
16
- year,
17
- month,
18
- day,
19
- }, { overflow: "reject" });
20
- };
21
- //# sourceMappingURL=parseMMDDYYYYToPlainDate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseMMDDYYYYToPlainDate.js","sourceRoot":"","sources":["../src/parseMMDDYYYYToPlainDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAsB,EAAE;IAC3E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAC5B;QACE,IAAI;QACJ,KAAK;QACL,GAAG;KACJ,EACD,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACvB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\n\n/**\n * Parses a date in MM/DD/YYYY to a {@link Temporal.PlainDate}.\n * @param date\n * @returns\n */\nexport const parseMMDDYYYYToPlainDate = (date: string): Temporal.PlainDate => {\n const [monthStr, dayStr, yearStr] = date.split(/[^\\d]/);\n if (!monthStr || !dayStr || !yearStr) {\n throw new Error(`Invalid date string: ${date}`);\n }\n const month = parseInt(monthStr);\n const day = parseInt(dayStr);\n const year = parseInt(yearStr);\n return Temporal.PlainDate.from(\n {\n year,\n month,\n day,\n },\n { overflow: \"reject\" },\n );\n};\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=parseMMDDYYYYToPlainDate.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseMMDDYYYYToPlainDate.test.d.ts","sourceRoot":"","sources":["../src/parseMMDDYYYYToPlainDate.test.ts"],"names":[],"mappings":""}
@@ -1,17 +0,0 @@
1
- import { Temporal } from "temporal-polyfill";
2
- import { describe, expect, it } from "vitest";
3
- import { parseMMDDYYYYToPlainDate } from "./parseMMDDYYYYToPlainDate.js";
4
- describe("parseMMDDYYYYToPlainDate", () => {
5
- it("should work for normal dates", () => {
6
- const date = "12/21/2024";
7
- expect(parseMMDDYYYYToPlainDate(date)).toEqual(Temporal.PlainDate.from({
8
- year: 2024,
9
- month: 12,
10
- day: 21,
11
- }));
12
- });
13
- it("should fail on invalid dates", () => {
14
- expect(() => parseMMDDYYYYToPlainDate("12/32/2024")).toThrow();
15
- });
16
- });
17
- //# sourceMappingURL=parseMMDDYYYYToPlainDate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseMMDDYYYYToPlainDate.test.js","sourceRoot":"","sources":["../src/parseMMDDYYYYToPlainDate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC;QAC1B,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAC5C,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,EAAE;YACT,GAAG,EAAE,EAAE;SACR,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { Temporal } from \"temporal-polyfill\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { parseMMDDYYYYToPlainDate } from \"./parseMMDDYYYYToPlainDate.js\";\n\ndescribe(\"parseMMDDYYYYToPlainDate\", () => {\n it(\"should work for normal dates\", () => {\n const date = \"12/21/2024\";\n expect(parseMMDDYYYYToPlainDate(date)).toEqual(\n Temporal.PlainDate.from({\n year: 2024,\n month: 12,\n day: 21,\n }),\n );\n });\n\n it(\"should fail on invalid dates\", () => {\n expect(() => parseMMDDYYYYToPlainDate(\"12/32/2024\")).toThrow();\n });\n});\n"]}
@@ -1,21 +0,0 @@
1
- import { Temporal } from "temporal-polyfill";
2
- import { describe, expect, it } from "vitest";
3
-
4
- import { parseMMDDYYYYToPlainDate } from "./parseMMDDYYYYToPlainDate.js";
5
-
6
- describe("parseMMDDYYYYToPlainDate", () => {
7
- it("should work for normal dates", () => {
8
- const date = "12/21/2024";
9
- expect(parseMMDDYYYYToPlainDate(date)).toEqual(
10
- Temporal.PlainDate.from({
11
- year: 2024,
12
- month: 12,
13
- day: 21,
14
- }),
15
- );
16
- });
17
-
18
- it("should fail on invalid dates", () => {
19
- expect(() => parseMMDDYYYYToPlainDate("12/32/2024")).toThrow();
20
- });
21
- });
@@ -1,24 +0,0 @@
1
- import { Temporal } from "temporal-polyfill";
2
-
3
- /**
4
- * Parses a date in MM/DD/YYYY to a {@link Temporal.PlainDate}.
5
- * @param date
6
- * @returns
7
- */
8
- export const parseMMDDYYYYToPlainDate = (date: string): Temporal.PlainDate => {
9
- const [monthStr, dayStr, yearStr] = date.split(/[^\d]/);
10
- if (!monthStr || !dayStr || !yearStr) {
11
- throw new Error(`Invalid date string: ${date}`);
12
- }
13
- const month = parseInt(monthStr);
14
- const day = parseInt(dayStr);
15
- const year = parseInt(yearStr);
16
- return Temporal.PlainDate.from(
17
- {
18
- year,
19
- month,
20
- day,
21
- },
22
- { overflow: "reject" },
23
- );
24
- };