@ma.vu/appdate 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,3 +16,49 @@ To use:
16
16
  ```
17
17
  npm install @ma.vu/appdate
18
18
  ```
19
+ ## How?
20
+ The pattern follows the Builder/Factory pattern where:
21
+
22
+ Static methods are the "builders" that create new instances
23
+ ```ts
24
+ // These create NEW instances of AppDate
25
+ static now(): AppDate
26
+ static fromDateString(date: string): AppDate
27
+ static fromLocalTime(time: string): AppDate
28
+ static invalid(): AppDate
29
+ ```
30
+
31
+ Instance methods are the "operators" that work with existing instances
32
+
33
+ ```ts
34
+ // These operate on an EXISTING AppDate instance
35
+ add(value: number, unit?: ManipulateType): AppDate
36
+ subtract(value: number, unit?: ManipulateType): AppDate
37
+ isValid(): boolean
38
+ toLocalTime(): string
39
+ ```
40
+
41
+
42
+ ## Why Constructor is private?
43
+
44
+ The constructor is marked as private for several important reasons:
45
+
46
+ It ensures all date creation goes through the static factory methods where proper validation happens
47
+ It prevents creating AppDate with invalid/unexpected formats
48
+ It maintains a single way to create dates, making the code more predictable
49
+ It encapsulates the internal dayjs implementation
50
+
51
+ If we allowed direct construction:
52
+ ```ts
53
+ // If constructor was public:
54
+ const date1 = new AppDate('2024-02-11'); // Is this YYYY-MM-DD?
55
+ const date2 = new AppDate('02/11/2024'); // What about this format?
56
+ const date3 = new AppDate('11.02.2024'); // Or this European format?
57
+ ```
58
+
59
+ Instead, with factory methods:
60
+
61
+ ```ts
62
+ // Clear intention, validated format
63
+ const date = AppDate.fromDateString('2024-02-11'); // Must be YYYY-MM-DD
64
+ ```
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.0.4",
2
+ "version": "0.0.6",
3
3
  "name": "@ma.vu/appdate",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
@@ -20,13 +20,14 @@
20
20
  "dist"
21
21
  ],
22
22
  "scripts": {
23
- "publish": "npm run build && npm publish",
24
23
  "build": "tsup",
25
- "test": "bun test"
24
+ "test": "bun test",
25
+ "docs": "typedoc src/index.ts"
26
26
  },
27
27
  "devDependencies": {
28
28
  "bun-types": "latest",
29
29
  "tsup": "~8.2.4",
30
+ "typedoc": "~0.28.15",
30
31
  "vite": "~5.3.5",
31
32
  "vitest": "~2.0.5"
32
33
  },
package/dist/index.cjs DELETED
@@ -1,2 +0,0 @@
1
- "use client";
2
- "use strict";var T=Object.create;var D=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var w=(a,t)=>{for(var e in t)D(a,e,{get:t[e],enumerable:!0})},c=(a,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of j(t))!S.call(a,o)&&o!==e&&D(a,o,{get:()=>t[o],enumerable:!(i=L(t,o))||i.enumerable});return a};var s=(a,t,e)=>(e=a!=null?T(M(a)):{},c(t||!a||!a.__esModule?D(e,"default",{value:a,enumerable:!0}):e,a)),Y=a=>c(D({},"__esModule",{value:!0}),a);var U={};w(U,{AppDate:()=>d,formatLocalTime:()=>k,getLocalizedDateString:()=>z,isDateString:()=>h,setAppDateLanguage:()=>O,setTimezone:()=>A});module.exports=Y(U);var r=s(require("dayjs"),1),F=require("dayjs/locale/de"),l=s(require("dayjs/plugin/customParseFormat.js"),1),p=s(require("dayjs/plugin/isBetween.js"),1),y=s(require("dayjs/plugin/localizedFormat.js"),1),f=s(require("dayjs/plugin/timezone.js"),1),g=s(require("dayjs/plugin/utc.js"),1);r.default.locale("de");r.default.extend(g.default);r.default.extend(f.default);r.default.extend(l.default);r.default.extend(p.default);r.default.extend(y.default);async function O(a){switch(a){case"de":{let t=await import("dayjs/locale/de-ch");r.default.locale(t.default);break}case"fr":{let t=await import("dayjs/locale/fr-ch");r.default.locale(t.default);break}case"en":default:{let t=await import("dayjs/locale/en");r.default.locale(t.default);break}}}var n="Europe/Zurich";function A(a){n=a}var m="HH:mm",u="HH:mm:ssZ",d=class a{timezone;dayjsDate;static INVALID_DATE=(0,r.default)("");constructor(t,e,{invalid:i}={invalid:!1}){if(this.timezone=t,i){this.dayjsDate=a.INVALID_DATE;return}try{if(typeof e=="string"&&!h(e))throw new Error("Invalid Date string, we expect YYYY-DD-MM");this.dayjsDate=r.default.tz(e,t)}catch{console.warn("Could not parse date:",e),this.dayjsDate=a.INVALID_DATE}}static invalid(){return new a(n,"",{invalid:!0})}static now(){return new a(n,(0,r.default)())}static fromDateString(t){return new a(n,t)}static fromLocalTime(t){try{let e=r.default.tz(t,m,n);return new a(n,e)}catch(e){return e instanceof Error&&console.warn(`fromLocalTime(): ${e.message}`),a.invalid()}}static fromUtcString(t){let e=r.default.utc(t);return new a(n,e)}static fromUtcTime(t){let e=r.default.utc(t,u);return new a(n,e)}static minDate(){return a.fromDateString("1900-01-01")}static maxDate(){return a.fromDateString("2200-12-31")}add(t,e){let i=this.dayjsDate.add(t,e);return new a(n,i)}subtract(t,e){let i=this.dayjsDate.subtract(t,e);return new a(n,i)}startOf(t){let e=this.dayjsDate.startOf(t);return new a(n,e)}endOf(t){let e=this.dayjsDate.endOf(t);return new a(n,e)}tomorrow(){return this.add(1,"day")}isValid(){return this.dayjsDate.isValid()}isBefore(t,e){return this.dayjsDate.isBefore(t.dayjsDate,e)}isSame(t,e){return this.dayjsDate.isSame(t.dayjsDate,e)}isToday(){return this.dayjsDate.endOf("d").isSame((0,r.default)().endOf("d"))}isAfter(t,e){return this.dayjsDate.isAfter(t.dayjsDate,e)}isBetween(t=a.minDate(),e=a.maxDate(),i,o){return this.dayjsDate.isBetween(t.dayjsDate,e.dayjsDate,i,o??"[)")}isFirstDayOfWeek(){return this.dayjsDate.day()===1}isWorkingDay(){return x.includes(this.dayjsDate.day())}nextWorkingDay(){let t=this.add(1,"day");return t.isWorkingDay()?t:t.nextWorkingDay()}previousWorkingDay(){let t=this.subtract(1,"day");return t.isWorkingDay()?t:t.previousWorkingDay()}addWorkingDays(t){return t<=0||!Number.isInteger(t)?this:this.nextWorkingDay().addWorkingDays(t-1)}toLocalTime(){return this.format(m)}toUtcTime(){return this.dayjsDate.utc().format(u)}toDateString(){return this.format("YYYY-MM-DD")}toLocalizedDateString({includeDayOfWeek:t=!1}={}){let e=this.dayjsDate.format("L");return t?this.dayjsDate.format("dd, ")+e:e}toUtcDateString(){return this.dayjsDate.utc().format("YYYY-MM-DD")}toUtcString(){return this.dayjsDate.utc().format()}format(t="YYYY-MM-DDTHH:mm:ssZ[Z]"){return this.dayjsDate.format(t)}formatShort({includeDayOfWeek:t=!0}={}){let e=this.format("DD.MM.");return t?this.format("dd, ")+e:e}formatDateTime({includeDayOfWeek:t=!0}={}){let e=this.toLocalizedDateString({includeDayOfWeek:t}),i=this.toLocalTime();return`${e}, ${i}`}},x=[1,2,3,4,5];function z(a,t){return d.fromDateString(a).toLocalizedDateString(t)}function k(a){return d.fromLocalTime(a).toLocalTime()}function h(a){return a?(0,r.default)(a,"YYYY-MM-DD",!0).isValid():!1}0&&(module.exports={AppDate,formatLocalTime,getLocalizedDateString,isDateString,setAppDateLanguage,setTimezone});
package/dist/index.d.cts DELETED
@@ -1,161 +0,0 @@
1
- import { Dayjs, ManipulateType, OpUnitType } from 'dayjs';
2
-
3
- /**
4
- * Given language string, formaters, months, weeks
5
- * will be localized to provided language
6
- * de: 10.10.2010
7
- * en: 10/10/2010
8
- */
9
- declare function setAppDateLanguage(lang: 'de' | 'en' | 'fr'): Promise<void>;
10
- /**
11
- * Change zone in runtime
12
- */
13
- declare function setTimezone(timezone: string): void;
14
- type DateString = `${string}-${string}-${string}`;
15
- /**
16
- * AppDate: A timezone-aware date and time abstraction.
17
- *
18
- * IMPORTANT: Always use this wrapped abstraction instead of moment or
19
- * new Date directly. You should not polute the application with randomly used
20
- * date methods.
21
- *
22
- * This class wraps the dayjs library to provide a consistent interface for
23
- * working with dates and times in a specific timezone. It offers methods for
24
- * date manipulation, comparison, and formatting, while maintaining timezone
25
- * context.
26
- *
27
- * Key features:
28
- * - Timezone awareness: All operations respect the specified timezone.
29
- * - Immutability: Operations return new instances, preserving the original.
30
- * - Consistent API: Provides a uniform interface for date operations.
31
- * - Error handling: Gracefully handles invalid dates and parsing errors.
32
- *
33
- * Use AppDate to ensure consistent date handling across your application,
34
- * especially when dealing with different timezones or complex date logic.
35
- *
36
- * @example
37
- * const today = AppDate.now();
38
- * const futureDate = today.add(5, 'days');
39
- * console.log(futureDate.toLocalizedDateString());
40
- */
41
- declare class AppDate {
42
- readonly timezone: string;
43
- readonly dayjsDate: Dayjs;
44
- private static readonly INVALID_DATE;
45
- /**
46
- * constructor is private, so new LocalString("something")
47
- * outside class is not posible
48
- */
49
- private constructor();
50
- /**
51
- * Creates an invalid AppDate instance.
52
- * Usiful for: Error handeling, default values, avoids
53
- * null object pattern and plays nicely with validation
54
- */
55
- static invalid(): AppDate;
56
- static now(): AppDate;
57
- /**
58
- * Creates a AppDate instance from a date string.
59
- *
60
- * @param date - A string representing a date in "YYYY-MM-DD" format.
61
- * @returns A new AppDate instance set to the given date.
62
- *
63
- * If the date string is invalid or cannot be parsed, it returns an invalid AppDate instance.
64
- * The time part of the created AppDate will be set to midnight in the local timezone.
65
- *
66
- * @example
67
- * const date = AppDate.fromDateString("2023-05-21");
68
- */
69
- static fromDateString(date: string): AppDate;
70
- /**
71
- * Creates a AppDate instance from a local time string.
72
- *
73
- * @param time - A string representing a local time in any valid (24h) time format.
74
- * @returns A new AppDate instance set to the given time on the todays date.
75
- *
76
- * If the time string is invalid, it returns an invalid AppDate instance.
77
- * The date part defaults to the current date in the local timezone.
78
- *
79
- * @example
80
- * const date = AppDate.fromLocalTime("14:30"); Today's date, 14:30 or (02:30 PM)
81
- */
82
- static fromLocalTime(time: string): AppDate;
83
- static fromUtcString(date?: string): AppDate;
84
- static fromUtcTime(time: string): AppDate;
85
- static minDate(): AppDate;
86
- static maxDate(): AppDate;
87
- add(value: number, unit?: ManipulateType): AppDate;
88
- subtract(value: number, unit?: ManipulateType): AppDate;
89
- startOf(unit: OpUnitType): AppDate;
90
- endOf(unit: OpUnitType): AppDate;
91
- tomorrow(): AppDate;
92
- isValid(): boolean;
93
- isBefore(other: AppDate, unit?: OpUnitType): boolean;
94
- isSame(other: AppDate, unit?: OpUnitType): boolean;
95
- /**
96
- * returns true if date is current day
97
- */
98
- isToday(): boolean;
99
- isAfter(other: AppDate, unit?: OpUnitType): boolean;
100
- isBetween(from?: AppDate, to?: AppDate, unit?: OpUnitType, inclusivity?: `${'(' | '['}${')' | ']'}`): boolean;
101
- isFirstDayOfWeek(): boolean;
102
- isWorkingDay(): boolean;
103
- nextWorkingDay(): AppDate;
104
- previousWorkingDay(): AppDate;
105
- addWorkingDays(days: number): AppDate;
106
- /*** Formatters ***/
107
- /**
108
- * Converts Date in following string format: HH:mm (20:10)
109
- */
110
- toLocalTime(): string;
111
- /**
112
- * Returns time in UTC format: HH:mm:ssZ
113
- */
114
- toUtcTime(): string;
115
- /**
116
- * Converts the current date to a string: YYYY-MM-DD
117
- */
118
- toDateString(): DateString;
119
- /**
120
- * Locale friendly format:
121
- * ```
122
- * de, ch = 20.10.1985
123
- * us = 10/20/1985
124
- * {includeDayOfWeek: true}
125
- * de, ch = Son, 20.10.1985
126
- * us = Sun, 10/20/1985
127
-
128
- * ```
129
- */
130
- toLocalizedDateString({ includeDayOfWeek, }?: LocalizedFormatOptions): string;
131
- toUtcDateString(): DateString;
132
- toUtcString(): string;
133
- /**
134
- * Get the formatted date according to the string of tokens passed in.
135
- *
136
- * To escape characters, wrap them in square brackets (e.g. [MM]).
137
- *
138
- * @see {@link https://day.js.org/docs/en/display/format|Day.js format documentation}
139
- *
140
- */
141
- format(template?: FormatTemplate): string;
142
- formatShort({ includeDayOfWeek }?: LocalizedFormatOptions): string;
143
- formatDateTime({ includeDayOfWeek }?: LocalizedFormatOptions): string;
144
- }
145
- interface LocalizedFormatOptions {
146
- includeDayOfWeek?: boolean;
147
- }
148
- interface GetNDaysOptions {
149
- startDate?: AppDate;
150
- excludeStartDate?: boolean;
151
- }
152
- declare function getLocalizedDateString(date: string, options?: LocalizedFormatOptions): string;
153
- declare function formatLocalTime(time: string): string;
154
- /**
155
- * returns true if given argument is in YYYY-MM-DD format
156
- * otherwise false
157
- */
158
- declare function isDateString(date: string | undefined | null | Dayjs): date is DateString;
159
- type FormatTemplate = 'YY' | 'YYYY' | 'M' | 'MM' | 'MMM' | 'MMMM' | 'D' | 'DD' | 'd' | 'dd' | 'ddd' | 'dddd' | 'H' | 'HH' | 'h' | 'hh' | 'm' | 'mm' | 's' | 'ss' | 'SSS' | 'Z' | 'ZZ' | 'A' | 'a' | 'LT' | 'LTS' | /* en: 10/10/2020, de: 10.10.2020 */ 'L' | 'LL' | 'LLL' | 'LLLL' | 'l' | 'll' | 'lll' | 'llll' | (string & {});
160
-
161
- export { AppDate, type GetNDaysOptions, type LocalizedFormatOptions, formatLocalTime, getLocalizedDateString, isDateString, setAppDateLanguage, setTimezone };
package/dist/index.d.ts DELETED
@@ -1,161 +0,0 @@
1
- import { Dayjs, ManipulateType, OpUnitType } from 'dayjs';
2
-
3
- /**
4
- * Given language string, formaters, months, weeks
5
- * will be localized to provided language
6
- * de: 10.10.2010
7
- * en: 10/10/2010
8
- */
9
- declare function setAppDateLanguage(lang: 'de' | 'en' | 'fr'): Promise<void>;
10
- /**
11
- * Change zone in runtime
12
- */
13
- declare function setTimezone(timezone: string): void;
14
- type DateString = `${string}-${string}-${string}`;
15
- /**
16
- * AppDate: A timezone-aware date and time abstraction.
17
- *
18
- * IMPORTANT: Always use this wrapped abstraction instead of moment or
19
- * new Date directly. You should not polute the application with randomly used
20
- * date methods.
21
- *
22
- * This class wraps the dayjs library to provide a consistent interface for
23
- * working with dates and times in a specific timezone. It offers methods for
24
- * date manipulation, comparison, and formatting, while maintaining timezone
25
- * context.
26
- *
27
- * Key features:
28
- * - Timezone awareness: All operations respect the specified timezone.
29
- * - Immutability: Operations return new instances, preserving the original.
30
- * - Consistent API: Provides a uniform interface for date operations.
31
- * - Error handling: Gracefully handles invalid dates and parsing errors.
32
- *
33
- * Use AppDate to ensure consistent date handling across your application,
34
- * especially when dealing with different timezones or complex date logic.
35
- *
36
- * @example
37
- * const today = AppDate.now();
38
- * const futureDate = today.add(5, 'days');
39
- * console.log(futureDate.toLocalizedDateString());
40
- */
41
- declare class AppDate {
42
- readonly timezone: string;
43
- readonly dayjsDate: Dayjs;
44
- private static readonly INVALID_DATE;
45
- /**
46
- * constructor is private, so new LocalString("something")
47
- * outside class is not posible
48
- */
49
- private constructor();
50
- /**
51
- * Creates an invalid AppDate instance.
52
- * Usiful for: Error handeling, default values, avoids
53
- * null object pattern and plays nicely with validation
54
- */
55
- static invalid(): AppDate;
56
- static now(): AppDate;
57
- /**
58
- * Creates a AppDate instance from a date string.
59
- *
60
- * @param date - A string representing a date in "YYYY-MM-DD" format.
61
- * @returns A new AppDate instance set to the given date.
62
- *
63
- * If the date string is invalid or cannot be parsed, it returns an invalid AppDate instance.
64
- * The time part of the created AppDate will be set to midnight in the local timezone.
65
- *
66
- * @example
67
- * const date = AppDate.fromDateString("2023-05-21");
68
- */
69
- static fromDateString(date: string): AppDate;
70
- /**
71
- * Creates a AppDate instance from a local time string.
72
- *
73
- * @param time - A string representing a local time in any valid (24h) time format.
74
- * @returns A new AppDate instance set to the given time on the todays date.
75
- *
76
- * If the time string is invalid, it returns an invalid AppDate instance.
77
- * The date part defaults to the current date in the local timezone.
78
- *
79
- * @example
80
- * const date = AppDate.fromLocalTime("14:30"); Today's date, 14:30 or (02:30 PM)
81
- */
82
- static fromLocalTime(time: string): AppDate;
83
- static fromUtcString(date?: string): AppDate;
84
- static fromUtcTime(time: string): AppDate;
85
- static minDate(): AppDate;
86
- static maxDate(): AppDate;
87
- add(value: number, unit?: ManipulateType): AppDate;
88
- subtract(value: number, unit?: ManipulateType): AppDate;
89
- startOf(unit: OpUnitType): AppDate;
90
- endOf(unit: OpUnitType): AppDate;
91
- tomorrow(): AppDate;
92
- isValid(): boolean;
93
- isBefore(other: AppDate, unit?: OpUnitType): boolean;
94
- isSame(other: AppDate, unit?: OpUnitType): boolean;
95
- /**
96
- * returns true if date is current day
97
- */
98
- isToday(): boolean;
99
- isAfter(other: AppDate, unit?: OpUnitType): boolean;
100
- isBetween(from?: AppDate, to?: AppDate, unit?: OpUnitType, inclusivity?: `${'(' | '['}${')' | ']'}`): boolean;
101
- isFirstDayOfWeek(): boolean;
102
- isWorkingDay(): boolean;
103
- nextWorkingDay(): AppDate;
104
- previousWorkingDay(): AppDate;
105
- addWorkingDays(days: number): AppDate;
106
- /*** Formatters ***/
107
- /**
108
- * Converts Date in following string format: HH:mm (20:10)
109
- */
110
- toLocalTime(): string;
111
- /**
112
- * Returns time in UTC format: HH:mm:ssZ
113
- */
114
- toUtcTime(): string;
115
- /**
116
- * Converts the current date to a string: YYYY-MM-DD
117
- */
118
- toDateString(): DateString;
119
- /**
120
- * Locale friendly format:
121
- * ```
122
- * de, ch = 20.10.1985
123
- * us = 10/20/1985
124
- * {includeDayOfWeek: true}
125
- * de, ch = Son, 20.10.1985
126
- * us = Sun, 10/20/1985
127
-
128
- * ```
129
- */
130
- toLocalizedDateString({ includeDayOfWeek, }?: LocalizedFormatOptions): string;
131
- toUtcDateString(): DateString;
132
- toUtcString(): string;
133
- /**
134
- * Get the formatted date according to the string of tokens passed in.
135
- *
136
- * To escape characters, wrap them in square brackets (e.g. [MM]).
137
- *
138
- * @see {@link https://day.js.org/docs/en/display/format|Day.js format documentation}
139
- *
140
- */
141
- format(template?: FormatTemplate): string;
142
- formatShort({ includeDayOfWeek }?: LocalizedFormatOptions): string;
143
- formatDateTime({ includeDayOfWeek }?: LocalizedFormatOptions): string;
144
- }
145
- interface LocalizedFormatOptions {
146
- includeDayOfWeek?: boolean;
147
- }
148
- interface GetNDaysOptions {
149
- startDate?: AppDate;
150
- excludeStartDate?: boolean;
151
- }
152
- declare function getLocalizedDateString(date: string, options?: LocalizedFormatOptions): string;
153
- declare function formatLocalTime(time: string): string;
154
- /**
155
- * returns true if given argument is in YYYY-MM-DD format
156
- * otherwise false
157
- */
158
- declare function isDateString(date: string | undefined | null | Dayjs): date is DateString;
159
- type FormatTemplate = 'YY' | 'YYYY' | 'M' | 'MM' | 'MMM' | 'MMMM' | 'D' | 'DD' | 'd' | 'dd' | 'ddd' | 'dddd' | 'H' | 'HH' | 'h' | 'hh' | 'm' | 'mm' | 's' | 'ss' | 'SSS' | 'Z' | 'ZZ' | 'A' | 'a' | 'LT' | 'LTS' | /* en: 10/10/2020, de: 10.10.2020 */ 'L' | 'LL' | 'LLL' | 'LLLL' | 'l' | 'll' | 'lll' | 'llll' | (string & {});
160
-
161
- export { AppDate, type GetNDaysOptions, type LocalizedFormatOptions, formatLocalTime, getLocalizedDateString, isDateString, setAppDateLanguage, setTimezone };
package/dist/index.js DELETED
@@ -1,2 +0,0 @@
1
- "use client";
2
- import r from"dayjs";import"dayjs/locale/de";import c from"dayjs/plugin/customParseFormat.js";import m from"dayjs/plugin/isBetween.js";import u from"dayjs/plugin/localizedFormat.js";import l from"dayjs/plugin/timezone.js";import p from"dayjs/plugin/utc.js";r.locale("de");r.extend(p);r.extend(l);r.extend(c);r.extend(m);r.extend(u);async function w(a){switch(a){case"de":{let t=await import("dayjs/locale/de-ch");r.locale(t.default);break}case"fr":{let t=await import("dayjs/locale/fr-ch");r.locale(t.default);break}case"en":default:{let t=await import("dayjs/locale/en");r.locale(t.default);break}}}var i="Europe/Zurich";function Y(a){i=a}var d="HH:mm",D="HH:mm:ssZ",s=class a{timezone;dayjsDate;static INVALID_DATE=r("");constructor(t,e,{invalid:n}={invalid:!1}){if(this.timezone=t,n){this.dayjsDate=a.INVALID_DATE;return}try{if(typeof e=="string"&&!f(e))throw new Error("Invalid Date string, we expect YYYY-DD-MM");this.dayjsDate=r.tz(e,t)}catch{console.warn("Could not parse date:",e),this.dayjsDate=a.INVALID_DATE}}static invalid(){return new a(i,"",{invalid:!0})}static now(){return new a(i,r())}static fromDateString(t){return new a(i,t)}static fromLocalTime(t){try{let e=r.tz(t,d,i);return new a(i,e)}catch(e){return e instanceof Error&&console.warn(`fromLocalTime(): ${e.message}`),a.invalid()}}static fromUtcString(t){let e=r.utc(t);return new a(i,e)}static fromUtcTime(t){let e=r.utc(t,D);return new a(i,e)}static minDate(){return a.fromDateString("1900-01-01")}static maxDate(){return a.fromDateString("2200-12-31")}add(t,e){let n=this.dayjsDate.add(t,e);return new a(i,n)}subtract(t,e){let n=this.dayjsDate.subtract(t,e);return new a(i,n)}startOf(t){let e=this.dayjsDate.startOf(t);return new a(i,e)}endOf(t){let e=this.dayjsDate.endOf(t);return new a(i,e)}tomorrow(){return this.add(1,"day")}isValid(){return this.dayjsDate.isValid()}isBefore(t,e){return this.dayjsDate.isBefore(t.dayjsDate,e)}isSame(t,e){return this.dayjsDate.isSame(t.dayjsDate,e)}isToday(){return this.dayjsDate.endOf("d").isSame(r().endOf("d"))}isAfter(t,e){return this.dayjsDate.isAfter(t.dayjsDate,e)}isBetween(t=a.minDate(),e=a.maxDate(),n,o){return this.dayjsDate.isBetween(t.dayjsDate,e.dayjsDate,n,o??"[)")}isFirstDayOfWeek(){return this.dayjsDate.day()===1}isWorkingDay(){return y.includes(this.dayjsDate.day())}nextWorkingDay(){let t=this.add(1,"day");return t.isWorkingDay()?t:t.nextWorkingDay()}previousWorkingDay(){let t=this.subtract(1,"day");return t.isWorkingDay()?t:t.previousWorkingDay()}addWorkingDays(t){return t<=0||!Number.isInteger(t)?this:this.nextWorkingDay().addWorkingDays(t-1)}toLocalTime(){return this.format(d)}toUtcTime(){return this.dayjsDate.utc().format(D)}toDateString(){return this.format("YYYY-MM-DD")}toLocalizedDateString({includeDayOfWeek:t=!1}={}){let e=this.dayjsDate.format("L");return t?this.dayjsDate.format("dd, ")+e:e}toUtcDateString(){return this.dayjsDate.utc().format("YYYY-MM-DD")}toUtcString(){return this.dayjsDate.utc().format()}format(t="YYYY-MM-DDTHH:mm:ssZ[Z]"){return this.dayjsDate.format(t)}formatShort({includeDayOfWeek:t=!0}={}){let e=this.format("DD.MM.");return t?this.format("dd, ")+e:e}formatDateTime({includeDayOfWeek:t=!0}={}){let e=this.toLocalizedDateString({includeDayOfWeek:t}),n=this.toLocalTime();return`${e}, ${n}`}},y=[1,2,3,4,5];function O(a,t){return s.fromDateString(a).toLocalizedDateString(t)}function A(a){return s.fromLocalTime(a).toLocalTime()}function f(a){return a?r(a,"YYYY-MM-DD",!0).isValid():!1}export{s as AppDate,A as formatLocalTime,O as getLocalizedDateString,f as isDateString,w as setAppDateLanguage,Y as setTimezone};