@bgord/tools 0.12.3 → 0.12.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -48,4 +48,5 @@ export * from "./timezone.vo";
48
48
  export * from "./ts-utils";
49
49
  export * from "./visually-unambiguous-characters-generator.service";
50
50
  export * from "./week.vo";
51
+ export * from "./week-iso-id.vo";
51
52
  export * from "./z-score.service";
package/dist/index.js CHANGED
@@ -48,4 +48,5 @@ export * from "./timezone.vo";
48
48
  export * from "./ts-utils";
49
49
  export * from "./visually-unambiguous-characters-generator.service";
50
50
  export * from "./week.vo";
51
+ export * from "./week-iso-id.vo";
51
52
  export * from "./z-score.service";
@@ -1 +1 @@
1
- {"root":["../src/api-key.vo.ts","../src/build-version.vo.ts","../src/clock.vo.ts","../src/date-calculator.service.ts","../src/date-formatter.service.ts","../src/date-range.vo.ts","../src/dates-of-the-week.vo.ts","../src/dll.service.ts","../src/email-mask.service.ts","../src/etags.vo.ts","../src/feature-flag.vo.ts","../src/filter.vo.ts","../src/hour.vo.ts","../src/iban-mask.service.ts","../src/iban.vo.ts","../src/image.vo.ts","../src/index.ts","../src/language.vo.ts","../src/leap-year-checker.service.ts","../src/mean.service.ts","../src/mime-types.vo.ts","../src/mime.vo.ts","../src/min-max-scaler.service.ts","../src/minute.vo.ts","../src/money.vo.ts","../src/noop.service.ts","../src/outlier-detector.service.ts","../src/package-version.vo.ts","../src/pagination.service.ts","../src/percentage.service.ts","../src/population-standard-deviation.service.ts","../src/random.service.ts","../src/rate-limiter.service.ts","../src/relative-date.vo.ts","../src/reordering.service.ts","../src/revision.vo.ts","../src/rounding.service.ts","../src/simple-linear-regression.service.ts","../src/size.vo.ts","../src/stepper.service.ts","../src/stopwatch.service.ts","../src/streak-calculator.service.ts","../src/sum.service.ts","../src/thousands-separator.service.ts","../src/time-zone-offset-value.vo.ts","../src/time.service.ts","../src/timestamp.vo.ts","../src/timezone.vo.ts","../src/ts-utils.ts","../src/visually-unambiguous-characters-generator.service.ts","../src/week.vo.ts","../src/z-score.service.ts"],"version":"5.8.3"}
1
+ {"root":["../src/api-key.vo.ts","../src/build-version.vo.ts","../src/clock.vo.ts","../src/date-calculator.service.ts","../src/date-formatter.service.ts","../src/date-range.vo.ts","../src/dates-of-the-week.vo.ts","../src/dll.service.ts","../src/email-mask.service.ts","../src/etags.vo.ts","../src/feature-flag.vo.ts","../src/filter.vo.ts","../src/hour.vo.ts","../src/iban-mask.service.ts","../src/iban.vo.ts","../src/image.vo.ts","../src/index.ts","../src/language.vo.ts","../src/leap-year-checker.service.ts","../src/mean.service.ts","../src/mime-types.vo.ts","../src/mime.vo.ts","../src/min-max-scaler.service.ts","../src/minute.vo.ts","../src/money.vo.ts","../src/noop.service.ts","../src/outlier-detector.service.ts","../src/package-version.vo.ts","../src/pagination.service.ts","../src/percentage.service.ts","../src/population-standard-deviation.service.ts","../src/random.service.ts","../src/rate-limiter.service.ts","../src/relative-date.vo.ts","../src/reordering.service.ts","../src/revision.vo.ts","../src/rounding.service.ts","../src/simple-linear-regression.service.ts","../src/size.vo.ts","../src/stepper.service.ts","../src/stopwatch.service.ts","../src/streak-calculator.service.ts","../src/sum.service.ts","../src/thousands-separator.service.ts","../src/time-zone-offset-value.vo.ts","../src/time.service.ts","../src/timestamp.vo.ts","../src/timezone.vo.ts","../src/ts-utils.ts","../src/visually-unambiguous-characters-generator.service.ts","../src/week-iso-id.vo.ts","../src/week.vo.ts","../src/z-score.service.ts"],"version":"5.8.3"}
@@ -0,0 +1,3 @@
1
+ import { z } from "zod/v4";
2
+ export declare const WeekIsoId: z.ZodString;
3
+ export type WeekIsoIdType = z.infer<typeof WeekIsoId>;
@@ -0,0 +1,15 @@
1
+ import { getISOWeeksInYear } from "date-fns";
2
+ import { z } from "zod/v4";
3
+ export const WeekIsoId = z
4
+ .string()
5
+ .regex(/^\d{4}-W\d{2}$/)
6
+ .refine((value) => {
7
+ const [yearPart, weekPart] = value.split("-W");
8
+ const year = Number(yearPart);
9
+ const week = Number(weekPart);
10
+ if (!(Number.isInteger(year) && Number.isInteger(week)) || week < 1)
11
+ return false;
12
+ // Does this ISO week-year actually have that many weeks?
13
+ const weeksInYear = getISOWeeksInYear(new Date(Date.UTC(year, 0, 4)));
14
+ return week <= weeksInYear;
15
+ }, { message: "week-iso-id.invalid" });
package/dist/week.vo.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import { DateRange } from "./date-range.vo";
2
2
  import { TimestampType } from "./timestamp.vo";
3
+ import { WeekIsoIdType } from "./week-iso-id.vo";
3
4
  export declare class Week extends DateRange {
4
5
  constructor(start: TimestampType, end: TimestampType);
5
- toIsoId(): string;
6
+ toIsoId(): WeekIsoIdType;
6
7
  static fromTimestamp(timestamp: TimestampType): Week;
7
8
  static fromNow(now?: TimestampType): Week;
8
- static fromIsoId(isoId: string): Week;
9
+ static fromIsoId(isoId: WeekIsoIdType): Week;
9
10
  }
package/dist/week.vo.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { endOfISOWeek, getISOWeek, getISOWeekYear, setISOWeek, startOfISOWeek } from "date-fns";
2
2
  import { DateRange } from "./date-range.vo";
3
3
  import { Timestamp } from "./timestamp.vo";
4
+ import { WeekIsoId } from "./week-iso-id.vo";
4
5
  export class Week extends DateRange {
5
6
  constructor(start, end) {
6
7
  super(start, end);
@@ -19,7 +20,7 @@ export class Week extends DateRange {
19
20
  return Week.fromTimestamp(now);
20
21
  }
21
22
  static fromIsoId(isoId) {
22
- const [yearPart, weekPart] = isoId.split("-W");
23
+ const [yearPart, weekPart] = WeekIsoId.parse(isoId).split("-W");
23
24
  const year = Number(yearPart);
24
25
  const week = Number(weekPart);
25
26
  // ISO-8601 rule: Jan 4 is always in week 01 of the ISO week-year.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/tools",
3
- "version": "0.12.3",
3
+ "version": "0.12.4",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Bartosz Gordon",
package/readme.md CHANGED
@@ -73,6 +73,7 @@ src/
73
73
  ├── timezone.vo.ts
74
74
  ├── ts-utils.ts
75
75
  ├── visually-unambiguous-characters-generator.service.ts
76
+ ├── week-iso-id.vo.ts
76
77
  ├── week.vo.ts
77
78
  └── z-score.service.ts
78
79
  ```
package/src/index.ts CHANGED
@@ -48,4 +48,5 @@ export * from "./timezone.vo";
48
48
  export * from "./ts-utils";
49
49
  export * from "./visually-unambiguous-characters-generator.service";
50
50
  export * from "./week.vo";
51
+ export * from "./week-iso-id.vo";
51
52
  export * from "./z-score.service";
@@ -0,0 +1,24 @@
1
+ import { getISOWeeksInYear } from "date-fns";
2
+ import { z } from "zod/v4";
3
+
4
+ export const WeekIsoId = z
5
+ .string()
6
+ .regex(/^\d{4}-W\d{2}$/)
7
+ .refine(
8
+ (value) => {
9
+ const [yearPart, weekPart] = value.split("-W");
10
+
11
+ const year = Number(yearPart);
12
+ const week = Number(weekPart);
13
+
14
+ if (!(Number.isInteger(year) && Number.isInteger(week)) || week < 1) return false;
15
+
16
+ // Does this ISO week-year actually have that many weeks?
17
+ const weeksInYear = getISOWeeksInYear(new Date(Date.UTC(year, 0, 4)));
18
+
19
+ return week <= weeksInYear;
20
+ },
21
+ { message: "week-iso-id.invalid" },
22
+ );
23
+
24
+ export type WeekIsoIdType = z.infer<typeof WeekIsoId>;
package/src/week.vo.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  import { endOfISOWeek, getISOWeek, getISOWeekYear, setISOWeek, startOfISOWeek } from "date-fns";
2
2
  import { DateRange } from "./date-range.vo";
3
3
  import { Timestamp, TimestampType } from "./timestamp.vo";
4
+ import { WeekIsoId, WeekIsoIdType } from "./week-iso-id.vo";
4
5
 
5
6
  export class Week extends DateRange {
6
7
  constructor(start: TimestampType, end: TimestampType) {
7
8
  super(start, end);
8
9
  }
9
10
 
10
- toIsoId(): string {
11
+ toIsoId(): WeekIsoIdType {
11
12
  const year = getISOWeekYear(this.getStart());
12
13
  const week = getISOWeek(this.getStart()).toString().padStart(2, "0");
13
14
 
@@ -25,8 +26,8 @@ export class Week extends DateRange {
25
26
  return Week.fromTimestamp(now);
26
27
  }
27
28
 
28
- static fromIsoId(isoId: string): Week {
29
- const [yearPart, weekPart] = isoId.split("-W");
29
+ static fromIsoId(isoId: WeekIsoIdType): Week {
30
+ const [yearPart, weekPart] = WeekIsoId.parse(isoId).split("-W");
30
31
 
31
32
  const year = Number(yearPart);
32
33
  const week = Number(weekPart);