From abcf7f40c14139ae90630600491457a5eaaf34f9 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Tue, 6 Feb 2024 06:25:19 +0100 Subject: [PATCH 01/63] feat: add support for nth-weekday (#35) closes #43 BREAKING CHANGE: `byWeekday` and `setByWeekday` now have new input and output contracts --- __test__/monthly.spec.ts | 31 ++++++++++++++++ __test__/parsing.spec.ts | 6 ++-- index.d.ts | 14 ++++++-- src/lib.rs | 78 +++++++++++++++++++++++++++------------- 4 files changed, 99 insertions(+), 30 deletions(-) diff --git a/__test__/monthly.spec.ts b/__test__/monthly.spec.ts index 9d0c697..8d626d4 100644 --- a/__test__/monthly.spec.ts +++ b/__test__/monthly.spec.ts @@ -214,3 +214,34 @@ test('Every Tuesday, every other month, limit 18', () => { ]); expect(iteratorDates).toEqual(dates); }); + +test('Monthly on the second to last Monday of the month for 6 months', () => { + const rrule = new RRule(Frequency.Monthly) + .setByWeekday([{ weekday: Weekday.Monday, n: -2 }]) + .setCount(6); + const set = new RRuleSet( + new Date('1997-09-22T09:00:00-04:00').getTime(), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(8); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970922T090000\nFREQ=monthly;COUNT=6;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-2MO', + ); + expect(dates.map((d) => new Date(d).toISOString())).toEqual([ + '1997-09-22T13:00:00.000Z', + '1997-10-20T13:00:00.000Z', + '1997-11-17T14:00:00.000Z', + '1997-12-22T14:00:00.000Z', + '1998-01-19T14:00:00.000Z', + '1998-02-16T14:00:00.000Z', + ]); +}); + +test('Errors on invalid by-weekday', () => { + expect(() => + new RRule(Frequency.Monthly).setByWeekday(['invalid' as any]), + ).toThrowError('Value is non of these types `JsNWeekday`, `JsWeekday`'); +}); diff --git a/__test__/parsing.spec.ts b/__test__/parsing.spec.ts index bf98475..e2eaea3 100644 --- a/__test__/parsing.spec.ts +++ b/__test__/parsing.spec.ts @@ -97,9 +97,9 @@ test('Should properly parse weekly individual recurrence rule', () => { expect(rule.until).toBe(new Date('1997-12-24T00:00:00Z').getTime()); expect(rule.weekstart).toBe(Weekday.Sunday); expect(rule.byWeekday).toEqual([ - Weekday.Monday, - Weekday.Wednesday, - Weekday.Friday, + { weekday: Weekday.Monday }, + { weekday: Weekday.Wednesday }, + { weekday: Weekday.Friday }, ]); const asString = rule.toString(); diff --git a/index.d.ts b/index.d.ts index 8cb0407..64d9cd0 100644 --- a/index.d.ts +++ b/index.d.ts @@ -21,6 +21,16 @@ export const enum Weekday { Saturday = 5, Sunday = 6 } +export interface NWeekday { + /** + * If set, this represents the nth occurrence of the weekday. + * Otherwise it represents every occurrence of the weekday. + * + * A negative value represents nth occurrence from the end. + */ + n?: number + weekday: Weekday +} export const enum Month { January = 0, February = 1, @@ -42,7 +52,7 @@ export class RRule { get frequency(): Frequency get interval(): number get count(): number | null - get byWeekday(): Weekday[] + get byWeekday(): NWeekday[] get byHour(): Array get byMinute(): Array get bySecond(): Array @@ -56,7 +66,7 @@ export class RRule { toString(): string setInterval(interval: number): this setCount(count: number): this - setByWeekday(weekdays: ReadonlyArray): this + setByWeekday(weekdays: readonly Array): this setByHour(hours: ReadonlyArray): this setByMinute(minutes: ReadonlyArray): this setBySecond(seconds: ReadonlyArray): this diff --git a/src/lib.rs b/src/lib.rs index 28d19e5..ee2f5fa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,6 +30,40 @@ pub enum JsWeekday { Sunday, } +#[napi(object, js_name = "NWeekday")] +pub struct JsNWeekday { + /// If set, this represents the nth occurrence of the weekday. + /// Otherwise it represents every occurrence of the weekday. + /// + /// A negative value represents nth occurrence from the end. + pub n: Option, + pub weekday: JsWeekday, +} + +impl From for JsNWeekday { + fn from(nday: NWeekday) -> Self { + match nday { + NWeekday::Every(weekday) => JsNWeekday { + n: None, + weekday: map_rust_weekday(weekday), + }, + NWeekday::Nth(n, weekday) => JsNWeekday { + n: Some(n), + weekday: map_rust_weekday(weekday), + }, + } + } +} + +impl Into for JsNWeekday { + fn into(self) -> NWeekday { + match self.n { + Some(n) => NWeekday::Nth(n, map_js_weekday(self.weekday)), + None => NWeekday::Every(map_js_weekday(self.weekday)), + } + } +} + #[napi(js_name = "Month")] pub enum JsMonth { January, @@ -114,21 +148,14 @@ impl JsRRule { Ok(self.rrule.get_count()) } - #[napi(getter, ts_return_type = "Weekday[]")] - pub fn by_weekday(&self, env: Env) -> napi::Result { - let ndays = self.rrule.get_by_weekday(); - let mut arr = env.create_array(0)?; - - for nday in ndays.iter() { - let day = match nday { - NWeekday::Every(day) => *day, - _ => panic!("Unsupported"), - }; - - arr.insert(map_rust_weekday(day))?; - } - - Ok(arr) + #[napi(getter, ts_return_type = "NWeekday[]")] + pub fn by_weekday(&self) -> Vec { + return self + .rrule + .get_by_weekday() + .iter() + .map(|nday| JsNWeekday::from(*nday)) + .collect(); } #[napi(getter)] @@ -213,18 +240,19 @@ impl JsRRule { #[napi] pub fn set_by_weekday( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] weekdays: Array, + #[napi(ts_arg_type = "readonly Array")] weekdays: Vec< + Either, + >, ) -> napi::Result<&Self> { - let mut vec: Vec = Vec::new(); - - for i in 0..weekdays.len() { - let day: JsWeekday = weekdays.get(i).unwrap().unwrap(); - let day = NWeekday::Every(map_js_weekday(day)); - - vec.push(day); - } + let by_weekday = weekdays + .into_iter() + .map(|weekday| match weekday { + Either::A(nday) => nday.into(), + Either::B(weekday) => NWeekday::Every(map_js_weekday(weekday)), + }) + .collect(); - replace_with_or_abort(&mut self.rrule, |self_| self_.by_weekday(vec)); + replace_with_or_abort(&mut self.rrule, |self_| self_.by_weekday(by_weekday)); Ok(self) } From 00a3c747143595972beefac2c37279e5bc5264e2 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Sun, 10 Mar 2024 17:55:00 +0100 Subject: [PATCH 02/63] feat: add custom date wrapper (#68) fixes #45 --- Cargo.toml | 4 +- __test__/daily.spec.ts | 88 +++++++---- __test__/monthly.spec.ts | 103 ++++++++----- __test__/parsing.spec.ts | 4 +- __test__/weekly.spec.ts | 42 ++++-- __test__/yearly.spec.ts | 76 ++++++---- benchmark/index.ts | 10 +- index.d.ts | 48 ++++-- index.js | 4 +- src/lib.rs | 313 +++++++++++++++++++++++++++++---------- 10 files changed, 478 insertions(+), 214 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c011710..b081e80 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,8 +8,8 @@ crate-type = ["cdylib"] [dependencies] chrono = "0.4.24" -# Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix -napi = { version = "2.11.1", default-features = false, features = ["napi4"] } +# Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix +napi = { version = "2.11.1", default-features = false, features = ["napi5"] } napi-derive = "2.11.0" replace_with = "0.1.7" rrule = { version = "0.11.0", features = ["exrule"] } diff --git a/__test__/daily.spec.ts b/__test__/daily.spec.ts index 81730c3..9ccacf4 100644 --- a/__test__/daily.spec.ts +++ b/__test__/daily.spec.ts @@ -1,11 +1,13 @@ -import { RRule, RRuleSet, Frequency, Month, Weekday } from '../'; +import { RRule, RRuleDateTime, RRuleSet, Frequency, Month, Weekday } from '../'; test('Daily for 10 occurrences', () => { const rrule = new RRule(Frequency.Daily).setCount(10); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); const asString = set.toString(); expect(asString).toBe( @@ -20,9 +22,17 @@ test('Daily for 10 occurrences', () => { test('Daily for 10 occurrences between 873550800000 and 873723600000 inclusively', () => { const rrule = new RRule(Frequency.Daily).setCount(10); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); - - const dates = set.between(873550800000, 873723600000, true); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); + + const dates = set + .between( + new RRuleDateTime(873550800000), + new RRuleDateTime(873723600000), + true, + ) + .map((d) => d.timestamp); const asString = set.toString(); expect(asString).toBe( @@ -33,9 +43,17 @@ test('Daily for 10 occurrences between 873550800000 and 873723600000 inclusively test('Daily for 10 occurrences between 873550800000 and 873723600000 exclusively', () => { const rrule = new RRule(Frequency.Daily).setCount(10); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); - - const dates = set.between(873550800000, 873723600000, false); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); + + const dates = set + .between( + new RRuleDateTime(873550800000), + new RRuleDateTime(873723600000), + false, + ) + .map((d) => d.timestamp); const asString = set.toString(); expect(asString).toBe( @@ -45,11 +63,15 @@ test('Daily for 10 occurrences between 873550800000 and 873723600000 exclusively }); test('Daily until September 7, 1997', () => { - const rrule = new RRule(Frequency.Daily).setUntil(873590400000); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const rrule = new RRule(Frequency.Daily).setUntil( + new RRuleDateTime(873590400000, 'UTC'), + ); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); const asString = set.toString(); expect(asString).toBe( @@ -63,10 +85,12 @@ test('Daily until September 7, 1997', () => { test('Every other day', () => { const rrule = new RRule(Frequency.Daily).setCount(6).setInterval(2); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); const asString = set.toString(); expect(asString).toBe( @@ -81,10 +105,12 @@ test('Every other day', () => { test('Every 10 days, 5 occurrences', () => { const rrule = new RRule(Frequency.Daily).setCount(5).setInterval(10); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); const asString = set.toString(); expect(asString).toBe( @@ -100,12 +126,14 @@ test('Every Monday in January, for 3 years', () => { const rrule = new RRule(Frequency.Daily) .setByMonth([Month.January]) .setByWeekday([Weekday.Monday]) - .setUntil(949327200000); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + .setUntil(new RRuleDateTime(949327200000, 'UTC')); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', @@ -122,13 +150,13 @@ test('Every Monday in January, for 3 years except Jan 31 2000', () => { const rrule = new RRule(Frequency.Daily) .setByMonth([Month.January]) .setByWeekday([Weekday.Monday]) - .setUntil(949327200000); - const set = new RRuleSet(873205200000, 'US/Eastern') + .setUntil(new RRuleDateTime(949327200000, 'UTC')); + const set = new RRuleSet(new RRuleDateTime(873205200000, 'US/Eastern')) .addRrule(rrule) - .addExdate(949327200000); + .addExdate(new RRuleDateTime(949327200000)); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(dates).toEqual([ 884008800000, 884613600000, 885218400000, 885823200000, 915458400000, 916063200000, 916668000000, 917272800000, 946908000000, 947512800000, @@ -139,5 +167,5 @@ test('Every Monday in January, for 3 years except Jan 31 2000', () => { 'FREQ=daily;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ]); expect(set.getExrules().map((r) => r.toString())).toEqual([]); - expect(set.getExdates()).toEqual([949327200000]); + expect(set.getExdates().map((d) => d.timestamp)).toEqual([949327200000]); }); diff --git a/__test__/monthly.spec.ts b/__test__/monthly.spec.ts index 8d626d4..f054f33 100644 --- a/__test__/monthly.spec.ts +++ b/__test__/monthly.spec.ts @@ -1,4 +1,4 @@ -import { RRule, RRuleSet, Frequency, Weekday } from '../'; +import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../'; import { takeN } from './utils'; test('Monthly on the 1st Friday for ten occurrences', () => { @@ -6,11 +6,13 @@ test('Monthly on the 1st Friday for ten occurrences', () => { .setCount(10) .setByWeekday([Weekday.Friday]) .setBySetpos([1]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', @@ -24,14 +26,16 @@ test('Monthly on the 1st Friday for ten occurrences', () => { test('Monthly on the 1st Friday until December 24, 1997', () => { const rrule = new RRule(Frequency.Monthly) - .setUntil(882921600000) + .setUntil(new RRuleDateTime(882921600000, 'UTC')) .setByWeekday([Weekday.Friday]) .setBySetpos([1]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;UNTIL=19971224T000000Z;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', @@ -48,11 +52,13 @@ test('Every other month on the 1st and last Sunday of the month for 10 occurrenc .setCount(10) .setByWeekday([Weekday.Sunday, Weekday.Sunday]) .setBySetpos([1, -1]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;INTERVAL=2;BYSETPOS=-1,1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=SU', @@ -69,11 +75,13 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { .setCount(6) .setByWeekday([Weekday.Monday]) .setBySetpos([-2]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=6;BYSETPOS=-2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', @@ -87,11 +95,15 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { test('Monthly on the third to the last day of the month, limit 6', () => { const rrule = new RRule(Frequency.Monthly).setByMonthday([-3]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(6); - const iteratorDates = Array.from(takeN(set.occurrences(), 6)); + const dates = set.all(6).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 6)).map( + (d) => d.timestamp, + ); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;BYHOUR=9;BYMINUTE=0;BYSECOND=0', @@ -107,11 +119,13 @@ test('Monthly on the 2nd and 15th of the month for 10 occurrences', () => { const rrule = new RRule(Frequency.Monthly) .setCount(10) .setByMonthday([2, 15]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;BYMONTHDAY=2,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', @@ -127,11 +141,13 @@ test('Monthly on the first and last day of the month for 10 occurrences', () => const rrule = new RRule(Frequency.Monthly) .setCount(10) .setByMonthday([1, -1]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;BYMONTHDAY=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0', @@ -148,11 +164,13 @@ test('Every 18 months on the 10th thru 15th of the month for 10 occurrences', () .setCount(10) .setInterval(18) .setByMonthday([10, 11, 12, 13, 14, 15]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', @@ -166,20 +184,22 @@ test('Every 18 months on the 10th thru 15th of the month for 10 occurrences', () test('Monthly 5 times with two rdates and one exdate', () => { const rrule = new RRule(Frequency.Monthly).setCount(5); - const set = new RRuleSet(new Date('2012-02-01T02:30:00Z').getTime(), 'UTC') + const set = new RRuleSet( + new RRuleDateTime(new Date('2012-02-01T02:30:00Z'), 'UTC'), + ) .addRrule(rrule) - .addRdate(new Date('2012-07-01T02:30:00Z').getTime()) - .addRdate(new Date('2012-07-02T02:30:00Z').getTime()) - .addExdate(new Date('2012-06-01T02:30:00Z').getTime()); + .addRdate(new Date('2012-07-01T02:30:00Z')) + .addRdate(new Date('2012-07-02T02:30:00Z')) + .addExdate(new Date('2012-06-01T02:30:00Z')); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); - expect(set.getRdates().map((d) => new Date(d).toISOString())).toEqual([ + expect(set.getRdates().map((d) => d.toDate().toISOString())).toEqual([ '2012-07-01T02:30:00.000Z', '2012-07-02T02:30:00.000Z', ]); - expect(set.getExdates().map((d) => new Date(d).toISOString())).toEqual([ + expect(set.getExdates().map((d) => d.toDate().toISOString())).toEqual([ '2012-06-01T02:30:00.000Z', ]); expect(dates.map((d) => new Date(d).toISOString())).toEqual([ @@ -197,11 +217,15 @@ test('Every Tuesday, every other month, limit 18', () => { const rrule = new RRule(Frequency.Monthly) .setInterval(2) .setByWeekday([Weekday.Tuesday]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(18); - const iteratorDates = Array.from(takeN(set.occurrences(), 18)); + const dates = set.all(18).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 18)).map( + (d) => d.timestamp, + ); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', @@ -220,12 +244,11 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { .setByWeekday([{ weekday: Weekday.Monday, n: -2 }]) .setCount(6); const set = new RRuleSet( - new Date('1997-09-22T09:00:00-04:00').getTime(), - 'US/Eastern', + new RRuleDateTime(new Date('1997-09-22T09:00:00-04:00'), 'US/Eastern'), ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(8); + const dates = set.all(8).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970922T090000\nFREQ=monthly;COUNT=6;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-2MO', diff --git a/__test__/parsing.spec.ts b/__test__/parsing.spec.ts index e2eaea3..ed5a490 100644 --- a/__test__/parsing.spec.ts +++ b/__test__/parsing.spec.ts @@ -94,7 +94,9 @@ test('Should properly parse weekly individual recurrence rule', () => { ); expect(rule.frequency).toBe(Frequency.Weekly); expect(rule.interval).toBe(2); - expect(rule.until).toBe(new Date('1997-12-24T00:00:00Z').getTime()); + expect(rule.until?.timestamp).toBe( + new Date('1997-12-24T00:00:00Z').getTime(), + ); expect(rule.weekstart).toBe(Weekday.Sunday); expect(rule.byWeekday).toEqual([ { weekday: Weekday.Monday }, diff --git a/__test__/weekly.spec.ts b/__test__/weekly.spec.ts index fe8ccb1..e89aa34 100644 --- a/__test__/weekly.spec.ts +++ b/__test__/weekly.spec.ts @@ -1,13 +1,15 @@ -import { RRule, RRuleSet, Frequency, Weekday } from '../'; +import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../'; import { takeN } from './utils'; test('Weekly for 10 occurrences', () => { const rrule = new RRule(Frequency.Weekly).setCount(10); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', @@ -20,12 +22,16 @@ test('Weekly for 10 occurrences', () => { }); test('Weekly until December 24, 1997', () => { - const rrule = new RRule(Frequency.Weekly).setUntil(882921600000); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const rrule = new RRule(Frequency.Weekly).setUntil( + new RRuleDateTime(882921600000, 'UTC'), + ); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;UNTIL=19971224T000000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', @@ -43,11 +49,15 @@ test('Every other week - limit 10', () => { const rrule = new RRule(Frequency.Weekly) .setInterval(2) .setWeekstart(Weekday.Sunday); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(10); - const iteratorDates = Array.from(takeN(set.occurrences(), 10)); + const dates = set.all(10).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 10)).map( + (d) => d.timestamp, + ); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', @@ -62,14 +72,16 @@ test('Every other week - limit 10', () => { test('Every other week on Monday, Wednesday and Friday until December 24, 1997, but starting on Tuesday, September 2, 1997', () => { const rrule = new RRule(Frequency.Weekly) .setInterval(2) - .setUntil(882921600000) + .setUntil(new RRuleDateTime(882921600000, 'UTC')) .setWeekstart(Weekday.Sunday) .setByWeekday([Weekday.Monday, Weekday.Wednesday, Weekday.Friday]); - const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(873205200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', diff --git a/__test__/yearly.spec.ts b/__test__/yearly.spec.ts index 56642e7..e5b2a59 100644 --- a/__test__/yearly.spec.ts +++ b/__test__/yearly.spec.ts @@ -1,15 +1,17 @@ -import { RRule, RRuleSet, Frequency, Month, Weekday } from '../'; +import { RRule, RRuleDateTime, RRuleSet, Frequency, Month, Weekday } from '../'; import { takeN } from './utils'; test('Yearly in June and July for 10 occurrences', () => { const rrule = new RRule(Frequency.Yearly) .setCount(10) .setByMonth([Month.June, Month.July]); - const set = new RRuleSet(865947600000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(865947600000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970610T090000\nFREQ=yearly;COUNT=10;BYMONTH=6,7;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', @@ -26,11 +28,13 @@ test('Every other year on January, February, and March for 10 occurrences', () = .setInterval(2) .setCount(10) .setByMonth([Month.January, Month.February, Month.March]); - const set = new RRuleSet(858002400000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(858002400000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970310T090000\nFREQ=yearly;COUNT=10;INTERVAL=2;BYMONTH=1,2,3;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', @@ -47,11 +51,13 @@ test('Every 3rd year on the 1st, 100th and 200th day for 10 occurrences', () => .setCount(10) .setInterval(3) .setByYearday([1, 100, 200]); - const set = new RRuleSet(852127200000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(852127200000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(); - const iteratorDates = Array.from(set.occurrences()); + const dates = set.all().map((d) => d.timestamp); + const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970101T090000\nFREQ=yearly;COUNT=10;INTERVAL=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYYEARDAY=1,100,200', @@ -67,11 +73,15 @@ test('Every 20th Monday of the year, limit 3', () => { const rrule = new RRule(Frequency.Yearly) .setByWeekday([Weekday.Monday]) .setBySetpos([20]); - const set = new RRuleSet(863442000000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(863442000000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(3); - const iteratorDates = Array.from(takeN(set.occurrences(), 3)); + const dates = set.all(3).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 3)).map( + (d) => d.timestamp, + ); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970512T090000\nFREQ=yearly;BYSETPOS=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', @@ -85,11 +95,15 @@ test('Monday of week number 20 (where the default start of the week is Monday), .setWeekstart(Weekday.Monday) .setByWeekday([Weekday.Monday]) .setByWeekno([20]); - const set = new RRuleSet(863442000000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(863442000000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(3); - const iteratorDates = Array.from(takeN(set.occurrences(), 3)); + const dates = set.all(3).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 3)).map( + (d) => d.timestamp, + ); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970512T090000\nFREQ=yearly;BYWEEKNO=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', @@ -102,11 +116,15 @@ test('Every Thursday in March, limit 11', () => { const rrule = new RRule(Frequency.Yearly) .setByMonth([Month.March]) .setByWeekday([Weekday.Thursday]); - const set = new RRuleSet(858261600000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(858261600000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(11); - const iteratorDates = Array.from(takeN(set.occurrences(), 11)); + const dates = set.all(11).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 11)).map( + (d) => d.timestamp, + ); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970313T090000\nFREQ=yearly;BYMONTH=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TH', @@ -123,13 +141,15 @@ test('Every Friday the 13th, limit 5', () => { const rrule = new RRule(Frequency.Yearly) .setByWeekday([Weekday.Friday]) .setByMonthday([13]); - const set = new RRuleSet(873205200000, 'US/Eastern') - .addExdate(889797600000) + const set = new RRuleSet(new RRuleDateTime(873205200000, 'US/Eastern')) + .addExdate(new RRuleDateTime(889797600000)) .addRrule(rrule); const asString = set.toString(); - const dates = set.all(5); - const iteratorDates = Array.from(takeN(set.occurrences(), 5)); + const dates = set.all(5).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 5)).map( + (d) => d.timestamp, + ); // TODO: rrule crate doesn't add exdate to string output, create a bug report expect(asString).toBe( @@ -147,11 +167,15 @@ test('Every four years, the first Tuesday after a Monday in November, forever (U .setByMonth([Month.November]) .setByWeekday([Weekday.Tuesday]) .setByMonthday([2, 3, 4, 5, 6, 7, 8]); - const set = new RRuleSet(847202400000, 'US/Eastern').addRrule(rrule); + const set = new RRuleSet( + new RRuleDateTime(847202400000, 'US/Eastern'), + ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(3); - const iteratorDates = Array.from(takeN(set.occurrences(), 3)); + const dates = set.all(3).map((d) => d.timestamp); + const iteratorDates = Array.from(takeN(set.occurrences(), 3)).map( + (d) => d.timestamp, + ); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19961105T090000\nFREQ=yearly;INTERVAL=4;BYMONTH=11;BYMONTHDAY=2,3,4,5,6,7,8;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', diff --git a/benchmark/index.ts b/benchmark/index.ts index 52a59d0..31ddfc5 100644 --- a/benchmark/index.ts +++ b/benchmark/index.ts @@ -8,7 +8,9 @@ b.suite( const rrule = new rust.RRule(rust.Frequency.Daily) .setCount(30) .setInterval(1); - const set = new rust.RRuleSet(1679428740000, 'UTC').addRrule(rrule); + const set = new rust.RRuleSet( + new rust.RRuleDateTime(new Date(1679428740000), 'UTC'), + ).addRrule(rrule); set.all(); }), @@ -34,9 +36,9 @@ b.suite( const rrule = new rust.RRule(rust.Frequency.Daily) .setCount(30) .setInterval(1); - const set = new rust.RRuleSet(1679428740000, 'Pacific/Kiritimati').addRrule( - rrule, - ); + const set = new rust.RRuleSet( + new rust.RRuleDateTime(new Date(1679428740000), 'Pacific/Kiritimati'), + ).addRrule(rrule); set.all(); }), diff --git a/index.d.ts b/index.d.ts index 64d9cd0..1427c86 100644 --- a/index.d.ts +++ b/index.d.ts @@ -45,6 +45,29 @@ export const enum Month { November = 10, December = 11 } +export class RRuleTimezone { + constructor(tz: string) + /** + * The name of the timezone. If the timezone is local, it will return "Local". + */ + get name(): string + get isLocal(): boolean +} +export class RRuleDateTime { + constructor(date: Date | number, timezone?: string | undefined | null) + get timestamp(): number + get timezone(): RRuleTimezone + get day(): number + get month(): number + get year(): number + get hour(): number + get minute(): number + get second(): number + get millisecond(): number + get toString(): string + toDate(): Date + toUtcDate(): Date +} export type JsRRule = RRule export class RRule { constructor(frequency: Frequency) @@ -62,11 +85,11 @@ export class RRule { get byWeekno(): Array get byYearday(): Array get weekstart(): Weekday - get until(): number | null + get until(): RRuleDateTime | null toString(): string setInterval(interval: number): this setCount(count: number): this - setByWeekday(weekdays: readonly Array): this + setByWeekday(weekdays: ReadonlyArray): this setByHour(hours: ReadonlyArray): this setByMinute(minutes: ReadonlyArray): this setBySecond(seconds: ReadonlyArray): this @@ -76,27 +99,26 @@ export class RRule { setByWeekno(weekNumbers: ReadonlyArray): this setByYearday(days: ReadonlyArray): this setWeekstart(day: Weekday): this - setUntil(timestamp: number): this + setUntil(dateTime: RRuleDateTime | Date): this } export type JsRRuleSet = RRuleSet export class RRuleSet { - constructor(dtstart: number, tzid: string) + constructor(dtstart: RRuleDateTime | Date) static parse(str: string): RRuleSet toString(): string addRrule(jsRrule: RRule): this addExrule(jsRrule: RRule): this - addExdate(timestamp: number): this - addRdate(timestamp: number): this - get dtstart(): number - get tzid(): string + addExdate(dateTime: RRuleDateTime | Date): this + addRdate(dateTime: RRuleDateTime | Date): this + get dtstart(): RRuleDateTime getRrules(): Array getExrules(): Array - getExdates(): Array - getRdates(): Array - all(limit?: number | undefined | null): number[] - between(after: number, before: number, inclusive?: boolean | undefined | null): number[] + getExdates(): Array + getRdates(): Array + all(limit?: number | undefined | null): Array + between(after: RRuleDateTime | Date, before: RRuleDateTime | Date, inclusive?: boolean | undefined | null): Array occurrences(): Occurrences } export class Occurrences { - [Symbol.iterator](): Iterator + [Symbol.iterator](): Iterator } diff --git a/index.js b/index.js index a528240..9e28474 100644 --- a/index.js +++ b/index.js @@ -252,11 +252,13 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { Frequency, Weekday, Month, RRule, RRuleSet, Occurrences } = nativeBinding +const { Frequency, Weekday, Month, RRuleTimezone, RRuleDateTime, RRule, RRuleSet, Occurrences } = nativeBinding module.exports.Frequency = Frequency module.exports.Weekday = Weekday module.exports.Month = Month +module.exports.RRuleTimezone = RRuleTimezone +module.exports.RRuleDateTime = RRuleDateTime module.exports.RRule = RRule module.exports.RRuleSet = RRuleSet module.exports.Occurrences = Occurrences diff --git a/src/lib.rs b/src/lib.rs index ee2f5fa..604df42 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ #![deny(clippy::all)] -use chrono::{DateTime, Month, TimeZone, Weekday}; +use chrono::{DateTime, Datelike, Month, TimeZone, Timelike, Weekday}; use napi::bindgen_prelude::*; use replace_with::replace_with_or_abort; use rrule::{Frequency, NWeekday, RRule, RRuleSet, Tz, Unvalidated}; @@ -110,6 +110,155 @@ fn to_unvalidated(rrule: &RRule) -> RRule { unvalidated } +#[napi(js_name = "RRuleTimezone")] +pub struct RRuleTimezone { + tz: Tz, +} + +#[napi] +impl RRuleTimezone { + #[napi(constructor)] + pub fn new(tz: String) -> napi::Result { + let tz = map_js_tz(&tz)?; + + Ok(RRuleTimezone::new_with_tz(tz)) + } + + pub fn new_with_tz(tz: Tz) -> Self { + RRuleTimezone { tz } + } + + /** + * The name of the timezone. If the timezone is local, it will return "Local". + */ + #[napi(getter)] + pub fn name(&self) -> String { + self.tz.name().to_string() + } + + #[napi(getter)] + pub fn is_local(&self) -> bool { + self.tz.is_local() + } +} + +#[napi(js_name = "RRuleDateTime")] +pub struct RRuleDateTime { + date_time: DateTime, +} + +#[napi] +impl RRuleDateTime { + #[napi(constructor)] + pub fn new_with_js_date( + date: napi::Either, + timezone: Option, + ) -> napi::Result { + let timestamp = match date { + Either::A(date) => date.value_of(), + Either::B(date) => Ok(date), + }?; + let mut date_time = Tz::LOCAL.timestamp_nanos((timestamp * 1_000_000f64) as i64); + if let Some(timezone) = timezone { + date_time = date_time.with_timezone(&map_js_tz(&timezone)?); + } + + Ok(RRuleDateTime::new_with_date_time(date_time)) + } + + pub fn new_with_date_time(date_time: DateTime) -> Self { + RRuleDateTime { date_time } + } + + #[napi(getter)] + pub fn timestamp(&self) -> i64 { + self.date_time.timestamp_millis() + } + + #[napi(getter)] + pub fn timezone(&self) -> RRuleTimezone { + RRuleTimezone::new_with_tz(self.date_time.timezone()) + } + + #[napi(getter)] + pub fn day(&self) -> u32 { + self.date_time.day() + } + + #[napi(getter)] + pub fn month(&self) -> u32 { + self.date_time.month() + } + + #[napi(getter)] + pub fn year(&self) -> i32 { + self.date_time.year() + } + + #[napi(getter)] + pub fn hour(&self) -> u32 { + self.date_time.hour() + } + + #[napi(getter)] + pub fn minute(&self) -> u32 { + self.date_time.minute() + } + + #[napi(getter)] + pub fn second(&self) -> u32 { + self.date_time.second() + } + + #[napi(getter)] + pub fn millisecond(&self) -> u32 { + let nanoseconds = self.date_time.nanosecond(); + nanoseconds / 1_000_000 + } + + #[napi(getter)] + pub fn to_string(&self) -> String { + self.date_time.to_string() + } + + #[napi(ts_return_type = "Date")] + pub fn to_date(&self, env: Env) -> napi::Result { + env.create_date(self.date_time.timestamp_millis() as f64) + } + + #[napi(ts_return_type = "Date")] + pub fn to_utc_date(&self, env: Env) -> napi::Result { + env.create_date(self.date_time.naive_utc().timestamp_millis() as f64) + } +} + +impl From> for RRuleDateTime { + fn from(date_time: DateTime) -> Self { + RRuleDateTime::new_with_date_time(date_time) + } +} + +impl Into> for RRuleDateTime { + fn into(self) -> DateTime { + self.date_time + } +} + +impl From for RRuleDateTime { + fn from(date: napi::JsDate) -> Self { + RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap() + } +} + +impl From> for RRuleDateTime { + fn from(date: napi::Either<&RRuleDateTime, napi::JsDate>) -> Self { + match date { + Either::A(date) => RRuleDateTime::new_with_date_time(date.date_time), + Either::B(date) => RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap(), + } + } +} + #[napi(js_name = "RRule")] pub struct JsRRule { rrule: RRule, @@ -211,9 +360,9 @@ impl JsRRule { } #[napi(getter)] - pub fn until(&self) -> napi::Result> { + pub fn until(&self) -> napi::Result> { Ok(match self.rrule.get_until() { - Some(until) => Some(until.timestamp_millis()), + Some(until) => Some(RRuleDateTime::new_with_date_time(until.clone())), None => None, }) } @@ -240,7 +389,7 @@ impl JsRRule { #[napi] pub fn set_by_weekday( &mut self, - #[napi(ts_arg_type = "readonly Array")] weekdays: Vec< + #[napi(ts_arg_type = "ReadonlyArray")] weekdays: Vec< Either, >, ) -> napi::Result<&Self> { @@ -355,10 +504,12 @@ impl JsRRule { } #[napi] - pub fn set_until(&mut self, timestamp: i64) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| { - self_.until(Tz::UTC.timestamp_millis_opt(timestamp).unwrap()) - }); + pub fn set_until( + &mut self, + date_time: napi::Either<&RRuleDateTime, napi::JsDate>, + ) -> napi::Result<&Self> { + let date_time = RRuleDateTime::from(date_time); + replace_with_or_abort(&mut self.rrule, |self_| self_.until(date_time.date_time)); Ok(self) } @@ -376,19 +527,16 @@ impl JsRRule { #[napi(js_name = "RRuleSet")] pub struct JsRRuleSet { - tz: Tz, rrule_set: RRuleSet, } #[napi] impl JsRRuleSet { #[napi(constructor)] - pub fn new(dtstart: i64, tzid: String) -> napi::Result { - let tz = map_js_tz(&tzid)?; - let date = timestamp_to_date_with_tz(dtstart, &tz); - let rrule_set = RRuleSet::new(date); + pub fn new(dtstart: napi::Either<&RRuleDateTime, napi::JsDate>) -> napi::Result { + let rrule_set = RRuleSet::new(RRuleDateTime::from(dtstart).date_time); - Ok(JsRRuleSet { rrule_set, tz }) + Ok(JsRRuleSet { rrule_set }) } #[napi(factory, ts_return_type = "RRuleSet")] @@ -396,10 +544,8 @@ impl JsRRuleSet { let rrule_set: RRuleSet = str .parse() .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - let dtstart = rrule_set.get_dt_start(); - let tz = dtstart.timezone(); - Ok(JsRRuleSet { rrule_set, tz }) + Ok(JsRRuleSet { rrule_set }) } #[napi] @@ -427,31 +573,32 @@ impl JsRRuleSet { } #[napi] - pub fn add_exdate(&mut self, timestamp: i64) -> napi::Result<&Self> { + pub fn add_exdate( + &mut self, + date_time: napi::Either<&RRuleDateTime, napi::JsDate>, + ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule_set, |self_| { - self_.exdate(timestamp_to_date_with_tz(timestamp, &self.tz)) + self_.exdate(RRuleDateTime::from(date_time).date_time) }); Ok(self) } #[napi] - pub fn add_rdate(&mut self, timestamp: i64) -> napi::Result<&Self> { + pub fn add_rdate( + &mut self, + date_time: napi::Either<&RRuleDateTime, napi::JsDate>, + ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule_set, |self_| { - self_.rdate(timestamp_to_date_with_tz(timestamp, &self.tz)) + self_.rdate(RRuleDateTime::from(date_time).date_time) }); Ok(self) } #[napi(getter)] - pub fn dtstart(&self) -> napi::Result { - Ok(self.rrule_set.get_dt_start().timestamp_millis()) - } - - #[napi(getter)] - pub fn tzid(&self) -> napi::Result { - Ok(String::from(self.tz.name())) + pub fn dtstart(&self) -> RRuleDateTime { + RRuleDateTime::new_with_date_time(self.rrule_set.get_dt_start().clone()) } #[napi] @@ -479,26 +626,31 @@ impl JsRRuleSet { } #[napi] - pub fn get_exdates(&self) -> Vec { + pub fn get_exdates(&self) -> Vec { return self .rrule_set .get_exdate() .iter() - .map(|date| date.timestamp_millis()) + .map(|date| RRuleDateTime::new_with_date_time(date.clone())) .collect(); } #[napi] - pub fn get_rdates(&self) -> Vec { + pub fn get_rdates(&self) -> Vec { return self .rrule_set .get_rdate() .iter() - .map(|date| date.timestamp_millis()) + .map(|date| RRuleDateTime::new_with_date_time(date.clone())) .collect(); } - fn is_after(&self, timestamp: i64, after_timestamp: i64, inclusive: Option) -> bool { + fn is_after( + &self, + timestamp: DateTime, + after_timestamp: DateTime, + inclusive: Option, + ) -> bool { let inclusive = inclusive.unwrap_or(false); if inclusive && timestamp < after_timestamp { @@ -510,7 +662,12 @@ impl JsRRuleSet { true } - fn is_before(&self, timestamp: i64, before_timestamp: i64, inclusive: Option) -> bool { + fn is_before( + &self, + timestamp: DateTime, + before_timestamp: DateTime, + inclusive: Option, + ) -> bool { let inclusive = inclusive.unwrap_or(false); if inclusive && timestamp > before_timestamp { @@ -522,51 +679,47 @@ impl JsRRuleSet { true } - #[napi(ts_return_type = "number[]")] - pub fn all(&self, env: Env, limit: Option) -> napi::Result { - let mut arr = env.create_array(0)?; - let mut left = match limit { - Some(number) => number, - None => 0, - }; - - for date in self.rrule_set.into_iter() { - if left > 0 { - left = left - 1; - } else if limit.is_some() { - break; - } - - let timestamp = date.timestamp_millis(); - arr.insert(timestamp)?; + #[napi] + pub fn all(&self, limit: Option) -> Vec { + let iter = self.rrule_set.into_iter(); + if let Some(limit) = limit { + return iter + .take(limit as usize) + .map(|date| RRuleDateTime::new_with_date_time(date)) + .collect(); + } else { + return iter + .map(|date| RRuleDateTime::new_with_date_time(date)) + .collect(); } - - Ok(arr) } - #[napi(ts_return_type = "number[]")] + #[napi] pub fn between( &self, - env: Env, - after: i64, - before: i64, + after: napi::Either<&RRuleDateTime, napi::JsDate>, + before: napi::Either<&RRuleDateTime, napi::JsDate>, inclusive: Option, - ) -> napi::Result { - let mut arr = env.create_array(0)?; - - for date in self.rrule_set.into_iter() { - let timestamp = date.timestamp_millis(); - let is_after = self.is_after(timestamp, after, inclusive); - let is_before = self.is_before(timestamp, before, inclusive); - - if is_after && is_before { - arr.insert(timestamp)?; - } else if !is_before { - break; - } - } - - Ok(arr) + ) -> napi::Result> { + let _after = RRuleDateTime::from(after).date_time; + let _before = RRuleDateTime::from(before).date_time; + return Ok( + self + .rrule_set + .into_iter() + .take_while(|date| { + let is_before = self.is_before(*date, _before, inclusive); + + is_before + }) + .filter(|date| { + let is_after = self.is_after(*date, _after, inclusive); + + is_after + }) + .map(|date| RRuleDateTime::new_with_date_time(date)) + .collect::>(), + ); } #[napi] @@ -666,13 +819,6 @@ fn map_js_tz(tz: &str) -> napi::Result { Ok(Tz::Tz(chrono_tz)) } -fn timestamp_to_date_with_tz(timestamp: i64, tz: &Tz) -> DateTime { - Tz::UTC - .timestamp_millis_opt(timestamp) - .unwrap() - .with_timezone(tz) -} - #[napi(iterator)] pub struct Occurrences { iter: SharedReference>, @@ -680,11 +826,14 @@ pub struct Occurrences { #[napi] impl Generator for Occurrences { - type Yield = i64; + type Yield = RRuleDateTime; type Next = (); type Return = (); fn next(&mut self, _next: Option) -> Option { - self.iter.next().map(|date| date.timestamp_millis()) + self + .iter + .next() + .map(|date| RRuleDateTime::new_with_date_time(date)) } } From a6521ecb4bd0689a2edc8731dac333007bbb692c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 10:35:56 +0700 Subject: [PATCH 03/63] chore(deps-dev): bump ts-node from 10.9.1 to 10.9.2 (#46) Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.9.1 to 10.9.2. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Changelog](https://github.com/TypeStrong/ts-node/blob/main/development-docs/release-template.md) - [Commits](https://github.com/TypeStrong/ts-node/compare/v10.9.1...v10.9.2) --- updated-dependencies: - dependency-name: ts-node dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 87aba69..8bd7c55 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1511,12 +1511,7 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -acorn@^8.9.0: +acorn@^8.4.1, acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -6411,9 +6406,9 @@ ts-jest@^29.0.5: yargs-parser "^21.0.1" ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" From 2e83b50e6da6d87a1e5f359caad92da56a0f651a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 10:36:22 +0700 Subject: [PATCH 04/63] chore(deps-dev): bump @napi-rs/cli from 2.15.1 to 2.18.0 (#58) Bumps [@napi-rs/cli](https://github.com/napi-rs/napi-rs) from 2.15.1 to 2.18.0. - [Release notes](https://github.com/napi-rs/napi-rs/releases) - [Commits](https://github.com/napi-rs/napi-rs/compare/@napi-rs/cli@2.15.1...@napi-rs/cli@2.18.0) --- updated-dependencies: - dependency-name: "@napi-rs/cli" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8bd7c55..469b0d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -779,9 +779,9 @@ "@jridgewell/sourcemap-codec" "^1.4.14" "@napi-rs/cli@^2.15.1": - version "2.15.1" - resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-2.15.1.tgz#0dec638ab3c1fcb9e596dc3b215632d0e3d89254" - integrity sha512-vlxm4zIjRMjhvk7+W+x2qIxi0JYOVeKd1YbDnhuQCAs5ckM/t3/ln+ASUN7msv3vgJmgHYJijBJH5+ZSKCws3w== + version "2.18.0" + resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-2.18.0.tgz#3064f142e65c87d14e6ddc38e5425aa29a8871eb" + integrity sha512-lfSRT7cs3iC4L+kv9suGYQEezn5Nii7Kpu+THsYVI0tA1Vh59LH45p4QADaD7hvIkmOz79eEGtoKQ9nAkAPkzA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" From 8b221298f0da83262b4a090b423c0b8175a7be4c Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Wed, 10 Apr 2024 06:48:40 +0200 Subject: [PATCH 05/63] chore: update rrule to 0.12.0 and track lock file (#81) --- .gitignore | 1 - Cargo.lock | 572 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 +- __test__/daily.spec.ts | 16 +- __test__/monthly.spec.ts | 20 +- __test__/parsing.spec.ts | 18 +- __test__/weekly.spec.ts | 8 +- __test__/yearly.spec.ts | 20 +- src/lib.rs | 2 +- 9 files changed, 619 insertions(+), 40 deletions(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index 5e2577b..13e0679 100644 --- a/.gitignore +++ b/.gitignore @@ -184,7 +184,6 @@ $RECYCLE.BIN/ #Added by cargo /target -Cargo.lock .pnp.* .yarn/* diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..1302ac9 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,572 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "bumpalo" +version = "3.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" + +[[package]] +name = "cc" +version = "1.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + +[[package]] +name = "chrono-tz" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e" +dependencies = [ + "chrono", + "chrono-tz-build", + "phf", +] + +[[package]] +name = "chrono-tz-build" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" +dependencies = [ + "parse-zoneinfo", + "phf", + "phf_codegen", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "ctor" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "napi" +version = "2.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ca998356d8ff9fba7a070dae4508a2298439c98c9f3bc9c07669538b999e8f" +dependencies = [ + "bitflags", + "ctor", + "napi-derive", + "napi-sys", + "once_cell", +] + +[[package]] +name = "napi-build" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9130fccc5f763cf2069b34a089a18f0d0883c66aceb81f2fad541a3d823c43" + +[[package]] +name = "napi-derive" +version = "2.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b138cecf1141ae0ff5d62f4aa0e2f269aec339f66070f346ba6fb4279f1fc178" +dependencies = [ + "cfg-if", + "convert_case", + "napi-derive-backend", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "napi-derive-backend" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5126b64f6ad9e28e30e6d15213dd378626b38f556454afebc42f7f02a90902" +dependencies = [ + "convert_case", + "once_cell", + "proc-macro2", + "quote", + "regex", + "semver", + "syn", +] + +[[package]] +name = "napi-sys" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2503fa6af34dc83fb74888df8b22afe933b58d37daf7d80424b1c60c68196b8b" +dependencies = [ + "libloading", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parse-zoneinfo" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +dependencies = [ + "regex", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "replace_with" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a8614ee435691de62bcffcf4a66d91b3594bf1428a5722e79103249a095690" + +[[package]] +name = "rrule" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa903a94a0360e2b693d30028605c10105c5a830e6fc39d489dd3cc4e05f1cac" +dependencies = [ + "chrono", + "chrono-tz", + "lazy_static", + "log", + "regex", + "thiserror", +] + +[[package]] +name = "rrule-rust" +version = "0.0.0" +dependencies = [ + "chrono", + "napi", + "napi-build", + "napi-derive", + "replace_with", + "rrule", +] + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "syn" +version = "2.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" diff --git a/Cargo.toml b/Cargo.toml index b081e80..6039e9a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ chrono = "0.4.24" napi = { version = "2.11.1", default-features = false, features = ["napi5"] } napi-derive = "2.11.0" replace_with = "0.1.7" -rrule = { version = "0.11.0", features = ["exrule"] } +rrule = { version = "0.12.0", features = ["exrule"] } [build-dependencies] napi-build = "2.0.1" diff --git a/__test__/daily.spec.ts b/__test__/daily.spec.ts index 9ccacf4..0b3d4c7 100644 --- a/__test__/daily.spec.ts +++ b/__test__/daily.spec.ts @@ -11,7 +11,7 @@ test('Daily for 10 occurrences', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 873205200000, 873291600000, 873378000000, 873464400000, 873550800000, @@ -36,7 +36,7 @@ test('Daily for 10 occurrences between 873550800000 and 873723600000 inclusively const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([873550800000, 873637200000, 873723600000]); }); @@ -57,7 +57,7 @@ test('Daily for 10 occurrences between 873550800000 and 873723600000 exclusively const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([873637200000]); }); @@ -75,7 +75,7 @@ test('Daily until September 7, 1997', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;UNTIL=19970907T000000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=19970907T000000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 873205200000, 873291600000, 873378000000, 873464400000, 873550800000, @@ -94,7 +94,7 @@ test('Every other day', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;COUNT=6;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=6;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 873205200000, 873378000000, 873550800000, 873723600000, 873896400000, @@ -114,7 +114,7 @@ test('Every 10 days, 5 occurrences', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;COUNT=5;INTERVAL=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=5;INTERVAL=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 873205200000, 874069200000, 874933200000, 875797200000, 876661200000, @@ -136,7 +136,7 @@ test('Every Monday in January, for 3 years', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); expect(dates).toEqual([ 884008800000, 884613600000, 885218400000, 885823200000, 915458400000, @@ -164,7 +164,7 @@ test('Every Monday in January, for 3 years except Jan 31 2000', () => { ]); expect(iteratorDates).toEqual(dates); expect(set.getRrules().map((r) => r.toString())).toEqual([ - 'FREQ=daily;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ]); expect(set.getExrules().map((r) => r.toString())).toEqual([]); expect(set.getExdates().map((d) => d.timestamp)).toEqual([949327200000]); diff --git a/__test__/monthly.spec.ts b/__test__/monthly.spec.ts index f054f33..c69e636 100644 --- a/__test__/monthly.spec.ts +++ b/__test__/monthly.spec.ts @@ -15,7 +15,7 @@ test('Monthly on the 1st Friday for ten occurrences', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', ); expect(dates).toEqual([ 873464400000, 875883600000, 878911200000, 881330400000, 883749600000, @@ -38,7 +38,7 @@ test('Monthly on the 1st Friday until December 24, 1997', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;UNTIL=19971224T000000Z;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', ); expect(dates).toEqual([ 873464400000, 875883600000, 878911200000, 881330400000, @@ -61,7 +61,7 @@ test('Every other month on the 1st and last Sunday of the month for 10 occurrenc const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;INTERVAL=2;BYSETPOS=-1,1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=SU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYSETPOS=-1,1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=SU', ); expect(dates).toEqual([ 873637200000, 875451600000, 878479200000, 880898400000, 883922400000, @@ -84,7 +84,7 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=6;BYSETPOS=-2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYSETPOS=-2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); expect(dates).toEqual([ 874933200000, 877352400000, 879775200000, 882799200000, 885218400000, @@ -106,7 +106,7 @@ test('Monthly on the third to the last day of the month, limit 6', () => { ); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 875451600000, 878133600000, 880725600000, 883404000000, 886082400000, @@ -128,7 +128,7 @@ test('Monthly on the 2nd and 15th of the month for 10 occurrences', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;BYMONTHDAY=2,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 873205200000, 874328400000, 875797200000, 876920400000, 878479200000, @@ -150,7 +150,7 @@ test('Monthly on the first and last day of the month for 10 occurrences', () => const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;BYMONTHDAY=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 875624400000, 875710800000, 878306400000, 878392800000, 880898400000, @@ -173,7 +173,7 @@ test('Every 18 months on the 10th thru 15th of the month for 10 occurrences', () const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 873896400000, 873982800000, 874069200000, 874155600000, 874242000000, @@ -228,7 +228,7 @@ test('Every Tuesday, every other month, limit 18', () => { ); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=monthly;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ 873205200000, 873810000000, 874414800000, 875019600000, 875624400000, @@ -251,7 +251,7 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { const dates = set.all(8).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970922T090000\nFREQ=monthly;COUNT=6;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-2MO', + 'DTSTART;TZID=US/Eastern:19970922T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-2MO', ); expect(dates.map((d) => new Date(d).toISOString())).toEqual([ '1997-09-22T13:00:00.000Z', diff --git a/__test__/parsing.spec.ts b/__test__/parsing.spec.ts index ed5a490..d08fcef 100644 --- a/__test__/parsing.spec.ts +++ b/__test__/parsing.spec.ts @@ -7,7 +7,7 @@ test('Should properly parse weekly recurrence', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', ); }); @@ -18,16 +18,22 @@ test('Should properly parse monthly recurrence', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970907T090000\nFREQ=monthly;COUNT=10;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-1SU,SU', + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-1SU,SU', ); }); test('Should throw error on missing start date', () => { - expect(() => RRuleSet.parse('Invalid')).toThrowError( + expect(() => RRuleSet.parse('FREQ=monthly;COUNT=10;INTERVAL=2')).toThrowError( 'RRule parsing error: Missing start date. There needs to be a unique start date which the iteration can start from.', ); }); +test('Should throw error on invalid rule set', () => { + expect(() => RRuleSet.parse('Invalid')).toThrowError( + 'RRule parsing error: `Invalid` is a malformed property parameter. Parameter should be specified as `key=value`', + ); +}); + test('Should throw error on invalid timezone', () => { expect(() => RRuleSet.parse('DTSTART;TZID=Invalid:19970907T090000'), @@ -106,7 +112,7 @@ test('Should properly parse weekly individual recurrence rule', () => { const asString = rule.toString(); expect(asString).toBe( - 'FREQ=weekly;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYDAY=MO,WE,FR', + 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYDAY=MO,WE,FR', ); }); @@ -117,7 +123,7 @@ test('Should properly parse individual recurrence rule with RRULE prefix', () => const asString = rule.toString(); expect(asString).toBe( - 'FREQ=weekly;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYDAY=MO,WE,FR', + 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYDAY=MO,WE,FR', ); }); @@ -131,7 +137,7 @@ test('Should properly parse monthly individual recurrence rule', () => { //expect(rule.byWeekday) const asString = rule.toString(); - expect(asString).toBe('FREQ=monthly;COUNT=10;INTERVAL=2;BYDAY=SU,-1SU'); + expect(asString).toBe('FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYDAY=SU,-1SU'); }); test('Should throw error on invalid individual recurrence rule', () => { diff --git a/__test__/weekly.spec.ts b/__test__/weekly.spec.ts index e89aa34..1999e19 100644 --- a/__test__/weekly.spec.ts +++ b/__test__/weekly.spec.ts @@ -12,7 +12,7 @@ test('Weekly for 10 occurrences', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ 873205200000, 873810000000, 874414800000, 875019600000, 875624400000, @@ -34,7 +34,7 @@ test('Weekly until December 24, 1997', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;UNTIL=19971224T000000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ 873205200000, 873810000000, 874414800000, 875019600000, 875624400000, @@ -60,7 +60,7 @@ test('Every other week - limit 10', () => { ); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ 873205200000, 874414800000, 875624400000, 876834000000, 878047200000, @@ -84,7 +84,7 @@ test('Every other week on Monday, Wednesday and Friday until December 24, 1997, const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=weekly;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', ); expect(dates).toEqual([ // TODO: rrule crate does not include dtstart date (873205200000), create a bug report diff --git a/__test__/yearly.spec.ts b/__test__/yearly.spec.ts index e5b2a59..1326497 100644 --- a/__test__/yearly.spec.ts +++ b/__test__/yearly.spec.ts @@ -14,7 +14,7 @@ test('Yearly in June and July for 10 occurrences', () => { const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970610T090000\nFREQ=yearly;COUNT=10;BYMONTH=6,7;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 865947600000, 868539600000, 897483600000, 900075600000, 929019600000, @@ -37,7 +37,7 @@ test('Every other year on January, February, and March for 10 occurrences', () = const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970310T090000\nFREQ=yearly;COUNT=10;INTERVAL=2;BYMONTH=1,2,3;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970310T090000\nRRULE:FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ 858002400000, 915976800000, 918655200000, 921074400000, 979135200000, @@ -60,7 +60,7 @@ test('Every 3rd year on the 1st, 100th and 200th day for 10 occurrences', () => const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970101T090000\nFREQ=yearly;COUNT=10;INTERVAL=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYYEARDAY=1,100,200', + 'DTSTART;TZID=US/Eastern:19970101T090000\nRRULE:FREQ=YEARLY;COUNT=10;INTERVAL=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYYEARDAY=1,100,200', ); expect(dates).toEqual([ 852127200000, 860677200000, 869317200000, 946735200000, 955285200000, @@ -84,7 +84,7 @@ test('Every 20th Monday of the year, limit 3', () => { ); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970512T090000\nFREQ=yearly;BYSETPOS=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYSETPOS=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); expect(dates).toEqual([864046800000, 895496400000, 926946000000]); expect(iteratorDates).toEqual(dates); @@ -106,7 +106,7 @@ test('Monday of week number 20 (where the default start of the week is Monday), ); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970512T090000\nFREQ=yearly;BYWEEKNO=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYWEEKNO=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); expect(dates).toEqual([863442000000, 894891600000, 926946000000]); expect(iteratorDates).toEqual(dates); @@ -127,7 +127,7 @@ test('Every Thursday in March, limit 11', () => { ); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970313T090000\nFREQ=yearly;BYMONTH=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TH', + 'DTSTART;TZID=US/Eastern:19970313T090000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TH', ); expect(dates).toEqual([ 858261600000, 858866400000, 859471200000, 889106400000, 889711200000, @@ -142,7 +142,7 @@ test('Every Friday the 13th, limit 5', () => { .setByWeekday([Weekday.Friday]) .setByMonthday([13]); const set = new RRuleSet(new RRuleDateTime(873205200000, 'US/Eastern')) - .addExdate(new RRuleDateTime(889797600000)) + .addExdate(new RRuleDateTime(889797600000, 'UTC')) .addRrule(rrule); const asString = set.toString(); @@ -153,7 +153,9 @@ test('Every Friday the 13th, limit 5', () => { // TODO: rrule crate doesn't add exdate to string output, create a bug report expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=yearly;BYMONTHDAY=13;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\n' + + 'RRULE:FREQ=YEARLY;BYMONTHDAY=13;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR\n' + + 'EXDATE;VALUE=DATE-TIME:19980313T140000Z', ); expect(dates).toEqual([ 887378400000, 910965600000, 934549200000, 971442000000, 987166800000, @@ -178,7 +180,7 @@ test('Every four years, the first Tuesday after a Monday in November, forever (U ); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19961105T090000\nFREQ=yearly;INTERVAL=4;BYMONTH=11;BYMONTHDAY=2,3,4,5,6,7,8;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19961105T090000\nRRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYMONTHDAY=2,3,4,5,6,7,8;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([847202400000, 973605600000, 1099404000000]); expect(iteratorDates).toEqual(dates); diff --git a/src/lib.rs b/src/lib.rs index 604df42..0acd747 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -228,7 +228,7 @@ impl RRuleDateTime { #[napi(ts_return_type = "Date")] pub fn to_utc_date(&self, env: Env) -> napi::Result { - env.create_date(self.date_time.naive_utc().timestamp_millis() as f64) + env.create_date(self.date_time.naive_utc().and_utc().timestamp_millis() as f64) } } From e16cebb68c540ac134651a3fd14a33c6579c882d Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 10 Apr 2024 13:07:42 +0700 Subject: [PATCH 06/63] refactor: restructure code (#86) --- Cargo.lock | 1 + Cargo.toml | 1 + __test__/monthly.spec.ts | 2 +- index.d.ts | 80 ++-- index.js | 8 +- src/js.rs | 17 + src/js/frequency.rs | 40 ++ src/js/month.rs | 56 +++ src/js/n_weekday.rs | 36 ++ src/js/rrule.rs | 275 +++++++++++++ src/js/rrule_datetime.rs | 128 ++++++ src/js/rrule_set.rs | 258 ++++++++++++ src/js/rrule_timezone.rs | 52 +++ src/js/weekday.rs | 40 ++ src/lib.rs | 840 +-------------------------------------- 15 files changed, 949 insertions(+), 885 deletions(-) create mode 100644 src/js.rs create mode 100644 src/js/frequency.rs create mode 100644 src/js/month.rs create mode 100644 src/js/n_weekday.rs create mode 100644 src/js/rrule.rs create mode 100644 src/js/rrule_datetime.rs create mode 100644 src/js/rrule_set.rs create mode 100644 src/js/rrule_timezone.rs create mode 100644 src/js/weekday.rs diff --git a/Cargo.lock b/Cargo.lock index 1302ac9..ff8c5e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,6 +389,7 @@ name = "rrule-rust" version = "0.0.0" dependencies = [ "chrono", + "chrono-tz", "napi", "napi-build", "napi-derive", diff --git a/Cargo.toml b/Cargo.toml index 6039e9a..39de774 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ crate-type = ["cdylib"] [dependencies] chrono = "0.4.24" +chrono-tz = "0.8.5" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix napi = { version = "2.11.1", default-features = false, features = ["napi5"] } napi-derive = "2.11.0" diff --git a/__test__/monthly.spec.ts b/__test__/monthly.spec.ts index c69e636..bfef2e4 100644 --- a/__test__/monthly.spec.ts +++ b/__test__/monthly.spec.ts @@ -266,5 +266,5 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { test('Errors on invalid by-weekday', () => { expect(() => new RRule(Frequency.Monthly).setByWeekday(['invalid' as any]), - ).toThrowError('Value is non of these types `JsNWeekday`, `JsWeekday`'); + ).toThrowError('Value is non of these types `NWeekday`, `Weekday`'); }); diff --git a/index.d.ts b/index.d.ts index 1427c86..91053fc 100644 --- a/index.d.ts +++ b/index.d.ts @@ -12,25 +12,6 @@ export const enum Frequency { Minutely = 5, Secondly = 6 } -export const enum Weekday { - Monday = 0, - Tuesday = 1, - Wednesday = 2, - Thursday = 3, - Friday = 4, - Saturday = 5, - Sunday = 6 -} -export interface NWeekday { - /** - * If set, this represents the nth occurrence of the weekday. - * Otherwise it represents every occurrence of the weekday. - * - * A negative value represents nth occurrence from the end. - */ - n?: number - weekday: Weekday -} export const enum Month { January = 0, February = 1, @@ -45,30 +26,25 @@ export const enum Month { November = 10, December = 11 } -export class RRuleTimezone { - constructor(tz: string) +export interface NWeekday { /** - * The name of the timezone. If the timezone is local, it will return "Local". - */ - get name(): string - get isLocal(): boolean + * If set, this represents the nth occurrence of the weekday. + * Otherwise it represents every occurrence of the weekday. + * + * A negative value represents nth occurrence from the end. + */ + n?: number + weekday: Weekday } -export class RRuleDateTime { - constructor(date: Date | number, timezone?: string | undefined | null) - get timestamp(): number - get timezone(): RRuleTimezone - get day(): number - get month(): number - get year(): number - get hour(): number - get minute(): number - get second(): number - get millisecond(): number - get toString(): string - toDate(): Date - toUtcDate(): Date +export const enum Weekday { + Monday = 0, + Tuesday = 1, + Wednesday = 2, + Thursday = 3, + Friday = 4, + Saturday = 5, + Sunday = 6 } -export type JsRRule = RRule export class RRule { constructor(frequency: Frequency) static parse(str: string): RRule @@ -101,7 +77,21 @@ export class RRule { setWeekstart(day: Weekday): this setUntil(dateTime: RRuleDateTime | Date): this } -export type JsRRuleSet = RRuleSet +export class RRuleDateTime { + constructor(date: Date | number, timezone?: string | undefined | null) + get timestamp(): number + get timezone(): RRuleTimezone + get day(): number + get month(): number + get year(): number + get hour(): number + get minute(): number + get second(): number + get millisecond(): number + get toString(): string + toDate(): Date + toUtcDate(): Date +} export class RRuleSet { constructor(dtstart: RRuleDateTime | Date) static parse(str: string): RRuleSet @@ -122,3 +112,11 @@ export class RRuleSet { export class Occurrences { [Symbol.iterator](): Iterator } +export class RRuleTimezone { + constructor(tz: string) + /** + * The name of the timezone. If the timezone is local, it will return "Local". + */ + get name(): string + get isLocal(): boolean +} diff --git a/index.js b/index.js index 9e28474..29ee631 100644 --- a/index.js +++ b/index.js @@ -252,13 +252,13 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { Frequency, Weekday, Month, RRuleTimezone, RRuleDateTime, RRule, RRuleSet, Occurrences } = nativeBinding +const { Frequency, Month, RRule, RRuleDateTime, RRuleSet, Occurrences, RRuleTimezone, Weekday } = nativeBinding module.exports.Frequency = Frequency -module.exports.Weekday = Weekday module.exports.Month = Month -module.exports.RRuleTimezone = RRuleTimezone -module.exports.RRuleDateTime = RRuleDateTime module.exports.RRule = RRule +module.exports.RRuleDateTime = RRuleDateTime module.exports.RRuleSet = RRuleSet module.exports.Occurrences = Occurrences +module.exports.RRuleTimezone = RRuleTimezone +module.exports.Weekday = Weekday diff --git a/src/js.rs b/src/js.rs new file mode 100644 index 0000000..662d26a --- /dev/null +++ b/src/js.rs @@ -0,0 +1,17 @@ +mod frequency; +mod month; +mod n_weekday; +mod rrule; +mod rrule_datetime; +mod rrule_set; +mod rrule_timezone; +mod weekday; + +pub use frequency::Frequency; +pub use month::Month; +pub use n_weekday::NWeekday; +pub use rrule::RRule; +pub use rrule_datetime::RRuleDateTime; +pub use rrule_set::RRuleSet; +pub use rrule_timezone::RRuleTimezone; +pub use weekday::Weekday; diff --git a/src/js/frequency.rs b/src/js/frequency.rs new file mode 100644 index 0000000..b1adb69 --- /dev/null +++ b/src/js/frequency.rs @@ -0,0 +1,40 @@ +use napi_derive::napi; + +#[napi(js_name = "Frequency")] +pub enum Frequency { + Yearly, + Monthly, + Weekly, + Daily, + Hourly, + Minutely, + Secondly, +} + +impl From for Frequency { + fn from(freq: rrule::Frequency) -> Self { + match freq { + rrule::Frequency::Daily => Frequency::Daily, + rrule::Frequency::Hourly => Frequency::Hourly, + rrule::Frequency::Minutely => Frequency::Minutely, + rrule::Frequency::Monthly => Frequency::Monthly, + rrule::Frequency::Secondly => Frequency::Secondly, + rrule::Frequency::Weekly => Frequency::Weekly, + rrule::Frequency::Yearly => Frequency::Yearly, + } + } +} + +impl Into for Frequency { + fn into(self) -> rrule::Frequency { + match self { + Frequency::Daily => rrule::Frequency::Daily, + Frequency::Hourly => rrule::Frequency::Hourly, + Frequency::Minutely => rrule::Frequency::Minutely, + Frequency::Monthly => rrule::Frequency::Monthly, + Frequency::Secondly => rrule::Frequency::Secondly, + Frequency::Weekly => rrule::Frequency::Weekly, + Frequency::Yearly => rrule::Frequency::Yearly, + } + } +} diff --git a/src/js/month.rs b/src/js/month.rs new file mode 100644 index 0000000..84f8d84 --- /dev/null +++ b/src/js/month.rs @@ -0,0 +1,56 @@ +use napi_derive::napi; + +#[napi(js_name = "Month")] +pub enum Month { + January, + February, + March, + April, + May, + June, + July, + August, + September, + October, + November, + December, +} + +impl From<&u8> for Month { + fn from(month: &u8) -> Self { + match month { + 0 => Month::January, + 1 => Month::February, + 2 => Month::March, + 3 => Month::April, + 4 => Month::May, + 5 => Month::June, + 6 => Month::July, + 7 => Month::August, + 8 => Month::September, + 9 => Month::October, + 10 => Month::November, + 11 => Month::December, + _ => panic!("Unknown month index: {}", month), + } + } +} + +impl Into for Month { + fn into(self) -> chrono::Month { + match self { + Month::January => chrono::Month::January, + Month::February => chrono::Month::February, + Month::March => chrono::Month::March, + Month::April => chrono::Month::April, + Month::May => chrono::Month::May, + Month::June => chrono::Month::June, + Month::July => chrono::Month::July, + Month::August => chrono::Month::August, + Month::September => chrono::Month::September, + Month::October => chrono::Month::October, + Month::November => chrono::Month::November, + Month::December => chrono::Month::December, + } + } +} diff --git a/src/js/n_weekday.rs b/src/js/n_weekday.rs new file mode 100644 index 0000000..42c679d --- /dev/null +++ b/src/js/n_weekday.rs @@ -0,0 +1,36 @@ +use super::weekday::Weekday; +use napi_derive::napi; + +#[napi(object, js_name = "NWeekday")] +pub struct NWeekday { + /// If set, this represents the nth occurrence of the weekday. + /// Otherwise it represents every occurrence of the weekday. + /// + /// A negative value represents nth occurrence from the end. + pub n: Option, + pub weekday: Weekday, +} + +impl From for NWeekday { + fn from(nday: rrule::NWeekday) -> Self { + match nday { + rrule::NWeekday::Every(weekday) => NWeekday { + n: None, + weekday: Weekday::from(weekday), + }, + rrule::NWeekday::Nth(n, weekday) => NWeekday { + n: Some(n), + weekday: weekday.into(), + }, + } + } +} + +impl Into for NWeekday { + fn into(self) -> rrule::NWeekday { + match self.n { + Some(n) => rrule::NWeekday::Nth(n, self.weekday.into()), + None => rrule::NWeekday::Every(self.weekday.into()), + } + } +} diff --git a/src/js/rrule.rs b/src/js/rrule.rs new file mode 100644 index 0000000..c560d87 --- /dev/null +++ b/src/js/rrule.rs @@ -0,0 +1,275 @@ +use super::{Frequency, Month, NWeekday, RRuleDateTime, Weekday}; +use chrono::DateTime; +use napi::{bindgen_prelude::Array, Either, Env}; +use napi_derive::napi; +use replace_with::replace_with_or_abort; + +#[napi(js_name = "RRule")] +pub struct RRule { + rrule: rrule::RRule, +} + +#[napi] +impl RRule { + #[napi(constructor)] + pub fn new(frequency: Frequency) -> Self { + let rrule = rrule::RRule::new(frequency.into()); + + RRule { rrule } + } + + #[napi(factory, ts_return_type = "RRule")] + pub fn parse(str: String) -> napi::Result { + let rrule: rrule::RRule = str + .parse() + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + Ok(RRule { rrule }) + } + + #[napi(getter)] + pub fn frequency(&self) -> napi::Result { + Ok(Frequency::from(self.rrule.get_freq())) + } + + #[napi(getter)] + pub fn interval(&self) -> napi::Result { + Ok(self.rrule.get_interval()) + } + + #[napi(getter)] + pub fn count(&self) -> napi::Result> { + Ok(self.rrule.get_count()) + } + + #[napi(getter, ts_return_type = "NWeekday[]")] + pub fn by_weekday(&self) -> Vec { + return self + .rrule + .get_by_weekday() + .iter() + .map(|nday| NWeekday::from(*nday)) + .collect(); + } + + #[napi(getter)] + pub fn by_hour(&self) -> napi::Result> { + Ok(self.rrule.get_by_hour().to_vec()) + } + + #[napi(getter)] + pub fn by_minute(&self) -> napi::Result> { + Ok(self.rrule.get_by_minute().to_vec()) + } + + #[napi(getter)] + pub fn by_second(&self) -> napi::Result> { + Ok(self.rrule.get_by_second().to_vec()) + } + + #[napi(getter)] + pub fn by_monthday(&self) -> napi::Result> { + Ok(self.rrule.get_by_month_day().to_vec()) + } + + #[napi(getter)] + pub fn by_setpos(&self) -> napi::Result> { + Ok(self.rrule.get_by_set_pos().to_vec()) + } + + #[napi(getter, ts_return_type = "Month[]")] + pub fn by_month(&self, env: Env) -> napi::Result { + let months = self.rrule.get_by_month(); + let mut arr = env.create_array(0)?; + + for month in months.iter() { + arr.insert(Month::from(month))?; + } + + Ok(arr) + } + + #[napi(getter)] + pub fn by_weekno(&self) -> napi::Result> { + Ok(self.rrule.get_by_week_no().to_vec()) + } + + #[napi(getter)] + pub fn by_yearday(&self) -> napi::Result> { + Ok(self.rrule.get_by_year_day().to_vec()) + } + + #[napi(getter)] + pub fn weekstart(&self) -> napi::Result { + Ok(Weekday::from(self.rrule.get_week_start())) + } + + #[napi(getter)] + pub fn until(&self) -> napi::Result> { + Ok(match self.rrule.get_until() { + Some(until) => Some(RRuleDateTime::new_with_date_time(until.clone())), + None => None, + }) + } + + #[napi] + pub fn to_string(&self) -> napi::Result { + Ok(self.rrule.to_string()) + } + + #[napi] + pub fn set_interval(&mut self, interval: u16) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.interval(interval)); + + Ok(self) + } + + #[napi] + pub fn set_count(&mut self, count: u32) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.count(count)); + + Ok(self) + } + + #[napi] + pub fn set_by_weekday( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] weekdays: Vec< + Either, + >, + ) -> napi::Result<&Self> { + let by_weekday = weekdays + .into_iter() + .map(|weekday| match weekday { + Either::A(nday) => nday.into(), + Either::B(weekday) => rrule::NWeekday::Every(weekday.into()), + }) + .collect(); + + replace_with_or_abort(&mut self.rrule, |self_| self_.by_weekday(by_weekday)); + + Ok(self) + } + + #[napi] + pub fn set_by_hour( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] hours: Vec, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.by_hour(hours)); + + Ok(self) + } + + #[napi] + pub fn set_by_minute( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] minutes: Vec, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.by_minute(minutes)); + + Ok(self) + } + + #[napi] + pub fn set_by_second( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] seconds: Vec, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.by_second(seconds)); + + Ok(self) + } + + #[napi] + pub fn set_by_monthday( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] days: Vec, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.by_month_day(days)); + + Ok(self) + } + + #[napi] + pub fn set_by_setpos( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] poses: Vec, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.by_set_pos(poses)); + + Ok(self) + } + + #[napi] + pub fn set_by_month( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] months: Array, + ) -> napi::Result<&Self> { + let mut vec: Vec = Vec::new(); + + for i in 0..months.len() { + let month: Month = months.get(i).unwrap().unwrap(); + + vec.push(month.into()); + } + + replace_with_or_abort(&mut self.rrule, |self_| self_.by_month(&vec)); + + Ok(self) + } + + #[napi] + pub fn set_by_weekno( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] week_numbers: Vec, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.by_week_no(week_numbers)); + + Ok(self) + } + + #[napi] + pub fn set_by_yearday( + &mut self, + #[napi(ts_arg_type = "ReadonlyArray")] days: Vec, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.by_year_day(days)); + + Ok(self) + } + + #[napi] + pub fn set_weekstart(&mut self, day: Weekday) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule, |self_| self_.week_start(day.into())); + + Ok(self) + } + + #[napi] + pub fn set_until( + &mut self, + date_time: napi::Either<&RRuleDateTime, napi::JsDate>, + ) -> napi::Result<&Self> { + let date_time = RRuleDateTime::from(date_time); + replace_with_or_abort(&mut self.rrule, |self_| self_.until(date_time.into())); + + Ok(self) + } + + pub fn validate(&self, dt_start: DateTime) -> napi::Result { + return Ok( + self + .rrule + .clone() + .validate(dt_start) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?, + ); + } +} + +impl From> for RRule { + fn from(rrule: rrule::RRule) -> Self { + Self { rrule } + } +} diff --git a/src/js/rrule_datetime.rs b/src/js/rrule_datetime.rs new file mode 100644 index 0000000..2b46f66 --- /dev/null +++ b/src/js/rrule_datetime.rs @@ -0,0 +1,128 @@ +use super::RRuleTimezone; +use chrono::DateTime; +use chrono::Datelike; +use chrono::TimeZone; +use chrono::Timelike; +use napi::bindgen_prelude::*; +use napi_derive::napi; +use std::str::FromStr; + +#[napi(js_name = "RRuleDateTime")] +pub struct RRuleDateTime { + date_time: chrono::DateTime, +} + +#[napi] +impl RRuleDateTime { + #[napi(constructor)] + pub fn new_with_js_date( + date: napi::Either, + timezone: Option, + ) -> napi::Result { + let timestamp = match date { + Either::A(date) => date.value_of(), + Either::B(date) => Ok(date), + }?; + + let mut date_time = rrule::Tz::LOCAL.timestamp_nanos((timestamp * 1_000_000f64) as i64); + if let Some(timezone) = timezone { + let tz: rrule::Tz = RRuleTimezone::from_str(&timezone)?.into(); + + date_time = date_time.with_timezone(&tz); + } + + Ok(RRuleDateTime::new_with_date_time(date_time)) + } + + pub fn new_with_date_time(date_time: DateTime) -> Self { + RRuleDateTime { date_time } + } + + #[napi(getter)] + pub fn timestamp(&self) -> i64 { + self.date_time.timestamp_millis() + } + + #[napi(getter)] + pub fn timezone(&self) -> RRuleTimezone { + RRuleTimezone::new_with_tz(self.date_time.timezone()) + } + + #[napi(getter)] + pub fn day(&self) -> u32 { + self.date_time.day() + } + + #[napi(getter)] + pub fn month(&self) -> u32 { + self.date_time.month() + } + + #[napi(getter)] + pub fn year(&self) -> i32 { + self.date_time.year() + } + + #[napi(getter)] + pub fn hour(&self) -> u32 { + self.date_time.hour() + } + + #[napi(getter)] + pub fn minute(&self) -> u32 { + self.date_time.minute() + } + + #[napi(getter)] + pub fn second(&self) -> u32 { + self.date_time.second() + } + + #[napi(getter)] + pub fn millisecond(&self) -> u32 { + let nanoseconds = self.date_time.nanosecond(); + nanoseconds / 1_000_000 + } + + #[napi(getter)] + pub fn to_string(&self) -> String { + self.date_time.to_string() + } + + #[napi(ts_return_type = "Date")] + pub fn to_date(&self, env: Env) -> napi::Result { + env.create_date(self.date_time.timestamp_millis() as f64) + } + + #[napi(ts_return_type = "Date")] + pub fn to_utc_date(&self, env: Env) -> napi::Result { + env.create_date(self.date_time.naive_utc().and_utc().timestamp_millis() as f64) + } +} + +impl From> for RRuleDateTime { + fn from(date_time: DateTime) -> Self { + RRuleDateTime::new_with_date_time(date_time) + } +} + +impl Into> for RRuleDateTime { + fn into(self) -> DateTime { + self.date_time + } +} + +impl From for RRuleDateTime { + fn from(date: napi::JsDate) -> Self { + RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap() + } +} + +impl From> for RRuleDateTime { + fn from(date: napi::Either<&RRuleDateTime, napi::JsDate>) -> Self { + match date { + Either::A(date) => RRuleDateTime::new_with_date_time(date.date_time), + Either::B(date) => RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap(), + } + } +} diff --git a/src/js/rrule_set.rs b/src/js/rrule_set.rs new file mode 100644 index 0000000..72162b6 --- /dev/null +++ b/src/js/rrule_set.rs @@ -0,0 +1,258 @@ +use super::{RRule, RRuleDateTime}; +use chrono::DateTime; +use napi::{ + bindgen_prelude::{Reference, SharedReference}, + iterator::Generator, + Env, +}; +use napi_derive::napi; +use replace_with::replace_with_or_abort; + +#[napi(js_name = "RRuleSet")] +pub struct RRuleSet { + rrule_set: rrule::RRuleSet, +} + +#[napi] +impl RRuleSet { + #[napi(constructor)] + pub fn new(dtstart: napi::Either<&RRuleDateTime, napi::JsDate>) -> napi::Result { + let rrule_set = rrule::RRuleSet::new(RRuleDateTime::from(dtstart).into()); + + Ok(RRuleSet { rrule_set }) + } + + #[napi(factory, ts_return_type = "RRuleSet")] + pub fn parse(str: String) -> napi::Result { + let rrule_set: rrule::RRuleSet = str + .parse() + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + Ok(RRuleSet { rrule_set }) + } + + #[napi] + pub fn to_string(&self) -> napi::Result { + Ok(self.rrule_set.to_string()) + } + + #[napi] + pub fn add_rrule(&mut self, js_rrule: &RRule) -> napi::Result<&Self> { + let dt_start = self.rrule_set.get_dt_start().clone(); + let rrule = js_rrule.validate(dt_start)?; + + replace_with_or_abort(&mut self.rrule_set, |self_| self_.rrule(rrule)); + + Ok(self) + } + + #[napi] + pub fn add_exrule(&mut self, js_rrule: &RRule) -> napi::Result<&Self> { + let rrule = js_rrule.validate(*self.rrule_set.get_dt_start())?; + + replace_with_or_abort(&mut self.rrule_set, |self_| self_.exrule(rrule)); + + Ok(self) + } + + #[napi] + pub fn add_exdate( + &mut self, + date_time: napi::Either<&RRuleDateTime, napi::JsDate>, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule_set, |self_| { + self_.exdate(RRuleDateTime::from(date_time).into()) + }); + + Ok(self) + } + + #[napi] + pub fn add_rdate( + &mut self, + date_time: napi::Either<&RRuleDateTime, napi::JsDate>, + ) -> napi::Result<&Self> { + replace_with_or_abort(&mut self.rrule_set, |self_| { + self_.rdate(RRuleDateTime::from(date_time).into()) + }); + + Ok(self) + } + + #[napi(getter)] + pub fn dtstart(&self) -> RRuleDateTime { + RRuleDateTime::new_with_date_time(self.rrule_set.get_dt_start().clone()) + } + + #[napi] + pub fn get_rrules(&self) -> Vec { + return self + .rrule_set + .get_rrule() + .iter() + .map(|rrule| RRule::from(to_unvalidated(rrule))) + .collect(); + } + + #[napi] + pub fn get_exrules(&self) -> Vec { + return self + .rrule_set + .get_exrule() + .iter() + .map(|rrule| RRule::from(to_unvalidated(rrule))) + .collect(); + } + + #[napi] + pub fn get_exdates(&self) -> Vec { + return self + .rrule_set + .get_exdate() + .iter() + .map(|date| RRuleDateTime::new_with_date_time(date.clone())) + .collect(); + } + + #[napi] + pub fn get_rdates(&self) -> Vec { + return self + .rrule_set + .get_rdate() + .iter() + .map(|date| RRuleDateTime::new_with_date_time(date.clone())) + .collect(); + } + + fn is_after( + &self, + timestamp: DateTime, + after_timestamp: DateTime, + inclusive: Option, + ) -> bool { + let inclusive = inclusive.unwrap_or(false); + + if inclusive && timestamp < after_timestamp { + return false; + } else if !inclusive && timestamp <= after_timestamp { + return false; + } + + true + } + + fn is_before( + &self, + timestamp: DateTime, + before_timestamp: DateTime, + inclusive: Option, + ) -> bool { + let inclusive = inclusive.unwrap_or(false); + + if inclusive && timestamp > before_timestamp { + return false; + } else if !inclusive && timestamp >= before_timestamp { + return false; + } + + true + } + + #[napi] + pub fn all(&self, limit: Option) -> Vec { + let iter = self.rrule_set.into_iter(); + if let Some(limit) = limit { + return iter + .take(limit as usize) + .map(|date| RRuleDateTime::new_with_date_time(date)) + .collect(); + } else { + return iter + .map(|date| RRuleDateTime::new_with_date_time(date)) + .collect(); + } + } + + #[napi] + pub fn between( + &self, + after: napi::Either<&RRuleDateTime, napi::JsDate>, + before: napi::Either<&RRuleDateTime, napi::JsDate>, + inclusive: Option, + ) -> napi::Result> { + let _after = RRuleDateTime::from(after).into(); + let _before = RRuleDateTime::from(before).into(); + return Ok( + self + .rrule_set + .into_iter() + .take_while(|date| { + let is_before = self.is_before(*date, _before, inclusive); + + is_before + }) + .filter(|date| { + let is_after = self.is_after(*date, _after, inclusive); + + is_after + }) + .map(|date| RRuleDateTime::new_with_date_time(date)) + .collect::>(), + ); + } + + #[napi] + pub fn occurrences(&self, this: Reference, env: Env) -> napi::Result { + let iter = this.share_with(env, |set| Ok(set.rrule_set.into_iter()))?; + Ok(Occurrences { iter }) + } +} + +#[napi(iterator)] +pub struct Occurrences { + iter: SharedReference>, +} + +#[napi] +impl Generator for Occurrences { + type Yield = RRuleDateTime; + type Next = (); + type Return = (); + + fn next(&mut self, _next: Option) -> Option { + self + .iter + .next() + .map(|date| RRuleDateTime::new_with_date_time(date)) + } +} + +fn to_unvalidated(rrule: &rrule::RRule) -> rrule::RRule { + let by_month = rrule + .get_by_month() + .iter() + .map(|m| chrono::Month::try_from(*m).unwrap()) + .collect::>(); + let mut unvalidated = rrule::RRule::new(rrule.get_freq()) + .interval(rrule.get_interval()) + .week_start(rrule.get_week_start()) + .by_set_pos(rrule.get_by_set_pos().to_vec()) + .by_month(&by_month) + .by_month_day(rrule.get_by_month_day().to_vec()) + .by_year_day(rrule.get_by_year_day().to_vec()) + .by_week_no(rrule.get_by_week_no().to_vec()) + .by_weekday(rrule.get_by_weekday().to_vec()) + .by_hour(rrule.get_by_hour().to_vec()) + .by_minute(rrule.get_by_minute().to_vec()) + .by_second(rrule.get_by_second().to_vec()); + + if let Some(count) = rrule.get_count() { + unvalidated = unvalidated.count(count); + } + + if let Some(until) = rrule.get_until() { + unvalidated = unvalidated.until(*until); + } + + unvalidated +} diff --git a/src/js/rrule_timezone.rs b/src/js/rrule_timezone.rs new file mode 100644 index 0000000..230b00a --- /dev/null +++ b/src/js/rrule_timezone.rs @@ -0,0 +1,52 @@ +use napi_derive::napi; +use std::str::FromStr; + +#[derive(Debug)] +#[napi(js_name = "RRuleTimezone")] +pub struct RRuleTimezone { + tz: rrule::Tz, +} + +#[napi] +impl RRuleTimezone { + #[napi(constructor)] + pub fn new(tz: String) -> napi::Result { + Ok(tz.parse()?) + } + + pub fn new_with_tz(tz: rrule::Tz) -> Self { + RRuleTimezone { tz } + } + + /** + * The name of the timezone. If the timezone is local, it will return "Local". + */ + #[napi(getter)] + pub fn name(&self) -> String { + self.tz.name().to_string() + } + + #[napi(getter)] + pub fn is_local(&self) -> bool { + self.tz.is_local() + } +} + +impl Into for RRuleTimezone { + fn into(self) -> rrule::Tz { + self.tz + } +} + +impl FromStr for RRuleTimezone { + type Err = napi::Error; + + fn from_str(str: &str) -> Result { + str + .parse::() + .map(|tz| RRuleTimezone { + tz: rrule::Tz::Tz(tz), + }) + .map_err(|err| napi::Error::new(napi::Status::GenericFailure, err.to_string())) + } +} diff --git a/src/js/weekday.rs b/src/js/weekday.rs new file mode 100644 index 0000000..c40dc0c --- /dev/null +++ b/src/js/weekday.rs @@ -0,0 +1,40 @@ +use napi_derive::napi; + +#[napi(js_name = "Weekday")] +pub enum Weekday { + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, +} + +impl From for Weekday { + fn from(weekday: rrule::Weekday) -> Self { + match weekday { + rrule::Weekday::Mon => Weekday::Monday, + rrule::Weekday::Tue => Weekday::Tuesday, + rrule::Weekday::Wed => Weekday::Wednesday, + rrule::Weekday::Thu => Weekday::Thursday, + rrule::Weekday::Fri => Weekday::Friday, + rrule::Weekday::Sat => Weekday::Saturday, + rrule::Weekday::Sun => Weekday::Sunday, + } + } +} + +impl Into for Weekday { + fn into(self) -> rrule::Weekday { + match self { + Weekday::Monday => rrule::Weekday::Mon, + Weekday::Tuesday => rrule::Weekday::Tue, + Weekday::Wednesday => rrule::Weekday::Wed, + Weekday::Thursday => rrule::Weekday::Thu, + Weekday::Friday => rrule::Weekday::Fri, + Weekday::Saturday => rrule::Weekday::Sat, + Weekday::Sunday => rrule::Weekday::Sun, + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 0acd747..aaf074e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,839 +1 @@ -#![deny(clippy::all)] - -use chrono::{DateTime, Datelike, Month, TimeZone, Timelike, Weekday}; -use napi::bindgen_prelude::*; -use replace_with::replace_with_or_abort; -use rrule::{Frequency, NWeekday, RRule, RRuleSet, Tz, Unvalidated}; - -#[macro_use] -extern crate napi_derive; - -#[napi(js_name = "Frequency")] -pub enum JsFrequency { - Yearly, - Monthly, - Weekly, - Daily, - Hourly, - Minutely, - Secondly, -} - -#[napi(js_name = "Weekday")] -pub enum JsWeekday { - Monday, - Tuesday, - Wednesday, - Thursday, - Friday, - Saturday, - Sunday, -} - -#[napi(object, js_name = "NWeekday")] -pub struct JsNWeekday { - /// If set, this represents the nth occurrence of the weekday. - /// Otherwise it represents every occurrence of the weekday. - /// - /// A negative value represents nth occurrence from the end. - pub n: Option, - pub weekday: JsWeekday, -} - -impl From for JsNWeekday { - fn from(nday: NWeekday) -> Self { - match nday { - NWeekday::Every(weekday) => JsNWeekday { - n: None, - weekday: map_rust_weekday(weekday), - }, - NWeekday::Nth(n, weekday) => JsNWeekday { - n: Some(n), - weekday: map_rust_weekday(weekday), - }, - } - } -} - -impl Into for JsNWeekday { - fn into(self) -> NWeekday { - match self.n { - Some(n) => NWeekday::Nth(n, map_js_weekday(self.weekday)), - None => NWeekday::Every(map_js_weekday(self.weekday)), - } - } -} - -#[napi(js_name = "Month")] -pub enum JsMonth { - January, - February, - March, - April, - May, - June, - July, - August, - September, - October, - November, - December, -} - -fn to_unvalidated(rrule: &RRule) -> RRule { - let by_month = rrule - .get_by_month() - .iter() - .map(|m| Month::try_from(*m).unwrap()) - .collect::>(); - let mut unvalidated = RRule::new(rrule.get_freq()) - .interval(rrule.get_interval()) - .week_start(rrule.get_week_start()) - .by_set_pos(rrule.get_by_set_pos().to_vec()) - .by_month(&by_month) - .by_month_day(rrule.get_by_month_day().to_vec()) - .by_year_day(rrule.get_by_year_day().to_vec()) - .by_week_no(rrule.get_by_week_no().to_vec()) - .by_weekday(rrule.get_by_weekday().to_vec()) - .by_hour(rrule.get_by_hour().to_vec()) - .by_minute(rrule.get_by_minute().to_vec()) - .by_second(rrule.get_by_second().to_vec()); - - if let Some(count) = rrule.get_count() { - unvalidated = unvalidated.count(count); - } - - if let Some(until) = rrule.get_until() { - unvalidated = unvalidated.until(*until); - } - - unvalidated -} - -#[napi(js_name = "RRuleTimezone")] -pub struct RRuleTimezone { - tz: Tz, -} - -#[napi] -impl RRuleTimezone { - #[napi(constructor)] - pub fn new(tz: String) -> napi::Result { - let tz = map_js_tz(&tz)?; - - Ok(RRuleTimezone::new_with_tz(tz)) - } - - pub fn new_with_tz(tz: Tz) -> Self { - RRuleTimezone { tz } - } - - /** - * The name of the timezone. If the timezone is local, it will return "Local". - */ - #[napi(getter)] - pub fn name(&self) -> String { - self.tz.name().to_string() - } - - #[napi(getter)] - pub fn is_local(&self) -> bool { - self.tz.is_local() - } -} - -#[napi(js_name = "RRuleDateTime")] -pub struct RRuleDateTime { - date_time: DateTime, -} - -#[napi] -impl RRuleDateTime { - #[napi(constructor)] - pub fn new_with_js_date( - date: napi::Either, - timezone: Option, - ) -> napi::Result { - let timestamp = match date { - Either::A(date) => date.value_of(), - Either::B(date) => Ok(date), - }?; - let mut date_time = Tz::LOCAL.timestamp_nanos((timestamp * 1_000_000f64) as i64); - if let Some(timezone) = timezone { - date_time = date_time.with_timezone(&map_js_tz(&timezone)?); - } - - Ok(RRuleDateTime::new_with_date_time(date_time)) - } - - pub fn new_with_date_time(date_time: DateTime) -> Self { - RRuleDateTime { date_time } - } - - #[napi(getter)] - pub fn timestamp(&self) -> i64 { - self.date_time.timestamp_millis() - } - - #[napi(getter)] - pub fn timezone(&self) -> RRuleTimezone { - RRuleTimezone::new_with_tz(self.date_time.timezone()) - } - - #[napi(getter)] - pub fn day(&self) -> u32 { - self.date_time.day() - } - - #[napi(getter)] - pub fn month(&self) -> u32 { - self.date_time.month() - } - - #[napi(getter)] - pub fn year(&self) -> i32 { - self.date_time.year() - } - - #[napi(getter)] - pub fn hour(&self) -> u32 { - self.date_time.hour() - } - - #[napi(getter)] - pub fn minute(&self) -> u32 { - self.date_time.minute() - } - - #[napi(getter)] - pub fn second(&self) -> u32 { - self.date_time.second() - } - - #[napi(getter)] - pub fn millisecond(&self) -> u32 { - let nanoseconds = self.date_time.nanosecond(); - nanoseconds / 1_000_000 - } - - #[napi(getter)] - pub fn to_string(&self) -> String { - self.date_time.to_string() - } - - #[napi(ts_return_type = "Date")] - pub fn to_date(&self, env: Env) -> napi::Result { - env.create_date(self.date_time.timestamp_millis() as f64) - } - - #[napi(ts_return_type = "Date")] - pub fn to_utc_date(&self, env: Env) -> napi::Result { - env.create_date(self.date_time.naive_utc().and_utc().timestamp_millis() as f64) - } -} - -impl From> for RRuleDateTime { - fn from(date_time: DateTime) -> Self { - RRuleDateTime::new_with_date_time(date_time) - } -} - -impl Into> for RRuleDateTime { - fn into(self) -> DateTime { - self.date_time - } -} - -impl From for RRuleDateTime { - fn from(date: napi::JsDate) -> Self { - RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap() - } -} - -impl From> for RRuleDateTime { - fn from(date: napi::Either<&RRuleDateTime, napi::JsDate>) -> Self { - match date { - Either::A(date) => RRuleDateTime::new_with_date_time(date.date_time), - Either::B(date) => RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap(), - } - } -} - -#[napi(js_name = "RRule")] -pub struct JsRRule { - rrule: RRule, -} - -#[napi] -impl JsRRule { - #[napi(constructor)] - pub fn new(frequency: JsFrequency) -> Self { - let rrule = RRule::new(map_js_frequency(frequency)); - - JsRRule { rrule } - } - - #[napi(factory, ts_return_type = "RRule")] - pub fn parse(str: String) -> napi::Result { - let rrule: RRule = str - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - - Ok(JsRRule { rrule }) - } - - #[napi(getter)] - pub fn frequency(&self) -> napi::Result { - Ok(map_rust_frequency(self.rrule.get_freq())) - } - - #[napi(getter)] - pub fn interval(&self) -> napi::Result { - Ok(self.rrule.get_interval()) - } - - #[napi(getter)] - pub fn count(&self) -> napi::Result> { - Ok(self.rrule.get_count()) - } - - #[napi(getter, ts_return_type = "NWeekday[]")] - pub fn by_weekday(&self) -> Vec { - return self - .rrule - .get_by_weekday() - .iter() - .map(|nday| JsNWeekday::from(*nday)) - .collect(); - } - - #[napi(getter)] - pub fn by_hour(&self) -> napi::Result> { - Ok(self.rrule.get_by_hour().to_vec()) - } - - #[napi(getter)] - pub fn by_minute(&self) -> napi::Result> { - Ok(self.rrule.get_by_minute().to_vec()) - } - - #[napi(getter)] - pub fn by_second(&self) -> napi::Result> { - Ok(self.rrule.get_by_second().to_vec()) - } - - #[napi(getter)] - pub fn by_monthday(&self) -> napi::Result> { - Ok(self.rrule.get_by_month_day().to_vec()) - } - - #[napi(getter)] - pub fn by_setpos(&self) -> napi::Result> { - Ok(self.rrule.get_by_set_pos().to_vec()) - } - - #[napi(getter, ts_return_type = "Month[]")] - pub fn by_month(&self, env: Env) -> napi::Result { - let months = self.rrule.get_by_month(); - let mut arr = env.create_array(0)?; - - for month in months.iter() { - arr.insert(map_rust_month(month))?; - } - - Ok(arr) - } - - #[napi(getter)] - pub fn by_weekno(&self) -> napi::Result> { - Ok(self.rrule.get_by_week_no().to_vec()) - } - - #[napi(getter)] - pub fn by_yearday(&self) -> napi::Result> { - Ok(self.rrule.get_by_year_day().to_vec()) - } - - #[napi(getter)] - pub fn weekstart(&self) -> napi::Result { - Ok(map_rust_weekday(self.rrule.get_week_start())) - } - - #[napi(getter)] - pub fn until(&self) -> napi::Result> { - Ok(match self.rrule.get_until() { - Some(until) => Some(RRuleDateTime::new_with_date_time(until.clone())), - None => None, - }) - } - - #[napi] - pub fn to_string(&self) -> napi::Result { - Ok(self.rrule.to_string()) - } - - #[napi] - pub fn set_interval(&mut self, interval: u16) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.interval(interval)); - - Ok(self) - } - - #[napi] - pub fn set_count(&mut self, count: u32) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.count(count)); - - Ok(self) - } - - #[napi] - pub fn set_by_weekday( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] weekdays: Vec< - Either, - >, - ) -> napi::Result<&Self> { - let by_weekday = weekdays - .into_iter() - .map(|weekday| match weekday { - Either::A(nday) => nday.into(), - Either::B(weekday) => NWeekday::Every(map_js_weekday(weekday)), - }) - .collect(); - - replace_with_or_abort(&mut self.rrule, |self_| self_.by_weekday(by_weekday)); - - Ok(self) - } - - #[napi] - pub fn set_by_hour( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] hours: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_hour(hours)); - - Ok(self) - } - - #[napi] - pub fn set_by_minute( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] minutes: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_minute(minutes)); - - Ok(self) - } - - #[napi] - pub fn set_by_second( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] seconds: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_second(seconds)); - - Ok(self) - } - - #[napi] - pub fn set_by_monthday( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] days: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_month_day(days)); - - Ok(self) - } - - #[napi] - pub fn set_by_setpos( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] poses: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_set_pos(poses)); - - Ok(self) - } - - #[napi] - pub fn set_by_month( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] months: Array, - ) -> napi::Result<&Self> { - let mut vec: Vec = Vec::new(); - - for i in 0..months.len() { - let month: JsMonth = months.get(i).unwrap().unwrap(); - - vec.push(map_js_month(month)); - } - - replace_with_or_abort(&mut self.rrule, |self_| self_.by_month(&vec)); - - Ok(self) - } - - #[napi] - pub fn set_by_weekno( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] week_numbers: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_week_no(week_numbers)); - - Ok(self) - } - - #[napi] - pub fn set_by_yearday( - &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] days: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_year_day(days)); - - Ok(self) - } - - #[napi] - pub fn set_weekstart(&mut self, day: JsWeekday) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| { - self_.week_start(map_js_weekday(day)) - }); - - Ok(self) - } - - #[napi] - pub fn set_until( - &mut self, - date_time: napi::Either<&RRuleDateTime, napi::JsDate>, - ) -> napi::Result<&Self> { - let date_time = RRuleDateTime::from(date_time); - replace_with_or_abort(&mut self.rrule, |self_| self_.until(date_time.date_time)); - - Ok(self) - } - - pub fn validate(&self, dt_start: DateTime) -> napi::Result { - return Ok( - self - .rrule - .clone() - .validate(dt_start) - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?, - ); - } -} - -#[napi(js_name = "RRuleSet")] -pub struct JsRRuleSet { - rrule_set: RRuleSet, -} - -#[napi] -impl JsRRuleSet { - #[napi(constructor)] - pub fn new(dtstart: napi::Either<&RRuleDateTime, napi::JsDate>) -> napi::Result { - let rrule_set = RRuleSet::new(RRuleDateTime::from(dtstart).date_time); - - Ok(JsRRuleSet { rrule_set }) - } - - #[napi(factory, ts_return_type = "RRuleSet")] - pub fn parse(str: String) -> napi::Result { - let rrule_set: RRuleSet = str - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - - Ok(JsRRuleSet { rrule_set }) - } - - #[napi] - pub fn to_string(&self) -> napi::Result { - Ok(self.rrule_set.to_string()) - } - - #[napi] - pub fn add_rrule(&mut self, js_rrule: &JsRRule) -> napi::Result<&Self> { - let dt_start = self.rrule_set.get_dt_start().clone(); - let rrule = js_rrule.validate(dt_start)?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.rrule(rrule)); - - Ok(self) - } - - #[napi] - pub fn add_exrule(&mut self, js_rrule: &JsRRule) -> napi::Result<&Self> { - let rrule = js_rrule.validate(*self.rrule_set.get_dt_start())?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.exrule(rrule)); - - Ok(self) - } - - #[napi] - pub fn add_exdate( - &mut self, - date_time: napi::Either<&RRuleDateTime, napi::JsDate>, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule_set, |self_| { - self_.exdate(RRuleDateTime::from(date_time).date_time) - }); - - Ok(self) - } - - #[napi] - pub fn add_rdate( - &mut self, - date_time: napi::Either<&RRuleDateTime, napi::JsDate>, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule_set, |self_| { - self_.rdate(RRuleDateTime::from(date_time).date_time) - }); - - Ok(self) - } - - #[napi(getter)] - pub fn dtstart(&self) -> RRuleDateTime { - RRuleDateTime::new_with_date_time(self.rrule_set.get_dt_start().clone()) - } - - #[napi] - pub fn get_rrules(&self) -> Vec { - return self - .rrule_set - .get_rrule() - .iter() - .map(|rrule| JsRRule { - rrule: to_unvalidated(rrule), - }) - .collect(); - } - - #[napi] - pub fn get_exrules(&self) -> Vec { - return self - .rrule_set - .get_exrule() - .iter() - .map(|rrule| JsRRule { - rrule: to_unvalidated(rrule), - }) - .collect(); - } - - #[napi] - pub fn get_exdates(&self) -> Vec { - return self - .rrule_set - .get_exdate() - .iter() - .map(|date| RRuleDateTime::new_with_date_time(date.clone())) - .collect(); - } - - #[napi] - pub fn get_rdates(&self) -> Vec { - return self - .rrule_set - .get_rdate() - .iter() - .map(|date| RRuleDateTime::new_with_date_time(date.clone())) - .collect(); - } - - fn is_after( - &self, - timestamp: DateTime, - after_timestamp: DateTime, - inclusive: Option, - ) -> bool { - let inclusive = inclusive.unwrap_or(false); - - if inclusive && timestamp < after_timestamp { - return false; - } else if !inclusive && timestamp <= after_timestamp { - return false; - } - - true - } - - fn is_before( - &self, - timestamp: DateTime, - before_timestamp: DateTime, - inclusive: Option, - ) -> bool { - let inclusive = inclusive.unwrap_or(false); - - if inclusive && timestamp > before_timestamp { - return false; - } else if !inclusive && timestamp >= before_timestamp { - return false; - } - - true - } - - #[napi] - pub fn all(&self, limit: Option) -> Vec { - let iter = self.rrule_set.into_iter(); - if let Some(limit) = limit { - return iter - .take(limit as usize) - .map(|date| RRuleDateTime::new_with_date_time(date)) - .collect(); - } else { - return iter - .map(|date| RRuleDateTime::new_with_date_time(date)) - .collect(); - } - } - - #[napi] - pub fn between( - &self, - after: napi::Either<&RRuleDateTime, napi::JsDate>, - before: napi::Either<&RRuleDateTime, napi::JsDate>, - inclusive: Option, - ) -> napi::Result> { - let _after = RRuleDateTime::from(after).date_time; - let _before = RRuleDateTime::from(before).date_time; - return Ok( - self - .rrule_set - .into_iter() - .take_while(|date| { - let is_before = self.is_before(*date, _before, inclusive); - - is_before - }) - .filter(|date| { - let is_after = self.is_after(*date, _after, inclusive); - - is_after - }) - .map(|date| RRuleDateTime::new_with_date_time(date)) - .collect::>(), - ); - } - - #[napi] - pub fn occurrences(&self, this: Reference, env: Env) -> napi::Result { - let iter = this.share_with(env, |set| Ok(set.rrule_set.into_iter()))?; - Ok(Occurrences { iter }) - } -} - -fn map_rust_frequency(freq: Frequency) -> JsFrequency { - match freq { - Frequency::Daily => JsFrequency::Daily, - Frequency::Hourly => JsFrequency::Hourly, - Frequency::Minutely => JsFrequency::Minutely, - Frequency::Monthly => JsFrequency::Monthly, - Frequency::Secondly => JsFrequency::Secondly, - Frequency::Weekly => JsFrequency::Weekly, - Frequency::Yearly => JsFrequency::Yearly, - } -} - -fn map_js_frequency(freq: JsFrequency) -> Frequency { - match freq { - JsFrequency::Daily => Frequency::Daily, - JsFrequency::Hourly => Frequency::Hourly, - JsFrequency::Minutely => Frequency::Minutely, - JsFrequency::Monthly => Frequency::Monthly, - JsFrequency::Secondly => Frequency::Secondly, - JsFrequency::Weekly => Frequency::Weekly, - JsFrequency::Yearly => Frequency::Yearly, - } -} - -fn map_js_weekday(weekday: JsWeekday) -> Weekday { - match weekday { - JsWeekday::Monday => Weekday::Mon, - JsWeekday::Tuesday => Weekday::Tue, - JsWeekday::Wednesday => Weekday::Wed, - JsWeekday::Thursday => Weekday::Thu, - JsWeekday::Friday => Weekday::Fri, - JsWeekday::Saturday => Weekday::Sat, - JsWeekday::Sunday => Weekday::Sun, - } -} - -fn map_rust_weekday(weekday: Weekday) -> JsWeekday { - match weekday { - Weekday::Mon => JsWeekday::Monday, - Weekday::Tue => JsWeekday::Tuesday, - Weekday::Wed => JsWeekday::Wednesday, - Weekday::Thu => JsWeekday::Thursday, - Weekday::Fri => JsWeekday::Friday, - Weekday::Sat => JsWeekday::Saturday, - Weekday::Sun => JsWeekday::Sunday, - } -} - -fn map_js_month(month: JsMonth) -> Month { - match month { - JsMonth::January => Month::January, - JsMonth::February => Month::February, - JsMonth::March => Month::March, - JsMonth::April => Month::April, - JsMonth::May => Month::May, - JsMonth::June => Month::June, - JsMonth::July => Month::July, - JsMonth::August => Month::August, - JsMonth::September => Month::September, - JsMonth::October => Month::October, - JsMonth::November => Month::November, - JsMonth::December => Month::December, - } -} - -fn map_rust_month(month: &u8) -> JsMonth { - match month { - 0 => JsMonth::January, - 1 => JsMonth::February, - 2 => JsMonth::March, - 3 => JsMonth::April, - 4 => JsMonth::May, - 5 => JsMonth::June, - 6 => JsMonth::July, - 7 => JsMonth::August, - 8 => JsMonth::September, - 9 => JsMonth::October, - 10 => JsMonth::November, - 11 => JsMonth::December, - _ => panic!("Unkown month index: {}", month), - } -} - -fn map_js_tz(tz: &str) -> napi::Result { - let chrono_tz = tz - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - Ok(Tz::Tz(chrono_tz)) -} - -#[napi(iterator)] -pub struct Occurrences { - iter: SharedReference>, -} - -#[napi] -impl Generator for Occurrences { - type Yield = RRuleDateTime; - type Next = (); - type Return = (); - - fn next(&mut self, _next: Option) -> Option { - self - .iter - .next() - .map(|date| RRuleDateTime::new_with_date_time(date)) - } -} +mod js; From bf01e80d3056e215d55afdf0876c2d7097a3d57e Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 22 Apr 2024 21:20:39 +0700 Subject: [PATCH 07/63] chore(semantic-release): reorder plugins (#99) --- .releaserc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.releaserc b/.releaserc index cf17e08..7d2e4af 100644 --- a/.releaserc +++ b/.releaserc @@ -39,9 +39,9 @@ } } ], - "@semantic-release/github", "@semantic-release/npm", - "@semantic-release/git" + "@semantic-release/git", + "@semantic-release/github" ], "branches": ["+([0-9])?(.{+([0-9]),x}).x", "master", {"name": "next", "prerelease": true}] } \ No newline at end of file From aef0e6a66ff2b2775f6fedf504bf75defd87db69 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 22 Apr 2024 22:45:21 +0700 Subject: [PATCH 08/63] fix: move conventional commits plugin to devs deps (#100) --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index df08601..4f66e45 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", + "conventional-changelog-conventionalcommits": "^7.0.2", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-eslint-comments": "^3.2.0", @@ -83,8 +84,5 @@ "lint": "cargo fmt --all -- --check && eslint \"**/*.{js,ts,json}\" --max-warnings=0", "lint:fix": "cargo fmt --all && yarn lint --fix", "lint:fix-staged": "lint-staged" - }, - "dependencies": { - "conventional-changelog-conventionalcommits": "^7.0.2" } } From e0506e9e2aa5120def0569a91e6865340f138ac8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 26 Apr 2024 14:07:01 +0700 Subject: [PATCH 09/63] chore(semantic-release): reorder plugin and remove git (#101) --- .releaserc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.releaserc b/.releaserc index 7d2e4af..e6a67e9 100644 --- a/.releaserc +++ b/.releaserc @@ -39,9 +39,8 @@ } } ], - "@semantic-release/npm", - "@semantic-release/git", - "@semantic-release/github" + "@semantic-release/github", + "@semantic-release/npm" ], "branches": ["+([0-9])?(.{+([0-9]),x}).x", "master", {"name": "next", "prerelease": true}] } \ No newline at end of file From 4775ca49bc619a5c3d3980e0ea8a264c297873da Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 26 Apr 2024 22:14:08 +0700 Subject: [PATCH 10/63] ci: add target to macos x64 built (#104) --- .github/workflows/build-and-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 670b242..873ab3e 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -14,7 +14,7 @@ jobs: - host: macos-latest target: x86_64-apple-darwin build: | - yarn build + yarn build --target x86_64-apple-darwin strip -x *.node - host: windows-latest build: yarn build @@ -38,7 +38,7 @@ jobs: - host: macos-latest target: aarch64-apple-darwin build: | - yarn build --target aarch64-apple-darwin + yarn build strip -x *.node - host: ubuntu-latest target: aarch64-unknown-linux-gnu From 14396e84e653d1e6ccf28fc56c20013df214a412 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 26 Apr 2024 23:53:11 +0700 Subject: [PATCH 11/63] chore(npm): reset version to `0.0.0` (#105) --- npm/android-arm-eabi/package.json | 2 +- npm/android-arm64/package.json | 2 +- npm/darwin-arm64/package.json | 2 +- npm/darwin-universal/package.json | 2 +- npm/darwin-x64/package.json | 2 +- npm/freebsd-x64/package.json | 2 +- npm/linux-arm-gnueabihf/package.json | 2 +- npm/linux-arm64-gnu/package.json | 2 +- npm/linux-arm64-musl/package.json | 2 +- npm/linux-x64-gnu/package.json | 2 +- npm/linux-x64-musl/package.json | 2 +- npm/win32-arm64-msvc/package.json | 2 +- npm/win32-ia32-msvc/package.json | 2 +- npm/win32-x64-msvc/package.json | 2 +- package.json | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/npm/android-arm-eabi/package.json b/npm/android-arm-eabi/package.json index 2e0c594..fcef19a 100644 --- a/npm/android-arm-eabi/package.json +++ b/npm/android-arm-eabi/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-android-arm-eabi", - "version": "1.1.5", + "version": "0.0.0", "os": [ "android" ], diff --git a/npm/android-arm64/package.json b/npm/android-arm64/package.json index 712d00f..475db87 100644 --- a/npm/android-arm64/package.json +++ b/npm/android-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-android-arm64", - "version": "1.1.5", + "version": "0.0.0", "os": [ "android" ], diff --git a/npm/darwin-arm64/package.json b/npm/darwin-arm64/package.json index be86ddf..b450955 100644 --- a/npm/darwin-arm64/package.json +++ b/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-darwin-arm64", - "version": "1.1.5", + "version": "0.0.0", "os": [ "darwin" ], diff --git a/npm/darwin-universal/package.json b/npm/darwin-universal/package.json index e705636..bf2080b 100644 --- a/npm/darwin-universal/package.json +++ b/npm/darwin-universal/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-darwin-universal", - "version": "1.1.5", + "version": "0.0.0", "os": [ "darwin" ], diff --git a/npm/darwin-x64/package.json b/npm/darwin-x64/package.json index 800fba2..1af976b 100644 --- a/npm/darwin-x64/package.json +++ b/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-darwin-x64", - "version": "1.1.5", + "version": "0.0.0", "os": [ "darwin" ], diff --git a/npm/freebsd-x64/package.json b/npm/freebsd-x64/package.json index 919cff7..2709113 100644 --- a/npm/freebsd-x64/package.json +++ b/npm/freebsd-x64/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-freebsd-x64", - "version": "1.1.5", + "version": "0.0.0", "os": [ "freebsd" ], diff --git a/npm/linux-arm-gnueabihf/package.json b/npm/linux-arm-gnueabihf/package.json index d41f731..9767cbb 100644 --- a/npm/linux-arm-gnueabihf/package.json +++ b/npm/linux-arm-gnueabihf/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-linux-arm-gnueabihf", - "version": "1.1.5", + "version": "0.0.0", "os": [ "linux" ], diff --git a/npm/linux-arm64-gnu/package.json b/npm/linux-arm64-gnu/package.json index 689f8ac..098e7b0 100644 --- a/npm/linux-arm64-gnu/package.json +++ b/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-linux-arm64-gnu", - "version": "1.1.5", + "version": "0.0.0", "os": [ "linux" ], diff --git a/npm/linux-arm64-musl/package.json b/npm/linux-arm64-musl/package.json index 45e78ca..4e4c9f2 100644 --- a/npm/linux-arm64-musl/package.json +++ b/npm/linux-arm64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-linux-arm64-musl", - "version": "1.1.5", + "version": "0.0.0", "os": [ "linux" ], diff --git a/npm/linux-x64-gnu/package.json b/npm/linux-x64-gnu/package.json index a650eb8..ecda72a 100644 --- a/npm/linux-x64-gnu/package.json +++ b/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-linux-x64-gnu", - "version": "1.1.5", + "version": "0.0.0", "os": [ "linux" ], diff --git a/npm/linux-x64-musl/package.json b/npm/linux-x64-musl/package.json index 832f27b..e69fb9b 100644 --- a/npm/linux-x64-musl/package.json +++ b/npm/linux-x64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-linux-x64-musl", - "version": "1.1.5", + "version": "0.0.0", "os": [ "linux" ], diff --git a/npm/win32-arm64-msvc/package.json b/npm/win32-arm64-msvc/package.json index 4aff25f..0d668c0 100644 --- a/npm/win32-arm64-msvc/package.json +++ b/npm/win32-arm64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-win32-arm64-msvc", - "version": "1.1.5", + "version": "0.0.0", "os": [ "win32" ], diff --git a/npm/win32-ia32-msvc/package.json b/npm/win32-ia32-msvc/package.json index d462d67..72b3ea9 100644 --- a/npm/win32-ia32-msvc/package.json +++ b/npm/win32-ia32-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-win32-ia32-msvc", - "version": "1.1.5", + "version": "0.0.0", "os": [ "win32" ], diff --git a/npm/win32-x64-msvc/package.json b/npm/win32-x64-msvc/package.json index ac93fdc..6bcbbbc 100644 --- a/npm/win32-x64-msvc/package.json +++ b/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@rrule-rust/lib-win32-x64-msvc", - "version": "1.1.5", + "version": "0.0.0", "os": [ "win32" ], diff --git a/package.json b/package.json index 4f66e45..3ed2380 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rrule-rust", - "version": "1.1.5", + "version": "0.0.0", "main": "index.js", "types": "index.d.ts", "keywords": [ From e27a2f44e1e2861bc04cda9d13c9e277ca6c11f6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 27 Apr 2024 01:22:27 +0700 Subject: [PATCH 12/63] build(npm): do not publish dev files (#106) --- .npmignore | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/.npmignore b/.npmignore index ec144db..e5af721 100644 --- a/.npmignore +++ b/.npmignore @@ -1,13 +1,3 @@ -target -Cargo.lock -.cargo -.github -npm -.eslintrc -.prettierignore -rustfmt.toml -yarn.lock -*.node -.yarn -__test__ -renovate.json +* +!index.d.ts +!index.js From e1aa8a331962609538229c54e16f225ea464e5f1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 2 May 2024 20:22:53 +0700 Subject: [PATCH 13/63] chore: migrate to npm (#107) closes #22 --- .github/workflows/build-and-test.yml | 98 +- .github/workflows/pr.yml | 6 +- .github/workflows/release.yml | 6 +- package-lock.json | 14342 +++++++++++++++++++++++++ package.json | 2 +- yarn.lock | 6862 ------------ 6 files changed, 14393 insertions(+), 6923 deletions(-) create mode 100644 package-lock.json delete mode 100644 yarn.lock diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 873ab3e..569a072 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -14,38 +14,38 @@ jobs: - host: macos-latest target: x86_64-apple-darwin build: | - yarn build --target x86_64-apple-darwin + npm run build -- --target x86_64-apple-darwin strip -x *.node - host: windows-latest - build: yarn build + build: npm run build target: x86_64-pc-windows-msvc - host: windows-latest build: | - yarn build --target i686-pc-windows-msvc - yarn test + npm run build -- --target i686-pc-windows-msvc + npm test target: i686-pc-windows-msvc - host: ubuntu-latest target: x86_64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian build: |- set -e && - yarn build --target x86_64-unknown-linux-gnu && + npm run build -- --target x86_64-unknown-linux-gnu && strip *.node - host: ubuntu-latest target: x86_64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine - build: set -e && yarn build && strip *.node + build: set -e && npm run build && strip *.node - host: macos-latest target: aarch64-apple-darwin build: | - yarn build + npm run build strip -x *.node - host: ubuntu-latest target: aarch64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 build: |- set -e && - yarn build --target aarch64-unknown-linux-gnu && + npm run build -- --target aarch64-unknown-linux-gnu && aarch64-unknown-linux-gnu-strip *.node - host: ubuntu-latest target: armv7-unknown-linux-gnueabihf @@ -53,17 +53,17 @@ jobs: sudo apt-get update sudo apt-get install gcc-arm-linux-gnueabihf -y build: | - yarn build --target armv7-unknown-linux-gnueabihf + npm run build -- --target armv7-unknown-linux-gnueabihf arm-linux-gnueabihf-strip *.node - host: ubuntu-latest target: aarch64-linux-android build: | - yarn build --target aarch64-linux-android + npm run build -- --target aarch64-linux-android ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node - host: ubuntu-latest target: armv7-linux-androideabi build: | - yarn build --target armv7-linux-androideabi + npm run build -- --target armv7-linux-androideabi ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node - host: ubuntu-latest target: aarch64-unknown-linux-musl @@ -71,11 +71,11 @@ jobs: build: |- set -e && rustup target add aarch64-unknown-linux-musl && - yarn build --target aarch64-unknown-linux-musl && + npm run build -- --target aarch64-unknown-linux-musl && /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node - host: windows-latest target: aarch64-pc-windows-msvc - build: yarn build --target aarch64-pc-windows-msvc + build: npm run build -- --target aarch64-pc-windows-msvc name: stable - ${{ matrix.settings.target }} - node@18 runs-on: ${{ matrix.settings.host }} steps: @@ -86,7 +86,7 @@ jobs: with: node-version: 18 check-latest: true - cache: yarn + cache: npm - name: Install uses: dtolnay/rust-toolchain@stable if: ${{ !matrix.settings.docker }} @@ -111,19 +111,20 @@ jobs: run: ${{ matrix.settings.setup }} if: ${{ matrix.settings.setup }} shell: bash - - name: Setup node x86 + - name: Install dependencies (x86) if: matrix.settings.target == 'i686-pc-windows-msvc' - run: yarn config set supportedArchitectures.cpu "ia32" + run: npm ci --cpu "ia32" shell: bash - name: Install dependencies - run: yarn install + if: matrix.settings.target != 'i686-pc-windows-msvc' + run: npm ci - name: Setup node x86 uses: actions/setup-node@v3 if: matrix.settings.target == 'i686-pc-windows-msvc' with: node-version: 18 check-latest: true - cache: yarn + cache: npm architecture: x86 - name: Build in docker uses: addnab/docker-run-action@v3 @@ -162,7 +163,6 @@ jobs: shell: bash run: | sudo pkg install -y -f curl node libnghttp2 npm - sudo npm install -g yarn --ignore-scripts curl https://sh.rustup.rs -sSf --output rustup.sh sh rustup.sh -y --profile minimal --default-toolchain beta source "$HOME/.cargo/env" @@ -170,18 +170,17 @@ jobs: rustc --version echo "~~~~ node -v ~~~~" node -v - echo "~~~~ yarn --version ~~~~" - yarn --version + echo "~~~~ npm --version ~~~~" + npm --version pwd ls -lah whoami env freebsd-version - yarn install - yarn build + npm ci + npm run build rm -rf node_modules rm -rf target - rm -rf .yarn/cache - name: Upload artifact uses: actions/upload-artifact@v3 with: @@ -210,12 +209,12 @@ jobs: with: node-version: ${{ matrix.node }} check-latest: true - cache: yarn + cache: npm - name: Install dependencies run: | # Remove semantic-release because it's not compatible with Node 14 - yarn remove semantic-release @semantic-release/git conventional-changelog-conventionalcommits - yarn install + npm uninstall semantic-release @semantic-release/git conventional-changelog-conventionalcommits + npm ci - name: Download artifacts uses: actions/download-artifact@v3 with: @@ -225,7 +224,7 @@ jobs: run: ls -R . shell: bash - name: Test bindings - run: yarn test + run: npm test test-linux-x64-gnu-binding: name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} needs: @@ -245,12 +244,12 @@ jobs: with: node-version: ${{ matrix.node }} check-latest: true - cache: yarn + cache: npm - name: Install dependencies run: | # Remove semantic-release because it's not compatible with Node 14 - yarn remove semantic-release @semantic-release/git conventional-changelog-conventionalcommits - yarn install + npm uninstall semantic-release @semantic-release/git conventional-changelog-conventionalcommits + npm install - name: Download artifacts uses: actions/download-artifact@v3 with: @@ -260,7 +259,7 @@ jobs: run: ls -R . shell: bash - name: Test bindings - run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim yarn test + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim npm test test-linux-x64-musl-binding: name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }} needs: @@ -280,13 +279,12 @@ jobs: with: node-version: ${{ matrix.node }} check-latest: true - cache: yarn + cache: npm - name: Install dependencies run: | # Remove semantic-release because it's not compatible with Node 14 - yarn remove semantic-release @semantic-release/git conventional-changelog-conventionalcommits - yarn config set supportedArchitectures.libc "musl" - yarn install + npm uninstall semantic-release @semantic-release/git conventional-changelog-conventionalcommits + npm ci --libc "musl" - name: Download artifacts uses: actions/download-artifact@v3 with: @@ -296,7 +294,7 @@ jobs: run: ls -R . shell: bash - name: Test bindings - run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine yarn test + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine npm test test-linux-aarch64-gnu-binding: name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} needs: @@ -320,10 +318,7 @@ jobs: run: ls -R . shell: bash - name: Install dependencies - run: | - yarn config set supportedArchitectures.cpu "arm64" - yarn config set supportedArchitectures.libc "glibc" - yarn install + run: npm ci --cpu "arm64" --libc "glibc" - name: Set up QEMU uses: docker/setup-qemu-action@v2 with: @@ -336,7 +331,7 @@ jobs: options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build' run: | set -e - yarn test + npm test ls -la test-linux-aarch64-musl-binding: name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} @@ -354,10 +349,7 @@ jobs: run: ls -R . shell: bash - name: Install dependencies - run: | - yarn config set supportedArchitectures.cpu "arm64" - yarn config set supportedArchitectures.libc "musl" - yarn install + run: npm ci --cpu "arm64" --libc "musl" - name: Set up QEMU uses: docker/setup-qemu-action@v2 with: @@ -370,7 +362,7 @@ jobs: options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build' run: | set -e - yarn test + npm test test-linux-arm-gnueabihf-binding: name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }} needs: @@ -394,9 +386,7 @@ jobs: run: ls -R . shell: bash - name: Install dependencies - run: | - yarn config set supportedArchitectures.cpu "arm" - yarn install + run: npm ci --cpu "arm" - name: Set up QEMU uses: docker/setup-qemu-action@v2 with: @@ -409,7 +399,7 @@ jobs: options: '--platform linux/arm/v7 -v ${{ github.workspace }}:/build -w /build' run: | set -e - yarn test + npm test ls -la universal-macOS: name: Build universal macOS binary @@ -423,9 +413,9 @@ jobs: with: node-version: 18 check-latest: true - cache: yarn + cache: npm - name: Install dependencies - run: yarn install + run: npm ci - name: Download macOS x64 artifact uses: actions/download-artifact@v3 with: @@ -437,7 +427,7 @@ jobs: name: bindings-aarch64-apple-darwin path: artifacts - name: Combine binaries - run: yarn universal + run: npm run universal - name: Upload artifact uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 67af3cf..0045fa4 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -14,12 +14,12 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.x - cache: 'yarn' + cache: 'npm' - name: Install run: | - yarn install --frozen-lockfile + npm ci - name: Lint run: | - yarn lint + npm run lint build_and_test: uses: ./.github/workflows/build-and-test.yml \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ed8dea7..43f1212 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,15 +31,15 @@ jobs: uses: actions/setup-node@v3 with: node-version: "lts/*" - cache: "yarn" + cache: "npm" - name: Install dependencies - run: yarn install --frozen-lockfile + run: npm ci - name: Download all artifacts uses: actions/download-artifact@v3 with: path: artifacts - name: Move artifacts - run: yarn artifacts + run: npm run artifacts - name: List packages run: ls -R ./npm shell: bash diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..aadee33 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14342 @@ +{ + "name": "rrule-rust", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rrule-rust", + "version": "0.0.0", + "license": "MIT", + "devDependencies": { + "@napi-rs/cli": "^2.15.1", + "@semantic-release/git": "^10.0.1", + "@types/jest": "^29.5.0", + "@types/node": "^18.15.5", + "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/parser": "^5.50.0", + "benny": "^3.7.1", + "conventional-changelog-conventionalcommits": "^7.0.2", + "eslint": "^8.33.0", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^29.5.0", + "lint-staged": "^13.1.0", + "pre-commit": "^1.2.2", + "prettier": "^2.8.3", + "rrule": "^2.7.2", + "semantic-release": "^22.0.12", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "typescript": "^4.9.4" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@arrows/array": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@arrows/array/-/array-1.4.1.tgz", + "integrity": "sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@arrows/composition": "^1.2.2" + } + }, + "node_modules/@arrows/composition": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@arrows/composition/-/composition-1.2.2.tgz", + "integrity": "sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@arrows/dispatch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@arrows/dispatch/-/dispatch-1.0.3.tgz", + "integrity": "sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@arrows/composition": "^1.2.2" + } + }, + "node_modules/@arrows/error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@arrows/error/-/error-1.0.2.tgz", + "integrity": "sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@arrows/multimethod": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@arrows/multimethod/-/multimethod-1.4.1.tgz", + "integrity": "sha512-AZnAay0dgPnCJxn3We5uKiB88VL+1ZIF2SjZohLj6vqY2UyvB/sKdDnFP+LZNVsTC5lcnGPmLlRRkAh4sXkXsQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@arrows/array": "^1.4.1", + "@arrows/composition": "^1.2.2", + "@arrows/error": "^1.0.2", + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-function-name/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-function-name/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/helper-function-name/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-function-name/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-function-name/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/traverse/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/reporters/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@napi-rs/cli": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.0.tgz", + "integrity": "sha512-lfSRT7cs3iC4L+kv9suGYQEezn5Nii7Kpu+THsYVI0tA1Vh59LH45p4QADaD7hvIkmOz79eEGtoKQ9nAkAPkzA==", + "dev": true, + "license": "MIT", + "bin": { + "napi": "scripts/index.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", + "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", + "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.4.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz", + "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz", + "integrity": "sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.2.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", + "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", + "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^19.1.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@semantic-release/commit-analyzer": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz", + "integrity": "sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "debug": "^4.0.0", + "import-from-esm": "^1.0.3", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@semantic-release/git": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", + "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" + } + }, + "node_modules/@semantic-release/git/node_modules/@semantic-release/error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", + "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@semantic-release/git/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/git/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@semantic-release/git/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@semantic-release/git/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@semantic-release/git/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/git/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/git/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/git/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@semantic-release/github": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", + "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-retry": "^6.0.0", + "@octokit/plugin-throttling": "^8.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", + "globby": "^14.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^6.0.0", + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "url-join": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/github/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@semantic-release/github/node_modules/globby": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.2.tgz", + "integrity": "sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "execa": "^8.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^8.0.0", + "npm": "^10.0.0", + "rc": "^1.2.8", + "read-pkg": "^9.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" + }, + "engines": { + "node": "^18.17 || >=20" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@semantic-release/release-notes-generator": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.1.0.tgz", + "integrity": "sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-changelog-writer": "^7.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "debug": "^4.0.0", + "get-stream": "^7.0.0", + "import-from-esm": "^1.0.3", + "into-stream": "^7.0.0", + "lodash-es": "^4.17.21", + "read-pkg-up": "^11.0.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", + "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.15.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", + "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.23.tgz", + "integrity": "sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "node_modules/benny": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.1.tgz", + "integrity": "sha512-USzYxODdVfOS7JuQq/L0naxB788dWCiUgUTxvN+WLPt/JfcDURNNj8kN/N+uK6PDvuR67/9/55cVKGPleFQINA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@arrows/composition": "^1.0.0", + "@arrows/dispatch": "^1.0.2", + "@arrows/multimethod": "^1.1.6", + "benchmark": "^2.1.4", + "common-tags": "^1.8.0", + "fs-extra": "^10.0.0", + "json2csv": "^5.0.6", + "kleur": "^4.1.4", + "log-update": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001469", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz", + "integrity": "sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", + "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^4.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^12.0.1", + "semver": "^7.5.2", + "split2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", + "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.339", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.339.tgz", + "integrity": "sha512-MSXHBJGcbBydq/DQDlpBeUKnJ6C7aTiNCTRpfDV5Iz0sNr/Ng6RJFloq82AAicp/SrmDq4zF6XsKG0B8Xwn1UQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-ci": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", + "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-eslint-comments": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, + "engines": { + "node": ">=6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figures": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.0.1.tgz", + "integrity": "sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^4.0.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic/node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + } + }, + "node_modules/git-log-parser/node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dev": true, + "license": "ISC", + "dependencies": { + "through2": "~2.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hasown/node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hook-std": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", + "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from-esm": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.3.tgz", + "integrity": "sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=16.20" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/into-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", + "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@types/node": { + "version": "18.15.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@types/node": { + "version": "18.15.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", + "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json2csv": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.7.tgz", + "integrity": "sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^6.1.0", + "jsonparse": "^1.3.1", + "lodash.get": "^4.4.2" + }, + "bin": { + "json2csv": "bin/json2csv.js" + }, + "engines": { + "node": ">= 10", + "npm": ">= 6.13.0" + } + }, + "node_modules/json2csv/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", + "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marked": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/marked-terminal": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", + "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <12" + } + }, + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/marked-terminal/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz", + "integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.5.tgz", + "integrity": "sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "strip-ansi", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.2.1", + "@npmcli/config": "^8.0.2", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.4", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.2", + "@sigstore/tuf": "^2.2.0", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.1", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.1", + "ini": "^4.1.1", + "init-package-json": "^6.0.0", + "is-cidr": "^5.0.3", + "json-parse-even-better-errors": "^3.0.1", + "libnpmaccess": "^8.0.1", + "libnpmdiff": "^6.0.3", + "libnpmexec": "^7.0.4", + "libnpmfund": "^5.0.1", + "libnpmhook": "^10.0.0", + "libnpmorg": "^6.0.1", + "libnpmpack": "^6.0.3", + "libnpmpublish": "^9.0.2", + "libnpmsearch": "^7.0.0", + "libnpmteam": "^6.0.0", + "libnpmversion": "^5.0.1", + "make-fetch-happen": "^13.0.0", + "minimatch": "^9.0.3", + "minipass": "^7.0.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.0.1", + "nopt": "^7.2.0", + "normalize-package-data": "^6.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-profile": "^9.0.0", + "npm-registry-fetch": "^16.1.0", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^17.0.5", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.1.0", + "semver": "^7.5.4", + "spdx-expression-parse": "^3.0.1", + "ssri": "^10.0.5", + "strip-ansi": "^7.1.0", + "supports-color": "^9.4.0", + "tar": "^6.2.0", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", + "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.2.2.tgz", + "integrity": "sha512-dIIzyhy1zS2dYPS8bdM/8qA8W2evQE9KENBxVOhFthm/2RKqf2ninRWQc8xfc5f1gsiTxTP20Y9flIfziHfSKA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/query": "^3.0.1", + "@npmcli/run-script": "^7.0.2", + "bin-links": "^4.0.1", + "cacache": "^18.0.0", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.5", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.3.tgz", + "integrity": "sha512-rqRX7/UORvm2YRImY67kyfwD9rpi5+KXXb1j/cpTUKRcUqvpJ9/PMMc7Vv57JVqmrFj8siBBFEmXI3Gg7/TonQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^4.0.0", + "ini": "^4.1.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz", + "integrity": "sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.3.tgz", + "integrity": "sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", + "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.0.0.tgz", + "integrity": "sha512-Pw0tyX02VkpqlIQlG2TeiJNsdrecYeUU0ubZZa9pi3N37GCsxI+en43u4hYFdq+eSx1A9a9vwFAUyqEtKFsbHQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^17.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.0.0.tgz", + "integrity": "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz", + "integrity": "sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.1.tgz", + "integrity": "sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.2.tgz", + "integrity": "sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", + "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz", + "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", + "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", + "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.3.tgz", + "integrity": "sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.1.tgz", + "integrity": "sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-4.0.3.tgz", + "integrity": "sha512-HOwDIy/rhKeMf6uOzxtv7FAbrz8zPjmVKfSpM+U7/bNBXC5rtOyr758jxcptiSx6ZZn5LOhPJT5WWxPAGDV8dw==", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz", + "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.2.tgz", + "integrity": "sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/gauge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", + "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.0.tgz", + "integrity": "sha512-AmXD+Aht5iZGo/y1KUtZSUQ1SltesXHxQuc7qeNz0eUGx/8WgkHeeQLSFdM8l9YpmnnamGIbAxVdAs2xoLRKRQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-5.0.3.tgz", + "integrity": "sha512-lKkM0tmz07dAxNsr8Ii9MGreExa9ZR34N9j8mTG5op824kcwBqinZPowNjcVWWc7j+jR8XAMMItOmBkniN0jOA==", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "4.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.2.tgz", + "integrity": "sha512-4K+nsg3OYt4rjryP/3D5zGWluLbZaKozwj6YdtvAyxNhLhUrjCoyxHVoL5AkTJcAnjsd6/ATei52QPVvpSX9Ug==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-6.0.4.tgz", + "integrity": "sha512-xLLNTMKbZdE41wi/MZLTYiDYOKRbGS4IU8WgvHPQ001KKlZEa+6Y6C/WVNcRYY5PLh646rtcHlJYYgaAUMFRZQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^9.0.0", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4", + "tar": "^6.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/libnpmexec/-/libnpmexec-7.0.5.tgz", + "integrity": "sha512-I0a07CiQ2LTKhjd2ZnYQafe9YQrod/GD2uZ1H//j22PBJvIJPUOJdzuqHyoNB/4/6KILaZNX01Mb6dhp8Vr9rw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.1", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/libnpmfund/-/libnpmfund-5.0.2.tgz", + "integrity": "sha512-rKILSU9zQMkSIAst3QaoqqomqD6NosKALuXjx4hSjt2VUqrzFrGcAu1/e3YCBVdyFo80HFvGbx0AwooXXLilMQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-10.0.1.tgz", + "integrity": "sha512-FnXCweDpoAko6mnLPSW8qrRYicjfh+GrvY5PuYHQRPvaW4BFtHDUmK3K3aYx4yD3TeGAKpj4IigrEDfUfWuSkA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-6.0.2.tgz", + "integrity": "sha512-zK4r6cjVsfXf7hWzWGB6R0LBJidVhKaeMWMZL/1eyZS6ixxAxVijfsPacoEnBRCFaXsNjAtwV3b2RCmYU6+usA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/libnpmpack/-/libnpmpack-6.0.4.tgz", + "integrity": "sha512-fvwmLPR5vveBeBFdbb5UGHgXSRIjI/JWGIT9JyAXE7ax1GAPdsMSgAP8/OBZat2pQGJhKjRHL5tgvwZ1u6Vi7Q==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.3.tgz", + "integrity": "sha512-XoF0QgT1Ph9RMBfTwiwZeRN4Rs5t4w1POaRxaoVoWCMUqysswwlAPu3ZZJDNbh7asXBWXcXTJziDWkInhpbiBg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.0", + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^2.1.0", + "ssri": "^10.0.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-7.0.1.tgz", + "integrity": "sha512-XyKi6Y94t6PGd5Lk2Ma3+fgiHWD3KSCvXmHOrcLkAOEP7oUejbNjL0Bb/HUDZXgBj6gP1Qk7pJ6jZPFBc2hmXQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-6.0.1.tgz", + "integrity": "sha512-1YytqVk1gSkKFNMe4kkCKN49y5rlABrRSx5TrYShQtt2Lb4uQaed49dGE7Ue8TJGxbIkHzvyyVtb3PBiGACVqw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/libnpmversion/-/libnpmversion-5.0.2.tgz", + "integrity": "sha512-6JBnLhd6SYgKRekJ4cotxpURLGbEtKxzw+a8p5o+wNwrveJPMH8yW/HKjeewyHzWmxzzwn9EQ3TkF2onkrwstA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.3", + "@npmcli/run-script": "^7.0.2", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-5.0.0.tgz", + "integrity": "sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.1.tgz", + "integrity": "sha512-MQpL27ZrsJQ2kiAuQPpZb5LtJwydNRnI15QWXsf3WHERu4rzjRj6Zju/My2fov7tLuu3Gle/uoIX/DDZ3u4O4Q==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-9.0.0.tgz", + "integrity": "sha512-qv43ixsJ7vndzfxD3XsPNu1Njck6dhO7q1efksTo+0DiOQysKSOsIhK/qDD1/xO2o+2jDOA4Rv/zOJ9KQFs9nw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-2.0.0.tgz", + "integrity": "sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q==", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.5.tgz", + "integrity": "sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.0.tgz", + "integrity": "sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read/-/read-2.1.0.tgz", + "integrity": "sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "4.4.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", + "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.1.0", + "@sigstore/tuf": "^2.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz", + "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", + "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/p-each-series": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.0.0.tgz", + "integrity": "sha512-3gxOrNadcyxj+YKFyRmRIEuCMGayNNJoXL7Zf1dqfdfoDsVB190bHfFfhqfcNEDFLfQP1q2uir2cBgIqnIT+cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.0.tgz", + "integrity": "sha512-EZl03dLKv3RypkrjlevZoNwQMSy4bAblWcR18zhonktnN4fUs3asFQKSe0awn982omGxamvbejqQKQYDJYHCEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "node_modules/pre-commit/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-commit/node_modules/cross-spawn/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/pre-commit/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/pre-commit/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/pre-commit/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", + "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-11.0.0.tgz", + "integrity": "sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/read-pkg/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/read-pkg/node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/read-pkg/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/read-pkg/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/read-pkg/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rrule": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.7.2.tgz", + "integrity": "sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semantic-release": { + "version": "22.0.12", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", + "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/commit-analyzer": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^9.0.0", + "@semantic-release/npm": "^11.0.0", + "@semantic-release/release-notes-generator": "^12.0.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^8.0.0", + "debug": "^4.0.0", + "env-ci": "^10.0.0", + "execa": "^8.0.0", + "figures": "^6.0.0", + "find-versions": "^5.1.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^3.0.0", + "hosted-git-info": "^7.0.0", + "import-from-esm": "^1.3.1", + "lodash-es": "^4.17.21", + "marked": "^9.0.0", + "marked-terminal": "^6.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-pkg-up": "^11.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^4.0.0", + "signale": "^1.2.1", + "yargs": "^17.5.1" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tempy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-jest": { + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array/node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array/node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 3ed2380..60c56c5 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "version": "napi version", "benchmark": "ts-node ./benchmark/index.ts", "lint": "cargo fmt --all -- --check && eslint \"**/*.{js,ts,json}\" --max-warnings=0", - "lint:fix": "cargo fmt --all && yarn lint --fix", + "lint:fix": "cargo fmt --all && npm run lint --fix", "lint:fix-staged": "lint-staged" } } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 469b0d4..0000000 --- a/yarn.lock +++ /dev/null @@ -1,6862 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@arrows/array@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@arrows/array/-/array-1.4.1.tgz#a6580a08cee219755ca9a8eb14e956d3c29a5508" - integrity sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g== - dependencies: - "@arrows/composition" "^1.2.2" - -"@arrows/composition@^1.0.0", "@arrows/composition@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@arrows/composition/-/composition-1.2.2.tgz#d0a213cac8f8c36c1c75856a1e6ed940c27e9169" - integrity sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ== - -"@arrows/dispatch@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@arrows/dispatch/-/dispatch-1.0.3.tgz#c4c06260f89e9dd4ce280df3712980aa2f3de976" - integrity sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw== - dependencies: - "@arrows/composition" "^1.2.2" - -"@arrows/error@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@arrows/error/-/error-1.0.2.tgz#4e68036f901118ba6f1de88656ef6be49e650414" - integrity sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA== - -"@arrows/multimethod@^1.1.6": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@arrows/multimethod/-/multimethod-1.4.1.tgz#319d0b6f84d22522dd2f4b24f04137b6219f0300" - integrity sha512-AZnAay0dgPnCJxn3We5uKiB88VL+1ZIF2SjZohLj6vqY2UyvB/sKdDnFP+LZNVsTC5lcnGPmLlRRkAh4sXkXsQ== - dependencies: - "@arrows/array" "^1.4.1" - "@arrows/composition" "^1.2.2" - "@arrows/error" "^1.0.2" - fast-deep-equal "^3.1.3" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" - integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.3" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.3" - "@babel/types" "^7.21.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.21.3", "@babel/generator@^7.7.2": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" - integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== - dependencies: - "@babel/types" "^7.21.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== - dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" - integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" - integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" - integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" - integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" - integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz#a556790523a351b4e47e9d385f47265eaaf9780a" - integrity sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== - -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== - dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@isaacs/string-locale-compare@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" - integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.5.0", "@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.18": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@napi-rs/cli@^2.15.1": - version "2.18.0" - resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-2.18.0.tgz#3064f142e65c87d14e6ddc38e5425aa29a8871eb" - integrity sha512-lfSRT7cs3iC4L+kv9suGYQEezn5Nii7Kpu+THsYVI0tA1Vh59LH45p4QADaD7hvIkmOz79eEGtoKQ9nAkAPkzA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/agent@^2.0.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.0.tgz#e81f00fdb2a670750ff7731bbefb47ecbf0ccf44" - integrity sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q== - dependencies: - agent-base "^7.1.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.1" - lru-cache "^10.0.1" - socks-proxy-agent "^8.0.1" - -"@npmcli/arborist@^7.2.1": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-7.2.2.tgz#b1de598b4b4aaf3e05460c0b94565d1966b5f5ed" - integrity sha512-dIIzyhy1zS2dYPS8bdM/8qA8W2evQE9KENBxVOhFthm/2RKqf2ninRWQc8xfc5f1gsiTxTP20Y9flIfziHfSKA== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/fs" "^3.1.0" - "@npmcli/installed-package-contents" "^2.0.2" - "@npmcli/map-workspaces" "^3.0.2" - "@npmcli/metavuln-calculator" "^7.0.0" - "@npmcli/name-from-folder" "^2.0.0" - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/package-json" "^5.0.0" - "@npmcli/query" "^3.0.1" - "@npmcli/run-script" "^7.0.2" - bin-links "^4.0.1" - cacache "^18.0.0" - common-ancestor-path "^1.0.1" - hosted-git-info "^7.0.1" - json-parse-even-better-errors "^3.0.0" - json-stringify-nice "^1.1.4" - minimatch "^9.0.0" - nopt "^7.0.0" - npm-install-checks "^6.2.0" - npm-package-arg "^11.0.1" - npm-pick-manifest "^9.0.0" - npm-registry-fetch "^16.0.0" - npmlog "^7.0.1" - pacote "^17.0.4" - parse-conflict-json "^3.0.0" - proc-log "^3.0.0" - promise-all-reject-late "^1.0.0" - promise-call-limit "^1.0.2" - read-package-json-fast "^3.0.2" - semver "^7.3.7" - ssri "^10.0.5" - treeverse "^3.0.0" - walk-up-path "^3.0.1" - -"@npmcli/config@^8.0.2": - version "8.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-8.0.3.tgz#deacc4217060f3bf3e751cfdc5dd91481595aecd" - integrity sha512-rqRX7/UORvm2YRImY67kyfwD9rpi5+KXXb1j/cpTUKRcUqvpJ9/PMMc7Vv57JVqmrFj8siBBFEmXI3Gg7/TonQ== - dependencies: - "@npmcli/map-workspaces" "^3.0.2" - ci-info "^4.0.0" - ini "^4.1.0" - nopt "^7.0.0" - proc-log "^3.0.0" - read-package-json-fast "^3.0.2" - semver "^7.3.5" - walk-up-path "^3.0.1" - -"@npmcli/disparity-colors@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz#60ea8c6eb5ba9de2d1950e15b06205b2c3ab7833" - integrity sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg== - dependencies: - ansi-styles "^4.3.0" - -"@npmcli/fs@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" - integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== - dependencies: - semver "^7.3.5" - -"@npmcli/git@^5.0.0", "@npmcli/git@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.3.tgz#ad3ede0994bcf716ddb63d361f3ea16cb72d878c" - integrity sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw== - dependencies: - "@npmcli/promise-spawn" "^7.0.0" - lru-cache "^10.0.1" - npm-pick-manifest "^9.0.0" - proc-log "^3.0.0" - promise-inflight "^1.0.1" - promise-retry "^2.0.1" - semver "^7.3.5" - which "^4.0.0" - -"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" - integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== - dependencies: - npm-bundled "^3.0.0" - npm-normalize-package-bin "^3.0.0" - -"@npmcli/map-workspaces@^3.0.2", "@npmcli/map-workspaces@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" - integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== - dependencies: - "@npmcli/name-from-folder" "^2.0.0" - glob "^10.2.2" - minimatch "^9.0.0" - read-package-json-fast "^3.0.0" - -"@npmcli/metavuln-calculator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-7.0.0.tgz#fb59245926d7f677db904177f9aca15ac883d6cb" - integrity sha512-Pw0tyX02VkpqlIQlG2TeiJNsdrecYeUU0ubZZa9pi3N37GCsxI+en43u4hYFdq+eSx1A9a9vwFAUyqEtKFsbHQ== - dependencies: - cacache "^18.0.0" - json-parse-even-better-errors "^3.0.0" - pacote "^17.0.0" - semver "^7.3.5" - -"@npmcli/name-from-folder@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" - integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== - -"@npmcli/node-gyp@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" - integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== - -"@npmcli/package-json@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.0.0.tgz#77d0f8b17096763ccbd8af03b7117ba6e34d6e91" - integrity sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g== - dependencies: - "@npmcli/git" "^5.0.0" - glob "^10.2.2" - hosted-git-info "^7.0.0" - json-parse-even-better-errors "^3.0.0" - normalize-package-data "^6.0.0" - proc-log "^3.0.0" - semver "^7.5.3" - -"@npmcli/promise-spawn@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz#fd1c64ed4ff2341e503e1f390c62640a6540df09" - integrity sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ== - dependencies: - which "^4.0.0" - -"@npmcli/query@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.1.tgz#77d63ceb7d27ed748da3cc8b50d45fc341448ed6" - integrity sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA== - dependencies: - postcss-selector-parser "^6.0.10" - -"@npmcli/run-script@^7.0.0", "@npmcli/run-script@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.2.tgz#497e7f058799497889df65900c711312252276d3" - integrity sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w== - dependencies: - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/promise-spawn" "^7.0.0" - node-gyp "^10.0.0" - read-package-json-fast "^3.0.0" - which "^4.0.0" - -"@octokit/auth-token@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" - integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== - -"@octokit/core@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.2.tgz#ae7c5d61fdd98ba348a27c3cc510879a130b1234" - integrity sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg== - dependencies: - "@octokit/auth-token" "^4.0.0" - "@octokit/graphql" "^7.0.0" - "@octokit/request" "^8.0.2" - "@octokit/request-error" "^5.0.0" - "@octokit/types" "^12.0.0" - before-after-hook "^2.2.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^9.0.0": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.4.tgz#8afda5ad1ffc3073d08f2b450964c610b821d1ea" - integrity sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw== - dependencies: - "@octokit/types" "^12.0.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^7.0.0": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.0.2.tgz#3df14b9968192f9060d94ed9e3aa9780a76e7f99" - integrity sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q== - dependencies: - "@octokit/request" "^8.0.1" - "@octokit/types" "^12.0.0" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^19.1.0": - version "19.1.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" - integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== - -"@octokit/plugin-paginate-rest@^9.0.0": - version "9.1.5" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz#1705bcef4dcde1f4015ee58a63dc61b68648f480" - integrity sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg== - dependencies: - "@octokit/types" "^12.4.0" - -"@octokit/plugin-retry@^6.0.0": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz#3257404f7cc418e1c1f13a7f2012c1db848b7693" - integrity sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog== - dependencies: - "@octokit/request-error" "^5.0.0" - "@octokit/types" "^12.0.0" - bottleneck "^2.15.3" - -"@octokit/plugin-throttling@^8.0.0": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz#7fb0e001c0cb9383c6be07740b8ec326ed990f6b" - integrity sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A== - dependencies: - "@octokit/types" "^12.2.0" - bottleneck "^2.15.3" - -"@octokit/request-error@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.1.tgz#277e3ce3b540b41525e07ba24c5ef5e868a72db9" - integrity sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ== - dependencies: - "@octokit/types" "^12.0.0" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^8.0.1", "@octokit/request@^8.0.2": - version "8.1.6" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.6.tgz#a76a859c30421737a3918b40973c2ff369009571" - integrity sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ== - dependencies: - "@octokit/endpoint" "^9.0.0" - "@octokit/request-error" "^5.0.0" - "@octokit/types" "^12.0.0" - universal-user-agent "^6.0.0" - -"@octokit/types@^12.0.0", "@octokit/types@^12.2.0", "@octokit/types@^12.4.0": - version "12.4.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.4.0.tgz#8f97b601e91ce6b9776ed8152217e77a71be7aac" - integrity sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ== - dependencies: - "@octokit/openapi-types" "^19.1.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pnpm/config.env-replace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" - integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== - -"@pnpm/network.ca-file@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" - integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== - dependencies: - graceful-fs "4.2.10" - -"@pnpm/npm-conf@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== - dependencies: - "@pnpm/config.env-replace" "^1.1.0" - "@pnpm/network.ca-file" "^1.0.1" - config-chain "^1.1.11" - -"@semantic-release/commit-analyzer@^11.0.0": - version "11.1.0" - resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz#dd24663c4e1e7c218f53de73f5c639eb2d5a077e" - integrity sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g== - dependencies: - conventional-changelog-angular "^7.0.0" - conventional-commits-filter "^4.0.0" - conventional-commits-parser "^5.0.0" - debug "^4.0.0" - import-from-esm "^1.0.3" - lodash-es "^4.17.21" - micromatch "^4.0.2" - -"@semantic-release/error@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-3.0.0.tgz#30a3b97bbb5844d695eb22f9d3aa40f6a92770c2" - integrity sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw== - -"@semantic-release/error@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-4.0.0.tgz#692810288239637f74396976a9340fbc0aa9f6f9" - integrity sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ== - -"@semantic-release/git@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@semantic-release/git/-/git-10.0.1.tgz#c646e55d67fae623875bf3a06a634dd434904498" - integrity sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w== - dependencies: - "@semantic-release/error" "^3.0.0" - aggregate-error "^3.0.0" - debug "^4.0.0" - dir-glob "^3.0.0" - execa "^5.0.0" - lodash "^4.17.4" - micromatch "^4.0.0" - p-reduce "^2.0.0" - -"@semantic-release/github@^9.0.0": - version "9.2.6" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-9.2.6.tgz#0b0b00ab3ab0486cd3aecb4ae2f9f9cf2edd8eae" - integrity sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA== - dependencies: - "@octokit/core" "^5.0.0" - "@octokit/plugin-paginate-rest" "^9.0.0" - "@octokit/plugin-retry" "^6.0.0" - "@octokit/plugin-throttling" "^8.0.0" - "@semantic-release/error" "^4.0.0" - aggregate-error "^5.0.0" - debug "^4.3.4" - dir-glob "^3.0.1" - globby "^14.0.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - issue-parser "^6.0.0" - lodash-es "^4.17.21" - mime "^4.0.0" - p-filter "^4.0.0" - url-join "^5.0.0" - -"@semantic-release/npm@^11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-11.0.2.tgz#6d50046df286572718484c9a66b2095277e2f650" - integrity sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA== - dependencies: - "@semantic-release/error" "^4.0.0" - aggregate-error "^5.0.0" - execa "^8.0.0" - fs-extra "^11.0.0" - lodash-es "^4.17.21" - nerf-dart "^1.0.0" - normalize-url "^8.0.0" - npm "^10.0.0" - rc "^1.2.8" - read-pkg "^9.0.0" - registry-auth-token "^5.0.0" - semver "^7.1.2" - tempy "^3.0.0" - -"@semantic-release/release-notes-generator@^12.0.0": - version "12.1.0" - resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-12.1.0.tgz#7fbe501188c7960db412b96a97c3d6cfb5788d12" - integrity sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg== - dependencies: - conventional-changelog-angular "^7.0.0" - conventional-changelog-writer "^7.0.0" - conventional-commits-filter "^4.0.0" - conventional-commits-parser "^5.0.0" - debug "^4.0.0" - get-stream "^7.0.0" - import-from-esm "^1.0.3" - into-stream "^7.0.0" - lodash-es "^4.17.21" - read-pkg-up "^11.0.0" - -"@sigstore/bundle@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.0.tgz#c6140ca97b68815edf7c4fb7bdbf58d656525c39" - integrity sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng== - dependencies: - "@sigstore/protobuf-specs" "^0.2.1" - -"@sigstore/protobuf-specs@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" - integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== - -"@sigstore/sign@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.2.0.tgz#4918207d8356877ab42d85d360d5729e9b3ec65a" - integrity sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA== - dependencies: - "@sigstore/bundle" "^2.1.0" - "@sigstore/protobuf-specs" "^0.2.1" - make-fetch-happen "^13.0.0" - -"@sigstore/tuf@^2.1.0", "@sigstore/tuf@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.2.0.tgz#ef636239687e41af3f2ce10667ab88f5ca6165b3" - integrity sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA== - dependencies: - "@sigstore/protobuf-specs" "^0.2.1" - tuf-js "^2.1.0" - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@sindresorhus/merge-streams@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz#9cd84cc15bc865a5ca35fcaae198eb899f7b5c90" - integrity sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw== - -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@tufjs/canonical-json@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" - integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== - -"@tufjs/models@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.0.tgz#c7ab241cf11dd29deb213d6817dabb8c99ce0863" - integrity sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg== - dependencies: - "@tufjs/canonical-json" "2.0.0" - minimatch "^9.0.3" - -"@types/babel__core@^7.1.14": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.0.tgz#337b90bbcfe42158f39c2fb5619ad044bbb518ac" - integrity sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@*": - version "18.15.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.6.tgz#af98ef4a36e7ac5f2d03040f3109fcce972bf6cb" - integrity sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA== - -"@types/node@^18.15.5": - version "18.15.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.5.tgz#3af577099a99c61479149b716183e70b5239324a" - integrity sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew== - -"@types/normalize-package-data@^2.4.3": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.23.tgz#a7db3a2062c95ca1a5e0d5d5ddb6521cbc649e35" - integrity sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.50.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.50.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== - dependencies: - debug "^4.3.4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -aggregate-error@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" - integrity sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw== - dependencies: - clean-stack "^5.2.0" - indent-string "^5.0.0" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" - integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== - dependencies: - type-fest "^3.0.0" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0, ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -archy@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -are-we-there-yet@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz#05a6fc0e5f70771b673e82b0f915616e0ace8fd3" - integrity sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA== - dependencies: - delegates "^1.0.0" - readable-stream "^4.1.0" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -argv-formatter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" - integrity sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" - -array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -before-after-hook@^2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" - integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== - -benchmark@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" - integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== - dependencies: - lodash "^4.17.4" - platform "^1.3.3" - -benny@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/benny/-/benny-3.7.1.tgz#964aaaf877e3ab658f79705422277b8471868e37" - integrity sha512-USzYxODdVfOS7JuQq/L0naxB788dWCiUgUTxvN+WLPt/JfcDURNNj8kN/N+uK6PDvuR67/9/55cVKGPleFQINA== - dependencies: - "@arrows/composition" "^1.0.0" - "@arrows/dispatch" "^1.0.2" - "@arrows/multimethod" "^1.1.6" - benchmark "^2.1.4" - common-tags "^1.8.0" - fs-extra "^10.0.0" - json2csv "^5.0.6" - kleur "^4.1.4" - log-update "^4.0.0" - -bin-links@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.3.tgz#9e4a3c5900830aee3d7f52178b65e01dcdde64a5" - integrity sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA== - dependencies: - cmd-shim "^6.0.0" - npm-normalize-package-bin "^3.0.0" - read-cmd-shim "^4.0.0" - write-file-atomic "^5.0.0" - -binary-extensions@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bottleneck@^2.15.3: - version "2.19.5" - resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" - integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -builtins@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== - dependencies: - semver "^7.0.0" - -cacache@^18.0.0, cacache@^18.0.1: - version "18.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.1.tgz#b026d56ad569e4f73cc07c813b3c66707d0fb142" - integrity sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^10.0.1" - minipass "^7.0.3" - minipass-collect "^2.0.1" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== - dependencies: - function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001449: - version "1.0.30001469" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz#3dd505430c8522fdc9f94b4a19518e330f5c945a" - integrity sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g== - -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - -chalk@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== - -chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -ci-info@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" - integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== - -cidr-regex@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-4.0.3.tgz#07b52c9762d1ff546a50740e92fc2b5b13a6d871" - integrity sha512-HOwDIy/rhKeMf6uOzxtv7FAbrz8zPjmVKfSpM+U7/bNBXC5rtOyr758jxcptiSx6ZZn5LOhPJT5WWxPAGDV8dw== - dependencies: - ip-regex "^5.0.0" - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -clean-stack@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" - integrity sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ== - dependencies: - escape-string-regexp "5.0.0" - -cli-columns@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646" - integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ== - dependencies: - string-width "^4.2.3" - strip-ansi "^6.0.1" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-table3@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -cmd-shim@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.2.tgz#435fd9e5c95340e61715e19f90209ed6fcd9e0a4" - integrity sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colorette@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -columnify@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" - integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== - dependencies: - strip-ansi "^6.0.1" - wcwidth "^1.0.0" - -commander@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" - integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== - -commander@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -common-ancestor-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" - integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== - -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.4.7: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -conventional-changelog-angular@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" - integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-conventionalcommits@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" - integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-writer@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz#e64ef74fa8e773cab4124af217f3f02b29eb0a9c" - integrity sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA== - dependencies: - conventional-commits-filter "^4.0.0" - handlebars "^4.7.7" - json-stringify-safe "^5.0.1" - meow "^12.0.1" - semver "^7.5.2" - split2 "^4.0.0" - -conventional-commits-filter@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz#845d713e48dc7d1520b84ec182e2773c10c7bf7f" - integrity sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A== - -conventional-commits-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" - integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== - dependencies: - JSONStream "^1.3.5" - is-text-path "^2.0.0" - meow "^12.0.1" - split2 "^4.0.0" - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^8.0.0: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" - integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== - dependencies: - type-fest "^1.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -dedent@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" - integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-properties@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -deprecation@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dir-glob@^3.0.0, dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== - dependencies: - readable-stream "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.284: - version "1.4.339" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.339.tgz#bfa611a7707ca8bbb784e01fe247c18a35bd8d28" - integrity sha512-MSXHBJGcbBydq/DQDlpBeUKnJ6C7aTiNCTRpfDV5Iz0sNr/Ng6RJFloq82AAicp/SrmDq4zF6XsKG0B8Xwn1UQ== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojilib@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" - integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -env-ci@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-10.0.0.tgz#38f0c33a0d14df1303cba708339fb5e38535b00c" - integrity sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw== - dependencies: - execa "^8.0.0" - java-properties "^1.0.2" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.12" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^8.6.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-eslint-comments@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" - integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== - dependencies: - escape-string-regexp "^1.0.5" - ignore "^5.0.5" - -eslint-plugin-import@^2.27.5: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.33.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" - integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -execa@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - -expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastest-levenshtein@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/figures/-/figures-6.0.1.tgz#75a2baf3ca8c63e2ea253179e9f1157833587ea4" - integrity sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ== - dependencies: - is-unicode-supported "^2.0.0" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up-simple@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" - integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-versions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-5.1.0.tgz#973f6739ce20f5e439a27eba8542a4b236c8e685" - integrity sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg== - dependencies: - semver-regex "^4.0.5" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^11.0.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-minipass@^3.0.0, fs-minipass@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" - integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== - dependencies: - minipass "^7.0.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gauge@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" - integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^4.0.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== - dependencies: - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-7.0.1.tgz#1664dfe7d1678540ea6a4da3ae7cd59bf4e4a91e" - integrity sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -git-log-parser@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" - integrity sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA== - dependencies: - argv-formatter "~1.0.0" - spawn-error-forwarder "~1.0.0" - split2 "~1.0.0" - stream-combiner2 "~1.1.1" - through2 "~2.0.0" - traverse "~0.6.6" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.2.2, glob@^10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.0.tgz#ea9c062a3614e33f516804e778590fcf055256b9" - integrity sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ== - dependencies: - "@sindresorhus/merge-streams" "^1.0.0" - fast-glob "^3.3.2" - ignore "^5.2.4" - path-type "^5.0.0" - slash "^5.1.0" - unicorn-magic "^0.1.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -handlebars@^4.7.7: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== - dependencies: - function-bind "^1.1.2" - -hook-std@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-3.0.0.tgz#47038a01981e07ce9d83a6a3b2eb98cad0f7bd58" - integrity sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw== - -hosted-git-info@^7.0.0, hosted-git-info@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" - integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== - dependencies: - lru-cache "^10.0.1" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-walk@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" - integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== - dependencies: - minimatch "^9.0.0" - -ignore@^5.0.5, ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== - -import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from-esm@^1.0.3, import-from-esm@^1.3.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/import-from-esm/-/import-from-esm-1.3.3.tgz#eea1c4ad86a54bf425b3b71fca56d50215ccc6b7" - integrity sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ== - dependencies: - debug "^4.3.4" - import-meta-resolve "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -import-meta-resolve@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz#0b1195915689f60ab00f830af0f15cc841e8919e" - integrity sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -index-to-position@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-0.1.2.tgz#e11bfe995ca4d8eddb1ec43274488f3c201a7f09" - integrity sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -ini@^4.1.0, ini@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - -init-package-json@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-6.0.0.tgz#7d4daeaacc72be300c616481e5c155d5048a18b4" - integrity sha512-AmXD+Aht5iZGo/y1KUtZSUQ1SltesXHxQuc7qeNz0eUGx/8WgkHeeQLSFdM8l9YpmnnamGIbAxVdAs2xoLRKRQ== - dependencies: - npm-package-arg "^11.0.0" - promzard "^1.0.0" - read "^2.0.0" - read-package-json "^7.0.0" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "^5.0.0" - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -into-stream@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-7.0.0.tgz#d1a211e146be8acfdb84dabcbf00fe8205e72936" - integrity sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw== - dependencies: - from2 "^2.3.0" - p-is-promise "^3.0.0" - -ip-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-5.0.0.tgz#cd313b2ae9c80c07bd3851e12bf4fa4dc5480632" - integrity sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw== - -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-cidr@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-5.0.3.tgz#fcf817c0146dd4a318f27938af89e98a9b21bdd5" - integrity sha512-lKkM0tmz07dAxNsr8Ii9MGreExa9ZR34N9j8mTG5op824kcwBqinZPowNjcVWWc7j+jR8XAMMItOmBkniN0jOA== - dependencies: - cidr-regex "4.0.3" - -is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-text-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== - dependencies: - text-extensions "^2.0.0" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typed-array@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-unicode-supported@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz#fdf32df9ae98ff6ab2cedc155a5a6e895701c451" - integrity sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isexe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" - integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== - -issue-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-6.0.0.tgz#b1edd06315d4f2044a9755daf85fdafde9b4014a" - integrity sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA== - dependencies: - lodash.capitalize "^4.2.1" - lodash.escaperegexp "^4.1.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.uniqby "^4.7.0" - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -java-properties@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" - integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.0.0, jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.5.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" - integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-nice@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" - integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json2csv@^5.0.6: - version "5.0.7" - resolved "https://registry.yarnpkg.com/json2csv/-/json2csv-5.0.7.tgz#f3a583c25abd9804be873e495d1e65ad8d1b54ae" - integrity sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA== - dependencies: - commander "^6.1.0" - jsonparse "^1.3.1" - lodash.get "^4.4.2" - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0, jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -just-diff-apply@^5.2.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" - integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== - -just-diff@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" - integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -kleur@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -libnpmaccess@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-8.0.2.tgz#a13a72fd5b71a1063ea54973fa56d61ec38f718f" - integrity sha512-4K+nsg3OYt4rjryP/3D5zGWluLbZaKozwj6YdtvAyxNhLhUrjCoyxHVoL5AkTJcAnjsd6/ATei52QPVvpSX9Ug== - dependencies: - npm-package-arg "^11.0.1" - npm-registry-fetch "^16.0.0" - -libnpmdiff@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-6.0.4.tgz#805fdaaf4c9dd5a2faa9a77cbe21c2a6c31389e9" - integrity sha512-xLLNTMKbZdE41wi/MZLTYiDYOKRbGS4IU8WgvHPQ001KKlZEa+6Y6C/WVNcRYY5PLh646rtcHlJYYgaAUMFRZQ== - dependencies: - "@npmcli/arborist" "^7.2.1" - "@npmcli/disparity-colors" "^3.0.0" - "@npmcli/installed-package-contents" "^2.0.2" - binary-extensions "^2.2.0" - diff "^5.1.0" - minimatch "^9.0.0" - npm-package-arg "^11.0.1" - pacote "^17.0.4" - tar "^6.2.0" - -libnpmexec@^7.0.4: - version "7.0.5" - resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-7.0.5.tgz#efde78a1367bc17c6c65b9135c3b9aea1e098f3e" - integrity sha512-I0a07CiQ2LTKhjd2ZnYQafe9YQrod/GD2uZ1H//j22PBJvIJPUOJdzuqHyoNB/4/6KILaZNX01Mb6dhp8Vr9rw== - dependencies: - "@npmcli/arborist" "^7.2.1" - "@npmcli/run-script" "^7.0.2" - ci-info "^4.0.0" - npm-package-arg "^11.0.1" - npmlog "^7.0.1" - pacote "^17.0.4" - proc-log "^3.0.0" - read "^2.0.0" - read-package-json-fast "^3.0.2" - semver "^7.3.7" - walk-up-path "^3.0.1" - -libnpmfund@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-5.0.2.tgz#461ee81a8c8be45c2970957d0095da8db13e2546" - integrity sha512-rKILSU9zQMkSIAst3QaoqqomqD6NosKALuXjx4hSjt2VUqrzFrGcAu1/e3YCBVdyFo80HFvGbx0AwooXXLilMQ== - dependencies: - "@npmcli/arborist" "^7.2.1" - -libnpmhook@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-10.0.1.tgz#3cb9516645f0d6891b4a59c72ffe026bdbb9bd6b" - integrity sha512-FnXCweDpoAko6mnLPSW8qrRYicjfh+GrvY5PuYHQRPvaW4BFtHDUmK3K3aYx4yD3TeGAKpj4IigrEDfUfWuSkA== - dependencies: - aproba "^2.0.0" - npm-registry-fetch "^16.0.0" - -libnpmorg@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-6.0.2.tgz#6e5e37ecc5a391082e83c599512689c78e60dc70" - integrity sha512-zK4r6cjVsfXf7hWzWGB6R0LBJidVhKaeMWMZL/1eyZS6ixxAxVijfsPacoEnBRCFaXsNjAtwV3b2RCmYU6+usA== - dependencies: - aproba "^2.0.0" - npm-registry-fetch "^16.0.0" - -libnpmpack@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-6.0.4.tgz#61d6e479f8d3049ca23b2fdae38165dd0a0c67a0" - integrity sha512-fvwmLPR5vveBeBFdbb5UGHgXSRIjI/JWGIT9JyAXE7ax1GAPdsMSgAP8/OBZat2pQGJhKjRHL5tgvwZ1u6Vi7Q== - dependencies: - "@npmcli/arborist" "^7.2.1" - "@npmcli/run-script" "^7.0.2" - npm-package-arg "^11.0.1" - pacote "^17.0.4" - -libnpmpublish@^9.0.2: - version "9.0.3" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-9.0.3.tgz#644ee50543687eee79bcf2a5bd759a2ff6e60a0d" - integrity sha512-XoF0QgT1Ph9RMBfTwiwZeRN4Rs5t4w1POaRxaoVoWCMUqysswwlAPu3ZZJDNbh7asXBWXcXTJziDWkInhpbiBg== - dependencies: - ci-info "^4.0.0" - normalize-package-data "^6.0.0" - npm-package-arg "^11.0.1" - npm-registry-fetch "^16.0.0" - proc-log "^3.0.0" - semver "^7.3.7" - sigstore "^2.1.0" - ssri "^10.0.5" - -libnpmsearch@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-7.0.1.tgz#8fa803a8e5837a33ce750a8cc1c70820d728b91d" - integrity sha512-XyKi6Y94t6PGd5Lk2Ma3+fgiHWD3KSCvXmHOrcLkAOEP7oUejbNjL0Bb/HUDZXgBj6gP1Qk7pJ6jZPFBc2hmXQ== - dependencies: - npm-registry-fetch "^16.0.0" - -libnpmteam@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-6.0.1.tgz#daa1b2e7e4ccef0469bdef661737ca823b53468b" - integrity sha512-1YytqVk1gSkKFNMe4kkCKN49y5rlABrRSx5TrYShQtt2Lb4uQaed49dGE7Ue8TJGxbIkHzvyyVtb3PBiGACVqw== - dependencies: - aproba "^2.0.0" - npm-registry-fetch "^16.0.0" - -libnpmversion@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-5.0.2.tgz#aea7b09bc270c778cbc8be7bf02e4b60566989cf" - integrity sha512-6JBnLhd6SYgKRekJ4cotxpURLGbEtKxzw+a8p5o+wNwrveJPMH8yW/HKjeewyHzWmxzzwn9EQ3TkF2onkrwstA== - dependencies: - "@npmcli/git" "^5.0.3" - "@npmcli/run-script" "^7.0.2" - json-parse-even-better-errors "^3.0.0" - proc-log "^3.0.0" - semver "^7.3.7" - -lilconfig@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^13.1.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.0.tgz#b7abaf79c91cd36d824f17b23a4ce5209206126a" - integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw== - dependencies: - chalk "5.2.0" - cli-truncate "^3.1.0" - commander "^10.0.0" - debug "^4.3.4" - execa "^7.0.0" - lilconfig "2.1.0" - listr2 "^5.0.7" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-inspect "^1.12.3" - pidtree "^0.6.0" - string-argv "^0.3.1" - yaml "^2.2.1" - -listr2@^5.0.7: - version "5.0.8" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" - integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.19" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.8.0" - through "^2.3.8" - wrap-ansi "^7.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.capitalize@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" - integrity sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw== - -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.uniqby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== - -lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" - integrity sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== - dependencies: - "@npmcli/agent" "^2.0.0" - cacache "^18.0.0" - http-cache-semantics "^4.1.1" - is-lambda "^1.0.1" - minipass "^7.0.2" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - ssri "^10.0.0" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -marked-terminal@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-6.2.0.tgz#82928d7967af486185a64ea927be723aadd4755f" - integrity sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw== - dependencies: - ansi-escapes "^6.2.0" - cardinal "^2.1.1" - chalk "^5.3.0" - cli-table3 "^0.6.3" - node-emoji "^2.1.3" - supports-hyperlinks "^3.0.0" - -marked@^9.0.0: - version "9.1.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-9.1.6.tgz#5d2a3f8180abfbc5d62e3258a38a1c19c0381695" - integrity sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q== - -meow@^12.0.1: - version "12.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" - integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.1.tgz#ad7563d1bfe30253ad97dedfae2b1009d01b9470" - integrity sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass-collect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" - integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== - dependencies: - minipass "^7.0.3" - -minipass-fetch@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" - integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== - dependencies: - minipass "^7.0.3" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== - dependencies: - jsonparse "^1.3.1" - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1, ms@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nerf-dart@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" - integrity sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g== - -node-emoji@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" - integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== - dependencies: - "@sindresorhus/is" "^4.6.0" - char-regex "^1.0.2" - emojilib "^2.4.0" - skin-tone "^2.0.0" - -node-gyp@^10.0.0, node-gyp@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.0.1.tgz#205514fc19e5830fa991e4a689f9e81af377a966" - integrity sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg== - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^10.3.10" - graceful-fs "^4.2.6" - make-fetch-happen "^13.0.0" - nopt "^7.0.0" - proc-log "^3.0.0" - semver "^7.3.5" - tar "^6.1.2" - which "^4.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -nopt@^7.0.0, nopt@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" - integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== - dependencies: - abbrev "^2.0.0" - -normalize-package-data@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" - integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== - dependencies: - hosted-git-info "^7.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" - integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== - -npm-audit-report@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-5.0.0.tgz#83ac14aeff249484bde81eff53c3771d5048cf95" - integrity sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw== - -npm-bundled@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" - integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== - dependencies: - npm-normalize-package-bin "^3.0.0" - -npm-install-checks@^6.0.0, npm-install-checks@^6.2.0, npm-install-checks@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" - integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== - dependencies: - semver "^7.1.1" - -npm-normalize-package-bin@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" - integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== - -npm-package-arg@^11.0.0, npm-package-arg@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.1.tgz#f208b0022c29240a1c532a449bdde3f0a4708ebc" - integrity sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ== - dependencies: - hosted-git-info "^7.0.0" - proc-log "^3.0.0" - semver "^7.3.5" - validate-npm-package-name "^5.0.0" - -npm-packlist@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.1.tgz#97d1eb2a9a90e10ce1b028d058da3740c91b89ab" - integrity sha512-MQpL27ZrsJQ2kiAuQPpZb5LtJwydNRnI15QWXsf3WHERu4rzjRj6Zju/My2fov7tLuu3Gle/uoIX/DDZ3u4O4Q== - dependencies: - ignore-walk "^6.0.4" - -npm-pick-manifest@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz#f87a4c134504a2c7931f2bb8733126e3c3bb7e8f" - integrity sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg== - dependencies: - npm-install-checks "^6.0.0" - npm-normalize-package-bin "^3.0.0" - npm-package-arg "^11.0.0" - semver "^7.3.5" - -npm-profile@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-9.0.0.tgz#ffcfa4e3e1b1cb44b17c192f75b44b24b4aae645" - integrity sha512-qv43ixsJ7vndzfxD3XsPNu1Njck6dhO7q1efksTo+0DiOQysKSOsIhK/qDD1/xO2o+2jDOA4Rv/zOJ9KQFs9nw== - dependencies: - npm-registry-fetch "^16.0.0" - proc-log "^3.0.0" - -npm-registry-fetch@^16.0.0, npm-registry-fetch@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz#10227b7b36c97bc1cf2902a24e4f710cfe62803c" - integrity sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw== - dependencies: - make-fetch-happen "^13.0.0" - minipass "^7.0.2" - minipass-fetch "^3.0.0" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^11.0.0" - proc-log "^3.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -npm-user-validate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-2.0.0.tgz#7b69bbbff6f7992a1d9a8968d52fd6b6db5431b6" - integrity sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q== - -npm@^10.0.0: - version "10.2.5" - resolved "https://registry.yarnpkg.com/npm/-/npm-10.2.5.tgz#ef86b9aafd9965e60814ed11a3d4fb00a4e3b006" - integrity sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/arborist" "^7.2.1" - "@npmcli/config" "^8.0.2" - "@npmcli/fs" "^3.1.0" - "@npmcli/map-workspaces" "^3.0.4" - "@npmcli/package-json" "^5.0.0" - "@npmcli/promise-spawn" "^7.0.0" - "@npmcli/run-script" "^7.0.2" - "@sigstore/tuf" "^2.2.0" - abbrev "^2.0.0" - archy "~1.0.0" - cacache "^18.0.1" - chalk "^5.3.0" - ci-info "^4.0.0" - cli-columns "^4.0.0" - cli-table3 "^0.6.3" - columnify "^1.6.0" - fastest-levenshtein "^1.0.16" - fs-minipass "^3.0.3" - glob "^10.3.10" - graceful-fs "^4.2.11" - hosted-git-info "^7.0.1" - ini "^4.1.1" - init-package-json "^6.0.0" - is-cidr "^5.0.3" - json-parse-even-better-errors "^3.0.1" - libnpmaccess "^8.0.1" - libnpmdiff "^6.0.3" - libnpmexec "^7.0.4" - libnpmfund "^5.0.1" - libnpmhook "^10.0.0" - libnpmorg "^6.0.1" - libnpmpack "^6.0.3" - libnpmpublish "^9.0.2" - libnpmsearch "^7.0.0" - libnpmteam "^6.0.0" - libnpmversion "^5.0.1" - make-fetch-happen "^13.0.0" - minimatch "^9.0.3" - minipass "^7.0.4" - minipass-pipeline "^1.2.4" - ms "^2.1.2" - node-gyp "^10.0.1" - nopt "^7.2.0" - normalize-package-data "^6.0.0" - npm-audit-report "^5.0.0" - npm-install-checks "^6.3.0" - npm-package-arg "^11.0.1" - npm-pick-manifest "^9.0.0" - npm-profile "^9.0.0" - npm-registry-fetch "^16.1.0" - npm-user-validate "^2.0.0" - npmlog "^7.0.1" - p-map "^4.0.0" - pacote "^17.0.5" - parse-conflict-json "^3.0.1" - proc-log "^3.0.0" - qrcode-terminal "^0.12.0" - read "^2.1.0" - semver "^7.5.4" - spdx-expression-parse "^3.0.1" - ssri "^10.0.5" - strip-ansi "^7.1.0" - supports-color "^9.4.0" - tar "^6.2.0" - text-table "~0.2.0" - tiny-relative-date "^1.3.0" - treeverse "^3.0.0" - validate-npm-package-name "^5.0.0" - which "^4.0.0" - write-file-atomic "^5.0.1" - -npmlog@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" - integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== - dependencies: - are-we-there-yet "^4.0.0" - console-control-strings "^1.1.0" - gauge "^5.0.0" - set-blocking "^2.0.0" - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - -object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - integrity sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A== - -p-each-series@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" - integrity sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw== - -p-filter@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-4.0.0.tgz#10d55bf804712a1301a9bfb1588d5ec641cce754" - integrity sha512-3gxOrNadcyxj+YKFyRmRIEuCMGayNNJoXL7Zf1dqfdfoDsVB190bHfFfhqfcNEDFLfQP1q2uir2cBgIqnIT+cQ== - dependencies: - p-map "^7.0.0" - -p-is-promise@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" - integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.0.tgz#757a189703986134d5d34ef7c16cf2f824d19ebe" - integrity sha512-EZl03dLKv3RypkrjlevZoNwQMSy4bAblWcR18zhonktnN4fUs3asFQKSe0awn982omGxamvbejqQKQYDJYHCEg== - -p-reduce@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" - integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== - -p-reduce@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-3.0.0.tgz#f11773794792974bd1f7a14c72934248abff4160" - integrity sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q== - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pacote@^17.0.0, pacote@^17.0.4, pacote@^17.0.5: - version "17.0.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.5.tgz#e9854edee7a073635cdd36b0c07cd4f2ab1757b6" - integrity sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA== - dependencies: - "@npmcli/git" "^5.0.0" - "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/promise-spawn" "^7.0.0" - "@npmcli/run-script" "^7.0.0" - cacache "^18.0.0" - fs-minipass "^3.0.0" - minipass "^7.0.2" - npm-package-arg "^11.0.0" - npm-packlist "^8.0.0" - npm-pick-manifest "^9.0.0" - npm-registry-fetch "^16.0.0" - proc-log "^3.0.0" - promise-retry "^2.0.1" - read-package-json "^7.0.0" - read-package-json-fast "^3.0.0" - sigstore "^2.0.0" - ssri "^10.0.0" - tar "^6.1.11" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-conflict-json@^3.0.0, parse-conflict-json@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" - integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== - dependencies: - json-parse-even-better-errors "^3.0.0" - just-diff "^6.0.0" - just-diff-apply "^5.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-json@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.1.0.tgz#91cdc7728004e955af9cb734de5684733b24a717" - integrity sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA== - dependencies: - "@babel/code-frame" "^7.22.13" - index-to-position "^0.1.2" - type-fest "^4.7.1" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== - dependencies: - lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -path-type@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" - integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-conf@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g== - dependencies: - find-up "^2.0.0" - load-json-file "^4.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -platform@^1.3.3: - version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" - integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== - -postcss-selector-parser@^6.0.10: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -pre-commit@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" - integrity sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA== - dependencies: - cross-spawn "^5.0.1" - spawn-sync "^1.0.15" - which "1.2.x" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.8.3: - version "2.8.6" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.6.tgz#5c174b29befd507f14b83e3c19f83fdc0e974b71" - integrity sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ== - -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -proc-log@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" - integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -promise-all-reject-late@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" - integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== - -promise-call-limit@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" - integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -promzard@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" - integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== - dependencies: - read "^2.0.0" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" - integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -read-cmd-shim@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" - integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== - -read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" - integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== - dependencies: - json-parse-even-better-errors "^3.0.0" - npm-normalize-package-bin "^3.0.0" - -read-package-json@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-7.0.0.tgz#d605c9dcf6bc5856da24204aa4e9518ee9714be0" - integrity sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg== - dependencies: - glob "^10.2.2" - json-parse-even-better-errors "^3.0.0" - normalize-package-data "^6.0.0" - npm-normalize-package-bin "^3.0.0" - -read-pkg-up@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-11.0.0.tgz#8916ffc6af2a7538b43bcc2c6445d4450ffe5a74" - integrity sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q== - dependencies: - find-up-simple "^1.0.0" - read-pkg "^9.0.0" - type-fest "^4.6.0" - -read-pkg@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-9.0.1.tgz#b1b81fb15104f5dbb121b6bbdee9bbc9739f569b" - integrity sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA== - dependencies: - "@types/normalize-package-data" "^2.4.3" - normalize-package-data "^6.0.0" - parse-json "^8.0.0" - type-fest "^4.6.0" - unicorn-magic "^0.1.0" - -read@^2.0.0, read@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" - integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== - dependencies: - mute-stream "~1.0.0" - -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.1.tgz#3f2e4e66eab45606ac8f31597b9edb80c13b12ab" - integrity sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" - -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== - dependencies: - esprima "~4.0.0" - -regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" - -registry-auth-token@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" - integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== - dependencies: - "@pnpm/npm-conf" "^2.1.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rrule@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/rrule/-/rrule-2.7.2.tgz#cb899cb21bbe6c71b587107956604173b69f9143" - integrity sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A== - dependencies: - tslib "^2.4.0" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semantic-release@^22.0.12: - version "22.0.12" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-22.0.12.tgz#b8dd1a096b597080e05f30554ee5d128fe6dac84" - integrity sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw== - dependencies: - "@semantic-release/commit-analyzer" "^11.0.0" - "@semantic-release/error" "^4.0.0" - "@semantic-release/github" "^9.0.0" - "@semantic-release/npm" "^11.0.0" - "@semantic-release/release-notes-generator" "^12.0.0" - aggregate-error "^5.0.0" - cosmiconfig "^8.0.0" - debug "^4.0.0" - env-ci "^10.0.0" - execa "^8.0.0" - figures "^6.0.0" - find-versions "^5.1.0" - get-stream "^6.0.0" - git-log-parser "^1.2.0" - hook-std "^3.0.0" - hosted-git-info "^7.0.0" - import-from-esm "^1.3.1" - lodash-es "^4.17.21" - marked "^9.0.0" - marked-terminal "^6.0.0" - micromatch "^4.0.2" - p-each-series "^3.0.0" - p-reduce "^3.0.0" - read-pkg-up "^11.0.0" - resolve-from "^5.0.0" - semver "^7.3.2" - semver-diff "^4.0.0" - signale "^1.2.1" - yargs "^17.5.1" - -semver-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" - integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== - dependencies: - semver "^7.3.5" - -semver-regex@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180" - integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== - -semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== - dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -signale@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" - integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== - dependencies: - chalk "^2.3.2" - figures "^2.0.0" - pkg-conf "^2.1.0" - -sigstore@^2.0.0, sigstore@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.1.0.tgz#c577b596642b3f360dc4135d476466e6edeb2364" - integrity sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw== - dependencies: - "@sigstore/bundle" "^2.1.0" - "@sigstore/protobuf-specs" "^0.2.1" - "@sigstore/sign" "^2.1.0" - "@sigstore/tuf" "^2.1.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -skin-tone@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" - integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== - dependencies: - unicode-emoji-modifier-base "^1.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" - integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" - integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== - dependencies: - agent-base "^7.0.2" - debug "^4.3.4" - socks "^2.7.1" - -socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spawn-error-forwarder@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" - integrity sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g== - -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - integrity sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw== - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== - -split2@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -split2@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314" - integrity sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg== - dependencies: - through2 "~2.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -ssri@^10.0.0, ssri@^10.0.5: - version "10.0.5" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" - integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== - dependencies: - minipass "^7.0.3" - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stream-combiner2@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - integrity sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw== - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -string-argv@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1, strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== - -supports-hyperlinks@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz#c711352a5c89070779b4dad54c05a2f14b15c94b" - integrity sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar@^6.1.11, tar@^6.1.2, tar@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" - integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== - -tempy@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-3.1.0.tgz#00958b6df85db8589cb595465e691852aac038e9" - integrity sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g== - dependencies: - is-stream "^3.0.0" - temp-dir "^3.0.0" - type-fest "^2.12.2" - unique-string "^3.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-extensions@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" - integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== - -text-table@^0.2.0, text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through2@~2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -"through@>=2.2.7 <3", through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tiny-relative-date@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" - integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -traverse@~0.6.6: - version "0.6.8" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.8.tgz#5e5e0c41878b57e4b73ad2f3d1e36a715ea4ab15" - integrity sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA== - -treeverse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" - integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== - -ts-jest@^29.0.5: - version "29.0.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" - integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -ts-node@^10.9.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tuf-js@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.1.0.tgz#87aa36d5a166e7522f1e2050eb502a3a9b0bde72" - integrity sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA== - dependencies: - "@tufjs/models" "2.0.0" - debug "^4.3.4" - make-fetch-happen "^13.0.0" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^2.12.2: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-fest@^3.0.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" - integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== - -type-fest@^4.6.0, type-fest@^4.7.1: - version "4.8.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c" - integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typescript@^4.9.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unicode-emoji-modifier-base@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" - integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== - -unicorn-magic@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" - integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== - -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" - integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== - dependencies: - crypto-random-string "^4.0.0" - -universal-user-agent@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" - integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-join@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" - integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== - -util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" - integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== - dependencies: - builtins "^5.0.0" - -walk-up-path@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" - integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -wcwidth@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.11, which-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@1.2.x: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - integrity sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw== - dependencies: - isexe "^2.0.0" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" - integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== - dependencies: - isexe "^3.1.1" - -wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -write-file-atomic@^5.0.0, write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.2.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" - integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== - -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yargs@^17.5.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 751fe6ed2fd87067b0c0a059b550ba198805fa83 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 3 May 2024 19:52:10 +0700 Subject: [PATCH 14/63] feat: bump napi, other deps and add new targets (#110) --- .cargo/config.toml | 4 +- .github/workflows/build-and-test.yml | 165 ++++----- Cargo.lock | 103 +++--- Cargo.toml | 5 +- index.js | 66 +++- npm/linux-arm-musleabihf/README.md | 3 + npm/linux-arm-musleabihf/package.json | 18 + npm/linux-riscv64-gnu/README.md | 3 + npm/linux-riscv64-gnu/package.json | 21 ++ package-lock.json | 477 +------------------------- package.json | 6 +- 11 files changed, 251 insertions(+), 620 deletions(-) create mode 100644 npm/linux-arm-musleabihf/README.md create mode 100644 npm/linux-arm-musleabihf/package.json create mode 100644 npm/linux-riscv64-gnu/README.md create mode 100644 npm/linux-riscv64-gnu/package.json diff --git a/.cargo/config.toml b/.cargo/config.toml index 7ede30e..0651654 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,3 +1,5 @@ [target.aarch64-unknown-linux-musl] linker = "aarch64-linux-musl-gcc" -rustflags = ["-C", "target-feature=-crt-static"] \ No newline at end of file +rustflags = ["-C", "target-feature=-crt-static"] +[target.x86_64-pc-windows-msvc] +rustflags = ["-C", "target-feature=+crt-static"] \ No newline at end of file diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 569a072..5620f9a 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -13,9 +13,7 @@ jobs: settings: - host: macos-latest target: x86_64-apple-darwin - build: | - npm run build -- --target x86_64-apple-darwin - strip -x *.node + build: npm run build -- --target x86_64-apple-darwin - host: windows-latest build: npm run build target: x86_64-pc-windows-msvc @@ -27,65 +25,58 @@ jobs: - host: ubuntu-latest target: x86_64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian - build: |- - set -e && - npm run build -- --target x86_64-unknown-linux-gnu && - strip *.node + build: npm run build -- --target x86_64-unknown-linux-gnu - host: ubuntu-latest target: x86_64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine - build: set -e && npm run build && strip *.node + build: npm run build -- --target x86_64-unknown-linux-musl - host: macos-latest target: aarch64-apple-darwin - build: | - npm run build - strip -x *.node + build: npm run build -- --target aarch64-apple-darwin - host: ubuntu-latest target: aarch64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 - build: |- - set -e && - npm run build -- --target aarch64-unknown-linux-gnu && - aarch64-unknown-linux-gnu-strip *.node + build: npm run build -- --target aarch64-unknown-linux-gnu - host: ubuntu-latest target: armv7-unknown-linux-gnueabihf setup: | sudo apt-get update sudo apt-get install gcc-arm-linux-gnueabihf -y - build: | - npm run build -- --target armv7-unknown-linux-gnueabihf - arm-linux-gnueabihf-strip *.node + build: npm run build -- --target armv7-unknown-linux-gnueabihf + - host: ubuntu-latest + target: armv7-unknown-linux-musleabihf + build: npm run build -- --target armv7-unknown-linux-musleabihf - host: ubuntu-latest target: aarch64-linux-android - build: | - npm run build -- --target aarch64-linux-android - ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node + build: npm run build -- --target aarch64-linux-android - host: ubuntu-latest target: armv7-linux-androideabi - build: | - npm run build -- --target armv7-linux-androideabi - ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node + build: npm run build -- --target armv7-linux-androideabi - host: ubuntu-latest target: aarch64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: |- set -e && rustup target add aarch64-unknown-linux-musl && - npm run build -- --target aarch64-unknown-linux-musl && - /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node + npm run build -- --target aarch64-unknown-linux-musl - host: windows-latest target: aarch64-pc-windows-msvc build: npm run build -- --target aarch64-pc-windows-msvc - name: stable - ${{ matrix.settings.target }} - node@18 + - host: ubuntu-latest + target: riscv64gc-unknown-linux-gnu + setup: | + sudo apt-get update + sudo apt-get install gcc-riscv64-linux-gnu -y + build: npm run build -- --target riscv64gc-unknown-linux-gnu + name: stable - ${{ matrix.settings.target }} - node@20 runs-on: ${{ matrix.settings.host }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 if: ${{ !matrix.settings.docker }} with: - node-version: 18 - check-latest: true + node-version: 20 cache: npm - name: Install uses: dtolnay/rust-toolchain@stable @@ -94,7 +85,7 @@ jobs: toolchain: stable targets: ${{ matrix.settings.target }} - name: Cache cargo - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cargo/registry/index/ @@ -104,9 +95,9 @@ jobs: target/ key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} - uses: goto-bus-stop/setup-zig@v2 - if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} + if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' || matrix.settings.target == 'armv7-unknown-linux-musleabihf' }} with: - version: 0.10.1 + version: 0.12.0 - name: Setup toolchain run: ${{ matrix.settings.setup }} if: ${{ matrix.settings.setup }} @@ -119,11 +110,10 @@ jobs: if: matrix.settings.target != 'i686-pc-windows-msvc' run: npm ci - name: Setup node x86 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 if: matrix.settings.target == 'i686-pc-windows-msvc' with: - node-version: 18 - check-latest: true + node-version: 20 cache: npm architecture: x86 - name: Build in docker @@ -138,26 +128,26 @@ jobs: if: ${{ !matrix.settings.docker }} shell: bash - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.settings.target }} path: ${{ env.APP_NAME }}.*.node if-no-files-found: error build-freebsd: - runs-on: macos-12 + runs-on: macos-13 name: Build FreeBSD steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build id: build - uses: cross-platform-actions/action@v0.21.0 + uses: cross-platform-actions/action@v0.24.0 env: DEBUG: napi:* RUSTUP_IO_THREADS: 1 with: operating_system: freebsd version: '13.2' - memory: 13G + memory: 8G cpu_count: 3 environment_variables: 'DEBUG RUSTUP_IO_THREADS' shell: bash @@ -169,7 +159,7 @@ jobs: echo "~~~~ rustc --version ~~~~" rustc --version echo "~~~~ node -v ~~~~" - node -v + node --version echo "~~~~ npm --version ~~~~" npm --version pwd @@ -182,7 +172,7 @@ jobs: rm -rf node_modules rm -rf target - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: bindings-freebsd path: ${{ env.APP_NAME }}.*.node @@ -197,26 +187,30 @@ jobs: settings: - host: windows-latest target: x86_64-pc-windows-msvc + architecture: x64 + - host: macos-latest + target: aarch64-apple-darwin + architecture: arm64 + - host: macos-latest + target: x86_64-apple-darwin + architecture: x64 node: - - '14' - '16' - '18' + - '20' runs-on: ${{ matrix.settings.host }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - check-latest: true + architecture: ${{ matrix.settings.architecture }} cache: npm - name: Install dependencies - run: | - # Remove semantic-release because it's not compatible with Node 14 - npm uninstall semantic-release @semantic-release/git conventional-changelog-conventionalcommits - npm ci + run: npm ci - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-${{ matrix.settings.target }} path: . @@ -233,25 +227,21 @@ jobs: fail-fast: false matrix: node: - - '14' - '16' - '18' + - '20' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - check-latest: true cache: npm - name: Install dependencies - run: | - # Remove semantic-release because it's not compatible with Node 14 - npm uninstall semantic-release @semantic-release/git conventional-changelog-conventionalcommits - npm install + run: npm ci - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-gnu path: . @@ -268,25 +258,21 @@ jobs: fail-fast: false matrix: node: - - '14' - '16' - '18' + - '20' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - check-latest: true cache: npm - name: Install dependencies - run: | - # Remove semantic-release because it's not compatible with Node 14 - npm uninstall semantic-release @semantic-release/git conventional-changelog-conventionalcommits - npm ci --libc "musl" + run: npm ci --libc "musl" - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-musl path: . @@ -303,14 +289,14 @@ jobs: fail-fast: false matrix: node: - - '14' - '16' - '18' + - '20' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-gnu path: . @@ -320,7 +306,7 @@ jobs: - name: Install dependencies run: npm ci --cpu "arm64" --libc "glibc" - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 with: platforms: arm64 - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes @@ -334,14 +320,14 @@ jobs: npm test ls -la test-linux-aarch64-musl-binding: - name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} + name: Test bindings on aarch64-unknown-linux-musl - node@lts needs: - build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-musl path: . @@ -351,7 +337,7 @@ jobs: - name: Install dependencies run: npm ci --cpu "arm64" --libc "musl" - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 with: platforms: arm64 - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes @@ -371,14 +357,14 @@ jobs: fail-fast: false matrix: node: - - '14' - '16' - '18' + - '20' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-armv7-unknown-linux-gnueabihf path: . @@ -388,7 +374,7 @@ jobs: - name: Install dependencies run: npm ci --cpu "arm" - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 with: platforms: arm - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes @@ -407,29 +393,28 @@ jobs: - build runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 - check-latest: true + node-version: 20 cache: npm - name: Install dependencies run: npm ci - name: Download macOS x64 artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-x86_64-apple-darwin path: artifacts - name: Download macOS arm64 artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: bindings-aarch64-apple-darwin path: artifacts - name: Combine binaries run: npm run universal - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: bindings-universal-apple-darwin path: ${{ env.APP_NAME }}.*.node diff --git a/Cargo.lock b/Cargo.lock index ff8c5e6..2fab647 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,15 +40,15 @@ checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "cc" -version = "1.0.90" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" [[package]] name = "cfg-if" @@ -58,9 +58,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -109,9 +109,9 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "ctor" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", "syn", @@ -157,9 +157,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[package]] name = "libloading" @@ -185,9 +185,9 @@ checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "napi" -version = "2.16.1" +version = "2.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ca998356d8ff9fba7a070dae4508a2298439c98c9f3bc9c07669538b999e8f" +checksum = "da1edd9510299935e4f52a24d1e69ebd224157e3e962c6c847edec5c2e4f786f" dependencies = [ "bitflags", "ctor", @@ -198,15 +198,15 @@ dependencies = [ [[package]] name = "napi-build" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9130fccc5f763cf2069b34a089a18f0d0883c66aceb81f2fad541a3d823c43" +checksum = "e1c0f5d67ee408a4685b61f5ab7e58605c8ae3f2b4189f0127d804ff13d5560a" [[package]] name = "napi-derive" -version = "2.16.1" +version = "2.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b138cecf1141ae0ff5d62f4aa0e2f269aec339f66070f346ba6fb4279f1fc178" +checksum = "e5a6de411b6217dbb47cd7a8c48684b162309ff48a77df9228c082400dd5b030" dependencies = [ "cfg-if", "convert_case", @@ -218,9 +218,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "1.0.63" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5126b64f6ad9e28e30e6d15213dd378626b38f556454afebc42f7f02a90902" +checksum = "c3e35868d43b178b0eb9c17bd018960b1b5dd1732a7d47c23debe8f5c4caf498" dependencies = [ "convert_case", "once_cell", @@ -233,9 +233,9 @@ dependencies = [ [[package]] name = "napi-sys" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2503fa6af34dc83fb74888df8b22afe933b58d37daf7d80424b1c60c68196b8b" +checksum = "427802e8ec3a734331fec1035594a210ce1ff4dc5bc1950530920ab717964ea3" dependencies = [ "libloading", ] @@ -257,9 +257,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "parse-zoneinfo" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" dependencies = [ "regex", ] @@ -304,18 +304,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -411,9 +411,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "syn" -version = "2.0.58" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -422,18 +422,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", @@ -517,13 +517,14 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -532,42 +533,48 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/Cargo.toml b/Cargo.toml index 39de774..90c6ee4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,8 +10,8 @@ crate-type = ["cdylib"] chrono = "0.4.24" chrono-tz = "0.8.5" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix -napi = { version = "2.11.1", default-features = false, features = ["napi5"] } -napi-derive = "2.11.0" +napi = { version = "2.12.2", default-features = false, features = ["napi5"] } +napi-derive = "2.12.2" replace_with = "0.1.7" rrule = { version = "0.12.0", features = ["exrule"] } @@ -20,3 +20,4 @@ napi-build = "2.0.1" [profile.release] lto = true +strip = "symbols" \ No newline at end of file diff --git a/index.js b/index.js index 29ee631..fdc48bf 100644 --- a/index.js +++ b/index.js @@ -17,7 +17,7 @@ function isMusl() { // For Node 10 if (!process.report || typeof process.report.getReport !== 'function') { try { - const lddPath = require('child_process').execSync('which ldd').toString().trim(); + const lddPath = require('child_process').execSync('which ldd').toString().trim() return readFileSync(lddPath, 'utf8').includes('musl') } catch (e) { return true @@ -224,14 +224,72 @@ switch (platform) { } break case 'arm': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-arm-musleabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-arm-musleabihf.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-arm-musleabihf') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + } + break + case 'riscv64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-riscv64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-riscv64-musl.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-riscv64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-riscv64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-riscv64-gnu.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-riscv64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 's390x': localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-arm-gnueabihf.node') + join(__dirname, 'rrule-rust.linux-s390x-gnu.node') ) try { if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-arm-gnueabihf.node') + nativeBinding = require('./rrule-rust.linux-s390x-gnu.node') } else { - nativeBinding = require('@rrule-rust/lib-linux-arm-gnueabihf') + nativeBinding = require('@rrule-rust/lib-linux-s390x-gnu') } } catch (e) { loadError = e diff --git a/npm/linux-arm-musleabihf/README.md b/npm/linux-arm-musleabihf/README.md new file mode 100644 index 0000000..da717e3 --- /dev/null +++ b/npm/linux-arm-musleabihf/README.md @@ -0,0 +1,3 @@ +# `rrule-rust-linux-arm-musleabihf` + +This is the **armv7-unknown-linux-musleabihf** binary for `rrule-rust` diff --git a/npm/linux-arm-musleabihf/package.json b/npm/linux-arm-musleabihf/package.json new file mode 100644 index 0000000..ef8bcda --- /dev/null +++ b/npm/linux-arm-musleabihf/package.json @@ -0,0 +1,18 @@ +{ + "name": "@rrule-rust/lib-linux-arm-musleabihf", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "arm" + ], + "main": "rrule-rust.linux-arm-musleabihf.node", + "files": [ + "rrule-rust.linux-arm-musleabihf.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/npm/linux-riscv64-gnu/README.md b/npm/linux-riscv64-gnu/README.md new file mode 100644 index 0000000..aacb1b1 --- /dev/null +++ b/npm/linux-riscv64-gnu/README.md @@ -0,0 +1,3 @@ +# `rrule-rust-linux-riscv64-gnu` + +This is the **riscv64gc-unknown-linux-gnu** binary for `rrule-rust` diff --git a/npm/linux-riscv64-gnu/package.json b/npm/linux-riscv64-gnu/package.json new file mode 100644 index 0000000..3ad9495 --- /dev/null +++ b/npm/linux-riscv64-gnu/package.json @@ -0,0 +1,21 @@ +{ + "name": "@rrule-rust/lib-linux-riscv64-gnu", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "riscv64" + ], + "main": "rrule-rust.linux-riscv64-gnu.node", + "files": [ + "rrule-rust.linux-riscv64-gnu.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "libc": [ + "glibc" + ] +} diff --git a/package-lock.json b/package-lock.json index aadee33..b810d93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "license": "MIT", "devDependencies": { - "@napi-rs/cli": "^2.15.1", + "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", "@types/node": "^18.15.5", @@ -1912,11 +1912,10 @@ } }, "node_modules/@napi-rs/cli": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.0.tgz", - "integrity": "sha512-lfSRT7cs3iC4L+kv9suGYQEezn5Nii7Kpu+THsYVI0tA1Vh59LH45p4QADaD7hvIkmOz79eEGtoKQ9nAkAPkzA==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.2.tgz", + "integrity": "sha512-IXQji3IF5eStxTHe/PxDSRjPrFymYAQ5FbIvqurxzxyWR8nJql9mtvmCP8y2g8tSoW5xhaToLQW0+mO3lUZq4w==", "dev": true, - "license": "MIT", "bin": { "napi": "scripts/index.js" }, @@ -8292,8 +8291,6 @@ }, "node_modules/npm/node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -8304,8 +8301,6 @@ }, "node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "inBundle": true, "license": "ISC", @@ -8323,16 +8318,12 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "inBundle": true, "license": "MIT", @@ -8350,16 +8341,12 @@ }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -8376,8 +8363,6 @@ }, "node_modules/npm/node_modules/@npmcli/arborist": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.2.2.tgz", - "integrity": "sha512-dIIzyhy1zS2dYPS8bdM/8qA8W2evQE9KENBxVOhFthm/2RKqf2ninRWQc8xfc5f1gsiTxTP20Y9flIfziHfSKA==", "dev": true, "inBundle": true, "license": "ISC", @@ -8425,8 +8410,6 @@ }, "node_modules/npm/node_modules/@npmcli/config": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.3.tgz", - "integrity": "sha512-rqRX7/UORvm2YRImY67kyfwD9rpi5+KXXb1j/cpTUKRcUqvpJ9/PMMc7Vv57JVqmrFj8siBBFEmXI3Gg7/TonQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -8446,8 +8429,6 @@ }, "node_modules/npm/node_modules/@npmcli/disparity-colors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz", - "integrity": "sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg==", "dev": true, "inBundle": true, "license": "ISC", @@ -8460,8 +8441,6 @@ }, "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "inBundle": true, "license": "MIT", @@ -8477,8 +8456,6 @@ }, "node_modules/npm/node_modules/@npmcli/fs": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, "inBundle": true, "license": "ISC", @@ -8491,8 +8468,6 @@ }, "node_modules/npm/node_modules/@npmcli/git": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.3.tgz", - "integrity": "sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==", "dev": true, "inBundle": true, "license": "ISC", @@ -8512,8 +8487,6 @@ }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -8530,8 +8503,6 @@ }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", - "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", "dev": true, "inBundle": true, "license": "ISC", @@ -8547,8 +8518,6 @@ }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.0.0.tgz", - "integrity": "sha512-Pw0tyX02VkpqlIQlG2TeiJNsdrecYeUU0ubZZa9pi3N37GCsxI+en43u4hYFdq+eSx1A9a9vwFAUyqEtKFsbHQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -8564,8 +8533,6 @@ }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", "dev": true, "inBundle": true, "license": "ISC", @@ -8575,8 +8542,6 @@ }, "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, "inBundle": true, "license": "ISC", @@ -8586,8 +8551,6 @@ }, "node_modules/npm/node_modules/@npmcli/package-json": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.0.0.tgz", - "integrity": "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==", "dev": true, "inBundle": true, "license": "ISC", @@ -8606,8 +8569,6 @@ }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz", - "integrity": "sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -8620,8 +8581,6 @@ }, "node_modules/npm/node_modules/@npmcli/query": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.1.tgz", - "integrity": "sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA==", "dev": true, "inBundle": true, "license": "ISC", @@ -8634,8 +8593,6 @@ }, "node_modules/npm/node_modules/@npmcli/run-script": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.2.tgz", - "integrity": "sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==", "dev": true, "inBundle": true, "license": "ISC", @@ -8652,8 +8609,6 @@ }, "node_modules/npm/node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "inBundle": true, "license": "MIT", @@ -8664,8 +8619,6 @@ }, "node_modules/npm/node_modules/@sigstore/bundle": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", - "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -8678,8 +8631,6 @@ }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -8689,8 +8640,6 @@ }, "node_modules/npm/node_modules/@sigstore/sign": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz", - "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -8705,8 +8654,6 @@ }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", - "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -8720,8 +8667,6 @@ }, "node_modules/npm/node_modules/@tufjs/canonical-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, "inBundle": true, "license": "MIT", @@ -8731,8 +8676,6 @@ }, "node_modules/npm/node_modules/@tufjs/models": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", - "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", "dev": true, "inBundle": true, "license": "MIT", @@ -8746,8 +8689,6 @@ }, "node_modules/npm/node_modules/abbrev": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -8757,8 +8698,6 @@ }, "node_modules/npm/node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, "inBundle": true, "license": "MIT", @@ -8771,8 +8710,6 @@ }, "node_modules/npm/node_modules/agent-base": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "inBundle": true, "license": "MIT", @@ -8785,8 +8722,6 @@ }, "node_modules/npm/node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "inBundle": true, "license": "MIT", @@ -8800,8 +8735,6 @@ }, "node_modules/npm/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "inBundle": true, "license": "MIT", @@ -8814,8 +8747,6 @@ }, "node_modules/npm/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "inBundle": true, "license": "MIT", @@ -8828,24 +8759,18 @@ }, "node_modules/npm/node_modules/aproba": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", - "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", "dev": true, "inBundle": true, "license": "ISC", @@ -8859,16 +8784,12 @@ }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -8889,8 +8810,6 @@ }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.3.tgz", - "integrity": "sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==", "dev": true, "inBundle": true, "license": "ISC", @@ -8906,8 +8825,6 @@ }, "node_modules/npm/node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "inBundle": true, "license": "MIT", @@ -8917,8 +8834,6 @@ }, "node_modules/npm/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "inBundle": true, "license": "MIT", @@ -8928,8 +8843,6 @@ }, "node_modules/npm/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -8954,8 +8867,6 @@ }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -8965,8 +8876,6 @@ }, "node_modules/npm/node_modules/cacache": { "version": "18.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.1.tgz", - "integrity": "sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -8990,8 +8899,6 @@ }, "node_modules/npm/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "inBundle": true, "license": "MIT", @@ -9004,8 +8911,6 @@ }, "node_modules/npm/node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -9015,8 +8920,6 @@ }, "node_modules/npm/node_modules/ci-info": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", "dev": true, "funding": [ { @@ -9032,8 +8935,6 @@ }, "node_modules/npm/node_modules/cidr-regex": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-4.0.3.tgz", - "integrity": "sha512-HOwDIy/rhKeMf6uOzxtv7FAbrz8zPjmVKfSpM+U7/bNBXC5rtOyr758jxcptiSx6ZZn5LOhPJT5WWxPAGDV8dw==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -9046,8 +8947,6 @@ }, "node_modules/npm/node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "inBundle": true, "license": "MIT", @@ -9057,8 +8956,6 @@ }, "node_modules/npm/node_modules/cli-columns": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz", - "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9072,8 +8969,6 @@ }, "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9083,8 +8978,6 @@ }, "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -9097,8 +8990,6 @@ }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "inBundle": true, "license": "MIT", @@ -9114,8 +9005,6 @@ }, "node_modules/npm/node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "inBundle": true, "license": "MIT", @@ -9125,8 +9014,6 @@ }, "node_modules/npm/node_modules/cmd-shim": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.2.tgz", - "integrity": "sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw==", "dev": true, "inBundle": true, "license": "ISC", @@ -9136,8 +9023,6 @@ }, "node_modules/npm/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9150,16 +9035,12 @@ }, "node_modules/npm/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/color-support": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "inBundle": true, "license": "ISC", @@ -9169,8 +9050,6 @@ }, "node_modules/npm/node_modules/columnify": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -9184,8 +9063,6 @@ }, "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9195,8 +9072,6 @@ }, "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -9209,24 +9084,18 @@ }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "inBundle": true, "license": "MIT", @@ -9241,8 +9110,6 @@ }, "node_modules/npm/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "inBundle": true, "license": "ISC", @@ -9258,8 +9125,6 @@ }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "inBundle": true, "license": "MIT", @@ -9272,8 +9137,6 @@ }, "node_modules/npm/node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9291,16 +9154,12 @@ }, "node_modules/npm/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "inBundle": true, "license": "MIT", @@ -9313,16 +9172,12 @@ }, "node_modules/npm/node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -9332,24 +9187,18 @@ }, "node_modules/npm/node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "inBundle": true, "license": "MIT", @@ -9360,8 +9209,6 @@ }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "inBundle": true, "license": "MIT", @@ -9371,16 +9218,12 @@ }, "node_modules/npm/node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9390,8 +9233,6 @@ }, "node_modules/npm/node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -9401,16 +9242,12 @@ }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true, "inBundle": true, "license": "Apache-2.0" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "inBundle": true, "license": "MIT", @@ -9420,8 +9257,6 @@ }, "node_modules/npm/node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, "inBundle": true, "license": "ISC", @@ -9438,8 +9273,6 @@ }, "node_modules/npm/node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "inBundle": true, "license": "ISC", @@ -9452,8 +9285,6 @@ }, "node_modules/npm/node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "inBundle": true, "license": "MIT", @@ -9463,8 +9294,6 @@ }, "node_modules/npm/node_modules/gauge": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", - "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -9484,8 +9313,6 @@ }, "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9495,8 +9322,6 @@ }, "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -9509,8 +9334,6 @@ }, "node_modules/npm/node_modules/glob": { "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "inBundle": true, "license": "ISC", @@ -9533,24 +9356,18 @@ }, "node_modules/npm/node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/hasown": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "inBundle": true, "license": "MIT", @@ -9563,8 +9380,6 @@ }, "node_modules/npm/node_modules/hosted-git-info": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "inBundle": true, "license": "ISC", @@ -9577,16 +9392,12 @@ }, "node_modules/npm/node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -9600,8 +9411,6 @@ }, "node_modules/npm/node_modules/https-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dev": true, "inBundle": true, "license": "MIT", @@ -9615,8 +9424,6 @@ }, "node_modules/npm/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "inBundle": true, "license": "MIT", @@ -9630,8 +9437,6 @@ }, "node_modules/npm/node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, "funding": [ { @@ -9652,8 +9457,6 @@ }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", "dev": true, "inBundle": true, "license": "ISC", @@ -9666,8 +9469,6 @@ }, "node_modules/npm/node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "inBundle": true, "license": "MIT", @@ -9677,8 +9478,6 @@ }, "node_modules/npm/node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "inBundle": true, "license": "MIT", @@ -9688,8 +9487,6 @@ }, "node_modules/npm/node_modules/ini": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "inBundle": true, "license": "ISC", @@ -9699,8 +9496,6 @@ }, "node_modules/npm/node_modules/init-package-json": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.0.tgz", - "integrity": "sha512-AmXD+Aht5iZGo/y1KUtZSUQ1SltesXHxQuc7qeNz0eUGx/8WgkHeeQLSFdM8l9YpmnnamGIbAxVdAs2xoLRKRQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -9719,16 +9514,12 @@ }, "node_modules/npm/node_modules/ip": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/ip-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", "dev": true, "inBundle": true, "license": "MIT", @@ -9741,8 +9532,6 @@ }, "node_modules/npm/node_modules/is-cidr": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-5.0.3.tgz", - "integrity": "sha512-lKkM0tmz07dAxNsr8Ii9MGreExa9ZR34N9j8mTG5op824kcwBqinZPowNjcVWWc7j+jR8XAMMItOmBkniN0jOA==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -9755,8 +9544,6 @@ }, "node_modules/npm/node_modules/is-core-module": { "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "inBundle": true, "license": "MIT", @@ -9769,8 +9556,6 @@ }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "inBundle": true, "license": "MIT", @@ -9780,24 +9565,18 @@ }, "node_modules/npm/node_modules/is-lambda": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -9816,8 +9595,6 @@ }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "dev": true, "inBundle": true, "license": "MIT", @@ -9827,8 +9604,6 @@ }, "node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", "dev": true, "inBundle": true, "license": "ISC", @@ -9838,8 +9613,6 @@ }, "node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -9849,24 +9622,18 @@ }, "node_modules/npm/node_modules/just-diff": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", - "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", - "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.2.tgz", - "integrity": "sha512-4K+nsg3OYt4rjryP/3D5zGWluLbZaKozwj6YdtvAyxNhLhUrjCoyxHVoL5AkTJcAnjsd6/ATei52QPVvpSX9Ug==", "dev": true, "inBundle": true, "license": "ISC", @@ -9880,8 +9647,6 @@ }, "node_modules/npm/node_modules/libnpmdiff": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-6.0.4.tgz", - "integrity": "sha512-xLLNTMKbZdE41wi/MZLTYiDYOKRbGS4IU8WgvHPQ001KKlZEa+6Y6C/WVNcRYY5PLh646rtcHlJYYgaAUMFRZQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -9902,8 +9667,6 @@ }, "node_modules/npm/node_modules/libnpmexec": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/libnpmexec/-/libnpmexec-7.0.5.tgz", - "integrity": "sha512-I0a07CiQ2LTKhjd2ZnYQafe9YQrod/GD2uZ1H//j22PBJvIJPUOJdzuqHyoNB/4/6KILaZNX01Mb6dhp8Vr9rw==", "dev": true, "inBundle": true, "license": "ISC", @@ -9926,8 +9689,6 @@ }, "node_modules/npm/node_modules/libnpmfund": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/libnpmfund/-/libnpmfund-5.0.2.tgz", - "integrity": "sha512-rKILSU9zQMkSIAst3QaoqqomqD6NosKALuXjx4hSjt2VUqrzFrGcAu1/e3YCBVdyFo80HFvGbx0AwooXXLilMQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -9940,8 +9701,6 @@ }, "node_modules/npm/node_modules/libnpmhook": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-10.0.1.tgz", - "integrity": "sha512-FnXCweDpoAko6mnLPSW8qrRYicjfh+GrvY5PuYHQRPvaW4BFtHDUmK3K3aYx4yD3TeGAKpj4IigrEDfUfWuSkA==", "dev": true, "inBundle": true, "license": "ISC", @@ -9955,8 +9714,6 @@ }, "node_modules/npm/node_modules/libnpmorg": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-6.0.2.tgz", - "integrity": "sha512-zK4r6cjVsfXf7hWzWGB6R0LBJidVhKaeMWMZL/1eyZS6ixxAxVijfsPacoEnBRCFaXsNjAtwV3b2RCmYU6+usA==", "dev": true, "inBundle": true, "license": "ISC", @@ -9970,8 +9727,6 @@ }, "node_modules/npm/node_modules/libnpmpack": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/libnpmpack/-/libnpmpack-6.0.4.tgz", - "integrity": "sha512-fvwmLPR5vveBeBFdbb5UGHgXSRIjI/JWGIT9JyAXE7ax1GAPdsMSgAP8/OBZat2pQGJhKjRHL5tgvwZ1u6Vi7Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -9987,8 +9742,6 @@ }, "node_modules/npm/node_modules/libnpmpublish": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.3.tgz", - "integrity": "sha512-XoF0QgT1Ph9RMBfTwiwZeRN4Rs5t4w1POaRxaoVoWCMUqysswwlAPu3ZZJDNbh7asXBWXcXTJziDWkInhpbiBg==", "dev": true, "inBundle": true, "license": "ISC", @@ -10008,8 +9761,6 @@ }, "node_modules/npm/node_modules/libnpmsearch": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-7.0.1.tgz", - "integrity": "sha512-XyKi6Y94t6PGd5Lk2Ma3+fgiHWD3KSCvXmHOrcLkAOEP7oUejbNjL0Bb/HUDZXgBj6gP1Qk7pJ6jZPFBc2hmXQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -10022,8 +9773,6 @@ }, "node_modules/npm/node_modules/libnpmteam": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-6.0.1.tgz", - "integrity": "sha512-1YytqVk1gSkKFNMe4kkCKN49y5rlABrRSx5TrYShQtt2Lb4uQaed49dGE7Ue8TJGxbIkHzvyyVtb3PBiGACVqw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10037,8 +9786,6 @@ }, "node_modules/npm/node_modules/libnpmversion": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/libnpmversion/-/libnpmversion-5.0.2.tgz", - "integrity": "sha512-6JBnLhd6SYgKRekJ4cotxpURLGbEtKxzw+a8p5o+wNwrveJPMH8yW/HKjeewyHzWmxzzwn9EQ3TkF2onkrwstA==", "dev": true, "inBundle": true, "license": "ISC", @@ -10055,8 +9802,6 @@ }, "node_modules/npm/node_modules/lru-cache": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "inBundle": true, "license": "ISC", @@ -10066,8 +9811,6 @@ }, "node_modules/npm/node_modules/make-fetch-happen": { "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", "dev": true, "inBundle": true, "license": "ISC", @@ -10090,8 +9833,6 @@ }, "node_modules/npm/node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "inBundle": true, "license": "ISC", @@ -10107,8 +9848,6 @@ }, "node_modules/npm/node_modules/minipass": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -10118,8 +9857,6 @@ }, "node_modules/npm/node_modules/minipass-collect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10132,8 +9869,6 @@ }, "node_modules/npm/node_modules/minipass-fetch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "inBundle": true, "license": "MIT", @@ -10151,8 +9886,6 @@ }, "node_modules/npm/node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10165,8 +9898,6 @@ }, "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10179,8 +9910,6 @@ }, "node_modules/npm/node_modules/minipass-json-stream": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, "inBundle": true, "license": "MIT", @@ -10191,8 +9920,6 @@ }, "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10205,8 +9932,6 @@ }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "inBundle": true, "license": "ISC", @@ -10219,8 +9944,6 @@ }, "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10233,8 +9956,6 @@ }, "node_modules/npm/node_modules/minipass-sized": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "inBundle": true, "license": "ISC", @@ -10247,8 +9968,6 @@ }, "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10261,8 +9980,6 @@ }, "node_modules/npm/node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "inBundle": true, "license": "MIT", @@ -10276,8 +9993,6 @@ }, "node_modules/npm/node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10290,8 +10005,6 @@ }, "node_modules/npm/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "inBundle": true, "license": "MIT", @@ -10304,16 +10017,12 @@ }, "node_modules/npm/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, "inBundle": true, "license": "ISC", @@ -10323,8 +10032,6 @@ }, "node_modules/npm/node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "inBundle": true, "license": "MIT", @@ -10334,8 +10041,6 @@ }, "node_modules/npm/node_modules/node-gyp": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", "dev": true, "inBundle": true, "license": "MIT", @@ -10360,8 +10065,6 @@ }, "node_modules/npm/node_modules/nopt": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "inBundle": true, "license": "ISC", @@ -10377,8 +10080,6 @@ }, "node_modules/npm/node_modules/normalize-package-data": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -10394,8 +10095,6 @@ }, "node_modules/npm/node_modules/npm-audit-report": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-5.0.0.tgz", - "integrity": "sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10405,8 +10104,6 @@ }, "node_modules/npm/node_modules/npm-bundled": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -10419,8 +10116,6 @@ }, "node_modules/npm/node_modules/npm-install-checks": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -10433,8 +10128,6 @@ }, "node_modules/npm/node_modules/npm-normalize-package-bin": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -10444,8 +10137,6 @@ }, "node_modules/npm/node_modules/npm-package-arg": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -10461,8 +10152,6 @@ }, "node_modules/npm/node_modules/npm-packlist": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.1.tgz", - "integrity": "sha512-MQpL27ZrsJQ2kiAuQPpZb5LtJwydNRnI15QWXsf3WHERu4rzjRj6Zju/My2fov7tLuu3Gle/uoIX/DDZ3u4O4Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -10475,8 +10164,6 @@ }, "node_modules/npm/node_modules/npm-pick-manifest": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", - "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", "dev": true, "inBundle": true, "license": "ISC", @@ -10492,8 +10179,6 @@ }, "node_modules/npm/node_modules/npm-profile": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-9.0.0.tgz", - "integrity": "sha512-qv43ixsJ7vndzfxD3XsPNu1Njck6dhO7q1efksTo+0DiOQysKSOsIhK/qDD1/xO2o+2jDOA4Rv/zOJ9KQFs9nw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10507,8 +10192,6 @@ }, "node_modules/npm/node_modules/npm-registry-fetch": { "version": "16.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", - "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10527,8 +10210,6 @@ }, "node_modules/npm/node_modules/npm-user-validate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-2.0.0.tgz", - "integrity": "sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q==", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -10538,8 +10219,6 @@ }, "node_modules/npm/node_modules/npmlog": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", - "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", "dev": true, "inBundle": true, "license": "ISC", @@ -10555,8 +10234,6 @@ }, "node_modules/npm/node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -10572,8 +10249,6 @@ }, "node_modules/npm/node_modules/pacote": { "version": "17.0.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.5.tgz", - "integrity": "sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA==", "dev": true, "inBundle": true, "license": "ISC", @@ -10606,8 +10281,6 @@ }, "node_modules/npm/node_modules/parse-conflict-json": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", - "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10622,8 +10295,6 @@ }, "node_modules/npm/node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -10633,8 +10304,6 @@ }, "node_modules/npm/node_modules/path-scurry": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -10651,8 +10320,6 @@ }, "node_modules/npm/node_modules/postcss-selector-parser": { "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -10666,8 +10333,6 @@ }, "node_modules/npm/node_modules/proc-log": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true, "inBundle": true, "license": "ISC", @@ -10677,8 +10342,6 @@ }, "node_modules/npm/node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, "inBundle": true, "license": "MIT", @@ -10688,8 +10351,6 @@ }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10699,8 +10360,6 @@ }, "node_modules/npm/node_modules/promise-call-limit": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", - "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", "dev": true, "inBundle": true, "license": "ISC", @@ -10710,16 +10369,12 @@ }, "node_modules/npm/node_modules/promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "inBundle": true, "license": "MIT", @@ -10733,8 +10388,6 @@ }, "node_modules/npm/node_modules/promzard": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.0.tgz", - "integrity": "sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==", "dev": true, "inBundle": true, "license": "ISC", @@ -10747,8 +10400,6 @@ }, "node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", "dev": true, "inBundle": true, "bin": { @@ -10757,8 +10408,6 @@ }, "node_modules/npm/node_modules/read": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read/-/read-2.1.0.tgz", - "integrity": "sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -10771,8 +10420,6 @@ }, "node_modules/npm/node_modules/read-cmd-shim": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", "dev": true, "inBundle": true, "license": "ISC", @@ -10782,8 +10429,6 @@ }, "node_modules/npm/node_modules/read-package-json": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", - "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", "dev": true, "inBundle": true, "license": "ISC", @@ -10799,8 +10444,6 @@ }, "node_modules/npm/node_modules/read-package-json-fast": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10830,8 +10473,6 @@ }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "inBundle": true, "license": "MIT", @@ -10841,8 +10482,6 @@ }, "node_modules/npm/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -10863,8 +10502,6 @@ }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "inBundle": true, "license": "MIT", @@ -10872,8 +10509,6 @@ }, "node_modules/npm/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "inBundle": true, "license": "ISC", @@ -10889,8 +10524,6 @@ }, "node_modules/npm/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "inBundle": true, "license": "ISC", @@ -10903,16 +10536,12 @@ }, "node_modules/npm/node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "inBundle": true, "license": "MIT", @@ -10925,8 +10554,6 @@ }, "node_modules/npm/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "inBundle": true, "license": "MIT", @@ -10936,8 +10563,6 @@ }, "node_modules/npm/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "inBundle": true, "license": "ISC", @@ -10950,8 +10575,6 @@ }, "node_modules/npm/node_modules/sigstore": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", - "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -10967,8 +10590,6 @@ }, "node_modules/npm/node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "inBundle": true, "license": "MIT", @@ -10979,8 +10600,6 @@ }, "node_modules/npm/node_modules/socks": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -10995,8 +10614,6 @@ }, "node_modules/npm/node_modules/socks-proxy-agent": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "dev": true, "inBundle": true, "license": "MIT", @@ -11011,8 +10628,6 @@ }, "node_modules/npm/node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -11023,16 +10638,12 @@ }, "node_modules/npm/node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true, "inBundle": true, "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -11043,16 +10654,12 @@ }, "node_modules/npm/node_modules/spdx-license-ids": { "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true, "inBundle": true, "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "inBundle": true, "license": "ISC", @@ -11065,8 +10672,6 @@ }, "node_modules/npm/node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "inBundle": true, "license": "MIT", @@ -11076,8 +10681,6 @@ }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "inBundle": true, "license": "MIT", @@ -11093,8 +10696,6 @@ "node_modules/npm/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "inBundle": true, "license": "MIT", @@ -11109,8 +10710,6 @@ }, "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -11120,8 +10719,6 @@ }, "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -11134,8 +10731,6 @@ }, "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -11145,8 +10740,6 @@ }, "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -11159,8 +10752,6 @@ }, "node_modules/npm/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -11177,8 +10768,6 @@ "node_modules/npm/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -11191,8 +10780,6 @@ }, "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -11202,8 +10789,6 @@ }, "node_modules/npm/node_modules/supports-color": { "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "inBundle": true, "license": "MIT", @@ -11216,8 +10801,6 @@ }, "node_modules/npm/node_modules/tar": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -11235,8 +10818,6 @@ }, "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "inBundle": true, "license": "ISC", @@ -11249,8 +10830,6 @@ }, "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "inBundle": true, "license": "ISC", @@ -11263,8 +10842,6 @@ }, "node_modules/npm/node_modules/tar/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -11274,24 +10851,18 @@ }, "node_modules/npm/node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz", - "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -11301,8 +10872,6 @@ }, "node_modules/npm/node_modules/tuf-js": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", - "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", "dev": true, "inBundle": true, "license": "MIT", @@ -11317,8 +10886,6 @@ }, "node_modules/npm/node_modules/unique-filename": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "inBundle": true, "license": "ISC", @@ -11331,8 +10898,6 @@ }, "node_modules/npm/node_modules/unique-slug": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -11345,16 +10910,12 @@ }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -11365,8 +10926,6 @@ }, "node_modules/npm/node_modules/validate-npm-package-name": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -11379,16 +10938,12 @@ }, "node_modules/npm/node_modules/walk-up-path": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "inBundle": true, "license": "MIT", @@ -11398,8 +10953,6 @@ }, "node_modules/npm/node_modules/which": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "inBundle": true, "license": "ISC", @@ -11415,8 +10968,6 @@ }, "node_modules/npm/node_modules/which/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "inBundle": true, "license": "ISC", @@ -11426,8 +10977,6 @@ }, "node_modules/npm/node_modules/wide-align": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "inBundle": true, "license": "ISC", @@ -11437,8 +10986,6 @@ }, "node_modules/npm/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -11457,8 +11004,6 @@ "node_modules/npm/node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -11476,8 +11021,6 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -11487,8 +11030,6 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "inBundle": true, "license": "MIT", @@ -11504,8 +11045,6 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -11518,16 +11057,12 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "inBundle": true, "license": "MIT", @@ -11545,8 +11080,6 @@ }, "node_modules/npm/node_modules/write-file-atomic": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "inBundle": true, "license": "ISC", @@ -11560,8 +11093,6 @@ }, "node_modules/npm/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "inBundle": true, "license": "ISC" diff --git a/package.json b/package.json index 60c56c5..158b4bd 100644 --- a/package.json +++ b/package.json @@ -29,17 +29,19 @@ "aarch64-unknown-linux-musl", "aarch64-pc-windows-msvc", "armv7-unknown-linux-gnueabihf", + "armv7-unknown-linux-musleabihf", "x86_64-unknown-linux-musl", "x86_64-unknown-freebsd", "i686-pc-windows-msvc", "armv7-linux-androideabi", - "universal-apple-darwin" + "universal-apple-darwin", + "riscv64gc-unknown-linux-gnu" ] } }, "license": "MIT", "devDependencies": { - "@napi-rs/cli": "^2.15.1", + "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", "@types/node": "^18.15.5", From 8a7cb934b7c3eafd7d86c264a9358732b605379b Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 3 May 2024 21:08:57 +0700 Subject: [PATCH 15/63] fix: publish npm bin packages (#115) --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 43f1212..1d76bdd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,20 +22,20 @@ jobs: - build_and_test steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.CI_GITHUB_TOKEN }} persist-credentials: false - name: Setup LTS Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "lts/*" cache: "npm" - name: Install dependencies run: npm ci - name: Download all artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: path: artifacts - name: Move artifacts From 45f526a7abc1326f967dcf1b69bb15396c350660 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 May 2024 01:53:18 +0700 Subject: [PATCH 16/63] fix: make all binary packages public (#116) --- npm/android-arm-eabi/package.json | 3 +++ npm/android-arm64/package.json | 3 +++ npm/darwin-arm64/package.json | 3 +++ npm/darwin-universal/package.json | 3 +++ npm/darwin-x64/package.json | 3 +++ npm/freebsd-x64/package.json | 3 +++ npm/linux-arm-gnueabihf/package.json | 3 +++ npm/linux-arm-musleabihf/package.json | 3 +++ npm/linux-arm64-gnu/package.json | 5 ++++- npm/linux-arm64-musl/package.json | 5 ++++- npm/linux-riscv64-gnu/package.json | 5 ++++- npm/linux-x64-gnu/package.json | 5 ++++- npm/linux-x64-musl/package.json | 5 ++++- npm/win32-arm64-msvc/package.json | 3 +++ npm/win32-ia32-msvc/package.json | 3 +++ npm/win32-x64-msvc/package.json | 3 +++ 16 files changed, 53 insertions(+), 5 deletions(-) diff --git a/npm/android-arm-eabi/package.json b/npm/android-arm-eabi/package.json index fcef19a..1e44b1f 100644 --- a/npm/android-arm-eabi/package.json +++ b/npm/android-arm-eabi/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/android-arm64/package.json b/npm/android-arm64/package.json index 475db87..d884875 100644 --- a/npm/android-arm64/package.json +++ b/npm/android-arm64/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/darwin-arm64/package.json b/npm/darwin-arm64/package.json index b450955..4059c10 100644 --- a/npm/darwin-arm64/package.json +++ b/npm/darwin-arm64/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/darwin-universal/package.json b/npm/darwin-universal/package.json index bf2080b..2e67953 100644 --- a/npm/darwin-universal/package.json +++ b/npm/darwin-universal/package.json @@ -11,5 +11,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/darwin-x64/package.json b/npm/darwin-x64/package.json index 1af976b..e3eba12 100644 --- a/npm/darwin-x64/package.json +++ b/npm/darwin-x64/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/freebsd-x64/package.json b/npm/freebsd-x64/package.json index 2709113..4702435 100644 --- a/npm/freebsd-x64/package.json +++ b/npm/freebsd-x64/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/linux-arm-gnueabihf/package.json b/npm/linux-arm-gnueabihf/package.json index 9767cbb..d267d0f 100644 --- a/npm/linux-arm-gnueabihf/package.json +++ b/npm/linux-arm-gnueabihf/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/linux-arm-musleabihf/package.json b/npm/linux-arm-musleabihf/package.json index ef8bcda..cbc95c4 100644 --- a/npm/linux-arm-musleabihf/package.json +++ b/npm/linux-arm-musleabihf/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/linux-arm64-gnu/package.json b/npm/linux-arm64-gnu/package.json index 098e7b0..b922ae9 100644 --- a/npm/linux-arm64-gnu/package.json +++ b/npm/linux-arm64-gnu/package.json @@ -17,5 +17,8 @@ }, "libc": [ "glibc" - ] + ], + "publishConfig": { + "access": "public" + } } diff --git a/npm/linux-arm64-musl/package.json b/npm/linux-arm64-musl/package.json index 4e4c9f2..6cd3b11 100644 --- a/npm/linux-arm64-musl/package.json +++ b/npm/linux-arm64-musl/package.json @@ -17,5 +17,8 @@ }, "libc": [ "musl" - ] + ], + "publishConfig": { + "access": "public" + } } diff --git a/npm/linux-riscv64-gnu/package.json b/npm/linux-riscv64-gnu/package.json index 3ad9495..bae82d5 100644 --- a/npm/linux-riscv64-gnu/package.json +++ b/npm/linux-riscv64-gnu/package.json @@ -17,5 +17,8 @@ }, "libc": [ "glibc" - ] + ], + "publishConfig": { + "access": "public" + } } diff --git a/npm/linux-x64-gnu/package.json b/npm/linux-x64-gnu/package.json index ecda72a..8e0f237 100644 --- a/npm/linux-x64-gnu/package.json +++ b/npm/linux-x64-gnu/package.json @@ -17,5 +17,8 @@ }, "libc": [ "glibc" - ] + ], + "publishConfig": { + "access": "public" + } } diff --git a/npm/linux-x64-musl/package.json b/npm/linux-x64-musl/package.json index e69fb9b..8dc2626 100644 --- a/npm/linux-x64-musl/package.json +++ b/npm/linux-x64-musl/package.json @@ -17,5 +17,8 @@ }, "libc": [ "musl" - ] + ], + "publishConfig": { + "access": "public" + } } diff --git a/npm/win32-arm64-msvc/package.json b/npm/win32-arm64-msvc/package.json index 0d668c0..81901fd 100644 --- a/npm/win32-arm64-msvc/package.json +++ b/npm/win32-arm64-msvc/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/win32-ia32-msvc/package.json b/npm/win32-ia32-msvc/package.json index 72b3ea9..fa18d1d 100644 --- a/npm/win32-ia32-msvc/package.json +++ b/npm/win32-ia32-msvc/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } diff --git a/npm/win32-x64-msvc/package.json b/npm/win32-x64-msvc/package.json index 6bcbbbc..d7c0428 100644 --- a/npm/win32-x64-msvc/package.json +++ b/npm/win32-x64-msvc/package.json @@ -14,5 +14,8 @@ "license": "MIT", "engines": { "node": ">= 10" + }, + "publishConfig": { + "access": "public" } } From 60eade87edcddf34c5956b944eba2cf134ce0e03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 02:16:50 +0700 Subject: [PATCH 17/63] chore(deps-dev): bump @types/node from 18.15.5 to 20.12.8 (#108) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.15.5 to 20.12.8. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 137 +++++----------------------------------------- package.json | 2 +- 2 files changed, 14 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index b810d93..c9e215a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", - "@types/node": "^18.15.5", + "@types/node": "^20.12.8", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", @@ -1392,13 +1392,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", @@ -1447,13 +1440,6 @@ } } }, - "node_modules/@jest/core/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -1470,13 +1456,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/environment/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", @@ -1522,13 +1501,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", @@ -1617,13 +1589,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jest/reporters/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/reporters/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1851,13 +1816,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -2648,13 +2606,6 @@ "@types/node": "*" } }, - "node_modules/@types/graceful-fs/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -2708,11 +2659,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "18.15.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", - "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", + "version": "20.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", + "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", "dev": true, - "license": "MIT" + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", @@ -6606,13 +6559,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", @@ -6693,13 +6639,6 @@ } } }, - "node_modules/jest-config/node_modules/@types/node": { - "version": "18.15.6", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/jest-config/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6809,13 +6748,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-node/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -6852,13 +6784,6 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-haste-map/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", @@ -6925,13 +6850,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-mock/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -7028,13 +6946,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", @@ -7069,13 +6980,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-runtime/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7181,13 +7085,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", @@ -7226,13 +7123,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -7249,13 +7139,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/node_modules/@types/node": { - "version": "18.15.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.6.tgz", - "integrity": "sha512-YErOafCZpK4g+Rp3Q/PBgZNAsWKGunQTm9FA3/Pbcm0VCriTEzcrutQ/SxSc0rytAp0NoFWue669jmKhEtd0sA==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -13533,6 +13416,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", diff --git a/package.json b/package.json index 158b4bd..188f7ae 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", - "@types/node": "^18.15.5", + "@types/node": "^20.12.8", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", From 7730ba1b29880549559ce5d4d4251ec167327401 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 02:38:53 +0700 Subject: [PATCH 18/63] chore(deps-dev): bump @types/jest from 29.5.0 to 29.5.12 (#90) Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 29.5.0 to 29.5.12. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest) --- updated-dependencies: - dependency-name: "@types/jest" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9e215a..42dfd6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2634,11 +2634,10 @@ } }, "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" From 6826c83dd74a7a4bd694304805eebb81b3605407 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 02:40:03 +0700 Subject: [PATCH 19/63] chore(deps-dev): bump ts-jest from 29.0.5 to 29.1.2 (#59) Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.0.5 to 29.1.2. - [Release notes](https://github.com/kulshekhar/ts-jest/releases) - [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.0.5...v29.1.2) --- updated-dependencies: - dependency-name: ts-jest dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42dfd6b..44c23fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13116,11 +13116,10 @@ } }, "node_modules/ts-jest": { - "version": "29.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", - "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -13128,21 +13127,21 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", - "typescript": ">=4.3" + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { From e8541b96cd985d763cb487196c0aeff90ec10c42 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Sat, 4 May 2024 14:19:23 +0200 Subject: [PATCH 20/63] feat: add set_from_string (#121) relates-to: fmeringdal/rust-rrule#105 --- __test__/parsing.spec.ts | 15 ++++++++++++++- index.d.ts | 1 + src/js/rrule_set.rs | 11 +++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/__test__/parsing.spec.ts b/__test__/parsing.spec.ts index d08fcef..0f54ca6 100644 --- a/__test__/parsing.spec.ts +++ b/__test__/parsing.spec.ts @@ -1,4 +1,4 @@ -import { Frequency, Weekday, RRule, RRuleSet } from '../'; +import { Frequency, Weekday, RRule, RRuleSet, RRuleDateTime } from '../'; test('Should properly parse weekly recurrence', () => { const set = RRuleSet.parse( @@ -169,3 +169,16 @@ test('Should throw error on invalid individual recurrence rule week start', () = 'RRule parsing error: `Invalid` is not a valid weekday start. Valid values are `MO`, `TU`, `WE`, `TH`, `FR`, `SA` and `SU`.', ); }); + +test('Should be able to parse rule set without dtstart', () => { + const set = new RRuleSet( + new RRuleDateTime(new Date('1997-09-02T09:00:00-04:00'), 'US/Eastern'), + ); + set.setFromString( + 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', + ); + const asString = set.toString(); + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + ); +}); diff --git a/index.d.ts b/index.d.ts index 91053fc..2e104c1 100644 --- a/index.d.ts +++ b/index.d.ts @@ -94,6 +94,7 @@ export class RRuleDateTime { } export class RRuleSet { constructor(dtstart: RRuleDateTime | Date) + setFromString(str: string): this static parse(str: string): RRuleSet toString(): string addRrule(jsRrule: RRule): this diff --git a/src/js/rrule_set.rs b/src/js/rrule_set.rs index 72162b6..9b1fe3d 100644 --- a/src/js/rrule_set.rs +++ b/src/js/rrule_set.rs @@ -22,6 +22,17 @@ impl RRuleSet { Ok(RRuleSet { rrule_set }) } + #[napi] + pub fn set_from_string(&mut self, str: String) -> napi::Result<&Self> { + let cloned = self + .rrule_set + .clone() + .set_from_string(&str) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + *self = RRuleSet { rrule_set: cloned }; + Ok(self) + } + #[napi(factory, ts_return_type = "RRuleSet")] pub fn parse(str: String) -> napi::Result { let rrule_set: rrule::RRuleSet = str From 8675858d4f72bf20c30caf0ef91d46866925d5af Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 May 2024 19:37:27 +0700 Subject: [PATCH 21/63] ci(release): run workflow sequentially (#122) --- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 0045fa4..4e0b583 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,6 +1,6 @@ name: "Build & Test" concurrency: - group: ${{ github.ref }} + group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: pull_request: null diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1d76bdd..e2dacc4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,7 @@ name: Release +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false on: push: branches: From e9107642663454c725f2c811cb20dd9eb7638f1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 20:09:28 +0700 Subject: [PATCH 22/63] chore(deps-dev): bump typescript from 4.9.5 to 5.4.5 (#118) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.9.5 to 5.4.5. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.9.5...v5.4.5) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 11 +++++------ package.json | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44c23fe..ab3839c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "semantic-release": "^22.0.12", "ts-jest": "^29.0.5", "ts-node": "^10.9.1", - "typescript": "^4.9.4" + "typescript": "^5.4.5" }, "engines": { "node": ">= 10" @@ -13371,17 +13371,16 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uglify-js": { diff --git a/package.json b/package.json index 188f7ae..e9e7d7f 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "semantic-release": "^22.0.12", "ts-jest": "^29.0.5", "ts-node": "^10.9.1", - "typescript": "^4.9.4" + "typescript": "^5.4.5" }, "pre-commit": [ "lint:fix-staged" From 89e50cf351b96b3d1437bdcf6c8496546b463e37 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 May 2024 20:09:53 +0700 Subject: [PATCH 23/63] chore: replace `pre-commit` with `husky` and fix `commitlint` (#123) --- .github/workflows/pr.yml | 2 + .github/workflows/release.yml | 2 + .husky/commit-msg | 1 + .husky/pre-commit | 1 + commitlint.config.ts | 1 + package-lock.json | 725 +++++++++++++++++++++++++++------- package.json | 10 +- 7 files changed, 589 insertions(+), 153 deletions(-) create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 commitlint.config.ts diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 4e0b583..dcbc9d0 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,4 +1,6 @@ name: "Build & Test" +env: + HUSKY: 0 concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e2dacc4..53f5d85 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,6 @@ name: Release +env: + HUSKY: 0 concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..13b7c68 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx commitlint --edit ${1} \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..748a436 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm run lint:fix-staged \ No newline at end of file diff --git a/commitlint.config.ts b/commitlint.config.ts new file mode 100644 index 0000000..422b194 --- /dev/null +++ b/commitlint.config.ts @@ -0,0 +1 @@ +module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/package-lock.json b/package-lock.json index ab3839c..9af1f48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "0.0.0", "license": "MIT", "devDependencies": { + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", @@ -22,9 +24,9 @@ "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-prettier": "^4.2.1", + "husky": "^9.0.11", "jest": "^29.5.0", "lint-staged": "^13.1.0", - "pre-commit": "^1.2.2", "prettier": "^2.8.3", "rrule": "^2.7.2", "semantic-release": "^22.0.12", @@ -1145,6 +1147,414 @@ "node": ">=0.1.90" } }, + "node_modules/@commitlint/cli": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", + "dev": true, + "dependencies": { + "@commitlint/format": "^19.3.0", + "@commitlint/lint": "^19.2.2", + "@commitlint/load": "^19.2.0", + "@commitlint/read": "^19.2.1", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", + "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@commitlint/ensure": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", + "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", + "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/lint": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^19.2.2", + "@commitlint/parse": "^19.0.3", + "@commitlint/rules": "^19.0.3", + "@commitlint/types": "^19.0.3" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", + "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/execute-rule": "^19.0.0", + "@commitlint/resolve-extends": "^19.1.0", + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@commitlint/message": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", + "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", + "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", + "integrity": "sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", + "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/types": "^19.0.3", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", + "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^19.0.3", + "@commitlint/message": "^19.0.0", + "@commitlint/to-lines": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", + "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", + "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", + "dev": true, + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", + "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", + "dev": true, + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2596,6 +3006,15 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -3898,22 +4317,6 @@ "dev": true, "license": "MIT" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -4042,6 +4445,23 @@ } } }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -4131,6 +4551,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4372,6 +4804,15 @@ "node": "^18.17 || >=20.6.1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5487,6 +5928,23 @@ "through2": "~2.0.0" } }, + "node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -5500,6 +5958,30 @@ "node": ">= 6" } }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -5797,6 +6279,21 @@ "node": ">=16.17.0" } }, + "node_modules/husky": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "dev": true, + "bin": { + "husky": "bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -7154,6 +7651,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7572,6 +8078,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "node_modules/lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", @@ -7607,6 +8119,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7621,6 +8139,30 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, "node_modules/lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", @@ -7628,6 +8170,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -11111,15 +11659,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/p-each-series": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", @@ -11533,98 +12072,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pre-commit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", - "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^5.0.1", - "spawn-sync": "^1.0.15", - "which": "1.2.x" - } - }, - "node_modules/pre-commit/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/pre-commit/node_modules/cross-spawn/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/pre-commit/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/pre-commit/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pre-commit/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pre-commit/node_modules/which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/pre-commit/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11730,13 +12177,6 @@ "dev": true, "license": "ISC" }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true, - "license": "ISC" - }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -12048,6 +12488,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -12342,11 +12791,10 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12647,18 +13095,6 @@ "dev": true, "license": "MIT" }, - "node_modules/spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -13363,13 +13799,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "license": "MIT" - }, "node_modules/typescript": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", diff --git a/package.json b/package.json index e9e7d7f..1a6b4e7 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,8 @@ }, "license": "MIT", "devDependencies": { + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", @@ -54,9 +56,9 @@ "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-prettier": "^4.2.1", + "husky": "^9.0.11", "jest": "^29.5.0", "lint-staged": "^13.1.0", - "pre-commit": "^1.2.2", "prettier": "^2.8.3", "rrule": "^2.7.2", "semantic-release": "^22.0.12", @@ -64,9 +66,6 @@ "ts-node": "^10.9.1", "typescript": "^5.4.5" }, - "pre-commit": [ - "lint:fix-staged" - ], "lint-staged": { "**/*.{js,ts,json}": "eslint --fix --max-warnings=0", "**/*.rs": "rustfmt" @@ -85,6 +84,7 @@ "benchmark": "ts-node ./benchmark/index.ts", "lint": "cargo fmt --all -- --check && eslint \"**/*.{js,ts,json}\" --max-warnings=0", "lint:fix": "cargo fmt --all && npm run lint --fix", - "lint:fix-staged": "lint-staged" + "lint:fix-staged": "lint-staged", + "prepare": "husky" } } From 12009b6912a64c0d0e6217256c5934e04a0388d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 20:31:39 +0700 Subject: [PATCH 24/63] chore(deps-dev): bump semantic-release from 22.0.12 to 23.0.8 (#120) Bumps [semantic-release](https://github.com/semantic-release/semantic-release) from 22.0.12 to 23.0.8. - [Release notes](https://github.com/semantic-release/semantic-release/releases) - [Commits](https://github.com/semantic-release/semantic-release/compare/v22.0.12...v23.0.8) --- updated-dependencies: - dependency-name: semantic-release dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 2205 ++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 761 insertions(+), 1446 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9af1f48..fa7b552 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "lint-staged": "^13.1.0", "prettier": "^2.8.3", "rrule": "^2.7.2", - "semantic-release": "^22.0.12", + "semantic-release": "^23.0.8", "ts-jest": "^29.0.5", "ts-node": "^10.9.1", "typescript": "^5.4.5" @@ -124,13 +124,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -274,20 +274,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name/node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-function-name/node_modules/@babel/helper-string-parser": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", @@ -298,31 +284,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-function-name/node_modules/@babel/parser": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", @@ -366,74 +327,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-function-name/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-function-name/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/helper-function-name/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/helper-function-name/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-function-name/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", @@ -457,16 +350,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", @@ -562,11 +445,10 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -597,15 +479,15 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -616,7 +498,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -629,7 +510,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -644,7 +524,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -653,15 +532,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -671,7 +548,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -920,20 +796,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/traverse/node_modules/@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", @@ -983,31 +845,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/traverse/node_modules/@babel/parser": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", @@ -1036,51 +873,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/traverse/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1091,29 +883,6 @@ "node": ">=4" } }, - "node_modules/@babel/traverse/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { "version": "7.21.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", @@ -1141,7 +910,6 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -1328,32 +1096,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@commitlint/load/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@commitlint/message": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", @@ -2334,160 +2076,147 @@ } }, "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", - "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", + "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.0.0", - "@octokit/request": "^8.0.2", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.0.0", + "@octokit/request": "^9.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", - "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/graphql": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", - "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", + "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/request": "^8.0.1", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/request": "^9.0.0", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/openapi-types": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", - "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", - "dev": true, - "license": "MIT" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", - "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.0.tgz", + "integrity": "sha512-n4znWfRinnUQF6TPyxs7EctSAA3yVSP4qlJP2YgI3g9d4Ae2n5F3XDOjbUluKRxPU3rfsgpOboI4O4VtPc6Ilg==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^12.4.0" + "@octokit/types": "^13.5.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=5" + "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-retry": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz", - "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.1.tgz", + "integrity": "sha512-G9Ue+x2odcb8E1XIPhaFBnTTIrrUDfXN05iFXiqhR+SeeeDMMILcAnysOsxUpEWcQp2e5Ft397FCXTcPkiPkLw==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", + "@octokit/request-error": "^6.0.0", + "@octokit/types": "^13.0.0", "bottleneck": "^2.15.3" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=5" + "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-throttling": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz", - "integrity": "sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.0.tgz", + "integrity": "sha512-B5YTToSRTzNSeEyssnrT7WwGhpIdbpV9NKIs3KyTWHX6PhpYn7gqF/+lL3BvsASBM3Sg5BAUYk7KZx5p/Ec77w==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^12.2.0", + "@octokit/types": "^13.0.0", "bottleneck": "^2.15.3" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": "^5.0.0" + "@octokit/core": "^6.0.0" } }, "node_modules/@octokit/request": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", - "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz", + "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/request-error": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", - "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz", + "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^12.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@octokit/types": "^13.0.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/types": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", - "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^19.1.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@pnpm/config.env-replace": { @@ -2495,7 +2224,6 @@ "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.22.0" } @@ -2505,7 +2233,6 @@ "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -2517,15 +2244,13 @@ "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@pnpm/npm-conf": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", "dev": true, - "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -2536,11 +2261,10 @@ } }, "node_modules/@semantic-release/commit-analyzer": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz", - "integrity": "sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-12.0.0.tgz", + "integrity": "sha512-qG+md5gdes+xa8zP7lIo1fWE17zRdO8yMCaxh9lyL65TQleoSv8WHHOqRURfghTytUh+NpkSyBprQ5hrkxOKVQ==", "dev": true, - "license": "MIT", "dependencies": { "conventional-changelog-angular": "^7.0.0", "conventional-commits-filter": "^4.0.0", @@ -2551,7 +2275,7 @@ "micromatch": "^4.0.2" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": ">=20.8.1" }, "peerDependencies": { "semantic-release": ">=20.1.0" @@ -2562,7 +2286,6 @@ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } @@ -2705,16 +2428,15 @@ } }, "node_modules/@semantic-release/github": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", - "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.0.3.tgz", + "integrity": "sha512-nSJQboKrG4xBn7hHpRMrK8lt5DgqJg50ZMz9UbrsfTxuRk55XVoQEadbGZ2L9M0xZAC6hkuwkDhQJKqfPU35Fw==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/core": "^5.0.0", - "@octokit/plugin-paginate-rest": "^9.0.0", - "@octokit/plugin-retry": "^6.0.0", - "@octokit/plugin-throttling": "^8.0.0", + "@octokit/core": "^6.0.0", + "@octokit/plugin-paginate-rest": "^11.0.0", + "@octokit/plugin-retry": "^7.0.0", + "@octokit/plugin-throttling": "^9.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", @@ -2722,44 +2444,26 @@ "globby": "^14.0.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", + "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", "p-filter": "^4.0.0", "url-join": "^5.0.0" }, "engines": { - "node": ">=18" + "node": ">=20.8.1" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, - "node_modules/@semantic-release/github/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/@semantic-release/github/node_modules/globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", "dev": true, - "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^1.0.0", + "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", "ignore": "^5.2.4", "path-type": "^5.0.0", @@ -2778,7 +2482,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -2791,7 +2494,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -2800,11 +2502,10 @@ } }, "node_modules/@semantic-release/npm": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.2.tgz", - "integrity": "sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.0.tgz", + "integrity": "sha512-72TVYQCH9NvVsO/y13eF8vE4bNnfls518+4KcFwJUKi7AtA/ZXoNgSg9gTTfw5eMZMkiH0izUrpGXgZE/cSQhA==", "dev": true, - "license": "MIT", "dependencies": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", @@ -2813,7 +2514,7 @@ "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", "normalize-url": "^8.0.0", - "npm": "^10.0.0", + "npm": "^10.5.0", "rc": "^1.2.8", "read-pkg": "^9.0.0", "registry-auth-token": "^5.0.0", @@ -2821,7 +2522,7 @@ "tempy": "^3.0.0" }, "engines": { - "node": "^18.17 || >=20" + "node": ">=20.8.1" }, "peerDependencies": { "semantic-release": ">=20.1.0" @@ -2832,7 +2533,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2843,11 +2543,10 @@ } }, "node_modules/@semantic-release/release-notes-generator": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.1.0.tgz", - "integrity": "sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-13.0.0.tgz", + "integrity": "sha512-LEeZWb340keMYuREMyxrODPXJJ0JOL8D/mCl74B4LdzbxhtXV2LrPN2QBEcGJrlQhoqLO0RhxQb6masHytKw+A==", "dev": true, - "license": "MIT", "dependencies": { "conventional-changelog-angular": "^7.0.0", "conventional-changelog-writer": "^7.0.0", @@ -2861,7 +2560,7 @@ "read-pkg-up": "^11.0.0" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": ">=20.8.1" }, "peerDependencies": { "semantic-release": ">=20.1.0" @@ -2872,7 +2571,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=16" }, @@ -2892,7 +2590,6 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2901,11 +2598,10 @@ } }, "node_modules/@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -3089,8 +2785,7 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/semver": { "version": "7.3.13", @@ -3384,11 +3079,10 @@ } }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -3401,7 +3095,6 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, - "license": "MIT", "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" @@ -3485,12 +3178,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true, - "license": "MIT" + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", @@ -3812,11 +3504,10 @@ "license": "MIT" }, "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true, - "license": "Apache-2.0" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "dev": true }, "node_modules/benchmark": { "version": "2.1.4", @@ -3854,8 +3545,7 @@ "version": "2.19.5", "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/braces": { "version": "3.0.2", @@ -3983,20 +3673,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4052,7 +3728,6 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -4068,7 +3743,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4089,12 +3763,70 @@ "node": ">=8" } }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", + "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", "dev": true, - "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -4322,7 +4054,6 @@ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, - "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -4359,7 +4090,6 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", "dev": true, - "license": "MIT", "dependencies": { "conventional-commits-filter": "^4.0.0", "handlebars": "^4.7.7", @@ -4380,7 +4110,6 @@ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", "dev": true, - "license": "MIT", "engines": { "node": ">=16" } @@ -4404,6 +4133,18 @@ "node": ">=16" } }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -4419,16 +4160,15 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, - "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -4527,7 +4267,6 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -4543,7 +4282,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4608,7 +4346,6 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -4663,13 +4400,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true, - "license": "ISC" - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4787,15 +4517,13 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/env-ci": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", - "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.0.0.tgz", + "integrity": "sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^8.0.0", "java-properties": "^1.0.2" @@ -5568,11 +5296,10 @@ "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5679,7 +5406,6 @@ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -5688,16 +5414,16 @@ } }, "node_modules/find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", + "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", "dev": true, - "license": "MIT", "dependencies": { - "semver-regex": "^4.0.5" + "semver-regex": "^4.0.5", + "super-regex": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5739,7 +5465,6 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -5788,6 +5513,18 @@ "dev": true, "license": "MIT" }, + "node_modules/function-timeout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.1.tgz", + "integrity": "sha512-6yPMImFFuaMPNaTMTBuolA8EanHJWF5Vju0NHpObRURT105J6x1Mf2a7J4P7Sqk2xDxv24N5L0RatEhTBhNmdA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/function.prototype.name": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", @@ -6080,7 +5817,6 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -6208,6 +5944,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -6222,11 +5967,10 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -6242,11 +5986,10 @@ "license": "MIT" }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6256,11 +5999,10 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6332,11 +6074,10 @@ } }, "node_modules/import-from-esm": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.3.tgz", - "integrity": "sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.4.tgz", + "integrity": "sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.3.4", "import-meta-resolve": "^4.0.0" @@ -6391,7 +6132,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -6404,7 +6144,6 @@ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -6434,8 +6173,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/internal-slot": { "version": "1.0.5", @@ -6457,7 +6195,6 @@ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", "dev": true, - "license": "MIT", "dependencies": { "from2": "^2.3.0", "p-is-promise": "^3.0.0" @@ -6814,11 +6551,10 @@ "license": "ISC" }, "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.0.tgz", + "integrity": "sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw==", "dev": true, - "license": "MIT", "dependencies": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", @@ -6827,7 +6563,7 @@ "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">=10.13" + "node": "^18.17 || >=20.6.1" } }, "node_modules/istanbul-lib-coverage": { @@ -6906,7 +6642,6 @@ "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -7664,8 +7399,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", @@ -7718,8 +7452,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/json2csv": { "version": "5.0.7", @@ -8075,8 +7808,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -8088,15 +7820,13 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", @@ -8116,8 +7846,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.kebabcase": { "version": "4.1.1", @@ -8167,8 +7896,7 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.upperfirst": { "version": "4.3.1", @@ -8211,11 +7939,10 @@ } }, "node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, - "license": "ISC", "engines": { "node": "14 || >=16.14" } @@ -8264,28 +7991,26 @@ } }, "node_modules/marked": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", "dev": true, - "license": "MIT", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 16" + "node": ">= 18" } }, "node_modules/marked-terminal": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", - "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.0.0.tgz", + "integrity": "sha512-sNEx8nn9Ktcm6pL0TnRz8tnXq/mSS0Q1FRSwJOAqw4lAB4l49UeDf85Gm1n9RPFm5qurCPjwi1StAQT2XExhZw==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", "chalk": "^5.3.0", + "cli-highlight": "^2.1.11", "cli-table3": "^0.6.3", "node-emoji": "^2.1.3", "supports-hyperlinks": "^3.0.0" @@ -8294,18 +8019,14 @@ "node": ">=16.0.0" }, "peerDependencies": { - "marked": ">=1 <12" + "marked": ">=1 <13" } }, "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^3.0.0" - }, "engines": { "node": ">=14.16" }, @@ -8318,7 +8039,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -8326,19 +8046,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/marked-terminal/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/meow": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", @@ -8384,14 +8091,13 @@ } }, "node_modules/mime": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz", - "integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.3.tgz", + "integrity": "sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==", "dev": true, "funding": [ "https://github.com/sponsors/broofa" ], - "license": "MIT", "bin": { "mime": "bin/cli.js" }, @@ -8426,6 +8132,17 @@ "dev": true, "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8444,22 +8161,19 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/nerf-dart": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-emoji": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", "dev": true, - "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -8485,11 +8199,10 @@ "license": "MIT" }, "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", + "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", @@ -8511,11 +8224,10 @@ } }, "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -8524,9 +8236,9 @@ } }, "node_modules/npm": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.5.tgz", - "integrity": "sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.7.0.tgz", + "integrity": "sha512-FXylyYSXNjgXx3l82BT8RSQvCoGIQ3h8YdRFGKNvo3Pv/bKscK4pdWkx/onwTpHDqGw+oeLf4Rxln9WVyxAxlQ==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -8535,6 +8247,7 @@ "@npmcli/map-workspaces", "@npmcli/package-json", "@npmcli/promise-spawn", + "@npmcli/redact", "@npmcli/run-script", "@sigstore/tuf", "abbrev", @@ -8543,8 +8256,6 @@ "chalk", "ci-info", "cli-columns", - "cli-table3", - "columnify", "fastest-levenshtein", "fs-minipass", "glob", @@ -8580,7 +8291,6 @@ "npm-profile", "npm-registry-fetch", "npm-user-validate", - "npmlog", "p-map", "pacote", "parse-conflict-json", @@ -8590,7 +8300,6 @@ "semver", "spdx-expression-parse", "ssri", - "strip-ansi", "supports-color", "tar", "text-table", @@ -8601,80 +8310,69 @@ "write-file-atomic" ], "dev": true, - "license": "Artistic-2.0", - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^7.2.1", "@npmcli/config": "^8.0.2", "@npmcli/fs": "^3.1.0", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.2", - "@sigstore/tuf": "^2.2.0", + "@npmcli/map-workspaces": "^3.0.6", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "@sigstore/tuf": "^2.3.2", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.1", + "cacache": "^18.0.2", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.3.10", + "glob": "^10.3.12", "graceful-fs": "^4.2.11", "hosted-git-info": "^7.0.1", - "ini": "^4.1.1", - "init-package-json": "^6.0.0", - "is-cidr": "^5.0.3", + "ini": "^4.1.2", + "init-package-json": "^6.0.2", + "is-cidr": "^5.0.5", "json-parse-even-better-errors": "^3.0.1", "libnpmaccess": "^8.0.1", "libnpmdiff": "^6.0.3", - "libnpmexec": "^7.0.4", + "libnpmexec": "^8.0.0", "libnpmfund": "^5.0.1", "libnpmhook": "^10.0.0", "libnpmorg": "^6.0.1", - "libnpmpack": "^6.0.3", + "libnpmpack": "^7.0.0", "libnpmpublish": "^9.0.2", "libnpmsearch": "^7.0.0", "libnpmteam": "^6.0.0", - "libnpmversion": "^5.0.1", - "make-fetch-happen": "^13.0.0", - "minimatch": "^9.0.3", + "libnpmversion": "^6.0.0", + "make-fetch-happen": "^13.0.1", + "minimatch": "^9.0.4", "minipass": "^7.0.4", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^10.0.1", + "node-gyp": "^10.1.0", "nopt": "^7.2.0", "normalize-package-data": "^6.0.0", "npm-audit-report": "^5.0.0", "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.1", + "npm-package-arg": "^11.0.2", "npm-pick-manifest": "^9.0.0", - "npm-profile": "^9.0.0", - "npm-registry-fetch": "^16.1.0", + "npm-profile": "^9.0.2", + "npm-registry-fetch": "^17.0.0", "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", "p-map": "^4.0.0", - "pacote": "^17.0.5", + "pacote": "^18.0.3", "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", + "proc-log": "^4.2.0", "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1", + "read": "^3.0.1", + "semver": "^7.6.0", + "spdx-expression-parse": "^4.0.0", "ssri": "^10.0.5", - "strip-ansi": "^7.1.0", "supports-color": "^9.4.0", - "tar": "^6.2.0", + "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", @@ -8719,18 +8417,8 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -8746,6 +8434,18 @@ "node": ">=12" } }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "dev": true, @@ -8769,6 +8469,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "dev": true, @@ -8776,7 +8491,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.0", + "version": "2.2.2", "dev": true, "inBundle": true, "license": "ISC", @@ -8785,46 +8500,47 @@ "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.2.2", + "version": "7.5.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/installed-package-contents": "^2.1.0", "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.0.0", + "@npmcli/metavuln-calculator": "^7.1.0", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/query": "^3.0.1", - "@npmcli/run-script": "^7.0.2", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", "bin-links": "^4.0.1", "cacache": "^18.0.0", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^7.0.1", "json-parse-even-better-errors": "^3.0.0", "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", + "minimatch": "^9.0.4", "nopt": "^7.0.0", "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.1", + "npm-package-arg": "^11.0.2", "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", + "npm-registry-fetch": "^17.0.0", + "pacote": "^18.0.1", "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", + "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.5", @@ -8839,16 +8555,16 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.0.3", + "version": "8.3.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/map-workspaces": "^3.0.2", "ci-info": "^4.0.0", - "ini": "^4.1.0", + "ini": "^4.1.2", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.2.0", "read-package-json-fast": "^3.0.2", "semver": "^7.3.5", "walk-up-path": "^3.0.1" @@ -8857,33 +8573,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/npm/node_modules/@npmcli/fs": { "version": "3.1.0", "dev": true, @@ -8897,7 +8586,7 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.3", + "version": "5.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -8905,7 +8594,7 @@ "@npmcli/promise-spawn": "^7.0.0", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", @@ -8916,7 +8605,7 @@ } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", + "version": "2.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -8925,14 +8614,14 @@ "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", + "version": "3.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -8947,14 +8636,15 @@ } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.0.0", + "version": "7.1.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "cacache": "^18.0.0", "json-parse-even-better-errors": "^3.0.0", - "pacote": "^17.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5" }, "engines": { @@ -8980,7 +8670,7 @@ } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.0.0", + "version": "5.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -8990,7 +8680,7 @@ "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "semver": "^7.5.3" }, "engines": { @@ -8998,7 +8688,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -9010,7 +8700,7 @@ } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.1", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -9021,16 +8711,26 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.2", + "version": "8.1.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^10.0.0", - "read-package-json-fast": "^3.0.0", + "proc-log": "^4.0.0", "which": "^4.0.0" }, "engines": { @@ -9048,34 +8748,44 @@ } }, "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.1.0", + "version": "2.3.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", + "version": "0.3.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.2.0", + "version": "2.3.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/bundle": "^2.3.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", "make-fetch-happen": "^13.0.0" }, "engines": { @@ -9083,13 +8793,27 @@ } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.2.0", + "version": "2.3.2", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.1.0" + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -9126,20 +8850,8 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/npm/node_modules/agent-base": { - "version": "7.1.0", + "version": "7.1.1", "dev": true, "inBundle": true, "license": "MIT", @@ -9164,15 +8876,12 @@ } }, "node_modules/npm/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/npm/node_modules/ansi-styles": { @@ -9199,45 +8908,12 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.3", "dev": true, @@ -9254,12 +8930,15 @@ } }, "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", + "version": "2.3.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm/node_modules/brace-expansion": { @@ -9271,32 +8950,8 @@ "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", + "version": "5.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -9305,7 +8960,7 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.1", + "version": "18.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -9364,7 +9019,7 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "4.0.3", + "version": "4.0.5", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -9397,51 +9052,6 @@ "node": ">= 10" } }, - "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/npm/node_modules/cmd-shim": { "version": "6.0.2", "dev": true, @@ -9469,61 +9079,12 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/cross-spawn": { "version": "7.0.3", "dev": true, @@ -9588,26 +9149,8 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { - "version": "5.1.0", + "version": "5.2.0", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -9652,24 +9195,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, @@ -9716,63 +9241,23 @@ "node_modules/npm/node_modules/function-bind": { "version": "1.1.2", "dev": true, - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/npm/node_modules/glob": { - "version": "10.3.10", + "version": "10.3.12", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -9790,14 +9275,8 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/hasown": { - "version": "2.0.0", + "version": "2.0.2", "dev": true, "inBundle": true, "license": "MIT", @@ -9827,7 +9306,7 @@ "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.0", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "MIT", @@ -9840,7 +9319,7 @@ } }, "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.2", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "MIT", @@ -9865,26 +9344,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.4", "dev": true, @@ -9916,7 +9375,7 @@ } }, "node_modules/npm/node_modules/ini": { - "version": "4.1.1", + "version": "4.1.2", "dev": true, "inBundle": true, "license": "ISC", @@ -9925,15 +9384,15 @@ } }, "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.0", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { + "@npmcli/package-json": "^5.0.0", "npm-package-arg": "^11.0.0", "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^7.0.0", + "read": "^3.0.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^5.0.0" @@ -9942,11 +9401,18 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/npm/node_modules/ip-regex": { "version": "5.0.0", @@ -9961,12 +9427,12 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "5.0.3", + "version": "5.0.5", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "4.0.3" + "cidr-regex": "^4.0.4" }, "engines": { "node": ">=14" @@ -10023,6 +9489,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.1", "dev": true, @@ -10063,52 +9535,50 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.2", + "version": "8.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.0.0" + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.4", + "version": "6.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^7.2.1", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", + "@npmcli/installed-package-contents": "^2.1.0", + "binary-extensions": "^2.3.0", "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4", - "tar": "^6.2.0" + "minimatch": "^9.0.4", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.1", + "tar": "^6.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.5", + "version": "8.1.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", + "@npmcli/run-script": "^8.1.0", "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.1", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "proc-log": "^3.0.0", - "read": "^2.0.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.1", + "proc-log": "^4.2.0", + "read": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "walk-up-path": "^3.0.1" @@ -10118,7 +9588,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.2", + "version": "5.0.9", "dev": true, "inBundle": true, "license": "ISC", @@ -10130,59 +9600,59 @@ } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.1", + "version": "10.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" + "npm-registry-fetch": "^17.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.2", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" + "npm-registry-fetch": "^17.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.4", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4" + "@npmcli/run-script": "^8.1.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.3", + "version": "9.0.7", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "ci-info": "^4.0.0", "normalize-package-data": "^6.0.0", - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.2.0", "semver": "^7.3.7", - "sigstore": "^2.1.0", + "sigstore": "^2.2.0", "ssri": "^10.0.5" }, "engines": { @@ -10190,40 +9660,40 @@ } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.1", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^16.0.0" + "npm-registry-fetch": "^17.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.1", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" + "npm-registry-fetch": "^17.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "5.0.2", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.3", - "@npmcli/run-script": "^7.0.2", + "@npmcli/git": "^5.0.6", + "@npmcli/run-script": "^8.1.0", "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.2.0", "semver": "^7.3.7" }, "engines": { @@ -10231,7 +9701,7 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.1.0", + "version": "10.2.2", "dev": true, "inBundle": true, "license": "ISC", @@ -10240,7 +9710,7 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.0", + "version": "13.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -10254,6 +9724,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", + "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, @@ -10262,7 +9733,7 @@ } }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.3", + "version": "9.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -10470,7 +9941,7 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "10.0.1", + "version": "10.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -10493,6 +9964,15 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/nopt": { "version": "7.2.0", "dev": true, @@ -10566,13 +10046,13 @@ } }, "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.1", + "version": "11.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" }, @@ -10581,7 +10061,7 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -10608,31 +10088,32 @@ } }, "node_modules/npm/node_modules/npm-profile": { - "version": "9.0.0", + "version": "9.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0" + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "16.1.0", + "version": "17.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { + "@npmcli/redact": "^2.0.0", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" + "proc-log": "^4.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -10647,21 +10128,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/p-map": { "version": "4.0.0", "dev": true, @@ -10678,27 +10144,26 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "17.0.5", + "version": "18.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.0", + "@npmcli/run-script": "^8.0.0", "cacache": "^18.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^2.0.0", + "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -10733,12 +10198,12 @@ } }, "node_modules/npm/node_modules/path-scurry": { - "version": "1.10.1", + "version": "1.10.2", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -10749,7 +10214,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "6.0.16", "dev": true, "inBundle": true, "license": "MIT", @@ -10762,7 +10227,7 @@ } }, "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", + "version": "4.2.0", "dev": true, "inBundle": true, "license": "ISC", @@ -10770,13 +10235,13 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", + "node_modules/npm/node_modules/proggy": { + "version": "2.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">= 0.6.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/promise-all-reject-late": { @@ -10789,7 +10254,7 @@ } }, "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -10817,12 +10282,12 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "1.0.0", + "version": "1.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "read": "^2.0.0" + "read": "^3.0.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -10837,12 +10302,12 @@ } }, "node_modules/npm/node_modules/read": { - "version": "2.1.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "mute-stream": "~1.0.0" + "mute-stream": "^1.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -10857,21 +10322,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/read-package-json": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/read-package-json-fast": { "version": "3.0.2", "dev": true, @@ -10885,22 +10335,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.4.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", "dev": true, @@ -10910,26 +10344,6 @@ "node": ">= 4" } }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -10938,7 +10352,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.5.4", + "version": "7.6.0", "dev": true, "inBundle": true, "license": "ISC", @@ -10964,12 +10378,6 @@ "node": ">=10" } }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", "dev": true, @@ -11004,15 +10412,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.1.0", + "version": "2.3.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.1.0", - "@sigstore/tuf": "^2.1.0" + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "@sigstore/sign": "^2.3.0", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.2.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -11029,26 +10439,26 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.7.1", + "version": "2.8.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.2", + "version": "8.0.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.1", "debug": "^4.3.4", "socks": "^2.7.1" }, @@ -11066,14 +10476,24 @@ "spdx-license-ids": "^3.0.0" } }, + "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", + "version": "2.5.0", "dev": true, "inBundle": true, "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", @@ -11083,11 +10503,17 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.16", + "version": "3.0.17", "dev": true, "inBundle": true, "license": "CC0-1.0" }, + "node_modules/npm/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause" + }, "node_modules/npm/node_modules/ssri": { "version": "10.0.5", "dev": true, @@ -11100,15 +10526,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -11138,37 +10555,7 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { + "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", "dev": true, "inBundle": true, @@ -11180,21 +10567,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/npm/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", @@ -11208,15 +10580,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/supports-color": { "version": "9.4.0", "dev": true, @@ -11230,7 +10593,7 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "6.2.0", + "version": "6.2.1", "dev": true, "inBundle": true, "license": "ISC", @@ -11301,7 +10664,7 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "MIT", @@ -11348,10 +10711,20 @@ "version": "3.0.4", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "node_modules/npm/node_modules/validate-npm-package-name": { @@ -11372,15 +10745,6 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/npm/node_modules/which": { "version": "4.0.0", "dev": true, @@ -11405,15 +10769,6 @@ "node": ">=16" } }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/npm/node_modules/wrap-ansi": { "version": "8.1.0", "dev": true, @@ -11449,15 +10804,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -11473,16 +10819,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { @@ -11508,6 +10854,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm/node_modules/write-file-atomic": { "version": "5.0.1", "dev": true, @@ -11527,6 +10888,15 @@ "inBundle": true, "license": "ISC" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -11673,13 +11043,12 @@ } }, "node_modules/p-filter": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.0.0.tgz", - "integrity": "sha512-3gxOrNadcyxj+YKFyRmRIEuCMGayNNJoXL7Zf1dqfdfoDsVB190bHfFfhqfcNEDFLfQP1q2uir2cBgIqnIT+cQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, - "license": "MIT", "dependencies": { - "p-map": "^7.0.0" + "p-map": "^7.0.1" }, "engines": { "node": ">=18" @@ -11689,11 +11058,10 @@ } }, "node_modules/p-filter/node_modules/p-map": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.0.tgz", - "integrity": "sha512-EZl03dLKv3RypkrjlevZoNwQMSy4bAblWcR18zhonktnN4fUs3asFQKSe0awn982omGxamvbejqQKQYDJYHCEg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", + "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -11706,7 +11074,6 @@ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11865,6 +11232,27 @@ "dev": true, "license": "MIT" }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12174,8 +11562,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/punycode": { "version": "2.3.0", @@ -12230,7 +11617,6 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -12246,7 +11632,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12258,12 +11643,28 @@ "dev": true, "license": "MIT" }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/read-pkg": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, - "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", @@ -12282,8 +11683,8 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-11.0.0.tgz", "integrity": "sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==", + "deprecated": "Renamed to read-package-up", "dev": true, - "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", @@ -12296,106 +11697,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/read-pkg/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/read-pkg/node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/read-pkg/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/read-pkg/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-pkg/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/read-pkg/node_modules/parse-json": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "index-to-position": "^0.1.2", @@ -12408,19 +11714,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -12437,16 +11730,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esprima": "~4.0.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -12470,7 +11753,6 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, - "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, @@ -12734,36 +12016,35 @@ } }, "node_modules/semantic-release": { - "version": "22.0.12", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", - "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", + "version": "23.0.8", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.8.tgz", + "integrity": "sha512-yZkuWcTTfh5h/DrR4Q4QvJSARJdb6wjwn/sN0qKMYEkvwaVFek8YWfrgtL8oWaRdl0fLte0Y1wWMzLbwoaII1g==", "dev": true, - "license": "MIT", "dependencies": { - "@semantic-release/commit-analyzer": "^11.0.0", + "@semantic-release/commit-analyzer": "^12.0.0", "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^9.0.0", - "@semantic-release/npm": "^11.0.0", - "@semantic-release/release-notes-generator": "^12.0.0", + "@semantic-release/github": "^10.0.0", + "@semantic-release/npm": "^12.0.0", + "@semantic-release/release-notes-generator": "^13.0.0", "aggregate-error": "^5.0.0", - "cosmiconfig": "^8.0.0", + "cosmiconfig": "^9.0.0", "debug": "^4.0.0", - "env-ci": "^10.0.0", + "env-ci": "^11.0.0", "execa": "^8.0.0", "figures": "^6.0.0", - "find-versions": "^5.1.0", + "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", "hosted-git-info": "^7.0.0", "import-from-esm": "^1.3.1", "lodash-es": "^4.17.21", - "marked": "^9.0.0", - "marked-terminal": "^6.0.0", + "marked": "^12.0.0", + "marked-terminal": "^7.0.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", - "read-pkg-up": "^11.0.0", + "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", @@ -12774,7 +12055,7 @@ "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": ">=20.8.1" } }, "node_modules/semantic-release/node_modules/p-reduce": { @@ -12826,7 +12107,6 @@ "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -13031,7 +12311,6 @@ "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, - "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -13100,36 +12379,32 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true, - "license": "CC-BY-3.0" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true, - "license": "CC0-1.0" + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true }, "node_modules/split2": { "version": "4.2.0", @@ -13328,6 +12603,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/super-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", + "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", + "dev": true, + "dependencies": { + "function-timeout": "^1.0.1", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13346,7 +12637,6 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -13373,7 +12663,6 @@ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" } @@ -13383,7 +12672,6 @@ "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^3.0.0", "temp-dir": "^3.0.0", @@ -13402,7 +12690,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -13490,6 +12777,27 @@ "dev": true, "license": "MIT" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -13508,6 +12816,21 @@ "xtend": "~4.0.1" } }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "dev": true, + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -13718,11 +13041,10 @@ } }, "node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.1.tgz", + "integrity": "sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -13817,7 +13139,6 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -13853,7 +13174,6 @@ "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13876,7 +13196,6 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, - "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -13888,11 +13207,10 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "license": "ISC" + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", + "dev": true }, "node_modules/universalify": { "version": "2.0.0", @@ -13946,7 +13264,6 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -13985,7 +13302,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -14067,8 +13383,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", diff --git a/package.json b/package.json index 1a6b4e7..68b3249 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "lint-staged": "^13.1.0", "prettier": "^2.8.3", "rrule": "^2.7.2", - "semantic-release": "^22.0.12", + "semantic-release": "^23.0.8", "ts-jest": "^29.0.5", "ts-node": "^10.9.1", "typescript": "^5.4.5" From e1ce180e53ced504fb289c9af0810b98549a46c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 22:40:24 +0700 Subject: [PATCH 25/63] chore(deps-dev): bump lint-staged from 13.2.0 to 15.2.2 (#119) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.2.0 to 15.2.2. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/okonet/lint-staged/compare/v13.2.0...v15.2.2) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 419 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 210 insertions(+), 211 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa7b552..3d0eeeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "eslint-plugin-prettier": "^4.2.1", "husky": "^9.0.11", "jest": "^29.5.0", - "lint-staged": "^13.1.0", + "lint-staged": "^15.2.2", "prettier": "^2.8.3", "rrule": "^2.7.2", "semantic-release": "^23.0.8", @@ -3838,17 +3838,16 @@ } }, "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, - "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "string-width": "^7.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3859,7 +3858,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -3872,7 +3870,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -3881,18 +3878,16 @@ } }, "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true }, "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -3905,7 +3900,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -3918,18 +3912,17 @@ } }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, - "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3940,7 +3933,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -4005,20 +3997,18 @@ "license": "MIT" }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true, - "license": "MIT" + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/common-tags": { @@ -4479,13 +4469,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.4.339", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.339.tgz", @@ -5176,6 +5159,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -5574,6 +5563,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", @@ -7571,13 +7572,12 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true, - "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/lines-and-columns": { @@ -7588,42 +7588,37 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.1" + "version": "15.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", + "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -7631,127 +7626,193 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "node_modules/listr2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", + "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", "dev": true, - "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=14.18.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/onetime": { + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/log-update": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, - "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "node_modules/listr2/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, - "license": "MIT", "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/listr2/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, - "license": "MIT", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/load-json-file": { @@ -11123,56 +11184,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map/node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-map/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/p-reduce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", @@ -11856,11 +11867,10 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true, - "license": "MIT" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true }, "node_modules/rimraf": { "version": "3.0.2", @@ -11957,16 +11967,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", @@ -12468,11 +12468,10 @@ } }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } diff --git a/package.json b/package.json index 68b3249..f8357d1 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "eslint-plugin-prettier": "^4.2.1", "husky": "^9.0.11", "jest": "^29.5.0", - "lint-staged": "^13.1.0", + "lint-staged": "^15.2.2", "prettier": "^2.8.3", "rrule": "^2.7.2", "semantic-release": "^23.0.8", From 5db9338e69605fb9d55480155983697dea67ea56 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 5 May 2024 01:08:13 +0700 Subject: [PATCH 26/63] test: move tests to `tests` folder (#126) --- {__test__ => tests}/daily.spec.ts | 0 {__test__ => tests}/monthly.spec.ts | 0 {__test__ => tests}/parsing.spec.ts | 0 {__test__ => tests}/utils.ts | 0 {__test__ => tests}/weekly.spec.ts | 0 {__test__ => tests}/yearly.spec.ts | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {__test__ => tests}/daily.spec.ts (100%) rename {__test__ => tests}/monthly.spec.ts (100%) rename {__test__ => tests}/parsing.spec.ts (100%) rename {__test__ => tests}/utils.ts (100%) rename {__test__ => tests}/weekly.spec.ts (100%) rename {__test__ => tests}/yearly.spec.ts (100%) diff --git a/__test__/daily.spec.ts b/tests/daily.spec.ts similarity index 100% rename from __test__/daily.spec.ts rename to tests/daily.spec.ts diff --git a/__test__/monthly.spec.ts b/tests/monthly.spec.ts similarity index 100% rename from __test__/monthly.spec.ts rename to tests/monthly.spec.ts diff --git a/__test__/parsing.spec.ts b/tests/parsing.spec.ts similarity index 100% rename from __test__/parsing.spec.ts rename to tests/parsing.spec.ts diff --git a/__test__/utils.ts b/tests/utils.ts similarity index 100% rename from __test__/utils.ts rename to tests/utils.ts diff --git a/__test__/weekly.spec.ts b/tests/weekly.spec.ts similarity index 100% rename from __test__/weekly.spec.ts rename to tests/weekly.spec.ts diff --git a/__test__/yearly.spec.ts b/tests/yearly.spec.ts similarity index 100% rename from __test__/yearly.spec.ts rename to tests/yearly.spec.ts From 5a7aba604ed2ea81e4635169a2ce07046968f683 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 5 May 2024 14:07:42 +0700 Subject: [PATCH 27/63] build: move output to `/dist` and exclude from git (#127) closes #124 --- .eslintrc.js | 2 +- .github/workflows/build-and-test.yml | 42 +- .npmignore | 4 +- benchmark/index.ts | 2 +- index.d.ts | 123 ---- index.js | 322 --------- package-lock.json | 982 +++++++++++++++++---------- package.json | 16 +- tests/daily.spec.ts | 9 +- tests/monthly.spec.ts | 2 +- tests/parsing.spec.ts | 2 +- tests/weekly.spec.ts | 2 +- tests/yearly.spec.ts | 9 +- 13 files changed, 681 insertions(+), 836 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.js diff --git a/.eslintrc.js b/.eslintrc.js index a7d01a4..30f3e20 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,7 +9,7 @@ module.exports = { 'plugin:eslint-comments/recommended', ], plugins: ['@typescript-eslint'], - ignorePatterns: ['node_modules', '/target', '/index.d.ts', '/index.js'], + ignorePatterns: ['node_modules', '/target', '/dist/**/*'], env: { node: true, }, diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 5620f9a..5d93751 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -131,7 +131,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.settings.target }} - path: ${{ env.APP_NAME }}.*.node + path: dist/${{ env.APP_NAME }}.*.node if-no-files-found: error build-freebsd: runs-on: macos-13 @@ -175,7 +175,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: bindings-freebsd - path: ${{ env.APP_NAME }}.*.node + path: dist/${{ env.APP_NAME }}.*.node if-no-files-found: error test-macOS-windows-binding: name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} @@ -209,11 +209,13 @@ jobs: cache: npm - name: Install dependencies run: npm ci + - name: Remove binary + run: npx rimraf --glob ./dist/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-${{ matrix.settings.target }} - path: . + path: dist - name: List packages run: ls -R . shell: bash @@ -240,11 +242,13 @@ jobs: cache: npm - name: Install dependencies run: npm ci + - name: Remove binary + run: npx rimraf --glob ./dist/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-gnu - path: . + path: dist - name: List packages run: ls -R . shell: bash @@ -271,11 +275,13 @@ jobs: cache: npm - name: Install dependencies run: npm ci --libc "musl" + - name: Remove binary + run: npx rimraf --glob ./dist/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-musl - path: . + path: dist - name: List packages run: ls -R . shell: bash @@ -295,16 +301,18 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Install dependencies + run: npm ci --cpu "arm64" --libc "glibc" + - name: Remove binary + run: npx rimraf --glob ./dist/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-gnu - path: . + path: dist - name: List packages run: ls -R . shell: bash - - name: Install dependencies - run: npm ci --cpu "arm64" --libc "glibc" - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: @@ -326,16 +334,18 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Install dependencies + run: npm ci --cpu "arm64" --libc "musl" + - name: Remove binary + run: npx rimraf --glob ./dist/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-musl - path: . + path: dist - name: List packages run: ls -R . shell: bash - - name: Install dependencies - run: npm ci --cpu "arm64" --libc "musl" - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: @@ -363,16 +373,18 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Install dependencies + run: npm ci --cpu "arm" + - name: Remove binary + run: npx rimraf --glob ./dist/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-armv7-unknown-linux-gnueabihf - path: . + path: dist - name: List packages run: ls -R . shell: bash - - name: Install dependencies - run: npm ci --cpu "arm" - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: @@ -417,5 +429,5 @@ jobs: uses: actions/upload-artifact@v4 with: name: bindings-universal-apple-darwin - path: ${{ env.APP_NAME }}.*.node + path: dist/${{ env.APP_NAME }}.*.node if-no-files-found: error \ No newline at end of file diff --git a/.npmignore b/.npmignore index e5af721..304eb9e 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,3 @@ * -!index.d.ts -!index.js +!dist/index.d.ts +!dist/index.js diff --git a/benchmark/index.ts b/benchmark/index.ts index 31ddfc5..3682472 100644 --- a/benchmark/index.ts +++ b/benchmark/index.ts @@ -1,6 +1,6 @@ import b from 'benny'; import * as node from 'rrule'; -import * as rust from '../'; +import * as rust from '../dist'; b.suite( 'UTC TZ', diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 2e104c1..0000000 --- a/index.d.ts +++ /dev/null @@ -1,123 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ - -/* auto-generated by NAPI-RS */ - -export const enum Frequency { - Yearly = 0, - Monthly = 1, - Weekly = 2, - Daily = 3, - Hourly = 4, - Minutely = 5, - Secondly = 6 -} -export const enum Month { - January = 0, - February = 1, - March = 2, - April = 3, - May = 4, - June = 5, - July = 6, - August = 7, - September = 8, - October = 9, - November = 10, - December = 11 -} -export interface NWeekday { - /** - * If set, this represents the nth occurrence of the weekday. - * Otherwise it represents every occurrence of the weekday. - * - * A negative value represents nth occurrence from the end. - */ - n?: number - weekday: Weekday -} -export const enum Weekday { - Monday = 0, - Tuesday = 1, - Wednesday = 2, - Thursday = 3, - Friday = 4, - Saturday = 5, - Sunday = 6 -} -export class RRule { - constructor(frequency: Frequency) - static parse(str: string): RRule - get frequency(): Frequency - get interval(): number - get count(): number | null - get byWeekday(): NWeekday[] - get byHour(): Array - get byMinute(): Array - get bySecond(): Array - get byMonthday(): Array - get bySetpos(): Array - get byMonth(): Month[] - get byWeekno(): Array - get byYearday(): Array - get weekstart(): Weekday - get until(): RRuleDateTime | null - toString(): string - setInterval(interval: number): this - setCount(count: number): this - setByWeekday(weekdays: ReadonlyArray): this - setByHour(hours: ReadonlyArray): this - setByMinute(minutes: ReadonlyArray): this - setBySecond(seconds: ReadonlyArray): this - setByMonthday(days: ReadonlyArray): this - setBySetpos(poses: ReadonlyArray): this - setByMonth(months: ReadonlyArray): this - setByWeekno(weekNumbers: ReadonlyArray): this - setByYearday(days: ReadonlyArray): this - setWeekstart(day: Weekday): this - setUntil(dateTime: RRuleDateTime | Date): this -} -export class RRuleDateTime { - constructor(date: Date | number, timezone?: string | undefined | null) - get timestamp(): number - get timezone(): RRuleTimezone - get day(): number - get month(): number - get year(): number - get hour(): number - get minute(): number - get second(): number - get millisecond(): number - get toString(): string - toDate(): Date - toUtcDate(): Date -} -export class RRuleSet { - constructor(dtstart: RRuleDateTime | Date) - setFromString(str: string): this - static parse(str: string): RRuleSet - toString(): string - addRrule(jsRrule: RRule): this - addExrule(jsRrule: RRule): this - addExdate(dateTime: RRuleDateTime | Date): this - addRdate(dateTime: RRuleDateTime | Date): this - get dtstart(): RRuleDateTime - getRrules(): Array - getExrules(): Array - getExdates(): Array - getRdates(): Array - all(limit?: number | undefined | null): Array - between(after: RRuleDateTime | Date, before: RRuleDateTime | Date, inclusive?: boolean | undefined | null): Array - occurrences(): Occurrences -} -export class Occurrences { - [Symbol.iterator](): Iterator -} -export class RRuleTimezone { - constructor(tz: string) - /** - * The name of the timezone. If the timezone is local, it will return "Local". - */ - get name(): string - get isLocal(): boolean -} diff --git a/index.js b/index.js deleted file mode 100644 index fdc48bf..0000000 --- a/index.js +++ /dev/null @@ -1,322 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/* auto-generated by NAPI-RS */ - -const { existsSync, readFileSync } = require('fs') -const { join } = require('path') - -const { platform, arch } = process - -let nativeBinding = null -let localFileExisted = false -let loadError = null - -function isMusl() { - // For Node 10 - if (!process.report || typeof process.report.getReport !== 'function') { - try { - const lddPath = require('child_process').execSync('which ldd').toString().trim() - return readFileSync(lddPath, 'utf8').includes('musl') - } catch (e) { - return true - } - } else { - const { glibcVersionRuntime } = process.report.getReport().header - return !glibcVersionRuntime - } -} - -switch (platform) { - case 'android': - switch (arch) { - case 'arm64': - localFileExisted = existsSync(join(__dirname, 'rrule-rust.android-arm64.node')) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.android-arm64.node') - } else { - nativeBinding = require('@rrule-rust/lib-android-arm64') - } - } catch (e) { - loadError = e - } - break - case 'arm': - localFileExisted = existsSync(join(__dirname, 'rrule-rust.android-arm-eabi.node')) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.android-arm-eabi.node') - } else { - nativeBinding = require('@rrule-rust/lib-android-arm-eabi') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on Android ${arch}`) - } - break - case 'win32': - switch (arch) { - case 'x64': - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.win32-x64-msvc.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.win32-x64-msvc.node') - } else { - nativeBinding = require('@rrule-rust/lib-win32-x64-msvc') - } - } catch (e) { - loadError = e - } - break - case 'ia32': - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.win32-ia32-msvc.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.win32-ia32-msvc.node') - } else { - nativeBinding = require('@rrule-rust/lib-win32-ia32-msvc') - } - } catch (e) { - loadError = e - } - break - case 'arm64': - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.win32-arm64-msvc.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.win32-arm64-msvc.node') - } else { - nativeBinding = require('@rrule-rust/lib-win32-arm64-msvc') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on Windows: ${arch}`) - } - break - case 'darwin': - localFileExisted = existsSync(join(__dirname, 'rrule-rust.darwin-universal.node')) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.darwin-universal.node') - } else { - nativeBinding = require('@rrule-rust/lib-darwin-universal') - } - break - } catch {} - switch (arch) { - case 'x64': - localFileExisted = existsSync(join(__dirname, 'rrule-rust.darwin-x64.node')) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.darwin-x64.node') - } else { - nativeBinding = require('@rrule-rust/lib-darwin-x64') - } - } catch (e) { - loadError = e - } - break - case 'arm64': - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.darwin-arm64.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.darwin-arm64.node') - } else { - nativeBinding = require('@rrule-rust/lib-darwin-arm64') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on macOS: ${arch}`) - } - break - case 'freebsd': - if (arch !== 'x64') { - throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) - } - localFileExisted = existsSync(join(__dirname, 'rrule-rust.freebsd-x64.node')) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.freebsd-x64.node') - } else { - nativeBinding = require('@rrule-rust/lib-freebsd-x64') - } - } catch (e) { - loadError = e - } - break - case 'linux': - switch (arch) { - case 'x64': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-x64-musl.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-x64-musl.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-x64-musl') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-x64-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-x64-gnu.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-x64-gnu') - } - } catch (e) { - loadError = e - } - } - break - case 'arm64': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-arm64-musl.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-arm64-musl.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-arm64-musl') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-arm64-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-arm64-gnu.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-arm64-gnu') - } - } catch (e) { - loadError = e - } - } - break - case 'arm': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-arm-musleabihf.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-arm-musleabihf.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-arm-musleabihf') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-arm-gnueabihf.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-arm-gnueabihf.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-arm-gnueabihf') - } - } catch (e) { - loadError = e - } - } - break - case 'riscv64': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-riscv64-musl.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-riscv64-musl.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-riscv64-musl') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-riscv64-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-riscv64-gnu.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-riscv64-gnu') - } - } catch (e) { - loadError = e - } - } - break - case 's390x': - localFileExisted = existsSync( - join(__dirname, 'rrule-rust.linux-s390x-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./rrule-rust.linux-s390x-gnu.node') - } else { - nativeBinding = require('@rrule-rust/lib-linux-s390x-gnu') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on Linux: ${arch}`) - } - break - default: - throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) -} - -if (!nativeBinding) { - if (loadError) { - throw loadError - } - throw new Error(`Failed to load native binding`) -} - -const { Frequency, Month, RRule, RRuleDateTime, RRuleSet, Occurrences, RRuleTimezone, Weekday } = nativeBinding - -module.exports.Frequency = Frequency -module.exports.Month = Month -module.exports.RRule = RRule -module.exports.RRuleDateTime = RRuleDateTime -module.exports.RRuleSet = RRuleSet -module.exports.Occurrences = Occurrences -module.exports.RRuleTimezone = RRuleTimezone -module.exports.Weekday = Weekday diff --git a/package-lock.json b/package-lock.json index 3d0eeeb..c820c29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", "conventional-changelog-conventionalcommits": "^7.0.2", + "cpy-cli": "^5.0.0", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-eslint-comments": "^3.2.0", @@ -27,7 +28,9 @@ "husky": "^9.0.11", "jest": "^29.5.0", "lint-staged": "^15.2.2", + "mkdirp": "^3.0.1", "prettier": "^2.8.3", + "rimraf": "^5.0.5", "rrule": "^2.7.2", "semantic-release": "^23.0.8", "ts-jest": "^29.0.5", @@ -1371,30 +1374,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { "version": "8.56.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", @@ -1420,30 +1399,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1465,6 +1420,102 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1741,51 +1792,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -2219,6 +2225,16 @@ "@octokit/openapi-types": "^22.2.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -3350,6 +3366,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3500,8 +3528,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/before-after-hook": { "version": "3.0.2", @@ -3547,6 +3574,16 @@ "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", "dev": true }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -4036,8 +4073,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/config-chain": { "version": "1.1.13", @@ -4161,35 +4197,197 @@ "parse-json": "^5.2.0" }, "engines": { - "node": ">=14" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, + "node_modules/cp-file": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-10.0.0.tgz", + "integrity": "sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.10", + "nested-error-stacks": "^2.1.1", + "p-event": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-10.1.0.tgz", + "integrity": "sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ==", + "dev": true, + "dependencies": { + "arrify": "^3.0.0", + "cp-file": "^10.0.0", + "globby": "^13.1.4", + "junk": "^4.0.1", + "micromatch": "^4.0.5", + "nested-error-stacks": "^2.1.1", + "p-filter": "^3.0.0", + "p-map": "^6.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-5.0.0.tgz", + "integrity": "sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ==", + "dev": true, + "dependencies": { + "cpy": "^10.1.0", + "meow": "^12.0.1" + }, + "bin": { + "cpy": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/p-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", + "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", + "dev": true, + "dependencies": { + "p-map": "^5.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/p-filter/node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", - "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "node_modules/cpy/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "dependencies": { - "jiti": "^1.19.1" - }, "engines": { - "node": ">=v16" + "node": ">=12" }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=8.2", - "typescript": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/create-jest": { @@ -4469,6 +4667,12 @@ "readable-stream": "^2.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.4.339", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.339.tgz", @@ -4873,17 +5077,6 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -4894,19 +5087,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4969,17 +5149,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -5052,19 +5221,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -5432,6 +5588,21 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -5449,6 +5620,34 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5683,6 +5882,26 @@ "node": ">=16" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -6638,6 +6857,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/java-properties": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", @@ -6871,51 +7108,6 @@ } } }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -7174,87 +7366,42 @@ "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/strip-bom": { @@ -7537,6 +7684,18 @@ "node": "*" } }, + "node_modules/junk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", + "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -8176,6 +8335,18 @@ "node": ">=6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -8186,6 +8357,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8230,6 +8425,12 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true + }, "node_modules/node-emoji": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", @@ -11103,6 +11304,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-filter": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", @@ -11184,6 +11400,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-6.0.0.tgz", + "integrity": "sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-reduce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", @@ -11194,6 +11422,18 @@ "node": ">=8" } }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -11301,6 +11541,22 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -11873,64 +12129,67 @@ "dev": true }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, - "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "glob": "^10.3.7" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, - "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rrule": { @@ -12505,6 +12764,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", @@ -12566,6 +12840,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -12711,51 +12998,6 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/text-extensions": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", @@ -13402,6 +13644,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index f8357d1..4cc381f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "rrule-rust", "version": "0.0.0", - "main": "index.js", - "types": "index.d.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", "keywords": [ "rrule", "icalendar", @@ -51,6 +51,7 @@ "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", "conventional-changelog-conventionalcommits": "^7.0.2", + "cpy-cli": "^5.0.0", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-eslint-comments": "^3.2.0", @@ -59,7 +60,9 @@ "husky": "^9.0.11", "jest": "^29.5.0", "lint-staged": "^15.2.2", + "mkdirp": "^3.0.1", "prettier": "^2.8.3", + "rimraf": "^5.0.5", "rrule": "^2.7.2", "semantic-release": "^23.0.8", "ts-jest": "^29.0.5", @@ -75,16 +78,17 @@ }, "scripts": { "artifacts": "napi artifacts", - "build": "napi build --platform --release --js-package-name @rrule-rust/lib", - "build:debug": "napi build --platform", + "prebuild": "rimraf ./dist && mkdirp ./dist", + "postbuild": "cpy ./*.node ./dist && rimraf --glob ./*.node", + "build": "napi build --js dist/index.js --dts dist/index.d.ts --platform --release", "prepublishOnly": "napi prepublish -t npm", "test": "jest", "universal": "napi universal", "version": "napi version", "benchmark": "ts-node ./benchmark/index.ts", "lint": "cargo fmt --all -- --check && eslint \"**/*.{js,ts,json}\" --max-warnings=0", - "lint:fix": "cargo fmt --all && npm run lint --fix", + "lint:fix": "cargo fmt --all && npm run lint -- --fix", "lint:fix-staged": "lint-staged", - "prepare": "husky" + "prepare": "husky && npm run build" } } diff --git a/tests/daily.spec.ts b/tests/daily.spec.ts index 0b3d4c7..08cba73 100644 --- a/tests/daily.spec.ts +++ b/tests/daily.spec.ts @@ -1,4 +1,11 @@ -import { RRule, RRuleDateTime, RRuleSet, Frequency, Month, Weekday } from '../'; +import { + RRule, + RRuleDateTime, + RRuleSet, + Frequency, + Month, + Weekday, +} from '../dist'; test('Daily for 10 occurrences', () => { const rrule = new RRule(Frequency.Daily).setCount(10); diff --git a/tests/monthly.spec.ts b/tests/monthly.spec.ts index bfef2e4..0540d65 100644 --- a/tests/monthly.spec.ts +++ b/tests/monthly.spec.ts @@ -1,4 +1,4 @@ -import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../'; +import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../dist'; import { takeN } from './utils'; test('Monthly on the 1st Friday for ten occurrences', () => { diff --git a/tests/parsing.spec.ts b/tests/parsing.spec.ts index 0f54ca6..08fc983 100644 --- a/tests/parsing.spec.ts +++ b/tests/parsing.spec.ts @@ -1,4 +1,4 @@ -import { Frequency, Weekday, RRule, RRuleSet, RRuleDateTime } from '../'; +import { Frequency, Weekday, RRule, RRuleSet, RRuleDateTime } from '../dist'; test('Should properly parse weekly recurrence', () => { const set = RRuleSet.parse( diff --git a/tests/weekly.spec.ts b/tests/weekly.spec.ts index 1999e19..cacc2e5 100644 --- a/tests/weekly.spec.ts +++ b/tests/weekly.spec.ts @@ -1,4 +1,4 @@ -import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../'; +import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../dist'; import { takeN } from './utils'; test('Weekly for 10 occurrences', () => { diff --git a/tests/yearly.spec.ts b/tests/yearly.spec.ts index 1326497..9ce3494 100644 --- a/tests/yearly.spec.ts +++ b/tests/yearly.spec.ts @@ -1,4 +1,11 @@ -import { RRule, RRuleDateTime, RRuleSet, Frequency, Month, Weekday } from '../'; +import { + RRule, + RRuleDateTime, + RRuleSet, + Frequency, + Month, + Weekday, +} from '../dist'; import { takeN } from './utils'; test('Yearly in June and July for 10 occurrences', () => { From adb61584de4e322cd4bf0b4f36058643e01505e9 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Sun, 5 May 2024 15:21:38 +0200 Subject: [PATCH 28/63] fix: turn `datetime.toString` into a function (#84) --- src/js/rrule_datetime.rs | 2 +- tests/datetime.spec.ts | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/datetime.spec.ts diff --git a/src/js/rrule_datetime.rs b/src/js/rrule_datetime.rs index 2b46f66..6fddbe8 100644 --- a/src/js/rrule_datetime.rs +++ b/src/js/rrule_datetime.rs @@ -84,7 +84,7 @@ impl RRuleDateTime { nanoseconds / 1_000_000 } - #[napi(getter)] + #[napi(js_name = "toString")] pub fn to_string(&self) -> String { self.date_time.to_string() } diff --git a/tests/datetime.spec.ts b/tests/datetime.spec.ts new file mode 100644 index 0000000..94ff160 --- /dev/null +++ b/tests/datetime.spec.ts @@ -0,0 +1,33 @@ +import { RRuleDateTime } from '../dist'; + +test.each([new Date(873205200000), 873205200000])( + 'Can create an RRuleDateTime from a %s', + (input) => { + const rruleDateTime = new RRuleDateTime(input, 'US/Eastern'); + + expect(rruleDateTime.toString()).toBe('1997-09-02 09:00:00 EDT'); + expect(rruleDateTime.toDate()).toEqual(new Date(873205200000)); + expect(rruleDateTime.timestamp).toBe(873205200000); + expect(rruleDateTime.timezone.isLocal).toBe(false); + expect(rruleDateTime.timezone.name).toBe('US/Eastern'); + expect(rruleDateTime.year).toBe(1997); + expect(rruleDateTime.month).toBe(9); + expect(rruleDateTime.day).toBe(2); + expect(rruleDateTime.hour).toBe(9); + expect(rruleDateTime.minute).toBe(0); + expect(rruleDateTime.second).toBe(0); + expect(rruleDateTime.millisecond).toBe(0); + }, +); + +it('Can create a local RRuleDateTime', () => { + const rruleDateTime = new RRuleDateTime(873205200000); + const props = []; + for (const prop in rruleDateTime) { + props.push(prop); + } + + expect(rruleDateTime.timestamp).toBe(873205200000); + expect(rruleDateTime.timezone.isLocal).toBe(true); + expect(rruleDateTime.timezone.name).toBe('Local'); +}); From 980a66b606294a53a325773af24fbdc665737649 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Sun, 5 May 2024 15:48:11 +0200 Subject: [PATCH 29/63] feat(datetime): add `toRFC3339` method (#131) --- src/js/rrule_datetime.rs | 5 +++++ tests/datetime.spec.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/js/rrule_datetime.rs b/src/js/rrule_datetime.rs index 6fddbe8..9c7001f 100644 --- a/src/js/rrule_datetime.rs +++ b/src/js/rrule_datetime.rs @@ -89,6 +89,11 @@ impl RRuleDateTime { self.date_time.to_string() } + #[napi(js_name = "toRFC3339")] + pub fn to_rfc3339(&self) -> String { + self.date_time.to_rfc3339() + } + #[napi(ts_return_type = "Date")] pub fn to_date(&self, env: Env) -> napi::Result { env.create_date(self.date_time.timestamp_millis() as f64) diff --git a/tests/datetime.spec.ts b/tests/datetime.spec.ts index 94ff160..cda08d2 100644 --- a/tests/datetime.spec.ts +++ b/tests/datetime.spec.ts @@ -5,8 +5,9 @@ test.each([new Date(873205200000), 873205200000])( (input) => { const rruleDateTime = new RRuleDateTime(input, 'US/Eastern'); - expect(rruleDateTime.toString()).toBe('1997-09-02 09:00:00 EDT'); expect(rruleDateTime.toDate()).toEqual(new Date(873205200000)); + expect(rruleDateTime.toString()).toBe('1997-09-02 09:00:00 EDT'); + expect(rruleDateTime.toRFC3339()).toBe('1997-09-02T09:00:00-04:00'); expect(rruleDateTime.timestamp).toBe(873205200000); expect(rruleDateTime.timezone.isLocal).toBe(false); expect(rruleDateTime.timezone.name).toBe('US/Eastern'); From d0a107d784a494cc2554339292e99ca5ec310239 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Mon, 6 May 2024 14:08:54 +0200 Subject: [PATCH 30/63] feat(datetime): add `toObject` method compatible with luxon's `DateTime.fromObject` (#130) --- package-lock.json | 17 +++++++++++++++++ package.json | 2 ++ src/js/rrule_datetime.rs | 17 +++++++++++++++++ tests/datetime.spec.ts | 12 ++++++++++++ 4 files changed, 48 insertions(+) diff --git a/package-lock.json b/package-lock.json index c820c29..00e172e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", + "@types/luxon": "^3.4.2", "@types/node": "^20.12.8", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", @@ -28,6 +29,7 @@ "husky": "^9.0.11", "jest": "^29.5.0", "lint-staged": "^15.2.2", + "luxon": "^3.4.4", "mkdirp": "^3.0.1", "prettier": "^2.8.3", "rimraf": "^5.0.5", @@ -2788,6 +2790,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "dev": true + }, "node_modules/@types/node": { "version": "20.12.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", @@ -8167,6 +8175,15 @@ "node": "14 || >=16.14" } }, + "node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", diff --git a/package.json b/package.json index 4cc381f..eb75a39 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", "@types/node": "^20.12.8", + "@types/luxon": "^3.4.2", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", @@ -61,6 +62,7 @@ "jest": "^29.5.0", "lint-staged": "^15.2.2", "mkdirp": "^3.0.1", + "luxon": "^3.4.4", "prettier": "^2.8.3", "rimraf": "^5.0.5", "rrule": "^2.7.2", diff --git a/src/js/rrule_datetime.rs b/src/js/rrule_datetime.rs index 9c7001f..193695d 100644 --- a/src/js/rrule_datetime.rs +++ b/src/js/rrule_datetime.rs @@ -103,6 +103,23 @@ impl RRuleDateTime { pub fn to_utc_date(&self, env: Env) -> napi::Result { env.create_date(self.date_time.naive_utc().and_utc().timestamp_millis() as f64) } + + #[napi( + ts_return_type = "{ day: number, month: number, year: number, hour: number, minute: number, second: number, millisecond: number }" + )] + pub fn to_object(&self, env: Env) -> napi::Result { + let mut obj = env.create_object()?; + + obj.set_named_property("day", env.create_int32(self.day() as i32)?)?; + obj.set_named_property("month", env.create_int32(self.month() as i32)?)?; + obj.set_named_property("year", env.create_int32(self.year() as i32)?)?; + obj.set_named_property("hour", env.create_int32(self.hour() as i32)?)?; + obj.set_named_property("minute", env.create_int32(self.minute() as i32)?)?; + obj.set_named_property("second", env.create_int32(self.second() as i32)?)?; + obj.set_named_property("millisecond", env.create_int32(self.millisecond() as i32)?)?; + + Ok(obj) + } } impl From> for RRuleDateTime { diff --git a/tests/datetime.spec.ts b/tests/datetime.spec.ts index cda08d2..82085ec 100644 --- a/tests/datetime.spec.ts +++ b/tests/datetime.spec.ts @@ -1,4 +1,5 @@ import { RRuleDateTime } from '../dist'; +import { DateTime } from 'luxon'; test.each([new Date(873205200000), 873205200000])( 'Can create an RRuleDateTime from a %s', @@ -32,3 +33,14 @@ it('Can create a local RRuleDateTime', () => { expect(rruleDateTime.timezone.isLocal).toBe(true); expect(rruleDateTime.timezone.name).toBe('Local'); }); + +it('Can create a Luxon DateTime from an RRuleDateTime', () => { + const timestamp = 873205200000; + const rruleDateTime = new RRuleDateTime(timestamp, 'US/Eastern'); + const luxonDateTime = DateTime.fromObject(rruleDateTime.toObject(), { + zone: rruleDateTime.timezone.name, + }); + + expect(luxonDateTime.toMillis()).toBe(timestamp); + expect(luxonDateTime.toISO()).toBe('1997-09-02T09:00:00.000-04:00'); +}); From eb01d608a4a2245149cdb4a8cd61360085a39c85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 17:19:50 +0700 Subject: [PATCH 31/63] chore(deps): bump napi from 2.16.4 to 2.16.5 (#140) Bumps [napi](https://github.com/napi-rs/napi-rs) from 2.16.4 to 2.16.5. - [Release notes](https://github.com/napi-rs/napi-rs/releases) - [Commits](https://github.com/napi-rs/napi-rs/compare/napi@2.16.4...napi@2.16.5) --- updated-dependencies: - dependency-name: napi dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2fab647..2a8d782 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -185,9 +185,9 @@ checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "napi" -version = "2.16.4" +version = "2.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da1edd9510299935e4f52a24d1e69ebd224157e3e962c6c847edec5c2e4f786f" +checksum = "24a2b3b82a9815e80bf1619efcf5d83ca0e223b964af1dbcbabf317dd9d2622f" dependencies = [ "bitflags", "ctor", diff --git a/Cargo.toml b/Cargo.toml index 90c6ee4..42190fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ crate-type = ["cdylib"] chrono = "0.4.24" chrono-tz = "0.8.5" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix -napi = { version = "2.12.2", default-features = false, features = ["napi5"] } +napi = { version = "2.16.5", default-features = false, features = ["napi5"] } napi-derive = "2.12.2" replace_with = "0.1.7" rrule = { version = "0.12.0", features = ["exrule"] } From e2d674a264acc6524f00f369b696ec37f5672ee2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 17:20:51 +0700 Subject: [PATCH 32/63] chore(deps-dev): bump @types/node from 20.12.8 to 20.12.10 (#138) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.12.8 to 20.12.10. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00e172e..0ea2e61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2797,9 +2797,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" From 18625f0a49b5fe33bc795b71b297f504a6795198 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 17:40:36 +0700 Subject: [PATCH 33/63] chore(deps): bump napi-derive from 2.16.3 to 2.16.4 (#139) Bumps [napi-derive](https://github.com/napi-rs/napi-rs) from 2.16.3 to 2.16.4. - [Release notes](https://github.com/napi-rs/napi-rs/releases) - [Commits](https://github.com/napi-rs/napi-rs/compare/napi-derive@2.16.3...napi-derive@2.16.4) --- updated-dependencies: - dependency-name: napi-derive dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a8d782..b98fa0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,9 +204,9 @@ checksum = "e1c0f5d67ee408a4685b61f5ab7e58605c8ae3f2b4189f0127d804ff13d5560a" [[package]] name = "napi-derive" -version = "2.16.3" +version = "2.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a6de411b6217dbb47cd7a8c48684b162309ff48a77df9228c082400dd5b030" +checksum = "4bb613535cde46cff231e53cd819c1694a32d48946bc2dda6b41174ace52ac08" dependencies = [ "cfg-if", "convert_case", @@ -218,9 +218,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "1.0.65" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e35868d43b178b0eb9c17bd018960b1b5dd1732a7d47c23debe8f5c4caf498" +checksum = "da041b19246ab4240998774e987fd9a7d92cc7406b91b5eddb6691e81feac044" dependencies = [ "convert_case", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index 42190fc..c0a8b33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ chrono = "0.4.24" chrono-tz = "0.8.5" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix napi = { version = "2.16.5", default-features = false, features = ["napi5"] } -napi-derive = "2.12.2" +napi-derive = "2.16.4" replace_with = "0.1.7" rrule = { version = "0.12.0", features = ["exrule"] } From 614585331de1afab599479371afd6eb0634e9687 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 17:41:31 +0700 Subject: [PATCH 34/63] chore(deps-dev): bump @napi-rs/cli from 2.18.2 to 2.18.3 (#136) Bumps [@napi-rs/cli](https://github.com/napi-rs/napi-rs) from 2.18.2 to 2.18.3. - [Release notes](https://github.com/napi-rs/napi-rs/releases) - [Commits](https://github.com/napi-rs/napi-rs/compare/@napi-rs/cli@2.18.2...@napi-rs/cli@2.18.3) --- updated-dependencies: - dependency-name: "@napi-rs/cli" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ea2e61..cc839f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2030,9 +2030,9 @@ } }, "node_modules/@napi-rs/cli": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.2.tgz", - "integrity": "sha512-IXQji3IF5eStxTHe/PxDSRjPrFymYAQ5FbIvqurxzxyWR8nJql9mtvmCP8y2g8tSoW5xhaToLQW0+mO3lUZq4w==", + "version": "2.18.3", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.3.tgz", + "integrity": "sha512-L0f4kP0dyG8W5Qtc7MtP73VvLLrOLyRcUEBzknIfu8Jk4Jfhrsx1ItMHgyalYqMSslWdY3ojEfAaU5sx1VyeQQ==", "dev": true, "bin": { "napi": "scripts/index.js" From c7491d59069fb67dfd33fe1cdcf8ea5c0ba2970e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 12:34:56 +0700 Subject: [PATCH 35/63] chore(deps): bump napi from 2.16.5 to 2.16.6 (#143) Bumps [napi](https://github.com/napi-rs/napi-rs) from 2.16.5 to 2.16.6. - [Release notes](https://github.com/napi-rs/napi-rs/releases) - [Commits](https://github.com/napi-rs/napi-rs/compare/napi@2.16.5...napi@2.16.6) --- updated-dependencies: - dependency-name: napi dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b98fa0e..0fb4638 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -185,9 +185,9 @@ checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "napi" -version = "2.16.5" +version = "2.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a2b3b82a9815e80bf1619efcf5d83ca0e223b964af1dbcbabf317dd9d2622f" +checksum = "dfc300228808a0e6aea5a58115c82889240bcf8dab16fc25ad675b33e454b368" dependencies = [ "bitflags", "ctor", diff --git a/Cargo.toml b/Cargo.toml index c0a8b33..c4ad410 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ crate-type = ["cdylib"] chrono = "0.4.24" chrono-tz = "0.8.5" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix -napi = { version = "2.16.5", default-features = false, features = ["napi5"] } +napi = { version = "2.16.6", default-features = false, features = ["napi5"] } napi-derive = "2.16.4" replace_with = "0.1.7" rrule = { version = "0.12.0", features = ["exrule"] } From c17d48e8b8f1fdfd448e849e2b2e8210022ec1ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 20:53:20 +0700 Subject: [PATCH 36/63] chore(deps-dev): bump @types/node from 20.12.10 to 20.12.11 (#145) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.12.10 to 20.12.11. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc839f3..24bd2da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2797,9 +2797,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", - "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" From 60ad6292b6cf7ebd1a9855a983688ab69a40f89e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 20:53:57 +0700 Subject: [PATCH 37/63] chore(deps-dev): bump semantic-release from 23.0.8 to 23.1.1 (#146) Bumps [semantic-release](https://github.com/semantic-release/semantic-release) from 23.0.8 to 23.1.1. - [Release notes](https://github.com/semantic-release/semantic-release/releases) - [Commits](https://github.com/semantic-release/semantic-release/compare/v23.0.8...v23.1.1) --- updated-dependencies: - dependency-name: semantic-release dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 178 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 166 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24bd2da..ba5b105 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2278,6 +2278,12 @@ "node": ">=12" } }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, "node_modules/@semantic-release/commit-analyzer": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-12.0.0.tgz", @@ -5499,11 +5505,10 @@ } }, "node_modules/figures": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.0.1.tgz", - "integrity": "sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, - "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -6630,6 +6635,18 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -8668,11 +8685,10 @@ } }, "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -11500,6 +11516,18 @@ "dev": true, "license": "MIT" }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -11811,6 +11839,21 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-ms": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", + "integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==", + "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -12292,9 +12335,9 @@ } }, "node_modules/semantic-release": { - "version": "23.0.8", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.8.tgz", - "integrity": "sha512-yZkuWcTTfh5h/DrR4Q4QvJSARJdb6wjwn/sN0qKMYEkvwaVFek8YWfrgtL8oWaRdl0fLte0Y1wWMzLbwoaII1g==", + "version": "23.1.1", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.1.1.tgz", + "integrity": "sha512-qqJDBhbtHsjUEMsojWKGuL5lQFCJuPtiXKEIlFKyTzDDGTAE/oyvznaP8GeOr5PvcqBJ6LQz4JCENWPLeehSpA==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^12.0.0", @@ -12306,7 +12349,7 @@ "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", - "execa": "^8.0.0", + "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", @@ -12334,6 +12377,81 @@ "node": ">=20.8.1" } }, + "node_modules/semantic-release/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/execa": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.0.2.tgz", + "integrity": "sha512-oO281GF7ksH/Ogv1xyDf1prvFta/6/XkGKxRUvA3IB2MU1rCJGlFs86HRZhdooow1ISkR0Np0rOxUCIJVw36Rg==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^7.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^5.2.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/human-signals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", + "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/p-reduce": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", @@ -12347,6 +12465,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -13774,6 +13916,18 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.0.0.tgz", + "integrity": "sha512-esbDnt0Z1zI1KgvOZU90hJbL6BkoUbrP9yy7ArNZ6TmxBxydMJTYMf9FZjmwwcA8ZgEQzriQ3hwZ0NYXhlFo8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } From 8b4c5c958b5ca6ae7d1cfde4286b74db2c35201e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 20:55:25 +0700 Subject: [PATCH 38/63] chore(deps-dev): bump conventional-changelog-conventionalcommits (#137) Bumps [conventional-changelog-conventionalcommits](https://github.com/conventional-changelog/conventional-changelog/tree/HEAD/packages/conventional-changelog-conventionalcommits) from 7.0.2 to 8.0.0. - [Release notes](https://github.com/conventional-changelog/conventional-changelog/releases) - [Changelog](https://github.com/conventional-changelog/conventional-changelog/blob/master/packages/conventional-changelog-conventionalcommits/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/conventional-changelog/commits/conventional-changelog-conventionalcommits-v8.0.0/packages/conventional-changelog-conventionalcommits) --- updated-dependencies: - dependency-name: conventional-changelog-conventionalcommits dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 23 +++++++++++++++++------ package.json | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba5b105..177cd5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", - "conventional-changelog-conventionalcommits": "^7.0.2", + "conventional-changelog-conventionalcommits": "^8.0.0", "cpy-cli": "^5.0.0", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", @@ -954,6 +954,18 @@ "node": ">=v18" } }, + "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@commitlint/config-validator": { "version": "19.0.3", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", @@ -4113,16 +4125,15 @@ } }, "node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-8.0.0.tgz", + "integrity": "sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==", "dev": true, - "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/conventional-changelog-writer": { diff --git a/package.json b/package.json index eb75a39..9a3bcba 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", - "conventional-changelog-conventionalcommits": "^7.0.2", + "conventional-changelog-conventionalcommits": "^8.0.0", "cpy-cli": "^5.0.0", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", From 07ad5ee2ecc930f77590289949b8197a94f61bf9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 22:41:46 +0700 Subject: [PATCH 39/63] chore(deps-dev): bump rimraf from 5.0.5 to 5.0.7 (#149) Bumps [rimraf](https://github.com/isaacs/rimraf) from 5.0.5 to 5.0.7. - [Changelog](https://github.com/isaacs/rimraf/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/rimraf/compare/v5.0.5...v5.0.7) --- updated-dependencies: - dependency-name: rimraf dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 177cd5f..15a1ea7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12200,9 +12200,9 @@ "dev": true }, "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -12211,7 +12211,7 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" From f76099cb6c0e576df01ed677d7d59bafee21d00a Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 18 May 2024 20:07:39 +0700 Subject: [PATCH 40/63] feat: reimplement api in typescript and introduce `DateTime` class (#133) --- .eslintrc.js | 2 +- .github/workflows/build-and-test.yml | 60 ++--- Cargo.toml | 1 + README.md | 39 +-- benchmark/index.ts | 106 ++++---- {src => lib}/js.rs | 6 +- lib/js/datetime.rs | 116 +++++++++ {src => lib}/js/frequency.rs | 0 {src => lib}/js/month.rs | 0 {src => lib}/js/n_weekday.rs | 0 {src => lib}/js/rrule.rs | 139 ++++++++--- lib/js/rrule_set.rs | 345 +++++++++++++++++++++++++++ {src => lib}/js/weekday.rs | 0 {src => lib}/lib.rs | 0 package-lock.json | 19 ++ package.json | 15 +- src/datetime.ts | 167 +++++++++++++ src/index.ts | 4 + src/js/rrule_datetime.rs | 150 ------------ src/js/rrule_set.rs | 269 --------------------- src/js/rrule_timezone.rs | 52 ---- src/lib/index.d.ts | 104 ++++++++ src/lib/index.js | 320 +++++++++++++++++++++++++ src/rrule-set.ts | 251 +++++++++++++++++++ src/rrule.ts | 213 +++++++++++++++++ tests/daily.spec.ts | 183 ++++++++------ tests/datetime.spec.ts | 301 +++++++++++++++++++---- tests/monthly.spec.ts | 251 +++++++++++-------- tests/parsing.spec.ts | 17 +- tests/utils.ts | 8 - tests/weekly.spec.ts | 119 ++++++--- tests/yearly.spec.ts | 161 +++++++------ tsconfig.build.json | 8 + tsconfig.eslint.json | 4 +- tsconfig.json | 15 +- 35 files changed, 2489 insertions(+), 956 deletions(-) rename {src => lib}/js.rs (66%) create mode 100644 lib/js/datetime.rs rename {src => lib}/js/frequency.rs (100%) rename {src => lib}/js/month.rs (100%) rename {src => lib}/js/n_weekday.rs (100%) rename {src => lib}/js/rrule.rs (55%) create mode 100644 lib/js/rrule_set.rs rename {src => lib}/js/weekday.rs (100%) rename {src => lib}/lib.rs (100%) create mode 100644 src/datetime.ts create mode 100644 src/index.ts delete mode 100644 src/js/rrule_datetime.rs delete mode 100644 src/js/rrule_set.rs delete mode 100644 src/js/rrule_timezone.rs create mode 100644 src/lib/index.d.ts create mode 100644 src/lib/index.js create mode 100644 src/rrule-set.ts create mode 100644 src/rrule.ts delete mode 100644 tests/utils.ts create mode 100644 tsconfig.build.json diff --git a/.eslintrc.js b/.eslintrc.js index 30f3e20..d4ec301 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,7 +9,7 @@ module.exports = { 'plugin:eslint-comments/recommended', ], plugins: ['@typescript-eslint'], - ignorePatterns: ['node_modules', '/target', '/dist/**/*'], + ignorePatterns: ['node_modules', '/target', '/dist/**/*', 'src/lib/**/*'], env: { node: true, }, diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 5d93751..14ddd4d 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -13,61 +13,61 @@ jobs: settings: - host: macos-latest target: x86_64-apple-darwin - build: npm run build -- --target x86_64-apple-darwin + build: npm run build:lib -- --target x86_64-apple-darwin - host: windows-latest - build: npm run build + build: npm run build:lib target: x86_64-pc-windows-msvc - host: windows-latest build: | - npm run build -- --target i686-pc-windows-msvc + npm run build:lib -- --target i686-pc-windows-msvc npm test target: i686-pc-windows-msvc - host: ubuntu-latest target: x86_64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian - build: npm run build -- --target x86_64-unknown-linux-gnu + build: npm run build:lib -- --target x86_64-unknown-linux-gnu - host: ubuntu-latest target: x86_64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine - build: npm run build -- --target x86_64-unknown-linux-musl + build: npm run build:lib -- --target x86_64-unknown-linux-musl - host: macos-latest target: aarch64-apple-darwin - build: npm run build -- --target aarch64-apple-darwin + build: npm run build:lib -- --target aarch64-apple-darwin - host: ubuntu-latest target: aarch64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 - build: npm run build -- --target aarch64-unknown-linux-gnu + build: npm run build:lib -- --target aarch64-unknown-linux-gnu - host: ubuntu-latest target: armv7-unknown-linux-gnueabihf setup: | sudo apt-get update sudo apt-get install gcc-arm-linux-gnueabihf -y - build: npm run build -- --target armv7-unknown-linux-gnueabihf + build: npm run build:lib -- --target armv7-unknown-linux-gnueabihf - host: ubuntu-latest target: armv7-unknown-linux-musleabihf - build: npm run build -- --target armv7-unknown-linux-musleabihf + build: npm run build:lib -- --target armv7-unknown-linux-musleabihf - host: ubuntu-latest target: aarch64-linux-android - build: npm run build -- --target aarch64-linux-android + build: npm run build:lib -- --target aarch64-linux-android - host: ubuntu-latest target: armv7-linux-androideabi - build: npm run build -- --target armv7-linux-androideabi + build: npm run build:lib -- --target armv7-linux-androideabi - host: ubuntu-latest target: aarch64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: |- set -e && rustup target add aarch64-unknown-linux-musl && - npm run build -- --target aarch64-unknown-linux-musl + npm run build:lib -- --target aarch64-unknown-linux-musl - host: windows-latest target: aarch64-pc-windows-msvc - build: npm run build -- --target aarch64-pc-windows-msvc + build: npm run build:lib -- --target aarch64-pc-windows-msvc - host: ubuntu-latest target: riscv64gc-unknown-linux-gnu setup: | sudo apt-get update sudo apt-get install gcc-riscv64-linux-gnu -y - build: npm run build -- --target riscv64gc-unknown-linux-gnu + build: npm run build:lib -- --target riscv64gc-unknown-linux-gnu name: stable - ${{ matrix.settings.target }} - node@20 runs-on: ${{ matrix.settings.host }} steps: @@ -131,7 +131,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.settings.target }} - path: dist/${{ env.APP_NAME }}.*.node + path: src/lib/${{ env.APP_NAME }}.*.node if-no-files-found: error build-freebsd: runs-on: macos-13 @@ -168,14 +168,14 @@ jobs: env freebsd-version npm ci - npm run build + npm run build:lib rm -rf node_modules rm -rf target - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-freebsd - path: dist/${{ env.APP_NAME }}.*.node + path: src/lib/${{ env.APP_NAME }}.*.node if-no-files-found: error test-macOS-windows-binding: name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} @@ -210,12 +210,12 @@ jobs: - name: Install dependencies run: npm ci - name: Remove binary - run: npx rimraf --glob ./dist/*.node + run: npx rimraf --glob ./src/lib/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-${{ matrix.settings.target }} - path: dist + path: src/lib - name: List packages run: ls -R . shell: bash @@ -243,12 +243,12 @@ jobs: - name: Install dependencies run: npm ci - name: Remove binary - run: npx rimraf --glob ./dist/*.node + run: npx rimraf --glob ./src/lib/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-gnu - path: dist + path: src/lib - name: List packages run: ls -R . shell: bash @@ -276,12 +276,12 @@ jobs: - name: Install dependencies run: npm ci --libc "musl" - name: Remove binary - run: npx rimraf --glob ./dist/*.node + run: npx rimraf --glob ./src/lib/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-musl - path: dist + path: src/lib - name: List packages run: ls -R . shell: bash @@ -304,12 +304,12 @@ jobs: - name: Install dependencies run: npm ci --cpu "arm64" --libc "glibc" - name: Remove binary - run: npx rimraf --glob ./dist/*.node + run: npx rimraf --glob ./src/lib/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-gnu - path: dist + path: src/lib - name: List packages run: ls -R . shell: bash @@ -337,12 +337,12 @@ jobs: - name: Install dependencies run: npm ci --cpu "arm64" --libc "musl" - name: Remove binary - run: npx rimraf --glob ./dist/*.node + run: npx rimraf --glob ./src/lib/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-musl - path: dist + path: src/lib - name: List packages run: ls -R . shell: bash @@ -376,12 +376,12 @@ jobs: - name: Install dependencies run: npm ci --cpu "arm" - name: Remove binary - run: npx rimraf --glob ./dist/*.node + run: npx rimraf --glob ./src/lib/*.node - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-armv7-unknown-linux-gnueabihf - path: dist + path: src/lib - name: List packages run: ls -R . shell: bash @@ -429,5 +429,5 @@ jobs: uses: actions/upload-artifact@v4 with: name: bindings-universal-apple-darwin - path: dist/${{ env.APP_NAME }}.*.node + path: src/lib/${{ env.APP_NAME }}.*.node if-no-files-found: error \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index c4ad410..9d38066 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ version = "0.0.0" [lib] crate-type = ["cdylib"] +path = "lib/lib.rs" [dependencies] chrono = "0.4.24" diff --git a/README.md b/README.md index 0331ce5..a7a94cd 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ## Quick Start -See [test folder](https://github.com/lsndr/rrule-rust/tree/master/__test__) to find more use cases +See [test folder](https://github.com/lsndr/rrule-rust/tree/master/tests) to find more use cases ``` npm i rrule-rust @@ -22,28 +22,35 @@ See [test folder](https://github.com/lsndr/rrule-rust/tree/master/__test__) to f ```typescript -import { RRule, RRuleSet, Frequency } from 'rrule-rust'; - -const rrule = new RRule(Frequency.Daily).setCount(5); -const set = new RRuleSet(873205200000, 'US/Eastern').addRrule(rrule); - -const dates = set.all(); // [ 873205200000, 873291600000, 873378000000, 873464400000, 873550800000 ] +import { RRule, RRuleSet, Frequency, DateTime } from 'rrule-rust'; + +const rrule = new RRule({ + frequency: Frequency.Daily, + count: 5 +}); +const set = new RRuleSet({ + dtstart: DateTime.create(1997, 9, 2, 9, 0, 0, false), + tzid: 'US/Eastern', + rrules: [rrule] +}); + +const dates = set.all(); // [ DateTime, DateTime, DateTime, DateTime, DateTime ] const asString = set.toString(); // DTSTART;TZID=US/Eastern:19970902T090000\nFREQ=daily;COUNT=5;BYHOUR=9;BYMINUTE=0;BYSECOND=0 ``` -## Perfomance +## Performance ``` - Host: MacBook Pro, 13-inch, 2018 - OS: macOS 13.2 (22D49) - Processor: 2,3 GHz Quad-Core Intel Core i5 - Memory: 16 GB 2133 MHz LPDDR3 + Host: MacBook Pro, 14-inch, 2023 + OS: macOS 14.4.1 (23E224) + Processor: Apple M3 Pro + Memory: 36 GB LPDDR5 ``` -| | rrule | rrule-rust | | -| -------- | ------------ | ------------ | ------------ | -| UTC TZ | 8 128 ops/s | 42 343 ops/s | ~5x faster | -| Other TZ | 68 ops/s | 40 549 ops/s | ~600x faster | +| | rrule | rrule-rust | | +| -------- | -------------- | ------------- | ------------ | +| UTC TZ | 15 904 ops/s | 108 538 ops/s | ~6x faster | +| Other TZ | 260 ops/s | 106 034 ops/s | ~400x faster | You can run benchmarks using `npm run benchmark` diff --git a/benchmark/index.ts b/benchmark/index.ts index 3682472..2b81103 100644 --- a/benchmark/index.ts +++ b/benchmark/index.ts @@ -1,59 +1,51 @@ import b from 'benny'; import * as node from 'rrule'; -import * as rust from '../dist'; - -b.suite( - 'UTC TZ', - b.add('rrule-rust', () => { - const rrule = new rust.RRule(rust.Frequency.Daily) - .setCount(30) - .setInterval(1); - const set = new rust.RRuleSet( - new rust.RRuleDateTime(new Date(1679428740000), 'UTC'), - ).addRrule(rrule); - - set.all(); - }), - b.add('rrule', () => { - const rrule = new node.RRule({ - freq: node.RRule.DAILY, - dtstart: new Date(Date.UTC(2023, 2, 21, 23, 59, 0)), - tzid: 'UTC', - count: 30, - interval: 1, - }); - - rrule.all(); - }), - - b.cycle(), - b.complete(), -); - -b.suite( - 'Other TZ', - b.add('rrule-rust', () => { - const rrule = new rust.RRule(rust.Frequency.Daily) - .setCount(30) - .setInterval(1); - const set = new rust.RRuleSet( - new rust.RRuleDateTime(new Date(1679428740000), 'Pacific/Kiritimati'), - ).addRrule(rrule); - - set.all(); - }), - b.add('rrule', () => { - const rrule = new node.RRule({ - freq: node.RRule.DAILY, - dtstart: new Date(Date.UTC(2023, 2, 21, 23, 59, 0)), - tzid: 'Pacific/Kiritimati', - count: 30, - interval: 1, - }); - - rrule.all(); - }), - - b.cycle(), - b.complete(), -); +import * as rust from '../src'; + +function suite(tzid: string) { + return [ + b.add('RRuleSet.all() (rust)', () => { + const rrule = new rust.RRule({ + frequency: rust.Frequency.Daily, + count: 30, + interval: 1, + }); + const set = new rust.RRuleSet({ + dtstart: rust.DateTime.create(2023, 2, 21, 23, 59, 0, false), + tzid, + rrules: [rrule], + }); + + set.all(); + }), + b.add('RRule.all() (node)', () => { + const rrule = new node.RRule({ + freq: node.RRule.DAILY, + dtstart: new Date(Date.UTC(2023, 2, 21, 23, 59, 0)), + tzid, + count: 30, + interval: 1, + }); + + rrule.all(); + }), + b.add('RRuleSet.all() (node)', () => { + const rrule = new node.RRule({ + freq: node.RRule.DAILY, + dtstart: new Date(Date.UTC(2023, 2, 21, 23, 59, 0)), + tzid, + count: 30, + interval: 1, + }); + const set = new node.RRuleSet(); + set.rrule(rrule); + + set.all(); + }), + b.cycle(), + b.complete(), + ]; +} + +b.suite('UTC TZ', ...suite('UTC')); +b.suite('Other TZ', ...suite('Pacific/Kiritimati')); diff --git a/src/js.rs b/lib/js.rs similarity index 66% rename from src/js.rs rename to lib/js.rs index 662d26a..76b4cc4 100644 --- a/src/js.rs +++ b/lib/js.rs @@ -1,17 +1,15 @@ +mod datetime; mod frequency; mod month; mod n_weekday; mod rrule; -mod rrule_datetime; mod rrule_set; -mod rrule_timezone; mod weekday; +pub use datetime::DateTime; pub use frequency::Frequency; pub use month::Month; pub use n_weekday::NWeekday; pub use rrule::RRule; -pub use rrule_datetime::RRuleDateTime; pub use rrule_set::RRuleSet; -pub use rrule_timezone::RRuleTimezone; pub use weekday::Weekday; diff --git a/lib/js/datetime.rs b/lib/js/datetime.rs new file mode 100644 index 0000000..57ee29d --- /dev/null +++ b/lib/js/datetime.rs @@ -0,0 +1,116 @@ +use chrono::Datelike; +use chrono::TimeZone; +use chrono::Timelike; + +pub struct DateTime { + year: u32, + month: u32, + day: u32, + hour: u32, + minute: u32, + second: u32, + utc: bool, +} + +impl DateTime { + pub fn to_rrule_datetime( + &self, + timezone: &rrule::Tz, + ) -> napi::Result> { + let timezone = match self.utc { + true => &rrule::Tz::UTC, + false => &timezone, + }; + + match timezone + .with_ymd_and_hms( + self.year as i32, + self.month, + self.day, + self.hour, + self.minute, + self.second, + ) + .single() + { + Some(datetime) => Ok(datetime), + None => Err(napi::Error::new( + napi::Status::GenericFailure, + format!( + "Invalid datetime: {}-{}-{} {}:{}:{} {}", + self.year, + self.month, + self.day, + self.hour, + self.minute, + self.second, + if self.utc { "UTC" } else { "Local" } + ), + )), + } + } +} + +impl From for DateTime { + fn from(numeric: i64) -> Self { + let year = (numeric / 100000000000) as u32; + let month = ((numeric / 1000000000) % 100) as u32; + let day = ((numeric / 10000000) % 100) as u32; + let hour = ((numeric / 100000) % 100) as u32; + let minute = ((numeric / 1000) % 100) as u32; + let second = ((numeric / 10) % 100) as u32; + let utc = (numeric % 10) == 1; + + DateTime { + year, + month, + day, + hour, + minute, + second, + utc, + } + } +} + +impl From> for DateTime { + fn from(datetime: chrono::DateTime) -> Self { + let year = datetime.year() as u32; + let month = datetime.month(); + let day = datetime.day(); + let hour = datetime.hour(); + let minute = datetime.minute(); + let second = datetime.second(); + let utc = datetime.timezone() == rrule::Tz::UTC; + + DateTime { + year, + month, + day, + hour, + minute, + second, + utc, + } + } +} + +impl Into for DateTime { + fn into(self) -> i64 { + let year = self.year as i64; + let month = self.month as i64; + let day = self.day as i64; + let hour = self.hour as i64; + let minute = self.minute as i64; + let second = self.second as i64; + let utc = if self.utc { 1 } else { 0 }; + + year * 100000000000 + + month * 1000000000 + + day * 10000000 + + hour * 100000 + + minute * 1000 + + second * 10 + + utc + } +} diff --git a/src/js/frequency.rs b/lib/js/frequency.rs similarity index 100% rename from src/js/frequency.rs rename to lib/js/frequency.rs diff --git a/src/js/month.rs b/lib/js/month.rs similarity index 100% rename from src/js/month.rs rename to lib/js/month.rs diff --git a/src/js/n_weekday.rs b/lib/js/n_weekday.rs similarity index 100% rename from src/js/n_weekday.rs rename to lib/js/n_weekday.rs diff --git a/src/js/rrule.rs b/lib/js/rrule.rs similarity index 55% rename from src/js/rrule.rs rename to lib/js/rrule.rs index c560d87..8cb0efa 100644 --- a/src/js/rrule.rs +++ b/lib/js/rrule.rs @@ -1,5 +1,5 @@ -use super::{Frequency, Month, NWeekday, RRuleDateTime, Weekday}; -use chrono::DateTime; +use super::{Frequency, Month, NWeekday, Weekday}; +use chrono::{DateTime, Datelike, Local, Timelike}; use napi::{bindgen_prelude::Array, Either, Env}; use napi_derive::napi; use replace_with::replace_with_or_abort; @@ -12,10 +12,53 @@ pub struct RRule { #[napi] impl RRule { #[napi(constructor)] - pub fn new(frequency: Frequency) -> Self { + pub fn new(frequency: Frequency) -> napi::Result { let rrule = rrule::RRule::new(frequency.into()); - RRule { rrule } + Ok(RRule { rrule }) + } + + #[napi(factory)] + pub fn create( + env: Env, + frequency: Option, + interval: Option, + count: Option, + #[napi(ts_arg_type = "(readonly (NWeekday | Weekday)[]) | undefined | null")] + by_weekday: Option>>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_hour: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_minute: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_second: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_monthday: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_setpos: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_month: Option, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_weekno: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_yearday: Option>, + weekstart: Option, + until: Option, + ) -> napi::Result { + let mut rrule = Self::new(frequency.unwrap_or(Frequency::Daily))?; + rrule.set_interval(interval.unwrap_or(1))?; + rrule.set_by_weekday(by_weekday.unwrap_or_else(|| Vec::new()))?; + rrule.set_by_hour(by_hour.unwrap_or_else(|| Vec::new()))?; + rrule.set_by_minute(by_minute.unwrap_or_else(|| Vec::new()))?; + rrule.set_by_second(by_second.unwrap_or_else(|| Vec::new()))?; + rrule.set_by_monthday(by_monthday.unwrap_or_else(|| Vec::new()))?; + rrule.set_by_setpos(by_setpos.unwrap_or_else(|| Vec::new()))?; + rrule.set_by_month(by_month.unwrap_or_else(|| env.create_array(0).unwrap()))?; + rrule.set_by_weekno(by_weekno.unwrap_or_else(|| Vec::new()))?; + rrule.set_by_yearday(by_yearday.unwrap_or_else(|| Vec::new()))?; + rrule.set_weekstart(weekstart.unwrap_or(Weekday::Monday))?; + + if let Some(until) = until { + rrule.set_until(until)?; + } + + if let Some(count) = count { + rrule.set_count(count)?; + } + + Ok(rrule) } #[napi(factory, ts_return_type = "RRule")] @@ -105,9 +148,14 @@ impl RRule { } #[napi(getter)] - pub fn until(&self) -> napi::Result> { + pub fn until(&self) -> napi::Result> { Ok(match self.rrule.get_until() { - Some(until) => Some(RRuleDateTime::new_with_date_time(until.clone())), + Some(until) => { + let datetime = super::DateTime::from(*until); + let datetime: i64 = datetime.into(); + + Some(datetime) + } None => None, }) } @@ -134,7 +182,7 @@ impl RRule { #[napi] pub fn set_by_weekday( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] weekdays: Vec< + #[napi(ts_arg_type = "readonly (NWeekday | Weekday)[]")] weekdays: Vec< Either, >, ) -> napi::Result<&Self> { @@ -154,7 +202,7 @@ impl RRule { #[napi] pub fn set_by_hour( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] hours: Vec, + #[napi(ts_arg_type = "readonly number[]")] hours: Vec, ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule, |self_| self_.by_hour(hours)); @@ -164,7 +212,7 @@ impl RRule { #[napi] pub fn set_by_minute( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] minutes: Vec, + #[napi(ts_arg_type = "readonly number[]")] minutes: Vec, ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule, |self_| self_.by_minute(minutes)); @@ -174,7 +222,7 @@ impl RRule { #[napi] pub fn set_by_second( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] seconds: Vec, + #[napi(ts_arg_type = "readonly number[]")] seconds: Vec, ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule, |self_| self_.by_second(seconds)); @@ -184,7 +232,7 @@ impl RRule { #[napi] pub fn set_by_monthday( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] days: Vec, + #[napi(ts_arg_type = "readonly number[]")] days: Vec, ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule, |self_| self_.by_month_day(days)); @@ -194,7 +242,7 @@ impl RRule { #[napi] pub fn set_by_setpos( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] poses: Vec, + #[napi(ts_arg_type = "readonly number[]")] poses: Vec, ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule, |self_| self_.by_set_pos(poses)); @@ -204,7 +252,7 @@ impl RRule { #[napi] pub fn set_by_month( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] months: Array, + #[napi(ts_arg_type = "readonly Month[]")] months: Array, ) -> napi::Result<&Self> { let mut vec: Vec = Vec::new(); @@ -222,7 +270,7 @@ impl RRule { #[napi] pub fn set_by_weekno( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] week_numbers: Vec, + #[napi(ts_arg_type = "readonly number[]")] week_numbers: Vec, ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule, |self_| self_.by_week_no(week_numbers)); @@ -232,7 +280,7 @@ impl RRule { #[napi] pub fn set_by_yearday( &mut self, - #[napi(ts_arg_type = "ReadonlyArray")] days: Vec, + #[napi(ts_arg_type = "readonly number[]")] days: Vec, ) -> napi::Result<&Self> { replace_with_or_abort(&mut self.rrule, |self_| self_.by_year_day(days)); @@ -247,24 +295,57 @@ impl RRule { } #[napi] - pub fn set_until( - &mut self, - date_time: napi::Either<&RRuleDateTime, napi::JsDate>, - ) -> napi::Result<&Self> { - let date_time = RRuleDateTime::from(date_time); - replace_with_or_abort(&mut self.rrule, |self_| self_.until(date_time.into())); + pub fn set_until(&mut self, datetime: i64) -> napi::Result<&Self> { + let datetime = super::DateTime::from(datetime); + let datetime: DateTime = + datetime.to_rrule_datetime(&rrule::Tz::Local(Local::now().timezone()))?; + + replace_with_or_abort(&mut self.rrule, |self_| self_.until(datetime)); Ok(self) } - pub fn validate(&self, dt_start: DateTime) -> napi::Result { - return Ok( - self - .rrule - .clone() - .validate(dt_start) - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?, - ); + pub fn validate( + &self, + dtstart: DateTime, + ) -> napi::Result> { + let mut rrule = self.rrule.clone(); + + if let Some(until) = rrule.get_until() { + let until = if until.timezone() == rrule::Tz::LOCAL { + self.convert_to_timezone(until, dtstart.timezone()) + } else { + *until + }; + + let datetime = until.with_timezone(&rrule::Tz::UTC); + + rrule = rrule.until(datetime); + } + + let rrule = rrule + .validate(dtstart) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + Ok(rrule) + } + + fn convert_to_timezone( + &self, + datetime: &chrono::DateTime, + timezone: Tz, + ) -> chrono::DateTime { + timezone + .with_ymd_and_hms( + datetime.year(), + datetime.month(), + datetime.day(), + datetime.hour(), + datetime.minute(), + datetime.second(), + ) + .single() + .unwrap() } } diff --git a/lib/js/rrule_set.rs b/lib/js/rrule_set.rs new file mode 100644 index 0000000..d2ce9cc --- /dev/null +++ b/lib/js/rrule_set.rs @@ -0,0 +1,345 @@ +use super::RRule; +use napi::bindgen_prelude::{Array, Reference, SharedReference}; +use napi::iterator::Generator; +use napi::Env; +use napi_derive::napi; +use replace_with::replace_with_or_abort; + +#[napi(js_name = "RRuleSet")] +pub struct RRuleSet { + rrule_set: rrule::RRuleSet, +} + +#[napi] +impl RRuleSet { + #[napi(constructor)] + pub fn new(dtstart: i64, tzid: String) -> napi::Result { + let timezone: chrono_tz::Tz = tzid + .parse() + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + let datetime = super::DateTime::from(dtstart); + let datetime = datetime + .to_rrule_datetime(&rrule::Tz::Tz(timezone))? + .with_timezone(&rrule::Tz::Tz(timezone)); + let rrule_set = rrule::RRuleSet::new(datetime); + + Ok(RRuleSet { rrule_set }) + } + + #[napi(factory)] + pub fn create( + dtstart: i64, + tzid: String, + #[napi(ts_arg_type = "(readonly RRule[]) | undefined | null")] rrules: Option>, + #[napi(ts_arg_type = "(readonly RRule[]) | undefined | null")] exrules: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] exdates: Option>, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] rdates: Option>, + ) -> napi::Result { + let mut set = Self::new(dtstart, tzid)?; + + if let Some(rrules) = rrules { + for rrule in rrules.iter() { + set.add_rrule(rrule)?; + } + } + + if let Some(exrules) = exrules { + for rrule in exrules.iter() { + set.add_exrule(rrule)?; + } + } + + if let Some(exdates) = exdates { + for datetime in exdates.iter() { + set.add_exdate(*datetime)?; + } + } + + if let Some(rdates) = rdates { + for datetime in rdates.iter() { + set.add_rdate(*datetime)?; + } + } + + Ok(set) + } + + #[napi(getter)] + pub fn tzid(&self) -> napi::Result { + Ok(self.rrule_set.get_dt_start().timezone().to_string()) + } + + #[napi(getter)] + pub fn dtstart(&self) -> napi::Result { + let dtstart = *self.rrule_set.get_dt_start(); + let dtstart: i64 = super::DateTime::from(dtstart).into(); + + Ok(dtstart) + } + + #[napi(getter, ts_return_type = "RRule[]")] + pub fn rrules(&self, env: Env) -> Array { + let mut arr = env.create_array(0).unwrap(); + let rrules = self.rrule_set.get_rrule(); + + for rrule in rrules.iter() { + arr.insert(RRule::from(to_unvalidated(rrule))).unwrap(); + } + + arr + } + + #[napi(getter, ts_return_type = "RRule[]")] + pub fn exrules(&self, env: Env) -> Array { + let mut arr = env.create_array(0).unwrap(); + let rrules = self.rrule_set.get_exrule(); + + for rrule in rrules.iter() { + arr.insert(RRule::from(to_unvalidated(rrule))).unwrap(); + } + + arr + } + + #[napi(getter, ts_return_type = "number[]")] + pub fn exdates(&self, env: Env) -> Array { + let mut arr = env.create_array(0).unwrap(); + let dates = self.rrule_set.get_exdate(); + + for date in dates.iter() { + let datetime: i64 = super::DateTime::from(*date).into(); + + arr.insert(datetime).unwrap(); + } + + arr + } + + #[napi(getter, ts_return_type = "number[]")] + pub fn rdates(&self, env: Env) -> Array { + let mut arr = env.create_array(0).unwrap(); + let dates = self.rrule_set.get_rdate(); + + for date in dates.iter() { + let datetime: i64 = super::DateTime::from(*date).into(); + + arr.insert(datetime).unwrap(); + } + + arr + } + + #[napi(factory, ts_return_type = "RRuleSet")] + pub fn parse(str: String) -> napi::Result { + let rrule_set: rrule::RRuleSet = str + .parse() + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + Ok(RRuleSet { rrule_set }) + } + + #[napi] + pub fn set_dtstart(&mut self, str: String) -> napi::Result<&Self> { + let rrule_set = self + .rrule_set + .clone() + .set_from_string(&str) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + self.rrule_set = rrule_set; + + Ok(self) + } + + #[napi] + pub fn set_from_string(&mut self, str: String) -> napi::Result<&Self> { + let rrule_set = self + .rrule_set + .clone() + .set_from_string(&str) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + self.rrule_set = rrule_set; + + Ok(self) + } + + #[napi] + pub fn add_rrule(&mut self, rrule: &RRule) -> napi::Result<&Self> { + let dtstart = *self.rrule_set.get_dt_start(); + let rrule = rrule.validate(dtstart)?; + + replace_with_or_abort(&mut self.rrule_set, |self_| self_.rrule(rrule)); + + Ok(self) + } + + #[napi] + pub fn add_exrule(&mut self, rrule: &RRule) -> napi::Result<&Self> { + let dtstart = *self.rrule_set.get_dt_start(); + let rrule = rrule.validate(dtstart)?; + + replace_with_or_abort(&mut self.rrule_set, |self_| self_.exrule(rrule)); + + Ok(self) + } + + #[napi] + pub fn add_exdate(&mut self, datetime: i64) -> napi::Result<&Self> { + let timezone = self.rrule_set.get_dt_start().timezone(); + let datetime = super::DateTime::from(datetime).to_rrule_datetime(&timezone)?; + + replace_with_or_abort(&mut self.rrule_set, |self_| self_.exdate(datetime)); + + Ok(self) + } + + #[napi] + pub fn add_rdate(&mut self, datetime: i64) -> napi::Result<&Self> { + let timezone = self.rrule_set.get_dt_start().timezone(); + let datetime = super::DateTime::from(datetime).to_rrule_datetime(&timezone)?; + + replace_with_or_abort(&mut self.rrule_set, |self_| self_.rdate(datetime.into())); + + Ok(self) + } + + fn is_after(&self, timestamp: i64, after_timestamp: i64, inclusive: Option) -> bool { + let inclusive = inclusive.unwrap_or(false); + + if inclusive && timestamp < after_timestamp { + return false; + } else if !inclusive && timestamp <= after_timestamp { + return false; + } + + true + } + + fn is_before(&self, timestamp: i64, before_timestamp: i64, inclusive: Option) -> bool { + let inclusive = inclusive.unwrap_or(false); + + if inclusive && timestamp > before_timestamp { + return false; + } else if !inclusive && timestamp >= before_timestamp { + return false; + } + + true + } + + #[napi(ts_return_type = "number[]")] + pub fn all(&self, env: Env, limit: Option) -> napi::Result { + let mut arr = env.create_array(0).unwrap(); + let mut left = limit.unwrap_or(-1); + + for date in self.rrule_set.into_iter() { + let datetime: i64 = super::DateTime::from(date).into(); + + arr.insert(datetime).unwrap(); + + left -= 1; + + if left == 0 { + break; + } + } + + Ok(arr) + } + + #[napi(ts_return_type = "number[]")] + pub fn between( + &self, + env: Env, + after_datetime: i64, + before_datetime: i64, + inclusive: Option, + ) -> napi::Result { + let mut arr = env.create_array(0).unwrap(); + let timezone = self.rrule_set.get_dt_start().timezone(); + let after_timestamp = super::DateTime::from(after_datetime) + .to_rrule_datetime(&timezone)? + .timestamp_millis(); + let before_timestamp = super::DateTime::from(before_datetime) + .to_rrule_datetime(&timezone)? + .timestamp_millis(); + + for date in self.rrule_set.into_iter() { + let date_timestamp = date.timestamp_millis(); + let is_after = self.is_after(date_timestamp, after_timestamp, inclusive); + let is_before = self.is_before(date_timestamp, before_timestamp, inclusive); + + if is_after && is_before { + let datetime: i64 = super::DateTime::from(date).into(); + + arr.insert(datetime).unwrap(); + } else if !is_before { + break; + } + } + + Ok(arr) + } + + #[napi] + pub fn to_string(&self) -> napi::Result { + Ok(self.rrule_set.to_string()) + } + + #[napi] + pub fn iter(&self, this: Reference, env: Env) -> napi::Result { + let iter = this.share_with(env, |set| Ok(set.rrule_set.into_iter()))?; + Ok(RRuleSetIter { iter }) + } +} + +#[napi(iterator)] +pub struct RRuleSetIter { + iter: SharedReference>, +} + +#[napi] +impl Generator for RRuleSetIter { + type Yield = i64; + type Next = (); + type Return = (); + + fn next(&mut self, _next: Option) -> Option { + self.iter.next().map(|date| { + let datetime: i64 = super::DateTime::from(date).into(); + + datetime + }) + } +} + +fn to_unvalidated(rrule: &rrule::RRule) -> rrule::RRule { + let by_month = rrule + .get_by_month() + .iter() + .map(|m| chrono::Month::try_from(*m).unwrap()) + .collect::>(); + let mut unvalidated = rrule::RRule::new(rrule.get_freq()) + .interval(rrule.get_interval()) + .week_start(rrule.get_week_start()) + .by_set_pos(rrule.get_by_set_pos().to_vec()) + .by_month(&by_month) + .by_month_day(rrule.get_by_month_day().to_vec()) + .by_year_day(rrule.get_by_year_day().to_vec()) + .by_week_no(rrule.get_by_week_no().to_vec()) + .by_weekday(rrule.get_by_weekday().to_vec()) + .by_hour(rrule.get_by_hour().to_vec()) + .by_minute(rrule.get_by_minute().to_vec()) + .by_second(rrule.get_by_second().to_vec()); + + if let Some(count) = rrule.get_count() { + unvalidated = unvalidated.count(count); + } + + if let Some(until) = rrule.get_until() { + unvalidated = unvalidated.until(*until); + } + + unvalidated +} diff --git a/src/js/weekday.rs b/lib/js/weekday.rs similarity index 100% rename from src/js/weekday.rs rename to lib/js/weekday.rs diff --git a/src/lib.rs b/lib/lib.rs similarity index 100% rename from src/lib.rs rename to lib/lib.rs diff --git a/package-lock.json b/package-lock.json index 15a1ea7..081bcd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "benny": "^3.7.1", "conventional-changelog-conventionalcommits": "^8.0.0", "cpy-cli": "^5.0.0", + "cross-env": "^7.0.3", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-eslint-comments": "^3.2.0", @@ -4444,6 +4445,24 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/package.json b/package.json index 9a3bcba..4a6e7ec 100644 --- a/package.json +++ b/package.json @@ -46,13 +46,14 @@ "@napi-rs/cli": "^2.18.2", "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.0", - "@types/node": "^20.12.8", "@types/luxon": "^3.4.2", + "@types/node": "^20.12.8", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", "conventional-changelog-conventionalcommits": "^8.0.0", "cpy-cli": "^5.0.0", + "cross-env": "^7.0.3", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-eslint-comments": "^3.2.0", @@ -61,8 +62,8 @@ "husky": "^9.0.11", "jest": "^29.5.0", "lint-staged": "^15.2.2", - "mkdirp": "^3.0.1", "luxon": "^3.4.4", + "mkdirp": "^3.0.1", "prettier": "^2.8.3", "rimraf": "^5.0.5", "rrule": "^2.7.2", @@ -80,11 +81,13 @@ }, "scripts": { "artifacts": "napi artifacts", - "prebuild": "rimraf ./dist && mkdirp ./dist", - "postbuild": "cpy ./*.node ./dist && rimraf --glob ./*.node", - "build": "napi build --js dist/index.js --dts dist/index.d.ts --platform --release", + "build:lib": "napi build --js src/lib/index.js --dts src/lib/index.d.ts --platform --release", + "postbuild:lib": "cpy ./*.node ./src/lib && rimraf --glob ./*.node", + "prebuild": "rimraf ./dist && npm run build:lib", + "build": "tsc -p ./tsconfig.build.json", + "postbuild": "cpy ./src/lib/* ./dist/lib --flat", "prepublishOnly": "napi prepublish -t npm", - "test": "jest", + "test": "cross-env TZ=Europe/Moscow jest", "universal": "napi universal", "version": "napi version", "benchmark": "ts-node ./benchmark/index.ts", diff --git a/src/datetime.ts b/src/datetime.ts new file mode 100644 index 0000000..f9ce094 --- /dev/null +++ b/src/datetime.ts @@ -0,0 +1,167 @@ +export interface DateTimeLike { + readonly year: number; + readonly month: number; + readonly day: number; + readonly hour: number; + readonly minute: number; + readonly second: number; +} + +export interface FromObjectOptions { + utc?: boolean; +} + +/** + * Represents a date and time. Either local or UTC. + */ +export class DateTime implements DateTimeLike { + private readonly numeric: number; + + public get year(): number { + return Math.floor(this.numeric / 100000000000); + } + + public get month(): number { + return Math.floor((this.numeric / 1000000000) % 100); + } + + public get day(): number { + return Math.floor((this.numeric / 10000000) % 100); + } + + public get hour(): number { + return Math.floor((this.numeric / 100000) % 100); + } + + public get minute(): number { + return Math.floor((this.numeric / 1000) % 100); + } + + public get second(): number { + return Math.floor((this.numeric / 10) % 100); + } + + public get utc(): boolean { + return this.numeric % 10 == 1; + } + + private constructor(numeric: number) { + this.numeric = numeric; + } + + /** + * Converts DateTime into a plain object. + */ + public toObject(): DateTimeLike { + return { + year: this.year, + month: this.month, + day: this.day, + hour: this.hour, + minute: this.minute, + second: this.second, + }; + } + + /** + * Converts DateTime into ISO 8601 string: + * - `YYYYMMDDTHHMMSSZ` for UTC + * - `YYYYMMDDTHHMMSS` for local + */ + public toString(): string { + const year = this.year.toString().padStart(4, '0'); + const month = this.month.toString().padStart(2, '0'); + const day = this.day.toString().padStart(2, '0'); + const hour = this.hour.toString().padStart(2, '0'); + const minute = this.minute.toString().padStart(2, '0'); + const second = this.second.toString().padStart(2, '0'); + + return `${year}${month}${day}T${hour}${minute}${second}${ + this.utc ? 'Z' : '' + }`; + } + + /** + * Creates a new DateTime object from the given date and time components. + */ + public static create( + year: number, + month: number, + day: number, + hour: number, + minute: number, + second: number, + utc: boolean, + ): DateTime { + const numeric = + year * 100000000000 + + month * 1000000000 + + day * 10000000 + + hour * 100000 + + minute * 1000 + + second * 10 + + (utc ? 1 : 0); + + return new DateTime(numeric); + } + + /** + * Creates a new DateTime object from the given plain object. + */ + public static fromObject( + object: DateTimeLike, + options?: FromObjectOptions, + ): DateTime { + return DateTime.create( + object.year, + object.month, + object.day, + object.hour, + object.minute, + object.second, + !!options?.utc, + ); + } + + /** + * Creates a new DateTime object from provided string representation of a date according to RFC 5545. + */ + public static fromString(str: string): DateTime { + const typeError = new TypeError('Invalid date time string'); + + if (str.length > 16 || str.length < 15) { + throw typeError; + } + + const year = parseInt(str.slice(0, 4)); + const month = parseInt(str.slice(4, 6)); + const day = parseInt(str.slice(6, 8)); + const hour = parseInt(str.slice(9, 11)); + const minute = parseInt(str.slice(11, 13)); + const second = parseInt(str.slice(13, 15)); + const utc = str.endsWith('Z'); + + if ( + isNaN(year) || + isNaN(month) || + isNaN(day) || + isNaN(hour) || + isNaN(minute) || + isNaN(second) + ) { + throw typeError; + } + + return DateTime.create(year, month, day, hour, minute, second, utc); + } + + /** @internal */ + public static fromNumeric(numeric: number): DateTime { + return new DateTime(numeric); + } + + /** @internal */ + public toNumeric(): number { + return this.numeric; + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..5f47de0 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,4 @@ +export * from './rrule-set'; +export * from './rrule'; +export * from './datetime'; +export { Frequency, Weekday, Month, NWeekday } from './lib'; diff --git a/src/js/rrule_datetime.rs b/src/js/rrule_datetime.rs deleted file mode 100644 index 193695d..0000000 --- a/src/js/rrule_datetime.rs +++ /dev/null @@ -1,150 +0,0 @@ -use super::RRuleTimezone; -use chrono::DateTime; -use chrono::Datelike; -use chrono::TimeZone; -use chrono::Timelike; -use napi::bindgen_prelude::*; -use napi_derive::napi; -use std::str::FromStr; - -#[napi(js_name = "RRuleDateTime")] -pub struct RRuleDateTime { - date_time: chrono::DateTime, -} - -#[napi] -impl RRuleDateTime { - #[napi(constructor)] - pub fn new_with_js_date( - date: napi::Either, - timezone: Option, - ) -> napi::Result { - let timestamp = match date { - Either::A(date) => date.value_of(), - Either::B(date) => Ok(date), - }?; - - let mut date_time = rrule::Tz::LOCAL.timestamp_nanos((timestamp * 1_000_000f64) as i64); - if let Some(timezone) = timezone { - let tz: rrule::Tz = RRuleTimezone::from_str(&timezone)?.into(); - - date_time = date_time.with_timezone(&tz); - } - - Ok(RRuleDateTime::new_with_date_time(date_time)) - } - - pub fn new_with_date_time(date_time: DateTime) -> Self { - RRuleDateTime { date_time } - } - - #[napi(getter)] - pub fn timestamp(&self) -> i64 { - self.date_time.timestamp_millis() - } - - #[napi(getter)] - pub fn timezone(&self) -> RRuleTimezone { - RRuleTimezone::new_with_tz(self.date_time.timezone()) - } - - #[napi(getter)] - pub fn day(&self) -> u32 { - self.date_time.day() - } - - #[napi(getter)] - pub fn month(&self) -> u32 { - self.date_time.month() - } - - #[napi(getter)] - pub fn year(&self) -> i32 { - self.date_time.year() - } - - #[napi(getter)] - pub fn hour(&self) -> u32 { - self.date_time.hour() - } - - #[napi(getter)] - pub fn minute(&self) -> u32 { - self.date_time.minute() - } - - #[napi(getter)] - pub fn second(&self) -> u32 { - self.date_time.second() - } - - #[napi(getter)] - pub fn millisecond(&self) -> u32 { - let nanoseconds = self.date_time.nanosecond(); - nanoseconds / 1_000_000 - } - - #[napi(js_name = "toString")] - pub fn to_string(&self) -> String { - self.date_time.to_string() - } - - #[napi(js_name = "toRFC3339")] - pub fn to_rfc3339(&self) -> String { - self.date_time.to_rfc3339() - } - - #[napi(ts_return_type = "Date")] - pub fn to_date(&self, env: Env) -> napi::Result { - env.create_date(self.date_time.timestamp_millis() as f64) - } - - #[napi(ts_return_type = "Date")] - pub fn to_utc_date(&self, env: Env) -> napi::Result { - env.create_date(self.date_time.naive_utc().and_utc().timestamp_millis() as f64) - } - - #[napi( - ts_return_type = "{ day: number, month: number, year: number, hour: number, minute: number, second: number, millisecond: number }" - )] - pub fn to_object(&self, env: Env) -> napi::Result { - let mut obj = env.create_object()?; - - obj.set_named_property("day", env.create_int32(self.day() as i32)?)?; - obj.set_named_property("month", env.create_int32(self.month() as i32)?)?; - obj.set_named_property("year", env.create_int32(self.year() as i32)?)?; - obj.set_named_property("hour", env.create_int32(self.hour() as i32)?)?; - obj.set_named_property("minute", env.create_int32(self.minute() as i32)?)?; - obj.set_named_property("second", env.create_int32(self.second() as i32)?)?; - obj.set_named_property("millisecond", env.create_int32(self.millisecond() as i32)?)?; - - Ok(obj) - } -} - -impl From> for RRuleDateTime { - fn from(date_time: DateTime) -> Self { - RRuleDateTime::new_with_date_time(date_time) - } -} - -impl Into> for RRuleDateTime { - fn into(self) -> DateTime { - self.date_time - } -} - -impl From for RRuleDateTime { - fn from(date: napi::JsDate) -> Self { - RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap() - } -} - -impl From> for RRuleDateTime { - fn from(date: napi::Either<&RRuleDateTime, napi::JsDate>) -> Self { - match date { - Either::A(date) => RRuleDateTime::new_with_date_time(date.date_time), - Either::B(date) => RRuleDateTime::new_with_js_date(napi::Either::A(date), None).unwrap(), - } - } -} diff --git a/src/js/rrule_set.rs b/src/js/rrule_set.rs deleted file mode 100644 index 9b1fe3d..0000000 --- a/src/js/rrule_set.rs +++ /dev/null @@ -1,269 +0,0 @@ -use super::{RRule, RRuleDateTime}; -use chrono::DateTime; -use napi::{ - bindgen_prelude::{Reference, SharedReference}, - iterator::Generator, - Env, -}; -use napi_derive::napi; -use replace_with::replace_with_or_abort; - -#[napi(js_name = "RRuleSet")] -pub struct RRuleSet { - rrule_set: rrule::RRuleSet, -} - -#[napi] -impl RRuleSet { - #[napi(constructor)] - pub fn new(dtstart: napi::Either<&RRuleDateTime, napi::JsDate>) -> napi::Result { - let rrule_set = rrule::RRuleSet::new(RRuleDateTime::from(dtstart).into()); - - Ok(RRuleSet { rrule_set }) - } - - #[napi] - pub fn set_from_string(&mut self, str: String) -> napi::Result<&Self> { - let cloned = self - .rrule_set - .clone() - .set_from_string(&str) - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - *self = RRuleSet { rrule_set: cloned }; - Ok(self) - } - - #[napi(factory, ts_return_type = "RRuleSet")] - pub fn parse(str: String) -> napi::Result { - let rrule_set: rrule::RRuleSet = str - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - - Ok(RRuleSet { rrule_set }) - } - - #[napi] - pub fn to_string(&self) -> napi::Result { - Ok(self.rrule_set.to_string()) - } - - #[napi] - pub fn add_rrule(&mut self, js_rrule: &RRule) -> napi::Result<&Self> { - let dt_start = self.rrule_set.get_dt_start().clone(); - let rrule = js_rrule.validate(dt_start)?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.rrule(rrule)); - - Ok(self) - } - - #[napi] - pub fn add_exrule(&mut self, js_rrule: &RRule) -> napi::Result<&Self> { - let rrule = js_rrule.validate(*self.rrule_set.get_dt_start())?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.exrule(rrule)); - - Ok(self) - } - - #[napi] - pub fn add_exdate( - &mut self, - date_time: napi::Either<&RRuleDateTime, napi::JsDate>, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule_set, |self_| { - self_.exdate(RRuleDateTime::from(date_time).into()) - }); - - Ok(self) - } - - #[napi] - pub fn add_rdate( - &mut self, - date_time: napi::Either<&RRuleDateTime, napi::JsDate>, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule_set, |self_| { - self_.rdate(RRuleDateTime::from(date_time).into()) - }); - - Ok(self) - } - - #[napi(getter)] - pub fn dtstart(&self) -> RRuleDateTime { - RRuleDateTime::new_with_date_time(self.rrule_set.get_dt_start().clone()) - } - - #[napi] - pub fn get_rrules(&self) -> Vec { - return self - .rrule_set - .get_rrule() - .iter() - .map(|rrule| RRule::from(to_unvalidated(rrule))) - .collect(); - } - - #[napi] - pub fn get_exrules(&self) -> Vec { - return self - .rrule_set - .get_exrule() - .iter() - .map(|rrule| RRule::from(to_unvalidated(rrule))) - .collect(); - } - - #[napi] - pub fn get_exdates(&self) -> Vec { - return self - .rrule_set - .get_exdate() - .iter() - .map(|date| RRuleDateTime::new_with_date_time(date.clone())) - .collect(); - } - - #[napi] - pub fn get_rdates(&self) -> Vec { - return self - .rrule_set - .get_rdate() - .iter() - .map(|date| RRuleDateTime::new_with_date_time(date.clone())) - .collect(); - } - - fn is_after( - &self, - timestamp: DateTime, - after_timestamp: DateTime, - inclusive: Option, - ) -> bool { - let inclusive = inclusive.unwrap_or(false); - - if inclusive && timestamp < after_timestamp { - return false; - } else if !inclusive && timestamp <= after_timestamp { - return false; - } - - true - } - - fn is_before( - &self, - timestamp: DateTime, - before_timestamp: DateTime, - inclusive: Option, - ) -> bool { - let inclusive = inclusive.unwrap_or(false); - - if inclusive && timestamp > before_timestamp { - return false; - } else if !inclusive && timestamp >= before_timestamp { - return false; - } - - true - } - - #[napi] - pub fn all(&self, limit: Option) -> Vec { - let iter = self.rrule_set.into_iter(); - if let Some(limit) = limit { - return iter - .take(limit as usize) - .map(|date| RRuleDateTime::new_with_date_time(date)) - .collect(); - } else { - return iter - .map(|date| RRuleDateTime::new_with_date_time(date)) - .collect(); - } - } - - #[napi] - pub fn between( - &self, - after: napi::Either<&RRuleDateTime, napi::JsDate>, - before: napi::Either<&RRuleDateTime, napi::JsDate>, - inclusive: Option, - ) -> napi::Result> { - let _after = RRuleDateTime::from(after).into(); - let _before = RRuleDateTime::from(before).into(); - return Ok( - self - .rrule_set - .into_iter() - .take_while(|date| { - let is_before = self.is_before(*date, _before, inclusive); - - is_before - }) - .filter(|date| { - let is_after = self.is_after(*date, _after, inclusive); - - is_after - }) - .map(|date| RRuleDateTime::new_with_date_time(date)) - .collect::>(), - ); - } - - #[napi] - pub fn occurrences(&self, this: Reference, env: Env) -> napi::Result { - let iter = this.share_with(env, |set| Ok(set.rrule_set.into_iter()))?; - Ok(Occurrences { iter }) - } -} - -#[napi(iterator)] -pub struct Occurrences { - iter: SharedReference>, -} - -#[napi] -impl Generator for Occurrences { - type Yield = RRuleDateTime; - type Next = (); - type Return = (); - - fn next(&mut self, _next: Option) -> Option { - self - .iter - .next() - .map(|date| RRuleDateTime::new_with_date_time(date)) - } -} - -fn to_unvalidated(rrule: &rrule::RRule) -> rrule::RRule { - let by_month = rrule - .get_by_month() - .iter() - .map(|m| chrono::Month::try_from(*m).unwrap()) - .collect::>(); - let mut unvalidated = rrule::RRule::new(rrule.get_freq()) - .interval(rrule.get_interval()) - .week_start(rrule.get_week_start()) - .by_set_pos(rrule.get_by_set_pos().to_vec()) - .by_month(&by_month) - .by_month_day(rrule.get_by_month_day().to_vec()) - .by_year_day(rrule.get_by_year_day().to_vec()) - .by_week_no(rrule.get_by_week_no().to_vec()) - .by_weekday(rrule.get_by_weekday().to_vec()) - .by_hour(rrule.get_by_hour().to_vec()) - .by_minute(rrule.get_by_minute().to_vec()) - .by_second(rrule.get_by_second().to_vec()); - - if let Some(count) = rrule.get_count() { - unvalidated = unvalidated.count(count); - } - - if let Some(until) = rrule.get_until() { - unvalidated = unvalidated.until(*until); - } - - unvalidated -} diff --git a/src/js/rrule_timezone.rs b/src/js/rrule_timezone.rs deleted file mode 100644 index 230b00a..0000000 --- a/src/js/rrule_timezone.rs +++ /dev/null @@ -1,52 +0,0 @@ -use napi_derive::napi; -use std::str::FromStr; - -#[derive(Debug)] -#[napi(js_name = "RRuleTimezone")] -pub struct RRuleTimezone { - tz: rrule::Tz, -} - -#[napi] -impl RRuleTimezone { - #[napi(constructor)] - pub fn new(tz: String) -> napi::Result { - Ok(tz.parse()?) - } - - pub fn new_with_tz(tz: rrule::Tz) -> Self { - RRuleTimezone { tz } - } - - /** - * The name of the timezone. If the timezone is local, it will return "Local". - */ - #[napi(getter)] - pub fn name(&self) -> String { - self.tz.name().to_string() - } - - #[napi(getter)] - pub fn is_local(&self) -> bool { - self.tz.is_local() - } -} - -impl Into for RRuleTimezone { - fn into(self) -> rrule::Tz { - self.tz - } -} - -impl FromStr for RRuleTimezone { - type Err = napi::Error; - - fn from_str(str: &str) -> Result { - str - .parse::() - .map(|tz| RRuleTimezone { - tz: rrule::Tz::Tz(tz), - }) - .map_err(|err| napi::Error::new(napi::Status::GenericFailure, err.to_string())) - } -} diff --git a/src/lib/index.d.ts b/src/lib/index.d.ts new file mode 100644 index 0000000..ff050ba --- /dev/null +++ b/src/lib/index.d.ts @@ -0,0 +1,104 @@ +/* tslint:disable */ +/* eslint-disable */ + +/* auto-generated by NAPI-RS */ + +export const enum Frequency { + Yearly = 0, + Monthly = 1, + Weekly = 2, + Daily = 3, + Hourly = 4, + Minutely = 5, + Secondly = 6 +} +export const enum Month { + January = 0, + February = 1, + March = 2, + April = 3, + May = 4, + June = 5, + July = 6, + August = 7, + September = 8, + October = 9, + November = 10, + December = 11 +} +export interface NWeekday { + /** + * If set, this represents the nth occurrence of the weekday. + * Otherwise it represents every occurrence of the weekday. + * + * A negative value represents nth occurrence from the end. + */ + n?: number + weekday: Weekday +} +export const enum Weekday { + Monday = 0, + Tuesday = 1, + Wednesday = 2, + Thursday = 3, + Friday = 4, + Saturday = 5, + Sunday = 6 +} +export class RRule { + constructor(frequency: Frequency) + static create(frequency?: Frequency | undefined | null, interval?: number | undefined | null, count?: number | undefined | null, byWeekday?: (readonly (NWeekday | Weekday)[]) | undefined | null, byHour?: (readonly number[]) | undefined | null, byMinute?: (readonly number[]) | undefined | null, bySecond?: (readonly number[]) | undefined | null, byMonthday?: (readonly number[]) | undefined | null, bySetpos?: (readonly number[]) | undefined | null, byMonth?: (readonly number[]) | undefined | null, byWeekno?: (readonly number[]) | undefined | null, byYearday?: (readonly number[]) | undefined | null, weekstart?: Weekday | undefined | null, until?: number | undefined | null): RRule + static parse(str: string): RRule + get frequency(): Frequency + get interval(): number + get count(): number | null + get byWeekday(): NWeekday[] + get byHour(): Array + get byMinute(): Array + get bySecond(): Array + get byMonthday(): Array + get bySetpos(): Array + get byMonth(): Month[] + get byWeekno(): Array + get byYearday(): Array + get weekstart(): Weekday + get until(): number | null + toString(): string + setInterval(interval: number): this + setCount(count: number): this + setByWeekday(weekdays: readonly (NWeekday | Weekday)[]): this + setByHour(hours: readonly number[]): this + setByMinute(minutes: readonly number[]): this + setBySecond(seconds: readonly number[]): this + setByMonthday(days: readonly number[]): this + setBySetpos(poses: readonly number[]): this + setByMonth(months: readonly Month[]): this + setByWeekno(weekNumbers: readonly number[]): this + setByYearday(days: readonly number[]): this + setWeekstart(day: Weekday): this + setUntil(datetime: number): this +} +export class RRuleSet { + constructor(dtstart: number, tzid: string) + static create(dtstart: number, tzid: string, rrules?: (readonly RRule[]) | undefined | null, exrules?: (readonly RRule[]) | undefined | null, exdates?: (readonly number[]) | undefined | null, rdates?: (readonly number[]) | undefined | null): RRuleSet + get tzid(): string + get dtstart(): number + get rrules(): RRule[] + get exrules(): RRule[] + get exdates(): number[] + get rdates(): number[] + static parse(str: string): RRuleSet + setDtstart(str: string): this + setFromString(str: string): this + addRrule(rrule: RRule): this + addExrule(rrule: RRule): this + addExdate(datetime: number): this + addRdate(datetime: number): this + all(limit?: number | undefined | null): number[] + between(afterDatetime: number, beforeDatetime: number, inclusive?: boolean | undefined | null): number[] + toString(): string + iter(): RRuleSetIter +} +export class RRuleSetIter { + [Symbol.iterator](): Iterator +} diff --git a/src/lib/index.js b/src/lib/index.js new file mode 100644 index 0000000..a45682d --- /dev/null +++ b/src/lib/index.js @@ -0,0 +1,320 @@ +/* tslint:disable */ +/* eslint-disable */ +/* prettier-ignore */ + +/* auto-generated by NAPI-RS */ + +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') + +const { platform, arch } = process + +let nativeBinding = null +let localFileExisted = false +let loadError = null + +function isMusl() { + // For Node 10 + if (!process.report || typeof process.report.getReport !== 'function') { + try { + const lddPath = require('child_process').execSync('which ldd').toString().trim() + return readFileSync(lddPath, 'utf8').includes('musl') + } catch (e) { + return true + } + } else { + const { glibcVersionRuntime } = process.report.getReport().header + return !glibcVersionRuntime + } +} + +switch (platform) { + case 'android': + switch (arch) { + case 'arm64': + localFileExisted = existsSync(join(__dirname, 'rrule-rust.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.android-arm64.node') + } else { + nativeBinding = require('@rrule-rust/lib-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, 'rrule-rust.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.android-arm-eabi.node') + } else { + nativeBinding = require('@rrule-rust/lib-android-arm-eabi') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Android ${arch}`) + } + break + case 'win32': + switch (arch) { + case 'x64': + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.win32-x64-msvc.node') + } else { + nativeBinding = require('@rrule-rust/lib-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.win32-ia32-msvc.node') + } else { + nativeBinding = require('@rrule-rust/lib-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.win32-arm64-msvc.node') + } else { + nativeBinding = require('@rrule-rust/lib-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + localFileExisted = existsSync(join(__dirname, 'rrule-rust.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.darwin-universal.node') + } else { + nativeBinding = require('@rrule-rust/lib-darwin-universal') + } + break + } catch {} + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, 'rrule-rust.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.darwin-x64.node') + } else { + nativeBinding = require('@rrule-rust/lib-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.darwin-arm64.node') + } else { + nativeBinding = require('@rrule-rust/lib-darwin-arm64') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on macOS: ${arch}`) + } + break + case 'freebsd': + if (arch !== 'x64') { + throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) + } + localFileExisted = existsSync(join(__dirname, 'rrule-rust.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.freebsd-x64.node') + } else { + nativeBinding = require('@rrule-rust/lib-freebsd-x64') + } + } catch (e) { + loadError = e + } + break + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-x64-musl.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-x64-gnu.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-arm64-musl.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-arm64-gnu.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-arm-musleabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-arm-musleabihf.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-arm-musleabihf') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + } + break + case 'riscv64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-riscv64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-riscv64-musl.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-riscv64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-riscv64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-riscv64-gnu.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-riscv64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 's390x': + localFileExisted = existsSync( + join(__dirname, 'rrule-rust.linux-s390x-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./rrule-rust.linux-s390x-gnu.node') + } else { + nativeBinding = require('@rrule-rust/lib-linux-s390x-gnu') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Linux: ${arch}`) + } + break + default: + throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) +} + +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(`Failed to load native binding`) +} + +const { Frequency, Month, RRule, RRuleSet, RRuleSetIter, Weekday } = nativeBinding + +module.exports.Frequency = Frequency +module.exports.Month = Month +module.exports.RRule = RRule +module.exports.RRuleSet = RRuleSet +module.exports.RRuleSetIter = RRuleSetIter +module.exports.Weekday = Weekday diff --git a/src/rrule-set.ts b/src/rrule-set.ts new file mode 100644 index 0000000..9d8ece9 --- /dev/null +++ b/src/rrule-set.ts @@ -0,0 +1,251 @@ +import { RRule } from './rrule'; +import { RRuleSet as Rust } from './lib'; +import { DateTime } from './datetime'; + +export interface RRuleSetLike { + readonly dtstart: DateTime; + readonly tzid: string; + readonly rrules: readonly RRule[]; + readonly exrules: readonly RRule[]; + readonly exdates: readonly DateTime[]; + readonly rdates: readonly DateTime[]; +} + +export class RRuleSet implements Iterable { + private rust?: Rust; + + public readonly dtstart: DateTime; + public readonly tzid: string; + public readonly rrules: readonly RRule[]; + public readonly exrules: readonly RRule[]; + public readonly exdates: readonly DateTime[]; + public readonly rdates: readonly DateTime[]; + + constructor(dtstart: DateTime, tzid: string); + constructor(options: Partial); + constructor(setOrDtstart?: DateTime | Partial, tzid?: string) { + if (!(setOrDtstart instanceof DateTime)) { + if (setOrDtstart?.dtstart) { + this.dtstart = setOrDtstart?.dtstart; + } else { + const date = new Date(); + + this.dtstart = DateTime.create( + date.getUTCFullYear(), + date.getUTCMonth() + 1, + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + true, + ); + } + + this.tzid = setOrDtstart?.tzid ?? 'UTC'; + + this.rrules = setOrDtstart?.rrules ?? []; + this.exrules = setOrDtstart?.exrules ?? []; + this.exdates = setOrDtstart?.exdates ?? []; + this.rdates = setOrDtstart?.rdates ?? []; + } else if (setOrDtstart instanceof DateTime && typeof tzid === 'string') { + this.dtstart = setOrDtstart; + this.tzid = tzid; + + this.rrules = []; + this.exrules = []; + this.exdates = []; + this.rdates = []; + } else { + throw new TypeError('Invalid arguments'); + } + } + + /** + * Parses a string into an RRuleSet. + */ + public static parse(str: string) { + const rust = Rust.parse(str); + + return this.fromRust(rust); + } + + /** + * @internal + */ + public static fromRust(rust: Rust): RRuleSet { + const set = new RRuleSet({ + dtstart: DateTime.fromNumeric(rust.dtstart), + tzid: rust.tzid, + rrules: rust.rrules.map((rrule) => RRule.fromRust(rrule)), + exrules: rust.exrules.map((rrule) => RRule.fromRust(rrule)), + exdates: rust.exdates.map((datetime) => DateTime.fromNumeric(datetime)), + rdates: rust.rdates.map((datetime) => DateTime.fromNumeric(datetime)), + }); + + set.rust = rust; + + return set; + } + + public setDtstart(dtstart: DateTime): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + dtstart: dtstart, + }); + } + + public setTzid(tzid: string): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + tzid: tzid, + }); + } + + public addRrule(rrule: RRule): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + rrules: [...this.rrules, rrule], + }); + } + + public setRrules(rrules: readonly RRule[]): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + rrules: rrules, + }); + } + + public addExrule(rrule: RRule): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + exrules: [...this.exrules, rrule], + }); + } + + public setExrules(rrules: readonly RRule[]): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + exrules: rrules, + }); + } + + public addExdate(datetime: DateTime): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + exdates: [...this.exdates, datetime], + }); + } + + public setExdates(datetimes: readonly DateTime[]): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + exdates: datetimes, + }); + } + + public addRdate(datetime: DateTime): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + rdates: [...this.rdates, datetime], + }); + } + + public setRdates(datetimes: readonly DateTime[]): RRuleSet { + return new RRuleSet({ + ...this.toObject(), + rdates: datetimes, + }); + } + + /** + * Returns all the occurrences of the rrule. + * + * @param limit - The maximum number of occurrences to return. + */ + public all(limit?: number): DateTime[] { + return this.toRust() + .all(limit) + .map((datetime) => DateTime.fromNumeric(datetime)); + } + + /** + * Returns all the occurrences of the rrule between after and before. + * + * @param after - The lower bound date. + * @param before - The upper bound date. + * @param inclusive - Whether to include after and before in the list of occurrences. + */ + public between( + after: DateTime, + before: DateTime, + inclusive?: boolean, + ): DateTime[] { + return this.toRust() + .between(after.toNumeric(), before.toNumeric(), inclusive) + .map((datetime) => DateTime.fromNumeric(datetime)); + } + + /** + * Sets the RRuleSet from a string. + * + * @param str - The string to parse. + */ + public setFromString(str: string): RRuleSet { + return RRuleSet.fromRust(this.toRust().setFromString(str)); + } + + /** + * @internal + */ + public toRust(): Rust { + if (!this.rust) { + this.rust = Rust.create( + this.dtstart.toNumeric(), + this.tzid, + this.rrules.map((rrule) => rrule.toRust()), + this.exrules.map((rrule) => rrule.toRust()), + this.exdates.map((datetime) => datetime.toNumeric()), + this.rdates.map((datetime) => datetime.toNumeric()), + ); + } + + return this.rust; + } + + public toString(): string { + return this.toRust().toString(); + } + + /** + * Converts the RRuleSet to a plain object. + */ + public toObject(): RRuleSetLike { + return { + dtstart: this.dtstart, + tzid: this.tzid, + rrules: this.rrules, + exrules: this.exrules, + exdates: this.exdates, + rdates: this.rdates, + }; + } + + public [Symbol.iterator]() { + const iter = this.toRust().iter()[Symbol.iterator](); + + return { + next: () => { + const result = iter.next(); + + if (result.done) { + return result; + } + + return { + done: false, + value: DateTime.fromNumeric(result.value), + }; + }, + }; + } +} diff --git a/src/rrule.ts b/src/rrule.ts new file mode 100644 index 0000000..278129b --- /dev/null +++ b/src/rrule.ts @@ -0,0 +1,213 @@ +import { DateTime } from './datetime'; +import { RRule as Rust, Frequency, NWeekday, Month, Weekday } from './lib'; + +export interface RRuleLike { + readonly frequency: Frequency; + readonly interval: number; + readonly count?: number; + readonly until?: DateTime; + readonly byWeekday: readonly (NWeekday | Weekday)[]; + readonly byHour: readonly number[]; + readonly byMinute: readonly number[]; + readonly bySecond: readonly number[]; + readonly byMonthday: readonly number[]; + readonly bySetpos: readonly number[]; + readonly byMonth: readonly Month[]; + readonly byWeekno: readonly number[]; + readonly byYearday: readonly number[]; + readonly weekstart: Weekday; +} + +export class RRule { + /** @internal */ + private rust?: Rust; + + public readonly frequency: Frequency; + public readonly interval: number; + public readonly until?: DateTime; + public readonly count?: number; + public readonly byWeekday: readonly (NWeekday | Weekday)[]; + public readonly byHour: readonly number[]; + public readonly byMinute: readonly number[]; + public readonly bySecond: readonly number[]; + public readonly byMonthday: readonly number[]; + public readonly bySetpos: readonly number[]; + public readonly byMonth: readonly Month[]; + public readonly byWeekno: readonly number[]; + public readonly byYearday: readonly number[]; + public readonly weekstart: Weekday; + + constructor(frequency: Frequency); + constructor(rrule?: Partial); + constructor(rruleOrFrequency: number | Partial = {}) { + if (typeof rruleOrFrequency === 'object' && rruleOrFrequency !== null) { + this.frequency = rruleOrFrequency.frequency ?? Frequency.Daily; + this.interval = rruleOrFrequency.interval ?? 1; + this.until = rruleOrFrequency.until; + this.count = rruleOrFrequency.count; + this.byWeekday = rruleOrFrequency.byWeekday ?? []; + this.byHour = rruleOrFrequency.byHour ?? []; + this.byMinute = rruleOrFrequency.byMinute ?? []; + this.bySecond = rruleOrFrequency.bySecond ?? []; + this.byMonthday = rruleOrFrequency.byMonthday ?? []; + this.bySetpos = rruleOrFrequency.bySetpos ?? []; + this.byMonth = rruleOrFrequency.byMonth ?? []; + this.byWeekno = rruleOrFrequency.byWeekno ?? []; + this.byYearday = rruleOrFrequency.byYearday ?? []; + this.weekstart = rruleOrFrequency.weekstart ?? Weekday.Monday; + } else { + this.frequency = rruleOrFrequency; + this.interval = 1; + this.byWeekday = []; + this.byHour = []; + this.byMinute = []; + this.bySecond = []; + this.byMonthday = []; + this.bySetpos = []; + this.byMonth = []; + this.byWeekno = []; + this.byYearday = []; + this.weekstart = Weekday.Monday; + } + } + + /** + * Parses a string into an RRule. + */ + public static parse(str: string): RRule { + const rust = Rust.parse(str); + + return this.fromRust(rust); + } + + /** + * @internal + */ + public static fromRust(rust: Rust) { + const rrule = new this({ + frequency: rust.frequency, + interval: rust.interval, + until: rust.until === null ? undefined : DateTime.fromNumeric(rust.until), + count: rust.count === null ? undefined : rust.count, + byWeekday: rust.byWeekday, + byHour: rust.byHour, + byMinute: rust.byMinute, + bySecond: rust.bySecond, + byMonthday: rust.byMonthday, + bySetpos: rust.bySetpos, + byMonth: rust.byMonth, + byWeekno: rust.byWeekno, + byYearday: rust.byYearday, + weekstart: rust.weekstart, + }); + + rrule.rust = rust; + + return rrule; + } + + public setFrequency(frequency: Frequency): RRule { + return new RRule({ ...this.toObject(), frequency }); + } + + public setInterval(interval: number): RRule { + return new RRule({ ...this.toObject(), interval }); + } + + public setCount(count: number): RRule { + return new RRule({ ...this.toObject(), count }); + } + + public setByWeekday(weekdays: readonly (NWeekday | Weekday)[]): RRule { + return new RRule({ ...this.toObject(), byWeekday: weekdays }); + } + + public setByHour(hours: readonly number[]): RRule { + return new RRule({ ...this.toObject(), byHour: hours }); + } + + public setByMinute(minutes: readonly number[]): RRule { + return new RRule({ ...this.toObject(), byMinute: minutes }); + } + + public setBySecond(seconds: readonly number[]): RRule { + return new RRule({ ...this.toObject(), bySecond: seconds }); + } + + public setByMonthday(days: readonly number[]): RRule { + return new RRule({ ...this.toObject(), byMonthday: days }); + } + + public setBySetpos(poses: readonly number[]): RRule { + return new RRule({ ...this.toObject(), bySetpos: poses }); + } + + public setByMonth(months: readonly Month[]): RRule { + return new RRule({ ...this.toObject(), byMonth: months }); + } + + public setByWeekno(weekNumbers: readonly number[]): RRule { + return new RRule({ ...this.toObject(), byWeekno: weekNumbers }); + } + + public setByYearday(days: readonly number[]): RRule { + return new RRule({ ...this.toObject(), byYearday: days }); + } + + public setWeekstart(day: Weekday): RRule { + return new RRule({ ...this.toObject(), weekstart: day }); + } + + public setUntil(datetime: DateTime): RRule { + return new RRule({ ...this.toObject(), until: datetime }); + } + + public toString(): string { + return this.toRust().toString(); + } + + /** + * @internal + */ + public toRust(): Rust { + if (!this.rust) { + this.rust = Rust.create( + this.frequency, + this.interval, + this.count, + this.byWeekday, + this.byHour, + this.byMinute, + this.bySecond, + this.byMonthday, + this.bySetpos, + this.byMonth, + this.byWeekno, + this.byYearday, + this.weekstart, + this.until?.toNumeric(), + ); + } + + return this.rust; + } + + public toObject(): RRuleLike { + return { + frequency: this.frequency, + interval: this.interval, + count: this.count, + byWeekday: this.byWeekday, + byHour: this.byHour, + byMinute: this.byMinute, + bySecond: this.bySecond, + byMonthday: this.byMonthday, + bySetpos: this.bySetpos, + byMonth: this.byMonth, + byWeekno: this.byWeekno, + byYearday: this.byYearday, + weekstart: this.weekstart, + until: this.until, + }; + } +} diff --git a/tests/daily.spec.ts b/tests/daily.spec.ts index 08cba73..87ed50a 100644 --- a/tests/daily.spec.ts +++ b/tests/daily.spec.ts @@ -1,178 +1,215 @@ -import { - RRule, - RRuleDateTime, - RRuleSet, - Frequency, - Month, - Weekday, -} from '../dist'; +import { RRule, RRuleSet, Frequency, Month, Weekday, DateTime } from '../src'; test('Daily for 10 occurrences', () => { const rrule = new RRule(Frequency.Daily).setCount(10); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); const asString = set.toString(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 873205200000, 873291600000, 873378000000, 873464400000, 873550800000, - 873637200000, 873723600000, 873810000000, 873896400000, 873982800000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 3, 9, 0, 0, false), + DateTime.create(1997, 9, 4, 9, 0, 0, false), + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 7, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 10, 9, 0, 0, false), + DateTime.create(1997, 9, 11, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Daily for 10 occurrences between 873550800000 and 873723600000 inclusively', () => { const rrule = new RRule(Frequency.Daily).setCount(10); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); - const dates = set - .between( - new RRuleDateTime(873550800000), - new RRuleDateTime(873723600000), - true, - ) - .map((d) => d.timestamp); + const dates = set.between( + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + true, + ); const asString = set.toString(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); - expect(dates).toEqual([873550800000, 873637200000, 873723600000]); + expect(dates).toEqual([ + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 7, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + ]); }); test('Daily for 10 occurrences between 873550800000 and 873723600000 exclusively', () => { const rrule = new RRule(Frequency.Daily).setCount(10); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); - const dates = set - .between( - new RRuleDateTime(873550800000), - new RRuleDateTime(873723600000), - false, - ) - .map((d) => d.timestamp); + const dates = set.between( + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + false, + ); const asString = set.toString(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); - expect(dates).toEqual([873637200000]); + expect(dates).toEqual([DateTime.create(1997, 9, 7, 9, 0, 0, false)]); }); -test('Daily until September 7, 1997', () => { +test('Daily until September 6, 1997', () => { const rrule = new RRule(Frequency.Daily).setUntil( - new RRuleDateTime(873590400000, 'UTC'), + DateTime.create(1997, 9, 6, 9, 0, 0, false), ); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=19970907T000000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=19970906T130000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 873205200000, 873291600000, 873378000000, 873464400000, 873550800000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 3, 9, 0, 0, false), + DateTime.create(1997, 9, 4, 9, 0, 0, false), + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 9, 6, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every other day', () => { const rrule = new RRule(Frequency.Daily).setCount(6).setInterval(2); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); const asString = set.toString(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=6;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 873205200000, 873378000000, 873550800000, 873723600000, 873896400000, - 874069200000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 4, 9, 0, 0, false), + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + DateTime.create(1997, 9, 10, 9, 0, 0, false), + DateTime.create(1997, 9, 12, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every 10 days, 5 occurrences', () => { const rrule = new RRule(Frequency.Daily).setCount(5).setInterval(10); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); const asString = set.toString(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=5;INTERVAL=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 873205200000, 874069200000, 874933200000, 875797200000, 876661200000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 12, 9, 0, 0, false), + DateTime.create(1997, 9, 22, 9, 0, 0, false), + DateTime.create(1997, 10, 2, 9, 0, 0, false), + DateTime.create(1997, 10, 12, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every Monday in January, for 3 years', () => { const rrule = new RRule(Frequency.Daily) .setByMonth([Month.January]) .setByWeekday([Weekday.Monday]) - .setUntil(new RRuleDateTime(949327200000, 'UTC')); + .setUntil(DateTime.create(2000, 1, 31, 14, 0, 0, false)); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=20000131T190000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); expect(dates).toEqual([ - 884008800000, 884613600000, 885218400000, 885823200000, 915458400000, - 916063200000, 916668000000, 917272800000, 946908000000, 947512800000, - 948117600000, 948722400000, 949327200000, + DateTime.create(1998, 1, 5, 9, 0, 0, false), + DateTime.create(1998, 1, 12, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 1, 26, 9, 0, 0, false), + DateTime.create(1999, 1, 4, 9, 0, 0, false), + DateTime.create(1999, 1, 11, 9, 0, 0, false), + DateTime.create(1999, 1, 18, 9, 0, 0, false), + DateTime.create(1999, 1, 25, 9, 0, 0, false), + DateTime.create(2000, 1, 3, 9, 0, 0, false), + DateTime.create(2000, 1, 10, 9, 0, 0, false), + DateTime.create(2000, 1, 17, 9, 0, 0, false), + DateTime.create(2000, 1, 24, 9, 0, 0, false), + DateTime.create(2000, 1, 31, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every Monday in January, for 3 years except Jan 31 2000', () => { const rrule = new RRule(Frequency.Daily) .setByMonth([Month.January]) .setByWeekday([Weekday.Monday]) - .setUntil(new RRuleDateTime(949327200000, 'UTC')); - const set = new RRuleSet(new RRuleDateTime(873205200000, 'US/Eastern')) + .setUntil(DateTime.create(2000, 1, 31, 14, 0, 0, false)); + + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ) .addRrule(rrule) - .addExdate(new RRuleDateTime(949327200000)); + .addExdate(DateTime.create(2000, 1, 31, 9, 0, 0, false)); + + const dates = set.all(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); expect(dates).toEqual([ - 884008800000, 884613600000, 885218400000, 885823200000, 915458400000, - 916063200000, 916668000000, 917272800000, 946908000000, 947512800000, - 948117600000, 948722400000, + DateTime.create(1998, 1, 5, 9, 0, 0, false), + DateTime.create(1998, 1, 12, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 1, 26, 9, 0, 0, false), + DateTime.create(1999, 1, 4, 9, 0, 0, false), + DateTime.create(1999, 1, 11, 9, 0, 0, false), + DateTime.create(1999, 1, 18, 9, 0, 0, false), + DateTime.create(1999, 1, 25, 9, 0, 0, false), + DateTime.create(2000, 1, 3, 9, 0, 0, false), + DateTime.create(2000, 1, 10, 9, 0, 0, false), + DateTime.create(2000, 1, 17, 9, 0, 0, false), + DateTime.create(2000, 1, 24, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); - expect(set.getRrules().map((r) => r.toString())).toEqual([ - 'FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + expect(set.rrules.map((rrule) => rrule.toString())).toEqual([ + 'FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', ]); - expect(set.getExrules().map((r) => r.toString())).toEqual([]); - expect(set.getExdates().map((d) => d.timestamp)).toEqual([949327200000]); + expect(set.exrules).toEqual([]); + expect([...set]).toEqual(dates); }); diff --git a/tests/datetime.spec.ts b/tests/datetime.spec.ts index 82085ec..74ad4cd 100644 --- a/tests/datetime.spec.ts +++ b/tests/datetime.spec.ts @@ -1,46 +1,263 @@ -import { RRuleDateTime } from '../dist'; -import { DateTime } from 'luxon'; - -test.each([new Date(873205200000), 873205200000])( - 'Can create an RRuleDateTime from a %s', - (input) => { - const rruleDateTime = new RRuleDateTime(input, 'US/Eastern'); - - expect(rruleDateTime.toDate()).toEqual(new Date(873205200000)); - expect(rruleDateTime.toString()).toBe('1997-09-02 09:00:00 EDT'); - expect(rruleDateTime.toRFC3339()).toBe('1997-09-02T09:00:00-04:00'); - expect(rruleDateTime.timestamp).toBe(873205200000); - expect(rruleDateTime.timezone.isLocal).toBe(false); - expect(rruleDateTime.timezone.name).toBe('US/Eastern'); - expect(rruleDateTime.year).toBe(1997); - expect(rruleDateTime.month).toBe(9); - expect(rruleDateTime.day).toBe(2); - expect(rruleDateTime.hour).toBe(9); - expect(rruleDateTime.minute).toBe(0); - expect(rruleDateTime.second).toBe(0); - expect(rruleDateTime.millisecond).toBe(0); - }, -); - -it('Can create a local RRuleDateTime', () => { - const rruleDateTime = new RRuleDateTime(873205200000); - const props = []; - for (const prop in rruleDateTime) { - props.push(prop); - } - - expect(rruleDateTime.timestamp).toBe(873205200000); - expect(rruleDateTime.timezone.isLocal).toBe(true); - expect(rruleDateTime.timezone.name).toBe('Local'); -}); +import { DateTime } from '../src'; +import * as luxon from 'luxon'; + +describe(DateTime, () => { + describe('create', () => { + test.each([ + { + year: 3025, + month: 9, + day: 28, + hour: 0, + minute: 0, + second: 0, + utc: false, + }, + { + year: 2005, + month: 9, + day: 4, + hour: 9, + minute: 1, + second: 22, + utc: true, + }, + ])('should create object from %j', (input) => { + const datetime = DateTime.create( + input.year, + input.month, + input.day, + input.hour, + input.minute, + input.second, + input.utc, + ); + + expect(datetime.year).toBe(input.year); + expect(datetime.month).toBe(input.month); + expect(datetime.day).toBe(input.day); + expect(datetime.hour).toBe(input.hour); + expect(datetime.minute).toBe(input.minute); + expect(datetime.second).toBe(input.second); + expect(datetime.utc).toBe(input.utc); + }); + }); + + describe('fromObject', () => { + test.each([ + { + year: 1997, + month: 9, + day: 7, + hour: 4, + minute: 0, + second: 0, + utc: undefined, + }, + { + year: 1997, + month: 9, + day: 3, + hour: 9, + minute: 0, + second: 0, + utc: false, + }, + { + year: 2005, + month: 9, + day: 4, + hour: 9, + minute: 1, + second: 22, + utc: true, + }, + ])('should create datetime from %j', (input) => { + const datetime = DateTime.fromObject(input, { utc: input.utc }); + + expect(datetime.year).toBe(input.year); + expect(datetime.month).toBe(input.month); + expect(datetime.day).toBe(input.day); + expect(datetime.hour).toBe(input.hour); + expect(datetime.minute).toBe(input.minute); + expect(datetime.second).toBe(input.second); + expect(datetime.utc).toBe(!!input.utc); + }); + }); + + describe('toObject', () => { + test.each([ + { + year: 1997, + month: 9, + day: 3, + hour: 9, + minute: 0, + second: 0, + utc: false, + }, + { + year: 2005, + month: 9, + day: 4, + hour: 9, + minute: 1, + second: 22, + utc: true, + }, + ])('should convert %j to plain object', (input) => { + const datetime = DateTime.create( + input.year, + input.month, + input.day, + input.hour, + input.minute, + input.second, + input.utc, + ); + const object = datetime.toObject(); + + expect(object).toEqual({ + year: input.year, + month: input.month, + day: input.day, + hour: input.hour, + minute: input.minute, + second: input.second, + }); + }); + + test("should be be compatible with Luxon's DateTime.fromObject", () => { + const datetime = DateTime.create(1997, 9, 3, 9, 4, 7, false); + const object = datetime.toObject(); + + const luxonDateTime = luxon.DateTime.fromObject(object); -it('Can create a Luxon DateTime from an RRuleDateTime', () => { - const timestamp = 873205200000; - const rruleDateTime = new RRuleDateTime(timestamp, 'US/Eastern'); - const luxonDateTime = DateTime.fromObject(rruleDateTime.toObject(), { - zone: rruleDateTime.timezone.name, + expect(luxonDateTime.year).toBe(object.year); + expect(luxonDateTime.month).toBe(object.month); + expect(luxonDateTime.day).toBe(object.day); + expect(luxonDateTime.hour).toBe(object.hour); + expect(luxonDateTime.minute).toBe(object.minute); + expect(luxonDateTime.second).toBe(object.second); + }); }); - expect(luxonDateTime.toMillis()).toBe(timestamp); - expect(luxonDateTime.toISO()).toBe('1997-09-02T09:00:00.000-04:00'); + describe('toString', () => { + test.each([ + { + input: { + year: 1997, + month: 9, + day: 3, + hour: 9, + minute: 0, + second: 0, + utc: false, + }, + expected: '19970903T090000', + }, + { + input: { + year: 2005, + month: 9, + day: 4, + hour: 9, + minute: 1, + second: 22, + utc: true, + }, + expected: '20050904T090122Z', + }, + ])('should convert $input to $expected', ({ input, expected }) => { + const datetime = DateTime.create( + input.year, + input.month, + input.day, + input.hour, + input.minute, + input.second, + input.utc, + ); + + const asString = datetime.toString(); + + expect(asString).toBe(expected); + }); + + test("should be be compatible with Luxon's DateTime.fromObject", () => { + const datetime = DateTime.create(1997, 9, 3, 9, 4, 7, false); + const object = datetime.toObject(); + + const luxonDateTime = luxon.DateTime.fromObject(object); + + expect(luxonDateTime.year).toBe(object.year); + expect(luxonDateTime.month).toBe(object.month); + expect(luxonDateTime.day).toBe(object.day); + expect(luxonDateTime.hour).toBe(object.hour); + expect(luxonDateTime.minute).toBe(object.minute); + expect(luxonDateTime.second).toBe(object.second); + }); + }); + + describe('fromString', () => { + test.each([ + { + input: '19970907T040011', + expected: { + year: 1997, + month: 9, + day: 7, + hour: 4, + minute: 0, + second: 11, + utc: false, + }, + }, + { + input: '19970903T201010', + expected: { + year: 1997, + month: 9, + day: 3, + hour: 20, + minute: 10, + second: 10, + utc: false, + }, + }, + { + input: '20050904T090122Z', + expected: { + year: 2005, + month: 9, + day: 4, + hour: 9, + minute: 1, + second: 22, + utc: true, + }, + }, + ])('should create datetime from $input', ({ input, expected }) => { + const datetime = DateTime.fromString(input); + + expect(datetime.year).toBe(expected.year); + expect(datetime.month).toBe(expected.month); + expect(datetime.day).toBe(expected.day); + expect(datetime.hour).toBe(expected.hour); + expect(datetime.minute).toBe(expected.minute); + expect(datetime.second).toBe(expected.second); + expect(datetime.utc).toBe(expected.utc); + }); + + test.each([ + '23njr', + '18-05-2024', + '1970-01-01T00:00:00.000Z', + 'YYYYMMDDTHHMMSSZ', + ])('should fail create datetime from %s', (input) => { + const act = () => DateTime.fromString(input); + + expect(act).toThrow('Invalid date time string'); + }); + }); }); diff --git a/tests/monthly.spec.ts b/tests/monthly.spec.ts index 0540d65..57407a1 100644 --- a/tests/monthly.spec.ts +++ b/tests/monthly.spec.ts @@ -1,49 +1,59 @@ -import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../dist'; -import { takeN } from './utils'; +import { RRule, RRuleSet, Frequency, Weekday, DateTime } from '../src'; -test('Monthly on the 1st Friday for ten occurrences', () => { +test('Monthly on the 1st Friday for 10 occurrences', () => { const rrule = new RRule(Frequency.Monthly) .setCount(10) .setByWeekday([Weekday.Friday]) .setBySetpos([1]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', ); expect(dates).toEqual([ - 873464400000, 875883600000, 878911200000, 881330400000, 883749600000, - 886773600000, 889192800000, 891612000000, 894027600000, 897051600000, + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 10, 3, 9, 0, 0, false), + DateTime.create(1997, 11, 7, 9, 0, 0, false), + DateTime.create(1997, 12, 5, 9, 0, 0, false), + DateTime.create(1998, 1, 2, 9, 0, 0, false), + DateTime.create(1998, 2, 6, 9, 0, 0, false), + DateTime.create(1998, 3, 6, 9, 0, 0, false), + DateTime.create(1998, 4, 3, 9, 0, 0, false), + DateTime.create(1998, 5, 1, 9, 0, 0, false), + DateTime.create(1998, 6, 5, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Monthly on the 1st Friday until December 24, 1997', () => { const rrule = new RRule(Frequency.Monthly) - .setUntil(new RRuleDateTime(882921600000, 'UTC')) + .setUntil(DateTime.create(1997, 12, 24, 0, 0, 0, false)) .setByWeekday([Weekday.Friday]) .setBySetpos([1]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;UNTIL=19971224T050000Z;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', ); expect(dates).toEqual([ - 873464400000, 875883600000, 878911200000, 881330400000, + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 10, 3, 9, 0, 0, false), + DateTime.create(1997, 11, 7, 9, 0, 0, false), + DateTime.create(1997, 12, 5, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every other month on the 1st and last Sunday of the month for 10 occurrences', () => { @@ -53,21 +63,29 @@ test('Every other month on the 1st and last Sunday of the month for 10 occurrenc .setByWeekday([Weekday.Sunday, Weekday.Sunday]) .setBySetpos([1, -1]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYSETPOS=-1,1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=SU', ); expect(dates).toEqual([ - 873637200000, 875451600000, 878479200000, 880898400000, 883922400000, - 885736800000, 888760800000, 891180000000, 894200400000, 896619600000, + DateTime.create(1997, 9, 7, 9, 0, 0, false), + DateTime.create(1997, 9, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 2, 9, 0, 0, false), + DateTime.create(1997, 11, 30, 9, 0, 0, false), + DateTime.create(1998, 1, 4, 9, 0, 0, false), + DateTime.create(1998, 1, 25, 9, 0, 0, false), + DateTime.create(1998, 3, 1, 9, 0, 0, false), + DateTime.create(1998, 3, 29, 9, 0, 0, false), + DateTime.create(1998, 5, 3, 9, 0, 0, false), + DateTime.create(1998, 5, 31, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Monthly on the second to last Monday of the month for 6 months', () => { @@ -76,43 +94,48 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { .setByWeekday([Weekday.Monday]) .setBySetpos([-2]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYSETPOS=-2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); expect(dates).toEqual([ - 874933200000, 877352400000, 879775200000, 882799200000, 885218400000, - 887637600000, + DateTime.create(1997, 9, 22, 9, 0, 0, false), + DateTime.create(1997, 10, 20, 9, 0, 0, false), + DateTime.create(1997, 11, 17, 9, 0, 0, false), + DateTime.create(1997, 12, 22, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 2, 16, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Monthly on the third to the last day of the month, limit 6', () => { const rrule = new RRule(Frequency.Monthly).setByMonthday([-3]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(6).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 6)).map( - (d) => d.timestamp, - ); + const dates = set.all(6); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 875451600000, 878133600000, 880725600000, 883404000000, 886082400000, - 888501600000, + DateTime.create(1997, 9, 28, 9, 0, 0, false), + DateTime.create(1997, 10, 29, 9, 0, 0, false), + DateTime.create(1997, 11, 28, 9, 0, 0, false), + DateTime.create(1997, 12, 29, 9, 0, 0, false), + DateTime.create(1998, 1, 29, 9, 0, 0, false), + DateTime.create(1998, 2, 26, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); }); test('Monthly on the 2nd and 15th of the month for 10 occurrences', () => { @@ -120,21 +143,29 @@ test('Monthly on the 2nd and 15th of the month for 10 occurrences', () => { .setCount(10) .setByMonthday([2, 15]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 873205200000, 874328400000, 875797200000, 876920400000, 878479200000, - 879602400000, 881071200000, 882194400000, 883749600000, 884872800000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 15, 9, 0, 0, false), + DateTime.create(1997, 10, 2, 9, 0, 0, false), + DateTime.create(1997, 10, 15, 9, 0, 0, false), + DateTime.create(1997, 11, 2, 9, 0, 0, false), + DateTime.create(1997, 11, 15, 9, 0, 0, false), + DateTime.create(1997, 12, 2, 9, 0, 0, false), + DateTime.create(1997, 12, 15, 9, 0, 0, false), + DateTime.create(1998, 1, 2, 9, 0, 0, false), + DateTime.create(1998, 1, 15, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Monthly on the first and last day of the month for 10 occurrences', () => { @@ -142,21 +173,29 @@ test('Monthly on the first and last day of the month for 10 occurrences', () => .setCount(10) .setByMonthday([1, -1]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 875624400000, 875710800000, 878306400000, 878392800000, 880898400000, - 880984800000, 883576800000, 883663200000, 886255200000, 886341600000, + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 1, 9, 0, 0, false), + DateTime.create(1997, 10, 31, 9, 0, 0, false), + DateTime.create(1997, 11, 1, 9, 0, 0, false), + DateTime.create(1997, 11, 30, 9, 0, 0, false), + DateTime.create(1997, 12, 1, 9, 0, 0, false), + DateTime.create(1997, 12, 31, 9, 0, 0, false), + DateTime.create(1998, 1, 1, 9, 0, 0, false), + DateTime.create(1998, 1, 31, 9, 0, 0, false), + DateTime.create(1998, 2, 1, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every 18 months on the 10th thru 15th of the month for 10 occurrences', () => { @@ -165,52 +204,55 @@ test('Every 18 months on the 10th thru 15th of the month for 10 occurrences', () .setInterval(18) .setByMonthday([10, 11, 12, 13, 14, 15]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 873896400000, 873982800000, 874069200000, 874155600000, 874242000000, - 874328400000, 921074400000, 921160800000, 921247200000, 921333600000, + DateTime.create(1997, 9, 10, 9, 0, 0, false), + DateTime.create(1997, 9, 11, 9, 0, 0, false), + DateTime.create(1997, 9, 12, 9, 0, 0, false), + DateTime.create(1997, 9, 13, 9, 0, 0, false), + DateTime.create(1997, 9, 14, 9, 0, 0, false), + DateTime.create(1997, 9, 15, 9, 0, 0, false), + DateTime.create(1999, 3, 10, 9, 0, 0, false), + DateTime.create(1999, 3, 11, 9, 0, 0, false), + DateTime.create(1999, 3, 12, 9, 0, 0, false), + DateTime.create(1999, 3, 13, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Monthly 5 times with two rdates and one exdate', () => { const rrule = new RRule(Frequency.Monthly).setCount(5); - const set = new RRuleSet( - new RRuleDateTime(new Date('2012-02-01T02:30:00Z'), 'UTC'), - ) + const set = new RRuleSet(DateTime.create(2012, 2, 1, 2, 30, 0, false), 'UTC') .addRrule(rrule) - .addRdate(new Date('2012-07-01T02:30:00Z')) - .addRdate(new Date('2012-07-02T02:30:00Z')) - .addExdate(new Date('2012-06-01T02:30:00Z')); + .addRdate(DateTime.create(2012, 7, 1, 2, 30, 0, false)) + .addRdate(DateTime.create(2012, 7, 2, 2, 30, 0, false)) + .addExdate(DateTime.create(2012, 6, 1, 2, 30, 0, false)); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); - expect(set.getRdates().map((d) => d.toDate().toISOString())).toEqual([ - '2012-07-01T02:30:00.000Z', - '2012-07-02T02:30:00.000Z', + expect(set.rdates).toEqual([ + DateTime.create(2012, 7, 1, 2, 30, 0, false), + DateTime.create(2012, 7, 2, 2, 30, 0, false), ]); - expect(set.getExdates().map((d) => d.toDate().toISOString())).toEqual([ - '2012-06-01T02:30:00.000Z', - ]); - expect(dates.map((d) => new Date(d).toISOString())).toEqual([ - '2012-02-01T02:30:00.000Z', - '2012-03-01T02:30:00.000Z', - '2012-04-01T02:30:00.000Z', - '2012-05-01T02:30:00.000Z', - '2012-07-01T02:30:00.000Z', - '2012-07-02T02:30:00.000Z', + expect(set.exdates).toEqual([DateTime.create(2012, 6, 1, 2, 30, 0, false)]); + expect(dates).toEqual([ + DateTime.create(2012, 2, 1, 2, 30, 0, true), + DateTime.create(2012, 3, 1, 2, 30, 0, true), + DateTime.create(2012, 4, 1, 2, 30, 0, true), + DateTime.create(2012, 5, 1, 2, 30, 0, true), + DateTime.create(2012, 7, 1, 2, 30, 0, true), + DateTime.create(2012, 7, 2, 2, 30, 0, true), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every Tuesday, every other month, limit 18', () => { @@ -218,53 +260,66 @@ test('Every Tuesday, every other month, limit 18', () => { .setInterval(2) .setByWeekday([Weekday.Tuesday]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(18).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 18)).map( - (d) => d.timestamp, - ); + const dates = set.all(18); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ - 873205200000, 873810000000, 874414800000, 875019600000, 875624400000, - 878652000000, 879256800000, 879861600000, 880466400000, 884095200000, - 884700000000, 885304800000, 885909600000, 888933600000, 889538400000, - 890143200000, 890748000000, 891352800000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 23, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 11, 4, 9, 0, 0, false), + DateTime.create(1997, 11, 11, 9, 0, 0, false), + DateTime.create(1997, 11, 18, 9, 0, 0, false), + DateTime.create(1997, 11, 25, 9, 0, 0, false), + DateTime.create(1998, 1, 6, 9, 0, 0, false), + DateTime.create(1998, 1, 13, 9, 0, 0, false), + DateTime.create(1998, 1, 20, 9, 0, 0, false), + DateTime.create(1998, 1, 27, 9, 0, 0, false), + DateTime.create(1998, 3, 3, 9, 0, 0, false), + DateTime.create(1998, 3, 10, 9, 0, 0, false), + DateTime.create(1998, 3, 17, 9, 0, 0, false), + DateTime.create(1998, 3, 24, 9, 0, 0, false), + DateTime.create(1998, 3, 31, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); }); -test('Monthly on the second to last Monday of the month for 6 months', () => { +test('Monthly on the second to last Monday of the month for 6 months 1', () => { const rrule = new RRule(Frequency.Monthly) .setByWeekday([{ weekday: Weekday.Monday, n: -2 }]) .setCount(6); const set = new RRuleSet( - new RRuleDateTime(new Date('1997-09-22T09:00:00-04:00'), 'US/Eastern'), + DateTime.create(1997, 9, 22, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(8).map((d) => d.timestamp); + const dates = set.all(8); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970922T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-2MO', ); - expect(dates.map((d) => new Date(d).toISOString())).toEqual([ - '1997-09-22T13:00:00.000Z', - '1997-10-20T13:00:00.000Z', - '1997-11-17T14:00:00.000Z', - '1997-12-22T14:00:00.000Z', - '1998-01-19T14:00:00.000Z', - '1998-02-16T14:00:00.000Z', + expect(dates).toEqual([ + DateTime.create(1997, 9, 22, 9, 0, 0, false), + DateTime.create(1997, 10, 20, 9, 0, 0, false), + DateTime.create(1997, 11, 17, 9, 0, 0, false), + DateTime.create(1997, 12, 22, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 2, 16, 9, 0, 0, false), ]); + expect([...set]).toEqual(dates); }); test('Errors on invalid by-weekday', () => { expect(() => - new RRule(Frequency.Monthly).setByWeekday(['invalid' as any]), - ).toThrowError('Value is non of these types `NWeekday`, `Weekday`'); + new RRule(Frequency.Monthly).setByWeekday(['invalid' as any]).toString(), + ).toThrow('Value is non of these types `NWeekday`, `Weekday`'); }); diff --git a/tests/parsing.spec.ts b/tests/parsing.spec.ts index 08fc983..f7a1449 100644 --- a/tests/parsing.spec.ts +++ b/tests/parsing.spec.ts @@ -1,4 +1,4 @@ -import { Frequency, Weekday, RRule, RRuleSet, RRuleDateTime } from '../dist'; +import { Frequency, Weekday, RRule, RRuleSet, DateTime } from '../src'; test('Should properly parse weekly recurrence', () => { const set = RRuleSet.parse( @@ -98,11 +98,10 @@ test('Should properly parse weekly individual recurrence rule', () => { const rule = RRule.parse( 'FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', ); + expect(rule.frequency).toBe(Frequency.Weekly); expect(rule.interval).toBe(2); - expect(rule.until?.timestamp).toBe( - new Date('1997-12-24T00:00:00Z').getTime(), - ); + expect(rule.until).toEqual(DateTime.create(1997, 12, 24, 0, 0, 0, true)); expect(rule.weekstart).toBe(Weekday.Sunday); expect(rule.byWeekday).toEqual([ { weekday: Weekday.Monday }, @@ -172,13 +171,13 @@ test('Should throw error on invalid individual recurrence rule week start', () = test('Should be able to parse rule set without dtstart', () => { const set = new RRuleSet( - new RRuleDateTime(new Date('1997-09-02T09:00:00-04:00'), 'US/Eastern'), - ); - set.setFromString( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).setFromString( 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', ); - const asString = set.toString(); - expect(asString).toBe( + + expect(set.toString()).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', ); }); diff --git a/tests/utils.ts b/tests/utils.ts deleted file mode 100644 index 4c5b461..0000000 --- a/tests/utils.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function* takeN(iterable: Iterable, length: number) { - for (const item of iterable) { - if (length-- <= 0) { - break; - } - yield item; - } -} diff --git a/tests/weekly.spec.ts b/tests/weekly.spec.ts index cacc2e5..162324e 100644 --- a/tests/weekly.spec.ts +++ b/tests/weekly.spec.ts @@ -1,48 +1,68 @@ -import { RRule, RRuleDateTime, RRuleSet, Frequency, Weekday } from '../dist'; -import { takeN } from './utils'; +import { RRule, RRuleSet, Frequency, Weekday, DateTime } from '../src'; test('Weekly for 10 occurrences', () => { const rrule = new RRule(Frequency.Weekly).setCount(10); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ - 873205200000, 873810000000, 874414800000, 875019600000, 875624400000, - 876229200000, 876834000000, 877438800000, 878047200000, 878652000000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 23, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 7, 9, 0, 0, false), + DateTime.create(1997, 10, 14, 9, 0, 0, false), + DateTime.create(1997, 10, 21, 9, 0, 0, false), + DateTime.create(1997, 10, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 4, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Weekly until December 24, 1997', () => { const rrule = new RRule(Frequency.Weekly).setUntil( - new RRuleDateTime(882921600000, 'UTC'), + DateTime.create(1997, 12, 24, 0, 0, 0, false), ); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T050000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ - 873205200000, 873810000000, 874414800000, 875019600000, 875624400000, - 876229200000, 876834000000, 877438800000, 878047200000, 878652000000, - 879256800000, 879861600000, 880466400000, 881071200000, 881676000000, - 882280800000, 882885600000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 23, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 7, 9, 0, 0, false), + DateTime.create(1997, 10, 14, 9, 0, 0, false), + DateTime.create(1997, 10, 21, 9, 0, 0, false), + DateTime.create(1997, 10, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 4, 9, 0, 0, false), + DateTime.create(1997, 11, 11, 9, 0, 0, false), + DateTime.create(1997, 11, 18, 9, 0, 0, false), + DateTime.create(1997, 11, 25, 9, 0, 0, false), + DateTime.create(1997, 12, 2, 9, 0, 0, false), + DateTime.create(1997, 12, 9, 9, 0, 0, false), + DateTime.create(1997, 12, 16, 9, 0, 0, false), + DateTime.create(1997, 12, 23, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every other week - limit 10', () => { @@ -50,50 +70,73 @@ test('Every other week - limit 10', () => { .setInterval(2) .setWeekstart(Weekday.Sunday); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(10).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 10)).map( - (d) => d.timestamp, - ); + const dates = set.all(10); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ - 873205200000, 874414800000, 875624400000, 876834000000, 878047200000, - 879256800000, 880466400000, 881676000000, 882885600000, 884095200000, + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 14, 9, 0, 0, false), + DateTime.create(1997, 10, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 11, 9, 0, 0, false), + DateTime.create(1997, 11, 25, 9, 0, 0, false), + DateTime.create(1997, 12, 9, 9, 0, 0, false), + DateTime.create(1997, 12, 23, 9, 0, 0, false), + DateTime.create(1998, 1, 6, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); }); test('Every other week on Monday, Wednesday and Friday until December 24, 1997, but starting on Tuesday, September 2, 1997', () => { const rrule = new RRule(Frequency.Weekly) .setInterval(2) - .setUntil(new RRuleDateTime(882921600000, 'UTC')) + .setUntil(DateTime.create(1997, 12, 24, 0, 0, 0, false)) .setWeekstart(Weekday.Sunday) .setByWeekday([Weekday.Monday, Weekday.Wednesday, Weekday.Friday]); const set = new RRuleSet( - new RRuleDateTime(873205200000, 'US/Eastern'), + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T050000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', ); expect(dates).toEqual([ // TODO: rrule crate does not include dtstart date (873205200000), create a bug report - 873291600000, - 873464400000, 874328400000, 874501200000, 874674000000, 875538000000, - 875710800000, 875883600000, 876747600000, 876920400000, 877093200000, - 877960800000, 878133600000, 878306400000, 879170400000, 879343200000, - 879516000000, 880380000000, 880552800000, 880725600000, 881589600000, - 881762400000, 881935200000, 882799200000, + DateTime.create(1997, 9, 3, 9, 0, 0, false), + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 9, 15, 9, 0, 0, false), + DateTime.create(1997, 9, 17, 9, 0, 0, false), + DateTime.create(1997, 9, 19, 9, 0, 0, false), + DateTime.create(1997, 9, 29, 9, 0, 0, false), + DateTime.create(1997, 10, 1, 9, 0, 0, false), + DateTime.create(1997, 10, 3, 9, 0, 0, false), + DateTime.create(1997, 10, 13, 9, 0, 0, false), + DateTime.create(1997, 10, 15, 9, 0, 0, false), + DateTime.create(1997, 10, 17, 9, 0, 0, false), + DateTime.create(1997, 10, 27, 9, 0, 0, false), + DateTime.create(1997, 10, 29, 9, 0, 0, false), + DateTime.create(1997, 10, 31, 9, 0, 0, false), + DateTime.create(1997, 11, 10, 9, 0, 0, false), + DateTime.create(1997, 11, 12, 9, 0, 0, false), + DateTime.create(1997, 11, 14, 9, 0, 0, false), + DateTime.create(1997, 11, 24, 9, 0, 0, false), + DateTime.create(1997, 11, 26, 9, 0, 0, false), + DateTime.create(1997, 11, 28, 9, 0, 0, false), + DateTime.create(1997, 12, 8, 9, 0, 0, false), + DateTime.create(1997, 12, 10, 9, 0, 0, false), + DateTime.create(1997, 12, 12, 9, 0, 0, false), + DateTime.create(1997, 12, 22, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); diff --git a/tests/yearly.spec.ts b/tests/yearly.spec.ts index 9ce3494..8a467d6 100644 --- a/tests/yearly.spec.ts +++ b/tests/yearly.spec.ts @@ -1,33 +1,33 @@ -import { - RRule, - RRuleDateTime, - RRuleSet, - Frequency, - Month, - Weekday, -} from '../dist'; -import { takeN } from './utils'; +import { RRule, RRuleSet, Frequency, Month, Weekday, DateTime } from '../src'; test('Yearly in June and July for 10 occurrences', () => { const rrule = new RRule(Frequency.Yearly) .setCount(10) .setByMonth([Month.June, Month.July]); const set = new RRuleSet( - new RRuleDateTime(865947600000, 'US/Eastern'), + DateTime.create(1997, 6, 10, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 865947600000, 868539600000, 897483600000, 900075600000, 929019600000, - 931611600000, 960642000000, 963234000000, 992178000000, 994770000000, + DateTime.create(1997, 6, 10, 9, 0, 0, false), + DateTime.create(1997, 7, 10, 9, 0, 0, false), + DateTime.create(1998, 6, 10, 9, 0, 0, false), + DateTime.create(1998, 7, 10, 9, 0, 0, false), + DateTime.create(1999, 6, 10, 9, 0, 0, false), + DateTime.create(1999, 7, 10, 9, 0, 0, false), + DateTime.create(2000, 6, 10, 9, 0, 0, false), + DateTime.create(2000, 7, 10, 9, 0, 0, false), + DateTime.create(2001, 6, 10, 9, 0, 0, false), + DateTime.create(2001, 7, 10, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every other year on January, February, and March for 10 occurrences', () => { @@ -36,21 +36,29 @@ test('Every other year on January, February, and March for 10 occurrences', () = .setCount(10) .setByMonth([Month.January, Month.February, Month.March]); const set = new RRuleSet( - new RRuleDateTime(858002400000, 'US/Eastern'), + DateTime.create(1997, 3, 10, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970310T090000\nRRULE:FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', ); expect(dates).toEqual([ - 858002400000, 915976800000, 918655200000, 921074400000, 979135200000, - 981813600000, 984232800000, 1042207200000, 1044885600000, 1047304800000, + DateTime.create(1997, 3, 10, 9, 0, 0, false), + DateTime.create(1999, 1, 10, 9, 0, 0, false), + DateTime.create(1999, 2, 10, 9, 0, 0, false), + DateTime.create(1999, 3, 10, 9, 0, 0, false), + DateTime.create(2001, 1, 10, 9, 0, 0, false), + DateTime.create(2001, 2, 10, 9, 0, 0, false), + DateTime.create(2001, 3, 10, 9, 0, 0, false), + DateTime.create(2003, 1, 10, 9, 0, 0, false), + DateTime.create(2003, 2, 10, 9, 0, 0, false), + DateTime.create(2003, 3, 10, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every 3rd year on the 1st, 100th and 200th day for 10 occurrences', () => { @@ -59,21 +67,29 @@ test('Every 3rd year on the 1st, 100th and 200th day for 10 occurrences', () => .setInterval(3) .setByYearday([1, 100, 200]); const set = new RRuleSet( - new RRuleDateTime(852127200000, 'US/Eastern'), + DateTime.create(1997, 1, 1, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all().map((d) => d.timestamp); - const iteratorDates = Array.from(set.occurrences()).map((d) => d.timestamp); + const dates = set.all(); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970101T090000\nRRULE:FREQ=YEARLY;COUNT=10;INTERVAL=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYYEARDAY=1,100,200', ); expect(dates).toEqual([ - 852127200000, 860677200000, 869317200000, 946735200000, 955285200000, - 963925200000, 1041429600000, 1049979600000, 1058619600000, 1136124000000, + DateTime.create(1997, 1, 1, 9, 0, 0, false), + DateTime.create(1997, 4, 10, 9, 0, 0, false), + DateTime.create(1997, 7, 19, 9, 0, 0, false), + DateTime.create(2000, 1, 1, 9, 0, 0, false), + DateTime.create(2000, 4, 9, 9, 0, 0, false), + DateTime.create(2000, 7, 18, 9, 0, 0, false), + DateTime.create(2003, 1, 1, 9, 0, 0, false), + DateTime.create(2003, 4, 10, 9, 0, 0, false), + DateTime.create(2003, 7, 19, 9, 0, 0, false), + DateTime.create(2006, 1, 1, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); + expect([...set]).toEqual(dates); }); test('Every 20th Monday of the year, limit 3', () => { @@ -81,20 +97,21 @@ test('Every 20th Monday of the year, limit 3', () => { .setByWeekday([Weekday.Monday]) .setBySetpos([20]); const set = new RRuleSet( - new RRuleDateTime(863442000000, 'US/Eastern'), + DateTime.create(1997, 5, 12, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(3).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 3)).map( - (d) => d.timestamp, - ); + const dates = set.all(3); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYSETPOS=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); - expect(dates).toEqual([864046800000, 895496400000, 926946000000]); - expect(iteratorDates).toEqual(dates); + expect(dates).toEqual([ + DateTime.create(1997, 5, 19, 9, 0, 0, false), + DateTime.create(1998, 5, 18, 9, 0, 0, false), + DateTime.create(1999, 5, 17, 9, 0, 0, false), + ]); }); test('Monday of week number 20 (where the default start of the week is Monday), limit 3', () => { @@ -103,20 +120,21 @@ test('Monday of week number 20 (where the default start of the week is Monday), .setByWeekday([Weekday.Monday]) .setByWeekno([20]); const set = new RRuleSet( - new RRuleDateTime(863442000000, 'US/Eastern'), + DateTime.create(1997, 5, 12, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(3).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 3)).map( - (d) => d.timestamp, - ); + const dates = set.all(3); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYWEEKNO=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', ); - expect(dates).toEqual([863442000000, 894891600000, 926946000000]); - expect(iteratorDates).toEqual(dates); + expect(dates).toEqual([ + DateTime.create(1997, 5, 12, 9, 0, 0, false), + DateTime.create(1998, 5, 11, 9, 0, 0, false), + DateTime.create(1999, 5, 17, 9, 0, 0, false), + ]); }); test('Every Thursday in March, limit 11', () => { @@ -124,50 +142,58 @@ test('Every Thursday in March, limit 11', () => { .setByMonth([Month.March]) .setByWeekday([Weekday.Thursday]); const set = new RRuleSet( - new RRuleDateTime(858261600000, 'US/Eastern'), + DateTime.create(1997, 3, 13, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(11).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 11)).map( - (d) => d.timestamp, - ); + const dates = set.all(11); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970313T090000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TH', ); expect(dates).toEqual([ - 858261600000, 858866400000, 859471200000, 889106400000, 889711200000, - 890316000000, 890920800000, 920556000000, 921160800000, 921765600000, - 922370400000, + DateTime.create(1997, 3, 13, 9, 0, 0, false), + DateTime.create(1997, 3, 20, 9, 0, 0, false), + DateTime.create(1997, 3, 27, 9, 0, 0, false), + DateTime.create(1998, 3, 5, 9, 0, 0, false), + DateTime.create(1998, 3, 12, 9, 0, 0, false), + DateTime.create(1998, 3, 19, 9, 0, 0, false), + DateTime.create(1998, 3, 26, 9, 0, 0, false), + DateTime.create(1999, 3, 4, 9, 0, 0, false), + DateTime.create(1999, 3, 11, 9, 0, 0, false), + DateTime.create(1999, 3, 18, 9, 0, 0, false), + DateTime.create(1999, 3, 25, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); }); test('Every Friday the 13th, limit 5', () => { const rrule = new RRule(Frequency.Yearly) .setByWeekday([Weekday.Friday]) .setByMonthday([13]); - const set = new RRuleSet(new RRuleDateTime(873205200000, 'US/Eastern')) - .addExdate(new RRuleDateTime(889797600000, 'UTC')) + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ) + .addExdate(DateTime.create(1998, 3, 13, 9, 0, 0, false)) .addRrule(rrule); const asString = set.toString(); - const dates = set.all(5).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 5)).map( - (d) => d.timestamp, - ); + const dates = set.all(5); - // TODO: rrule crate doesn't add exdate to string output, create a bug report expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\n' + 'RRULE:FREQ=YEARLY;BYMONTHDAY=13;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR\n' + - 'EXDATE;VALUE=DATE-TIME:19980313T140000Z', + // TODO: it should not contain Z in the end. Create a bug report. + 'EXDATE;VALUE=DATE-TIME:19980313T090000Z', ); expect(dates).toEqual([ - 887378400000, 910965600000, 934549200000, 971442000000, 987166800000, + DateTime.create(1998, 2, 13, 9, 0, 0, false), + DateTime.create(1998, 11, 13, 9, 0, 0, false), + DateTime.create(1999, 8, 13, 9, 0, 0, false), + DateTime.create(2000, 10, 13, 9, 0, 0, false), + DateTime.create(2001, 4, 13, 9, 0, 0, false), ]); - expect(iteratorDates).toEqual(dates); }); test('Every four years, the first Tuesday after a Monday in November, forever (U.S. Presidential Election day)', () => { @@ -177,18 +203,19 @@ test('Every four years, the first Tuesday after a Monday in November, forever (U .setByWeekday([Weekday.Tuesday]) .setByMonthday([2, 3, 4, 5, 6, 7, 8]); const set = new RRuleSet( - new RRuleDateTime(847202400000, 'US/Eastern'), + DateTime.create(1996, 11, 5, 9, 0, 0, false), + 'US/Eastern', ).addRrule(rrule); const asString = set.toString(); - const dates = set.all(3).map((d) => d.timestamp); - const iteratorDates = Array.from(takeN(set.occurrences(), 3)).map( - (d) => d.timestamp, - ); + const dates = set.all(3); expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19961105T090000\nRRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYMONTHDAY=2,3,4,5,6,7,8;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); - expect(dates).toEqual([847202400000, 973605600000, 1099404000000]); - expect(iteratorDates).toEqual(dates); + expect(dates).toEqual([ + DateTime.create(1996, 11, 5, 9, 0, 0, false), + DateTime.create(2000, 11, 7, 9, 0, 0, false), + DateTime.create(2004, 11, 2, 9, 0, 0, false), + ]); }); diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..966e0cb --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "stripInternal": true + }, + "extends": "./tsconfig.json", + "include": ["./src/**/*"], + "exclude": ["**/*.spec.ts"] +} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 9f910a2..8fa410a 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -2,5 +2,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "noEmit": true - } + }, + "include": ["./**/*"], + "exclude": ["node_modules", "dist"] } diff --git a/tsconfig.json b/tsconfig.json index ccd0903..a1483e7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,20 @@ { "compilerOptions": { + "target": "es2021", "module": "commonjs", "declaration": true, + "allowJs": true, + "strict": true, + "outDir": "./dist", + "skipLibCheck": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, - "target": "es2017", + "resolveJsonModule": true, "sourceMap": true, - "outDir": "./dist", - "baseUrl": "./", + "baseUrl": ".", "incremental": true, - "removeComments": true, + "removeComments": false, "allowUnreachableCode": false, "allowUnusedLabels": false, "noFallthroughCasesInSwitch": true, @@ -18,7 +22,6 @@ "noUncheckedIndexedAccess": true, "noImplicitOverride": true, "noUnusedLocals": true, - "noUnusedParameters": true, - "strict": true + "noUnusedParameters": true } } From 4137f7ee49d9261a551b1a68134da5f4ba3ee96c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 18 May 2024 20:32:58 +0700 Subject: [PATCH 41/63] revert(deps-dev): bump conventional-changelog-conventionalcommits (#152) This reverts commit 8b4c5c958b5ca6ae7d1cfde4286b74db2c35201e. --- package-lock.json | 23 ++++++----------------- package.json | 2 +- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 081bcd2..4a862cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", - "conventional-changelog-conventionalcommits": "^8.0.0", + "conventional-changelog-conventionalcommits": "^7.0.2", "cpy-cli": "^5.0.0", "cross-env": "^7.0.3", "eslint": "^8.33.0", @@ -955,18 +955,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@commitlint/config-validator": { "version": "19.0.3", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", @@ -4126,15 +4114,16 @@ } }, "node_modules/conventional-changelog-conventionalcommits": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-8.0.0.tgz", - "integrity": "sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", "dev": true, + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=16" } }, "node_modules/conventional-changelog-writer": { diff --git a/package.json b/package.json index 4a6e7ec..7ed9673 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "benny": "^3.7.1", - "conventional-changelog-conventionalcommits": "^8.0.0", + "conventional-changelog-conventionalcommits": "^7.0.2", "cpy-cli": "^5.0.0", "cross-env": "^7.0.3", "eslint": "^8.33.0", From cddca236e744cb0d9ada4c882a3401e30c660751 Mon Sep 17 00:00:00 2001 From: Tom Quist Date: Sat, 18 May 2024 21:01:57 +0200 Subject: [PATCH 42/63] fix: release of darwin universal (#153) --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 14ddd4d..c48bd5c 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -424,7 +424,7 @@ jobs: name: bindings-aarch64-apple-darwin path: artifacts - name: Combine binaries - run: npm run universal + run: npm run universal -- --dist src/lib - name: Upload artifact uses: actions/upload-artifact@v4 with: From 9747e183235435048ee2475545419509c3ed3351 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 19 May 2024 02:02:40 +0700 Subject: [PATCH 43/63] fix: publish all dist files (#154) --- .npmignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.npmignore b/.npmignore index 304eb9e..535365c 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,3 @@ * -!dist/index.d.ts -!dist/index.js +!dist/**/* +dist/**/*.node \ No newline at end of file From 3fa893afe3a19ff913441392c237c062e5354832 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 19 May 2024 03:08:21 +0700 Subject: [PATCH 44/63] build: exclude map and ts build info from package (#155) --- .npmignore | 3 ++- jest.config.ts | 13 ++++++++++--- tsconfig.json | 2 +- tsconfig.test.json | 6 ++++++ 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 tsconfig.test.json diff --git a/.npmignore b/.npmignore index 535365c..419c28f 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,4 @@ * !dist/**/* -dist/**/*.node \ No newline at end of file +*.node +*.tsbuildinfo \ No newline at end of file diff --git a/jest.config.ts b/jest.config.ts index 9e9bc99..5626dd1 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,7 +1,14 @@ /* eslint-disable import/no-default-export -- Required by jest */ -import { Config } from 'jest'; +import type { JestConfigWithTsJest } from 'ts-jest'; export default { - preset: 'ts-jest', testEnvironment: 'node', -} satisfies Config; + transform: { + '^.+\\.[tj]s?$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.test.json', + }, + ], + }, +} satisfies JestConfigWithTsJest; diff --git a/tsconfig.json b/tsconfig.json index a1483e7..cb75d21 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, - "sourceMap": true, + "sourceMap": false, "baseUrl": ".", "incremental": true, "removeComments": false, diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..4cf301b --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "sourceMap": true + }, + "extends": "./tsconfig.json" +} From cda2986209a187af07ca12e2ba8be66f730da182 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 19 May 2024 17:29:46 +0700 Subject: [PATCH 45/63] feat(rrule): generate const enums (#156) --- package.json | 3 +-- src/index.ts | 1 - src/lib/index.d.ts | 6 +++--- src/rrule-set.ts | 1 + src/rrule.ts | 48 +++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 7ed9673..c790f66 100644 --- a/package.json +++ b/package.json @@ -81,8 +81,7 @@ }, "scripts": { "artifacts": "napi artifacts", - "build:lib": "napi build --js src/lib/index.js --dts src/lib/index.d.ts --platform --release", - "postbuild:lib": "cpy ./*.node ./src/lib && rimraf --glob ./*.node", + "build:lib": "napi build --no-const-enum --platform --release src/lib", "prebuild": "rimraf ./dist && npm run build:lib", "build": "tsc -p ./tsconfig.build.json", "postbuild": "cpy ./src/lib/* ./dist/lib --flat", diff --git a/src/index.ts b/src/index.ts index 5f47de0..8c6220a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ export * from './rrule-set'; export * from './rrule'; export * from './datetime'; -export { Frequency, Weekday, Month, NWeekday } from './lib'; diff --git a/src/lib/index.d.ts b/src/lib/index.d.ts index ff050ba..3239dd5 100644 --- a/src/lib/index.d.ts +++ b/src/lib/index.d.ts @@ -3,7 +3,7 @@ /* auto-generated by NAPI-RS */ -export const enum Frequency { +export enum Frequency { Yearly = 0, Monthly = 1, Weekly = 2, @@ -12,7 +12,7 @@ export const enum Frequency { Minutely = 5, Secondly = 6 } -export const enum Month { +export enum Month { January = 0, February = 1, March = 2, @@ -36,7 +36,7 @@ export interface NWeekday { n?: number weekday: Weekday } -export const enum Weekday { +export enum Weekday { Monday = 0, Tuesday = 1, Wednesday = 2, diff --git a/src/rrule-set.ts b/src/rrule-set.ts index 9d8ece9..16aaf0e 100644 --- a/src/rrule-set.ts +++ b/src/rrule-set.ts @@ -12,6 +12,7 @@ export interface RRuleSetLike { } export class RRuleSet implements Iterable { + /** @internal */ private rust?: Rust; public readonly dtstart: DateTime; diff --git a/src/rrule.ts b/src/rrule.ts index 278129b..744eac3 100644 --- a/src/rrule.ts +++ b/src/rrule.ts @@ -1,5 +1,51 @@ import { DateTime } from './datetime'; -import { RRule as Rust, Frequency, NWeekday, Month, Weekday } from './lib'; +import { RRule as Rust } from './lib'; + +export interface NWeekday { + /** + * If set, this represents the nth occurrence of the weekday. + * Otherwise it represents every occurrence of the weekday. + * + * A negative value represents nth occurrence from the end. + */ + n?: number; + weekday: Weekday; +} + +export enum Frequency { + Yearly = 0, + Monthly = 1, + Weekly = 2, + Daily = 3, + Hourly = 4, + Minutely = 5, + Secondly = 6, +} + +export enum Month { + January = 0, + February = 1, + March = 2, + April = 3, + May = 4, + June = 5, + July = 6, + August = 7, + September = 8, + October = 9, + November = 10, + December = 11, +} + +export enum Weekday { + Monday = 0, + Tuesday = 1, + Wednesday = 2, + Thursday = 3, + Friday = 4, + Saturday = 5, + Sunday = 6, +} export interface RRuleLike { readonly frequency: Frequency; From 29d46cb724105b996df61253e93efb862ef2297f Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 21 May 2024 18:40:42 +0700 Subject: [PATCH 46/63] feat(datetime): introduce `utc` and `local` shorthands (#158) --- src/datetime.ts | 28 ++++++++++++++++++++++++++++ tests/datetime.spec.ts | 16 ++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/datetime.ts b/src/datetime.ts index f9ce094..77f8017 100644 --- a/src/datetime.ts +++ b/src/datetime.ts @@ -105,6 +105,34 @@ export class DateTime implements DateTimeLike { return new DateTime(numeric); } + /** + * This method is shorthand for `DateTime.create` with `utc` set to `false`. + */ + public static local( + year: number, + month: number, + day: number, + hour: number, + minute: number, + second: number, + ): DateTime { + return DateTime.create(year, month, day, hour, minute, second, false); + } + + /** + * This method is shorthand for `DateTime.create` with `utc` set to `true`. + */ + public static utc( + year: number, + month: number, + day: number, + hour: number, + minute: number, + second: number, + ): DateTime { + return DateTime.create(year, month, day, hour, minute, second, true); + } + /** * Creates a new DateTime object from the given plain object. */ diff --git a/tests/datetime.spec.ts b/tests/datetime.spec.ts index 74ad4cd..b7d561c 100644 --- a/tests/datetime.spec.ts +++ b/tests/datetime.spec.ts @@ -43,6 +43,22 @@ describe(DateTime, () => { }); }); + describe('utc', () => { + test('should create utc object from', () => { + const datetime = DateTime.utc(2005, 9, 4, 9, 1, 2); + + expect(datetime.utc).toBeTruthy(); + }); + }); + + describe('local', () => { + test('should create local object from', () => { + const datetime = DateTime.local(2005, 9, 4, 9, 1, 2); + + expect(datetime.utc).toBeFalsy(); + }); + }); + describe('fromObject', () => { test.each([ { From ea2395fc7a1fcf0c00cadf06aa48b579f8eafa58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 19:54:13 +0700 Subject: [PATCH 47/63] --- (#162) updated-dependencies: - dependency-name: napi-derive dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0fb4638..d5f0e96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,9 +204,9 @@ checksum = "e1c0f5d67ee408a4685b61f5ab7e58605c8ae3f2b4189f0127d804ff13d5560a" [[package]] name = "napi-derive" -version = "2.16.4" +version = "2.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb613535cde46cff231e53cd819c1694a32d48946bc2dda6b41174ace52ac08" +checksum = "e0e034ddf6155192cf83f267ede763fe6c164dfa9971585436b16173718d94c4" dependencies = [ "cfg-if", "convert_case", @@ -218,9 +218,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da041b19246ab4240998774e987fd9a7d92cc7406b91b5eddb6691e81feac044" +checksum = "bff2c00437f3b3266391eb5e6aa25d0029187daf5caf05b8e3271468fb5ae73e" dependencies = [ "convert_case", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index 9d38066..2ce06d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ chrono = "0.4.24" chrono-tz = "0.8.5" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix napi = { version = "2.16.6", default-features = false, features = ["napi5"] } -napi-derive = "2.16.4" +napi-derive = "2.16.5" replace_with = "0.1.7" rrule = { version = "0.12.0", features = ["exrule"] } From 4ca43f2e54c755eb94493cf5fe6b1889bdaa0a20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 May 2024 16:00:26 +0700 Subject: [PATCH 48/63] build(deps-dev): bump @types/node from 20.12.11 to 20.12.13 (#167) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.12.11 to 20.12.13. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a862cc..d5ef8f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2804,9 +2804,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", - "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "version": "20.12.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz", + "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" From a0cdcd00a57da92cf7962c19efc8be37c74fa671 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 1 Jun 2024 21:45:18 +0700 Subject: [PATCH 49/63] fix: implement rrule serialization (#164) closes #157 --- Cargo.lock | 23 ++ Cargo.toml | 3 +- lib/js/datetime.rs | 83 ++++++ lib/js/frequency.rs | 33 +++ lib/js/month.rs | 67 ++++- lib/js/n_weekday.rs | 59 +++++ lib/js/rrule.rs | 44 ++-- lib/js/rrule_set.rs | 157 +++++++---- lib/js/weekday.rs | 48 ++++ lib/lib.rs | 1 + lib/serialization.rs | 15 ++ lib/serialization/calendar.rs | 169 ++++++++++++ lib/serialization/properties.rs | 56 ++++ lib/serialization/property.rs | 204 +++++++++++++++ lib/serialization/rrule.rs | 376 +++++++++++++++++++++++++++ lib/serialization/rrule_set.rs | 155 +++++++++++ lib/serialization/to_string_array.rs | 23 ++ lib/serialization/to_vec.rs | 29 +++ tests/parsing.spec.ts | 73 ++++-- tests/weekly.spec.ts | 4 +- tests/yearly.spec.ts | 3 +- 21 files changed, 1503 insertions(+), 122 deletions(-) create mode 100644 lib/serialization.rs create mode 100644 lib/serialization/calendar.rs create mode 100644 lib/serialization/properties.rs create mode 100644 lib/serialization/property.rs create mode 100644 lib/serialization/rrule.rs create mode 100644 lib/serialization/rrule_set.rs create mode 100644 lib/serialization/to_string_array.rs create mode 100644 lib/serialization/to_vec.rs diff --git a/Cargo.lock b/Cargo.lock index d5f0e96..c06a560 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -117,6 +117,18 @@ dependencies = [ "syn", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -140,6 +152,16 @@ dependencies = [ "cc", ] +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -390,6 +412,7 @@ version = "0.0.0" dependencies = [ "chrono", "chrono-tz", + "indexmap", "napi", "napi-build", "napi-derive", diff --git a/Cargo.toml b/Cargo.toml index 2ce06d0..b6bccd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ path = "lib/lib.rs" [dependencies] chrono = "0.4.24" chrono-tz = "0.8.5" +indexmap = "2.2.6" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix napi = { version = "2.16.6", default-features = false, features = ["napi5"] } napi-derive = "2.16.5" @@ -21,4 +22,4 @@ napi-build = "2.0.1" [profile.release] lto = true -strip = "symbols" \ No newline at end of file +strip = "symbols" diff --git a/lib/js/datetime.rs b/lib/js/datetime.rs index 57ee29d..9386fee 100644 --- a/lib/js/datetime.rs +++ b/lib/js/datetime.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use chrono::Datelike; use chrono::TimeZone; use chrono::Timelike; @@ -13,6 +15,10 @@ pub struct DateTime { } impl DateTime { + pub fn utc(&self) -> bool { + self.utc + } + pub fn to_rrule_datetime( &self, timezone: &rrule::Tz, @@ -51,6 +57,21 @@ impl DateTime { } } +impl Into for DateTime { + fn into(self) -> String { + format!( + "{:04}{:02}{:02}T{:02}{:02}{:02}{}", + self.year, + self.month, + self.day, + self.hour, + self.minute, + self.second, + if self.utc { "Z" } else { "" } + ) + } +} + impl From for DateTime { fn from(numeric: i64) -> Self { let year = (numeric / 100000000000) as u32; @@ -114,3 +135,65 @@ impl Into for DateTime { + utc } } + +impl FromStr for DateTime { + type Err = String; + + fn from_str(str: &str) -> Result { + if str.len() > 16 || str.len() < 15 { + return Err(format!("Invalid datetime string: {}", str)); + } + + let year = str + .get(0..4) + .ok_or(format!("Can not extract year from: {}", str))?; + let year: u32 = year + .parse() + .map_err(|_| format!("Invalid year: {}", year))?; + + let month = str + .get(4..6) + .ok_or(format!("Can not extract month from: {}", str))?; + let month: u32 = month + .parse() + .map_err(|_| format!("Invalid month: {}", month))?; + + let day = str + .get(6..8) + .ok_or(format!("Can not extract day from: {}", str))?; + let day: u32 = day.parse().map_err(|_| format!("Invalid day: {}", day))?; + + let hour = str + .get(9..11) + .ok_or(format!("Can not extract hour from: {}", str))?; + let hour: u32 = hour + .parse() + .map_err(|_| format!("Invalid hour: {}", hour))?; + + let minute = str + .get(11..13) + .ok_or(format!("Can not extract minute from: {}", str))?; + let minute: u32 = minute + .parse() + .map_err(|_| format!("Invalid minute: {}", minute))?; + + let second = str + .get(13..15) + .ok_or(format!("Can not extract second from: {}", str))?; + let second: u32 = second + .parse() + .map_err(|_| format!("Invalid second: {}", second))?; + + let utc = str.get(15..16).unwrap_or("").to_uppercase() == "Z"; + + Ok(DateTime { + year, + month, + day, + hour, + minute, + second, + utc, + }) + } +} diff --git a/lib/js/frequency.rs b/lib/js/frequency.rs index b1adb69..40894d7 100644 --- a/lib/js/frequency.rs +++ b/lib/js/frequency.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use napi_derive::napi; #[napi(js_name = "Frequency")] @@ -38,3 +40,34 @@ impl Into for Frequency { } } } + +impl Into for Frequency { + fn into(self) -> String { + match self { + Frequency::Yearly => "YEARLY".to_string(), + Frequency::Monthly => "MONTHLY".to_string(), + Frequency::Weekly => "WEEKLY".to_string(), + Frequency::Daily => "DAILY".to_string(), + Frequency::Hourly => "HOURLY".to_string(), + Frequency::Minutely => "MINUTELY".to_string(), + Frequency::Secondly => "SECONDLY".to_string(), + } + } +} + +impl FromStr for Frequency { + type Err = String; + + fn from_str(str: &str) -> Result { + match &*str.to_uppercase() { + "DAILY" => Ok(Frequency::Daily), + "HOURLY" => Ok(Frequency::Hourly), + "MINUTELY" => Ok(Frequency::Minutely), + "MONTHLY" => Ok(Frequency::Monthly), + "SECONDLY" => Ok(Frequency::Secondly), + "WEEKLY" => Ok(Frequency::Weekly), + "YEARLY" => Ok(Frequency::Yearly), + _ => Err(format!("Invalid frequency: {}", str)), + } + } +} diff --git a/lib/js/month.rs b/lib/js/month.rs index 84f8d84..547fc07 100644 --- a/lib/js/month.rs +++ b/lib/js/month.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use napi_derive::napi; #[napi(js_name = "Month")] @@ -16,21 +18,62 @@ pub enum Month { December, } +impl ToString for Month { + fn to_string(&self) -> String { + match self { + Month::January => "1".to_string(), + Month::February => "2".to_string(), + Month::March => "3".to_string(), + Month::April => "4".to_string(), + Month::May => "5".to_string(), + Month::June => "6".to_string(), + Month::July => "7".to_string(), + Month::August => "8".to_string(), + Month::September => "9".to_string(), + Month::October => "10".to_string(), + Month::November => "11".to_string(), + Month::December => "12".to_string(), + } + } +} + +impl FromStr for Month { + type Err = String; + + fn from_str(month: &str) -> Result { + match month { + "1" => Ok(Month::January), + "2" => Ok(Month::February), + "3" => Ok(Month::March), + "4" => Ok(Month::April), + "5" => Ok(Month::May), + "6" => Ok(Month::June), + "7" => Ok(Month::July), + "8" => Ok(Month::August), + "9" => Ok(Month::September), + "10" => Ok(Month::October), + "11" => Ok(Month::November), + "12" => Ok(Month::December), + _ => Err(format!("Unknown month number: {}", month)), + } + } +} + impl From<&u8> for Month { fn from(month: &u8) -> Self { match month { - 0 => Month::January, - 1 => Month::February, - 2 => Month::March, - 3 => Month::April, - 4 => Month::May, - 5 => Month::June, - 6 => Month::July, - 7 => Month::August, - 8 => Month::September, - 9 => Month::October, - 10 => Month::November, - 11 => Month::December, + 1 => Month::January, + 2 => Month::February, + 3 => Month::March, + 4 => Month::April, + 5 => Month::May, + 6 => Month::June, + 7 => Month::July, + 8 => Month::August, + 9 => Month::September, + 10 => Month::October, + 11 => Month::November, + 12 => Month::December, _ => panic!("Unknown month index: {}", month), } } diff --git a/lib/js/n_weekday.rs b/lib/js/n_weekday.rs index 42c679d..635a4a9 100644 --- a/lib/js/n_weekday.rs +++ b/lib/js/n_weekday.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use super::weekday::Weekday; use napi_derive::napi; @@ -34,3 +36,60 @@ impl Into for NWeekday { } } } + +impl Into for &NWeekday { + fn into(self) -> String { + match self.n { + Some(n) => { + let n = if n > 1 || n < 0 { + n.to_string() + } else { + "".to_string() + }; + let weekday: String = self.weekday.into(); + + format!("{}{}", n, weekday) + } + None => self.weekday.into(), + } + } +} + +impl FromStr for NWeekday { + type Err = String; + + fn from_str(str: &str) -> Result { + let weekday = extract_weekday(str)?; + let n = if str.len() > 2 { + Some(extract_number(str)?) + } else { + None + }; + + Ok(NWeekday { n, weekday }) + } +} + +fn extract_weekday(str: &str) -> Result { + let weekday = str + .chars() + .rev() + .take(2) + .collect::() + .chars() + .rev() + .collect::(); + + weekday.parse() +} + +fn extract_number(str: &str) -> Result { + let number = str + .chars() + .take_while(|c| c.is_digit(10) || *c == '-') + .collect::(); + + number + .parse() + .map_err(|_| format!("Invalid number: {}", number)) +} diff --git a/lib/js/rrule.rs b/lib/js/rrule.rs index 8cb0efa..cde61be 100644 --- a/lib/js/rrule.rs +++ b/lib/js/rrule.rs @@ -1,5 +1,5 @@ use super::{Frequency, Month, NWeekday, Weekday}; -use chrono::{DateTime, Datelike, Local, Timelike}; +use chrono::{Datelike, Local, Timelike}; use napi::{bindgen_prelude::Array, Either, Env}; use napi_derive::napi; use replace_with::replace_with_or_abort; @@ -18,6 +18,10 @@ impl RRule { Ok(RRule { rrule }) } + pub fn from_rrule(rrule: rrule::RRule) -> napi::Result { + Ok(RRule { rrule }) + } + #[napi(factory)] pub fn create( env: Env, @@ -63,11 +67,9 @@ impl RRule { #[napi(factory, ts_return_type = "RRule")] pub fn parse(str: String) -> napi::Result { - let rrule: rrule::RRule = str - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + let rrule: Self = str.parse()?; - Ok(RRule { rrule }) + Ok(rrule) } #[napi(getter)] @@ -86,13 +88,15 @@ impl RRule { } #[napi(getter, ts_return_type = "NWeekday[]")] - pub fn by_weekday(&self) -> Vec { - return self - .rrule - .get_by_weekday() - .iter() - .map(|nday| NWeekday::from(*nday)) - .collect(); + pub fn by_weekday(&self) -> napi::Result> { + Ok( + self + .rrule + .get_by_weekday() + .iter() + .map(|nday| NWeekday::from(*nday)) + .collect(), + ) } #[napi(getter)] @@ -121,15 +125,11 @@ impl RRule { } #[napi(getter, ts_return_type = "Month[]")] - pub fn by_month(&self, env: Env) -> napi::Result { + pub fn by_month(&self) -> napi::Result> { let months = self.rrule.get_by_month(); - let mut arr = env.create_array(0)?; - - for month in months.iter() { - arr.insert(Month::from(month))?; - } + let months = months.iter().map(|month| Month::from(month)).collect(); - Ok(arr) + Ok(months) } #[napi(getter)] @@ -162,7 +162,7 @@ impl RRule { #[napi] pub fn to_string(&self) -> napi::Result { - Ok(self.rrule.to_string()) + Ok(self.into()) } #[napi] @@ -297,7 +297,7 @@ impl RRule { #[napi] pub fn set_until(&mut self, datetime: i64) -> napi::Result<&Self> { let datetime = super::DateTime::from(datetime); - let datetime: DateTime = + let datetime: chrono::DateTime = datetime.to_rrule_datetime(&rrule::Tz::Local(Local::now().timezone()))?; replace_with_or_abort(&mut self.rrule, |self_| self_.until(datetime)); @@ -307,7 +307,7 @@ impl RRule { pub fn validate( &self, - dtstart: DateTime, + dtstart: chrono::DateTime, ) -> napi::Result> { let mut rrule = self.rrule.clone(); diff --git a/lib/js/rrule_set.rs b/lib/js/rrule_set.rs index d2ce9cc..928d69d 100644 --- a/lib/js/rrule_set.rs +++ b/lib/js/rrule_set.rs @@ -1,4 +1,6 @@ -use super::RRule; +use crate::serialization::Calendar; + +use super::{DateTime, RRule}; use napi::bindgen_prelude::{Array, Reference, SharedReference}; use napi::iterator::Generator; use napi::Env; @@ -65,77 +67,63 @@ impl RRuleSet { } #[napi(getter)] - pub fn tzid(&self) -> napi::Result { - Ok(self.rrule_set.get_dt_start().timezone().to_string()) + pub fn tzid(&self) -> String { + self.rrule_set.get_dt_start().timezone().to_string() } #[napi(getter)] - pub fn dtstart(&self) -> napi::Result { + pub fn dtstart(&self) -> i64 { let dtstart = *self.rrule_set.get_dt_start(); let dtstart: i64 = super::DateTime::from(dtstart).into(); - Ok(dtstart) + dtstart } #[napi(getter, ts_return_type = "RRule[]")] - pub fn rrules(&self, env: Env) -> Array { - let mut arr = env.create_array(0).unwrap(); - let rrules = self.rrule_set.get_rrule(); - - for rrule in rrules.iter() { - arr.insert(RRule::from(to_unvalidated(rrule))).unwrap(); - } - - arr + pub fn rrules(&self) -> Vec { + self + .rrule_set + .get_rrule() + .iter() + .map(|rrule| RRule::from(to_unvalidated(rrule))) + .collect() } #[napi(getter, ts_return_type = "RRule[]")] - pub fn exrules(&self, env: Env) -> Array { - let mut arr = env.create_array(0).unwrap(); - let rrules = self.rrule_set.get_exrule(); - - for rrule in rrules.iter() { - arr.insert(RRule::from(to_unvalidated(rrule))).unwrap(); - } - - arr + pub fn exrules(&self) -> Vec { + self + .rrule_set + .get_exrule() + .iter() + .map(|rrule| RRule::from(to_unvalidated(rrule))) + .collect() } #[napi(getter, ts_return_type = "number[]")] - pub fn exdates(&self, env: Env) -> Array { - let mut arr = env.create_array(0).unwrap(); - let dates = self.rrule_set.get_exdate(); - - for date in dates.iter() { - let datetime: i64 = super::DateTime::from(*date).into(); - - arr.insert(datetime).unwrap(); - } - - arr + pub fn exdates(&self) -> Vec { + self + .rrule_set + .get_exdate() + .iter() + .map(|date| super::DateTime::from(*date).into()) + .collect() } #[napi(getter, ts_return_type = "number[]")] - pub fn rdates(&self, env: Env) -> Array { - let mut arr = env.create_array(0).unwrap(); - let dates = self.rrule_set.get_rdate(); - - for date in dates.iter() { - let datetime: i64 = super::DateTime::from(*date).into(); - - arr.insert(datetime).unwrap(); - } - - arr + pub fn rdates(&self) -> Vec { + self + .rrule_set + .get_rdate() + .iter() + .map(|date| super::DateTime::from(*date).into()) + .collect() } #[napi(factory, ts_return_type = "RRuleSet")] pub fn parse(str: String) -> napi::Result { - let rrule_set: rrule::RRuleSet = str - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + let set: Self = str.parse()?; - Ok(RRuleSet { rrule_set }) + Ok(set) } #[napi] @@ -153,11 +141,70 @@ impl RRuleSet { #[napi] pub fn set_from_string(&mut self, str: String) -> napi::Result<&Self> { - let rrule_set = self - .rrule_set - .clone() - .set_from_string(&str) - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + let calendar: Calendar = str.parse()?; + let (calendar_dtstarts, calendar_rrules, calendar_exrules, calendar_exdates, calendar_rdates) = + calendar.into(); + + if calendar_dtstarts.len() > 1 { + return Err(napi::Error::new( + napi::Status::GenericFailure, + "Only one DTSTART is allowed", + )); + } + + let mut rrule_set = self.rrule_set.clone(); + + if let Some((dtstart, tzid)) = calendar_dtstarts.first() { + let timezone: chrono_tz::Tz = tzid + .parse() + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + let datetime = DateTime::from(*dtstart); + let datetime = datetime + .to_rrule_datetime(&rrule::Tz::Tz(timezone))? + .with_timezone(&rrule::Tz::Tz(timezone)); + + rrule_set = rrule::RRuleSet::new(datetime); + + for rrule in self.rrule_set.get_rrule() { + rrule_set = rrule_set.rrule(rrule.clone()); + } + + for exrule in self.rrule_set.get_exrule() { + rrule_set = rrule_set.exrule(exrule.clone()); + } + + for exdate in self.rrule_set.get_exdate() { + rrule_set = rrule_set.exdate(*exdate); + } + + for rdate in self.rrule_set.get_rdate() { + rrule_set = rrule_set.rdate(*rdate); + } + } + + for rrule in calendar_rrules { + let dtstart = *self.rrule_set.get_dt_start(); + rrule_set = rrule_set.rrule(rrule.validate(dtstart)?); + } + + for rrule in calendar_exrules { + let dtstart = *self.rrule_set.get_dt_start(); + rrule_set = rrule_set.exrule(rrule.validate(dtstart)?); + } + + for exdate in calendar_exdates { + let timezone = self.rrule_set.get_dt_start().timezone(); + let datetime = super::DateTime::from(exdate).to_rrule_datetime(&timezone)?; + + rrule_set = rrule_set.exdate(datetime); + } + + for rdate in calendar_rdates { + let timezone = self.rrule_set.get_dt_start().timezone(); + let datetime = super::DateTime::from(rdate).to_rrule_datetime(&timezone)?; + + rrule_set = rrule_set.rdate(datetime); + } self.rrule_set = rrule_set; @@ -284,7 +331,7 @@ impl RRuleSet { #[napi] pub fn to_string(&self) -> napi::Result { - Ok(self.rrule_set.to_string()) + Ok(self.into()) } #[napi] diff --git a/lib/js/weekday.rs b/lib/js/weekday.rs index c40dc0c..9d22655 100644 --- a/lib/js/weekday.rs +++ b/lib/js/weekday.rs @@ -1,6 +1,9 @@ +use std::str::FromStr; + use napi_derive::napi; #[napi(js_name = "Weekday")] +#[derive(PartialEq)] pub enum Weekday { Monday, Tuesday, @@ -38,3 +41,48 @@ impl Into for Weekday { } } } + +impl Into for Weekday { + fn into(self) -> String { + match self { + Weekday::Monday => "MO".to_string(), + Weekday::Tuesday => "TU".to_string(), + Weekday::Wednesday => "WE".to_string(), + Weekday::Thursday => "TH".to_string(), + Weekday::Friday => "FR".to_string(), + Weekday::Saturday => "SA".to_string(), + Weekday::Sunday => "SU".to_string(), + } + } +} + +impl Into for &Weekday { + fn into(self) -> String { + match self { + Weekday::Monday => "MO".to_string(), + Weekday::Tuesday => "TU".to_string(), + Weekday::Wednesday => "WE".to_string(), + Weekday::Thursday => "TH".to_string(), + Weekday::Friday => "FR".to_string(), + Weekday::Saturday => "SA".to_string(), + Weekday::Sunday => "SU".to_string(), + } + } +} + +impl FromStr for Weekday { + type Err = String; + + fn from_str(str: &str) -> Result { + match &*str.to_uppercase() { + "MO" => Ok(Weekday::Monday), + "TU" => Ok(Weekday::Tuesday), + "WE" => Ok(Weekday::Wednesday), + "TH" => Ok(Weekday::Thursday), + "FR" => Ok(Weekday::Friday), + "SA" => Ok(Weekday::Saturday), + "SU" => Ok(Weekday::Sunday), + _ => Err(format!("Invalid weekday: {}", str)), + } + } +} diff --git a/lib/lib.rs b/lib/lib.rs index aaf074e..2d3e399 100644 --- a/lib/lib.rs +++ b/lib/lib.rs @@ -1 +1,2 @@ mod js; +mod serialization; diff --git a/lib/serialization.rs b/lib/serialization.rs new file mode 100644 index 0000000..ac333c4 --- /dev/null +++ b/lib/serialization.rs @@ -0,0 +1,15 @@ +mod calendar; +mod properties; +mod property; +mod rrule; +mod rrule_set; +mod to_string_array; +mod to_vec; + +pub use calendar::*; +pub use properties::*; +pub use property::*; +pub use rrule::*; +pub use rrule_set::*; +pub use to_string_array::*; +pub use to_vec::*; diff --git a/lib/serialization/calendar.rs b/lib/serialization/calendar.rs new file mode 100644 index 0000000..0570fb4 --- /dev/null +++ b/lib/serialization/calendar.rs @@ -0,0 +1,169 @@ +use super::{Parameters, Properties, Property}; +use crate::js::{DateTime, RRule}; +use crate::serialization::to_vec::ToVec; +use std::str::FromStr; + +pub struct Calendar { + dtstarts: Vec<(i64, String)>, + rrules: Vec, + exrules: Vec, + exdates: Vec, + rdates: Vec, +} + +impl + Into<( + Vec<(i64, String)>, + Vec, + Vec, + Vec, + Vec, + )> for Calendar +{ + fn into( + self, + ) -> ( + Vec<(i64, String)>, + Vec, + Vec, + Vec, + Vec, + ) { + ( + self.dtstarts, + self.rrules, + self.exrules, + self.exdates, + self.rdates, + ) + } +} + +impl FromStr for Calendar { + type Err = napi::Error; + + fn from_str(str: &str) -> Result { + let properties = + Properties::from_str(str).map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + let mut dtstarts: Vec<(i64, String)> = Vec::new(); + let mut rrules: Vec = Vec::new(); + let mut exrules: Vec = Vec::new(); + let mut exdates: Vec = Vec::new(); + let mut rdates: Vec = Vec::new(); + + for property in properties { + match property.name() { + "DTSTART" => { + let (datetime, tzid) = property_to_dtstart(&property) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + dtstarts.push((datetime, tzid)); + } + "RRULE" => { + let rrule = RRule::try_from(property)?; + rrules.push(rrule); + } + "EXRULE" => { + let rrule = RRule::try_from(property)?; + exrules.push(rrule); + } + "EXDATE" => { + if let Some(value) = property.parameters().get("VALUE") { + if value == "DATE" { + return Err(napi::Error::new( + napi::Status::GenericFailure, + "Unsupported EXDATE value: DATE", + )); + } else if value != "DATE-TIME" { + return Err(napi::Error::new( + napi::Status::GenericFailure, + format!("Unsupported EXDATE value: {}", value), + )); + } + } + + let value = match property.value() { + Parameters::Single(value) => value, + Parameters::Multiple(_) => { + return Err(napi::Error::new( + napi::Status::GenericFailure, + "Invalid EXDATE", + )); + } + }; + + let dates: Vec = value.as_str().to_vec()?; + + for date in dates { + exdates.push(date.into()); + } + } + "RDATE" => { + if let Some(value) = property.parameters().get("VALUE") { + if value == "DATE" { + return Err(napi::Error::new( + napi::Status::GenericFailure, + "Unsupported RDATE value: DATE. Only DATE-TIME is supported", + )); + } else if value != "DATE-TIME" { + return Err(napi::Error::new( + napi::Status::GenericFailure, + format!("Unsupported RDATE value: {}", value), + )); + } + } + + let value = match property.value() { + Parameters::Single(value) => value, + Parameters::Multiple(_) => { + return Err(napi::Error::new( + napi::Status::GenericFailure, + "Invalid RDATE", + )); + } + }; + + let dates: Vec = value.as_str().to_vec()?; + + for date in dates { + rdates.push(date.into()); + } + } + _ => { + // ignore unsupported properties + } + } + } + + Ok(Calendar { + dtstarts, + rrules, + exrules, + exdates, + rdates, + }) + } +} + +fn property_to_dtstart(property: &Property) -> Result<(i64, String), String> { + let datetime = match property.value() { + Parameters::Single(value) => value, + Parameters::Multiple(_) => return Err("Invalid DTSTART value".to_string()), + }; + let datetime: DateTime = datetime.parse()?; + + let tzid = match property.parameters().get("TZID") { + Some(value) => value.to_string(), + None => { + if datetime.utc() { + "UTC".to_string() + } else { + return Err("TZID is requred for non-UTC DTSTART".to_string()); + } + } + }; + let datetime: i64 = datetime.into(); + + Ok((datetime, tzid)) +} diff --git a/lib/serialization/properties.rs b/lib/serialization/properties.rs new file mode 100644 index 0000000..7dd8944 --- /dev/null +++ b/lib/serialization/properties.rs @@ -0,0 +1,56 @@ +use super::property::{Error, Property}; + +pub struct Properties { + items: Vec, +} + +impl Properties { + pub fn new() -> Self { + Properties { items: Vec::new() } + } + + pub fn push(&mut self, property: Property) { + self.items.push(property); + } + + pub fn to_string(&self) -> String { + let mut string = String::new(); + let mut iter = self.items.iter(); + + if let Some(property) = iter.next() { + string.push_str(&property.to_string()); + } + + for property in iter { + string.push('\n'); + string.push_str(&property.to_string()); + } + + string + } + + pub fn from_str(str: &str) -> Result { + let mut items = Vec::new(); + + for property_string in str.lines() { + let property_string = property_string.trim(); + + if property_string.is_empty() { + continue; + } + + items.push(Property::from_string(property_string)?); + } + + Ok(Properties { items }) + } +} + +impl IntoIterator for Properties { + type Item = Property; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.items.into_iter() + } +} diff --git a/lib/serialization/property.rs b/lib/serialization/property.rs new file mode 100644 index 0000000..dc746f7 --- /dev/null +++ b/lib/serialization/property.rs @@ -0,0 +1,204 @@ +use indexmap::IndexMap; +use std::fmt; + +pub enum Parameters { + Single(String), + Multiple(IndexMap), +} + +#[derive(Debug)] +pub enum Error { + InvalidProperty(String), + InvalidParameter(String), + InvalidParameters(String), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Error::InvalidProperty(str) => write!(f, "Invalid property: {}", str), + Error::InvalidParameter(str) => write!(f, "Invalid parameter: {}", str), + Error::InvalidParameters(str) => write!(f, "Invalid parameters: {}", str), + } + } +} + +pub struct Property { + name: String, + parameters: IndexMap, + value: Parameters, +} + +impl Property { + pub fn name(&self) -> &str { + &self.name + } + + pub fn parameters(&self) -> &IndexMap { + &self.parameters + } + + pub fn value(&self) -> &Parameters { + &self.value + } + + pub fn to_string(&self) -> String { + let mut string = format!("{}", self.name); + + for (key, value) in self.parameters() { + string.push_str(&format!(";{}={}", key, value)); + } + + string.push_str(":"); + + match &self.value { + Parameters::Single(value) => string.push_str(value), + Parameters::Multiple(values) => { + let mut values = values.iter(); + + if let Some((key, value)) = values.next() { + string.push_str(&format!("{}={}", key, value)); + + for (key, value) in values { + string.push_str(&format!(";{}={}", key, value)); + } + } + } + } + + string + } + + pub fn new(name: String, parameters: IndexMap, value: Parameters) -> Property { + Property { + name, + parameters, + value, + } + } + + pub fn from_string(str: &str) -> Result { + let key_value: Vec<&str> = str.trim().split(':').collect(); + + if key_value.len() != 2 { + return Err(Error::InvalidProperty(str.to_string())); + } + + let (name, parameters) = Self::parse_name(key_value[0].trim())?; + let value = Self::parse_parameters(key_value[1].trim())?; + + if let Parameters::Single(_) = parameters { + return Err(Error::InvalidParameters(key_value[0].to_string())); + } + + match parameters { + Parameters::Multiple(parameters) => Ok(Property { + name, + parameters, + value, + }), + Parameters::Single(_) => Err(Error::InvalidParameters(key_value[0].to_string())), + } + } + + fn parse_name(str: &str) -> Result<(String, Parameters), Error> { + let name_params: Vec<&str> = str.split(';').take(2).collect(); + + let name = name_params[0].trim().to_uppercase(); + let params = Self::parse_parameters(name_params.get(1).unwrap_or(&"").trim())?; + + Ok((name, params)) + } + + fn parse_parameters(str: &str) -> Result { + let mut params = IndexMap::new(); + let param_strings = str.split(';'); + + for param_string in param_strings { + let param_string = param_string.trim(); + let (key, value) = Self::parse_parameter(param_string)?; + + if let Some(name) = key { + params.insert(name.to_uppercase(), value.to_string()); + } else if params.len() == 0 && param_string.len() > 0 { + return Ok(Parameters::Single(param_string.to_string())); + } else if params.len() > 0 { + return Err(Error::InvalidParameters(str.to_string())); + } + } + + Ok(Parameters::Multiple(params)) + } + + fn parse_parameter(str: &str) -> Result<(Option, &str), Error> { + let key_value: Vec<&str> = str.split('=').collect(); + + if key_value.len() == 1 { + return Ok((None, key_value[0].trim())); + } else if key_value.len() > 2 { + return Err(Error::InvalidParameter(str.to_string())); + } + + Ok(( + Some(key_value[0].trim().to_uppercase()), + key_value[1].trim(), + )) + } +} + +#[cfg(test)] +mod tests { + use super::Property; + + #[test] + fn test_rrule() { + let property = Property::from_string("RRULE:FREQ=DAILY;INTERVAL=1").unwrap(); + + assert_eq!(property.name(), "RRULE"); + assert_eq!(property.parameters().len(), 0); + assert!(matches!(property.value(), super::Parameters::Multiple(params) if params.len() == 2)); + assert!( + matches!(property.value(), super::Parameters::Multiple(params) if params["FREQ"] == "DAILY") + ); + assert!( + matches!(property.value(), super::Parameters::Multiple(params) if params["INTERVAL"] == "1") + ); + } + + #[test] + fn test_exdate() { + let property = Property::from_string("EXDATE;VALUE=DATE-TIME:19980313T090000Z").unwrap(); + + assert_eq!(property.name(), "EXDATE"); + assert_eq!(property.parameters().len(), 1); + assert_eq!(property.parameters()["VALUE"], "DATE-TIME"); + assert!( + matches!(property.value(), super::Parameters::Single(value) if value == &"19980313T090000Z") + ); + } + + #[test] + fn test_key_value() { + let property = Property::from_string("KEY:VALUE").unwrap(); + + assert_eq!(property.name(), "KEY"); + assert_eq!(property.parameters().len(), 0); + assert!(matches!(property.value(), super::Parameters::Single(value) if value == &"VALUE")); + } + + #[test] + fn test_rrule_to_string() { + let rrule_strings = vec![ + "RRULE:FREQ=DAILY;INTERVAL=1", + "RRULE:FREQ=DAILY;UNTIL=20220101T000000Z;INTERVAL=1", + "RRULE:INTERVAL=1", + "RRULE:INTERVAL=1", + ]; + + rrule_strings.iter().for_each(|rrule_string| { + let property = Property::from_string(rrule_string).unwrap(); + + assert_eq!(property.to_string(), rrule_string.to_string()); + }); + } +} diff --git a/lib/serialization/rrule.rs b/lib/serialization/rrule.rs new file mode 100644 index 0000000..ab2d92e --- /dev/null +++ b/lib/serialization/rrule.rs @@ -0,0 +1,376 @@ +use indexmap::IndexMap; + +use super::{Parameters, Property}; +use crate::js::{DateTime, Frequency, NWeekday, RRule, Weekday}; +use crate::serialization::to_string_array::ToStringArray; +use crate::serialization::to_vec::ToVec; +use std::str::FromStr; + +impl Into for &RRule { + fn into(self) -> Property { + let mut value: IndexMap = IndexMap::new(); + + if let Ok(freq) = self.frequency() { + value.insert("FREQ".to_string(), freq.into()); + } + + if let Ok(count) = self.count() { + if let Some(count) = count { + value.insert("COUNT".to_string(), count.to_string()); + } + } + + if let Ok(until) = self.until() { + if let Some(until) = until { + let datetime = DateTime::from(until); + value.insert("UNTIL".to_string(), datetime.into()); + } + } + + if let Ok(interval) = self.interval() { + if interval > 1 { + value.insert("INTERVAL".to_string(), interval.to_string()); + } + } + + if let Ok(weekstart) = self.weekstart() { + if weekstart != Weekday::Monday { + value.insert("WKST".to_string(), weekstart.into()); + } + } + + if let Ok(by_setpos) = self.by_setpos() { + if (by_setpos.len() > 0) { + // TODO: use to_string_array + let by_month: Vec = by_setpos.iter().map(|month| month.to_string()).collect(); + value.insert("BYSETPOS".to_string(), by_month.join(",")); + } + } + + if let Ok(by_month) = self.by_month() { + if (by_month.len() > 0) { + // TODO: use to_string_array + let by_month: Vec = by_month.iter().map(|month| month.to_string()).collect(); + value.insert("BYMONTH".to_string(), by_month.join(",")); + } + } + + if let Ok(by_monthday) = self.by_monthday() { + if (by_monthday.len() > 0) { + value.insert( + "BYMONTHDAY".to_string(), + by_monthday.iter().to_string_array(), + ); + } + } + + if let Ok(by_weekno) = self.by_weekno() { + if (by_weekno.len() > 0) { + // TODO: use to_string_array + let by_weekno: Vec = by_weekno.iter().map(|month| month.to_string()).collect(); + value.insert("BYWEEKNO".to_string(), by_weekno.join(",")); + } + } + + if let Ok(by_hour) = self.by_hour() { + if (by_hour.len() > 0) { + value.insert("BYHOUR".to_string(), by_hour.iter().to_string_array()); + } + } + + if let Ok(by_minute) = self.by_minute() { + if (by_minute.len() > 0) { + value.insert("BYMINUTE".to_string(), by_minute.iter().to_string_array()); + } + } + + if let Ok(by_second) = self.by_second() { + if (by_second.len() > 0) { + value.insert("BYSECOND".to_string(), by_second.iter().to_string_array()); + } + } + + if let Ok(by_yearday) = self.by_yearday() { + if (by_yearday.len() > 0) { + // TODO: use to_string_array + let by_yearday: Vec = by_yearday.iter().map(|month| month.to_string()).collect(); + value.insert("BYYEARDAY".to_string(), by_yearday.join(",")); + } + } + + if let Ok(by_weekday) = self.by_weekday() { + if (by_weekday.len() > 0) { + let by_weekday: Vec = by_weekday + .iter() + .map(|n_weekday| { + let n_weekday: String = n_weekday.into(); + + n_weekday + }) + .collect(); + + value.insert("BYDAY".to_string(), by_weekday.join(",")); + } + } + + Property::new( + "RRULE".to_string(), + IndexMap::new(), + Parameters::Multiple(value), + ) + } +} + +impl Into for &RRule { + fn into(self) -> String { + let property: Property = self.into(); + + property.to_string()[6..].to_string() + } +} + +impl TryFrom for RRule { + type Error = napi::Error; + + fn try_from(property: Property) -> Result { + if property.name() != "RRULE" && property.name() != "EXRULE" { + return Err(napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid property name: {}", property.name()), + )); + } + + let value = match property.value() { + Parameters::Multiple(value) => value, + Parameters::Single(value) => { + return Err(napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid {}: {}", property.name(), value), + )) + } + }; + + let rrule = rrule::RRule::new(rrule::Frequency::Daily); + + let rrule = match value.get("FREQ") { + Some(value) => { + let freq = value.parse::().map_err(|err| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid FREQ value: {}", value), + ) + })?; + + rrule.freq(freq.into()) + } + None => rrule, + }; + + let rrule = match value.get("INTERVAL") { + Some(value) => { + let interval = value.parse::().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid INTERVAL value: {}", value), + ) + })?; + + rrule.interval(interval) + } + None => rrule, + }; + + let rrule = match value.get("UNTIL") { + Some(value) => { + let until: DateTime = value.parse().map_err(|err| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid UNTIL value: {}", value), + ) + })?; + + rrule.until(until.to_rrule_datetime(&rrule::Tz::Local(chrono::Local::now().timezone()))?) + } + None => rrule, + }; + + let rrule = match value.get("COUNT") { + Some(value) => { + let count = value.parse::().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid COUNT value: {}", value), + ) + })?; + + rrule.count(count) + } + None => rrule, + }; + + let rrule = match value.get("BYHOUR") { + Some(value) => { + let by_hour: Vec = value.as_str().to_vec().map_err(|err| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYHOUR value: {}", value), + ) + })?; + + rrule.by_hour(by_hour) + } + None => rrule, + }; + + let rrule = match value.get("BYMINUTE") { + Some(value) => { + let by_minute: Vec = value.as_str().to_vec().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYMINUTE value: {}", value), + ) + })?; + + rrule.by_minute(by_minute) + } + None => rrule, + }; + + let rrule = match value.get("BYSECOND") { + Some(value) => { + let by_second: Vec = value.as_str().to_vec().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYSECOND value: {}", value), + ) + })?; + + rrule.by_second(by_second) + } + None => rrule, + }; + + let rrule = match value.get("BYMONTH") { + Some(value) => { + let by_month: Vec = value.as_str().to_vec().map_err(|err| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYMONTH value: {}", value), + ) + })?; + + rrule.by_month(&by_month) + } + None => rrule, + }; + + let rrule = match value.get("WKST") { + Some(value) => { + let week_start = value.parse::().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid WKST value: {}", value), + ) + })?; + + rrule.week_start(week_start.into()) + } + None => rrule, + }; + + let rrule = match value.get("BYDAY") { + Some(value) => { + let week_day: Vec = value.as_str().to_vec().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYDAY value: {}", value), + ) + })?; + let week_day = week_day + .into_iter() + .map(|n_weekday| n_weekday.into()) + .collect(); + + rrule.by_weekday(week_day) + } + None => rrule, + }; + + let rrule = match value.get("BYSETPOS") { + Some(value) => { + let by_setpos: Vec = value.as_str().to_vec().map_err(|err| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYSETPOS value: {}", value), + ) + })?; + + rrule.by_set_pos(by_setpos) + } + None => rrule, + }; + + let rrule = match value.get("BYMONTHDAY") { + Some(value) => { + let by_monthday: Vec = value.as_str().to_vec().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYMONTHDAY value: {}", value), + ) + })?; + + rrule.by_month_day(by_monthday) + } + None => rrule, + }; + + let rrule = match value.get("BYYEARDAY") { + Some(value) => { + let by_yearday: Vec = value.as_str().to_vec().map_err(|err| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYYEARDAY value: {}", value), + ) + })?; + + rrule.by_year_day(by_yearday) + } + None => rrule, + }; + + let rrule = match value.get("BYWEEKNO") { + Some(value) => { + let by_weekno: Vec = value.as_str().to_vec().map_err(|err| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Invalid BYWEEKNO value: {}", value), + ) + })?; + + rrule.by_week_no(by_weekno) + } + None => rrule, + }; + + Ok(Self::from_rrule(rrule)?) + } +} + +impl FromStr for RRule { + type Err = napi::Error; + + fn from_str(str: &str) -> Result { + let str = if !str.to_uppercase().starts_with("RRULE:") { + format!("RRULE:{}", str) + } else { + str.to_string() + }; + + let property = crate::serialization::Property::from_string(&str) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; + + let rrule = RRule::try_from(property)?; + + Ok(rrule) + } +} diff --git a/lib/serialization/rrule_set.rs b/lib/serialization/rrule_set.rs new file mode 100644 index 0000000..e0a2dd0 --- /dev/null +++ b/lib/serialization/rrule_set.rs @@ -0,0 +1,155 @@ +use indexmap::IndexMap; + +use crate::serialization::to_vec::ToVec; +use std::str::FromStr; + +use super::{Calendar, Parameters, Properties, Property}; +use crate::js::{DateTime, RRule, RRuleSet}; + +impl FromStr for RRuleSet { + type Err = napi::Error; + + fn from_str(str: &str) -> Result { + let mut dtstart: Option<(i64, String)> = None; + let mut rrules: Vec = Vec::new(); + let mut exrules: Vec = Vec::new(); + let mut exdates: Vec = Vec::new(); + let mut rdates: Vec = Vec::new(); + + let calendar = Calendar::from_str(str)?; + let (calendar_dtstarts, calendar_rrules, calendar_exrules, calendar_exdates, calendar_rdates) = + calendar.into(); + + if calendar_dtstarts.len() > 1 { + return Err(napi::Error::new( + napi::Status::GenericFailure, + "Only one DTSTART is allowed", + )); + } + + dtstart = calendar_dtstarts + .first() + .and_then(|item| Some(item.clone())); + + let (dtstart, tzid) = match dtstart { + Some(value) => value, + None => { + return Err(napi::Error::new( + napi::Status::GenericFailure, + "DTSTART is required", + )); + } + }; + + for rrule in calendar_rrules { + rrules.push(rrule); + } + + for exrule in calendar_exrules { + exrules.push(exrule); + } + + for exdate in calendar_exdates { + exdates.push(exdate); + } + + for rdate in calendar_rdates { + rdates.push(rdate); + } + + return Self::create( + dtstart, + tzid, + Some(rrules.iter().collect()), + Some(exrules.iter().collect()), + Some(exdates), + Some(rdates), + ); + } +} + +impl Into for &RRuleSet { + fn into(self) -> String { + let mut properties = Properties::new(); + let mut dtstart_parameters: IndexMap = IndexMap::new(); + dtstart_parameters.insert("TZID".to_string(), self.tzid()); + + let dtstart_value: String = DateTime::from(self.dtstart()).into(); + + properties.push(Property::new( + "DTSTART".to_string(), + dtstart_parameters, + Parameters::Single(dtstart_value), + )); + + for rrule in self.rrules().iter() { + properties.push(rrule.into()); + } + + for exrule in self.exrules().iter() { + properties.push(exrule.into()); + } + + if !self.exdates().is_empty() { + properties.push(Property::new( + "EXDATE".to_string(), + IndexMap::new(), + Parameters::Single( + self + .exdates() + .into_iter() + .map(|date| { + let date: DateTime = date.into(); + let date: String = date.into(); + + date + }) + .collect(), + ), + )); + } + + if !self.rdates().is_empty() { + properties.push(Property::new( + "RDATE".to_string(), + IndexMap::new(), + Parameters::Single( + self + .rdates() + .into_iter() + .map(|date| { + let date: DateTime = date.into(); + let date: String = date.into(); + + date + }) + .collect(), + ), + )); + } + + properties.to_string() + } +} + +fn property_to_dtstart(property: &Property) -> Result<(i64, String), String> { + let datetime = match property.value() { + Parameters::Single(value) => value, + Parameters::Multiple(_) => return Err("Invalid DTSTART value".to_string()), + }; + let datetime: DateTime = datetime.parse()?; + + let tzid = match property.parameters().get("TZID") { + Some(value) => value.to_string(), + None => { + if datetime.utc() { + "UTC".to_string() + } else { + return Err("TZID is requred for non-UTC DTSTART".to_string()); + } + } + }; + let datetime: i64 = datetime.into(); + + Ok((datetime, tzid)) +} diff --git a/lib/serialization/to_string_array.rs b/lib/serialization/to_string_array.rs new file mode 100644 index 0000000..e697cf7 --- /dev/null +++ b/lib/serialization/to_string_array.rs @@ -0,0 +1,23 @@ +pub trait ToStringArray +where + T: ToString, + V: Iterator, +{ + fn to_string_array(self) -> String; +} + +impl ToStringArray for V +where + T: ToString, + V: Iterator, +{ + fn to_string_array(self) -> String { + let mut data: Vec = Vec::new(); + + for item in self { + data.push(item.to_string()); + } + + data.join(",") + } +} diff --git a/lib/serialization/to_vec.rs b/lib/serialization/to_vec.rs new file mode 100644 index 0000000..9b9178d --- /dev/null +++ b/lib/serialization/to_vec.rs @@ -0,0 +1,29 @@ +use napi::Error; +use std::{any::type_name, str::FromStr}; + +pub trait ToVec +where + T: FromStr, +{ + fn to_vec(&self) -> Result, Error>; +} + +impl ToVec for &str +where + T: FromStr, +{ + fn to_vec(&self) -> Result, Error> { + let mut data = Vec::new(); + + for item in self.split(',') { + data.push(item.parse().map_err(|_| { + napi::Error::new( + napi::Status::GenericFailure, + format!("Couldn't convert {} to {}", item, type_name::()), + ) + })?) + } + + Ok(data) + } +} diff --git a/tests/parsing.spec.ts b/tests/parsing.spec.ts index f7a1449..28be037 100644 --- a/tests/parsing.spec.ts +++ b/tests/parsing.spec.ts @@ -7,7 +7,7 @@ test('Should properly parse weekly recurrence', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', ); }); @@ -24,28 +24,26 @@ test('Should properly parse monthly recurrence', () => { test('Should throw error on missing start date', () => { expect(() => RRuleSet.parse('FREQ=monthly;COUNT=10;INTERVAL=2')).toThrowError( - 'RRule parsing error: Missing start date. There needs to be a unique start date which the iteration can start from.', + 'Invalid property: FREQ=monthly;COUNT=10;INTERVAL=2', ); }); test('Should throw error on invalid rule set', () => { expect(() => RRuleSet.parse('Invalid')).toThrowError( - 'RRule parsing error: `Invalid` is a malformed property parameter. Parameter should be specified as `key=value`', + 'Invalid property: Invalid', ); }); test('Should throw error on invalid timezone', () => { expect(() => RRuleSet.parse('DTSTART;TZID=Invalid:19970907T090000'), - ).toThrowError('RRule parsing error: `Invalid` is not a valid timezone.'); + ).toThrowError(`'Invalid' is not a valid timezone`); }); test('Should throw error on invalid recurrence rule', () => { expect(() => RRuleSet.parse('DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:Invalid'), - ).toThrowError( - 'RRule parsing error: `Invalid` is a malformed property parameter. Parameter should be specified as `key=value`', - ); + ).toThrowError('Invalid RRULE: Invalid'); }); test('Should throw error on invalid frequency', () => { @@ -53,7 +51,7 @@ test('Should throw error on invalid frequency', () => { RRuleSet.parse( 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=Invalid', ), - ).toThrowError('RRule parsing error: `INVALID` is not a valid frequency.'); + ).toThrowError('Invalid FREQ value: Invalid'); }); test('Should throw error on invalid interval', () => { @@ -61,9 +59,7 @@ test('Should throw error on invalid interval', () => { RRuleSet.parse( 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;INTERVAL=Invalid', ), - ).toThrowError( - 'RRule parsing error: `Invalid` is not a valid INTERVAL value.', - ); + ).toThrowError('Invalid INTERVAL value: Invalid'); }); test('Should throw error on invalid count', () => { @@ -71,7 +67,7 @@ test('Should throw error on invalid count', () => { RRuleSet.parse( 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;COUNT=Invalid', ), - ).toThrowError('RRule parsing error: `Invalid` is not a valid COUNT value.'); + ).toThrowError('Invalid COUNT value: Invalid'); }); test('Should throw error on invalid until', () => { @@ -79,9 +75,7 @@ test('Should throw error on invalid until', () => { RRuleSet.parse( 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;UNTIL=Invalid', ), - ).toThrowError( - 'RRule parsing error: `Invalid` is not a valid datetime format for `UNTIL`.', - ); + ).toThrowError('Invalid UNTIL value: Invalid'); }); test('Should throw error on invalid week start', () => { @@ -89,9 +83,7 @@ test('Should throw error on invalid week start', () => { RRuleSet.parse( 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;WKST=Invalid', ), - ).toThrowError( - 'RRule parsing error: `Invalid` is not a valid weekday start. Valid values are `MO`, `TU`, `WE`, `TH`, `FR`, `SA` and `SU`.', - ); + ).toThrowError('Invalid WKST value: Invalid'); }); test('Should properly parse weekly individual recurrence rule', () => { @@ -111,7 +103,7 @@ test('Should properly parse weekly individual recurrence rule', () => { const asString = rule.toString(); expect(asString).toBe( - 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYDAY=MO,WE,FR', + 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYDAY=MO,WE,FR', ); }); @@ -122,7 +114,7 @@ test('Should properly parse individual recurrence rule with RRULE prefix', () => const asString = rule.toString(); expect(asString).toBe( - 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYDAY=MO,WE,FR', + 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYDAY=MO,WE,FR', ); }); @@ -140,32 +132,30 @@ test('Should properly parse monthly individual recurrence rule', () => { }); test('Should throw error on invalid individual recurrence rule', () => { - expect(() => RRule.parse('Invalid')).toThrowError( - 'RRule parsing error: `Invalid` is a malformed property parameter. Parameter should be specified as `key=value', - ); + expect(() => RRule.parse('Invalid')).toThrowError('Invalid RRULE: Invalid'); }); test('Should throw error on invalid individual recurrence rule frequency', () => { expect(() => RRule.parse('FREQ=Invalid')).toThrowError( - 'RRule parsing error: `INVALID` is not a valid frequency.', + 'Invalid FREQ value: Invalid', ); }); test('Should throw error on invalid individual recurrence rule interval', () => { expect(() => RRule.parse('FREQ=DAILY;INTERVAL=Invalid')).toThrowError( - 'RRule parsing error: `Invalid` is not a valid INTERVAL value.', + 'Invalid INTERVAL value: Invalid', ); }); test('Should throw error on invalid individual recurrence rule until', () => { expect(() => RRule.parse('FREQ=DAILY;UNTIL=Invalid')).toThrowError( - 'RRule parsing error: `Invalid` is not a valid datetime format for `UNTIL`.', + 'Invalid UNTIL value: Invalid', ); }); test('Should throw error on invalid individual recurrence rule week start', () => { expect(() => RRule.parse('FREQ=DAILY;WKST=Invalid')).toThrowError( - 'RRule parsing error: `Invalid` is not a valid weekday start. Valid values are `MO`, `TU`, `WE`, `TH`, `FR`, `SA` and `SU`.', + 'Invalid WKST value: Invalid', ); }); @@ -178,6 +168,33 @@ test('Should be able to parse rule set without dtstart', () => { ); expect(set.toString()).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + ); +}); + +test('Should parse dtstart from string', () => { + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).setFromString( + 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', + ); + + expect(set.toString()).toBe( + 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + ); +}); + +test('Should add rrule with until', () => { + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).setFromString( + 'RRULE:FREQ=WEEKLY;WKST=MO;UNTIL=20220513T000000;BYDAY=FR,TH,TU,WE', + ); + + expect(set.toString()).toBe( + // TODO: return until in local timezone + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=20220513T040000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU,WE,TH,FR', ); }); diff --git a/tests/weekly.spec.ts b/tests/weekly.spec.ts index 162324e..8fd92c2 100644 --- a/tests/weekly.spec.ts +++ b/tests/weekly.spec.ts @@ -78,7 +78,7 @@ test('Every other week - limit 10', () => { const dates = set.all(10); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -109,7 +109,7 @@ test('Every other week on Monday, Wednesday and Friday until December 24, 1997, const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T050000Z;INTERVAL=2;WKST=Sun;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T050000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', ); expect(dates).toEqual([ // TODO: rrule crate does not include dtstart date (873205200000), create a bug report diff --git a/tests/yearly.spec.ts b/tests/yearly.spec.ts index 8a467d6..931222d 100644 --- a/tests/yearly.spec.ts +++ b/tests/yearly.spec.ts @@ -184,8 +184,7 @@ test('Every Friday the 13th, limit 5', () => { expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\n' + 'RRULE:FREQ=YEARLY;BYMONTHDAY=13;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR\n' + - // TODO: it should not contain Z in the end. Create a bug report. - 'EXDATE;VALUE=DATE-TIME:19980313T090000Z', + 'EXDATE:19980313T090000', ); expect(dates).toEqual([ DateTime.create(1998, 2, 13, 9, 0, 0, false), From 7ff6e794674ff97f9c1f91970e619fe40263749f Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 7 Jun 2024 23:30:50 +0700 Subject: [PATCH 50/63] feat: make js depend on own rrule (#172) * feat: make js depend on own rrule * docs: update readme --- Cargo.lock | 16 + Cargo.toml | 1 + README.md | 2 +- benchmark/index.ts | 1 + lib/js.rs | 21 +- lib/js/frequency.rs | 72 ++--- lib/js/month.rs | 101 ++---- lib/js/n_weekday.rs | 90 +----- lib/js/rrule.rs | 345 +++++---------------- lib/js/rrule_set.rs | 439 ++++++++++----------------- lib/js/weekday.rs | 87 ++---- lib/lib.rs | 3 +- lib/rrule.rs | 10 + lib/rrule/calendar.rs | 113 +++++++ lib/{js => rrule}/datetime.rs | 154 +++++----- lib/rrule/dtstart.rs | 79 +++++ lib/rrule/frequency.rs | 90 ++++++ lib/rrule/month.rs | 103 +++++++ lib/rrule/n_weekday.rs | 90 ++++++ lib/rrule/rrule.rs | 363 ++++++++++++++++++++++ lib/rrule/rrule_set.rs | 274 +++++++++++++++++ lib/rrule/weekday.rs | 89 ++++++ lib/serialization.rs | 18 +- lib/serialization/calendar.rs | 169 ----------- lib/serialization/parameters.rs | 84 +++++ lib/serialization/properties.rs | 10 + lib/serialization/property.rs | 98 ++---- lib/serialization/rrule.rs | 376 ----------------------- lib/serialization/rrule_set.rs | 155 ---------- lib/serialization/to_string_array.rs | 23 -- lib/serialization/to_vec.rs | 29 -- src/lib/index.d.ts | 47 +-- src/lib/index.js | 5 +- src/rrule-set.ts | 15 +- src/rrule.ts | 26 +- tests/daily.spec.ts | 16 +- tests/monthly.spec.ts | 20 +- tests/parsing.spec.ts | 22 +- tests/weekly.spec.ts | 8 +- tests/yearly.spec.ts | 16 +- 40 files changed, 1838 insertions(+), 1842 deletions(-) create mode 100644 lib/rrule.rs create mode 100644 lib/rrule/calendar.rs rename lib/{js => rrule}/datetime.rs (84%) create mode 100644 lib/rrule/dtstart.rs create mode 100644 lib/rrule/frequency.rs create mode 100644 lib/rrule/month.rs create mode 100644 lib/rrule/n_weekday.rs create mode 100644 lib/rrule/rrule.rs create mode 100644 lib/rrule/rrule_set.rs create mode 100644 lib/rrule/weekday.rs delete mode 100644 lib/serialization/calendar.rs create mode 100644 lib/serialization/parameters.rs delete mode 100644 lib/serialization/rrule.rs delete mode 100644 lib/serialization/rrule_set.rs delete mode 100644 lib/serialization/to_string_array.rs delete mode 100644 lib/serialization/to_vec.rs diff --git a/Cargo.lock b/Cargo.lock index c06a560..6f76d1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -117,6 +117,12 @@ dependencies = [ "syn", ] +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + [[package]] name = "equivalent" version = "1.0.1" @@ -162,6 +168,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -413,6 +428,7 @@ dependencies = [ "chrono", "chrono-tz", "indexmap", + "itertools", "napi", "napi-build", "napi-derive", diff --git a/Cargo.toml b/Cargo.toml index b6bccd3..067593a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ path = "lib/lib.rs" chrono = "0.4.24" chrono-tz = "0.8.5" indexmap = "2.2.6" +itertools = "0.13.0" # Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix napi = { version = "2.16.6", default-features = false, features = ["napi5"] } napi-derive = "2.16.5" diff --git a/README.md b/README.md index a7a94cd..1a38532 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/lsndr/rrule-rust/blob/master/LICENSE.md) -`rrule-rust` is a [napi-rs](https://napi.rs) wrapper around Rust's [rrule](https://crates.io/crates/rrule) crate +`rrule-rust` is a library for working with recurrence rules based on Rust's [rrule](https://crates.io/crates/rrule) crate 1. [Quick Start](#quick-start) diff --git a/benchmark/index.ts b/benchmark/index.ts index 2b81103..1bf298b 100644 --- a/benchmark/index.ts +++ b/benchmark/index.ts @@ -37,6 +37,7 @@ function suite(tzid: string) { count: 30, interval: 1, }); + const set = new node.RRuleSet(); set.rrule(rrule); diff --git a/lib/js.rs b/lib/js.rs index 76b4cc4..dfa0a88 100644 --- a/lib/js.rs +++ b/lib/js.rs @@ -1,15 +1,6 @@ -mod datetime; -mod frequency; -mod month; -mod n_weekday; -mod rrule; -mod rrule_set; -mod weekday; - -pub use datetime::DateTime; -pub use frequency::Frequency; -pub use month::Month; -pub use n_weekday::NWeekday; -pub use rrule::RRule; -pub use rrule_set::RRuleSet; -pub use weekday::Weekday; +pub mod frequency; +pub mod month; +pub mod n_weekday; +pub mod rrule; +pub mod rrule_set; +pub mod weekday; diff --git a/lib/js/frequency.rs b/lib/js/frequency.rs index 40894d7..4aa555c 100644 --- a/lib/js/frequency.rs +++ b/lib/js/frequency.rs @@ -1,5 +1,4 @@ -use std::str::FromStr; - +use crate::rrule::frequency; use napi_derive::napi; #[napi(js_name = "Frequency")] @@ -13,61 +12,30 @@ pub enum Frequency { Secondly, } -impl From for Frequency { - fn from(freq: rrule::Frequency) -> Self { - match freq { - rrule::Frequency::Daily => Frequency::Daily, - rrule::Frequency::Hourly => Frequency::Hourly, - rrule::Frequency::Minutely => Frequency::Minutely, - rrule::Frequency::Monthly => Frequency::Monthly, - rrule::Frequency::Secondly => Frequency::Secondly, - rrule::Frequency::Weekly => Frequency::Weekly, - rrule::Frequency::Yearly => Frequency::Yearly, - } - } -} - -impl Into for Frequency { - fn into(self) -> rrule::Frequency { +impl Into for Frequency { + fn into(self) -> frequency::Frequency { match self { - Frequency::Daily => rrule::Frequency::Daily, - Frequency::Hourly => rrule::Frequency::Hourly, - Frequency::Minutely => rrule::Frequency::Minutely, - Frequency::Monthly => rrule::Frequency::Monthly, - Frequency::Secondly => rrule::Frequency::Secondly, - Frequency::Weekly => rrule::Frequency::Weekly, - Frequency::Yearly => rrule::Frequency::Yearly, + Frequency::Yearly => frequency::Frequency::Yearly, + Frequency::Monthly => frequency::Frequency::Monthly, + Frequency::Weekly => frequency::Frequency::Weekly, + Frequency::Daily => frequency::Frequency::Daily, + Frequency::Hourly => frequency::Frequency::Hourly, + Frequency::Minutely => frequency::Frequency::Minutely, + Frequency::Secondly => frequency::Frequency::Secondly, } } } -impl Into for Frequency { - fn into(self) -> String { - match self { - Frequency::Yearly => "YEARLY".to_string(), - Frequency::Monthly => "MONTHLY".to_string(), - Frequency::Weekly => "WEEKLY".to_string(), - Frequency::Daily => "DAILY".to_string(), - Frequency::Hourly => "HOURLY".to_string(), - Frequency::Minutely => "MINUTELY".to_string(), - Frequency::Secondly => "SECONDLY".to_string(), - } - } -} - -impl FromStr for Frequency { - type Err = String; - - fn from_str(str: &str) -> Result { - match &*str.to_uppercase() { - "DAILY" => Ok(Frequency::Daily), - "HOURLY" => Ok(Frequency::Hourly), - "MINUTELY" => Ok(Frequency::Minutely), - "MONTHLY" => Ok(Frequency::Monthly), - "SECONDLY" => Ok(Frequency::Secondly), - "WEEKLY" => Ok(Frequency::Weekly), - "YEARLY" => Ok(Frequency::Yearly), - _ => Err(format!("Invalid frequency: {}", str)), +impl From<&frequency::Frequency> for Frequency { + fn from(frequency: &frequency::Frequency) -> Self { + match frequency { + frequency::Frequency::Yearly => Frequency::Yearly, + frequency::Frequency::Monthly => Frequency::Monthly, + frequency::Frequency::Weekly => Frequency::Weekly, + frequency::Frequency::Daily => Frequency::Daily, + frequency::Frequency::Hourly => Frequency::Hourly, + frequency::Frequency::Minutely => Frequency::Minutely, + frequency::Frequency::Secondly => Frequency::Secondly, } } } diff --git a/lib/js/month.rs b/lib/js/month.rs index 547fc07..a7c792a 100644 --- a/lib/js/month.rs +++ b/lib/js/month.rs @@ -1,5 +1,4 @@ -use std::str::FromStr; - +use crate::rrule::month; use napi_derive::napi; #[napi(js_name = "Month")] @@ -18,82 +17,40 @@ pub enum Month { December, } -impl ToString for Month { - fn to_string(&self) -> String { +impl Into for Month { + fn into(self) -> month::Month { match self { - Month::January => "1".to_string(), - Month::February => "2".to_string(), - Month::March => "3".to_string(), - Month::April => "4".to_string(), - Month::May => "5".to_string(), - Month::June => "6".to_string(), - Month::July => "7".to_string(), - Month::August => "8".to_string(), - Month::September => "9".to_string(), - Month::October => "10".to_string(), - Month::November => "11".to_string(), - Month::December => "12".to_string(), - } - } -} - -impl FromStr for Month { - type Err = String; - - fn from_str(month: &str) -> Result { - match month { - "1" => Ok(Month::January), - "2" => Ok(Month::February), - "3" => Ok(Month::March), - "4" => Ok(Month::April), - "5" => Ok(Month::May), - "6" => Ok(Month::June), - "7" => Ok(Month::July), - "8" => Ok(Month::August), - "9" => Ok(Month::September), - "10" => Ok(Month::October), - "11" => Ok(Month::November), - "12" => Ok(Month::December), - _ => Err(format!("Unknown month number: {}", month)), + Month::January => month::Month::January, + Month::February => month::Month::February, + Month::March => month::Month::March, + Month::April => month::Month::April, + Month::May => month::Month::May, + Month::June => month::Month::June, + Month::July => month::Month::July, + Month::August => month::Month::August, + Month::September => month::Month::September, + Month::October => month::Month::October, + Month::November => month::Month::November, + Month::December => month::Month::December, } } } -impl From<&u8> for Month { - fn from(month: &u8) -> Self { +impl From<&month::Month> for Month { + fn from(month: &month::Month) -> Self { match month { - 1 => Month::January, - 2 => Month::February, - 3 => Month::March, - 4 => Month::April, - 5 => Month::May, - 6 => Month::June, - 7 => Month::July, - 8 => Month::August, - 9 => Month::September, - 10 => Month::October, - 11 => Month::November, - 12 => Month::December, - _ => panic!("Unknown month index: {}", month), - } - } -} - -impl Into for Month { - fn into(self) -> chrono::Month { - match self { - Month::January => chrono::Month::January, - Month::February => chrono::Month::February, - Month::March => chrono::Month::March, - Month::April => chrono::Month::April, - Month::May => chrono::Month::May, - Month::June => chrono::Month::June, - Month::July => chrono::Month::July, - Month::August => chrono::Month::August, - Month::September => chrono::Month::September, - Month::October => chrono::Month::October, - Month::November => chrono::Month::November, - Month::December => chrono::Month::December, + month::Month::January => Month::January, + month::Month::February => Month::February, + month::Month::March => Month::March, + month::Month::April => Month::April, + month::Month::May => Month::May, + month::Month::June => Month::June, + month::Month::July => Month::July, + month::Month::August => Month::August, + month::Month::September => Month::September, + month::Month::October => Month::October, + month::Month::November => Month::November, + month::Month::December => Month::December, } } } diff --git a/lib/js/n_weekday.rs b/lib/js/n_weekday.rs index 635a4a9..7734640 100644 --- a/lib/js/n_weekday.rs +++ b/lib/js/n_weekday.rs @@ -1,95 +1,27 @@ -use std::str::FromStr; - use super::weekday::Weekday; +use crate::rrule::n_weekday; use napi_derive::napi; #[napi(object, js_name = "NWeekday")] pub struct NWeekday { - /// If set, this represents the nth occurrence of the weekday. - /// Otherwise it represents every occurrence of the weekday. - /// - /// A negative value represents nth occurrence from the end. pub n: Option, pub weekday: Weekday, } -impl From for NWeekday { - fn from(nday: rrule::NWeekday) -> Self { - match nday { - rrule::NWeekday::Every(weekday) => NWeekday { - n: None, - weekday: Weekday::from(weekday), - }, - rrule::NWeekday::Nth(n, weekday) => NWeekday { - n: Some(n), - weekday: weekday.into(), - }, +impl Into for NWeekday { + fn into(self) -> n_weekday::NWeekday { + n_weekday::NWeekday { + n: self.n, + weekday: self.weekday.into(), } } } -impl Into for NWeekday { - fn into(self) -> rrule::NWeekday { - match self.n { - Some(n) => rrule::NWeekday::Nth(n, self.weekday.into()), - None => rrule::NWeekday::Every(self.weekday.into()), +impl From<&n_weekday::NWeekday> for NWeekday { + fn from(n_weekday: &n_weekday::NWeekday) -> Self { + Self { + n: n_weekday.n, + weekday: (&n_weekday.weekday).into(), } } } - -impl Into for &NWeekday { - fn into(self) -> String { - match self.n { - Some(n) => { - let n = if n > 1 || n < 0 { - n.to_string() - } else { - "".to_string() - }; - let weekday: String = self.weekday.into(); - - format!("{}{}", n, weekday) - } - None => self.weekday.into(), - } - } -} - -impl FromStr for NWeekday { - type Err = String; - - fn from_str(str: &str) -> Result { - let weekday = extract_weekday(str)?; - let n = if str.len() > 2 { - Some(extract_number(str)?) - } else { - None - }; - - Ok(NWeekday { n, weekday }) - } -} - -fn extract_weekday(str: &str) -> Result { - let weekday = str - .chars() - .rev() - .take(2) - .collect::() - .chars() - .rev() - .collect::(); - - weekday.parse() -} - -fn extract_number(str: &str) -> Result { - let number = str - .chars() - .take_while(|c| c.is_digit(10) || *c == '-') - .collect::(); - - number - .parse() - .map_err(|_| format!("Invalid number: {}", number)) -} diff --git a/lib/js/rrule.rs b/lib/js/rrule.rs index cde61be..0833b0e 100644 --- a/lib/js/rrule.rs +++ b/lib/js/rrule.rs @@ -1,356 +1,169 @@ -use super::{Frequency, Month, NWeekday, Weekday}; -use chrono::{Datelike, Local, Timelike}; -use napi::{bindgen_prelude::Array, Either, Env}; +use super::{frequency::Frequency, month::Month, n_weekday::NWeekday, weekday::Weekday}; +use crate::rrule::{datetime, n_weekday, rrule}; +use napi::Either; use napi_derive::napi; -use replace_with::replace_with_or_abort; #[napi(js_name = "RRule")] pub struct RRule { - rrule: rrule::RRule, + rrule: rrule::RRule, } #[napi] impl RRule { #[napi(constructor)] - pub fn new(frequency: Frequency) -> napi::Result { - let rrule = rrule::RRule::new(frequency.into()); - - Ok(RRule { rrule }) - } - - pub fn from_rrule(rrule: rrule::RRule) -> napi::Result { - Ok(RRule { rrule }) - } - - #[napi(factory)] - pub fn create( - env: Env, - frequency: Option, + pub fn new( + frequency: Frequency, interval: Option, count: Option, - #[napi(ts_arg_type = "(readonly (NWeekday | Weekday)[]) | undefined | null")] - by_weekday: Option>>, + weekstart: Option, + until: Option, + #[napi(ts_arg_type = "(readonly (NWeekday | Weekday)[]) | undefined | null")] by_day: Option< + Vec>, + >, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_hour: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_minute: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_second: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_monthday: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_setpos: Option>, - #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_month: Option, + #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_month: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_weekno: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_yearday: Option>, - weekstart: Option, - until: Option, ) -> napi::Result { - let mut rrule = Self::new(frequency.unwrap_or(Frequency::Daily))?; - rrule.set_interval(interval.unwrap_or(1))?; - rrule.set_by_weekday(by_weekday.unwrap_or_else(|| Vec::new()))?; - rrule.set_by_hour(by_hour.unwrap_or_else(|| Vec::new()))?; - rrule.set_by_minute(by_minute.unwrap_or_else(|| Vec::new()))?; - rrule.set_by_second(by_second.unwrap_or_else(|| Vec::new()))?; - rrule.set_by_monthday(by_monthday.unwrap_or_else(|| Vec::new()))?; - rrule.set_by_setpos(by_setpos.unwrap_or_else(|| Vec::new()))?; - rrule.set_by_month(by_month.unwrap_or_else(|| env.create_array(0).unwrap()))?; - rrule.set_by_weekno(by_weekno.unwrap_or_else(|| Vec::new()))?; - rrule.set_by_yearday(by_yearday.unwrap_or_else(|| Vec::new()))?; - rrule.set_weekstart(weekstart.unwrap_or(Weekday::Monday))?; - - if let Some(until) = until { - rrule.set_until(until)?; - } - - if let Some(count) = count { - rrule.set_count(count)?; - } + let mut rrule = rrule::RRule::new(frequency.into()); + rrule = rrule.set_interval(interval); + rrule = rrule.set_count(count); + rrule = rrule.set_until(until.map(|datetime| datetime::DateTime::from(datetime))); + rrule = rrule.set_by_hour(by_hour.unwrap_or_default()); + rrule = rrule.set_by_minute(by_minute.unwrap_or_default()); + rrule = rrule.set_by_second(by_second.unwrap_or_default()); + rrule = rrule.set_by_monthday(by_monthday.unwrap_or_default()); + rrule = rrule.set_by_setpos(by_setpos.unwrap_or_default()); + rrule = rrule.set_by_month( + by_month + .unwrap_or_default() + .into_iter() + .map(|month| month.into()) + .collect(), + ); + rrule = rrule.set_by_weekno(by_weekno.unwrap_or_default()); + rrule = rrule.set_by_yearday(by_yearday.unwrap_or_default()); + rrule = rrule.set_weekstart(weekstart.map(|weekday| weekday.into())); + rrule = rrule.set_by_day( + by_day + .unwrap_or_default() + .into_iter() + .map(|day| match day { + Either::A(nday) => nday.into(), + Either::B(weekday) => n_weekday::NWeekday { + n: None, + weekday: weekday.into(), + }, + }) + .collect(), + ); - Ok(rrule) + Ok(Self { rrule }) } #[napi(factory, ts_return_type = "RRule")] pub fn parse(str: String) -> napi::Result { - let rrule: Self = str.parse()?; + let rrule = rrule::RRule::from_str(&str) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - Ok(rrule) + Ok(Self { rrule }) } #[napi(getter)] pub fn frequency(&self) -> napi::Result { - Ok(Frequency::from(self.rrule.get_freq())) + Ok(self.rrule.frequency().into()) } #[napi(getter)] - pub fn interval(&self) -> napi::Result { - Ok(self.rrule.get_interval()) + pub fn interval(&self) -> napi::Result> { + Ok(self.rrule.interval()) } #[napi(getter)] pub fn count(&self) -> napi::Result> { - Ok(self.rrule.get_count()) + Ok(self.rrule.count()) } #[napi(getter, ts_return_type = "NWeekday[]")] - pub fn by_weekday(&self) -> napi::Result> { - Ok( - self - .rrule - .get_by_weekday() - .iter() - .map(|nday| NWeekday::from(*nday)) - .collect(), - ) + pub fn by_day(&self) -> napi::Result> { + Ok(self.rrule.by_day().iter().map(|nday| nday.into()).collect()) } #[napi(getter)] pub fn by_hour(&self) -> napi::Result> { - Ok(self.rrule.get_by_hour().to_vec()) + Ok(self.rrule.by_hour().clone()) } #[napi(getter)] pub fn by_minute(&self) -> napi::Result> { - Ok(self.rrule.get_by_minute().to_vec()) + Ok(self.rrule.by_minute().clone()) } #[napi(getter)] pub fn by_second(&self) -> napi::Result> { - Ok(self.rrule.get_by_second().to_vec()) + Ok(self.rrule.by_second().clone()) } #[napi(getter)] pub fn by_monthday(&self) -> napi::Result> { - Ok(self.rrule.get_by_month_day().to_vec()) + Ok(self.rrule.by_monthday().clone()) } #[napi(getter)] pub fn by_setpos(&self) -> napi::Result> { - Ok(self.rrule.get_by_set_pos().to_vec()) + Ok(self.rrule.by_setpos().clone()) } #[napi(getter, ts_return_type = "Month[]")] pub fn by_month(&self) -> napi::Result> { - let months = self.rrule.get_by_month(); - let months = months.iter().map(|month| Month::from(month)).collect(); - - Ok(months) + Ok( + self + .rrule + .by_month() + .iter() + .map(|month| month.into()) + .collect(), + ) } #[napi(getter)] pub fn by_weekno(&self) -> napi::Result> { - Ok(self.rrule.get_by_week_no().to_vec()) + Ok(self.rrule.by_weekno().clone()) } #[napi(getter)] pub fn by_yearday(&self) -> napi::Result> { - Ok(self.rrule.get_by_year_day().to_vec()) + Ok(self.rrule.by_yearday().clone()) } #[napi(getter)] - pub fn weekstart(&self) -> napi::Result { - Ok(Weekday::from(self.rrule.get_week_start())) + pub fn weekstart(&self) -> napi::Result> { + Ok(self.rrule.weekstart().map(|weekstart| weekstart.into())) } #[napi(getter)] pub fn until(&self) -> napi::Result> { - Ok(match self.rrule.get_until() { - Some(until) => { - let datetime = super::DateTime::from(*until); - let datetime: i64 = datetime.into(); - - Some(datetime) - } - None => None, - }) + Ok(self.rrule.until().map(|datetime| datetime.into())) } #[napi] pub fn to_string(&self) -> napi::Result { - Ok(self.into()) - } - - #[napi] - pub fn set_interval(&mut self, interval: u16) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.interval(interval)); - - Ok(self) - } - - #[napi] - pub fn set_count(&mut self, count: u32) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.count(count)); - - Ok(self) - } - - #[napi] - pub fn set_by_weekday( - &mut self, - #[napi(ts_arg_type = "readonly (NWeekday | Weekday)[]")] weekdays: Vec< - Either, - >, - ) -> napi::Result<&Self> { - let by_weekday = weekdays - .into_iter() - .map(|weekday| match weekday { - Either::A(nday) => nday.into(), - Either::B(weekday) => rrule::NWeekday::Every(weekday.into()), - }) - .collect(); - - replace_with_or_abort(&mut self.rrule, |self_| self_.by_weekday(by_weekday)); - - Ok(self) - } - - #[napi] - pub fn set_by_hour( - &mut self, - #[napi(ts_arg_type = "readonly number[]")] hours: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_hour(hours)); - - Ok(self) - } - - #[napi] - pub fn set_by_minute( - &mut self, - #[napi(ts_arg_type = "readonly number[]")] minutes: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_minute(minutes)); - - Ok(self) - } - - #[napi] - pub fn set_by_second( - &mut self, - #[napi(ts_arg_type = "readonly number[]")] seconds: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_second(seconds)); - - Ok(self) - } - - #[napi] - pub fn set_by_monthday( - &mut self, - #[napi(ts_arg_type = "readonly number[]")] days: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_month_day(days)); - - Ok(self) - } - - #[napi] - pub fn set_by_setpos( - &mut self, - #[napi(ts_arg_type = "readonly number[]")] poses: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_set_pos(poses)); - - Ok(self) - } - - #[napi] - pub fn set_by_month( - &mut self, - #[napi(ts_arg_type = "readonly Month[]")] months: Array, - ) -> napi::Result<&Self> { - let mut vec: Vec = Vec::new(); - - for i in 0..months.len() { - let month: Month = months.get(i).unwrap().unwrap(); - - vec.push(month.into()); - } - - replace_with_or_abort(&mut self.rrule, |self_| self_.by_month(&vec)); - - Ok(self) - } - - #[napi] - pub fn set_by_weekno( - &mut self, - #[napi(ts_arg_type = "readonly number[]")] week_numbers: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_week_no(week_numbers)); - - Ok(self) - } - - #[napi] - pub fn set_by_yearday( - &mut self, - #[napi(ts_arg_type = "readonly number[]")] days: Vec, - ) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.by_year_day(days)); - - Ok(self) - } - - #[napi] - pub fn set_weekstart(&mut self, day: Weekday) -> napi::Result<&Self> { - replace_with_or_abort(&mut self.rrule, |self_| self_.week_start(day.into())); - - Ok(self) - } - - #[napi] - pub fn set_until(&mut self, datetime: i64) -> napi::Result<&Self> { - let datetime = super::DateTime::from(datetime); - let datetime: chrono::DateTime = - datetime.to_rrule_datetime(&rrule::Tz::Local(Local::now().timezone()))?; - - replace_with_or_abort(&mut self.rrule, |self_| self_.until(datetime)); - - Ok(self) - } - - pub fn validate( - &self, - dtstart: chrono::DateTime, - ) -> napi::Result> { - let mut rrule = self.rrule.clone(); - - if let Some(until) = rrule.get_until() { - let until = if until.timezone() == rrule::Tz::LOCAL { - self.convert_to_timezone(until, dtstart.timezone()) - } else { - *until - }; - - let datetime = until.with_timezone(&rrule::Tz::UTC); - - rrule = rrule.until(datetime); - } - - let rrule = rrule - .validate(dtstart) - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - - Ok(rrule) + Ok(self.rrule.to_string()) } +} - fn convert_to_timezone( - &self, - datetime: &chrono::DateTime, - timezone: Tz, - ) -> chrono::DateTime { - timezone - .with_ymd_and_hms( - datetime.year(), - datetime.month(), - datetime.day(), - datetime.hour(), - datetime.minute(), - datetime.second(), - ) - .single() - .unwrap() +impl Into for &RRule { + fn into(self) -> rrule::RRule { + self.rrule.clone() } } -impl From> for RRule { - fn from(rrule: rrule::RRule) -> Self { +impl From for RRule { + fn from(rrule: rrule::RRule) -> Self { Self { rrule } } } diff --git a/lib/js/rrule_set.rs b/lib/js/rrule_set.rs index 928d69d..b2756b0 100644 --- a/lib/js/rrule_set.rs +++ b/lib/js/rrule_set.rs @@ -1,254 +1,157 @@ -use crate::serialization::Calendar; - -use super::{DateTime, RRule}; +use super::rrule::RRule; +use crate::rrule::datetime::DateTime; +use crate::rrule::dtstart::DtStart; +use crate::rrule::{rrule, rrule_set}; use napi::bindgen_prelude::{Array, Reference, SharedReference}; use napi::iterator::Generator; use napi::Env; use napi_derive::napi; -use replace_with::replace_with_or_abort; +use replace_with::replace_with_or_abort_and_return; #[napi(js_name = "RRuleSet")] pub struct RRuleSet { - rrule_set: rrule::RRuleSet, + rrule_set: rrule_set::RRuleSet, } #[napi] impl RRuleSet { #[napi(constructor)] - pub fn new(dtstart: i64, tzid: String) -> napi::Result { - let timezone: chrono_tz::Tz = tzid - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - let datetime = super::DateTime::from(dtstart); - let datetime = datetime - .to_rrule_datetime(&rrule::Tz::Tz(timezone))? - .with_timezone(&rrule::Tz::Tz(timezone)); - let rrule_set = rrule::RRuleSet::new(datetime); - - Ok(RRuleSet { rrule_set }) - } - - #[napi(factory)] - pub fn create( + pub fn new( dtstart: i64, - tzid: String, + tzid: Option, #[napi(ts_arg_type = "(readonly RRule[]) | undefined | null")] rrules: Option>, #[napi(ts_arg_type = "(readonly RRule[]) | undefined | null")] exrules: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] exdates: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] rdates: Option>, ) -> napi::Result { - let mut set = Self::new(dtstart, tzid)?; - - if let Some(rrules) = rrules { - for rrule in rrules.iter() { - set.add_rrule(rrule)?; - } - } - - if let Some(exrules) = exrules { - for rrule in exrules.iter() { - set.add_exrule(rrule)?; - } - } - - if let Some(exdates) = exdates { - for datetime in exdates.iter() { - set.add_exdate(*datetime)?; - } - } - - if let Some(rdates) = rdates { - for datetime in rdates.iter() { - set.add_rdate(*datetime)?; - } - } + let tzid: Option = match tzid { + Some(tzid) => Some( + tzid + .parse() + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?, + ), + None => None, + }; + + let dtstart = DtStart::new(dtstart.into(), tzid) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - Ok(set) + let rrules: Vec = rrules + .unwrap_or_default() + .into_iter() + .map(|rrule| rrule.into()) + .collect(); + + let exrules: Vec = exrules + .unwrap_or_default() + .into_iter() + .map(|rrule| rrule.into()) + .collect(); + + let exdates: Vec = exdates + .unwrap_or_default() + .into_iter() + .map(Into::into) + .collect(); + + let rdates: Vec = rdates + .unwrap_or_default() + .into_iter() + .map(Into::into) + .collect(); + + let rrule_set = rrule_set::RRuleSet::new(dtstart) + .set_rrules(rrules) + .set_exrules(exrules) + .set_exdates(exdates) + .set_rdates(rdates); + + Ok(Self { rrule_set }) } #[napi(getter)] - pub fn tzid(&self) -> String { - self.rrule_set.get_dt_start().timezone().to_string() + pub fn tzid(&self) -> napi::Result> { + Ok( + self + .rrule_set + .dtstart() + .tzid() + .and_then(|tzid| Some(tzid.to_string())), + ) } #[napi(getter)] - pub fn dtstart(&self) -> i64 { - let dtstart = *self.rrule_set.get_dt_start(); - let dtstart: i64 = super::DateTime::from(dtstart).into(); - - dtstart + pub fn dtstart(&self) -> napi::Result { + Ok(self.rrule_set.dtstart().datetime().into()) } #[napi(getter, ts_return_type = "RRule[]")] - pub fn rrules(&self) -> Vec { - self - .rrule_set - .get_rrule() - .iter() - .map(|rrule| RRule::from(to_unvalidated(rrule))) - .collect() + pub fn rrules(&self) -> napi::Result> { + Ok( + self + .rrule_set + .rrules() + .iter() + .map(|rrule| rrule.clone().into()) + .collect(), + ) } #[napi(getter, ts_return_type = "RRule[]")] - pub fn exrules(&self) -> Vec { - self - .rrule_set - .get_exrule() - .iter() - .map(|rrule| RRule::from(to_unvalidated(rrule))) - .collect() + pub fn exrules(&self) -> napi::Result> { + Ok( + self + .rrule_set + .exrules() + .into_iter() + .map(|rrule| rrule.clone().into()) + .collect(), + ) } #[napi(getter, ts_return_type = "number[]")] - pub fn exdates(&self) -> Vec { - self - .rrule_set - .get_exdate() - .iter() - .map(|date| super::DateTime::from(*date).into()) - .collect() + pub fn exdates(&self) -> napi::Result> { + Ok( + self + .rrule_set + .exdates() + .iter() + .map(|date| date.into()) + .collect(), + ) } #[napi(getter, ts_return_type = "number[]")] - pub fn rdates(&self) -> Vec { - self - .rrule_set - .get_rdate() - .iter() - .map(|date| super::DateTime::from(*date).into()) - .collect() + pub fn rdates(&self) -> napi::Result> { + Ok( + self + .rrule_set + .rdates() + .iter() + .map(|date| date.into()) + .collect(), + ) } #[napi(factory, ts_return_type = "RRuleSet")] pub fn parse(str: String) -> napi::Result { - let set: Self = str.parse()?; - - Ok(set) - } - - #[napi] - pub fn set_dtstart(&mut self, str: String) -> napi::Result<&Self> { - let rrule_set = self - .rrule_set - .clone() - .set_from_string(&str) + let rrule_set: rrule_set::RRuleSet = str + .parse() .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - self.rrule_set = rrule_set; - - Ok(self) + Ok(Self { rrule_set }) } - #[napi] - pub fn set_from_string(&mut self, str: String) -> napi::Result<&Self> { - let calendar: Calendar = str.parse()?; - let (calendar_dtstarts, calendar_rrules, calendar_exrules, calendar_exdates, calendar_rdates) = - calendar.into(); - - if calendar_dtstarts.len() > 1 { - return Err(napi::Error::new( - napi::Status::GenericFailure, - "Only one DTSTART is allowed", - )); - } - - let mut rrule_set = self.rrule_set.clone(); - - if let Some((dtstart, tzid)) = calendar_dtstarts.first() { - let timezone: chrono_tz::Tz = tzid - .parse() - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - let datetime = DateTime::from(*dtstart); - let datetime = datetime - .to_rrule_datetime(&rrule::Tz::Tz(timezone))? - .with_timezone(&rrule::Tz::Tz(timezone)); - - rrule_set = rrule::RRuleSet::new(datetime); - - for rrule in self.rrule_set.get_rrule() { - rrule_set = rrule_set.rrule(rrule.clone()); - } - - for exrule in self.rrule_set.get_exrule() { - rrule_set = rrule_set.exrule(exrule.clone()); - } - - for exdate in self.rrule_set.get_exdate() { - rrule_set = rrule_set.exdate(*exdate); - } - - for rdate in self.rrule_set.get_rdate() { - rrule_set = rrule_set.rdate(*rdate); - } - } - - for rrule in calendar_rrules { - let dtstart = *self.rrule_set.get_dt_start(); - rrule_set = rrule_set.rrule(rrule.validate(dtstart)?); - } - - for rrule in calendar_exrules { - let dtstart = *self.rrule_set.get_dt_start(); - rrule_set = rrule_set.exrule(rrule.validate(dtstart)?); - } - - for exdate in calendar_exdates { - let timezone = self.rrule_set.get_dt_start().timezone(); - let datetime = super::DateTime::from(exdate).to_rrule_datetime(&timezone)?; - - rrule_set = rrule_set.exdate(datetime); - } - - for rdate in calendar_rdates { - let timezone = self.rrule_set.get_dt_start().timezone(); - let datetime = super::DateTime::from(rdate).to_rrule_datetime(&timezone)?; + #[napi(ts_return_type = "number[]")] + pub fn all(&self, limit: Option) -> napi::Result> { + let iterator = self.rrule_set.iterator(); + let iter = iterator.into_iter().map(|date| (&date).into()); - rrule_set = rrule_set.rdate(datetime); + if let Some(limit) = limit { + return Ok(iter.take(limit as usize).collect()); } - self.rrule_set = rrule_set; - - Ok(self) - } - - #[napi] - pub fn add_rrule(&mut self, rrule: &RRule) -> napi::Result<&Self> { - let dtstart = *self.rrule_set.get_dt_start(); - let rrule = rrule.validate(dtstart)?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.rrule(rrule)); - - Ok(self) - } - - #[napi] - pub fn add_exrule(&mut self, rrule: &RRule) -> napi::Result<&Self> { - let dtstart = *self.rrule_set.get_dt_start(); - let rrule = rrule.validate(dtstart)?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.exrule(rrule)); - - Ok(self) - } - - #[napi] - pub fn add_exdate(&mut self, datetime: i64) -> napi::Result<&Self> { - let timezone = self.rrule_set.get_dt_start().timezone(); - let datetime = super::DateTime::from(datetime).to_rrule_datetime(&timezone)?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.exdate(datetime)); - - Ok(self) - } - - #[napi] - pub fn add_rdate(&mut self, datetime: i64) -> napi::Result<&Self> { - let timezone = self.rrule_set.get_dt_start().timezone(); - let datetime = super::DateTime::from(datetime).to_rrule_datetime(&timezone)?; - - replace_with_or_abort(&mut self.rrule_set, |self_| self_.rdate(datetime.into())); - - Ok(self) + Ok(iter.collect()) } fn is_after(&self, timestamp: i64, after_timestamp: i64, inclusive: Option) -> bool { @@ -275,26 +178,6 @@ impl RRuleSet { true } - #[napi(ts_return_type = "number[]")] - pub fn all(&self, env: Env, limit: Option) -> napi::Result { - let mut arr = env.create_array(0).unwrap(); - let mut left = limit.unwrap_or(-1); - - for date in self.rrule_set.into_iter() { - let datetime: i64 = super::DateTime::from(date).into(); - - arr.insert(datetime).unwrap(); - - left -= 1; - - if left == 0 { - break; - } - } - - Ok(arr) - } - #[napi(ts_return_type = "number[]")] pub fn between( &self, @@ -304,21 +187,29 @@ impl RRuleSet { inclusive: Option, ) -> napi::Result { let mut arr = env.create_array(0).unwrap(); - let timezone = self.rrule_set.get_dt_start().timezone(); - let after_timestamp = super::DateTime::from(after_datetime) - .to_rrule_datetime(&timezone)? + let timezone = self.rrule_set.dtstart().timezone(); + let after_timestamp = DateTime::from(after_datetime) + .to_datetime(&timezone) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))? .timestamp_millis(); - let before_timestamp = super::DateTime::from(before_datetime) - .to_rrule_datetime(&timezone)? + let before_timestamp = DateTime::from(before_datetime) + .to_datetime(&timezone) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))? .timestamp_millis(); - for date in self.rrule_set.into_iter() { - let date_timestamp = date.timestamp_millis(); + let iterator = self.rrule_set.iterator(); + let iter = iterator.into_iter(); + + for date in iter { + let date_timestamp = date + .to_datetime(&timezone) + .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))? + .timestamp_millis(); let is_after = self.is_after(date_timestamp, after_timestamp, inclusive); let is_before = self.is_before(date_timestamp, before_timestamp, inclusive); if is_after && is_before { - let datetime: i64 = super::DateTime::from(date).into(); + let datetime: i64 = (&date).into(); arr.insert(datetime).unwrap(); } else if !is_before { @@ -329,64 +220,66 @@ impl RRuleSet { Ok(arr) } + #[napi] + pub fn set_from_string(&mut self, str: String) -> napi::Result<&Self> { + replace_with_or_abort_and_return(&mut self.rrule_set, |set| { + let new_set = set.clone(); + + match new_set.set_from_string(&str) { + Ok(set) => (None, set), + Err(e) => (Some(e), set), + } + }); + + Ok(self) + } + #[napi] pub fn to_string(&self) -> napi::Result { - Ok(self.into()) + Ok(self.rrule_set.to_string()) } #[napi] - pub fn iter(&self, this: Reference, env: Env) -> napi::Result { - let iter = this.share_with(env, |set| Ok(set.rrule_set.into_iter()))?; - Ok(RRuleSetIter { iter }) + pub fn iterator(&self) -> napi::Result { + Ok(RRuleSetIterator { + iterator: self.rrule_set.iterator(), + }) + } +} + +#[napi] +pub struct RRuleSetIterator { + iterator: rrule_set::RRuleSetIterator, +} + +#[napi] +impl RRuleSetIterator { + #[napi] + pub fn iterator( + &self, + this: Reference, + env: Env, + ) -> napi::Result { + let iterator = this.share_with(env, |iter: &mut RRuleSetIterator| { + Ok(iter.iterator.into_iter()) + })?; + + Ok(RRuleSetIteratorIterable { iterator }) } } #[napi(iterator)] -pub struct RRuleSetIter { - iter: SharedReference>, +pub struct RRuleSetIteratorIterable { + iterator: SharedReference>, } #[napi] -impl Generator for RRuleSetIter { +impl Generator for RRuleSetIteratorIterable { type Yield = i64; type Next = (); type Return = (); fn next(&mut self, _next: Option) -> Option { - self.iter.next().map(|date| { - let datetime: i64 = super::DateTime::from(date).into(); - - datetime - }) - } -} - -fn to_unvalidated(rrule: &rrule::RRule) -> rrule::RRule { - let by_month = rrule - .get_by_month() - .iter() - .map(|m| chrono::Month::try_from(*m).unwrap()) - .collect::>(); - let mut unvalidated = rrule::RRule::new(rrule.get_freq()) - .interval(rrule.get_interval()) - .week_start(rrule.get_week_start()) - .by_set_pos(rrule.get_by_set_pos().to_vec()) - .by_month(&by_month) - .by_month_day(rrule.get_by_month_day().to_vec()) - .by_year_day(rrule.get_by_year_day().to_vec()) - .by_week_no(rrule.get_by_week_no().to_vec()) - .by_weekday(rrule.get_by_weekday().to_vec()) - .by_hour(rrule.get_by_hour().to_vec()) - .by_minute(rrule.get_by_minute().to_vec()) - .by_second(rrule.get_by_second().to_vec()); - - if let Some(count) = rrule.get_count() { - unvalidated = unvalidated.count(count); + self.iterator.next().map(|date: DateTime| (&date).into()) } - - if let Some(until) = rrule.get_until() { - unvalidated = unvalidated.until(*until); - } - - unvalidated } diff --git a/lib/js/weekday.rs b/lib/js/weekday.rs index 9d22655..a645ee4 100644 --- a/lib/js/weekday.rs +++ b/lib/js/weekday.rs @@ -1,9 +1,7 @@ -use std::str::FromStr; - +use crate::rrule::weekday; use napi_derive::napi; #[napi(js_name = "Weekday")] -#[derive(PartialEq)] pub enum Weekday { Monday, Tuesday, @@ -14,75 +12,30 @@ pub enum Weekday { Sunday, } -impl From for Weekday { - fn from(weekday: rrule::Weekday) -> Self { - match weekday { - rrule::Weekday::Mon => Weekday::Monday, - rrule::Weekday::Tue => Weekday::Tuesday, - rrule::Weekday::Wed => Weekday::Wednesday, - rrule::Weekday::Thu => Weekday::Thursday, - rrule::Weekday::Fri => Weekday::Friday, - rrule::Weekday::Sat => Weekday::Saturday, - rrule::Weekday::Sun => Weekday::Sunday, - } - } -} - -impl Into for Weekday { - fn into(self) -> rrule::Weekday { - match self { - Weekday::Monday => rrule::Weekday::Mon, - Weekday::Tuesday => rrule::Weekday::Tue, - Weekday::Wednesday => rrule::Weekday::Wed, - Weekday::Thursday => rrule::Weekday::Thu, - Weekday::Friday => rrule::Weekday::Fri, - Weekday::Saturday => rrule::Weekday::Sat, - Weekday::Sunday => rrule::Weekday::Sun, - } - } -} - -impl Into for Weekday { - fn into(self) -> String { +impl Into for Weekday { + fn into(self) -> weekday::Weekday { match self { - Weekday::Monday => "MO".to_string(), - Weekday::Tuesday => "TU".to_string(), - Weekday::Wednesday => "WE".to_string(), - Weekday::Thursday => "TH".to_string(), - Weekday::Friday => "FR".to_string(), - Weekday::Saturday => "SA".to_string(), - Weekday::Sunday => "SU".to_string(), + Weekday::Monday => weekday::Weekday::Monday, + Weekday::Tuesday => weekday::Weekday::Tuesday, + Weekday::Wednesday => weekday::Weekday::Wednesday, + Weekday::Thursday => weekday::Weekday::Thursday, + Weekday::Friday => weekday::Weekday::Friday, + Weekday::Saturday => weekday::Weekday::Saturday, + Weekday::Sunday => weekday::Weekday::Sunday, } } } -impl Into for &Weekday { - fn into(self) -> String { - match self { - Weekday::Monday => "MO".to_string(), - Weekday::Tuesday => "TU".to_string(), - Weekday::Wednesday => "WE".to_string(), - Weekday::Thursday => "TH".to_string(), - Weekday::Friday => "FR".to_string(), - Weekday::Saturday => "SA".to_string(), - Weekday::Sunday => "SU".to_string(), - } - } -} - -impl FromStr for Weekday { - type Err = String; - - fn from_str(str: &str) -> Result { - match &*str.to_uppercase() { - "MO" => Ok(Weekday::Monday), - "TU" => Ok(Weekday::Tuesday), - "WE" => Ok(Weekday::Wednesday), - "TH" => Ok(Weekday::Thursday), - "FR" => Ok(Weekday::Friday), - "SA" => Ok(Weekday::Saturday), - "SU" => Ok(Weekday::Sunday), - _ => Err(format!("Invalid weekday: {}", str)), +impl From<&weekday::Weekday> for Weekday { + fn from(weekday: &weekday::Weekday) -> Self { + match weekday { + weekday::Weekday::Monday => Weekday::Monday, + weekday::Weekday::Tuesday => Weekday::Tuesday, + weekday::Weekday::Wednesday => Weekday::Wednesday, + weekday::Weekday::Thursday => Weekday::Thursday, + weekday::Weekday::Friday => Weekday::Friday, + weekday::Weekday::Saturday => Weekday::Saturday, + weekday::Weekday::Sunday => Weekday::Sunday, } } } diff --git a/lib/lib.rs b/lib/lib.rs index 2d3e399..6a2519d 100644 --- a/lib/lib.rs +++ b/lib/lib.rs @@ -1,2 +1,3 @@ -mod js; +pub mod js; +mod rrule; mod serialization; diff --git a/lib/rrule.rs b/lib/rrule.rs new file mode 100644 index 0000000..4da2e33 --- /dev/null +++ b/lib/rrule.rs @@ -0,0 +1,10 @@ +mod calendar; + +pub mod datetime; +pub mod dtstart; +pub mod frequency; +pub mod month; +pub mod n_weekday; +pub mod rrule; +pub mod rrule_set; +pub mod weekday; diff --git a/lib/rrule/calendar.rs b/lib/rrule/calendar.rs new file mode 100644 index 0000000..c9972fa --- /dev/null +++ b/lib/rrule/calendar.rs @@ -0,0 +1,113 @@ +use crate::serialization::{ + properties::Properties, + property::{Property, Value}, +}; +use std::str::FromStr; + +use super::{datetime::DateTime, dtstart::DtStart, rrule::RRule}; + +pub struct Calendar { + dtstarts: Vec, + rrules: Vec, + exrules: Vec, + exdates: Vec, + rdates: Vec, +} + +impl + Into<( + Vec, + Vec, + Vec, + Vec, + Vec, + )> for Calendar +{ + fn into( + self, + ) -> ( + Vec, + Vec, + Vec, + Vec, + Vec, + ) { + ( + self.dtstarts, + self.rrules, + self.exrules, + self.exdates, + self.rdates, + ) + } +} + +impl FromStr for Calendar { + type Err = String; + + fn from_str(str: &str) -> Result { + let properties: Properties = str.parse().map_err(|e| format!("{}", e))?; + + let mut dtstarts: Vec = Vec::new(); + let mut rrules: Vec = Vec::new(); + let mut exrules: Vec = Vec::new(); + let mut exdates: Vec = Vec::new(); + let mut rdates: Vec = Vec::new(); + + for property in properties { + match property.name() { + "DTSTART" => { + dtstarts.push(property.try_into()?); + } + "RRULE" => { + rrules.push(property.try_into()?); + } + "EXRULE" => { + exrules.push(property.try_into()?); + } + "EXDATE" => { + exdates.extend(parse_datetimes_property("EXDATE", property)?); + } + "RDATE" => { + rdates.extend(parse_datetimes_property("EXDATE", property)?); + } + _ => { + // Ignore unsupported properties + } + } + } + + Ok(Calendar { + dtstarts, + rrules, + exrules, + exdates, + rdates, + }) + } +} + +fn parse_datetimes_property(key: &str, property: Property) -> Result, String> { + if let Some(value) = property.parameters().get("VALUE") { + if value != "DATE-TIME" { + return Err(format!( + "Unsupported {} type: DATE. Only DATE-TIME is supported", + key + )); + } + } + + let value = match property.value() { + Value::Single(value) => value, + Value::Parameters(_) => { + return Err(format!("Invalid {}", key)); + } + }; + + let dates: Result, String> = value + .split(',') + .map(|date| date.parse::()) + .collect(); + + dates +} diff --git a/lib/js/datetime.rs b/lib/rrule/datetime.rs similarity index 84% rename from lib/js/datetime.rs rename to lib/rrule/datetime.rs index 9386fee..d7035e1 100644 --- a/lib/js/datetime.rs +++ b/lib/rrule/datetime.rs @@ -4,6 +4,7 @@ use chrono::Datelike; use chrono::TimeZone; use chrono::Timelike; +#[derive(Clone)] pub struct DateTime { year: u32, month: u32, @@ -19,12 +20,12 @@ impl DateTime { self.utc } - pub fn to_rrule_datetime( + pub fn to_datetime( &self, - timezone: &rrule::Tz, - ) -> napi::Result> { + timezone: &chrono_tz::Tz, + ) -> Result, String> { let timezone = match self.utc { - true => &rrule::Tz::UTC, + true => &chrono_tz::Tz::UTC, false => &timezone, }; @@ -40,25 +41,20 @@ impl DateTime { .single() { Some(datetime) => Ok(datetime), - None => Err(napi::Error::new( - napi::Status::GenericFailure, - format!( - "Invalid datetime: {}-{}-{} {}:{}:{} {}", - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - if self.utc { "UTC" } else { "Local" } - ), + None => Err(format!( + "Invalid datetime: {}-{}-{} {}:{}:{} {}", + self.year, + self.month, + self.day, + self.hour, + self.minute, + self.second, + if self.utc { "UTC" } else { "Local" } )), } } -} -impl Into for DateTime { - fn into(self) -> String { + pub fn to_string(&self) -> String { format!( "{:04}{:02}{:02}T{:02}{:02}{:02}{}", self.year, @@ -70,6 +66,64 @@ impl Into for DateTime { if self.utc { "Z" } else { "" } ) } + + fn from_str(str: &str) -> Result { + if str.len() > 16 || str.len() < 15 { + return Err(format!("Invalid datetime string: {}", str)); + } + + let year = str + .get(0..4) + .ok_or(format!("Can not extract year from: {}", str))?; + let year: u32 = year + .parse() + .map_err(|_| format!("Invalid year: {}", year))?; + + let month = str + .get(4..6) + .ok_or(format!("Can not extract month from: {}", str))?; + let month: u32 = month + .parse() + .map_err(|_| format!("Invalid month: {}", month))?; + + let day = str + .get(6..8) + .ok_or(format!("Can not extract day from: {}", str))?; + let day: u32 = day.parse().map_err(|_| format!("Invalid day: {}", day))?; + + let hour = str + .get(9..11) + .ok_or(format!("Can not extract hour from: {}", str))?; + let hour: u32 = hour + .parse() + .map_err(|_| format!("Invalid hour: {}", hour))?; + + let minute = str + .get(11..13) + .ok_or(format!("Can not extract minute from: {}", str))?; + let minute: u32 = minute + .parse() + .map_err(|_| format!("Invalid minute: {}", minute))?; + + let second = str + .get(13..15) + .ok_or(format!("Can not extract second from: {}", str))?; + let second: u32 = second + .parse() + .map_err(|_| format!("Invalid second: {}", second))?; + + let utc = str.get(15..16).unwrap_or("").to_uppercase() == "Z"; + + Ok(Self { + year, + month, + day, + hour, + minute, + second, + utc, + }) + } } impl From for DateTime { @@ -94,8 +148,8 @@ impl From for DateTime { } } -impl From> for DateTime { - fn from(datetime: chrono::DateTime) -> Self { +impl From<&chrono::DateTime> for DateTime { + fn from(datetime: &chrono::DateTime) -> Self { let year = datetime.year() as u32; let month = datetime.month(); let day = datetime.day(); @@ -116,7 +170,7 @@ impl From> for DateTime { } } -impl Into for DateTime { +impl Into for &DateTime { fn into(self) -> i64 { let year = self.year as i64; let month = self.month as i64; @@ -140,60 +194,6 @@ impl FromStr for DateTime { type Err = String; fn from_str(str: &str) -> Result { - if str.len() > 16 || str.len() < 15 { - return Err(format!("Invalid datetime string: {}", str)); - } - - let year = str - .get(0..4) - .ok_or(format!("Can not extract year from: {}", str))?; - let year: u32 = year - .parse() - .map_err(|_| format!("Invalid year: {}", year))?; - - let month = str - .get(4..6) - .ok_or(format!("Can not extract month from: {}", str))?; - let month: u32 = month - .parse() - .map_err(|_| format!("Invalid month: {}", month))?; - - let day = str - .get(6..8) - .ok_or(format!("Can not extract day from: {}", str))?; - let day: u32 = day.parse().map_err(|_| format!("Invalid day: {}", day))?; - - let hour = str - .get(9..11) - .ok_or(format!("Can not extract hour from: {}", str))?; - let hour: u32 = hour - .parse() - .map_err(|_| format!("Invalid hour: {}", hour))?; - - let minute = str - .get(11..13) - .ok_or(format!("Can not extract minute from: {}", str))?; - let minute: u32 = minute - .parse() - .map_err(|_| format!("Invalid minute: {}", minute))?; - - let second = str - .get(13..15) - .ok_or(format!("Can not extract second from: {}", str))?; - let second: u32 = second - .parse() - .map_err(|_| format!("Invalid second: {}", second))?; - - let utc = str.get(15..16).unwrap_or("").to_uppercase() == "Z"; - - Ok(DateTime { - year, - month, - day, - hour, - minute, - second, - utc, - }) + DateTime::from_str(str) } } diff --git a/lib/rrule/dtstart.rs b/lib/rrule/dtstart.rs new file mode 100644 index 0000000..cdefa79 --- /dev/null +++ b/lib/rrule/dtstart.rs @@ -0,0 +1,79 @@ +use super::datetime::DateTime; +use crate::serialization::{ + parameters::Parameters, + property::{Property, Value}, +}; + +#[derive(Clone)] +pub struct DtStart { + datetime: DateTime, + tzid: Option, +} + +impl DtStart { + pub fn datetime(&self) -> &DateTime { + &self.datetime + } + + pub fn tzid(&self) -> Option<&chrono_tz::Tz> { + self.tzid.as_ref() + } + + pub fn timezone(&self) -> chrono_tz::Tz { + match self.tzid { + Some(tz) => tz.clone(), + None => chrono_tz::Tz::UTC, + } + } + + pub fn to_datetime(&self) -> Result, String> { + self.datetime.to_datetime(&self.timezone()) + } + + pub fn to_property(&self) -> Property { + let mut parameters = Parameters::new(); + + if let Some(tzid) = self.tzid { + parameters.insert("TZID".to_string(), tzid.to_string()); + } + + let value: String = self.datetime.to_string(); + + Property::new("DTSTART".to_string(), parameters, Value::Single(value)) + } + + pub fn new(datetime: DateTime, tzid: Option) -> Result { + if !datetime.utc() && tzid.is_none() { + return Err("TZID is requred for non-UTC DTSTART".to_string()); + } + + Ok(Self { datetime, tzid }) + } + + pub fn from_property(property: Property) -> Result { + let datetime = match property.value() { + Value::Single(value) => value, + _ => return Err("Invalid DTSTART value".to_string()), + }; + let datetime: DateTime = datetime.parse()?; + + let tzid = match property.parameters().get("TZID") { + Some(value) => { + let tz: chrono_tz::Tz = value.parse()?; + + Some(tz) + } + None => None, + }; + + Ok(Self { datetime, tzid }) + } +} + +impl TryFrom for DtStart { + type Error = String; + + fn try_from(property: Property) -> Result { + DtStart::from_property(property) + } +} diff --git a/lib/rrule/frequency.rs b/lib/rrule/frequency.rs new file mode 100644 index 0000000..703cba2 --- /dev/null +++ b/lib/rrule/frequency.rs @@ -0,0 +1,90 @@ +use std::str::FromStr; + +#[derive(Clone)] +pub enum Frequency { + Yearly, + Monthly, + Weekly, + Daily, + Hourly, + Minutely, + Secondly, +} + +impl Frequency { + pub fn to_string(&self) -> String { + match self { + Frequency::Yearly => "YEARLY".to_string(), + Frequency::Monthly => "MONTHLY".to_string(), + Frequency::Weekly => "WEEKLY".to_string(), + Frequency::Daily => "DAILY".to_string(), + Frequency::Hourly => "HOURLY".to_string(), + Frequency::Minutely => "MINUTELY".to_string(), + Frequency::Secondly => "SECONDLY".to_string(), + } + } + + pub fn from_str(str: &str) -> Result { + let str = str.to_uppercase(); + let str = str.as_str(); + + match str { + "DAILY" => Ok(Frequency::Daily), + "HOURLY" => Ok(Frequency::Hourly), + "MINUTELY" => Ok(Frequency::Minutely), + "MONTHLY" => Ok(Frequency::Monthly), + "SECONDLY" => Ok(Frequency::Secondly), + "WEEKLY" => Ok(Frequency::Weekly), + "YEARLY" => Ok(Frequency::Yearly), + _ => Err(format!("Invalid frequency: {}", str)), + } + } +} + +impl From for Frequency { + fn from(freq: rrule::Frequency) -> Self { + match freq { + rrule::Frequency::Daily => Frequency::Daily, + rrule::Frequency::Hourly => Frequency::Hourly, + rrule::Frequency::Minutely => Frequency::Minutely, + rrule::Frequency::Monthly => Frequency::Monthly, + rrule::Frequency::Secondly => Frequency::Secondly, + rrule::Frequency::Weekly => Frequency::Weekly, + rrule::Frequency::Yearly => Frequency::Yearly, + } + } +} + +impl Into for Frequency { + fn into(self) -> rrule::Frequency { + (&self).into() + } +} + +impl Into for &Frequency { + fn into(self) -> rrule::Frequency { + match self { + Frequency::Daily => rrule::Frequency::Daily, + Frequency::Hourly => rrule::Frequency::Hourly, + Frequency::Minutely => rrule::Frequency::Minutely, + Frequency::Monthly => rrule::Frequency::Monthly, + Frequency::Secondly => rrule::Frequency::Secondly, + Frequency::Weekly => rrule::Frequency::Weekly, + Frequency::Yearly => rrule::Frequency::Yearly, + } + } +} + +impl Into for Frequency { + fn into(self) -> String { + self.to_string() + } +} + +impl FromStr for Frequency { + type Err = String; + + fn from_str(str: &str) -> Result { + Self::from_str(str) + } +} diff --git a/lib/rrule/month.rs b/lib/rrule/month.rs new file mode 100644 index 0000000..c854757 --- /dev/null +++ b/lib/rrule/month.rs @@ -0,0 +1,103 @@ +use std::str::FromStr; + +#[derive(Clone)] +pub enum Month { + January, + February, + March, + April, + May, + June, + July, + August, + September, + October, + November, + December, +} + +impl ToString for Month { + fn to_string(&self) -> String { + match self { + Month::January => "1".to_string(), + Month::February => "2".to_string(), + Month::March => "3".to_string(), + Month::April => "4".to_string(), + Month::May => "5".to_string(), + Month::June => "6".to_string(), + Month::July => "7".to_string(), + Month::August => "8".to_string(), + Month::September => "9".to_string(), + Month::October => "10".to_string(), + Month::November => "11".to_string(), + Month::December => "12".to_string(), + } + } +} + +impl FromStr for Month { + type Err = String; + + fn from_str(month: &str) -> Result { + match month { + "1" => Ok(Month::January), + "2" => Ok(Month::February), + "3" => Ok(Month::March), + "4" => Ok(Month::April), + "5" => Ok(Month::May), + "6" => Ok(Month::June), + "7" => Ok(Month::July), + "8" => Ok(Month::August), + "9" => Ok(Month::September), + "10" => Ok(Month::October), + "11" => Ok(Month::November), + "12" => Ok(Month::December), + _ => Err(format!("Invalid month number: {}", month)), + } + } +} + +impl From<&u8> for Month { + fn from(month: &u8) -> Self { + match month { + 1 => Month::January, + 2 => Month::February, + 3 => Month::March, + 4 => Month::April, + 5 => Month::May, + 6 => Month::June, + 7 => Month::July, + 8 => Month::August, + 9 => Month::September, + 10 => Month::October, + 11 => Month::November, + 12 => Month::December, + _ => panic!("Invalid month number: {}", month), + } + } +} + +impl Into for &Month { + fn into(self) -> chrono::Month { + match self { + Month::January => chrono::Month::January, + Month::February => chrono::Month::February, + Month::March => chrono::Month::March, + Month::April => chrono::Month::April, + Month::May => chrono::Month::May, + Month::June => chrono::Month::June, + Month::July => chrono::Month::July, + Month::August => chrono::Month::August, + Month::September => chrono::Month::September, + Month::October => chrono::Month::October, + Month::November => chrono::Month::November, + Month::December => chrono::Month::December, + } + } +} + +impl Into for Month { + fn into(self) -> chrono::Month { + (&self).into() + } +} diff --git a/lib/rrule/n_weekday.rs b/lib/rrule/n_weekday.rs new file mode 100644 index 0000000..38557c4 --- /dev/null +++ b/lib/rrule/n_weekday.rs @@ -0,0 +1,90 @@ +use super::weekday::Weekday; +use std::str::FromStr; + +#[derive(Clone)] +pub struct NWeekday { + pub n: Option, + pub weekday: Weekday, +} + +impl From for NWeekday { + fn from(nday: rrule::NWeekday) -> Self { + match nday { + rrule::NWeekday::Every(weekday) => NWeekday { + n: None, + weekday: Weekday::from(weekday), + }, + rrule::NWeekday::Nth(n, weekday) => NWeekday { + n: Some(n), + weekday: weekday.into(), + }, + } + } +} + +impl Into for &NWeekday { + fn into(self) -> rrule::NWeekday { + match self.n { + Some(n) => rrule::NWeekday::Nth(n, (&self.weekday).into()), + None => rrule::NWeekday::Every((&self.weekday).into()), + } + } +} + +impl Into for NWeekday { + fn into(self) -> rrule::NWeekday { + (&self).into() + } +} + +impl Into for &NWeekday { + fn into(self) -> String { + match self.n { + Some(n) => { + let weekday: String = (&self.weekday).into(); + + format!("{}{}", n, weekday) + } + None => (&self.weekday).into(), + } + } +} + +impl FromStr for NWeekday { + type Err = String; + + fn from_str(str: &str) -> Result { + let weekday = extract_weekday(str)?; + let n = if str.len() > 2 { + Some(extract_number(str)?) + } else { + None + }; + + Ok(NWeekday { n, weekday }) + } +} + +fn extract_weekday(str: &str) -> Result { + let weekday = str + .chars() + .rev() + .take(2) + .collect::() + .chars() + .rev() + .collect::(); + + weekday.parse() +} + +fn extract_number(str: &str) -> Result { + let number = str + .chars() + .take_while(|c| c.is_digit(10) || *c == '-') + .collect::(); + + number + .parse() + .map_err(|_| format!("Invalid number: {}", number)) +} diff --git a/lib/rrule/rrule.rs b/lib/rrule/rrule.rs new file mode 100644 index 0000000..3c6893d --- /dev/null +++ b/lib/rrule/rrule.rs @@ -0,0 +1,363 @@ +use itertools::Itertools; +use std::str::FromStr; + +use super::{ + datetime::DateTime, dtstart::DtStart, frequency::Frequency, month::Month, n_weekday::NWeekday, + weekday::Weekday, +}; +use crate::serialization::{ + parameters::Parameters, + property::{Property, Value}, +}; + +#[derive(Clone)] +pub struct RRule { + until: Option, + frequency: Frequency, + interval: Option, + count: Option, + weekstart: Option, + by_day: Vec, + by_hour: Vec, + by_minute: Vec, + by_second: Vec, + by_monthday: Vec, + by_yearday: Vec, + by_setpos: Vec, + by_month: Vec, + by_weekno: Vec, +} + +impl RRule { + pub fn new(frequency: Frequency) -> Self { + Self { + frequency, + interval: None, + count: None, + until: None, + weekstart: None, + by_day: Vec::new(), + by_hour: Vec::new(), + by_minute: Vec::new(), + by_second: Vec::new(), + by_monthday: Vec::new(), + by_yearday: Vec::new(), + by_setpos: Vec::new(), + by_month: Vec::new(), + by_weekno: Vec::new(), + } + } + + pub fn set_interval(self, interval: Option) -> Self { + Self { interval, ..self } + } + + pub fn set_count(self, count: Option) -> Self { + Self { count, ..self } + } + + pub fn set_until(self, until: Option) -> Self { + Self { until, ..self } + } + + pub fn set_by_hour(self, by_hour: Vec) -> Self { + Self { by_hour, ..self } + } + + pub fn set_by_minute(self, by_minute: Vec) -> Self { + Self { by_minute, ..self } + } + + pub fn set_by_second(self, by_second: Vec) -> Self { + Self { by_second, ..self } + } + + pub fn set_by_monthday(self, by_monthday: Vec) -> Self { + Self { + by_monthday, + ..self + } + } + + pub fn set_by_yearday(self, by_yearday: Vec) -> Self { + Self { by_yearday, ..self } + } + + pub fn set_by_setpos(self, by_setpos: Vec) -> Self { + Self { by_setpos, ..self } + } + + pub fn set_by_month(self, by_month: Vec) -> Self { + Self { by_month, ..self } + } + + pub fn set_by_weekno(self, by_weekno: Vec) -> Self { + Self { by_weekno, ..self } + } + + pub fn set_by_day(self, by_day: Vec) -> Self { + Self { by_day, ..self } + } + + pub fn set_weekstart(self, weekstart: Option) -> Self { + Self { weekstart, ..self } + } + + pub fn frequency(&self) -> &Frequency { + &self.frequency + } + + pub fn interval(&self) -> Option { + self.interval + } + + pub fn count(&self) -> Option { + self.count + } + + pub fn by_day(&self) -> &Vec { + &self.by_day + } + + pub fn by_hour(&self) -> &Vec { + &self.by_hour + } + + pub fn by_minute(&self) -> &Vec { + &self.by_minute + } + + pub fn by_second(&self) -> &Vec { + &self.by_second + } + + pub fn by_monthday(&self) -> &Vec { + &self.by_monthday + } + + pub fn by_yearday(&self) -> &Vec { + &self.by_yearday + } + + pub fn by_setpos(&self) -> &Vec { + &self.by_setpos + } + + pub fn by_month(&self) -> &Vec { + &self.by_month + } + + pub fn by_weekno(&self) -> &Vec { + &self.by_weekno + } + + pub fn weekstart(&self) -> Option<&Weekday> { + self.weekstart.as_ref() + } + + pub fn until(&self) -> Option<&DateTime> { + self.until.as_ref() + } + + pub fn to_property(&self) -> Property { + let mut value = Parameters::new(); + + value.insert("FREQ".to_string(), self.frequency.to_string()); + + if let Some(interval) = self.interval { + value.insert("INTERVAL".to_string(), interval.to_string()); + } + + if let Some(count) = self.count { + value.insert("COUNT".to_string(), count.to_string()); + } + + if let Some(until) = &self.until { + value.insert("UNTIL".to_string(), until.to_string()); + } + + if !self.by_hour.is_empty() { + value.insert("BYHOUR".to_string(), self.by_hour.iter().join(",")); + } + + if !self.by_minute.is_empty() { + value.insert("BYMINUTE".to_string(), self.by_minute.iter().join(",")); + } + + if !self.by_second.is_empty() { + value.insert("BYSECOND".to_string(), self.by_second.iter().join(",")); + } + + if !self.by_monthday.is_empty() { + value.insert("BYMONTHDAY".to_string(), self.by_monthday.iter().join(",")); + } + + if !self.by_yearday.is_empty() { + value.insert("BYYEARDAY".to_string(), self.by_yearday.iter().join(",")); + } + + if !self.by_setpos.is_empty() { + value.insert("BYSETPOS".to_string(), self.by_setpos.iter().join(",")); + } + + if !self.by_month.is_empty() { + value.insert( + "BYMONTH".to_string(), + self + .by_month + .iter() + .map(|month| month.to_string()) + .join(","), + ); + } + + if !self.by_weekno.is_empty() { + value.insert("BYWEEKNO".to_string(), self.by_weekno.iter().join(",")); + } + + if !self.by_day.is_empty() { + value.insert( + "BYDAY".to_string(), + self + .by_day + .iter() + .map(|day| Into::::into(day)) + .join(","), + ); + } + + if let Some(weekstart) = &self.weekstart { + value.insert("WKST".to_string(), weekstart.into()); + } + + Property::new( + "RRULE".to_string(), + Parameters::new(), + Value::Parameters(value), + ) + } + + pub fn to_string(&self) -> String { + self.to_property().to_string() + } + + pub fn from_str(str: &str) -> Result { + let str = if !str.to_uppercase().starts_with("RRULE:") { + format!("RRULE:{}", str) + } else { + str.to_string() + }; + + let property: Property = str.parse().map_err(|err| format!("{}", err))?; + + Self::from_property(property) + } + + fn from_property(property: Property) -> Result { + if property.name() != "RRULE" && property.name() != "EXRULE" { + return Err(format!("Invalid property name: {}", property.name())); + } + + let value = match property.value() { + Value::Parameters(value) => value, + Value::Single(value) => return Err(format!("Invalid {}: {}", property.name(), value)), + }; + + let frequency = match value.get_as::("FREQ")? { + Some(value) => value, + None => return Err("FREQ is required".to_string()), + }; + + let interval = value.get_as::("INTERVAL")?; + let until = value.get_as::("UNTIL")?; + let count = value.get_as::("COUNT")?; + let by_hour = value.get_as_vec::("BYHOUR")?; + let by_minute = value.get_as_vec::("BYMINUTE")?; + let by_second = value.get_as_vec::("BYSECOND")?; + let by_month = value.get_as_vec::("BYMONTH")?; + let weekstart = value.get_as::("WKST")?; + let by_day = value.get_as_vec::("BYDAY")?; + let by_setpos = value.get_as_vec::("BYSETPOS")?; + let by_monthday = value.get_as_vec::("BYMONTHDAY")?; + let by_yearday = value.get_as_vec::("BYYEARDAY")?; + let by_weekno = value.get_as_vec::("BYWEEKNO")?; + + Ok(Self { + frequency, + until, + interval, + count, + weekstart, + by_day: by_day.unwrap_or_default(), + by_hour: by_hour.unwrap_or_default(), + by_minute: by_minute.unwrap_or_default(), + by_second: by_second.unwrap_or_default(), + by_monthday: by_monthday.unwrap_or_default(), + by_yearday: by_yearday.unwrap_or_default(), + by_setpos: by_setpos.unwrap_or_default(), + by_month: by_month.unwrap_or_default(), + by_weekno: by_weekno.unwrap_or_default(), + }) + } +} + +impl TryFrom for RRule { + type Error = String; + + fn try_from(property: Property) -> Result { + Self::from_property(property) + } +} + +impl FromStr for RRule { + type Err = String; + + fn from_str(str: &str) -> Result { + Self::from_str(str) + } +} + +pub trait ToRRule { + fn to_rrule(&self, tzid: &DtStart) -> Result, String>; +} + +impl ToRRule for RRule { + fn to_rrule(&self, dtstart: &DtStart) -> Result, String> { + let mut rrule = rrule::RRule::new((&self.frequency).into()); + + rrule = rrule.interval(self.interval.unwrap_or(1)); + + if let Some(count) = self.count { + rrule = rrule.count(count); + } + + if let Some(until) = &self.until { + let until = until.to_datetime(dtstart.tzid().unwrap_or(&chrono_tz::Tz::UTC))?; + let until = until.with_timezone(&rrule::Tz::Tz(chrono_tz::Tz::UTC)); + + rrule = rrule.until(until); + } + + rrule = rrule.by_hour(self.by_hour.clone()); + rrule = rrule.by_minute(self.by_minute.clone()); + rrule = rrule.by_second(self.by_second.clone()); + rrule = rrule.by_month_day(self.by_monthday.clone()); + rrule = rrule.by_set_pos(self.by_setpos.clone()); + rrule = rrule.by_month( + &self + .by_month() + .into_iter() + .map(|month| month.into()) + .collect::>(), + ); + rrule = rrule.by_week_no(self.by_weekno.clone()); + rrule = rrule.by_year_day(self.by_yearday.clone()); + rrule = rrule.week_start(self.weekstart.as_ref().unwrap_or_default().into()); + rrule = rrule.by_weekday((&self.by_day).into_iter().map(|day| day.into()).collect()); + + let dtstart = dtstart.to_datetime()?; + let dtstart = dtstart.with_timezone(&rrule::Tz::Tz(dtstart.timezone())); + + Ok(rrule.validate(dtstart).map_err(|err| format!("{}", err))?) + } +} diff --git a/lib/rrule/rrule_set.rs b/lib/rrule/rrule_set.rs new file mode 100644 index 0000000..9949d35 --- /dev/null +++ b/lib/rrule/rrule_set.rs @@ -0,0 +1,274 @@ +use std::str::FromStr; + +use crate::serialization::{ + parameters::Parameters, + properties::Properties, + property::{Property, Value}, +}; + +use super::{ + calendar::Calendar, + datetime::DateTime, + dtstart::DtStart, + rrule::{RRule, ToRRule}, +}; + +#[derive(Clone)] +pub struct RRuleSet { + dtstart: DtStart, + rrules: Vec, + exrules: Vec, + exdates: Vec, + rdates: Vec, +} + +impl RRuleSet { + pub fn new(dtstart: DtStart) -> Self { + Self { + dtstart, + rrules: Vec::new(), + exrules: Vec::new(), + exdates: Vec::new(), + rdates: Vec::new(), + } + } + + pub fn dtstart(&self) -> &DtStart { + &self.dtstart + } + + pub fn rrules(&self) -> &Vec { + &self.rrules + } + + pub fn exrules(&self) -> &Vec { + &self.exrules + } + + pub fn exdates(&self) -> &Vec { + &self.exdates + } + + pub fn rdates(&self) -> &Vec { + &self.rdates + } + + pub fn set_rrules(self, rrules: Vec) -> Self { + Self { rrules, ..self } + } + + pub fn set_exrules(self, exrules: Vec) -> Self { + Self { exrules, ..self } + } + + pub fn set_exdates(self, exdates: Vec) -> Self { + Self { exdates, ..self } + } + + pub fn set_rdates(self, rdates: Vec) -> Self { + Self { rdates, ..self } + } + + pub fn set_from_string(mut self, str: &str) -> Result { + let calendar: Calendar = str.parse()?; + let (calendar_dtstarts, calendar_rrules, calendar_exrules, calendar_exdates, calendar_rdates) = + calendar.into(); + + if calendar_dtstarts.len() > 1 { + return Err("Only one DTSTART is allowed".to_string()); + } + + if let Some(dtstart) = calendar_dtstarts.first() { + self.dtstart = dtstart.clone(); + } + + for rrule in calendar_rrules { + self.rrules.push(rrule); + } + + for rrule in calendar_exrules { + self.exrules.push(rrule); + } + + for exdate in calendar_exdates { + self.exdates.push(exdate); + } + + for rdate in calendar_rdates { + self.rdates.push(rdate); + } + + Ok(self) + } + + pub fn to_string(&self) -> String { + self.to_properties().to_string() + } + + pub fn to_properties(&self) -> Properties { + let mut properties = Properties::new(); + + properties.push(self.dtstart.to_property()); + + for rrule in self.rrules.iter() { + properties.push(rrule.to_property()); + } + + for exrule in self.exrules.iter() { + properties.push(exrule.to_property()); + } + + for exdate in self.exdates.iter() { + properties.push(Property::new( + "EXDATE".to_string(), + Parameters::new(), + Value::Single(exdate.to_string()), + )); + } + + for rdate in self.rdates.iter() { + properties.push(Property::new( + "RDATE".to_string(), + Parameters::new(), + Value::Single(rdate.to_string()), + )); + } + + properties + } + + pub fn iterator(&self) -> RRuleSetIterator { + RRuleSetIterator::new(&self) + } + + pub fn from_str(str: &str) -> Result { + let calendar: Calendar = str.parse()?; + let (calendar_dtstarts, calendar_rrules, calendar_exrules, calendar_exdates, calendar_rdates) = + calendar.into(); + + if calendar_dtstarts.len() > 1 { + return Err("Only one DTSTART is allowed".to_string()); + } + + let dtstart: Option = calendar_dtstarts.into_iter().nth(0); + let mut rrules: Vec = Vec::new(); + let mut exrules: Vec = Vec::new(); + let mut exdates: Vec = Vec::new(); + let mut rdates: Vec = Vec::new(); + + let dtstart = match dtstart { + Some(value) => value, + None => { + return Err("DTSTART is required".to_string()); + } + }; + + for rrule in calendar_rrules { + rrules.push(rrule); + } + + for exrule in calendar_exrules { + exrules.push(exrule); + } + + for exdate in calendar_exdates { + exdates.push(exdate); + } + + for rdate in calendar_rdates { + rdates.push(rdate); + } + + Ok(Self { + dtstart, + rrules, + exrules, + exdates, + rdates, + }) + } +} + +impl FromStr for RRuleSet { + type Err = String; + + fn from_str(str: &str) -> Result { + Self::from_str(str) + } +} + +pub trait ToRRuleSet { + fn to_rrule_set(&self) -> Result; +} + +impl ToRRuleSet for RRuleSet { + fn to_rrule_set(&self) -> Result { + let dtstart = self.dtstart.to_datetime()?; + let dtstart = dtstart.with_timezone(&rrule::Tz::Tz(dtstart.timezone())); + + let mut rrule_set = rrule::RRuleSet::new(dtstart); + + for rrule in self.rrules.iter() { + rrule_set = rrule_set.rrule(rrule.to_rrule(self.dtstart())?); + } + + for exrule in self.exrules.iter() { + rrule_set = rrule_set.exrule(exrule.to_rrule(self.dtstart())?); + } + + for exdate in self.exdates.iter() { + let exdate = exdate.to_datetime(self.dtstart.tzid().unwrap_or(&chrono_tz::Tz::UTC))?; + let exdate = exdate.with_timezone(&rrule::Tz::Tz(exdate.timezone())); + + rrule_set = rrule_set.exdate(exdate); + } + + for rdate in self.rdates.iter() { + let rdate = rdate.to_datetime(self.dtstart.tzid().unwrap_or(&chrono_tz::Tz::UTC))?; + let rdate = rdate.with_timezone(&rrule::Tz::Tz(rdate.timezone())); + + rrule_set = rrule_set.rdate(rdate); + } + + Ok(rrule_set) + } +} + +pub struct RRuleSetIterator { + rrule_set: rrule::RRuleSet, +} + +impl RRuleSetIterator { + fn new(rrule_set: &RRuleSet) -> Self { + let rrule_set = rrule_set.to_rrule_set().unwrap(); + + Self { rrule_set } + } +} + +impl<'a> IntoIterator for &'a RRuleSetIterator { + type Item = DateTime; + type IntoIter = RRuleSetIteratorIterable<'a>; + + fn into_iter(self) -> Self::IntoIter { + RRuleSetIteratorIterable { + iter: self.rrule_set.into_iter(), + } + } +} + +pub struct RRuleSetIteratorIterable<'a> { + iter: rrule::RRuleSetIter<'a>, +} + +impl<'a> Iterator for RRuleSetIteratorIterable<'a> { + type Item = DateTime; + + fn next(&mut self) -> Option { + self.iter.next().map(|date_time| { + let date_time: DateTime = (&date_time).into(); + + date_time + }) + } +} diff --git a/lib/rrule/weekday.rs b/lib/rrule/weekday.rs new file mode 100644 index 0000000..1b00b4c --- /dev/null +++ b/lib/rrule/weekday.rs @@ -0,0 +1,89 @@ +use std::str::FromStr; + +#[derive(PartialEq, Clone)] +pub enum Weekday { + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, +} + +impl Default for &Weekday { + fn default() -> Self { + &Weekday::Monday + } +} + +impl Default for Weekday { + fn default() -> Self { + Weekday::Monday + } +} + +impl From for Weekday { + fn from(weekday: rrule::Weekday) -> Self { + match weekday { + rrule::Weekday::Mon => Weekday::Monday, + rrule::Weekday::Tue => Weekday::Tuesday, + rrule::Weekday::Wed => Weekday::Wednesday, + rrule::Weekday::Thu => Weekday::Thursday, + rrule::Weekday::Fri => Weekday::Friday, + rrule::Weekday::Sat => Weekday::Saturday, + rrule::Weekday::Sun => Weekday::Sunday, + } + } +} + +impl Into for &Weekday { + fn into(self) -> rrule::Weekday { + match self { + Weekday::Monday => rrule::Weekday::Mon, + Weekday::Tuesday => rrule::Weekday::Tue, + Weekday::Wednesday => rrule::Weekday::Wed, + Weekday::Thursday => rrule::Weekday::Thu, + Weekday::Friday => rrule::Weekday::Fri, + Weekday::Saturday => rrule::Weekday::Sat, + Weekday::Sunday => rrule::Weekday::Sun, + } + } +} + +impl Into for Weekday { + fn into(self) -> rrule::Weekday { + (&self).into() + } +} + +impl Into for &Weekday { + fn into(self) -> String { + match self { + Weekday::Monday => "MO".to_string(), + Weekday::Tuesday => "TU".to_string(), + Weekday::Wednesday => "WE".to_string(), + Weekday::Thursday => "TH".to_string(), + Weekday::Friday => "FR".to_string(), + Weekday::Saturday => "SA".to_string(), + Weekday::Sunday => "SU".to_string(), + } + } +} + +impl FromStr for Weekday { + type Err = String; + + fn from_str(str: &str) -> Result { + match &*str.to_uppercase() { + "MO" => Ok(Weekday::Monday), + "TU" => Ok(Weekday::Tuesday), + "WE" => Ok(Weekday::Wednesday), + "TH" => Ok(Weekday::Thursday), + "FR" => Ok(Weekday::Friday), + "SA" => Ok(Weekday::Saturday), + "SU" => Ok(Weekday::Sunday), + _ => Err(format!("Invalid weekday: {}", str)), + } + } +} diff --git a/lib/serialization.rs b/lib/serialization.rs index ac333c4..1bcd2f6 100644 --- a/lib/serialization.rs +++ b/lib/serialization.rs @@ -1,15 +1,3 @@ -mod calendar; -mod properties; -mod property; -mod rrule; -mod rrule_set; -mod to_string_array; -mod to_vec; - -pub use calendar::*; -pub use properties::*; -pub use property::*; -pub use rrule::*; -pub use rrule_set::*; -pub use to_string_array::*; -pub use to_vec::*; +pub mod parameters; +pub mod properties; +pub mod property; diff --git a/lib/serialization/calendar.rs b/lib/serialization/calendar.rs deleted file mode 100644 index 0570fb4..0000000 --- a/lib/serialization/calendar.rs +++ /dev/null @@ -1,169 +0,0 @@ -use super::{Parameters, Properties, Property}; -use crate::js::{DateTime, RRule}; -use crate::serialization::to_vec::ToVec; -use std::str::FromStr; - -pub struct Calendar { - dtstarts: Vec<(i64, String)>, - rrules: Vec, - exrules: Vec, - exdates: Vec, - rdates: Vec, -} - -impl - Into<( - Vec<(i64, String)>, - Vec, - Vec, - Vec, - Vec, - )> for Calendar -{ - fn into( - self, - ) -> ( - Vec<(i64, String)>, - Vec, - Vec, - Vec, - Vec, - ) { - ( - self.dtstarts, - self.rrules, - self.exrules, - self.exdates, - self.rdates, - ) - } -} - -impl FromStr for Calendar { - type Err = napi::Error; - - fn from_str(str: &str) -> Result { - let properties = - Properties::from_str(str).map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - - let mut dtstarts: Vec<(i64, String)> = Vec::new(); - let mut rrules: Vec = Vec::new(); - let mut exrules: Vec = Vec::new(); - let mut exdates: Vec = Vec::new(); - let mut rdates: Vec = Vec::new(); - - for property in properties { - match property.name() { - "DTSTART" => { - let (datetime, tzid) = property_to_dtstart(&property) - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - - dtstarts.push((datetime, tzid)); - } - "RRULE" => { - let rrule = RRule::try_from(property)?; - rrules.push(rrule); - } - "EXRULE" => { - let rrule = RRule::try_from(property)?; - exrules.push(rrule); - } - "EXDATE" => { - if let Some(value) = property.parameters().get("VALUE") { - if value == "DATE" { - return Err(napi::Error::new( - napi::Status::GenericFailure, - "Unsupported EXDATE value: DATE", - )); - } else if value != "DATE-TIME" { - return Err(napi::Error::new( - napi::Status::GenericFailure, - format!("Unsupported EXDATE value: {}", value), - )); - } - } - - let value = match property.value() { - Parameters::Single(value) => value, - Parameters::Multiple(_) => { - return Err(napi::Error::new( - napi::Status::GenericFailure, - "Invalid EXDATE", - )); - } - }; - - let dates: Vec = value.as_str().to_vec()?; - - for date in dates { - exdates.push(date.into()); - } - } - "RDATE" => { - if let Some(value) = property.parameters().get("VALUE") { - if value == "DATE" { - return Err(napi::Error::new( - napi::Status::GenericFailure, - "Unsupported RDATE value: DATE. Only DATE-TIME is supported", - )); - } else if value != "DATE-TIME" { - return Err(napi::Error::new( - napi::Status::GenericFailure, - format!("Unsupported RDATE value: {}", value), - )); - } - } - - let value = match property.value() { - Parameters::Single(value) => value, - Parameters::Multiple(_) => { - return Err(napi::Error::new( - napi::Status::GenericFailure, - "Invalid RDATE", - )); - } - }; - - let dates: Vec = value.as_str().to_vec()?; - - for date in dates { - rdates.push(date.into()); - } - } - _ => { - // ignore unsupported properties - } - } - } - - Ok(Calendar { - dtstarts, - rrules, - exrules, - exdates, - rdates, - }) - } -} - -fn property_to_dtstart(property: &Property) -> Result<(i64, String), String> { - let datetime = match property.value() { - Parameters::Single(value) => value, - Parameters::Multiple(_) => return Err("Invalid DTSTART value".to_string()), - }; - let datetime: DateTime = datetime.parse()?; - - let tzid = match property.parameters().get("TZID") { - Some(value) => value.to_string(), - None => { - if datetime.utc() { - "UTC".to_string() - } else { - return Err("TZID is requred for non-UTC DTSTART".to_string()); - } - } - }; - let datetime: i64 = datetime.into(); - - Ok((datetime, tzid)) -} diff --git a/lib/serialization/parameters.rs b/lib/serialization/parameters.rs new file mode 100644 index 0000000..42a2cab --- /dev/null +++ b/lib/serialization/parameters.rs @@ -0,0 +1,84 @@ +use std::{ops::Index, str::FromStr}; + +use indexmap::IndexMap; + +pub struct Parameters { + params: IndexMap, +} + +impl Parameters { + pub fn new() -> Self { + Self { + params: IndexMap::new(), + } + } + + pub fn insert(&mut self, key: String, value: String) { + self.params.insert(key.to_uppercase(), value); + } + + pub fn get(&self, key: &str) -> Option<&String> { + self.params.get(&key.to_uppercase()) + } + + pub fn get_as(&self, key: &str) -> Result, String> { + match self.get(key) { + Some(value) => Ok(Some(value_as::(key, value)?)), + None => Ok(None), + } + } + + pub fn get_as_vec(&self, key: &str) -> Result>, String> { + match self.get(key) { + Some(value) => { + let mut data = Vec::::new(); + + for item in value.split(',') { + data.push(value_as::(key, item)?); + } + + Ok(Some(data)) + } + None => Ok(None), + } + } + + pub fn len(&self) -> usize { + self.params.len() + } + + pub fn is_empty(&self) -> bool { + self.params.is_empty() + } + + pub fn iter(&self) -> indexmap::map::Iter { + self.params.iter() + } + + pub fn clear(&mut self) { + self.params.clear(); + } +} + +impl Index<&str> for Parameters { + type Output = String; + + fn index(&self, key: &str) -> &Self::Output { + self.params.get(key).unwrap() + } +} + +impl IntoIterator for Parameters { + type Item = (String, String); + type IntoIter = indexmap::map::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.params.into_iter() + } +} + +fn value_as(key: &str, value: &str) -> Result { + value + .parse::() + .map_err(|_| format!("Invalid {} value: {}", key, value)) +} diff --git a/lib/serialization/properties.rs b/lib/serialization/properties.rs index 7dd8944..fd0c65a 100644 --- a/lib/serialization/properties.rs +++ b/lib/serialization/properties.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use super::property::{Error, Property}; pub struct Properties { @@ -54,3 +56,11 @@ impl IntoIterator for Properties { self.items.into_iter() } } + +impl FromStr for Properties { + type Err = Error; + + fn from_str(str: &str) -> Result { + Properties::from_str(str) + } +} diff --git a/lib/serialization/property.rs b/lib/serialization/property.rs index dc746f7..bc2403d 100644 --- a/lib/serialization/property.rs +++ b/lib/serialization/property.rs @@ -1,9 +1,10 @@ -use indexmap::IndexMap; -use std::fmt; +use std::{fmt, str::FromStr}; -pub enum Parameters { +use super::parameters::Parameters; + +pub enum Value { Single(String), - Multiple(IndexMap), + Parameters(Parameters), } #[derive(Debug)] @@ -25,8 +26,8 @@ impl fmt::Display for Error { pub struct Property { name: String, - parameters: IndexMap, - value: Parameters, + parameters: Parameters, + value: Value, } impl Property { @@ -34,26 +35,26 @@ impl Property { &self.name } - pub fn parameters(&self) -> &IndexMap { + pub fn parameters(&self) -> &Parameters { &self.parameters } - pub fn value(&self) -> &Parameters { + pub fn value(&self) -> &Value { &self.value } pub fn to_string(&self) -> String { let mut string = format!("{}", self.name); - for (key, value) in self.parameters() { + for (key, value) in self.parameters.iter() { string.push_str(&format!(";{}={}", key, value)); } string.push_str(":"); match &self.value { - Parameters::Single(value) => string.push_str(value), - Parameters::Multiple(values) => { + Value::Single(value) => string.push_str(value), + Value::Parameters(values) => { let mut values = values.iter(); if let Some((key, value)) = values.next() { @@ -69,7 +70,7 @@ impl Property { string } - pub fn new(name: String, parameters: IndexMap, value: Parameters) -> Property { + pub fn new(name: String, parameters: Parameters, value: Value) -> Property { Property { name, parameters, @@ -87,21 +88,21 @@ impl Property { let (name, parameters) = Self::parse_name(key_value[0].trim())?; let value = Self::parse_parameters(key_value[1].trim())?; - if let Parameters::Single(_) = parameters { + if let Value::Single(_) = parameters { return Err(Error::InvalidParameters(key_value[0].to_string())); } match parameters { - Parameters::Multiple(parameters) => Ok(Property { + Value::Parameters(parameters) => Ok(Property { name, parameters, value, }), - Parameters::Single(_) => Err(Error::InvalidParameters(key_value[0].to_string())), + Value::Single(_) => Err(Error::InvalidParameters(key_value[0].to_string())), } } - fn parse_name(str: &str) -> Result<(String, Parameters), Error> { + fn parse_name(str: &str) -> Result<(String, Value), Error> { let name_params: Vec<&str> = str.split(';').take(2).collect(); let name = name_params[0].trim().to_uppercase(); @@ -110,8 +111,8 @@ impl Property { Ok((name, params)) } - fn parse_parameters(str: &str) -> Result { - let mut params = IndexMap::new(); + fn parse_parameters(str: &str) -> Result { + let mut params = Parameters::new(); let param_strings = str.split(';'); for param_string in param_strings { @@ -121,13 +122,13 @@ impl Property { if let Some(name) = key { params.insert(name.to_uppercase(), value.to_string()); } else if params.len() == 0 && param_string.len() > 0 { - return Ok(Parameters::Single(param_string.to_string())); + return Ok(Value::Single(param_string.to_string())); } else if params.len() > 0 { return Err(Error::InvalidParameters(str.to_string())); } } - Ok(Parameters::Multiple(params)) + Ok(Value::Parameters(params)) } fn parse_parameter(str: &str) -> Result<(Option, &str), Error> { @@ -146,59 +147,10 @@ impl Property { } } -#[cfg(test)] -mod tests { - use super::Property; - - #[test] - fn test_rrule() { - let property = Property::from_string("RRULE:FREQ=DAILY;INTERVAL=1").unwrap(); - - assert_eq!(property.name(), "RRULE"); - assert_eq!(property.parameters().len(), 0); - assert!(matches!(property.value(), super::Parameters::Multiple(params) if params.len() == 2)); - assert!( - matches!(property.value(), super::Parameters::Multiple(params) if params["FREQ"] == "DAILY") - ); - assert!( - matches!(property.value(), super::Parameters::Multiple(params) if params["INTERVAL"] == "1") - ); - } - - #[test] - fn test_exdate() { - let property = Property::from_string("EXDATE;VALUE=DATE-TIME:19980313T090000Z").unwrap(); - - assert_eq!(property.name(), "EXDATE"); - assert_eq!(property.parameters().len(), 1); - assert_eq!(property.parameters()["VALUE"], "DATE-TIME"); - assert!( - matches!(property.value(), super::Parameters::Single(value) if value == &"19980313T090000Z") - ); - } - - #[test] - fn test_key_value() { - let property = Property::from_string("KEY:VALUE").unwrap(); - - assert_eq!(property.name(), "KEY"); - assert_eq!(property.parameters().len(), 0); - assert!(matches!(property.value(), super::Parameters::Single(value) if value == &"VALUE")); - } - - #[test] - fn test_rrule_to_string() { - let rrule_strings = vec![ - "RRULE:FREQ=DAILY;INTERVAL=1", - "RRULE:FREQ=DAILY;UNTIL=20220101T000000Z;INTERVAL=1", - "RRULE:INTERVAL=1", - "RRULE:INTERVAL=1", - ]; - - rrule_strings.iter().for_each(|rrule_string| { - let property = Property::from_string(rrule_string).unwrap(); +impl FromStr for Property { + type Err = Error; - assert_eq!(property.to_string(), rrule_string.to_string()); - }); + fn from_str(str: &str) -> Result { + Property::from_string(str) } } diff --git a/lib/serialization/rrule.rs b/lib/serialization/rrule.rs deleted file mode 100644 index ab2d92e..0000000 --- a/lib/serialization/rrule.rs +++ /dev/null @@ -1,376 +0,0 @@ -use indexmap::IndexMap; - -use super::{Parameters, Property}; -use crate::js::{DateTime, Frequency, NWeekday, RRule, Weekday}; -use crate::serialization::to_string_array::ToStringArray; -use crate::serialization::to_vec::ToVec; -use std::str::FromStr; - -impl Into for &RRule { - fn into(self) -> Property { - let mut value: IndexMap = IndexMap::new(); - - if let Ok(freq) = self.frequency() { - value.insert("FREQ".to_string(), freq.into()); - } - - if let Ok(count) = self.count() { - if let Some(count) = count { - value.insert("COUNT".to_string(), count.to_string()); - } - } - - if let Ok(until) = self.until() { - if let Some(until) = until { - let datetime = DateTime::from(until); - value.insert("UNTIL".to_string(), datetime.into()); - } - } - - if let Ok(interval) = self.interval() { - if interval > 1 { - value.insert("INTERVAL".to_string(), interval.to_string()); - } - } - - if let Ok(weekstart) = self.weekstart() { - if weekstart != Weekday::Monday { - value.insert("WKST".to_string(), weekstart.into()); - } - } - - if let Ok(by_setpos) = self.by_setpos() { - if (by_setpos.len() > 0) { - // TODO: use to_string_array - let by_month: Vec = by_setpos.iter().map(|month| month.to_string()).collect(); - value.insert("BYSETPOS".to_string(), by_month.join(",")); - } - } - - if let Ok(by_month) = self.by_month() { - if (by_month.len() > 0) { - // TODO: use to_string_array - let by_month: Vec = by_month.iter().map(|month| month.to_string()).collect(); - value.insert("BYMONTH".to_string(), by_month.join(",")); - } - } - - if let Ok(by_monthday) = self.by_monthday() { - if (by_monthday.len() > 0) { - value.insert( - "BYMONTHDAY".to_string(), - by_monthday.iter().to_string_array(), - ); - } - } - - if let Ok(by_weekno) = self.by_weekno() { - if (by_weekno.len() > 0) { - // TODO: use to_string_array - let by_weekno: Vec = by_weekno.iter().map(|month| month.to_string()).collect(); - value.insert("BYWEEKNO".to_string(), by_weekno.join(",")); - } - } - - if let Ok(by_hour) = self.by_hour() { - if (by_hour.len() > 0) { - value.insert("BYHOUR".to_string(), by_hour.iter().to_string_array()); - } - } - - if let Ok(by_minute) = self.by_minute() { - if (by_minute.len() > 0) { - value.insert("BYMINUTE".to_string(), by_minute.iter().to_string_array()); - } - } - - if let Ok(by_second) = self.by_second() { - if (by_second.len() > 0) { - value.insert("BYSECOND".to_string(), by_second.iter().to_string_array()); - } - } - - if let Ok(by_yearday) = self.by_yearday() { - if (by_yearday.len() > 0) { - // TODO: use to_string_array - let by_yearday: Vec = by_yearday.iter().map(|month| month.to_string()).collect(); - value.insert("BYYEARDAY".to_string(), by_yearday.join(",")); - } - } - - if let Ok(by_weekday) = self.by_weekday() { - if (by_weekday.len() > 0) { - let by_weekday: Vec = by_weekday - .iter() - .map(|n_weekday| { - let n_weekday: String = n_weekday.into(); - - n_weekday - }) - .collect(); - - value.insert("BYDAY".to_string(), by_weekday.join(",")); - } - } - - Property::new( - "RRULE".to_string(), - IndexMap::new(), - Parameters::Multiple(value), - ) - } -} - -impl Into for &RRule { - fn into(self) -> String { - let property: Property = self.into(); - - property.to_string()[6..].to_string() - } -} - -impl TryFrom for RRule { - type Error = napi::Error; - - fn try_from(property: Property) -> Result { - if property.name() != "RRULE" && property.name() != "EXRULE" { - return Err(napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid property name: {}", property.name()), - )); - } - - let value = match property.value() { - Parameters::Multiple(value) => value, - Parameters::Single(value) => { - return Err(napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid {}: {}", property.name(), value), - )) - } - }; - - let rrule = rrule::RRule::new(rrule::Frequency::Daily); - - let rrule = match value.get("FREQ") { - Some(value) => { - let freq = value.parse::().map_err(|err| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid FREQ value: {}", value), - ) - })?; - - rrule.freq(freq.into()) - } - None => rrule, - }; - - let rrule = match value.get("INTERVAL") { - Some(value) => { - let interval = value.parse::().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid INTERVAL value: {}", value), - ) - })?; - - rrule.interval(interval) - } - None => rrule, - }; - - let rrule = match value.get("UNTIL") { - Some(value) => { - let until: DateTime = value.parse().map_err(|err| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid UNTIL value: {}", value), - ) - })?; - - rrule.until(until.to_rrule_datetime(&rrule::Tz::Local(chrono::Local::now().timezone()))?) - } - None => rrule, - }; - - let rrule = match value.get("COUNT") { - Some(value) => { - let count = value.parse::().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid COUNT value: {}", value), - ) - })?; - - rrule.count(count) - } - None => rrule, - }; - - let rrule = match value.get("BYHOUR") { - Some(value) => { - let by_hour: Vec = value.as_str().to_vec().map_err(|err| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYHOUR value: {}", value), - ) - })?; - - rrule.by_hour(by_hour) - } - None => rrule, - }; - - let rrule = match value.get("BYMINUTE") { - Some(value) => { - let by_minute: Vec = value.as_str().to_vec().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYMINUTE value: {}", value), - ) - })?; - - rrule.by_minute(by_minute) - } - None => rrule, - }; - - let rrule = match value.get("BYSECOND") { - Some(value) => { - let by_second: Vec = value.as_str().to_vec().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYSECOND value: {}", value), - ) - })?; - - rrule.by_second(by_second) - } - None => rrule, - }; - - let rrule = match value.get("BYMONTH") { - Some(value) => { - let by_month: Vec = value.as_str().to_vec().map_err(|err| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYMONTH value: {}", value), - ) - })?; - - rrule.by_month(&by_month) - } - None => rrule, - }; - - let rrule = match value.get("WKST") { - Some(value) => { - let week_start = value.parse::().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid WKST value: {}", value), - ) - })?; - - rrule.week_start(week_start.into()) - } - None => rrule, - }; - - let rrule = match value.get("BYDAY") { - Some(value) => { - let week_day: Vec = value.as_str().to_vec().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYDAY value: {}", value), - ) - })?; - let week_day = week_day - .into_iter() - .map(|n_weekday| n_weekday.into()) - .collect(); - - rrule.by_weekday(week_day) - } - None => rrule, - }; - - let rrule = match value.get("BYSETPOS") { - Some(value) => { - let by_setpos: Vec = value.as_str().to_vec().map_err(|err| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYSETPOS value: {}", value), - ) - })?; - - rrule.by_set_pos(by_setpos) - } - None => rrule, - }; - - let rrule = match value.get("BYMONTHDAY") { - Some(value) => { - let by_monthday: Vec = value.as_str().to_vec().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYMONTHDAY value: {}", value), - ) - })?; - - rrule.by_month_day(by_monthday) - } - None => rrule, - }; - - let rrule = match value.get("BYYEARDAY") { - Some(value) => { - let by_yearday: Vec = value.as_str().to_vec().map_err(|err| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYYEARDAY value: {}", value), - ) - })?; - - rrule.by_year_day(by_yearday) - } - None => rrule, - }; - - let rrule = match value.get("BYWEEKNO") { - Some(value) => { - let by_weekno: Vec = value.as_str().to_vec().map_err(|err| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Invalid BYWEEKNO value: {}", value), - ) - })?; - - rrule.by_week_no(by_weekno) - } - None => rrule, - }; - - Ok(Self::from_rrule(rrule)?) - } -} - -impl FromStr for RRule { - type Err = napi::Error; - - fn from_str(str: &str) -> Result { - let str = if !str.to_uppercase().starts_with("RRULE:") { - format!("RRULE:{}", str) - } else { - str.to_string() - }; - - let property = crate::serialization::Property::from_string(&str) - .map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?; - - let rrule = RRule::try_from(property)?; - - Ok(rrule) - } -} diff --git a/lib/serialization/rrule_set.rs b/lib/serialization/rrule_set.rs deleted file mode 100644 index e0a2dd0..0000000 --- a/lib/serialization/rrule_set.rs +++ /dev/null @@ -1,155 +0,0 @@ -use indexmap::IndexMap; - -use crate::serialization::to_vec::ToVec; -use std::str::FromStr; - -use super::{Calendar, Parameters, Properties, Property}; -use crate::js::{DateTime, RRule, RRuleSet}; - -impl FromStr for RRuleSet { - type Err = napi::Error; - - fn from_str(str: &str) -> Result { - let mut dtstart: Option<(i64, String)> = None; - let mut rrules: Vec = Vec::new(); - let mut exrules: Vec = Vec::new(); - let mut exdates: Vec = Vec::new(); - let mut rdates: Vec = Vec::new(); - - let calendar = Calendar::from_str(str)?; - let (calendar_dtstarts, calendar_rrules, calendar_exrules, calendar_exdates, calendar_rdates) = - calendar.into(); - - if calendar_dtstarts.len() > 1 { - return Err(napi::Error::new( - napi::Status::GenericFailure, - "Only one DTSTART is allowed", - )); - } - - dtstart = calendar_dtstarts - .first() - .and_then(|item| Some(item.clone())); - - let (dtstart, tzid) = match dtstart { - Some(value) => value, - None => { - return Err(napi::Error::new( - napi::Status::GenericFailure, - "DTSTART is required", - )); - } - }; - - for rrule in calendar_rrules { - rrules.push(rrule); - } - - for exrule in calendar_exrules { - exrules.push(exrule); - } - - for exdate in calendar_exdates { - exdates.push(exdate); - } - - for rdate in calendar_rdates { - rdates.push(rdate); - } - - return Self::create( - dtstart, - tzid, - Some(rrules.iter().collect()), - Some(exrules.iter().collect()), - Some(exdates), - Some(rdates), - ); - } -} - -impl Into for &RRuleSet { - fn into(self) -> String { - let mut properties = Properties::new(); - let mut dtstart_parameters: IndexMap = IndexMap::new(); - dtstart_parameters.insert("TZID".to_string(), self.tzid()); - - let dtstart_value: String = DateTime::from(self.dtstart()).into(); - - properties.push(Property::new( - "DTSTART".to_string(), - dtstart_parameters, - Parameters::Single(dtstart_value), - )); - - for rrule in self.rrules().iter() { - properties.push(rrule.into()); - } - - for exrule in self.exrules().iter() { - properties.push(exrule.into()); - } - - if !self.exdates().is_empty() { - properties.push(Property::new( - "EXDATE".to_string(), - IndexMap::new(), - Parameters::Single( - self - .exdates() - .into_iter() - .map(|date| { - let date: DateTime = date.into(); - let date: String = date.into(); - - date - }) - .collect(), - ), - )); - } - - if !self.rdates().is_empty() { - properties.push(Property::new( - "RDATE".to_string(), - IndexMap::new(), - Parameters::Single( - self - .rdates() - .into_iter() - .map(|date| { - let date: DateTime = date.into(); - let date: String = date.into(); - - date - }) - .collect(), - ), - )); - } - - properties.to_string() - } -} - -fn property_to_dtstart(property: &Property) -> Result<(i64, String), String> { - let datetime = match property.value() { - Parameters::Single(value) => value, - Parameters::Multiple(_) => return Err("Invalid DTSTART value".to_string()), - }; - let datetime: DateTime = datetime.parse()?; - - let tzid = match property.parameters().get("TZID") { - Some(value) => value.to_string(), - None => { - if datetime.utc() { - "UTC".to_string() - } else { - return Err("TZID is requred for non-UTC DTSTART".to_string()); - } - } - }; - let datetime: i64 = datetime.into(); - - Ok((datetime, tzid)) -} diff --git a/lib/serialization/to_string_array.rs b/lib/serialization/to_string_array.rs deleted file mode 100644 index e697cf7..0000000 --- a/lib/serialization/to_string_array.rs +++ /dev/null @@ -1,23 +0,0 @@ -pub trait ToStringArray -where - T: ToString, - V: Iterator, -{ - fn to_string_array(self) -> String; -} - -impl ToStringArray for V -where - T: ToString, - V: Iterator, -{ - fn to_string_array(self) -> String { - let mut data: Vec = Vec::new(); - - for item in self { - data.push(item.to_string()); - } - - data.join(",") - } -} diff --git a/lib/serialization/to_vec.rs b/lib/serialization/to_vec.rs deleted file mode 100644 index 9b9178d..0000000 --- a/lib/serialization/to_vec.rs +++ /dev/null @@ -1,29 +0,0 @@ -use napi::Error; -use std::{any::type_name, str::FromStr}; - -pub trait ToVec -where - T: FromStr, -{ - fn to_vec(&self) -> Result, Error>; -} - -impl ToVec for &str -where - T: FromStr, -{ - fn to_vec(&self) -> Result, Error> { - let mut data = Vec::new(); - - for item in self.split(',') { - data.push(item.parse().map_err(|_| { - napi::Error::new( - napi::Status::GenericFailure, - format!("Couldn't convert {} to {}", item, type_name::()), - ) - })?) - } - - Ok(data) - } -} diff --git a/src/lib/index.d.ts b/src/lib/index.d.ts index 3239dd5..1d5bde5 100644 --- a/src/lib/index.d.ts +++ b/src/lib/index.d.ts @@ -27,12 +27,6 @@ export enum Month { December = 11 } export interface NWeekday { - /** - * If set, this represents the nth occurrence of the weekday. - * Otherwise it represents every occurrence of the weekday. - * - * A negative value represents nth occurrence from the end. - */ n?: number weekday: Weekday } @@ -46,13 +40,12 @@ export enum Weekday { Sunday = 6 } export class RRule { - constructor(frequency: Frequency) - static create(frequency?: Frequency | undefined | null, interval?: number | undefined | null, count?: number | undefined | null, byWeekday?: (readonly (NWeekday | Weekday)[]) | undefined | null, byHour?: (readonly number[]) | undefined | null, byMinute?: (readonly number[]) | undefined | null, bySecond?: (readonly number[]) | undefined | null, byMonthday?: (readonly number[]) | undefined | null, bySetpos?: (readonly number[]) | undefined | null, byMonth?: (readonly number[]) | undefined | null, byWeekno?: (readonly number[]) | undefined | null, byYearday?: (readonly number[]) | undefined | null, weekstart?: Weekday | undefined | null, until?: number | undefined | null): RRule + constructor(frequency: Frequency, interval?: number | undefined | null, count?: number | undefined | null, weekstart?: Weekday | undefined | null, until?: number | undefined | null, byDay?: (readonly (NWeekday | Weekday)[]) | undefined | null, byHour?: (readonly number[]) | undefined | null, byMinute?: (readonly number[]) | undefined | null, bySecond?: (readonly number[]) | undefined | null, byMonthday?: (readonly number[]) | undefined | null, bySetpos?: (readonly number[]) | undefined | null, byMonth?: (readonly number[]) | undefined | null, byWeekno?: (readonly number[]) | undefined | null, byYearday?: (readonly number[]) | undefined | null) static parse(str: string): RRule get frequency(): Frequency - get interval(): number + get interval(): number | null get count(): number | null - get byWeekday(): NWeekday[] + get byDay(): NWeekday[] get byHour(): Array get byMinute(): Array get bySecond(): Array @@ -61,44 +54,28 @@ export class RRule { get byMonth(): Month[] get byWeekno(): Array get byYearday(): Array - get weekstart(): Weekday + get weekstart(): Weekday | null get until(): number | null toString(): string - setInterval(interval: number): this - setCount(count: number): this - setByWeekday(weekdays: readonly (NWeekday | Weekday)[]): this - setByHour(hours: readonly number[]): this - setByMinute(minutes: readonly number[]): this - setBySecond(seconds: readonly number[]): this - setByMonthday(days: readonly number[]): this - setBySetpos(poses: readonly number[]): this - setByMonth(months: readonly Month[]): this - setByWeekno(weekNumbers: readonly number[]): this - setByYearday(days: readonly number[]): this - setWeekstart(day: Weekday): this - setUntil(datetime: number): this } export class RRuleSet { - constructor(dtstart: number, tzid: string) - static create(dtstart: number, tzid: string, rrules?: (readonly RRule[]) | undefined | null, exrules?: (readonly RRule[]) | undefined | null, exdates?: (readonly number[]) | undefined | null, rdates?: (readonly number[]) | undefined | null): RRuleSet - get tzid(): string + constructor(dtstart: number, tzid?: string | undefined | null, rrules?: (readonly RRule[]) | undefined | null, exrules?: (readonly RRule[]) | undefined | null, exdates?: (readonly number[]) | undefined | null, rdates?: (readonly number[]) | undefined | null) + get tzid(): string | null get dtstart(): number get rrules(): RRule[] get exrules(): RRule[] get exdates(): number[] get rdates(): number[] static parse(str: string): RRuleSet - setDtstart(str: string): this - setFromString(str: string): this - addRrule(rrule: RRule): this - addExrule(rrule: RRule): this - addExdate(datetime: number): this - addRdate(datetime: number): this all(limit?: number | undefined | null): number[] between(afterDatetime: number, beforeDatetime: number, inclusive?: boolean | undefined | null): number[] + setFromString(str: string): this toString(): string - iter(): RRuleSetIter + iterator(): RRuleSetIterator +} +export class RRuleSetIterator { + iterator(): RRuleSetIteratorIterable } -export class RRuleSetIter { +export class RRuleSetIteratorIterable { [Symbol.iterator](): Iterator } diff --git a/src/lib/index.js b/src/lib/index.js index a45682d..c442529 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -310,11 +310,12 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { Frequency, Month, RRule, RRuleSet, RRuleSetIter, Weekday } = nativeBinding +const { Frequency, Month, RRule, RRuleSet, RRuleSetIterator, RRuleSetIteratorIterable, Weekday } = nativeBinding module.exports.Frequency = Frequency module.exports.Month = Month module.exports.RRule = RRule module.exports.RRuleSet = RRuleSet -module.exports.RRuleSetIter = RRuleSetIter +module.exports.RRuleSetIterator = RRuleSetIterator +module.exports.RRuleSetIteratorIterable = RRuleSetIteratorIterable module.exports.Weekday = Weekday diff --git a/src/rrule-set.ts b/src/rrule-set.ts index 16aaf0e..25da2fe 100644 --- a/src/rrule-set.ts +++ b/src/rrule-set.ts @@ -4,7 +4,7 @@ import { DateTime } from './datetime'; export interface RRuleSetLike { readonly dtstart: DateTime; - readonly tzid: string; + readonly tzid?: string; readonly rrules: readonly RRule[]; readonly exrules: readonly RRule[]; readonly exdates: readonly DateTime[]; @@ -22,9 +22,12 @@ export class RRuleSet implements Iterable { public readonly exdates: readonly DateTime[]; public readonly rdates: readonly DateTime[]; - constructor(dtstart: DateTime, tzid: string); + constructor(dtstart: DateTime, tzid: string | undefined); constructor(options: Partial); - constructor(setOrDtstart?: DateTime | Partial, tzid?: string) { + constructor( + setOrDtstart?: DateTime | Partial, + tzid?: string | undefined, + ) { if (!(setOrDtstart instanceof DateTime)) { if (setOrDtstart?.dtstart) { this.dtstart = setOrDtstart?.dtstart; @@ -76,7 +79,7 @@ export class RRuleSet implements Iterable { public static fromRust(rust: Rust): RRuleSet { const set = new RRuleSet({ dtstart: DateTime.fromNumeric(rust.dtstart), - tzid: rust.tzid, + tzid: rust.tzid ?? undefined, rrules: rust.rrules.map((rrule) => RRule.fromRust(rrule)), exrules: rust.exrules.map((rrule) => RRule.fromRust(rrule)), exdates: rust.exdates.map((datetime) => DateTime.fromNumeric(datetime)), @@ -200,7 +203,7 @@ export class RRuleSet implements Iterable { */ public toRust(): Rust { if (!this.rust) { - this.rust = Rust.create( + this.rust = new Rust( this.dtstart.toNumeric(), this.tzid, this.rrules.map((rrule) => rrule.toRust()), @@ -232,7 +235,7 @@ export class RRuleSet implements Iterable { } public [Symbol.iterator]() { - const iter = this.toRust().iter()[Symbol.iterator](); + const iter = this.toRust().iterator().iterator()[Symbol.iterator](); return { next: () => { diff --git a/src/rrule.ts b/src/rrule.ts index 744eac3..b6c736b 100644 --- a/src/rrule.ts +++ b/src/rrule.ts @@ -49,7 +49,7 @@ export enum Weekday { export interface RRuleLike { readonly frequency: Frequency; - readonly interval: number; + readonly interval?: number; readonly count?: number; readonly until?: DateTime; readonly byWeekday: readonly (NWeekday | Weekday)[]; @@ -61,7 +61,7 @@ export interface RRuleLike { readonly byMonth: readonly Month[]; readonly byWeekno: readonly number[]; readonly byYearday: readonly number[]; - readonly weekstart: Weekday; + readonly weekstart?: Weekday; } export class RRule { @@ -69,7 +69,7 @@ export class RRule { private rust?: Rust; public readonly frequency: Frequency; - public readonly interval: number; + public readonly interval?: number; public readonly until?: DateTime; public readonly count?: number; public readonly byWeekday: readonly (NWeekday | Weekday)[]; @@ -81,14 +81,14 @@ export class RRule { public readonly byMonth: readonly Month[]; public readonly byWeekno: readonly number[]; public readonly byYearday: readonly number[]; - public readonly weekstart: Weekday; + public readonly weekstart?: Weekday; constructor(frequency: Frequency); constructor(rrule?: Partial); constructor(rruleOrFrequency: number | Partial = {}) { if (typeof rruleOrFrequency === 'object' && rruleOrFrequency !== null) { this.frequency = rruleOrFrequency.frequency ?? Frequency.Daily; - this.interval = rruleOrFrequency.interval ?? 1; + this.interval = rruleOrFrequency.interval; this.until = rruleOrFrequency.until; this.count = rruleOrFrequency.count; this.byWeekday = rruleOrFrequency.byWeekday ?? []; @@ -100,10 +100,9 @@ export class RRule { this.byMonth = rruleOrFrequency.byMonth ?? []; this.byWeekno = rruleOrFrequency.byWeekno ?? []; this.byYearday = rruleOrFrequency.byYearday ?? []; - this.weekstart = rruleOrFrequency.weekstart ?? Weekday.Monday; + this.weekstart = rruleOrFrequency.weekstart; } else { this.frequency = rruleOrFrequency; - this.interval = 1; this.byWeekday = []; this.byHour = []; this.byMinute = []; @@ -113,7 +112,6 @@ export class RRule { this.byMonth = []; this.byWeekno = []; this.byYearday = []; - this.weekstart = Weekday.Monday; } } @@ -132,10 +130,10 @@ export class RRule { public static fromRust(rust: Rust) { const rrule = new this({ frequency: rust.frequency, - interval: rust.interval, + interval: rust.interval ?? undefined, until: rust.until === null ? undefined : DateTime.fromNumeric(rust.until), count: rust.count === null ? undefined : rust.count, - byWeekday: rust.byWeekday, + byWeekday: rust.byDay, byHour: rust.byHour, byMinute: rust.byMinute, bySecond: rust.bySecond, @@ -144,7 +142,7 @@ export class RRule { byMonth: rust.byMonth, byWeekno: rust.byWeekno, byYearday: rust.byYearday, - weekstart: rust.weekstart, + weekstart: rust.weekstart ?? undefined, }); rrule.rust = rust; @@ -217,10 +215,12 @@ export class RRule { */ public toRust(): Rust { if (!this.rust) { - this.rust = Rust.create( + this.rust = new Rust( this.frequency, this.interval, this.count, + this.weekstart, + this.until?.toNumeric(), this.byWeekday, this.byHour, this.byMinute, @@ -230,8 +230,6 @@ export class RRule { this.byMonth, this.byWeekno, this.byYearday, - this.weekstart, - this.until?.toNumeric(), ); } diff --git a/tests/daily.spec.ts b/tests/daily.spec.ts index 87ed50a..44196e7 100644 --- a/tests/daily.spec.ts +++ b/tests/daily.spec.ts @@ -11,7 +11,7 @@ test('Daily for 10 occurrences', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -43,7 +43,7 @@ test('Daily for 10 occurrences between 873550800000 and 873723600000 inclusively const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', ); expect(dates).toEqual([ DateTime.create(1997, 9, 6, 9, 0, 0, false), @@ -67,7 +67,7 @@ test('Daily for 10 occurrences between 873550800000 and 873723600000 exclusively const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', ); expect(dates).toEqual([DateTime.create(1997, 9, 7, 9, 0, 0, false)]); }); @@ -85,7 +85,7 @@ test('Daily until September 6, 1997', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=19970906T130000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=19970906T090000', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -108,7 +108,7 @@ test('Every other day', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=6;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;INTERVAL=2;COUNT=6', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -132,7 +132,7 @@ test('Every 10 days, 5 occurrences', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=5;INTERVAL=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;INTERVAL=10;COUNT=5', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -158,7 +158,7 @@ test('Every Monday in January, for 3 years', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=20000131T190000Z;BYMONTH=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', ); expect(dates).toEqual([ DateTime.create(1998, 1, 5, 9, 0, 0, false), @@ -208,7 +208,7 @@ test('Every Monday in January, for 3 years except Jan 31 2000', () => { DateTime.create(2000, 1, 24, 9, 0, 0, false), ]); expect(set.rrules.map((rrule) => rrule.toString())).toEqual([ - 'FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', + 'RRULE:FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', ]); expect(set.exrules).toEqual([]); expect([...set]).toEqual(dates); diff --git a/tests/monthly.spec.ts b/tests/monthly.spec.ts index 57407a1..682b5e5 100644 --- a/tests/monthly.spec.ts +++ b/tests/monthly.spec.ts @@ -14,7 +14,7 @@ test('Monthly on the 1st Friday for 10 occurrences', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYSETPOS=1;BYDAY=FR', ); expect(dates).toEqual([ DateTime.create(1997, 9, 5, 9, 0, 0, false), @@ -45,7 +45,7 @@ test('Monthly on the 1st Friday until December 24, 1997', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;UNTIL=19971224T050000Z;BYSETPOS=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;UNTIL=19971224T000000;BYSETPOS=1;BYDAY=FR', ); expect(dates).toEqual([ DateTime.create(1997, 9, 5, 9, 0, 0, false), @@ -71,7 +71,7 @@ test('Every other month on the 1st and last Sunday of the month for 10 occurrenc const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYSETPOS=-1,1;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=SU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYSETPOS=1,-1;BYDAY=SU,SU', ); expect(dates).toEqual([ DateTime.create(1997, 9, 7, 9, 0, 0, false), @@ -102,7 +102,7 @@ test('Monthly on the second to last Monday of the month for 6 months', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYSETPOS=-2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYSETPOS=-2;BYDAY=MO', ); expect(dates).toEqual([ DateTime.create(1997, 9, 22, 9, 0, 0, false), @@ -126,7 +126,7 @@ test('Monthly on the third to the last day of the month, limit 6', () => { const dates = set.all(6); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;BYMONTHDAY=-3', ); expect(dates).toEqual([ DateTime.create(1997, 9, 28, 9, 0, 0, false), @@ -151,7 +151,7 @@ test('Monthly on the 2nd and 15th of the month for 10 occurrences', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -181,7 +181,7 @@ test('Monthly on the first and last day of the month for 10 occurrences', () => const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1', ); expect(dates).toEqual([ DateTime.create(1997, 9, 30, 9, 0, 0, false), @@ -212,7 +212,7 @@ test('Every 18 months on the 10th thru 15th of the month for 10 occurrences', () const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,15;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15', ); expect(dates).toEqual([ DateTime.create(1997, 9, 10, 9, 0, 0, false), @@ -268,7 +268,7 @@ test('Every Tuesday, every other month, limit 18', () => { const dates = set.all(18); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -305,7 +305,7 @@ test('Monthly on the second to last Monday of the month for 6 months 1', () => { const dates = set.all(8); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970922T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-2MO', + 'DTSTART;TZID=US/Eastern:19970922T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO', ); expect(dates).toEqual([ DateTime.create(1997, 9, 22, 9, 0, 0, false), diff --git a/tests/parsing.spec.ts b/tests/parsing.spec.ts index 28be037..698dfb4 100644 --- a/tests/parsing.spec.ts +++ b/tests/parsing.spec.ts @@ -7,7 +7,7 @@ test('Should properly parse weekly recurrence', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', ); }); @@ -18,7 +18,7 @@ test('Should properly parse monthly recurrence', () => { const asString = set.toString(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=-1SU,SU', + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', ); }); @@ -103,7 +103,7 @@ test('Should properly parse weekly individual recurrence rule', () => { const asString = rule.toString(); expect(asString).toBe( - 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYDAY=MO,WE,FR', + 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', ); }); @@ -114,7 +114,7 @@ test('Should properly parse individual recurrence rule with RRULE prefix', () => const asString = rule.toString(); expect(asString).toBe( - 'FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYDAY=MO,WE,FR', + 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', ); }); @@ -124,11 +124,10 @@ test('Should properly parse monthly individual recurrence rule', () => { expect(rule.interval).toBe(2); expect(rule.count).toBe(10); - // TODO: NWeekday not supported yet - //expect(rule.byWeekday) - const asString = rule.toString(); - expect(asString).toBe('FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYDAY=SU,-1SU'); + expect(asString).toBe( + 'RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', + ); }); test('Should throw error on invalid individual recurrence rule', () => { @@ -168,7 +167,7 @@ test('Should be able to parse rule set without dtstart', () => { ); expect(set.toString()).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', ); }); @@ -181,7 +180,7 @@ test('Should parse dtstart from string', () => { ); expect(set.toString()).toBe( - 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', ); }); @@ -194,7 +193,6 @@ test('Should add rrule with until', () => { ); expect(set.toString()).toBe( - // TODO: return until in local timezone - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=20220513T040000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU,WE,TH,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=20220513T000000;BYDAY=FR,TH,TU,WE;WKST=MO', ); }); diff --git a/tests/weekly.spec.ts b/tests/weekly.spec.ts index 8fd92c2..a3677bb 100644 --- a/tests/weekly.spec.ts +++ b/tests/weekly.spec.ts @@ -11,7 +11,7 @@ test('Weekly for 10 occurrences', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;COUNT=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;COUNT=10', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -41,7 +41,7 @@ test('Weekly until December 24, 1997', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T050000Z;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -78,7 +78,7 @@ test('Every other week - limit 10', () => { const dates = set.all(10); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU', ); expect(dates).toEqual([ DateTime.create(1997, 9, 2, 9, 0, 0, false), @@ -109,7 +109,7 @@ test('Every other week on Monday, Wednesday and Friday until December 24, 1997, const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T050000Z;INTERVAL=2;WKST=SU;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO,WE,FR', + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000;BYDAY=MO,WE,FR;WKST=SU', ); expect(dates).toEqual([ // TODO: rrule crate does not include dtstart date (873205200000), create a bug report diff --git a/tests/yearly.spec.ts b/tests/yearly.spec.ts index 931222d..e20aa92 100644 --- a/tests/yearly.spec.ts +++ b/tests/yearly.spec.ts @@ -13,7 +13,7 @@ test('Yearly in June and July for 10 occurrences', () => { const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7', ); expect(dates).toEqual([ DateTime.create(1997, 6, 10, 9, 0, 0, false), @@ -44,7 +44,7 @@ test('Every other year on January, February, and March for 10 occurrences', () = const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970310T090000\nRRULE:FREQ=YEARLY;COUNT=10;INTERVAL=2;BYMONTH=1,2,3;BYMONTHDAY=10;BYHOUR=9;BYMINUTE=0;BYSECOND=0', + 'DTSTART;TZID=US/Eastern:19970310T090000\nRRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3', ); expect(dates).toEqual([ DateTime.create(1997, 3, 10, 9, 0, 0, false), @@ -75,7 +75,7 @@ test('Every 3rd year on the 1st, 100th and 200th day for 10 occurrences', () => const dates = set.all(); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970101T090000\nRRULE:FREQ=YEARLY;COUNT=10;INTERVAL=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYYEARDAY=1,100,200', + 'DTSTART;TZID=US/Eastern:19970101T090000\nRRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200', ); expect(dates).toEqual([ DateTime.create(1997, 1, 1, 9, 0, 0, false), @@ -105,7 +105,7 @@ test('Every 20th Monday of the year, limit 3', () => { const dates = set.all(3); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYSETPOS=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYSETPOS=20;BYDAY=MO', ); expect(dates).toEqual([ DateTime.create(1997, 5, 19, 9, 0, 0, false), @@ -128,7 +128,7 @@ test('Monday of week number 20 (where the default start of the week is Monday), const dates = set.all(3); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYWEEKNO=20;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=MO', + 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO;WKST=MO', ); expect(dates).toEqual([ DateTime.create(1997, 5, 12, 9, 0, 0, false), @@ -150,7 +150,7 @@ test('Every Thursday in March, limit 11', () => { const dates = set.all(11); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970313T090000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TH', + 'DTSTART;TZID=US/Eastern:19970313T090000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH', ); expect(dates).toEqual([ DateTime.create(1997, 3, 13, 9, 0, 0, false), @@ -183,7 +183,7 @@ test('Every Friday the 13th, limit 5', () => { expect(asString).toBe( 'DTSTART;TZID=US/Eastern:19970902T090000\n' + - 'RRULE:FREQ=YEARLY;BYMONTHDAY=13;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=FR\n' + + 'RRULE:FREQ=YEARLY;BYMONTHDAY=13;BYDAY=FR\n' + 'EXDATE:19980313T090000', ); expect(dates).toEqual([ @@ -210,7 +210,7 @@ test('Every four years, the first Tuesday after a Monday in November, forever (U const dates = set.all(3); expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19961105T090000\nRRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYMONTHDAY=2,3,4,5,6,7,8;BYHOUR=9;BYMINUTE=0;BYSECOND=0;BYDAY=TU', + 'DTSTART;TZID=US/Eastern:19961105T090000\nRRULE:FREQ=YEARLY;INTERVAL=4;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11;BYDAY=TU', ); expect(dates).toEqual([ DateTime.create(1996, 11, 5, 9, 0, 0, false), From 4657ec139306365c1daca0a3cf02fa2f783a9f6f Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 14:10:39 +0700 Subject: [PATCH 51/63] refactor: use `byWeekday` name (#173) --- lib/js/rrule.rs | 20 +++++++++++++------- lib/rrule/rrule.rs | 27 ++++++++++++++++----------- src/lib/index.d.ts | 4 ++-- src/rrule.ts | 2 +- 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/lib/js/rrule.rs b/lib/js/rrule.rs index 0833b0e..7b7bbaa 100644 --- a/lib/js/rrule.rs +++ b/lib/js/rrule.rs @@ -17,9 +17,8 @@ impl RRule { count: Option, weekstart: Option, until: Option, - #[napi(ts_arg_type = "(readonly (NWeekday | Weekday)[]) | undefined | null")] by_day: Option< - Vec>, - >, + #[napi(ts_arg_type = "(readonly (NWeekday | Weekday)[]) | undefined | null")] + by_weekday: Option>>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_hour: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_minute: Option>, #[napi(ts_arg_type = "(readonly number[]) | undefined | null")] by_second: Option>, @@ -48,8 +47,8 @@ impl RRule { rrule = rrule.set_by_weekno(by_weekno.unwrap_or_default()); rrule = rrule.set_by_yearday(by_yearday.unwrap_or_default()); rrule = rrule.set_weekstart(weekstart.map(|weekday| weekday.into())); - rrule = rrule.set_by_day( - by_day + rrule = rrule.set_by_weekday( + by_weekday .unwrap_or_default() .into_iter() .map(|day| match day { @@ -89,8 +88,15 @@ impl RRule { } #[napi(getter, ts_return_type = "NWeekday[]")] - pub fn by_day(&self) -> napi::Result> { - Ok(self.rrule.by_day().iter().map(|nday| nday.into()).collect()) + pub fn by_weekday(&self) -> napi::Result> { + Ok( + self + .rrule + .by_weekday() + .iter() + .map(|nday| nday.into()) + .collect(), + ) } #[napi(getter)] diff --git a/lib/rrule/rrule.rs b/lib/rrule/rrule.rs index 3c6893d..5132c2a 100644 --- a/lib/rrule/rrule.rs +++ b/lib/rrule/rrule.rs @@ -17,7 +17,7 @@ pub struct RRule { interval: Option, count: Option, weekstart: Option, - by_day: Vec, + by_weekday: Vec, by_hour: Vec, by_minute: Vec, by_second: Vec, @@ -36,7 +36,7 @@ impl RRule { count: None, until: None, weekstart: None, - by_day: Vec::new(), + by_weekday: Vec::new(), by_hour: Vec::new(), by_minute: Vec::new(), by_second: Vec::new(), @@ -95,8 +95,8 @@ impl RRule { Self { by_weekno, ..self } } - pub fn set_by_day(self, by_day: Vec) -> Self { - Self { by_day, ..self } + pub fn set_by_weekday(self, by_weekday: Vec) -> Self { + Self { by_weekday, ..self } } pub fn set_weekstart(self, weekstart: Option) -> Self { @@ -115,8 +115,8 @@ impl RRule { self.count } - pub fn by_day(&self) -> &Vec { - &self.by_day + pub fn by_weekday(&self) -> &Vec { + &self.by_weekday } pub fn by_hour(&self) -> &Vec { @@ -215,11 +215,11 @@ impl RRule { value.insert("BYWEEKNO".to_string(), self.by_weekno.iter().join(",")); } - if !self.by_day.is_empty() { + if !self.by_weekday.is_empty() { value.insert( "BYDAY".to_string(), self - .by_day + .by_weekday .iter() .map(|day| Into::::into(day)) .join(","), @@ -276,7 +276,7 @@ impl RRule { let by_second = value.get_as_vec::("BYSECOND")?; let by_month = value.get_as_vec::("BYMONTH")?; let weekstart = value.get_as::("WKST")?; - let by_day = value.get_as_vec::("BYDAY")?; + let by_weekday = value.get_as_vec::("BYDAY")?; let by_setpos = value.get_as_vec::("BYSETPOS")?; let by_monthday = value.get_as_vec::("BYMONTHDAY")?; let by_yearday = value.get_as_vec::("BYYEARDAY")?; @@ -288,7 +288,7 @@ impl RRule { interval, count, weekstart, - by_day: by_day.unwrap_or_default(), + by_weekday: by_weekday.unwrap_or_default(), by_hour: by_hour.unwrap_or_default(), by_minute: by_minute.unwrap_or_default(), by_second: by_second.unwrap_or_default(), @@ -353,7 +353,12 @@ impl ToRRule for RRule { rrule = rrule.by_week_no(self.by_weekno.clone()); rrule = rrule.by_year_day(self.by_yearday.clone()); rrule = rrule.week_start(self.weekstart.as_ref().unwrap_or_default().into()); - rrule = rrule.by_weekday((&self.by_day).into_iter().map(|day| day.into()).collect()); + rrule = rrule.by_weekday( + (&self.by_weekday) + .into_iter() + .map(|day| day.into()) + .collect(), + ); let dtstart = dtstart.to_datetime()?; let dtstart = dtstart.with_timezone(&rrule::Tz::Tz(dtstart.timezone())); diff --git a/src/lib/index.d.ts b/src/lib/index.d.ts index 1d5bde5..8ca249c 100644 --- a/src/lib/index.d.ts +++ b/src/lib/index.d.ts @@ -40,12 +40,12 @@ export enum Weekday { Sunday = 6 } export class RRule { - constructor(frequency: Frequency, interval?: number | undefined | null, count?: number | undefined | null, weekstart?: Weekday | undefined | null, until?: number | undefined | null, byDay?: (readonly (NWeekday | Weekday)[]) | undefined | null, byHour?: (readonly number[]) | undefined | null, byMinute?: (readonly number[]) | undefined | null, bySecond?: (readonly number[]) | undefined | null, byMonthday?: (readonly number[]) | undefined | null, bySetpos?: (readonly number[]) | undefined | null, byMonth?: (readonly number[]) | undefined | null, byWeekno?: (readonly number[]) | undefined | null, byYearday?: (readonly number[]) | undefined | null) + constructor(frequency: Frequency, interval?: number | undefined | null, count?: number | undefined | null, weekstart?: Weekday | undefined | null, until?: number | undefined | null, byWeekday?: (readonly (NWeekday | Weekday)[]) | undefined | null, byHour?: (readonly number[]) | undefined | null, byMinute?: (readonly number[]) | undefined | null, bySecond?: (readonly number[]) | undefined | null, byMonthday?: (readonly number[]) | undefined | null, bySetpos?: (readonly number[]) | undefined | null, byMonth?: (readonly number[]) | undefined | null, byWeekno?: (readonly number[]) | undefined | null, byYearday?: (readonly number[]) | undefined | null) static parse(str: string): RRule get frequency(): Frequency get interval(): number | null get count(): number | null - get byDay(): NWeekday[] + get byWeekday(): NWeekday[] get byHour(): Array get byMinute(): Array get bySecond(): Array diff --git a/src/rrule.ts b/src/rrule.ts index b6c736b..762fc29 100644 --- a/src/rrule.ts +++ b/src/rrule.ts @@ -133,7 +133,7 @@ export class RRule { interval: rust.interval ?? undefined, until: rust.until === null ? undefined : DateTime.fromNumeric(rust.until), count: rust.count === null ? undefined : rust.count, - byWeekday: rust.byDay, + byWeekday: rust.byWeekday, byHour: rust.byHour, byMinute: rust.byMinute, bySecond: rust.bySecond, From 74e8eade9ff1d70008f2662c9bfffd9a423a4e5a Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 14:10:56 +0700 Subject: [PATCH 52/63] test: reorganize tests (#174) --- tests/daily.spec.ts | 215 ----------------- tests/monthly.spec.ts | 325 ------------------------- tests/parsing.spec.ts | 198 ---------------- tests/recurrence/daily.spec.ts | 224 +++++++++++++++++ tests/recurrence/monthly.spec.ts | 330 ++++++++++++++++++++++++++ tests/recurrence/weekly.spec.ts | 144 +++++++++++ tests/recurrence/yearly.spec.ts | 229 ++++++++++++++++++ tests/rrule-set.spec.ts | 161 +++++++++++++ tests/rrule.spec.ts | 219 +++++++++++++++++ tests/serialization/rrule.spec.ts | 75 ++++++ tests/serialization/rrule_set.spec.ts | 132 +++++++++++ tests/weekly.spec.ts | 142 ----------- tests/yearly.spec.ts | 220 ----------------- 13 files changed, 1514 insertions(+), 1100 deletions(-) delete mode 100644 tests/daily.spec.ts delete mode 100644 tests/monthly.spec.ts delete mode 100644 tests/parsing.spec.ts create mode 100644 tests/recurrence/daily.spec.ts create mode 100644 tests/recurrence/monthly.spec.ts create mode 100644 tests/recurrence/weekly.spec.ts create mode 100644 tests/recurrence/yearly.spec.ts create mode 100644 tests/rrule-set.spec.ts create mode 100644 tests/rrule.spec.ts create mode 100644 tests/serialization/rrule.spec.ts create mode 100644 tests/serialization/rrule_set.spec.ts delete mode 100644 tests/weekly.spec.ts delete mode 100644 tests/yearly.spec.ts diff --git a/tests/daily.spec.ts b/tests/daily.spec.ts deleted file mode 100644 index 44196e7..0000000 --- a/tests/daily.spec.ts +++ /dev/null @@ -1,215 +0,0 @@ -import { RRule, RRuleSet, Frequency, Month, Weekday, DateTime } from '../src'; - -test('Daily for 10 occurrences', () => { - const rrule = new RRule(Frequency.Daily).setCount(10); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const dates = set.all(); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 3, 9, 0, 0, false), - DateTime.create(1997, 9, 4, 9, 0, 0, false), - DateTime.create(1997, 9, 5, 9, 0, 0, false), - DateTime.create(1997, 9, 6, 9, 0, 0, false), - DateTime.create(1997, 9, 7, 9, 0, 0, false), - DateTime.create(1997, 9, 8, 9, 0, 0, false), - DateTime.create(1997, 9, 9, 9, 0, 0, false), - DateTime.create(1997, 9, 10, 9, 0, 0, false), - DateTime.create(1997, 9, 11, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Daily for 10 occurrences between 873550800000 and 873723600000 inclusively', () => { - const rrule = new RRule(Frequency.Daily).setCount(10); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const dates = set.between( - DateTime.create(1997, 9, 6, 9, 0, 0, false), - DateTime.create(1997, 9, 8, 9, 0, 0, false), - true, - ); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 6, 9, 0, 0, false), - DateTime.create(1997, 9, 7, 9, 0, 0, false), - DateTime.create(1997, 9, 8, 9, 0, 0, false), - ]); -}); - -test('Daily for 10 occurrences between 873550800000 and 873723600000 exclusively', () => { - const rrule = new RRule(Frequency.Daily).setCount(10); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const dates = set.between( - DateTime.create(1997, 9, 6, 9, 0, 0, false), - DateTime.create(1997, 9, 8, 9, 0, 0, false), - false, - ); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', - ); - expect(dates).toEqual([DateTime.create(1997, 9, 7, 9, 0, 0, false)]); -}); - -test('Daily until September 6, 1997', () => { - const rrule = new RRule(Frequency.Daily).setUntil( - DateTime.create(1997, 9, 6, 9, 0, 0, false), - ); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const dates = set.all(); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=19970906T090000', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 3, 9, 0, 0, false), - DateTime.create(1997, 9, 4, 9, 0, 0, false), - DateTime.create(1997, 9, 5, 9, 0, 0, false), - DateTime.create(1997, 9, 6, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every other day', () => { - const rrule = new RRule(Frequency.Daily).setCount(6).setInterval(2); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const dates = set.all(); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;INTERVAL=2;COUNT=6', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 4, 9, 0, 0, false), - DateTime.create(1997, 9, 6, 9, 0, 0, false), - DateTime.create(1997, 9, 8, 9, 0, 0, false), - DateTime.create(1997, 9, 10, 9, 0, 0, false), - DateTime.create(1997, 9, 12, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every 10 days, 5 occurrences', () => { - const rrule = new RRule(Frequency.Daily).setCount(5).setInterval(10); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const dates = set.all(); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;INTERVAL=10;COUNT=5', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 12, 9, 0, 0, false), - DateTime.create(1997, 9, 22, 9, 0, 0, false), - DateTime.create(1997, 10, 2, 9, 0, 0, false), - DateTime.create(1997, 10, 12, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every Monday in January, for 3 years', () => { - const rrule = new RRule(Frequency.Daily) - .setByMonth([Month.January]) - .setByWeekday([Weekday.Monday]) - .setUntil(DateTime.create(2000, 1, 31, 14, 0, 0, false)); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', - ); - expect(dates).toEqual([ - DateTime.create(1998, 1, 5, 9, 0, 0, false), - DateTime.create(1998, 1, 12, 9, 0, 0, false), - DateTime.create(1998, 1, 19, 9, 0, 0, false), - DateTime.create(1998, 1, 26, 9, 0, 0, false), - DateTime.create(1999, 1, 4, 9, 0, 0, false), - DateTime.create(1999, 1, 11, 9, 0, 0, false), - DateTime.create(1999, 1, 18, 9, 0, 0, false), - DateTime.create(1999, 1, 25, 9, 0, 0, false), - DateTime.create(2000, 1, 3, 9, 0, 0, false), - DateTime.create(2000, 1, 10, 9, 0, 0, false), - DateTime.create(2000, 1, 17, 9, 0, 0, false), - DateTime.create(2000, 1, 24, 9, 0, 0, false), - DateTime.create(2000, 1, 31, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every Monday in January, for 3 years except Jan 31 2000', () => { - const rrule = new RRule(Frequency.Daily) - .setByMonth([Month.January]) - .setByWeekday([Weekday.Monday]) - .setUntil(DateTime.create(2000, 1, 31, 14, 0, 0, false)); - - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'Asia/Tbilisi', - ) - .addRrule(rrule) - .addExdate(DateTime.create(2000, 1, 31, 9, 0, 0, false)); - - const dates = set.all(); - - expect(dates).toEqual([ - DateTime.create(1998, 1, 5, 9, 0, 0, false), - DateTime.create(1998, 1, 12, 9, 0, 0, false), - DateTime.create(1998, 1, 19, 9, 0, 0, false), - DateTime.create(1998, 1, 26, 9, 0, 0, false), - DateTime.create(1999, 1, 4, 9, 0, 0, false), - DateTime.create(1999, 1, 11, 9, 0, 0, false), - DateTime.create(1999, 1, 18, 9, 0, 0, false), - DateTime.create(1999, 1, 25, 9, 0, 0, false), - DateTime.create(2000, 1, 3, 9, 0, 0, false), - DateTime.create(2000, 1, 10, 9, 0, 0, false), - DateTime.create(2000, 1, 17, 9, 0, 0, false), - DateTime.create(2000, 1, 24, 9, 0, 0, false), - ]); - expect(set.rrules.map((rrule) => rrule.toString())).toEqual([ - 'RRULE:FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', - ]); - expect(set.exrules).toEqual([]); - expect([...set]).toEqual(dates); -}); diff --git a/tests/monthly.spec.ts b/tests/monthly.spec.ts deleted file mode 100644 index 682b5e5..0000000 --- a/tests/monthly.spec.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { RRule, RRuleSet, Frequency, Weekday, DateTime } from '../src'; - -test('Monthly on the 1st Friday for 10 occurrences', () => { - const rrule = new RRule(Frequency.Monthly) - .setCount(10) - .setByWeekday([Weekday.Friday]) - .setBySetpos([1]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYSETPOS=1;BYDAY=FR', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 5, 9, 0, 0, false), - DateTime.create(1997, 10, 3, 9, 0, 0, false), - DateTime.create(1997, 11, 7, 9, 0, 0, false), - DateTime.create(1997, 12, 5, 9, 0, 0, false), - DateTime.create(1998, 1, 2, 9, 0, 0, false), - DateTime.create(1998, 2, 6, 9, 0, 0, false), - DateTime.create(1998, 3, 6, 9, 0, 0, false), - DateTime.create(1998, 4, 3, 9, 0, 0, false), - DateTime.create(1998, 5, 1, 9, 0, 0, false), - DateTime.create(1998, 6, 5, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Monthly on the 1st Friday until December 24, 1997', () => { - const rrule = new RRule(Frequency.Monthly) - .setUntil(DateTime.create(1997, 12, 24, 0, 0, 0, false)) - .setByWeekday([Weekday.Friday]) - .setBySetpos([1]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;UNTIL=19971224T000000;BYSETPOS=1;BYDAY=FR', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 5, 9, 0, 0, false), - DateTime.create(1997, 10, 3, 9, 0, 0, false), - DateTime.create(1997, 11, 7, 9, 0, 0, false), - DateTime.create(1997, 12, 5, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every other month on the 1st and last Sunday of the month for 10 occurrences', () => { - const rrule = new RRule(Frequency.Monthly) - .setInterval(2) - .setCount(10) - .setByWeekday([Weekday.Sunday, Weekday.Sunday]) - .setBySetpos([1, -1]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYSETPOS=1,-1;BYDAY=SU,SU', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 7, 9, 0, 0, false), - DateTime.create(1997, 9, 28, 9, 0, 0, false), - DateTime.create(1997, 11, 2, 9, 0, 0, false), - DateTime.create(1997, 11, 30, 9, 0, 0, false), - DateTime.create(1998, 1, 4, 9, 0, 0, false), - DateTime.create(1998, 1, 25, 9, 0, 0, false), - DateTime.create(1998, 3, 1, 9, 0, 0, false), - DateTime.create(1998, 3, 29, 9, 0, 0, false), - DateTime.create(1998, 5, 3, 9, 0, 0, false), - DateTime.create(1998, 5, 31, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Monthly on the second to last Monday of the month for 6 months', () => { - const rrule = new RRule(Frequency.Monthly) - .setCount(6) - .setByWeekday([Weekday.Monday]) - .setBySetpos([-2]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYSETPOS=-2;BYDAY=MO', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 22, 9, 0, 0, false), - DateTime.create(1997, 10, 20, 9, 0, 0, false), - DateTime.create(1997, 11, 17, 9, 0, 0, false), - DateTime.create(1997, 12, 22, 9, 0, 0, false), - DateTime.create(1998, 1, 19, 9, 0, 0, false), - DateTime.create(1998, 2, 16, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Monthly on the third to the last day of the month, limit 6', () => { - const rrule = new RRule(Frequency.Monthly).setByMonthday([-3]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(6); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;BYMONTHDAY=-3', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 28, 9, 0, 0, false), - DateTime.create(1997, 10, 29, 9, 0, 0, false), - DateTime.create(1997, 11, 28, 9, 0, 0, false), - DateTime.create(1997, 12, 29, 9, 0, 0, false), - DateTime.create(1998, 1, 29, 9, 0, 0, false), - DateTime.create(1998, 2, 26, 9, 0, 0, false), - ]); -}); - -test('Monthly on the 2nd and 15th of the month for 10 occurrences', () => { - const rrule = new RRule(Frequency.Monthly) - .setCount(10) - .setByMonthday([2, 15]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 15, 9, 0, 0, false), - DateTime.create(1997, 10, 2, 9, 0, 0, false), - DateTime.create(1997, 10, 15, 9, 0, 0, false), - DateTime.create(1997, 11, 2, 9, 0, 0, false), - DateTime.create(1997, 11, 15, 9, 0, 0, false), - DateTime.create(1997, 12, 2, 9, 0, 0, false), - DateTime.create(1997, 12, 15, 9, 0, 0, false), - DateTime.create(1998, 1, 2, 9, 0, 0, false), - DateTime.create(1998, 1, 15, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Monthly on the first and last day of the month for 10 occurrences', () => { - const rrule = new RRule(Frequency.Monthly) - .setCount(10) - .setByMonthday([1, -1]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 30, 9, 0, 0, false), - DateTime.create(1997, 10, 1, 9, 0, 0, false), - DateTime.create(1997, 10, 31, 9, 0, 0, false), - DateTime.create(1997, 11, 1, 9, 0, 0, false), - DateTime.create(1997, 11, 30, 9, 0, 0, false), - DateTime.create(1997, 12, 1, 9, 0, 0, false), - DateTime.create(1997, 12, 31, 9, 0, 0, false), - DateTime.create(1998, 1, 1, 9, 0, 0, false), - DateTime.create(1998, 1, 31, 9, 0, 0, false), - DateTime.create(1998, 2, 1, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every 18 months on the 10th thru 15th of the month for 10 occurrences', () => { - const rrule = new RRule(Frequency.Monthly) - .setCount(10) - .setInterval(18) - .setByMonthday([10, 11, 12, 13, 14, 15]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 10, 9, 0, 0, false), - DateTime.create(1997, 9, 11, 9, 0, 0, false), - DateTime.create(1997, 9, 12, 9, 0, 0, false), - DateTime.create(1997, 9, 13, 9, 0, 0, false), - DateTime.create(1997, 9, 14, 9, 0, 0, false), - DateTime.create(1997, 9, 15, 9, 0, 0, false), - DateTime.create(1999, 3, 10, 9, 0, 0, false), - DateTime.create(1999, 3, 11, 9, 0, 0, false), - DateTime.create(1999, 3, 12, 9, 0, 0, false), - DateTime.create(1999, 3, 13, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Monthly 5 times with two rdates and one exdate', () => { - const rrule = new RRule(Frequency.Monthly).setCount(5); - const set = new RRuleSet(DateTime.create(2012, 2, 1, 2, 30, 0, false), 'UTC') - .addRrule(rrule) - .addRdate(DateTime.create(2012, 7, 1, 2, 30, 0, false)) - .addRdate(DateTime.create(2012, 7, 2, 2, 30, 0, false)) - .addExdate(DateTime.create(2012, 6, 1, 2, 30, 0, false)); - - const dates = set.all(); - - expect(set.rdates).toEqual([ - DateTime.create(2012, 7, 1, 2, 30, 0, false), - DateTime.create(2012, 7, 2, 2, 30, 0, false), - ]); - expect(set.exdates).toEqual([DateTime.create(2012, 6, 1, 2, 30, 0, false)]); - expect(dates).toEqual([ - DateTime.create(2012, 2, 1, 2, 30, 0, true), - DateTime.create(2012, 3, 1, 2, 30, 0, true), - DateTime.create(2012, 4, 1, 2, 30, 0, true), - DateTime.create(2012, 5, 1, 2, 30, 0, true), - DateTime.create(2012, 7, 1, 2, 30, 0, true), - DateTime.create(2012, 7, 2, 2, 30, 0, true), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every Tuesday, every other month, limit 18', () => { - const rrule = new RRule(Frequency.Monthly) - .setInterval(2) - .setByWeekday([Weekday.Tuesday]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(18); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 9, 9, 0, 0, false), - DateTime.create(1997, 9, 16, 9, 0, 0, false), - DateTime.create(1997, 9, 23, 9, 0, 0, false), - DateTime.create(1997, 9, 30, 9, 0, 0, false), - DateTime.create(1997, 11, 4, 9, 0, 0, false), - DateTime.create(1997, 11, 11, 9, 0, 0, false), - DateTime.create(1997, 11, 18, 9, 0, 0, false), - DateTime.create(1997, 11, 25, 9, 0, 0, false), - DateTime.create(1998, 1, 6, 9, 0, 0, false), - DateTime.create(1998, 1, 13, 9, 0, 0, false), - DateTime.create(1998, 1, 20, 9, 0, 0, false), - DateTime.create(1998, 1, 27, 9, 0, 0, false), - DateTime.create(1998, 3, 3, 9, 0, 0, false), - DateTime.create(1998, 3, 10, 9, 0, 0, false), - DateTime.create(1998, 3, 17, 9, 0, 0, false), - DateTime.create(1998, 3, 24, 9, 0, 0, false), - DateTime.create(1998, 3, 31, 9, 0, 0, false), - ]); -}); - -test('Monthly on the second to last Monday of the month for 6 months 1', () => { - const rrule = new RRule(Frequency.Monthly) - .setByWeekday([{ weekday: Weekday.Monday, n: -2 }]) - .setCount(6); - const set = new RRuleSet( - DateTime.create(1997, 9, 22, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(8); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970922T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 22, 9, 0, 0, false), - DateTime.create(1997, 10, 20, 9, 0, 0, false), - DateTime.create(1997, 11, 17, 9, 0, 0, false), - DateTime.create(1997, 12, 22, 9, 0, 0, false), - DateTime.create(1998, 1, 19, 9, 0, 0, false), - DateTime.create(1998, 2, 16, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Errors on invalid by-weekday', () => { - expect(() => - new RRule(Frequency.Monthly).setByWeekday(['invalid' as any]).toString(), - ).toThrow('Value is non of these types `NWeekday`, `Weekday`'); -}); diff --git a/tests/parsing.spec.ts b/tests/parsing.spec.ts deleted file mode 100644 index 698dfb4..0000000 --- a/tests/parsing.spec.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { Frequency, Weekday, RRule, RRuleSet, DateTime } from '../src'; - -test('Should properly parse weekly recurrence', () => { - const set = RRuleSet.parse( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', - ); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', - ); -}); - -test('Should properly parse monthly recurrence', () => { - const set = RRuleSet.parse( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', - ); - const asString = set.toString(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', - ); -}); - -test('Should throw error on missing start date', () => { - expect(() => RRuleSet.parse('FREQ=monthly;COUNT=10;INTERVAL=2')).toThrowError( - 'Invalid property: FREQ=monthly;COUNT=10;INTERVAL=2', - ); -}); - -test('Should throw error on invalid rule set', () => { - expect(() => RRuleSet.parse('Invalid')).toThrowError( - 'Invalid property: Invalid', - ); -}); - -test('Should throw error on invalid timezone', () => { - expect(() => - RRuleSet.parse('DTSTART;TZID=Invalid:19970907T090000'), - ).toThrowError(`'Invalid' is not a valid timezone`); -}); - -test('Should throw error on invalid recurrence rule', () => { - expect(() => - RRuleSet.parse('DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:Invalid'), - ).toThrowError('Invalid RRULE: Invalid'); -}); - -test('Should throw error on invalid frequency', () => { - expect(() => - RRuleSet.parse( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=Invalid', - ), - ).toThrowError('Invalid FREQ value: Invalid'); -}); - -test('Should throw error on invalid interval', () => { - expect(() => - RRuleSet.parse( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;INTERVAL=Invalid', - ), - ).toThrowError('Invalid INTERVAL value: Invalid'); -}); - -test('Should throw error on invalid count', () => { - expect(() => - RRuleSet.parse( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;COUNT=Invalid', - ), - ).toThrowError('Invalid COUNT value: Invalid'); -}); - -test('Should throw error on invalid until', () => { - expect(() => - RRuleSet.parse( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;UNTIL=Invalid', - ), - ).toThrowError('Invalid UNTIL value: Invalid'); -}); - -test('Should throw error on invalid week start', () => { - expect(() => - RRuleSet.parse( - 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;WKST=Invalid', - ), - ).toThrowError('Invalid WKST value: Invalid'); -}); - -test('Should properly parse weekly individual recurrence rule', () => { - const rule = RRule.parse( - 'FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', - ); - - expect(rule.frequency).toBe(Frequency.Weekly); - expect(rule.interval).toBe(2); - expect(rule.until).toEqual(DateTime.create(1997, 12, 24, 0, 0, 0, true)); - expect(rule.weekstart).toBe(Weekday.Sunday); - expect(rule.byWeekday).toEqual([ - { weekday: Weekday.Monday }, - { weekday: Weekday.Wednesday }, - { weekday: Weekday.Friday }, - ]); - - const asString = rule.toString(); - expect(asString).toBe( - 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', - ); -}); - -test('Should properly parse individual recurrence rule with RRULE prefix', () => { - const rule = RRule.parse( - 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', - ); - - const asString = rule.toString(); - expect(asString).toBe( - 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', - ); -}); - -test('Should properly parse monthly individual recurrence rule', () => { - const rule = RRule.parse('FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU'); - expect(rule.frequency).toBe(Frequency.Monthly); - expect(rule.interval).toBe(2); - expect(rule.count).toBe(10); - - const asString = rule.toString(); - expect(asString).toBe( - 'RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', - ); -}); - -test('Should throw error on invalid individual recurrence rule', () => { - expect(() => RRule.parse('Invalid')).toThrowError('Invalid RRULE: Invalid'); -}); - -test('Should throw error on invalid individual recurrence rule frequency', () => { - expect(() => RRule.parse('FREQ=Invalid')).toThrowError( - 'Invalid FREQ value: Invalid', - ); -}); - -test('Should throw error on invalid individual recurrence rule interval', () => { - expect(() => RRule.parse('FREQ=DAILY;INTERVAL=Invalid')).toThrowError( - 'Invalid INTERVAL value: Invalid', - ); -}); - -test('Should throw error on invalid individual recurrence rule until', () => { - expect(() => RRule.parse('FREQ=DAILY;UNTIL=Invalid')).toThrowError( - 'Invalid UNTIL value: Invalid', - ); -}); - -test('Should throw error on invalid individual recurrence rule week start', () => { - expect(() => RRule.parse('FREQ=DAILY;WKST=Invalid')).toThrowError( - 'Invalid WKST value: Invalid', - ); -}); - -test('Should be able to parse rule set without dtstart', () => { - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).setFromString( - 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', - ); - - expect(set.toString()).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', - ); -}); - -test('Should parse dtstart from string', () => { - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).setFromString( - 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', - ); - - expect(set.toString()).toBe( - 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', - ); -}); - -test('Should add rrule with until', () => { - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).setFromString( - 'RRULE:FREQ=WEEKLY;WKST=MO;UNTIL=20220513T000000;BYDAY=FR,TH,TU,WE', - ); - - expect(set.toString()).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=20220513T000000;BYDAY=FR,TH,TU,WE;WKST=MO', - ); -}); diff --git a/tests/recurrence/daily.spec.ts b/tests/recurrence/daily.spec.ts new file mode 100644 index 0000000..bd49e91 --- /dev/null +++ b/tests/recurrence/daily.spec.ts @@ -0,0 +1,224 @@ +import { + RRule, + RRuleSet, + Frequency, + Month, + Weekday, + DateTime, +} from '../../src'; + +describe('Daily', () => { + it('daily for 10 occurrences', () => { + const rrule = new RRule(Frequency.Daily).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 3, 9, 0, 0, false), + DateTime.create(1997, 9, 4, 9, 0, 0, false), + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 7, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 10, 9, 0, 0, false), + DateTime.create(1997, 9, 11, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('daily for 10 occurrences between 873550800000 and 873723600000 inclusively', () => { + const rrule = new RRule(Frequency.Daily).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const dates = set.between( + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + true, + ); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 7, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + ]); + }); + + it('daily for 10 occurrences between 873550800000 and 873723600000 exclusively', () => { + const rrule = new RRule(Frequency.Daily).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const dates = set.between( + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + false, + ); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;COUNT=10', + ); + expect(dates).toEqual([DateTime.create(1997, 9, 7, 9, 0, 0, false)]); + }); + + it('daily until September 6, 1997', () => { + const rrule = new RRule(Frequency.Daily).setUntil( + DateTime.create(1997, 9, 6, 9, 0, 0, false), + ); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=19970906T090000', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 3, 9, 0, 0, false), + DateTime.create(1997, 9, 4, 9, 0, 0, false), + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 9, 6, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every other day', () => { + const rrule = new RRule(Frequency.Daily).setCount(6).setInterval(2); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;INTERVAL=2;COUNT=6', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 4, 9, 0, 0, false), + DateTime.create(1997, 9, 6, 9, 0, 0, false), + DateTime.create(1997, 9, 8, 9, 0, 0, false), + DateTime.create(1997, 9, 10, 9, 0, 0, false), + DateTime.create(1997, 9, 12, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every 10 days, 5 occurrences', () => { + const rrule = new RRule(Frequency.Daily).setCount(5).setInterval(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;INTERVAL=10;COUNT=5', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 12, 9, 0, 0, false), + DateTime.create(1997, 9, 22, 9, 0, 0, false), + DateTime.create(1997, 10, 2, 9, 0, 0, false), + DateTime.create(1997, 10, 12, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every Monday in January, for 3 years', () => { + const rrule = new RRule(Frequency.Daily) + .setByMonth([Month.January]) + .setByWeekday([Weekday.Monday]) + .setUntil(DateTime.create(2000, 1, 31, 14, 0, 0, false)); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', + ); + expect(dates).toEqual([ + DateTime.create(1998, 1, 5, 9, 0, 0, false), + DateTime.create(1998, 1, 12, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 1, 26, 9, 0, 0, false), + DateTime.create(1999, 1, 4, 9, 0, 0, false), + DateTime.create(1999, 1, 11, 9, 0, 0, false), + DateTime.create(1999, 1, 18, 9, 0, 0, false), + DateTime.create(1999, 1, 25, 9, 0, 0, false), + DateTime.create(2000, 1, 3, 9, 0, 0, false), + DateTime.create(2000, 1, 10, 9, 0, 0, false), + DateTime.create(2000, 1, 17, 9, 0, 0, false), + DateTime.create(2000, 1, 24, 9, 0, 0, false), + DateTime.create(2000, 1, 31, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every Monday in January, for 3 years except Jan 31 2000', () => { + const rrule = new RRule(Frequency.Daily) + .setByMonth([Month.January]) + .setByWeekday([Weekday.Monday]) + .setUntil(DateTime.create(2000, 1, 31, 14, 0, 0, false)); + + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ) + .addRrule(rrule) + .addExdate(DateTime.create(2000, 1, 31, 9, 0, 0, false)); + + const dates = set.all(); + + expect(dates).toEqual([ + DateTime.create(1998, 1, 5, 9, 0, 0, false), + DateTime.create(1998, 1, 12, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 1, 26, 9, 0, 0, false), + DateTime.create(1999, 1, 4, 9, 0, 0, false), + DateTime.create(1999, 1, 11, 9, 0, 0, false), + DateTime.create(1999, 1, 18, 9, 0, 0, false), + DateTime.create(1999, 1, 25, 9, 0, 0, false), + DateTime.create(2000, 1, 3, 9, 0, 0, false), + DateTime.create(2000, 1, 10, 9, 0, 0, false), + DateTime.create(2000, 1, 17, 9, 0, 0, false), + DateTime.create(2000, 1, 24, 9, 0, 0, false), + ]); + expect(set.rrules.map((rrule) => rrule.toString())).toEqual([ + 'RRULE:FREQ=DAILY;UNTIL=20000131T140000;BYMONTH=1;BYDAY=MO', + ]); + expect(set.exrules).toEqual([]); + expect([...set]).toEqual(dates); + }); +}); diff --git a/tests/recurrence/monthly.spec.ts b/tests/recurrence/monthly.spec.ts new file mode 100644 index 0000000..f9fd344 --- /dev/null +++ b/tests/recurrence/monthly.spec.ts @@ -0,0 +1,330 @@ +import { RRule, RRuleSet, Frequency, Weekday, DateTime } from '../../src'; + +describe('Monthly', () => { + it('monthly on the 1st Friday for 10 occurrences', () => { + const rrule = new RRule(Frequency.Monthly) + .setCount(10) + .setByWeekday([Weekday.Friday]) + .setBySetpos([1]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYSETPOS=1;BYDAY=FR', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 10, 3, 9, 0, 0, false), + DateTime.create(1997, 11, 7, 9, 0, 0, false), + DateTime.create(1997, 12, 5, 9, 0, 0, false), + DateTime.create(1998, 1, 2, 9, 0, 0, false), + DateTime.create(1998, 2, 6, 9, 0, 0, false), + DateTime.create(1998, 3, 6, 9, 0, 0, false), + DateTime.create(1998, 4, 3, 9, 0, 0, false), + DateTime.create(1998, 5, 1, 9, 0, 0, false), + DateTime.create(1998, 6, 5, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('monthly on the 1st Friday until December 24, 1997', () => { + const rrule = new RRule(Frequency.Monthly) + .setUntil(DateTime.create(1997, 12, 24, 0, 0, 0, false)) + .setByWeekday([Weekday.Friday]) + .setBySetpos([1]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;UNTIL=19971224T000000;BYSETPOS=1;BYDAY=FR', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 10, 3, 9, 0, 0, false), + DateTime.create(1997, 11, 7, 9, 0, 0, false), + DateTime.create(1997, 12, 5, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every other month on the 1st and last Sunday of the month for 10 occurrences', () => { + const rrule = new RRule(Frequency.Monthly) + .setInterval(2) + .setCount(10) + .setByWeekday([Weekday.Sunday, Weekday.Sunday]) + .setBySetpos([1, -1]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYSETPOS=1,-1;BYDAY=SU,SU', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 7, 9, 0, 0, false), + DateTime.create(1997, 9, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 2, 9, 0, 0, false), + DateTime.create(1997, 11, 30, 9, 0, 0, false), + DateTime.create(1998, 1, 4, 9, 0, 0, false), + DateTime.create(1998, 1, 25, 9, 0, 0, false), + DateTime.create(1998, 3, 1, 9, 0, 0, false), + DateTime.create(1998, 3, 29, 9, 0, 0, false), + DateTime.create(1998, 5, 3, 9, 0, 0, false), + DateTime.create(1998, 5, 31, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('monthly on the second to last Monday of the month for 6 months', () => { + const rrule = new RRule(Frequency.Monthly) + .setCount(6) + .setByWeekday([Weekday.Monday]) + .setBySetpos([-2]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYSETPOS=-2;BYDAY=MO', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 22, 9, 0, 0, false), + DateTime.create(1997, 10, 20, 9, 0, 0, false), + DateTime.create(1997, 11, 17, 9, 0, 0, false), + DateTime.create(1997, 12, 22, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 2, 16, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('monthly on the third to the last day of the month, limit 6', () => { + const rrule = new RRule(Frequency.Monthly).setByMonthday([-3]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(6); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;BYMONTHDAY=-3', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 28, 9, 0, 0, false), + DateTime.create(1997, 10, 29, 9, 0, 0, false), + DateTime.create(1997, 11, 28, 9, 0, 0, false), + DateTime.create(1997, 12, 29, 9, 0, 0, false), + DateTime.create(1998, 1, 29, 9, 0, 0, false), + DateTime.create(1998, 2, 26, 9, 0, 0, false), + ]); + }); + + it('monthly on the 2nd and 15th of the month for 10 occurrences', () => { + const rrule = new RRule(Frequency.Monthly) + .setCount(10) + .setByMonthday([2, 15]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 15, 9, 0, 0, false), + DateTime.create(1997, 10, 2, 9, 0, 0, false), + DateTime.create(1997, 10, 15, 9, 0, 0, false), + DateTime.create(1997, 11, 2, 9, 0, 0, false), + DateTime.create(1997, 11, 15, 9, 0, 0, false), + DateTime.create(1997, 12, 2, 9, 0, 0, false), + DateTime.create(1997, 12, 15, 9, 0, 0, false), + DateTime.create(1998, 1, 2, 9, 0, 0, false), + DateTime.create(1998, 1, 15, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('monthly on the first and last day of the month for 10 occurrences', () => { + const rrule = new RRule(Frequency.Monthly) + .setCount(10) + .setByMonthday([1, -1]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 1, 9, 0, 0, false), + DateTime.create(1997, 10, 31, 9, 0, 0, false), + DateTime.create(1997, 11, 1, 9, 0, 0, false), + DateTime.create(1997, 11, 30, 9, 0, 0, false), + DateTime.create(1997, 12, 1, 9, 0, 0, false), + DateTime.create(1997, 12, 31, 9, 0, 0, false), + DateTime.create(1998, 1, 1, 9, 0, 0, false), + DateTime.create(1998, 1, 31, 9, 0, 0, false), + DateTime.create(1998, 2, 1, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every 18 months on the 10th thru 15th of the month for 10 occurrences', () => { + const rrule = new RRule(Frequency.Monthly) + .setCount(10) + .setInterval(18) + .setByMonthday([10, 11, 12, 13, 14, 15]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 10, 9, 0, 0, false), + DateTime.create(1997, 9, 11, 9, 0, 0, false), + DateTime.create(1997, 9, 12, 9, 0, 0, false), + DateTime.create(1997, 9, 13, 9, 0, 0, false), + DateTime.create(1997, 9, 14, 9, 0, 0, false), + DateTime.create(1997, 9, 15, 9, 0, 0, false), + DateTime.create(1999, 3, 10, 9, 0, 0, false), + DateTime.create(1999, 3, 11, 9, 0, 0, false), + DateTime.create(1999, 3, 12, 9, 0, 0, false), + DateTime.create(1999, 3, 13, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('monthly 5 times with two rdates and one exdate', () => { + const rrule = new RRule(Frequency.Monthly).setCount(5); + const set = new RRuleSet( + DateTime.create(2012, 2, 1, 2, 30, 0, false), + 'UTC', + ) + .addRrule(rrule) + .addRdate(DateTime.create(2012, 7, 1, 2, 30, 0, false)) + .addRdate(DateTime.create(2012, 7, 2, 2, 30, 0, false)) + .addExdate(DateTime.create(2012, 6, 1, 2, 30, 0, false)); + + const dates = set.all(); + + expect(set.rdates).toEqual([ + DateTime.create(2012, 7, 1, 2, 30, 0, false), + DateTime.create(2012, 7, 2, 2, 30, 0, false), + ]); + expect(set.exdates).toEqual([DateTime.create(2012, 6, 1, 2, 30, 0, false)]); + expect(dates).toEqual([ + DateTime.create(2012, 2, 1, 2, 30, 0, true), + DateTime.create(2012, 3, 1, 2, 30, 0, true), + DateTime.create(2012, 4, 1, 2, 30, 0, true), + DateTime.create(2012, 5, 1, 2, 30, 0, true), + DateTime.create(2012, 7, 1, 2, 30, 0, true), + DateTime.create(2012, 7, 2, 2, 30, 0, true), + ]); + expect([...set]).toEqual(dates); + }); + + it('every Tuesday, every other month, limit 18', () => { + const rrule = new RRule(Frequency.Monthly) + .setInterval(2) + .setByWeekday([Weekday.Tuesday]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(18); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 23, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 11, 4, 9, 0, 0, false), + DateTime.create(1997, 11, 11, 9, 0, 0, false), + DateTime.create(1997, 11, 18, 9, 0, 0, false), + DateTime.create(1997, 11, 25, 9, 0, 0, false), + DateTime.create(1998, 1, 6, 9, 0, 0, false), + DateTime.create(1998, 1, 13, 9, 0, 0, false), + DateTime.create(1998, 1, 20, 9, 0, 0, false), + DateTime.create(1998, 1, 27, 9, 0, 0, false), + DateTime.create(1998, 3, 3, 9, 0, 0, false), + DateTime.create(1998, 3, 10, 9, 0, 0, false), + DateTime.create(1998, 3, 17, 9, 0, 0, false), + DateTime.create(1998, 3, 24, 9, 0, 0, false), + DateTime.create(1998, 3, 31, 9, 0, 0, false), + ]); + }); + + it('monthly on the second to last Monday of the month for 6 months 1', () => { + const rrule = new RRule(Frequency.Monthly) + .setByWeekday([{ weekday: Weekday.Monday, n: -2 }]) + .setCount(6); + const set = new RRuleSet( + DateTime.create(1997, 9, 22, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(8); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970922T090000\nRRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 22, 9, 0, 0, false), + DateTime.create(1997, 10, 20, 9, 0, 0, false), + DateTime.create(1997, 11, 17, 9, 0, 0, false), + DateTime.create(1997, 12, 22, 9, 0, 0, false), + DateTime.create(1998, 1, 19, 9, 0, 0, false), + DateTime.create(1998, 2, 16, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('errors on invalid by-weekday', () => { + expect(() => + new RRule(Frequency.Monthly).setByWeekday(['invalid' as any]).toString(), + ).toThrow('Value is non of these types `NWeekday`, `Weekday`'); + }); +}); diff --git a/tests/recurrence/weekly.spec.ts b/tests/recurrence/weekly.spec.ts new file mode 100644 index 0000000..2082582 --- /dev/null +++ b/tests/recurrence/weekly.spec.ts @@ -0,0 +1,144 @@ +import { RRule, RRuleSet, Frequency, Weekday, DateTime } from '../../src'; + +describe('Weekly', () => { + it('weekly for 10 occurrences', () => { + const rrule = new RRule(Frequency.Weekly).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;COUNT=10', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 23, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 7, 9, 0, 0, false), + DateTime.create(1997, 10, 14, 9, 0, 0, false), + DateTime.create(1997, 10, 21, 9, 0, 0, false), + DateTime.create(1997, 10, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 4, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('weekly until December 24, 1997', () => { + const rrule = new RRule(Frequency.Weekly).setUntil( + DateTime.create(1997, 12, 24, 0, 0, 0, false), + ); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 9, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 23, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 7, 9, 0, 0, false), + DateTime.create(1997, 10, 14, 9, 0, 0, false), + DateTime.create(1997, 10, 21, 9, 0, 0, false), + DateTime.create(1997, 10, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 4, 9, 0, 0, false), + DateTime.create(1997, 11, 11, 9, 0, 0, false), + DateTime.create(1997, 11, 18, 9, 0, 0, false), + DateTime.create(1997, 11, 25, 9, 0, 0, false), + DateTime.create(1997, 12, 2, 9, 0, 0, false), + DateTime.create(1997, 12, 9, 9, 0, 0, false), + DateTime.create(1997, 12, 16, 9, 0, 0, false), + DateTime.create(1997, 12, 23, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every other week - limit 10', () => { + const rrule = new RRule(Frequency.Weekly) + .setInterval(2) + .setWeekstart(Weekday.Sunday); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(10); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 2, 9, 0, 0, false), + DateTime.create(1997, 9, 16, 9, 0, 0, false), + DateTime.create(1997, 9, 30, 9, 0, 0, false), + DateTime.create(1997, 10, 14, 9, 0, 0, false), + DateTime.create(1997, 10, 28, 9, 0, 0, false), + DateTime.create(1997, 11, 11, 9, 0, 0, false), + DateTime.create(1997, 11, 25, 9, 0, 0, false), + DateTime.create(1997, 12, 9, 9, 0, 0, false), + DateTime.create(1997, 12, 23, 9, 0, 0, false), + DateTime.create(1998, 1, 6, 9, 0, 0, false), + ]); + }); + + it('every other week on Monday, Wednesday and Friday until December 24, 1997, but starting on Tuesday, September 2, 1997', () => { + const rrule = new RRule(Frequency.Weekly) + .setInterval(2) + .setUntil(DateTime.create(1997, 12, 24, 0, 0, 0, false)) + .setWeekstart(Weekday.Sunday) + .setByWeekday([Weekday.Monday, Weekday.Wednesday, Weekday.Friday]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000;BYDAY=MO,WE,FR;WKST=SU', + ); + expect(dates).toEqual([ + // TODO: rrule crate does not include dtstart date (873205200000), create a bug report + DateTime.create(1997, 9, 3, 9, 0, 0, false), + DateTime.create(1997, 9, 5, 9, 0, 0, false), + DateTime.create(1997, 9, 15, 9, 0, 0, false), + DateTime.create(1997, 9, 17, 9, 0, 0, false), + DateTime.create(1997, 9, 19, 9, 0, 0, false), + DateTime.create(1997, 9, 29, 9, 0, 0, false), + DateTime.create(1997, 10, 1, 9, 0, 0, false), + DateTime.create(1997, 10, 3, 9, 0, 0, false), + DateTime.create(1997, 10, 13, 9, 0, 0, false), + DateTime.create(1997, 10, 15, 9, 0, 0, false), + DateTime.create(1997, 10, 17, 9, 0, 0, false), + DateTime.create(1997, 10, 27, 9, 0, 0, false), + DateTime.create(1997, 10, 29, 9, 0, 0, false), + DateTime.create(1997, 10, 31, 9, 0, 0, false), + DateTime.create(1997, 11, 10, 9, 0, 0, false), + DateTime.create(1997, 11, 12, 9, 0, 0, false), + DateTime.create(1997, 11, 14, 9, 0, 0, false), + DateTime.create(1997, 11, 24, 9, 0, 0, false), + DateTime.create(1997, 11, 26, 9, 0, 0, false), + DateTime.create(1997, 11, 28, 9, 0, 0, false), + DateTime.create(1997, 12, 8, 9, 0, 0, false), + DateTime.create(1997, 12, 10, 9, 0, 0, false), + DateTime.create(1997, 12, 12, 9, 0, 0, false), + DateTime.create(1997, 12, 22, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); +}); diff --git a/tests/recurrence/yearly.spec.ts b/tests/recurrence/yearly.spec.ts new file mode 100644 index 0000000..0d9f5a6 --- /dev/null +++ b/tests/recurrence/yearly.spec.ts @@ -0,0 +1,229 @@ +import { + RRule, + RRuleSet, + Frequency, + Month, + Weekday, + DateTime, +} from '../../src'; + +describe('Yearly', () => { + it('yearly in June and July for 10 occurrences', () => { + const rrule = new RRule(Frequency.Yearly) + .setCount(10) + .setByMonth([Month.June, Month.July]); + const set = new RRuleSet( + DateTime.create(1997, 6, 10, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7', + ); + expect(dates).toEqual([ + DateTime.create(1997, 6, 10, 9, 0, 0, false), + DateTime.create(1997, 7, 10, 9, 0, 0, false), + DateTime.create(1998, 6, 10, 9, 0, 0, false), + DateTime.create(1998, 7, 10, 9, 0, 0, false), + DateTime.create(1999, 6, 10, 9, 0, 0, false), + DateTime.create(1999, 7, 10, 9, 0, 0, false), + DateTime.create(2000, 6, 10, 9, 0, 0, false), + DateTime.create(2000, 7, 10, 9, 0, 0, false), + DateTime.create(2001, 6, 10, 9, 0, 0, false), + DateTime.create(2001, 7, 10, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every other year on January, February, and March for 10 occurrences', () => { + const rrule = new RRule(Frequency.Yearly) + .setInterval(2) + .setCount(10) + .setByMonth([Month.January, Month.February, Month.March]); + const set = new RRuleSet( + DateTime.create(1997, 3, 10, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970310T090000\nRRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3', + ); + expect(dates).toEqual([ + DateTime.create(1997, 3, 10, 9, 0, 0, false), + DateTime.create(1999, 1, 10, 9, 0, 0, false), + DateTime.create(1999, 2, 10, 9, 0, 0, false), + DateTime.create(1999, 3, 10, 9, 0, 0, false), + DateTime.create(2001, 1, 10, 9, 0, 0, false), + DateTime.create(2001, 2, 10, 9, 0, 0, false), + DateTime.create(2001, 3, 10, 9, 0, 0, false), + DateTime.create(2003, 1, 10, 9, 0, 0, false), + DateTime.create(2003, 2, 10, 9, 0, 0, false), + DateTime.create(2003, 3, 10, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every 3rd year on the 1st, 100th and 200th day for 10 occurrences', () => { + const rrule = new RRule(Frequency.Yearly) + .setCount(10) + .setInterval(3) + .setByYearday([1, 100, 200]); + const set = new RRuleSet( + DateTime.create(1997, 1, 1, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970101T090000\nRRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200', + ); + expect(dates).toEqual([ + DateTime.create(1997, 1, 1, 9, 0, 0, false), + DateTime.create(1997, 4, 10, 9, 0, 0, false), + DateTime.create(1997, 7, 19, 9, 0, 0, false), + DateTime.create(2000, 1, 1, 9, 0, 0, false), + DateTime.create(2000, 4, 9, 9, 0, 0, false), + DateTime.create(2000, 7, 18, 9, 0, 0, false), + DateTime.create(2003, 1, 1, 9, 0, 0, false), + DateTime.create(2003, 4, 10, 9, 0, 0, false), + DateTime.create(2003, 7, 19, 9, 0, 0, false), + DateTime.create(2006, 1, 1, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every 20th Monday of the year, limit 3', () => { + const rrule = new RRule(Frequency.Yearly) + .setByWeekday([Weekday.Monday]) + .setBySetpos([20]); + const set = new RRuleSet( + DateTime.create(1997, 5, 12, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(3); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYSETPOS=20;BYDAY=MO', + ); + expect(dates).toEqual([ + DateTime.create(1997, 5, 19, 9, 0, 0, false), + DateTime.create(1998, 5, 18, 9, 0, 0, false), + DateTime.create(1999, 5, 17, 9, 0, 0, false), + ]); + }); + + it('monday of week number 20 (where the default start of the week is Monday), limit 3', () => { + const rrule = new RRule(Frequency.Yearly) + .setWeekstart(Weekday.Monday) + .setByWeekday([Weekday.Monday]) + .setByWeekno([20]); + const set = new RRuleSet( + DateTime.create(1997, 5, 12, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(3); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO;WKST=MO', + ); + expect(dates).toEqual([ + DateTime.create(1997, 5, 12, 9, 0, 0, false), + DateTime.create(1998, 5, 11, 9, 0, 0, false), + DateTime.create(1999, 5, 17, 9, 0, 0, false), + ]); + }); + + it('every Thursday in March, limit 11', () => { + const rrule = new RRule(Frequency.Yearly) + .setByMonth([Month.March]) + .setByWeekday([Weekday.Thursday]); + const set = new RRuleSet( + DateTime.create(1997, 3, 13, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(11); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970313T090000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH', + ); + expect(dates).toEqual([ + DateTime.create(1997, 3, 13, 9, 0, 0, false), + DateTime.create(1997, 3, 20, 9, 0, 0, false), + DateTime.create(1997, 3, 27, 9, 0, 0, false), + DateTime.create(1998, 3, 5, 9, 0, 0, false), + DateTime.create(1998, 3, 12, 9, 0, 0, false), + DateTime.create(1998, 3, 19, 9, 0, 0, false), + DateTime.create(1998, 3, 26, 9, 0, 0, false), + DateTime.create(1999, 3, 4, 9, 0, 0, false), + DateTime.create(1999, 3, 11, 9, 0, 0, false), + DateTime.create(1999, 3, 18, 9, 0, 0, false), + DateTime.create(1999, 3, 25, 9, 0, 0, false), + ]); + }); + + it('every Friday the 13th, limit 5', () => { + const rrule = new RRule(Frequency.Yearly) + .setByWeekday([Weekday.Friday]) + .setByMonthday([13]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ) + .addExdate(DateTime.create(1998, 3, 13, 9, 0, 0, false)) + .addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(5); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\n' + + 'RRULE:FREQ=YEARLY;BYMONTHDAY=13;BYDAY=FR\n' + + 'EXDATE:19980313T090000', + ); + expect(dates).toEqual([ + DateTime.create(1998, 2, 13, 9, 0, 0, false), + DateTime.create(1998, 11, 13, 9, 0, 0, false), + DateTime.create(1999, 8, 13, 9, 0, 0, false), + DateTime.create(2000, 10, 13, 9, 0, 0, false), + DateTime.create(2001, 4, 13, 9, 0, 0, false), + ]); + }); + + it('every four years, the first Tuesday after a Monday in November, forever (U.S. Presidential Election day)', () => { + const rrule = new RRule(Frequency.Yearly) + .setInterval(4) + .setByMonth([Month.November]) + .setByWeekday([Weekday.Tuesday]) + .setByMonthday([2, 3, 4, 5, 6, 7, 8]); + const set = new RRuleSet( + DateTime.create(1996, 11, 5, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(3); + + expect(asString).toBe( + 'DTSTART;TZID=US/Eastern:19961105T090000\nRRULE:FREQ=YEARLY;INTERVAL=4;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11;BYDAY=TU', + ); + expect(dates).toEqual([ + DateTime.create(1996, 11, 5, 9, 0, 0, false), + DateTime.create(2000, 11, 7, 9, 0, 0, false), + DateTime.create(2004, 11, 2, 9, 0, 0, false), + ]); + }); +}); diff --git a/tests/rrule-set.spec.ts b/tests/rrule-set.spec.ts new file mode 100644 index 0000000..d640a66 --- /dev/null +++ b/tests/rrule-set.spec.ts @@ -0,0 +1,161 @@ +import { DateTime, Frequency, RRule, RRuleSet } from '../src'; + +describe(RRuleSet, () => { + describe('constructor', () => { + it('should create rrule set from object', () => { + const rrule = new RRule(Frequency.Weekly).setCount(10); + const exrule = new RRule(Frequency.Weekly).setCount(10); + const exdate = DateTime.create(1997, 9, 2, 9, 0, 0, false); + const rdate = DateTime.create(1997, 9, 2, 9, 0, 0, false); + const set = new RRuleSet({ + dtstart: DateTime.create(1997, 9, 2, 9, 0, 0, false), + tzid: 'US/Eastern', + rrules: [rrule], + exrules: [exrule], + exdates: [exdate], + rdates: [rdate], + }); + + expect(set.dtstart).toEqual(DateTime.create(1997, 9, 2, 9, 0, 0, false)); + expect(set.tzid).toBe('US/Eastern'); + expect(set.rrules).toEqual([rrule]); + expect(set.exrules).toEqual([exrule]); + expect(set.exdates).toEqual([exdate]); + expect(set.rdates).toEqual([rdate]); + }); + + it('should creat rrule set from dtstart and tzid', () => { + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ); + + expect(set.dtstart).toEqual(DateTime.create(1997, 9, 2, 9, 0, 0, false)); + expect(set.tzid).toBe('US/Eastern'); + expect(set.rrules).toEqual([]); + expect(set.exrules).toEqual([]); + expect(set.exdates).toEqual([]); + expect(set.rdates).toEqual([]); + }); + }); + + describe('addRrule', () => { + it('should add rrule', () => { + const rrule = new RRule(Frequency.Weekly).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.addRrule(rrule); + + expect(set.rrules).toEqual([]); + expect(newSet.rrules).toEqual([rrule]); + }); + }); + + describe('addExrule', () => { + it('should add exrule', () => { + const exrule = new RRule(Frequency.Weekly).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.addExrule(exrule); + + expect(set.exrules).toEqual([]); + expect(newSet.exrules).toEqual([exrule]); + }); + }); + + describe('addExdate', () => { + it('should add exdate', () => { + const exdate = DateTime.create(1997, 9, 2, 9, 0, 0, false); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.addExdate(exdate); + + expect(set.exdates).toEqual([]); + expect(newSet.exdates).toEqual([exdate]); + }); + }); + + describe('addRdate', () => { + it('should add rdate', () => { + const rdate = DateTime.create(1997, 9, 2, 9, 0, 0, false); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.addRdate(rdate); + + expect(set.rdates).toEqual([]); + expect(newSet.rdates).toEqual([rdate]); + }); + }); + + describe('setRrules', () => { + it('should set rrules', () => { + const rrule = new RRule(Frequency.Weekly).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.setRrules([rrule]); + + expect(set.rrules).toEqual([]); + expect(newSet.rrules).toEqual([rrule]); + }); + }); + + describe('setExrules', () => { + it('should set exrules', () => { + const exrule = new RRule(Frequency.Weekly).setCount(10); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.setExrules([exrule]); + + expect(set.exrules).toEqual([]); + expect(newSet.exrules).toEqual([exrule]); + }); + }); + + describe('setExdates', () => { + it('should set exdates', () => { + const exdate = DateTime.create(1997, 9, 2, 9, 0, 0, false); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.setExdates([exdate]); + + expect(set.exdates).toEqual([]); + expect(newSet.exdates).toEqual([exdate]); + }); + }); + + describe('setRdates', () => { + it('should set rdates', () => { + const rdate = DateTime.create(1997, 9, 2, 9, 0, 0, false); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'Asia/Tbilisi', + ); + + const newSet = set.setRdates([rdate]); + + expect(set.rdates).toEqual([]); + expect(newSet.rdates).toEqual([rdate]); + }); + }); +}); diff --git a/tests/rrule.spec.ts b/tests/rrule.spec.ts new file mode 100644 index 0000000..e7920ec --- /dev/null +++ b/tests/rrule.spec.ts @@ -0,0 +1,219 @@ +import { DateTime, Frequency, RRule, Weekday } from '../src'; +import { Month } from '../src/lib'; + +describe(RRule, () => { + describe('constructor', () => { + it('should create rrule from object', () => { + const rrule = new RRule({ + frequency: Frequency.Weekly, + interval: 2, + until: DateTime.create(1997, 12, 24, 0, 0, 0, true), + weekstart: Weekday.Sunday, + byWeekday: [Weekday.Monday, Weekday.Wednesday, Weekday.Friday], + byHour: [1, 2, 3], + byMinute: [4, 5, 6], + bySecond: [7, 8, 9], + byMonthday: [10, 11, 12], + bySetpos: [13, 14, 15], + byMonth: [Month.January, Month.February, Month.March], + byWeekno: [16, 17, 18], + byYearday: [19, 20, 21], + }); + + expect(rrule.frequency).toBe(Frequency.Weekly); + expect(rrule.interval).toBe(2); + expect(rrule.until).toEqual(DateTime.create(1997, 12, 24, 0, 0, 0, true)); + expect(rrule.weekstart).toBe(Weekday.Sunday); + expect(rrule.byWeekday).toEqual([ + Weekday.Monday, + Weekday.Wednesday, + Weekday.Friday, + ]); + expect(rrule.byHour).toEqual([1, 2, 3]); + expect(rrule.byMinute).toEqual([4, 5, 6]); + expect(rrule.bySecond).toEqual([7, 8, 9]); + expect(rrule.byMonthday).toEqual([10, 11, 12]); + expect(rrule.bySetpos).toEqual([13, 14, 15]); + expect(rrule.byMonth).toEqual([ + Month.January, + Month.February, + Month.March, + ]); + expect(rrule.byWeekno).toEqual([16, 17, 18]); + expect(rrule.byYearday).toEqual([19, 20, 21]); + }); + + it('should create rrule from frequency', () => { + const rrule = new RRule(Frequency.Weekly); + + expect(rrule.frequency).toBe(Frequency.Weekly); + expect(rrule.interval).toBeUndefined(); + expect(rrule.until).toBeUndefined(); + expect(rrule.weekstart).toBeUndefined(); + expect(rrule.byWeekday).toEqual([]); + expect(rrule.byHour).toEqual([]); + expect(rrule.byMinute).toEqual([]); + expect(rrule.bySecond).toEqual([]); + expect(rrule.byMonthday).toEqual([]); + expect(rrule.bySetpos).toEqual([]); + expect(rrule.byMonth).toEqual([]); + expect(rrule.byWeekno).toEqual([]); + expect(rrule.byYearday).toEqual([]); + }); + }); + + describe('setFrequency', () => { + it('should set frequency', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setFrequency(Frequency.Daily); + + expect(rrule.frequency).toBe(Frequency.Weekly); + expect(newRrule.frequency).toBe(Frequency.Daily); + }); + }); + + describe('setInterval', () => { + it('should set interval', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setInterval(2); + + expect(rrule.interval).toBeUndefined(); + expect(newRrule.interval).toBe(2); + }); + }); + + describe('setCount', () => { + it('should set count', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setCount(10); + + expect(rrule.count).toBeUndefined(); + expect(newRrule.count).toBe(10); + }); + }); + + describe('setUntil', () => { + it('should set until', () => { + const rrule = new RRule(Frequency.Weekly); + const until = DateTime.create(1997, 12, 24, 0, 0, 0, true); + + const newRrule = rrule.setUntil(until); + + expect(rrule.until).toBeUndefined(); + expect(newRrule.until).toEqual(until); + }); + }); + + describe('setWeekstart', () => { + it('should set weekstart', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setWeekstart(Weekday.Monday); + + expect(rrule.weekstart).toBeUndefined(); + expect(newRrule.weekstart).toBe(Weekday.Monday); + }); + }); + + describe('setByWeekday', () => { + it('should set byWeekday', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setByWeekday([Weekday.Monday, Weekday.Wednesday]); + + expect(rrule.byWeekday).toEqual([]); + expect(newRrule.byWeekday).toEqual([Weekday.Monday, Weekday.Wednesday]); + }); + }); + + describe('setByHour', () => { + it('should set byHour', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setByHour([1, 2]); + + expect(rrule.byHour).toEqual([]); + expect(newRrule.byHour).toEqual([1, 2]); + }); + }); + + describe('setByMinute', () => { + it('should set byMinute', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setByMinute([3, 4]); + + expect(rrule.byMinute).toEqual([]); + expect(newRrule.byMinute).toEqual([3, 4]); + }); + }); + + describe('setBySecond', () => { + it('should set bySecond', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setBySecond([5, 6]); + + expect(rrule.bySecond).toEqual([]); + expect(newRrule.bySecond).toEqual([5, 6]); + }); + }); + + describe('setByMonthday', () => { + it('should set byMonthday', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setByMonthday([7, 8]); + + expect(rrule.byMonthday).toEqual([]); + expect(newRrule.byMonthday).toEqual([7, 8]); + }); + }); + + describe('setBySetpos', () => { + it('should set bySetpos', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setBySetpos([9, 10]); + + expect(rrule.bySetpos).toEqual([]); + expect(newRrule.bySetpos).toEqual([9, 10]); + }); + }); + + describe('setByMonth', () => { + it('should set byMonth', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setByMonth([Month.April, Month.May]); + + expect(rrule.byMonth).toEqual([]); + expect(newRrule.byMonth).toEqual([Month.April, Month.May]); + }); + }); + + describe('setByWeekno', () => { + it('should set byWeekno', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setByWeekno([11, 12]); + + expect(rrule.byWeekno).toEqual([]); + expect(newRrule.byWeekno).toEqual([11, 12]); + }); + }); + + describe('setByYearday', () => { + it('should set byYearday', () => { + const rrule = new RRule(Frequency.Weekly); + + const newRrule = rrule.setByYearday([13, 14]); + + expect(rrule.byYearday).toEqual([]); + expect(newRrule.byYearday).toEqual([13, 14]); + }); + }); +}); diff --git a/tests/serialization/rrule.spec.ts b/tests/serialization/rrule.spec.ts new file mode 100644 index 0000000..5208221 --- /dev/null +++ b/tests/serialization/rrule.spec.ts @@ -0,0 +1,75 @@ +import { DateTime, Frequency, RRule, Weekday } from '../../src'; + +describe(RRule, () => { + it.each([ + { + input: + 'FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', + expected: { + frequency: Frequency.Weekly, + interval: 2, + until: DateTime.create(1997, 12, 24, 0, 0, 0, true), + weekstart: Weekday.Sunday, + byWeekday: [ + { weekday: Weekday.Monday }, + { weekday: Weekday.Wednesday }, + { weekday: Weekday.Friday }, + ], + asString: + 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', + }, + }, + { + input: 'RRULE: FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', + expected: { + frequency: Frequency.Monthly, + interval: 2, + count: 10, + byWeekday: [ + { n: 1, weekday: Weekday.Sunday }, + { n: -1, weekday: Weekday.Sunday }, + ], + asString: 'RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', + }, + }, + ])('should properly parse $input', ({ input, expected }) => { + const rule = RRule.parse(input); + + expect(rule.frequency).toBe(expected.frequency); + expect(rule.interval).toBe(expected.interval); + expect(rule.until).toEqual(expected.until); + expect(rule.weekstart).toBe(expected.weekstart); + expect(rule.byWeekday).toEqual(expected.byWeekday); + expect(rule.toString()).toBe(expected.asString); + }); + + it('should throw error on invalid individual recurrence rule', () => { + const act = () => RRule.parse('Invalid'); + + expect(act).toThrow(new Error('Invalid RRULE: Invalid')); + }); + + test('should throw error on invalid individual recurrence rule frequency', () => { + const act = () => RRule.parse('FREQ=Invalid'); + + expect(act).toThrow('Invalid FREQ value: Invalid'); + }); + + test('should throw error on invalid individual recurrence rule interval', () => { + const act = () => RRule.parse('FREQ=DAILY;INTERVAL=Invalid'); + + expect(act).toThrow('Invalid INTERVAL value: Invalid'); + }); + + test('should throw error on invalid individual recurrence rule until', () => { + const act = () => RRule.parse('FREQ=DAILY;UNTIL=Invalid'); + + expect(act).toThrow('Invalid UNTIL value: Invalid'); + }); + + test('should throw error on invalid individual recurrence rule week start', () => { + const act = () => RRule.parse('FREQ=DAILY;WKST=Invalid'); + + expect(act).toThrow('Invalid WKST value: Invalid'); + }); +}); diff --git a/tests/serialization/rrule_set.spec.ts b/tests/serialization/rrule_set.spec.ts new file mode 100644 index 0000000..d0d5195 --- /dev/null +++ b/tests/serialization/rrule_set.spec.ts @@ -0,0 +1,132 @@ +import { RRuleSet, DateTime } from '../../src'; + +describe(RRuleSet, () => { + it('should properly parse weekly recurrence', () => { + const set = RRuleSet.parse( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', + ); + + expect(set.toString()).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', + ); + }); + + it('should properly parse monthly recurrence', () => { + const set = RRuleSet.parse( + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', + ); + + expect(set.toString()).toBe( + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', + ); + }); + + it('should throw error on missing start date', () => { + const act = () => RRuleSet.parse('FREQ=monthly;COUNT=10;INTERVAL=2'); + + expect(act).toThrow('Invalid property: FREQ=monthly;COUNT=10;INTERVAL=2'); + }); + + it('should throw error on invalid rule set', () => { + const act = () => RRuleSet.parse('Invalid'); + + expect(act).toThrow('Invalid property: Invalid'); + }); + + it('should throw error on invalid timezone', () => { + const act = () => RRuleSet.parse('DTSTART;TZID=Invalid:19970907T090000'); + + expect(act).toThrow(`'Invalid' is not a valid timezone`); + }); + + it('should throw error on invalid recurrence rule', () => { + const act = () => + RRuleSet.parse('DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:Invalid'); + + expect(act).toThrow('Invalid RRULE: Invalid'); + }); + + it('should throw error on invalid frequency', () => { + const act = () => + RRuleSet.parse( + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=Invalid', + ); + + expect(act).toThrow('Invalid FREQ value: Invalid'); + }); + + it('should throw error on invalid interval', () => { + const act = () => + RRuleSet.parse( + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;INTERVAL=Invalid', + ); + + expect(act).toThrow('Invalid INTERVAL value: Invalid'); + }); + + it('should throw error on invalid count', () => { + const act = () => + RRuleSet.parse( + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;COUNT=Invalid', + ); + + expect(act).toThrow('Invalid COUNT value: Invalid'); + }); + + it('should throw error on invalid until', () => { + const act = () => + RRuleSet.parse( + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;UNTIL=Invalid', + ); + + expect(act).toThrow('Invalid UNTIL value: Invalid'); + }); + + it('should throw error on invalid week start', () => { + const act = () => + RRuleSet.parse( + 'DTSTART;TZID=US/Eastern:19970907T090000\nRRULE:FREQ=DAILY;WKST=Invalid', + ); + + expect(act).toThrow('Invalid WKST value: Invalid'); + }); + + it('should be able to parse rule set without dtstart', () => { + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).setFromString( + 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', + ); + + expect(set.toString()).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', + ); + }); + + it('should parse dtstart from string', () => { + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).setFromString( + 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', + ); + + expect(set.toString()).toBe( + 'DTSTART;TZID=Asia/Tbilisi:20060101T010000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;BYDAY=MO,WE,FR;WKST=SU', + ); + }); + + it('should add rrule with until', () => { + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'US/Eastern', + ).setFromString( + 'RRULE:FREQ=WEEKLY;WKST=MO;UNTIL=20220513T000000;BYDAY=FR,TH,TU,WE', + ); + + expect(set.toString()).toBe( + 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=20220513T000000;BYDAY=FR,TH,TU,WE;WKST=MO', + ); + }); +}); diff --git a/tests/weekly.spec.ts b/tests/weekly.spec.ts deleted file mode 100644 index a3677bb..0000000 --- a/tests/weekly.spec.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { RRule, RRuleSet, Frequency, Weekday, DateTime } from '../src'; - -test('Weekly for 10 occurrences', () => { - const rrule = new RRule(Frequency.Weekly).setCount(10); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;COUNT=10', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 9, 9, 0, 0, false), - DateTime.create(1997, 9, 16, 9, 0, 0, false), - DateTime.create(1997, 9, 23, 9, 0, 0, false), - DateTime.create(1997, 9, 30, 9, 0, 0, false), - DateTime.create(1997, 10, 7, 9, 0, 0, false), - DateTime.create(1997, 10, 14, 9, 0, 0, false), - DateTime.create(1997, 10, 21, 9, 0, 0, false), - DateTime.create(1997, 10, 28, 9, 0, 0, false), - DateTime.create(1997, 11, 4, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Weekly until December 24, 1997', () => { - const rrule = new RRule(Frequency.Weekly).setUntil( - DateTime.create(1997, 12, 24, 0, 0, 0, false), - ); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=19971224T000000', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 9, 9, 0, 0, false), - DateTime.create(1997, 9, 16, 9, 0, 0, false), - DateTime.create(1997, 9, 23, 9, 0, 0, false), - DateTime.create(1997, 9, 30, 9, 0, 0, false), - DateTime.create(1997, 10, 7, 9, 0, 0, false), - DateTime.create(1997, 10, 14, 9, 0, 0, false), - DateTime.create(1997, 10, 21, 9, 0, 0, false), - DateTime.create(1997, 10, 28, 9, 0, 0, false), - DateTime.create(1997, 11, 4, 9, 0, 0, false), - DateTime.create(1997, 11, 11, 9, 0, 0, false), - DateTime.create(1997, 11, 18, 9, 0, 0, false), - DateTime.create(1997, 11, 25, 9, 0, 0, false), - DateTime.create(1997, 12, 2, 9, 0, 0, false), - DateTime.create(1997, 12, 9, 9, 0, 0, false), - DateTime.create(1997, 12, 16, 9, 0, 0, false), - DateTime.create(1997, 12, 23, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every other week - limit 10', () => { - const rrule = new RRule(Frequency.Weekly) - .setInterval(2) - .setWeekstart(Weekday.Sunday); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(10); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU', - ); - expect(dates).toEqual([ - DateTime.create(1997, 9, 2, 9, 0, 0, false), - DateTime.create(1997, 9, 16, 9, 0, 0, false), - DateTime.create(1997, 9, 30, 9, 0, 0, false), - DateTime.create(1997, 10, 14, 9, 0, 0, false), - DateTime.create(1997, 10, 28, 9, 0, 0, false), - DateTime.create(1997, 11, 11, 9, 0, 0, false), - DateTime.create(1997, 11, 25, 9, 0, 0, false), - DateTime.create(1997, 12, 9, 9, 0, 0, false), - DateTime.create(1997, 12, 23, 9, 0, 0, false), - DateTime.create(1998, 1, 6, 9, 0, 0, false), - ]); -}); - -test('Every other week on Monday, Wednesday and Friday until December 24, 1997, but starting on Tuesday, September 2, 1997', () => { - const rrule = new RRule(Frequency.Weekly) - .setInterval(2) - .setUntil(DateTime.create(1997, 12, 24, 0, 0, 0, false)) - .setWeekstart(Weekday.Sunday) - .setByWeekday([Weekday.Monday, Weekday.Wednesday, Weekday.Friday]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000;BYDAY=MO,WE,FR;WKST=SU', - ); - expect(dates).toEqual([ - // TODO: rrule crate does not include dtstart date (873205200000), create a bug report - DateTime.create(1997, 9, 3, 9, 0, 0, false), - DateTime.create(1997, 9, 5, 9, 0, 0, false), - DateTime.create(1997, 9, 15, 9, 0, 0, false), - DateTime.create(1997, 9, 17, 9, 0, 0, false), - DateTime.create(1997, 9, 19, 9, 0, 0, false), - DateTime.create(1997, 9, 29, 9, 0, 0, false), - DateTime.create(1997, 10, 1, 9, 0, 0, false), - DateTime.create(1997, 10, 3, 9, 0, 0, false), - DateTime.create(1997, 10, 13, 9, 0, 0, false), - DateTime.create(1997, 10, 15, 9, 0, 0, false), - DateTime.create(1997, 10, 17, 9, 0, 0, false), - DateTime.create(1997, 10, 27, 9, 0, 0, false), - DateTime.create(1997, 10, 29, 9, 0, 0, false), - DateTime.create(1997, 10, 31, 9, 0, 0, false), - DateTime.create(1997, 11, 10, 9, 0, 0, false), - DateTime.create(1997, 11, 12, 9, 0, 0, false), - DateTime.create(1997, 11, 14, 9, 0, 0, false), - DateTime.create(1997, 11, 24, 9, 0, 0, false), - DateTime.create(1997, 11, 26, 9, 0, 0, false), - DateTime.create(1997, 11, 28, 9, 0, 0, false), - DateTime.create(1997, 12, 8, 9, 0, 0, false), - DateTime.create(1997, 12, 10, 9, 0, 0, false), - DateTime.create(1997, 12, 12, 9, 0, 0, false), - DateTime.create(1997, 12, 22, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); diff --git a/tests/yearly.spec.ts b/tests/yearly.spec.ts deleted file mode 100644 index e20aa92..0000000 --- a/tests/yearly.spec.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { RRule, RRuleSet, Frequency, Month, Weekday, DateTime } from '../src'; - -test('Yearly in June and July for 10 occurrences', () => { - const rrule = new RRule(Frequency.Yearly) - .setCount(10) - .setByMonth([Month.June, Month.July]); - const set = new RRuleSet( - DateTime.create(1997, 6, 10, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7', - ); - expect(dates).toEqual([ - DateTime.create(1997, 6, 10, 9, 0, 0, false), - DateTime.create(1997, 7, 10, 9, 0, 0, false), - DateTime.create(1998, 6, 10, 9, 0, 0, false), - DateTime.create(1998, 7, 10, 9, 0, 0, false), - DateTime.create(1999, 6, 10, 9, 0, 0, false), - DateTime.create(1999, 7, 10, 9, 0, 0, false), - DateTime.create(2000, 6, 10, 9, 0, 0, false), - DateTime.create(2000, 7, 10, 9, 0, 0, false), - DateTime.create(2001, 6, 10, 9, 0, 0, false), - DateTime.create(2001, 7, 10, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every other year on January, February, and March for 10 occurrences', () => { - const rrule = new RRule(Frequency.Yearly) - .setInterval(2) - .setCount(10) - .setByMonth([Month.January, Month.February, Month.March]); - const set = new RRuleSet( - DateTime.create(1997, 3, 10, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970310T090000\nRRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3', - ); - expect(dates).toEqual([ - DateTime.create(1997, 3, 10, 9, 0, 0, false), - DateTime.create(1999, 1, 10, 9, 0, 0, false), - DateTime.create(1999, 2, 10, 9, 0, 0, false), - DateTime.create(1999, 3, 10, 9, 0, 0, false), - DateTime.create(2001, 1, 10, 9, 0, 0, false), - DateTime.create(2001, 2, 10, 9, 0, 0, false), - DateTime.create(2001, 3, 10, 9, 0, 0, false), - DateTime.create(2003, 1, 10, 9, 0, 0, false), - DateTime.create(2003, 2, 10, 9, 0, 0, false), - DateTime.create(2003, 3, 10, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every 3rd year on the 1st, 100th and 200th day for 10 occurrences', () => { - const rrule = new RRule(Frequency.Yearly) - .setCount(10) - .setInterval(3) - .setByYearday([1, 100, 200]); - const set = new RRuleSet( - DateTime.create(1997, 1, 1, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970101T090000\nRRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200', - ); - expect(dates).toEqual([ - DateTime.create(1997, 1, 1, 9, 0, 0, false), - DateTime.create(1997, 4, 10, 9, 0, 0, false), - DateTime.create(1997, 7, 19, 9, 0, 0, false), - DateTime.create(2000, 1, 1, 9, 0, 0, false), - DateTime.create(2000, 4, 9, 9, 0, 0, false), - DateTime.create(2000, 7, 18, 9, 0, 0, false), - DateTime.create(2003, 1, 1, 9, 0, 0, false), - DateTime.create(2003, 4, 10, 9, 0, 0, false), - DateTime.create(2003, 7, 19, 9, 0, 0, false), - DateTime.create(2006, 1, 1, 9, 0, 0, false), - ]); - expect([...set]).toEqual(dates); -}); - -test('Every 20th Monday of the year, limit 3', () => { - const rrule = new RRule(Frequency.Yearly) - .setByWeekday([Weekday.Monday]) - .setBySetpos([20]); - const set = new RRuleSet( - DateTime.create(1997, 5, 12, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(3); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYSETPOS=20;BYDAY=MO', - ); - expect(dates).toEqual([ - DateTime.create(1997, 5, 19, 9, 0, 0, false), - DateTime.create(1998, 5, 18, 9, 0, 0, false), - DateTime.create(1999, 5, 17, 9, 0, 0, false), - ]); -}); - -test('Monday of week number 20 (where the default start of the week is Monday), limit 3', () => { - const rrule = new RRule(Frequency.Yearly) - .setWeekstart(Weekday.Monday) - .setByWeekday([Weekday.Monday]) - .setByWeekno([20]); - const set = new RRuleSet( - DateTime.create(1997, 5, 12, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(3); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970512T090000\nRRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO;WKST=MO', - ); - expect(dates).toEqual([ - DateTime.create(1997, 5, 12, 9, 0, 0, false), - DateTime.create(1998, 5, 11, 9, 0, 0, false), - DateTime.create(1999, 5, 17, 9, 0, 0, false), - ]); -}); - -test('Every Thursday in March, limit 11', () => { - const rrule = new RRule(Frequency.Yearly) - .setByMonth([Month.March]) - .setByWeekday([Weekday.Thursday]); - const set = new RRuleSet( - DateTime.create(1997, 3, 13, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(11); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970313T090000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH', - ); - expect(dates).toEqual([ - DateTime.create(1997, 3, 13, 9, 0, 0, false), - DateTime.create(1997, 3, 20, 9, 0, 0, false), - DateTime.create(1997, 3, 27, 9, 0, 0, false), - DateTime.create(1998, 3, 5, 9, 0, 0, false), - DateTime.create(1998, 3, 12, 9, 0, 0, false), - DateTime.create(1998, 3, 19, 9, 0, 0, false), - DateTime.create(1998, 3, 26, 9, 0, 0, false), - DateTime.create(1999, 3, 4, 9, 0, 0, false), - DateTime.create(1999, 3, 11, 9, 0, 0, false), - DateTime.create(1999, 3, 18, 9, 0, 0, false), - DateTime.create(1999, 3, 25, 9, 0, 0, false), - ]); -}); - -test('Every Friday the 13th, limit 5', () => { - const rrule = new RRule(Frequency.Yearly) - .setByWeekday([Weekday.Friday]) - .setByMonthday([13]); - const set = new RRuleSet( - DateTime.create(1997, 9, 2, 9, 0, 0, false), - 'US/Eastern', - ) - .addExdate(DateTime.create(1998, 3, 13, 9, 0, 0, false)) - .addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(5); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19970902T090000\n' + - 'RRULE:FREQ=YEARLY;BYMONTHDAY=13;BYDAY=FR\n' + - 'EXDATE:19980313T090000', - ); - expect(dates).toEqual([ - DateTime.create(1998, 2, 13, 9, 0, 0, false), - DateTime.create(1998, 11, 13, 9, 0, 0, false), - DateTime.create(1999, 8, 13, 9, 0, 0, false), - DateTime.create(2000, 10, 13, 9, 0, 0, false), - DateTime.create(2001, 4, 13, 9, 0, 0, false), - ]); -}); - -test('Every four years, the first Tuesday after a Monday in November, forever (U.S. Presidential Election day)', () => { - const rrule = new RRule(Frequency.Yearly) - .setInterval(4) - .setByMonth([Month.November]) - .setByWeekday([Weekday.Tuesday]) - .setByMonthday([2, 3, 4, 5, 6, 7, 8]); - const set = new RRuleSet( - DateTime.create(1996, 11, 5, 9, 0, 0, false), - 'US/Eastern', - ).addRrule(rrule); - - const asString = set.toString(); - const dates = set.all(3); - - expect(asString).toBe( - 'DTSTART;TZID=US/Eastern:19961105T090000\nRRULE:FREQ=YEARLY;INTERVAL=4;BYMONTHDAY=2,3,4,5,6,7,8;BYMONTH=11;BYDAY=TU', - ); - expect(dates).toEqual([ - DateTime.create(1996, 11, 5, 9, 0, 0, false), - DateTime.create(2000, 11, 7, 9, 0, 0, false), - DateTime.create(2004, 11, 2, 9, 0, 0, false), - ]); -}); From c99cd5b3a14dd11aaaa84e5d4a76a31feffd01b5 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 15:48:52 +0700 Subject: [PATCH 53/63] fix: count months from 1 (#175) --- lib/js/month.rs | 24 ++++++++++++------------ lib/rrule/month.rs | 20 -------------------- src/lib/index.d.ts | 24 ++++++++++++------------ src/rrule.ts | 24 ++++++++++++------------ 4 files changed, 36 insertions(+), 56 deletions(-) diff --git a/lib/js/month.rs b/lib/js/month.rs index a7c792a..54e92e3 100644 --- a/lib/js/month.rs +++ b/lib/js/month.rs @@ -3,18 +3,18 @@ use napi_derive::napi; #[napi(js_name = "Month")] pub enum Month { - January, - February, - March, - April, - May, - June, - July, - August, - September, - October, - November, - December, + January = 1, + February = 2, + March = 3, + April = 4, + May = 5, + June = 6, + July = 7, + August = 8, + September = 9, + October = 10, + November = 11, + December = 12, } impl Into for Month { diff --git a/lib/rrule/month.rs b/lib/rrule/month.rs index c854757..d3386dc 100644 --- a/lib/rrule/month.rs +++ b/lib/rrule/month.rs @@ -57,26 +57,6 @@ impl FromStr for Month { } } -impl From<&u8> for Month { - fn from(month: &u8) -> Self { - match month { - 1 => Month::January, - 2 => Month::February, - 3 => Month::March, - 4 => Month::April, - 5 => Month::May, - 6 => Month::June, - 7 => Month::July, - 8 => Month::August, - 9 => Month::September, - 10 => Month::October, - 11 => Month::November, - 12 => Month::December, - _ => panic!("Invalid month number: {}", month), - } - } -} - impl Into for &Month { fn into(self) -> chrono::Month { match self { diff --git a/src/lib/index.d.ts b/src/lib/index.d.ts index 8ca249c..9de7a91 100644 --- a/src/lib/index.d.ts +++ b/src/lib/index.d.ts @@ -13,18 +13,18 @@ export enum Frequency { Secondly = 6 } export enum Month { - January = 0, - February = 1, - March = 2, - April = 3, - May = 4, - June = 5, - July = 6, - August = 7, - September = 8, - October = 9, - November = 10, - December = 11 + January = 1, + February = 2, + March = 3, + April = 4, + May = 5, + June = 6, + July = 7, + August = 8, + September = 9, + October = 10, + November = 11, + December = 12 } export interface NWeekday { n?: number diff --git a/src/rrule.ts b/src/rrule.ts index 762fc29..d6edabf 100644 --- a/src/rrule.ts +++ b/src/rrule.ts @@ -23,18 +23,18 @@ export enum Frequency { } export enum Month { - January = 0, - February = 1, - March = 2, - April = 3, - May = 4, - June = 5, - July = 6, - August = 7, - September = 8, - October = 9, - November = 10, - December = 11, + January = 1, + February = 2, + March = 3, + April = 4, + May = 5, + June = 6, + July = 7, + August = 8, + September = 9, + October = 10, + November = 11, + December = 12, } export enum Weekday { From 71f471f877a17d89b696b933cd41647bc094f18d Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 19:08:33 +0700 Subject: [PATCH 54/63] test: add tests for `hourly` frequency (#176) --- tests/recurrence/hourly.spec.ts | 72 +++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/recurrence/hourly.spec.ts diff --git a/tests/recurrence/hourly.spec.ts b/tests/recurrence/hourly.spec.ts new file mode 100644 index 0000000..4f4da96 --- /dev/null +++ b/tests/recurrence/hourly.spec.ts @@ -0,0 +1,72 @@ +import { RRule, RRuleSet, Frequency, DateTime } from '../../src'; + +describe('Hourly', () => { + it('hourly for 5 occurrences', () => { + const rrule = new RRule(Frequency.Hourly).setCount(5); + const set = new RRuleSet( + DateTime.create(2024, 6, 8, 4, 0, 0, false), + 'America/Cancun', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=America/Cancun:20240608T040000\nRRULE:FREQ=HOURLY;COUNT=5', + ); + expect(dates).toEqual([ + DateTime.create(2024, 6, 8, 4, 0, 0, false), + DateTime.create(2024, 6, 8, 5, 0, 0, false), + DateTime.create(2024, 6, 8, 6, 0, 0, false), + DateTime.create(2024, 6, 8, 7, 0, 0, false), + DateTime.create(2024, 6, 8, 8, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('hourly for 6 occurrences by 5 and 8 hour', () => { + const rrule = new RRule(Frequency.Hourly).setCount(6).setByHour([5, 8]); + const set = new RRuleSet( + DateTime.create(2024, 6, 8, 4, 0, 0, false), + 'America/Cancun', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=America/Cancun:20240608T040000\nRRULE:FREQ=HOURLY;COUNT=6;BYHOUR=5,8', + ); + expect(dates).toEqual([ + DateTime.create(2024, 6, 8, 5, 0, 0, false), + DateTime.create(2024, 6, 8, 8, 0, 0, false), + DateTime.create(2024, 6, 9, 5, 0, 0, false), + DateTime.create(2024, 6, 9, 8, 0, 0, false), + DateTime.create(2024, 6, 10, 5, 0, 0, false), + DateTime.create(2024, 6, 10, 8, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('hourly for 4 occurrences by 9 and 10 second', () => { + const rrule = new RRule(Frequency.Hourly).setCount(4).setBySecond([9, 10]); + const set = new RRuleSet( + DateTime.create(2024, 6, 8, 4, 0, 0, false), + 'America/Cancun', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=America/Cancun:20240608T040000\nRRULE:FREQ=HOURLY;COUNT=4;BYSECOND=9,10', + ); + expect(dates).toEqual([ + DateTime.create(2024, 6, 8, 4, 0, 9, false), + DateTime.create(2024, 6, 8, 4, 0, 10, false), + DateTime.create(2024, 6, 8, 5, 0, 9, false), + DateTime.create(2024, 6, 8, 5, 0, 10, false), + ]); + expect([...set]).toEqual(dates); + }); +}); From 2f68706b88e913ecce24a861e926098cfb969e32 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 19:28:50 +0700 Subject: [PATCH 55/63] test: add more frequency test cases (#177) --- tests/recurrence/minutely.spec.ts | 26 ++++++++++++++++++++++++++ tests/recurrence/secondly.spec.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 tests/recurrence/minutely.spec.ts create mode 100644 tests/recurrence/secondly.spec.ts diff --git a/tests/recurrence/minutely.spec.ts b/tests/recurrence/minutely.spec.ts new file mode 100644 index 0000000..75ec810 --- /dev/null +++ b/tests/recurrence/minutely.spec.ts @@ -0,0 +1,26 @@ +import { RRule, RRuleSet, Frequency, DateTime } from '../../src'; + +describe('Minutely', () => { + it('minutely for 5 occurrences', () => { + const rrule = new RRule(Frequency.Minutely).setCount(5); + const set = new RRuleSet( + DateTime.create(2024, 6, 8, 4, 0, 0, false), + 'America/Cancun', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=America/Cancun:20240608T040000\nRRULE:FREQ=MINUTELY;COUNT=5', + ); + expect(dates).toEqual([ + DateTime.create(2024, 6, 8, 4, 0, 0, false), + DateTime.create(2024, 6, 8, 4, 1, 0, false), + DateTime.create(2024, 6, 8, 4, 2, 0, false), + DateTime.create(2024, 6, 8, 4, 3, 0, false), + DateTime.create(2024, 6, 8, 4, 4, 0, false), + ]); + expect([...set]).toEqual(dates); + }); +}); diff --git a/tests/recurrence/secondly.spec.ts b/tests/recurrence/secondly.spec.ts new file mode 100644 index 0000000..be4ae88 --- /dev/null +++ b/tests/recurrence/secondly.spec.ts @@ -0,0 +1,26 @@ +import { RRule, RRuleSet, Frequency, DateTime } from '../../src'; + +describe('Secondly', () => { + it('Secondly for 5 occurrences', () => { + const rrule = new RRule(Frequency.Secondly).setCount(5); + const set = new RRuleSet( + DateTime.create(2024, 6, 8, 4, 0, 0, false), + 'America/Cancun', + ).addRrule(rrule); + + const dates = set.all(); + const asString = set.toString(); + + expect(asString).toBe( + 'DTSTART;TZID=America/Cancun:20240608T040000\nRRULE:FREQ=SECONDLY;COUNT=5', + ); + expect(dates).toEqual([ + DateTime.create(2024, 6, 8, 4, 0, 0, false), + DateTime.create(2024, 6, 8, 4, 0, 1, false), + DateTime.create(2024, 6, 8, 4, 0, 2, false), + DateTime.create(2024, 6, 8, 4, 0, 3, false), + DateTime.create(2024, 6, 8, 4, 0, 4, false), + ]); + expect([...set]).toEqual(dates); + }); +}); From e7678eb0e05013ee7a2ea8ac1b07551f2339720c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Jun 2024 19:36:41 +0700 Subject: [PATCH 56/63] chore(deps-dev): bump lint-staged from 15.2.2 to 15.2.5 (#166) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 15.2.2 to 15.2.5. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/okonet/lint-staged/compare/v15.2.2...v15.2.5) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 92 +++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5ef8f7..c586de7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3600,13 +3600,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -4055,12 +4054,12 @@ "dev": true }, "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/common-tags": { @@ -5552,11 +5551,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6613,7 +6611,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -7775,12 +7772,15 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -7791,21 +7791,21 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", - "dev": true, - "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "version": "15.2.5", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz", + "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.4", + "execa": "~8.0.1", + "lilconfig": "~3.1.1", + "listr2": "~8.2.1", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.4.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -7830,16 +7830,16 @@ } }, "node_modules/listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz", + "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "rfdc": "^1.3.1", "wrap-ansi": "^9.0.0" }, "engines": { @@ -8350,13 +8350,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, - "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -13272,7 +13271,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -13875,11 +13873,13 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "dev": true, - "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } From 00865da69d6aa969447ee264d593835c4e68907a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Jun 2024 19:37:29 +0700 Subject: [PATCH 57/63] build(deps-dev): bump ts-jest from 29.1.2 to 29.1.4 (#168) Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.1.2 to 29.1.4. - [Release notes](https://github.com/kulshekhar/ts-jest/releases) - [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.1.2...v29.1.4) --- updated-dependencies: - dependency-name: ts-jest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c586de7..a94dd11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13292,9 +13292,9 @@ } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.4.tgz", + "integrity": "sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -13310,10 +13310,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -13323,6 +13324,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, From 539c7b8b776cdbec9d1b97cda4f17b5d2cefb45c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 22:18:39 +0700 Subject: [PATCH 58/63] test: add basic e2e test (#178) --- .github/workflows/e2e.yml | 40 ++++++++++++++++++++++++++++ e2e/sandbox/.gitignore | 1 + e2e/sandbox/sandbox.ts | 40 ++++++++++++++++++++++++++++ e2e/yearly.e2e.spec.ts | 56 +++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- src/rrule.ts | 2 +- 6 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/e2e.yml create mode 100644 e2e/sandbox/.gitignore create mode 100644 e2e/sandbox/sandbox.ts create mode 100644 e2e/yearly.e2e.spec.ts diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000..7672824 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,40 @@ +name: 'E2E' + +on: + workflow_dispatch: + inputs: + version: + description: 'Library version' + required: true + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + node: 18 + - os: macos-latest + node: 18 + - os: windows-latest + node: 18 + - os: ubuntu-latest + node: 20 + - os: macos-latest + node: 20 + - os: windows-latest + node: 20 + steps: + - uses: actions/checkout@v2 + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + - name: Install dependencies + run: npm ci + - name: Run tests + run: npm run test:e2e + env: + E2E_LIBRARY_VERSION: ${{ inputs.version }} \ No newline at end of file diff --git a/e2e/sandbox/.gitignore b/e2e/sandbox/.gitignore new file mode 100644 index 0000000..7a0b7f0 --- /dev/null +++ b/e2e/sandbox/.gitignore @@ -0,0 +1 @@ +app \ No newline at end of file diff --git a/e2e/sandbox/sandbox.ts b/e2e/sandbox/sandbox.ts new file mode 100644 index 0000000..fe6854b --- /dev/null +++ b/e2e/sandbox/sandbox.ts @@ -0,0 +1,40 @@ +import { execSync } from 'child_process'; +import { mkdirSync, rmSync, writeFileSync } from 'fs'; +import { rimrafSync } from 'rimraf'; +import * as path from 'path'; + +export class Sandbox { + private readonly projectPath: string = path.resolve(__dirname, 'app'); + + install(version: string) { + rimrafSync(path.resolve(this.projectPath)); + mkdirSync(this.projectPath); + execSync(`npm init -y`, { cwd: this.projectPath }); + execSync(`npm install rrule-rust@${version}`, { cwd: this.projectPath }); + } + + uninstall() { + rimrafSync(path.resolve(this.projectPath)); + } + + run(code: () => T): T { + writeFileSync( + path.resolve(this.projectPath, 'index.js'), + ` + const src_1 = require('rrule-rust'); + + const code = ${code.toString()}; + + console.log(JSON.stringify(code())); +`, + ); + + try { + return JSON.parse( + execSync('node index.js', { cwd: this.projectPath }).toString(), + ); + } finally { + rmSync(path.resolve(this.projectPath, 'index.js')); + } + } +} diff --git a/e2e/yearly.e2e.spec.ts b/e2e/yearly.e2e.spec.ts new file mode 100644 index 0000000..a96d81c --- /dev/null +++ b/e2e/yearly.e2e.spec.ts @@ -0,0 +1,56 @@ +import { DateTime, Frequency, Month, RRule, RRuleSet } from '../src'; +import { Sandbox } from './sandbox/sandbox'; + +describe('Yearly', () => { + const sandbox = new Sandbox(); + + beforeAll(() => { + const version = process.env['E2E_LIBRARY_VERSION']; + + if (!version) { + throw new Error('E2E_LIBRARY_VERSION is required'); + } + + sandbox.install(version); + }); + + afterAll(() => { + sandbox.uninstall(); + }); + + it('yearly in June and July for 10 occurrences', () => { + const result = sandbox.run(() => { + const rrule = new RRule({ + frequency: Frequency.Yearly, + byMonth: [Month.June, Month.July], + count: 10, + }); + const set = new RRuleSet( + DateTime.create(1997, 6, 10, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + return { + asString: set.toString(), + dates: set.all(), + }; + }); + + expect(result).toEqual({ + asString: + 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7', + dates: [ + DateTime.create(1997, 6, 10, 9, 0, 0, false), + DateTime.create(1997, 7, 10, 9, 0, 0, false), + DateTime.create(1998, 6, 10, 9, 0, 0, false), + DateTime.create(1998, 7, 10, 9, 0, 0, false), + DateTime.create(1999, 6, 10, 9, 0, 0, false), + DateTime.create(1999, 7, 10, 9, 0, 0, false), + DateTime.create(2000, 6, 10, 9, 0, 0, false), + DateTime.create(2000, 7, 10, 9, 0, 0, false), + DateTime.create(2001, 6, 10, 9, 0, 0, false), + DateTime.create(2001, 7, 10, 9, 0, 0, false), + ], + }); + }); +}); diff --git a/package.json b/package.json index c790f66..2d11c55 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,8 @@ "build": "tsc -p ./tsconfig.build.json", "postbuild": "cpy ./src/lib/* ./dist/lib --flat", "prepublishOnly": "napi prepublish -t npm", - "test": "cross-env TZ=Europe/Moscow jest", + "test": "cross-env TZ=Europe/Moscow jest --testPathIgnorePatterns=\\.e2e\\.spec\\.ts", + "test:e2e": "jest --testMatch='**/*.e2e.spec.ts'", "universal": "napi universal", "version": "napi version", "benchmark": "ts-node ./benchmark/index.ts", diff --git a/src/rrule.ts b/src/rrule.ts index d6edabf..7b1c042 100644 --- a/src/rrule.ts +++ b/src/rrule.ts @@ -85,7 +85,7 @@ export class RRule { constructor(frequency: Frequency); constructor(rrule?: Partial); - constructor(rruleOrFrequency: number | Partial = {}) { + constructor(rruleOrFrequency: Frequency | Partial = {}) { if (typeof rruleOrFrequency === 'object' && rruleOrFrequency !== null) { this.frequency = rruleOrFrequency.frequency ?? Frequency.Daily; this.interval = rruleOrFrequency.interval; From 13713fc1564bc39d73e5a274f2dd50d55faa9cb1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 22:26:52 +0700 Subject: [PATCH 59/63] ci(e2e): add version into run name (#179) --- .github/workflows/e2e.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 7672824..f276f7e 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -7,6 +7,8 @@ on: description: 'Library version' required: true +run-name: E2E (${{ inputs.version }}) + jobs: test: runs-on: ${{ matrix.os }} From f24ca582b4e62b29bf2b6fa5d32cdc987da78c17 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Jun 2024 22:34:01 +0700 Subject: [PATCH 60/63] ci(e2e): rename version input and add example (#180) --- .github/workflows/e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index f276f7e..aaf20c8 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: version: - description: 'Library version' + description: "Version (e.g.: v2.0.0-next.17)" required: true run-name: E2E (${{ inputs.version }}) From 91cfe6bf5a0c3c049cf38b52f795849bcd1106ae Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 9 Jun 2024 03:42:23 +0700 Subject: [PATCH 61/63] ci(e2e): update actions (#181) --- .github/workflows/e2e.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index aaf20c8..70f6ba7 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -29,9 +29,9 @@ jobs: - os: windows-latest node: 20 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Install dependencies From 045c2dd6c2aa3b07110a5f0d938dff975c2a7100 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 9 Jun 2024 17:09:12 +0700 Subject: [PATCH 62/63] test: add test cases (#186) --- tests/recurrence/monthly.spec.ts | 61 ++++++++++++++++++++++++++++++++ tests/recurrence/weekly.spec.ts | 52 +++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/tests/recurrence/monthly.spec.ts b/tests/recurrence/monthly.spec.ts index f9fd344..f2b5c8a 100644 --- a/tests/recurrence/monthly.spec.ts +++ b/tests/recurrence/monthly.spec.ts @@ -89,6 +89,67 @@ describe('Monthly', () => { expect([...set]).toEqual(dates); }); + it('every friday the 13th for 5 occurrences', () => { + const rrule = new RRule(Frequency.Monthly) + .setCount(5) + .setByWeekday([Weekday.Friday]) + .setByMonthday([13]); + const set = new RRuleSet( + DateTime.create(1997, 9, 2, 9, 0, 0, false), + 'America/New_York', + ) + .addRrule(rrule) + .addExdate(DateTime.create(1998, 11, 13, 9, 0, 0, false)); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=America/New_York:19970902T090000\nRRULE:FREQ=MONTHLY;COUNT=5;BYMONTHDAY=13;BYDAY=FR\nEXDATE:19981113T090000', + ); + expect(dates).toEqual([ + DateTime.create(1998, 2, 13, 9, 0, 0, false), + DateTime.create(1998, 3, 13, 9, 0, 0, false), + DateTime.create(1999, 8, 13, 9, 0, 0, false), + DateTime.create(2000, 10, 13, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('the second-to-last weekday of the month', () => { + const rrule = new RRule(Frequency.Monthly) + .setCount(7) + .setByWeekday([ + Weekday.Monday, + Weekday.Tuesday, + Weekday.Wednesday, + Weekday.Thursday, + Weekday.Friday, + ]) + .setBySetpos([-2]); + const set = new RRuleSet( + DateTime.create(1997, 9, 29, 9, 0, 0, false), + 'America/New_York', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=America/New_York:19970929T090000\nRRULE:FREQ=MONTHLY;COUNT=7;BYSETPOS=-2;BYDAY=MO,TU,WE,TH,FR', + ); + expect(dates).toEqual([ + DateTime.create(1997, 9, 29, 9, 0, 0, false), + DateTime.create(1997, 10, 30, 9, 0, 0, false), + DateTime.create(1997, 11, 27, 9, 0, 0, false), + DateTime.create(1997, 12, 30, 9, 0, 0, false), + DateTime.create(1998, 1, 29, 9, 0, 0, false), + DateTime.create(1998, 2, 26, 9, 0, 0, false), + DateTime.create(1998, 3, 30, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + it('monthly on the second to last Monday of the month for 6 months', () => { const rrule = new RRule(Frequency.Monthly) .setCount(6) diff --git a/tests/recurrence/weekly.spec.ts b/tests/recurrence/weekly.spec.ts index 2082582..329d20f 100644 --- a/tests/recurrence/weekly.spec.ts +++ b/tests/recurrence/weekly.spec.ts @@ -141,4 +141,56 @@ describe('Weekly', () => { ]); expect([...set]).toEqual(dates); }); + + it('every other week for 4 occurrences when week starts on Monday', () => { + const rrule = new RRule(Frequency.Weekly) + .setInterval(2) + .setCount(4) + .setByWeekday([Weekday.Tuesday, Weekday.Sunday]) + .setWeekstart(Weekday.Monday); + const set = new RRuleSet( + DateTime.create(1997, 8, 5, 9, 0, 0, false), + 'America/New_York', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=America/New_York:19970805T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO', + ); + expect(dates).toEqual([ + DateTime.create(1997, 8, 5, 9, 0, 0, false), + DateTime.create(1997, 8, 10, 9, 0, 0, false), + DateTime.create(1997, 8, 19, 9, 0, 0, false), + DateTime.create(1997, 8, 24, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); + + it('every other week for 4 occurrences when week starts on Sunday', () => { + const rrule = new RRule(Frequency.Weekly) + .setInterval(2) + .setCount(4) + .setByWeekday([Weekday.Tuesday, Weekday.Sunday]) + .setWeekstart(Weekday.Sunday); + const set = new RRuleSet( + DateTime.create(1997, 8, 5, 9, 0, 0, false), + 'America/New_York', + ).addRrule(rrule); + + const asString = set.toString(); + const dates = set.all(); + + expect(asString).toBe( + 'DTSTART;TZID=America/New_York:19970805T090000\nRRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU', + ); + expect(dates).toEqual([ + DateTime.create(1997, 8, 5, 9, 0, 0, false), + DateTime.create(1997, 8, 17, 9, 0, 0, false), + DateTime.create(1997, 8, 19, 9, 0, 0, false), + DateTime.create(1997, 8, 31, 9, 0, 0, false), + ]); + expect([...set]).toEqual(dates); + }); }); From ab03b664b74fefa4f17f29540c9648038b3ca12c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 9 Jun 2024 17:53:47 +0700 Subject: [PATCH 63/63] test(e2e): add esm tests (#189) --- ...early.e2e.spec.ts => commonjs.e2e.spec.ts} | 14 ++--- e2e/esm.e2e.spec.ts | 52 +++++++++++++++++++ e2e/sandbox/sandbox.ts | 38 ++++++++++++-- package.json | 2 +- 4 files changed, 92 insertions(+), 14 deletions(-) rename e2e/{yearly.e2e.spec.ts => commonjs.e2e.spec.ts} (85%) create mode 100644 e2e/esm.e2e.spec.ts diff --git a/e2e/yearly.e2e.spec.ts b/e2e/commonjs.e2e.spec.ts similarity index 85% rename from e2e/yearly.e2e.spec.ts rename to e2e/commonjs.e2e.spec.ts index a96d81c..4b07a86 100644 --- a/e2e/yearly.e2e.spec.ts +++ b/e2e/commonjs.e2e.spec.ts @@ -1,17 +1,13 @@ import { DateTime, Frequency, Month, RRule, RRuleSet } from '../src'; import { Sandbox } from './sandbox/sandbox'; -describe('Yearly', () => { - const sandbox = new Sandbox(); +describe('Commonjs', () => { + const sandbox = new Sandbox({ + esm: false, + }); beforeAll(() => { - const version = process.env['E2E_LIBRARY_VERSION']; - - if (!version) { - throw new Error('E2E_LIBRARY_VERSION is required'); - } - - sandbox.install(version); + sandbox.install(); }); afterAll(() => { diff --git a/e2e/esm.e2e.spec.ts b/e2e/esm.e2e.spec.ts new file mode 100644 index 0000000..85787b8 --- /dev/null +++ b/e2e/esm.e2e.spec.ts @@ -0,0 +1,52 @@ +import { DateTime, Frequency, Month, RRule, RRuleSet } from '../src'; +import { Sandbox } from './sandbox/sandbox'; + +describe('ESM', () => { + const sandbox = new Sandbox({ + esm: true, + }); + + beforeAll(() => { + sandbox.install(); + }); + + afterAll(() => { + sandbox.uninstall(); + }); + + it('yearly in June and July for 10 occurrences', () => { + const result = sandbox.run(() => { + const rrule = new RRule({ + frequency: Frequency.Yearly, + byMonth: [Month.June, Month.July], + count: 10, + }); + const set = new RRuleSet( + DateTime.create(1997, 6, 10, 9, 0, 0, false), + 'US/Eastern', + ).addRrule(rrule); + + return { + asString: set.toString(), + dates: set.all(), + }; + }); + + expect(result).toEqual({ + asString: + 'DTSTART;TZID=US/Eastern:19970610T090000\nRRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7', + dates: [ + DateTime.create(1997, 6, 10, 9, 0, 0, false), + DateTime.create(1997, 7, 10, 9, 0, 0, false), + DateTime.create(1998, 6, 10, 9, 0, 0, false), + DateTime.create(1998, 7, 10, 9, 0, 0, false), + DateTime.create(1999, 6, 10, 9, 0, 0, false), + DateTime.create(1999, 7, 10, 9, 0, 0, false), + DateTime.create(2000, 6, 10, 9, 0, 0, false), + DateTime.create(2000, 7, 10, 9, 0, 0, false), + DateTime.create(2001, 6, 10, 9, 0, 0, false), + DateTime.create(2001, 7, 10, 9, 0, 0, false), + ], + }); + }); +}); diff --git a/e2e/sandbox/sandbox.ts b/e2e/sandbox/sandbox.ts index fe6854b..0ca94d8 100644 --- a/e2e/sandbox/sandbox.ts +++ b/e2e/sandbox/sandbox.ts @@ -3,14 +3,30 @@ import { mkdirSync, rmSync, writeFileSync } from 'fs'; import { rimrafSync } from 'rimraf'; import * as path from 'path'; +export type SandboxOptions = { + esm: boolean; +}; + export class Sandbox { - private readonly projectPath: string = path.resolve(__dirname, 'app'); + private readonly projectPath: string; + private readonly esm: boolean; + constructor(options: SandboxOptions) { + this.projectPath = path.resolve(__dirname, 'app'); + this.esm = options.esm; + } - install(version: string) { + install() { rimrafSync(path.resolve(this.projectPath)); mkdirSync(this.projectPath); execSync(`npm init -y`, { cwd: this.projectPath }); - execSync(`npm install rrule-rust@${version}`, { cwd: this.projectPath }); + + if (this.esm) { + execSync(`npm pkg set type=module`, { cwd: this.projectPath }); + } + + execSync(`npm install rrule-rust@${this.getVersion()}`, { + cwd: this.projectPath, + }); } uninstall() { @@ -21,7 +37,11 @@ export class Sandbox { writeFileSync( path.resolve(this.projectPath, 'index.js'), ` - const src_1 = require('rrule-rust'); + ${ + this.esm + ? `import * as src_1 from 'rrule-rust';` + : `const src_1 = require('rrule-rust');` + } const code = ${code.toString()}; @@ -37,4 +57,14 @@ export class Sandbox { rmSync(path.resolve(this.projectPath, 'index.js')); } } + + private getVersion() { + const version = process.env['E2E_LIBRARY_VERSION']; + + if (!version) { + throw new Error('E2E_LIBRARY_VERSION is required'); + } + + return version; + } } diff --git a/package.json b/package.json index 2d11c55..fe4f615 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "postbuild": "cpy ./src/lib/* ./dist/lib --flat", "prepublishOnly": "napi prepublish -t npm", "test": "cross-env TZ=Europe/Moscow jest --testPathIgnorePatterns=\\.e2e\\.spec\\.ts", - "test:e2e": "jest --testMatch='**/*.e2e.spec.ts'", + "test:e2e": "jest --testMatch='**/*.e2e.spec.ts' --runInBand", "universal": "napi universal", "version": "napi version", "benchmark": "ts-node ./benchmark/index.ts",