@digitalwalletcorp/utils 0.11.0 → 0.13.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/README.md +1 -1
- package/lib/{date-util-C581gVKx.js → date-util-BNe2E-tA.js} +4 -4
- package/lib/date-util-BNe2E-tA.js.map +1 -0
- package/lib/date-util-CZmiQEYH.cjs +2 -0
- package/lib/date-util-CZmiQEYH.cjs.map +1 -0
- package/lib/date-util.cjs +1 -1
- package/lib/date-util.d.cts +3 -3
- package/lib/date-util.d.ts +3 -3
- package/lib/date-util.js +2 -2
- package/lib/html-util--mpzaYuJ.cjs +2 -0
- package/lib/html-util--mpzaYuJ.cjs.map +1 -0
- package/lib/html-util-B8sdLw9I.js +60 -0
- package/lib/html-util-B8sdLw9I.js.map +1 -0
- package/lib/html-util.cjs +1 -1
- package/lib/html-util.d.cts +3 -1
- package/lib/html-util.d.ts +3 -1
- package/lib/html-util.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +9 -9
- package/lib/{date-time.cjs → zoned-date-time.cjs} +2 -2
- package/lib/zoned-date-time.cjs.map +1 -0
- package/lib/{date-time.d.cts → zoned-date-time.d.cts} +37 -37
- package/lib/{date-time.d.ts → zoned-date-time.d.ts} +37 -37
- package/lib/{date-time.js → zoned-date-time.js} +39 -39
- package/lib/zoned-date-time.js.map +1 -0
- package/package.json +1 -1
- package/src/date-util.ts +17 -17
- package/src/html-util.ts +7 -2
- package/src/index.ts +1 -1
- package/src/{date-time.ts → zoned-date-time.ts} +58 -58
- package/lib/date-time.cjs.map +0 -1
- package/lib/date-time.js.map +0 -1
- package/lib/date-util-ByW86YIS.cjs +0 -2
- package/lib/date-util-ByW86YIS.cjs.map +0 -1
- package/lib/date-util-C581gVKx.js.map +0 -1
- package/lib/html-util-BctKzfnH.js +0 -60
- package/lib/html-util-BctKzfnH.js.map +0 -1
- package/lib/html-util-ELyFVsxl.cjs +0 -2
- package/lib/html-util-ELyFVsxl.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DateInput, DateUnit, Duration, ParseDateOptions, TimeUnit } from './date-util.cjs';
|
|
2
2
|
/** set で変更する日時の要素。month は1〜12 */
|
|
3
|
-
export interface
|
|
3
|
+
export interface ZonedDateTimeFields {
|
|
4
4
|
year?: number;
|
|
5
5
|
month?: number;
|
|
6
6
|
day?: number;
|
|
@@ -12,7 +12,7 @@ export interface DateTimeFields {
|
|
|
12
12
|
/**
|
|
13
13
|
* 日時を文字列にするときのオプション
|
|
14
14
|
*/
|
|
15
|
-
export interface
|
|
15
|
+
export interface ZonedDateTimeFormatOptions {
|
|
16
16
|
/** 月名・曜日名に使うロケール。既定は 'en-US' */
|
|
17
17
|
locale?: string;
|
|
18
18
|
}
|
|
@@ -21,7 +21,7 @@ export interface DateTimeFormatOptions {
|
|
|
21
21
|
* 演算メソッドは自身を変更せず、結果を新しいインスタンスで返す
|
|
22
22
|
* インスタンスごとにタイムゾーンを持ち、startOf / endOf / set や各要素の参照はそのタイムゾーンで計算する
|
|
23
23
|
*/
|
|
24
|
-
export declare class
|
|
24
|
+
export declare class ZonedDateTime {
|
|
25
25
|
/**
|
|
26
26
|
* 日時演算インスタンス
|
|
27
27
|
*/
|
|
@@ -32,21 +32,21 @@ export declare class DateTime {
|
|
|
32
32
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
33
33
|
*
|
|
34
34
|
* @param {string} [timezone] IANA名。既定は 'UTC'
|
|
35
|
-
* @returns {
|
|
35
|
+
* @returns {ZonedDateTime}
|
|
36
36
|
*/
|
|
37
|
-
static now(timezone?: string):
|
|
37
|
+
static now(timezone?: string): ZonedDateTime;
|
|
38
38
|
/**
|
|
39
39
|
* 値を日時として解釈する
|
|
40
40
|
* 生成したインスタンスは inputTimezone のタイムゾーンを持つ
|
|
41
|
-
*
|
|
41
|
+
* ZonedDateTime を渡した場合、inputTimezone を省略すると渡した ZonedDateTime のタイムゾーンを引き継ぐ
|
|
42
42
|
* duration / startOf / endOf はそのタイムゾーンで計算する
|
|
43
43
|
* 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
44
44
|
*
|
|
45
45
|
* @param {DateInput} value
|
|
46
46
|
* @param {ParseDateOptions} [options]
|
|
47
|
-
* @returns {
|
|
47
|
+
* @returns {ZonedDateTime | null}
|
|
48
48
|
*/
|
|
49
|
-
static parse(value: DateInput, options?: ParseDateOptions):
|
|
49
|
+
static parse(value: DateInput, options?: ParseDateOptions): ZonedDateTime | null;
|
|
50
50
|
/** 年 */
|
|
51
51
|
get year(): number;
|
|
52
52
|
/** 月(1〜12) */
|
|
@@ -74,108 +74,108 @@ export declare class DateTime {
|
|
|
74
74
|
* 負の値を指定すると減算になる
|
|
75
75
|
*
|
|
76
76
|
* @param {Duration} duration
|
|
77
|
-
* @returns {
|
|
77
|
+
* @returns {ZonedDateTime}
|
|
78
78
|
*/
|
|
79
|
-
plus(duration: Duration):
|
|
79
|
+
plus(duration: Duration): ZonedDateTime;
|
|
80
80
|
/**
|
|
81
81
|
* 期間を減算した結果を返す
|
|
82
82
|
*
|
|
83
83
|
* @param {Duration} duration
|
|
84
|
-
* @returns {
|
|
84
|
+
* @returns {ZonedDateTime}
|
|
85
85
|
*/
|
|
86
|
-
minus(duration: Duration):
|
|
86
|
+
minus(duration: Duration): ZonedDateTime;
|
|
87
87
|
/**
|
|
88
88
|
* 指定した単位の最初の時点に切り捨てた結果を返す(month なら月初の00:00:00.000)
|
|
89
89
|
* week は月曜始まりで切り捨てる
|
|
90
90
|
*
|
|
91
91
|
* @param {DateUnit} unit
|
|
92
|
-
* @returns {
|
|
92
|
+
* @returns {ZonedDateTime}
|
|
93
93
|
*/
|
|
94
|
-
startOf(unit: DateUnit):
|
|
94
|
+
startOf(unit: DateUnit): ZonedDateTime;
|
|
95
95
|
/**
|
|
96
96
|
* 指定した単位の最後の時点に切り上げた結果を返す(month なら月末の23:59:59.999)
|
|
97
97
|
* week は日曜終わりで切り上げる
|
|
98
98
|
*
|
|
99
99
|
* @param {DateUnit} unit
|
|
100
|
-
* @returns {
|
|
100
|
+
* @returns {ZonedDateTime}
|
|
101
101
|
*/
|
|
102
|
-
endOf(unit: DateUnit):
|
|
102
|
+
endOf(unit: DateUnit): ZonedDateTime;
|
|
103
103
|
/**
|
|
104
104
|
* 指定した要素を変更した結果を返す
|
|
105
105
|
* 範囲外の値や整数でない値を指定した場合は RangeError をスローする
|
|
106
106
|
* day を指定せずに year / month を変更し、日がその月に無い場合は月末日にする(1月31日に { month: 2 } なら2月末日)
|
|
107
107
|
*
|
|
108
|
-
* @param {
|
|
109
|
-
* @returns {
|
|
108
|
+
* @param {ZonedDateTimeFields} fields
|
|
109
|
+
* @returns {ZonedDateTime}
|
|
110
110
|
*/
|
|
111
|
-
set(fields:
|
|
111
|
+
set(fields: ZonedDateTimeFields): ZonedDateTime;
|
|
112
112
|
/**
|
|
113
113
|
* 同じ時刻を別のタイムゾーンで表した結果を返す
|
|
114
114
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
115
115
|
*
|
|
116
116
|
* @param {string} timezone IANA名
|
|
117
|
-
* @returns {
|
|
117
|
+
* @returns {ZonedDateTime}
|
|
118
118
|
*/
|
|
119
|
-
setZone(timezone: string):
|
|
119
|
+
setZone(timezone: string): ZonedDateTime;
|
|
120
120
|
/**
|
|
121
121
|
* 自身 − other を unit の単位で返す
|
|
122
122
|
* 両方を自身のタイムゾーンで unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)
|
|
123
123
|
*
|
|
124
|
-
* @param {
|
|
124
|
+
* @param {ZonedDateTime} other
|
|
125
125
|
* @param {TimeUnit} unit
|
|
126
126
|
* @returns {number}
|
|
127
127
|
*/
|
|
128
|
-
diff(other:
|
|
128
|
+
diff(other: ZonedDateTime, unit: TimeUnit): number;
|
|
129
129
|
/**
|
|
130
130
|
* 時刻を比較する。タイムゾーンが異なっていても同じ時刻なら等しい
|
|
131
131
|
*
|
|
132
|
-
* @param {
|
|
132
|
+
* @param {ZonedDateTime} other
|
|
133
133
|
* @returns {-1 | 0 | 1} 自身が前なら-1、等しければ0、後なら1
|
|
134
134
|
*/
|
|
135
|
-
compareTo(other:
|
|
135
|
+
compareTo(other: ZonedDateTime): -1 | 0 | 1;
|
|
136
136
|
/**
|
|
137
137
|
* 同じ時刻か判定する
|
|
138
138
|
*
|
|
139
|
-
* @param {
|
|
139
|
+
* @param {ZonedDateTime} other
|
|
140
140
|
* @returns {boolean}
|
|
141
141
|
*/
|
|
142
|
-
eq(other:
|
|
142
|
+
eq(other: ZonedDateTime): boolean;
|
|
143
143
|
/**
|
|
144
144
|
* 自身が前の時刻か判定する
|
|
145
145
|
*
|
|
146
|
-
* @param {
|
|
146
|
+
* @param {ZonedDateTime} other
|
|
147
147
|
* @returns {boolean}
|
|
148
148
|
*/
|
|
149
|
-
lt(other:
|
|
149
|
+
lt(other: ZonedDateTime): boolean;
|
|
150
150
|
/**
|
|
151
151
|
* 自身が前か同じ時刻か判定する
|
|
152
152
|
*
|
|
153
|
-
* @param {
|
|
153
|
+
* @param {ZonedDateTime} other
|
|
154
154
|
* @returns {boolean}
|
|
155
155
|
*/
|
|
156
|
-
lte(other:
|
|
156
|
+
lte(other: ZonedDateTime): boolean;
|
|
157
157
|
/**
|
|
158
158
|
* 自身が後の時刻か判定する
|
|
159
159
|
*
|
|
160
|
-
* @param {
|
|
160
|
+
* @param {ZonedDateTime} other
|
|
161
161
|
* @returns {boolean}
|
|
162
162
|
*/
|
|
163
|
-
gt(other:
|
|
163
|
+
gt(other: ZonedDateTime): boolean;
|
|
164
164
|
/**
|
|
165
165
|
* 自身が後か同じ時刻か判定する
|
|
166
166
|
*
|
|
167
|
-
* @param {
|
|
167
|
+
* @param {ZonedDateTime} other
|
|
168
168
|
* @returns {boolean}
|
|
169
169
|
*/
|
|
170
|
-
gte(other:
|
|
170
|
+
gte(other: ZonedDateTime): boolean;
|
|
171
171
|
/**
|
|
172
172
|
* 自身のタイムゾーンで、指定した書式の文字列にする
|
|
173
173
|
*
|
|
174
174
|
* @param {string} outputFormat
|
|
175
|
-
* @param {
|
|
175
|
+
* @param {ZonedDateTimeFormatOptions} [options]
|
|
176
176
|
* @returns {string}
|
|
177
177
|
*/
|
|
178
|
-
format(outputFormat: string, options?:
|
|
178
|
+
format(outputFormat: string, options?: ZonedDateTimeFormatOptions): string;
|
|
179
179
|
/**
|
|
180
180
|
* 自身のタイムゾーンで、ISO形式の文字列にする
|
|
181
181
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DateInput, DateUnit, Duration, ParseDateOptions, TimeUnit } from './date-util';
|
|
2
2
|
/** set で変更する日時の要素。month は1〜12 */
|
|
3
|
-
export interface
|
|
3
|
+
export interface ZonedDateTimeFields {
|
|
4
4
|
year?: number;
|
|
5
5
|
month?: number;
|
|
6
6
|
day?: number;
|
|
@@ -12,7 +12,7 @@ export interface DateTimeFields {
|
|
|
12
12
|
/**
|
|
13
13
|
* 日時を文字列にするときのオプション
|
|
14
14
|
*/
|
|
15
|
-
export interface
|
|
15
|
+
export interface ZonedDateTimeFormatOptions {
|
|
16
16
|
/** 月名・曜日名に使うロケール。既定は 'en-US' */
|
|
17
17
|
locale?: string;
|
|
18
18
|
}
|
|
@@ -21,7 +21,7 @@ export interface DateTimeFormatOptions {
|
|
|
21
21
|
* 演算メソッドは自身を変更せず、結果を新しいインスタンスで返す
|
|
22
22
|
* インスタンスごとにタイムゾーンを持ち、startOf / endOf / set や各要素の参照はそのタイムゾーンで計算する
|
|
23
23
|
*/
|
|
24
|
-
export declare class
|
|
24
|
+
export declare class ZonedDateTime {
|
|
25
25
|
/**
|
|
26
26
|
* 日時演算インスタンス
|
|
27
27
|
*/
|
|
@@ -32,21 +32,21 @@ export declare class DateTime {
|
|
|
32
32
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
33
33
|
*
|
|
34
34
|
* @param {string} [timezone] IANA名。既定は 'UTC'
|
|
35
|
-
* @returns {
|
|
35
|
+
* @returns {ZonedDateTime}
|
|
36
36
|
*/
|
|
37
|
-
static now(timezone?: string):
|
|
37
|
+
static now(timezone?: string): ZonedDateTime;
|
|
38
38
|
/**
|
|
39
39
|
* 値を日時として解釈する
|
|
40
40
|
* 生成したインスタンスは inputTimezone のタイムゾーンを持つ
|
|
41
|
-
*
|
|
41
|
+
* ZonedDateTime を渡した場合、inputTimezone を省略すると渡した ZonedDateTime のタイムゾーンを引き継ぐ
|
|
42
42
|
* duration / startOf / endOf はそのタイムゾーンで計算する
|
|
43
43
|
* 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
44
44
|
*
|
|
45
45
|
* @param {DateInput} value
|
|
46
46
|
* @param {ParseDateOptions} [options]
|
|
47
|
-
* @returns {
|
|
47
|
+
* @returns {ZonedDateTime | null}
|
|
48
48
|
*/
|
|
49
|
-
static parse(value: DateInput, options?: ParseDateOptions):
|
|
49
|
+
static parse(value: DateInput, options?: ParseDateOptions): ZonedDateTime | null;
|
|
50
50
|
/** 年 */
|
|
51
51
|
get year(): number;
|
|
52
52
|
/** 月(1〜12) */
|
|
@@ -74,108 +74,108 @@ export declare class DateTime {
|
|
|
74
74
|
* 負の値を指定すると減算になる
|
|
75
75
|
*
|
|
76
76
|
* @param {Duration} duration
|
|
77
|
-
* @returns {
|
|
77
|
+
* @returns {ZonedDateTime}
|
|
78
78
|
*/
|
|
79
|
-
plus(duration: Duration):
|
|
79
|
+
plus(duration: Duration): ZonedDateTime;
|
|
80
80
|
/**
|
|
81
81
|
* 期間を減算した結果を返す
|
|
82
82
|
*
|
|
83
83
|
* @param {Duration} duration
|
|
84
|
-
* @returns {
|
|
84
|
+
* @returns {ZonedDateTime}
|
|
85
85
|
*/
|
|
86
|
-
minus(duration: Duration):
|
|
86
|
+
minus(duration: Duration): ZonedDateTime;
|
|
87
87
|
/**
|
|
88
88
|
* 指定した単位の最初の時点に切り捨てた結果を返す(month なら月初の00:00:00.000)
|
|
89
89
|
* week は月曜始まりで切り捨てる
|
|
90
90
|
*
|
|
91
91
|
* @param {DateUnit} unit
|
|
92
|
-
* @returns {
|
|
92
|
+
* @returns {ZonedDateTime}
|
|
93
93
|
*/
|
|
94
|
-
startOf(unit: DateUnit):
|
|
94
|
+
startOf(unit: DateUnit): ZonedDateTime;
|
|
95
95
|
/**
|
|
96
96
|
* 指定した単位の最後の時点に切り上げた結果を返す(month なら月末の23:59:59.999)
|
|
97
97
|
* week は日曜終わりで切り上げる
|
|
98
98
|
*
|
|
99
99
|
* @param {DateUnit} unit
|
|
100
|
-
* @returns {
|
|
100
|
+
* @returns {ZonedDateTime}
|
|
101
101
|
*/
|
|
102
|
-
endOf(unit: DateUnit):
|
|
102
|
+
endOf(unit: DateUnit): ZonedDateTime;
|
|
103
103
|
/**
|
|
104
104
|
* 指定した要素を変更した結果を返す
|
|
105
105
|
* 範囲外の値や整数でない値を指定した場合は RangeError をスローする
|
|
106
106
|
* day を指定せずに year / month を変更し、日がその月に無い場合は月末日にする(1月31日に { month: 2 } なら2月末日)
|
|
107
107
|
*
|
|
108
|
-
* @param {
|
|
109
|
-
* @returns {
|
|
108
|
+
* @param {ZonedDateTimeFields} fields
|
|
109
|
+
* @returns {ZonedDateTime}
|
|
110
110
|
*/
|
|
111
|
-
set(fields:
|
|
111
|
+
set(fields: ZonedDateTimeFields): ZonedDateTime;
|
|
112
112
|
/**
|
|
113
113
|
* 同じ時刻を別のタイムゾーンで表した結果を返す
|
|
114
114
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
115
115
|
*
|
|
116
116
|
* @param {string} timezone IANA名
|
|
117
|
-
* @returns {
|
|
117
|
+
* @returns {ZonedDateTime}
|
|
118
118
|
*/
|
|
119
|
-
setZone(timezone: string):
|
|
119
|
+
setZone(timezone: string): ZonedDateTime;
|
|
120
120
|
/**
|
|
121
121
|
* 自身 − other を unit の単位で返す
|
|
122
122
|
* 両方を自身のタイムゾーンで unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)
|
|
123
123
|
*
|
|
124
|
-
* @param {
|
|
124
|
+
* @param {ZonedDateTime} other
|
|
125
125
|
* @param {TimeUnit} unit
|
|
126
126
|
* @returns {number}
|
|
127
127
|
*/
|
|
128
|
-
diff(other:
|
|
128
|
+
diff(other: ZonedDateTime, unit: TimeUnit): number;
|
|
129
129
|
/**
|
|
130
130
|
* 時刻を比較する。タイムゾーンが異なっていても同じ時刻なら等しい
|
|
131
131
|
*
|
|
132
|
-
* @param {
|
|
132
|
+
* @param {ZonedDateTime} other
|
|
133
133
|
* @returns {-1 | 0 | 1} 自身が前なら-1、等しければ0、後なら1
|
|
134
134
|
*/
|
|
135
|
-
compareTo(other:
|
|
135
|
+
compareTo(other: ZonedDateTime): -1 | 0 | 1;
|
|
136
136
|
/**
|
|
137
137
|
* 同じ時刻か判定する
|
|
138
138
|
*
|
|
139
|
-
* @param {
|
|
139
|
+
* @param {ZonedDateTime} other
|
|
140
140
|
* @returns {boolean}
|
|
141
141
|
*/
|
|
142
|
-
eq(other:
|
|
142
|
+
eq(other: ZonedDateTime): boolean;
|
|
143
143
|
/**
|
|
144
144
|
* 自身が前の時刻か判定する
|
|
145
145
|
*
|
|
146
|
-
* @param {
|
|
146
|
+
* @param {ZonedDateTime} other
|
|
147
147
|
* @returns {boolean}
|
|
148
148
|
*/
|
|
149
|
-
lt(other:
|
|
149
|
+
lt(other: ZonedDateTime): boolean;
|
|
150
150
|
/**
|
|
151
151
|
* 自身が前か同じ時刻か判定する
|
|
152
152
|
*
|
|
153
|
-
* @param {
|
|
153
|
+
* @param {ZonedDateTime} other
|
|
154
154
|
* @returns {boolean}
|
|
155
155
|
*/
|
|
156
|
-
lte(other:
|
|
156
|
+
lte(other: ZonedDateTime): boolean;
|
|
157
157
|
/**
|
|
158
158
|
* 自身が後の時刻か判定する
|
|
159
159
|
*
|
|
160
|
-
* @param {
|
|
160
|
+
* @param {ZonedDateTime} other
|
|
161
161
|
* @returns {boolean}
|
|
162
162
|
*/
|
|
163
|
-
gt(other:
|
|
163
|
+
gt(other: ZonedDateTime): boolean;
|
|
164
164
|
/**
|
|
165
165
|
* 自身が後か同じ時刻か判定する
|
|
166
166
|
*
|
|
167
|
-
* @param {
|
|
167
|
+
* @param {ZonedDateTime} other
|
|
168
168
|
* @returns {boolean}
|
|
169
169
|
*/
|
|
170
|
-
gte(other:
|
|
170
|
+
gte(other: ZonedDateTime): boolean;
|
|
171
171
|
/**
|
|
172
172
|
* 自身のタイムゾーンで、指定した書式の文字列にする
|
|
173
173
|
*
|
|
174
174
|
* @param {string} outputFormat
|
|
175
|
-
* @param {
|
|
175
|
+
* @param {ZonedDateTimeFormatOptions} [options]
|
|
176
176
|
* @returns {string}
|
|
177
177
|
*/
|
|
178
|
-
format(outputFormat: string, options?:
|
|
178
|
+
format(outputFormat: string, options?: ZonedDateTimeFormatOptions): string;
|
|
179
179
|
/**
|
|
180
180
|
* 自身のタイムゾーンで、ISO形式の文字列にする
|
|
181
181
|
*
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { DateTime as a } from "luxon";
|
|
2
|
-
const
|
|
2
|
+
const d = "UTC", h = "en-US", m = (s) => {
|
|
3
3
|
if (!s.isValid && s.invalidReason === "unsupported zone")
|
|
4
4
|
throw new RangeError(s.invalidExplanation ?? s.invalidReason);
|
|
5
|
-
}, o = (s, t, e,
|
|
6
|
-
if (t !== void 0 && (!Number.isInteger(t) || t < e ||
|
|
7
|
-
throw new RangeError(`${s} must be an integer from ${e} to ${
|
|
5
|
+
}, o = (s, t, e, n) => {
|
|
6
|
+
if (t !== void 0 && (!Number.isInteger(t) || t < e || n < t))
|
|
7
|
+
throw new RangeError(`${s} must be an integer from ${e} to ${n}: ${t}`);
|
|
8
8
|
};
|
|
9
9
|
class i {
|
|
10
10
|
/**
|
|
@@ -19,49 +19,49 @@ class i {
|
|
|
19
19
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
20
20
|
*
|
|
21
21
|
* @param {string} [timezone] IANA名。既定は 'UTC'
|
|
22
|
-
* @returns {
|
|
22
|
+
* @returns {ZonedDateTime}
|
|
23
23
|
*/
|
|
24
|
-
static now(t =
|
|
24
|
+
static now(t = d) {
|
|
25
25
|
const e = a.now().setZone(t);
|
|
26
26
|
return m(e), new i(e);
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* 値を日時として解釈する
|
|
30
30
|
* 生成したインスタンスは inputTimezone のタイムゾーンを持つ
|
|
31
|
-
*
|
|
31
|
+
* ZonedDateTime を渡した場合、inputTimezone を省略すると渡した ZonedDateTime のタイムゾーンを引き継ぐ
|
|
32
32
|
* duration / startOf / endOf はそのタイムゾーンで計算する
|
|
33
33
|
* 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
34
34
|
*
|
|
35
35
|
* @param {DateInput} value
|
|
36
36
|
* @param {ParseDateOptions} [options]
|
|
37
|
-
* @returns {
|
|
37
|
+
* @returns {ZonedDateTime | null}
|
|
38
38
|
*/
|
|
39
39
|
static parse(t, e) {
|
|
40
40
|
if (t == null || t === "")
|
|
41
41
|
return null;
|
|
42
|
-
const
|
|
43
|
-
let
|
|
42
|
+
const n = e?.inputTimezone ?? d;
|
|
43
|
+
let r = null;
|
|
44
44
|
if (t instanceof i)
|
|
45
|
-
|
|
45
|
+
r = e?.inputTimezone ? t.dateTime.setZone(e.inputTimezone) : t.dateTime;
|
|
46
46
|
else if (t instanceof Date)
|
|
47
|
-
|
|
47
|
+
r = a.fromJSDate(t, { zone: n });
|
|
48
48
|
else if (typeof t == "number")
|
|
49
|
-
|
|
49
|
+
r = Number.isFinite(t) ? a.fromMillis(t, { zone: n }) : null;
|
|
50
50
|
else {
|
|
51
51
|
const c = e?.locale ?? h, l = e?.inputFormat ? [e.inputFormat].flat() : [];
|
|
52
|
-
for (const
|
|
53
|
-
const
|
|
54
|
-
zone:
|
|
52
|
+
for (const f of l) {
|
|
53
|
+
const u = a.fromFormat(t, f, {
|
|
54
|
+
zone: n,
|
|
55
55
|
locale: c
|
|
56
56
|
});
|
|
57
|
-
if (m(
|
|
58
|
-
|
|
57
|
+
if (m(u), u.isValid) {
|
|
58
|
+
r = u;
|
|
59
59
|
break;
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
r == null && (r = a.fromISO(t, { zone: n }));
|
|
63
63
|
}
|
|
64
|
-
return
|
|
64
|
+
return r == null || (m(r), !r.isValid) ? null : (e?.duration && (r = r.plus(e.duration)), e?.startOf && (r = r.startOf(e.startOf)), e?.endOf && (r = r.endOf(e.endOf)), new i(r));
|
|
65
65
|
}
|
|
66
66
|
/** 年 */
|
|
67
67
|
get year() {
|
|
@@ -112,7 +112,7 @@ class i {
|
|
|
112
112
|
* 負の値を指定すると減算になる
|
|
113
113
|
*
|
|
114
114
|
* @param {Duration} duration
|
|
115
|
-
* @returns {
|
|
115
|
+
* @returns {ZonedDateTime}
|
|
116
116
|
*/
|
|
117
117
|
plus(t) {
|
|
118
118
|
return new i(this.dateTime.plus(t));
|
|
@@ -121,7 +121,7 @@ class i {
|
|
|
121
121
|
* 期間を減算した結果を返す
|
|
122
122
|
*
|
|
123
123
|
* @param {Duration} duration
|
|
124
|
-
* @returns {
|
|
124
|
+
* @returns {ZonedDateTime}
|
|
125
125
|
*/
|
|
126
126
|
minus(t) {
|
|
127
127
|
return new i(this.dateTime.minus(t));
|
|
@@ -131,7 +131,7 @@ class i {
|
|
|
131
131
|
* week は月曜始まりで切り捨てる
|
|
132
132
|
*
|
|
133
133
|
* @param {DateUnit} unit
|
|
134
|
-
* @returns {
|
|
134
|
+
* @returns {ZonedDateTime}
|
|
135
135
|
*/
|
|
136
136
|
startOf(t) {
|
|
137
137
|
return new i(this.dateTime.startOf(t));
|
|
@@ -141,7 +141,7 @@ class i {
|
|
|
141
141
|
* week は日曜終わりで切り上げる
|
|
142
142
|
*
|
|
143
143
|
* @param {DateUnit} unit
|
|
144
|
-
* @returns {
|
|
144
|
+
* @returns {ZonedDateTime}
|
|
145
145
|
*/
|
|
146
146
|
endOf(t) {
|
|
147
147
|
return new i(this.dateTime.endOf(t));
|
|
@@ -151,8 +151,8 @@ class i {
|
|
|
151
151
|
* 範囲外の値や整数でない値を指定した場合は RangeError をスローする
|
|
152
152
|
* day を指定せずに year / month を変更し、日がその月に無い場合は月末日にする(1月31日に { month: 2 } なら2月末日)
|
|
153
153
|
*
|
|
154
|
-
* @param {
|
|
155
|
-
* @returns {
|
|
154
|
+
* @param {ZonedDateTimeFields} fields
|
|
155
|
+
* @returns {ZonedDateTime}
|
|
156
156
|
*/
|
|
157
157
|
set(t) {
|
|
158
158
|
o("month", t.month, 1, 12), o("hour", t.hour, 0, 23), o("minute", t.minute, 0, 59), o("second", t.second, 0, 59), o("millisecond", t.millisecond, 0, 999);
|
|
@@ -168,7 +168,7 @@ class i {
|
|
|
168
168
|
* タイムゾーンの指定が不正な場合は RangeError をスローする
|
|
169
169
|
*
|
|
170
170
|
* @param {string} timezone IANA名
|
|
171
|
-
* @returns {
|
|
171
|
+
* @returns {ZonedDateTime}
|
|
172
172
|
*/
|
|
173
173
|
setZone(t) {
|
|
174
174
|
const e = this.dateTime.setZone(t);
|
|
@@ -178,18 +178,18 @@ class i {
|
|
|
178
178
|
* 自身 − other を unit の単位で返す
|
|
179
179
|
* 両方を自身のタイムゾーンで unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)
|
|
180
180
|
*
|
|
181
|
-
* @param {
|
|
181
|
+
* @param {ZonedDateTime} other
|
|
182
182
|
* @param {TimeUnit} unit
|
|
183
183
|
* @returns {number}
|
|
184
184
|
*/
|
|
185
185
|
diff(t, e) {
|
|
186
|
-
const
|
|
187
|
-
return this.dateTime.startOf(
|
|
186
|
+
const n = e.slice(0, -1), r = t.dateTime.setZone(this.dateTime.zone);
|
|
187
|
+
return this.dateTime.startOf(n).diff(r.startOf(n), e).get(e);
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
190
|
* 時刻を比較する。タイムゾーンが異なっていても同じ時刻なら等しい
|
|
191
191
|
*
|
|
192
|
-
* @param {
|
|
192
|
+
* @param {ZonedDateTime} other
|
|
193
193
|
* @returns {-1 | 0 | 1} 自身が前なら-1、等しければ0、後なら1
|
|
194
194
|
*/
|
|
195
195
|
compareTo(t) {
|
|
@@ -198,7 +198,7 @@ class i {
|
|
|
198
198
|
/**
|
|
199
199
|
* 同じ時刻か判定する
|
|
200
200
|
*
|
|
201
|
-
* @param {
|
|
201
|
+
* @param {ZonedDateTime} other
|
|
202
202
|
* @returns {boolean}
|
|
203
203
|
*/
|
|
204
204
|
eq(t) {
|
|
@@ -207,7 +207,7 @@ class i {
|
|
|
207
207
|
/**
|
|
208
208
|
* 自身が前の時刻か判定する
|
|
209
209
|
*
|
|
210
|
-
* @param {
|
|
210
|
+
* @param {ZonedDateTime} other
|
|
211
211
|
* @returns {boolean}
|
|
212
212
|
*/
|
|
213
213
|
lt(t) {
|
|
@@ -216,7 +216,7 @@ class i {
|
|
|
216
216
|
/**
|
|
217
217
|
* 自身が前か同じ時刻か判定する
|
|
218
218
|
*
|
|
219
|
-
* @param {
|
|
219
|
+
* @param {ZonedDateTime} other
|
|
220
220
|
* @returns {boolean}
|
|
221
221
|
*/
|
|
222
222
|
lte(t) {
|
|
@@ -225,7 +225,7 @@ class i {
|
|
|
225
225
|
/**
|
|
226
226
|
* 自身が後の時刻か判定する
|
|
227
227
|
*
|
|
228
|
-
* @param {
|
|
228
|
+
* @param {ZonedDateTime} other
|
|
229
229
|
* @returns {boolean}
|
|
230
230
|
*/
|
|
231
231
|
gt(t) {
|
|
@@ -234,7 +234,7 @@ class i {
|
|
|
234
234
|
/**
|
|
235
235
|
* 自身が後か同じ時刻か判定する
|
|
236
236
|
*
|
|
237
|
-
* @param {
|
|
237
|
+
* @param {ZonedDateTime} other
|
|
238
238
|
* @returns {boolean}
|
|
239
239
|
*/
|
|
240
240
|
gte(t) {
|
|
@@ -244,7 +244,7 @@ class i {
|
|
|
244
244
|
* 自身のタイムゾーンで、指定した書式の文字列にする
|
|
245
245
|
*
|
|
246
246
|
* @param {string} outputFormat
|
|
247
|
-
* @param {
|
|
247
|
+
* @param {ZonedDateTimeFormatOptions} [options]
|
|
248
248
|
* @returns {string}
|
|
249
249
|
*/
|
|
250
250
|
format(t, e) {
|
|
@@ -284,6 +284,6 @@ class i {
|
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
export {
|
|
287
|
-
i as
|
|
287
|
+
i as ZonedDateTime
|
|
288
288
|
};
|
|
289
|
-
//# sourceMappingURL=date-time.js.map
|
|
289
|
+
//# sourceMappingURL=zoned-date-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoned-date-time.js","sources":["../src/zoned-date-time.ts"],"sourcesContent":["/**\n * このクラス ZonedDateTime の役割は、日時演算の実体としての luxon を内部に閉じ込め、利用者側に露出させないことにある\n */\nimport { DateTime } from 'luxon';\nimport type { DateInput, DateUnit, Duration, ParseDateOptions, TimeUnit } from './date-util';\n\n/** set で変更する日時の要素。month は1〜12 */\nexport interface ZonedDateTimeFields {\n year?: number;\n month?: number;\n day?: number;\n hour?: number;\n minute?: number;\n second?: number;\n millisecond?: number;\n}\n\n/**\n * 日時を文字列にするときのオプション\n */\nexport interface ZonedDateTimeFormatOptions {\n /** 月名・曜日名に使うロケール。既定は 'en-US' */\n locale?: string;\n}\n\nconst DEFAULT_TIMEZONE = 'UTC';\n\nconst DEFAULT_LOCALE = 'en-US';\n\n/**\n * タイムゾーンの指定が不正な場合は、日時の不正とは区別して例外にする\n */\nconst assertZone = (d: DateTime): void => {\n if (!d.isValid && d.invalidReason === 'unsupported zone') {\n throw new RangeError(d.invalidExplanation ?? d.invalidReason);\n }\n};\n\n/**\n * set に渡された要素が min〜max の整数であることを確かめる\n */\nconst assertField = (name: keyof ZonedDateTimeFields, value: number | undefined, min: number, max: number): void => {\n if (value === undefined) {\n return;\n }\n if (!Number.isInteger(value) || value < min || max < value) {\n throw new RangeError(`${name} must be an integer from ${min} to ${max}: ${value}`);\n }\n};\n\n/**\n * 日時を表す不変オブジェクト\n * 演算メソッドは自身を変更せず、結果を新しいインスタンスで返す\n * インスタンスごとにタイムゾーンを持ち、startOf / endOf / set や各要素の参照はそのタイムゾーンで計算する\n */\nexport class ZonedDateTime {\n /**\n * 日時演算インスタンス\n */\n private dateTime: DateTime;\n\n private constructor(dateTime: DateTime) {\n this.dateTime = dateTime;\n }\n\n /**\n * 現在時刻を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} [timezone] IANA名。既定は 'UTC'\n * @returns {ZonedDateTime}\n */\n public static now(timezone: string = DEFAULT_TIMEZONE): ZonedDateTime {\n const d = DateTime.now().setZone(timezone);\n assertZone(d);\n return new ZonedDateTime(d);\n }\n\n /**\n * 値を日時として解釈する\n * 生成したインスタンスは inputTimezone のタイムゾーンを持つ\n * ZonedDateTime を渡した場合、inputTimezone を省略すると渡した ZonedDateTime のタイムゾーンを引き継ぐ\n * duration / startOf / endOf はそのタイムゾーンで計算する\n * 解釈できない値、null / undefined / 空文字は null を返す。タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {DateInput} value\n * @param {ParseDateOptions} [options]\n * @returns {ZonedDateTime | null}\n */\n public static parse(value: DateInput, options?: ParseDateOptions): ZonedDateTime | null {\n if (value == null || value === '') {\n return null;\n }\n const zone = options?.inputTimezone ?? DEFAULT_TIMEZONE;\n let d: DateTime | null = null;\n if (value instanceof ZonedDateTime) {\n d = options?.inputTimezone ? value.dateTime.setZone(options.inputTimezone) : value.dateTime;\n } else if (value instanceof Date) {\n d = DateTime.fromJSDate(value, { zone: zone });\n } else if (typeof value === 'number') {\n d = Number.isFinite(value) ? DateTime.fromMillis(value, { zone: zone }) : null;\n } else {\n const locale = options?.locale ?? DEFAULT_LOCALE;\n const formats = options?.inputFormat ? [options.inputFormat].flat() : [];\n for (const format of formats) {\n const parsed = DateTime.fromFormat(value, format, {\n zone: zone,\n locale: locale\n });\n assertZone(parsed);\n if (parsed.isValid) {\n d = parsed;\n break;\n }\n }\n if (d == null) {\n d = DateTime.fromISO(value, { zone: zone });\n }\n }\n if (d == null) {\n return null;\n }\n assertZone(d);\n if (!d.isValid) {\n return null;\n }\n if (options?.duration) {\n d = d.plus(options.duration);\n }\n if (options?.startOf) {\n d = d.startOf(options.startOf);\n }\n if (options?.endOf) {\n d = d.endOf(options.endOf);\n }\n return new ZonedDateTime(d);\n }\n\n /** 年 */\n public get year(): number {\n return this.dateTime.year;\n }\n\n /** 月(1〜12) */\n public get month(): number {\n return this.dateTime.month;\n }\n\n /** 日 */\n public get day(): number {\n return this.dateTime.day;\n }\n\n /** 時 */\n public get hour(): number {\n return this.dateTime.hour;\n }\n\n /** 分 */\n public get minute(): number {\n return this.dateTime.minute;\n }\n\n /** 秒 */\n public get second(): number {\n return this.dateTime.second;\n }\n\n /** ミリ秒 */\n public get millisecond(): number {\n return this.dateTime.millisecond;\n }\n\n /** 曜日。月曜が1、日曜が7 */\n public get weekday(): number {\n return this.dateTime.weekday;\n }\n\n /** その月の日数 */\n public get daysInMonth(): number {\n return this.dateTime.daysInMonth as number;\n }\n\n /** 夏時間の期間中か */\n public get isInDST(): boolean {\n return this.dateTime.isInDST;\n }\n\n /** タイムゾーン(IANA名) */\n public get timezone(): string {\n return this.dateTime.zoneName as string;\n }\n\n /**\n * 期間を加算した結果を返す\n * 負の値を指定すると減算になる\n *\n * @param {Duration} duration\n * @returns {ZonedDateTime}\n */\n public plus(duration: Duration): ZonedDateTime {\n return new ZonedDateTime(this.dateTime.plus(duration));\n }\n\n /**\n * 期間を減算した結果を返す\n *\n * @param {Duration} duration\n * @returns {ZonedDateTime}\n */\n public minus(duration: Duration): ZonedDateTime {\n return new ZonedDateTime(this.dateTime.minus(duration));\n }\n\n /**\n * 指定した単位の最初の時点に切り捨てた結果を返す(month なら月初の00:00:00.000)\n * week は月曜始まりで切り捨てる\n *\n * @param {DateUnit} unit\n * @returns {ZonedDateTime}\n */\n public startOf(unit: DateUnit): ZonedDateTime {\n return new ZonedDateTime(this.dateTime.startOf(unit));\n }\n\n /**\n * 指定した単位の最後の時点に切り上げた結果を返す(month なら月末の23:59:59.999)\n * week は日曜終わりで切り上げる\n *\n * @param {DateUnit} unit\n * @returns {ZonedDateTime}\n */\n public endOf(unit: DateUnit): ZonedDateTime {\n return new ZonedDateTime(this.dateTime.endOf(unit));\n }\n\n /**\n * 指定した要素を変更した結果を返す\n * 範囲外の値や整数でない値を指定した場合は RangeError をスローする\n * day を指定せずに year / month を変更し、日がその月に無い場合は月末日にする(1月31日に { month: 2 } なら2月末日)\n *\n * @param {ZonedDateTimeFields} fields\n * @returns {ZonedDateTime}\n */\n public set(fields: ZonedDateTimeFields): ZonedDateTime {\n assertField('month', fields.month, 1, 12);\n assertField('hour', fields.hour, 0, 23);\n assertField('minute', fields.minute, 0, 59);\n assertField('second', fields.second, 0, 59);\n assertField('millisecond', fields.millisecond, 0, 999);\n // day の上限は変更後の年月で決まる\n const daysInMonth = this.dateTime.set({\n year: fields.year ?? this.year,\n month: fields.month ?? this.month,\n day: 1\n }).daysInMonth as number;\n assertField('day', fields.day, 1, daysInMonth);\n return new ZonedDateTime(this.dateTime.set(fields));\n }\n\n /**\n * 同じ時刻を別のタイムゾーンで表した結果を返す\n * タイムゾーンの指定が不正な場合は RangeError をスローする\n *\n * @param {string} timezone IANA名\n * @returns {ZonedDateTime}\n */\n public setZone(timezone: string): ZonedDateTime {\n const d = this.dateTime.setZone(timezone);\n assertZone(d);\n return new ZonedDateTime(d);\n }\n\n /**\n * 自身 − other を unit の単位で返す\n * 両方を自身のタイムゾーンで unit の始まりに切り捨ててから差を取るため、暦の上での差になる(23:00 と翌 01:00 の days は 1)\n *\n * @param {ZonedDateTime} other\n * @param {TimeUnit} unit\n * @returns {number}\n */\n public diff(other: ZonedDateTime, unit: TimeUnit): number {\n // 'days' → 'day' のように切り捨ての単位にする\n const dateUnit = unit.slice(0, -1) as DateUnit;\n const target = other.dateTime.setZone(this.dateTime.zone);\n return this.dateTime.startOf(dateUnit).diff(target.startOf(dateUnit), unit).get(unit);\n }\n\n /**\n * 時刻を比較する。タイムゾーンが異なっていても同じ時刻なら等しい\n *\n * @param {ZonedDateTime} other\n * @returns {-1 | 0 | 1} 自身が前なら-1、等しければ0、後なら1\n */\n public compareTo(other: ZonedDateTime): -1 | 0 | 1 {\n return Math.sign(this.toMillis() - other.toMillis()) as -1 | 0 | 1;\n }\n\n /**\n * 同じ時刻か判定する\n *\n * @param {ZonedDateTime} other\n * @returns {boolean}\n */\n public eq(other: ZonedDateTime): boolean {\n return this.compareTo(other) === 0;\n }\n\n /**\n * 自身が前の時刻か判定する\n *\n * @param {ZonedDateTime} other\n * @returns {boolean}\n */\n public lt(other: ZonedDateTime): boolean {\n return this.compareTo(other) < 0;\n }\n\n /**\n * 自身が前か同じ時刻か判定する\n *\n * @param {ZonedDateTime} other\n * @returns {boolean}\n */\n public lte(other: ZonedDateTime): boolean {\n return this.compareTo(other) <= 0;\n }\n\n /**\n * 自身が後の時刻か判定する\n *\n * @param {ZonedDateTime} other\n * @returns {boolean}\n */\n public gt(other: ZonedDateTime): boolean {\n return 0 < this.compareTo(other);\n }\n\n /**\n * 自身が後か同じ時刻か判定する\n *\n * @param {ZonedDateTime} other\n * @returns {boolean}\n */\n public gte(other: ZonedDateTime): boolean {\n return 0 <= this.compareTo(other);\n }\n\n /**\n * 自身のタイムゾーンで、指定した書式の文字列にする\n *\n * @param {string} outputFormat\n * @param {ZonedDateTimeFormatOptions} [options]\n * @returns {string}\n */\n public format(outputFormat: string, options?: ZonedDateTimeFormatOptions): string {\n return this.dateTime.toFormat(outputFormat, { locale: options?.locale ?? DEFAULT_LOCALE });\n }\n\n /**\n * 自身のタイムゾーンで、ISO形式の文字列にする\n *\n * @returns {string}\n */\n public toISO(): string {\n return this.dateTime.toISO() as string;\n }\n\n /**\n * Date に変換する\n *\n * @returns {Date}\n */\n public toDate(): Date {\n return this.dateTime.toJSDate();\n }\n\n /**\n * epoch ミリ秒に変換する\n *\n * @returns {number}\n */\n public toMillis(): number {\n return this.dateTime.toMillis();\n }\n\n /**\n * 自身のタイムゾーンで、ISO形式の文字列にする\n *\n * @returns {string}\n */\n public toString(): string {\n return this.toISO();\n }\n}\n"],"names":["DEFAULT_TIMEZONE","DEFAULT_LOCALE","assertZone","d","assertField","name","value","min","max","ZonedDateTime","dateTime","timezone","DateTime","options","zone","locale","formats","format","parsed","duration","unit","fields","daysInMonth","other","dateUnit","target","outputFormat"],"mappings":";AAyBA,MAAMA,IAAmB,OAEnBC,IAAiB,SAKjBC,IAAa,CAACC,MAAsB;AACxC,MAAI,CAACA,EAAE,WAAWA,EAAE,kBAAkB;AACpC,UAAM,IAAI,WAAWA,EAAE,sBAAsBA,EAAE,aAAa;AAEhE,GAKMC,IAAc,CAACC,GAAiCC,GAA2BC,GAAaC,MAAsB;AAClH,MAAIF,MAAU,WAGV,CAAC,OAAO,UAAUA,CAAK,KAAKA,IAAQC,KAAOC,IAAMF;AACnD,UAAM,IAAI,WAAW,GAAGD,CAAI,4BAA4BE,CAAG,OAAOC,CAAG,KAAKF,CAAK,EAAE;AAErF;AAOO,MAAMG,EAAc;AAAA;AAAA;AAAA;AAAA,EAIjB;AAAA,EAEA,YAAYC,GAAoB;AACtC,SAAK,WAAWA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAc,IAAIC,IAAmBX,GAAiC;AACpE,UAAMG,IAAIS,EAAS,IAAA,EAAM,QAAQD,CAAQ;AACzC,WAAAT,EAAWC,CAAC,GACL,IAAIM,EAAcN,CAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAc,MAAMG,GAAkBO,GAAkD;AACtF,QAAIP,KAAS,QAAQA,MAAU;AAC7B,aAAO;AAET,UAAMQ,IAAOD,GAAS,iBAAiBb;AACvC,QAAIG,IAAqB;AACzB,QAAIG,aAAiBG;AACnB,MAAAN,IAAIU,GAAS,gBAAgBP,EAAM,SAAS,QAAQO,EAAQ,aAAa,IAAIP,EAAM;AAAA,aAC1EA,aAAiB;AAC1B,MAAAH,IAAIS,EAAS,WAAWN,GAAO,EAAE,MAAAQ,GAAY;AAAA,aACpC,OAAOR,KAAU;AAC1B,MAAAH,IAAI,OAAO,SAASG,CAAK,IAAIM,EAAS,WAAWN,GAAO,EAAE,MAAAQ,EAAA,CAAY,IAAI;AAAA,SACrE;AACL,YAAMC,IAASF,GAAS,UAAUZ,GAC5Be,IAAUH,GAAS,cAAc,CAACA,EAAQ,WAAW,EAAE,KAAA,IAAS,CAAA;AACtE,iBAAWI,KAAUD,GAAS;AAC5B,cAAME,IAASN,EAAS,WAAWN,GAAOW,GAAQ;AAAA,UAChD,MAAAH;AAAA,UACA,QAAAC;AAAA,QAAA,CACD;AAED,YADAb,EAAWgB,CAAM,GACbA,EAAO,SAAS;AAClB,UAAAf,IAAIe;AACJ;AAAA,QACF;AAAA,MACF;AACA,MAAIf,KAAK,SACPA,IAAIS,EAAS,QAAQN,GAAO,EAAE,MAAAQ,GAAY;AAAA,IAE9C;AAKA,WAJIX,KAAK,SAGTD,EAAWC,CAAC,GACR,CAACA,EAAE,WACE,QAELU,GAAS,aACXV,IAAIA,EAAE,KAAKU,EAAQ,QAAQ,IAEzBA,GAAS,YACXV,IAAIA,EAAE,QAAQU,EAAQ,OAAO,IAE3BA,GAAS,UACXV,IAAIA,EAAE,MAAMU,EAAQ,KAAK,IAEpB,IAAIJ,EAAcN,CAAC;AAAA,EAC5B;AAAA;AAAA,EAGA,IAAW,OAAe;AACxB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,QAAgB;AACzB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,MAAc;AACvB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,OAAe;AACxB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,SAAiB;AAC1B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,SAAiB;AAC1B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,cAAsB;AAC/B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,UAAkB;AAC3B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,cAAsB;AAC/B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,UAAmB;AAC5B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAW,WAAmB;AAC5B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,KAAKgB,GAAmC;AAC7C,WAAO,IAAIV,EAAc,KAAK,SAAS,KAAKU,CAAQ,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,MAAMA,GAAmC;AAC9C,WAAO,IAAIV,EAAc,KAAK,SAAS,MAAMU,CAAQ,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,QAAQC,GAA+B;AAC5C,WAAO,IAAIX,EAAc,KAAK,SAAS,QAAQW,CAAI,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,MAAMA,GAA+B;AAC1C,WAAO,IAAIX,EAAc,KAAK,SAAS,MAAMW,CAAI,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,IAAIC,GAA4C;AACrD,IAAAjB,EAAY,SAASiB,EAAO,OAAO,GAAG,EAAE,GACxCjB,EAAY,QAAQiB,EAAO,MAAM,GAAG,EAAE,GACtCjB,EAAY,UAAUiB,EAAO,QAAQ,GAAG,EAAE,GAC1CjB,EAAY,UAAUiB,EAAO,QAAQ,GAAG,EAAE,GAC1CjB,EAAY,eAAeiB,EAAO,aAAa,GAAG,GAAG;AAErD,UAAMC,IAAc,KAAK,SAAS,IAAI;AAAA,MACpC,MAAMD,EAAO,QAAQ,KAAK;AAAA,MAC1B,OAAOA,EAAO,SAAS,KAAK;AAAA,MAC5B,KAAK;AAAA,IAAA,CACN,EAAE;AACH,WAAAjB,EAAY,OAAOiB,EAAO,KAAK,GAAGC,CAAW,GACtC,IAAIb,EAAc,KAAK,SAAS,IAAIY,CAAM,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,QAAQV,GAAiC;AAC9C,UAAMR,IAAI,KAAK,SAAS,QAAQQ,CAAQ;AACxC,WAAAT,EAAWC,CAAC,GACL,IAAIM,EAAcN,CAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,KAAKoB,GAAsBH,GAAwB;AAExD,UAAMI,IAAWJ,EAAK,MAAM,GAAG,EAAE,GAC3BK,IAASF,EAAM,SAAS,QAAQ,KAAK,SAAS,IAAI;AACxD,WAAO,KAAK,SAAS,QAAQC,CAAQ,EAAE,KAAKC,EAAO,QAAQD,CAAQ,GAAGJ,CAAI,EAAE,IAAIA,CAAI;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,UAAUG,GAAkC;AACjD,WAAO,KAAK,KAAK,KAAK,aAAaA,EAAM,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,GAAGA,GAA+B;AACvC,WAAO,KAAK,UAAUA,CAAK,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,GAAGA,GAA+B;AACvC,WAAO,KAAK,UAAUA,CAAK,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IAAIA,GAA+B;AACxC,WAAO,KAAK,UAAUA,CAAK,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,GAAGA,GAA+B;AACvC,WAAO,IAAI,KAAK,UAAUA,CAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IAAIA,GAA+B;AACxC,WAAO,KAAK,KAAK,UAAUA,CAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,OAAOG,GAAsBb,GAA8C;AAChF,WAAO,KAAK,SAAS,SAASa,GAAc,EAAE,QAAQb,GAAS,UAAUZ,GAAgB;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAgB;AACrB,WAAO,KAAK,SAAS,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,SAAe;AACpB,WAAO,KAAK,SAAS,SAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAmB;AACxB,WAAO,KAAK,SAAS,SAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAmB;AACxB,WAAO,KAAK,MAAA;AAAA,EACd;AACF;"}
|