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.
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/parseMonthFromName.d.ts +7 -0
- package/dist/parseMonthFromName.d.ts.map +1 -0
- package/dist/parseMonthFromName.js +24 -0
- package/dist/parseMonthFromName.js.map +1 -0
- package/dist/parseMonthFromName.test.d.ts +2 -0
- package/dist/parseMonthFromName.test.d.ts.map +1 -0
- package/dist/parseMonthFromName.test.js +19 -0
- package/dist/parseMonthFromName.test.js.map +1 -0
- package/dist/parseMonthLike.d.ts +2 -0
- package/dist/parseMonthLike.d.ts.map +1 -0
- package/dist/parseMonthLike.js +9 -0
- package/dist/parseMonthLike.js.map +1 -0
- package/dist/parsePlainDate.d.ts +4 -0
- package/dist/parsePlainDate.d.ts.map +1 -0
- package/dist/parsePlainDate.js +33 -0
- package/dist/parsePlainDate.js.map +1 -0
- package/dist/parsePlainDate.test.d.ts +2 -0
- package/dist/parsePlainDate.test.d.ts.map +1 -0
- package/dist/parsePlainDate.test.js +15 -0
- package/dist/parsePlainDate.test.js.map +1 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.d.ts +7 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.d.ts.map +1 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.js +22 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.js.map +1 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.d.ts +2 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.d.ts.map +1 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.js +32 -0
- package/dist/parsePlainDateTimeYYYYMMDDHHMMp.test.js.map +1 -0
- package/dist/parsePlainTimeHHMM.d.ts +13 -0
- package/dist/parsePlainTimeHHMM.d.ts.map +1 -0
- package/dist/parsePlainTimeHHMM.js +20 -0
- package/dist/parsePlainTimeHHMM.js.map +1 -0
- package/dist/parsePlainTimeHHMM.test.d.ts +2 -0
- package/dist/parsePlainTimeHHMM.test.d.ts.map +1 -0
- package/dist/parsePlainTimeHHMM.test.js +30 -0
- package/dist/parsePlainTimeHHMM.test.js.map +1 -0
- package/dist/parseYearLike.d.ts +2 -0
- package/dist/parseYearLike.d.ts.map +1 -0
- package/dist/parseYearLike.js +11 -0
- package/dist/parseYearLike.js.map +1 -0
- package/dist/utils/splitNonNumeric.d.ts +2 -0
- package/dist/utils/splitNonNumeric.d.ts.map +1 -0
- package/dist/utils/splitNonNumeric.js +2 -0
- package/dist/utils/splitNonNumeric.js.map +1 -0
- package/dist/utils/tokenizeAlphanumeric.d.ts +2 -0
- package/dist/utils/tokenizeAlphanumeric.d.ts.map +1 -0
- package/dist/utils/tokenizeAlphanumeric.js +2 -0
- package/dist/utils/tokenizeAlphanumeric.js.map +1 -0
- package/package.json +7 -7
- package/src/index.ts +6 -1
- package/src/parseMonthFromName.test.ts +20 -0
- package/src/parseMonthFromName.ts +24 -0
- package/src/parseMonthLike.ts +9 -0
- package/src/parsePlainDate.test.ts +24 -0
- package/src/parsePlainDate.ts +43 -0
- package/src/parsePlainDateTimeYYYYMMDDHHMMp.test.ts +39 -0
- package/src/parsePlainDateTimeYYYYMMDDHHMMp.ts +30 -0
- package/src/parsePlainTimeHHMM.test.ts +40 -0
- package/src/parsePlainTimeHHMM.ts +23 -0
- package/src/parseYearLike.ts +10 -0
- package/src/utils/splitNonNumeric.ts +1 -0
- package/src/utils/tokenizeAlphanumeric.ts +2 -0
- package/dist/parseMMDDYYYYToPlainDate.d.ts +0 -8
- package/dist/parseMMDDYYYYToPlainDate.d.ts.map +0 -1
- package/dist/parseMMDDYYYYToPlainDate.js +0 -21
- package/dist/parseMMDDYYYYToPlainDate.js.map +0 -1
- package/dist/parseMMDDYYYYToPlainDate.test.d.ts +0 -2
- package/dist/parseMMDDYYYYToPlainDate.test.d.ts.map +0 -1
- package/dist/parseMMDDYYYYToPlainDate.test.js +0 -17
- package/dist/parseMMDDYYYYToPlainDate.test.js.map +0 -1
- package/src/parseMMDDYYYYToPlainDate.test.ts +0 -21
- package/src/parseMMDDYYYYToPlainDate.ts +0 -24
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
export * from "./
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,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 "./
|
|
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
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
|
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
|
-
"
|
|
21
|
+
"parse"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"tslib": "^2.8.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@macalinao/eslint-config": "^4.
|
|
28
|
-
"@macalinao/tsconfig": "^3.
|
|
29
|
-
"eslint": "^9.
|
|
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.
|
|
33
|
-
"vitest": "^
|
|
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 "./
|
|
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 @@
|
|
|
1
|
+
export const splitNonNumeric = (s: string): string[] => s.split(/[^\d]+/);
|
|
@@ -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 +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
|
-
};
|