rrule-rust 1.1.3 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -55,15 +55,15 @@ export class RRule {
55
55
  toString(): string
56
56
  setInterval(interval: number): this
57
57
  setCount(count: number): this
58
- setByWeekday(weekdays: Weekday[]): this
59
- setByHour(hours: Array<number>): this
60
- setByMinute(minutes: Array<number>): this
61
- setBySecond(seconds: Array<number>): this
62
- setByMonthday(days: Array<number>): this
63
- setBySetpos(poses: Array<number>): this
64
- setByMonth(months: Month[]): this
65
- setByWeekno(weekNumbers: Array<number>): this
66
- setByYearday(days: Array<number>): this
58
+ setByWeekday(weekdays: ReadonlyArray<Weekday>): this
59
+ setByHour(hours: ReadonlyArray<number>): this
60
+ setByMinute(minutes: ReadonlyArray<number>): this
61
+ setBySecond(seconds: ReadonlyArray<number>): this
62
+ setByMonthday(days: ReadonlyArray<number>): this
63
+ setBySetpos(poses: ReadonlyArray<number>): this
64
+ setByMonth(months: ReadonlyArray<Month>): this
65
+ setByWeekno(weekNumbers: ReadonlyArray<number>): this
66
+ setByYearday(days: ReadonlyArray<number>): this
67
67
  setWeekstart(day: Weekday): this
68
68
  setUntil(timestamp: number): this
69
69
  }
package/jest.config.ts ADDED
@@ -0,0 +1,7 @@
1
+ /* eslint-disable import/no-default-export -- Required by jest */
2
+ import { Config } from 'jest';
3
+
4
+ export default {
5
+ preset: 'ts-jest',
6
+ testEnvironment: 'node',
7
+ } satisfies Config;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rrule-rust",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "keywords": [
@@ -40,20 +40,22 @@
40
40
  "license": "MIT",
41
41
  "devDependencies": {
42
42
  "@napi-rs/cli": "^2.15.1",
43
+ "@types/jest": "^29.5.0",
43
44
  "@types/node": "^18.15.5",
44
45
  "@typescript-eslint/eslint-plugin": "^5.50.0",
45
46
  "@typescript-eslint/parser": "^5.50.0",
46
- "ava": "^5.1.1",
47
47
  "benny": "^3.7.1",
48
48
  "eslint": "^8.33.0",
49
49
  "eslint-config-prettier": "^8.6.0",
50
50
  "eslint-plugin-eslint-comments": "^3.2.0",
51
51
  "eslint-plugin-import": "^2.27.5",
52
52
  "eslint-plugin-prettier": "^4.2.1",
53
+ "jest": "^29.5.0",
53
54
  "lint-staged": "^13.1.0",
54
55
  "pre-commit": "^1.2.2",
55
56
  "prettier": "^2.8.3",
56
57
  "rrule": "^2.7.2",
58
+ "ts-jest": "^29.0.5",
57
59
  "ts-node": "^10.9.1",
58
60
  "typescript": "^4.9.4"
59
61
  },
@@ -64,15 +66,6 @@
64
66
  "lint-staged": {
65
67
  "**/*.{js,ts,json}": "eslint --fix --max-warnings=0"
66
68
  },
67
- "ava": {
68
- "timeout": "10m",
69
- "extensions": [
70
- "ts"
71
- ],
72
- "require": [
73
- "ts-node/register"
74
- ]
75
- },
76
69
  "engines": {
77
70
  "node": ">= 10"
78
71
  },
@@ -81,7 +74,7 @@
81
74
  "build": "napi build --platform --release --js-package-name @rrule-rust/lib",
82
75
  "build:debug": "napi build --platform",
83
76
  "prepublishOnly": "napi prepublish -t npm",
84
- "test": "ava",
77
+ "test": "jest",
85
78
  "universal": "napi universal",
86
79
  "version": "napi version",
87
80
  "benchmark": "ts-node ./benchmark/index.ts",
@@ -90,19 +83,19 @@
90
83
  "lint:fix-staged": "lint-staged"
91
84
  },
92
85
  "optionalDependencies": {
93
- "@rrule-rust/lib-win32-x64-msvc": "1.1.3",
94
- "@rrule-rust/lib-darwin-x64": "1.1.3",
95
- "@rrule-rust/lib-linux-x64-gnu": "1.1.3",
96
- "@rrule-rust/lib-darwin-arm64": "1.1.3",
97
- "@rrule-rust/lib-android-arm64": "1.1.3",
98
- "@rrule-rust/lib-linux-arm64-gnu": "1.1.3",
99
- "@rrule-rust/lib-linux-arm64-musl": "1.1.3",
100
- "@rrule-rust/lib-win32-arm64-msvc": "1.1.3",
101
- "@rrule-rust/lib-linux-arm-gnueabihf": "1.1.3",
102
- "@rrule-rust/lib-linux-x64-musl": "1.1.3",
103
- "@rrule-rust/lib-freebsd-x64": "1.1.3",
104
- "@rrule-rust/lib-win32-ia32-msvc": "1.1.3",
105
- "@rrule-rust/lib-android-arm-eabi": "1.1.3",
106
- "@rrule-rust/lib-darwin-universal": "1.1.3"
86
+ "@rrule-rust/lib-win32-x64-msvc": "1.1.5",
87
+ "@rrule-rust/lib-darwin-x64": "1.1.5",
88
+ "@rrule-rust/lib-linux-x64-gnu": "1.1.5",
89
+ "@rrule-rust/lib-darwin-arm64": "1.1.5",
90
+ "@rrule-rust/lib-android-arm64": "1.1.5",
91
+ "@rrule-rust/lib-linux-arm64-gnu": "1.1.5",
92
+ "@rrule-rust/lib-linux-arm64-musl": "1.1.5",
93
+ "@rrule-rust/lib-win32-arm64-msvc": "1.1.5",
94
+ "@rrule-rust/lib-linux-arm-gnueabihf": "1.1.5",
95
+ "@rrule-rust/lib-linux-x64-musl": "1.1.5",
96
+ "@rrule-rust/lib-freebsd-x64": "1.1.5",
97
+ "@rrule-rust/lib-win32-ia32-msvc": "1.1.5",
98
+ "@rrule-rust/lib-android-arm-eabi": "1.1.5",
99
+ "@rrule-rust/lib-darwin-universal": "1.1.5"
107
100
  }
108
101
  }
package/src/lib.rs CHANGED
@@ -78,7 +78,7 @@ impl JsRRule {
78
78
  #[napi(getter, ts_return_type = "Weekday[]")]
79
79
  pub fn by_weekday(&self, env: Env) -> napi::Result<Array> {
80
80
  let ndays = self.rrule.get_by_weekday();
81
- let mut arr = env.create_array(0).unwrap();
81
+ let mut arr = env.create_array(0)?;
82
82
 
83
83
  for nday in ndays.iter() {
84
84
  let day = match nday {
@@ -86,7 +86,7 @@ impl JsRRule {
86
86
  _ => panic!("Unsupported"),
87
87
  };
88
88
 
89
- arr.insert(map_rust_weekday(day)).unwrap();
89
+ arr.insert(map_rust_weekday(day))?;
90
90
  }
91
91
 
92
92
  Ok(arr)
@@ -120,10 +120,10 @@ impl JsRRule {
120
120
  #[napi(getter, ts_return_type = "Month[]")]
121
121
  pub fn by_month(&self, env: Env) -> napi::Result<Array> {
122
122
  let months = self.rrule.get_by_month();
123
- let mut arr = env.create_array(0).unwrap();
123
+ let mut arr = env.create_array(0)?;
124
124
 
125
125
  for month in months.iter() {
126
- arr.insert(map_rust_month(month)).unwrap();
126
+ arr.insert(map_rust_month(month))?;
127
127
  }
128
128
 
129
129
  Ok(arr)
@@ -174,7 +174,7 @@ impl JsRRule {
174
174
  #[napi]
175
175
  pub fn set_by_weekday(
176
176
  &mut self,
177
- #[napi(ts_arg_type = "Weekday[]")] weekdays: Array,
177
+ #[napi(ts_arg_type = "ReadonlyArray<Weekday>")] weekdays: Array,
178
178
  ) -> napi::Result<&Self> {
179
179
  let mut vec: Vec<NWeekday> = Vec::new();
180
180
 
@@ -191,35 +191,50 @@ impl JsRRule {
191
191
  }
192
192
 
193
193
  #[napi]
194
- pub fn set_by_hour(&mut self, hours: Vec<u8>) -> napi::Result<&Self> {
194
+ pub fn set_by_hour(
195
+ &mut self,
196
+ #[napi(ts_arg_type = "ReadonlyArray<number>")] hours: Vec<u8>,
197
+ ) -> napi::Result<&Self> {
195
198
  replace_with_or_abort(&mut self.rrule, |self_| self_.by_hour(hours));
196
199
 
197
200
  Ok(self)
198
201
  }
199
202
 
200
203
  #[napi]
201
- pub fn set_by_minute(&mut self, minutes: Vec<u8>) -> napi::Result<&Self> {
204
+ pub fn set_by_minute(
205
+ &mut self,
206
+ #[napi(ts_arg_type = "ReadonlyArray<number>")] minutes: Vec<u8>,
207
+ ) -> napi::Result<&Self> {
202
208
  replace_with_or_abort(&mut self.rrule, |self_| self_.by_minute(minutes));
203
209
 
204
210
  Ok(self)
205
211
  }
206
212
 
207
213
  #[napi]
208
- pub fn set_by_second(&mut self, seconds: Vec<u8>) -> napi::Result<&Self> {
214
+ pub fn set_by_second(
215
+ &mut self,
216
+ #[napi(ts_arg_type = "ReadonlyArray<number>")] seconds: Vec<u8>,
217
+ ) -> napi::Result<&Self> {
209
218
  replace_with_or_abort(&mut self.rrule, |self_| self_.by_second(seconds));
210
219
 
211
220
  Ok(self)
212
221
  }
213
222
 
214
223
  #[napi]
215
- pub fn set_by_monthday(&mut self, days: Vec<i8>) -> napi::Result<&Self> {
224
+ pub fn set_by_monthday(
225
+ &mut self,
226
+ #[napi(ts_arg_type = "ReadonlyArray<number>")] days: Vec<i8>,
227
+ ) -> napi::Result<&Self> {
216
228
  replace_with_or_abort(&mut self.rrule, |self_| self_.by_month_day(days));
217
229
 
218
230
  Ok(self)
219
231
  }
220
232
 
221
233
  #[napi]
222
- pub fn set_by_setpos(&mut self, poses: Vec<i32>) -> napi::Result<&Self> {
234
+ pub fn set_by_setpos(
235
+ &mut self,
236
+ #[napi(ts_arg_type = "ReadonlyArray<number>")] poses: Vec<i32>,
237
+ ) -> napi::Result<&Self> {
223
238
  replace_with_or_abort(&mut self.rrule, |self_| self_.by_set_pos(poses));
224
239
 
225
240
  Ok(self)
@@ -228,7 +243,7 @@ impl JsRRule {
228
243
  #[napi]
229
244
  pub fn set_by_month(
230
245
  &mut self,
231
- #[napi(ts_arg_type = "Month[]")] months: Array,
246
+ #[napi(ts_arg_type = "ReadonlyArray<Month>")] months: Array,
232
247
  ) -> napi::Result<&Self> {
233
248
  let mut vec: Vec<Month> = Vec::new();
234
249
 
@@ -244,14 +259,20 @@ impl JsRRule {
244
259
  }
245
260
 
246
261
  #[napi]
247
- pub fn set_by_weekno(&mut self, week_numbers: Vec<i8>) -> napi::Result<&Self> {
262
+ pub fn set_by_weekno(
263
+ &mut self,
264
+ #[napi(ts_arg_type = "ReadonlyArray<number>")] week_numbers: Vec<i8>,
265
+ ) -> napi::Result<&Self> {
248
266
  replace_with_or_abort(&mut self.rrule, |self_| self_.by_week_no(week_numbers));
249
267
 
250
268
  Ok(self)
251
269
  }
252
270
 
253
271
  #[napi]
254
- pub fn set_by_yearday(&mut self, days: Vec<i16>) -> napi::Result<&Self> {
272
+ pub fn set_by_yearday(
273
+ &mut self,
274
+ #[napi(ts_arg_type = "ReadonlyArray<number>")] days: Vec<i16>,
275
+ ) -> napi::Result<&Self> {
255
276
  replace_with_or_abort(&mut self.rrule, |self_| self_.by_year_day(days));
256
277
 
257
278
  Ok(self)
@@ -275,8 +296,8 @@ impl JsRRule {
275
296
  Ok(self)
276
297
  }
277
298
 
278
- pub fn validate(&self, dt_start: DateTime<Tz>) -> RRule {
279
- self.rrule.clone().validate(dt_start).unwrap()
299
+ pub fn validate(&self, dt_start: DateTime<Tz>) -> napi::Result<RRule> {
300
+ return Ok(self.rrule.clone().validate(dt_start).map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?);
280
301
  }
281
302
  }
282
303
 
@@ -289,21 +310,21 @@ pub struct JsRRuleSet {
289
310
  #[napi]
290
311
  impl JsRRuleSet {
291
312
  #[napi(constructor)]
292
- pub fn new(dtstart: i64, tzid: String) -> Self {
293
- let tz = map_js_tz(&tzid);
313
+ pub fn new(dtstart: i64, tzid: String) -> napi::Result<Self> {
314
+ let tz = map_js_tz(&tzid)?;
294
315
  let date = timestamp_to_date_with_tz(dtstart, &tz);
295
316
  let rrule_set = RRuleSet::new(date);
296
317
 
297
- JsRRuleSet { rrule_set, tz }
318
+ Ok(JsRRuleSet { rrule_set, tz })
298
319
  }
299
320
 
300
- #[napi(factory, ts_return_type="RRuleSet")]
301
- pub fn parse(str: String) -> Self {
302
- let rrule_set: RRuleSet = str.parse().unwrap();
321
+ #[napi(factory, ts_return_type = "RRuleSet")]
322
+ pub fn parse(str: String) -> napi::Result<Self> {
323
+ let rrule_set: RRuleSet = str.parse().map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?;
303
324
  let dtstart = rrule_set.get_dt_start();
304
325
  let tz = dtstart.timezone();
305
326
 
306
- JsRRuleSet { rrule_set, tz }
327
+ Ok(JsRRuleSet { rrule_set, tz })
307
328
  }
308
329
 
309
330
  #[napi]
@@ -314,7 +335,7 @@ impl JsRRuleSet {
314
335
  #[napi]
315
336
  pub fn add_rrule(&mut self, js_rrule: &JsRRule) -> napi::Result<&Self> {
316
337
  let dt_start = self.rrule_set.get_dt_start().clone();
317
- let rrule = js_rrule.validate(dt_start);
338
+ let rrule = js_rrule.validate(dt_start)?;
318
339
 
319
340
  replace_with_or_abort(&mut self.rrule_set, |self_| self_.rrule(rrule));
320
341
 
@@ -323,7 +344,7 @@ impl JsRRuleSet {
323
344
 
324
345
  #[napi]
325
346
  pub fn add_exrule(&mut self, js_rrule: &JsRRule) -> napi::Result<&Self> {
326
- let rrule = js_rrule.validate(*self.rrule_set.get_dt_start());
347
+ let rrule = js_rrule.validate(*self.rrule_set.get_dt_start())?;
327
348
 
328
349
  replace_with_or_abort(&mut self.rrule_set, |self_| self_.exrule(rrule));
329
350
 
@@ -389,7 +410,7 @@ impl JsRRuleSet {
389
410
 
390
411
  #[napi(ts_return_type = "number[]")]
391
412
  pub fn all(&self, env: Env, limit: Option<u32>) -> napi::Result<Array> {
392
- let mut arr = env.create_array(0).unwrap();
413
+ let mut arr = env.create_array(0)?;
393
414
  let mut left = match limit {
394
415
  Some(number) => number,
395
416
  None => 0,
@@ -403,15 +424,21 @@ impl JsRRuleSet {
403
424
  }
404
425
 
405
426
  let timestamp = date.timestamp_millis();
406
- arr.insert(timestamp).unwrap();
427
+ arr.insert(timestamp)?;
407
428
  }
408
429
 
409
430
  Ok(arr)
410
431
  }
411
432
 
412
433
  #[napi(ts_return_type = "number[]")]
413
- pub fn between(&self, env: Env, after: i64, before: i64, inclusive: Option<bool>) -> napi::Result<Array> {
414
- let mut arr = env.create_array(0).unwrap();
434
+ pub fn between(
435
+ &self,
436
+ env: Env,
437
+ after: i64,
438
+ before: i64,
439
+ inclusive: Option<bool>,
440
+ ) -> napi::Result<Array> {
441
+ let mut arr = env.create_array(0)?;
415
442
 
416
443
  for date in self.rrule_set.into_iter() {
417
444
  let timestamp = date.timestamp_millis();
@@ -419,7 +446,7 @@ impl JsRRuleSet {
419
446
  let is_before = self.is_before(timestamp, before, inclusive);
420
447
 
421
448
  if is_after && is_before {
422
- arr.insert(timestamp).unwrap();
449
+ arr.insert(timestamp)?;
423
450
  } else if !is_before {
424
451
  break;
425
452
  }
@@ -521,9 +548,9 @@ fn map_rust_month(month: &u8) -> JsMonth {
521
548
  }
522
549
  }
523
550
 
524
- fn map_js_tz(tz: &str) -> Tz {
525
- let chrono_tz = tz.parse().unwrap();
526
- Tz::Tz(chrono_tz)
551
+ fn map_js_tz(tz: &str) -> napi::Result<Tz> {
552
+ let chrono_tz = tz.parse().map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?;
553
+ Ok(Tz::Tz(chrono_tz))
527
554
  }
528
555
 
529
556
  fn timestamp_to_date_with_tz(timestamp: i64, tz: &Tz) -> DateTime<Tz> {