recal-sdk 0.2.0 → 0.2.1

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.
Files changed (76) hide show
  1. package/README.md +27 -27
  2. package/dist/entities/organization.d.ts +2 -2
  3. package/dist/entities/organization.d.ts.map +1 -1
  4. package/dist/entities/organization.js +32 -0
  5. package/dist/entities/organization.js.map +1 -0
  6. package/dist/entities/user.d.ts +2 -2
  7. package/dist/entities/user.d.ts.map +1 -1
  8. package/dist/entities/user.js +45 -0
  9. package/dist/entities/user.js.map +1 -0
  10. package/dist/errors.js +36 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/index.d.ts +4 -5
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +52 -7092
  15. package/dist/index.js.map +1 -1
  16. package/dist/services/calendar.service.d.ts +2 -2
  17. package/dist/services/calendar.service.d.ts.map +1 -1
  18. package/dist/services/calendar.service.js +292 -0
  19. package/dist/services/calendar.service.js.map +1 -0
  20. package/dist/services/oauth.service.js +168 -0
  21. package/dist/services/oauth.service.js.map +1 -0
  22. package/dist/services/organizations.service.d.ts +1 -1
  23. package/dist/services/organizations.service.d.ts.map +1 -1
  24. package/dist/services/organizations.service.js +132 -0
  25. package/dist/services/organizations.service.js.map +1 -0
  26. package/dist/services/scheduling.service.d.ts +2 -2
  27. package/dist/services/scheduling.service.d.ts.map +1 -1
  28. package/dist/services/scheduling.service.js +122 -0
  29. package/dist/services/scheduling.service.js.map +1 -0
  30. package/dist/services/users.service.js +93 -0
  31. package/dist/services/users.service.js.map +1 -0
  32. package/dist/typebox/calendar.tb.d.ts +5 -4
  33. package/dist/typebox/calendar.tb.d.ts.map +1 -1
  34. package/dist/typebox/calendar.tb.js +92 -0
  35. package/dist/typebox/calendar.tb.js.map +1 -0
  36. package/dist/typebox/oauth.tb.d.ts +2 -2
  37. package/dist/typebox/oauth.tb.js +16 -0
  38. package/dist/typebox/oauth.tb.js.map +1 -0
  39. package/dist/typebox/organization.stripped.tb.js +7 -0
  40. package/dist/typebox/organization.stripped.tb.js.map +1 -0
  41. package/dist/typebox/organization.tb.js +8 -0
  42. package/dist/typebox/organization.tb.js.map +1 -0
  43. package/dist/typebox/scheduling.tb.js +118 -0
  44. package/dist/typebox/scheduling.tb.js.map +1 -0
  45. package/dist/typebox/timeString.tb.js +7 -0
  46. package/dist/typebox/timeString.tb.js.map +1 -0
  47. package/dist/typebox/user.stripped.tb.js +6 -0
  48. package/dist/typebox/user.stripped.tb.js.map +1 -0
  49. package/dist/typebox/user.tb.d.ts +1 -1
  50. package/dist/typebox/user.tb.js +10 -0
  51. package/dist/typebox/user.tb.js.map +1 -0
  52. package/dist/types/calendar.types.d.ts +2 -4
  53. package/dist/types/calendar.types.d.ts.map +1 -1
  54. package/dist/types/calendar.types.js +27 -56
  55. package/dist/types/calendar.types.js.map +1 -1
  56. package/dist/types/internal.types.js +2 -0
  57. package/dist/types/internal.types.js.map +1 -0
  58. package/dist/types/oauth.types.d.ts +1 -1
  59. package/dist/types/oauth.types.d.ts.map +1 -1
  60. package/dist/types/oauth.types.js +2 -0
  61. package/dist/types/oauth.types.js.map +1 -0
  62. package/dist/types/scheduling.types.js +2 -0
  63. package/dist/types/scheduling.types.js.map +1 -0
  64. package/dist/utils/fetch.helper.d.ts +1 -1
  65. package/dist/utils/fetch.helper.d.ts.map +1 -1
  66. package/dist/utils/fetch.helper.js +93 -0
  67. package/dist/utils/fetch.helper.js.map +1 -0
  68. package/dist/utils/fetchErrorHandler.js +32 -0
  69. package/dist/utils/fetchErrorHandler.js.map +1 -0
  70. package/dist/utils/functionize.js +6 -0
  71. package/dist/utils/functionize.js.map +1 -0
  72. package/dist/utils/includes.helper.js +10 -0
  73. package/dist/utils/includes.helper.js.map +1 -0
  74. package/dist/utils/omit.js +4 -0
  75. package/dist/utils/omit.js.map +1 -0
  76. package/package.json +7 -5
package/README.md CHANGED
@@ -92,7 +92,7 @@ const busyFiltered = await recal.calendar.getBusy(
92
92
  new Date('2024-01-01'),
93
93
  new Date('2024-01-07'),
94
94
  {
95
- provider: Provider.GOOGLE, // optional: filter by provider
95
+ provider: 'google', // optional: filter by provider
96
96
  timeZone: 'America/New_York', // optional: timezone
97
97
  }
98
98
  )
@@ -114,7 +114,7 @@ const eventsFiltered = await recal.calendar.getEvents(
114
114
  new Date('2024-01-01'),
115
115
  new Date('2024-01-31'),
116
116
  {
117
- provider: Provider.GOOGLE, // optional: filter by provider
117
+ provider: 'google', // optional: filter by provider
118
118
  timeZone: 'Europe/London' // optional: timezone
119
119
  }
120
120
  )
@@ -126,7 +126,7 @@ const eventsFiltered = await recal.calendar.getEvents(
126
126
  // Create a new event (without optional timezone)
127
127
  const event = await recal.calendar.createEvent({
128
128
  userId: 'user_id',
129
- provider: Provider.GOOGLE,
129
+ provider: 'google',
130
130
  calendarId: 'calendar_id',
131
131
  event: {
132
132
  subject: 'Team Meeting',
@@ -142,7 +142,7 @@ const event = await recal.calendar.createEvent({
142
142
  // Or with timezone option
143
143
  const eventWithTZ = await recal.calendar.createEvent({
144
144
  userId: 'user_id',
145
- provider: Provider.GOOGLE,
145
+ provider: 'google',
146
146
  calendarId: 'calendar_id',
147
147
  event: {
148
148
  subject: 'Team Meeting',
@@ -162,7 +162,7 @@ const eventWithTZ = await recal.calendar.createEvent({
162
162
  // Get an existing event
163
163
  const event = await recal.calendar.getEvent({
164
164
  userId: 'user_id',
165
- provider: Provider.GOOGLE,
165
+ provider: 'google',
166
166
  calendarId: 'calendar_id',
167
167
  eventId: 'event_id',
168
168
  options: { timeZone: 'Europe/Berlin' } // optional
@@ -175,7 +175,7 @@ const event = await recal.calendar.getEvent({
175
175
  // Update an existing event (simplest form)
176
176
  const updated = await recal.calendar.updateEvent({
177
177
  userId: 'user_id',
178
- provider: Provider.GOOGLE,
178
+ provider: 'google',
179
179
  calendarId: 'calendar_id',
180
180
  eventId: 'event_id',
181
181
  event: {
@@ -190,7 +190,7 @@ const updated = await recal.calendar.updateEvent({
190
190
  // or with more options
191
191
  const updated = await recal.calendar.updateEvent({
192
192
  userId: 'user_id',
193
- provider: Provider.GOOGLE,
193
+ provider: 'google',
194
194
  calendarId: 'calendar_id',
195
195
  eventId: 'event_id',
196
196
  event: {
@@ -212,7 +212,7 @@ const updated = await recal.calendar.updateEvent({
212
212
  // Delete an event
213
213
  await recal.calendar.deleteEvent({
214
214
  userId: 'user_id',
215
- provider: Provider.GOOGLE,
215
+ provider: 'google',
216
216
  calendarId: 'calendar_id',
217
217
  eventId: 'event_id'
218
218
  })
@@ -242,7 +242,7 @@ const metaEventSpecific = await recal.calendar.createEventByMetaId(
242
242
  end: new Date('2024-01-20T16:00:00Z')
243
243
  },
244
244
  {
245
- provider: [Provider.GOOGLE, Provider.MICROSOFT], // Create on specific providers
245
+ provider: ['google', 'microsoft'], // Create on specific providers
246
246
  timeZone: 'Europe/Berlin' // optional
247
247
  }
248
248
  )
@@ -292,7 +292,7 @@ const availabilityDetailed = await recal.scheduling.userSchedulingBasic(
292
292
  padding: 0, // Padding between slots
293
293
  earliestTimeEachDay: '09:00', // Format: HH:mm
294
294
  latestTimeEachDay: '17:00', // Format: HH:mm
295
- provider: Provider.GOOGLE, // optional: filter by provider
295
+ provider: 'google', // optional: filter by provider
296
296
  timeZone: 'America/New_York' // optional
297
297
  }
298
298
  )
@@ -329,7 +329,7 @@ const availabilityDetailed = await recal.scheduling.userSchedulingAdvanced(
329
329
  {
330
330
  slotDuration: 30,
331
331
  padding: 15,
332
- provider: Provider.GOOGLE, // optional
332
+ provider: 'google', // optional
333
333
  timeZone: 'America/New_York' // optional
334
334
  }
335
335
  )
@@ -356,7 +356,7 @@ const orgAvailabilityConstrained = await recal.scheduling.getOrgWideAvailability
356
356
  padding: 0,
357
357
  earliestTimeEachDay: '09:00',
358
358
  latestTimeEachDay: '17:00',
359
- provider: [Provider.GOOGLE, Provider.MICROSOFT], // optional
359
+ provider: ['google', 'microsoft'], // optional
360
360
  timeZone: 'America/New_York' // optional
361
361
  }
362
362
  )
@@ -490,7 +490,7 @@ const teamBusyFiltered = await recal.calendar.getOrgWideBusy(
490
490
  new Date('2024-01-20'),
491
491
  true, // primaryOnly: only check primary calendars
492
492
  {
493
- provider: Provider.GOOGLE, // optional: filter by provider
493
+ provider: 'google', // optional: filter by provider
494
494
  timeZone: 'America/New_York' // optional
495
495
  }
496
496
  )
@@ -504,13 +504,13 @@ const teamBusyFiltered = await recal.calendar.getOrgWideBusy(
504
504
  // Get OAuth authorization URL (with defaults)
505
505
  const link = await recal.oauth.getLink(
506
506
  'user_id',
507
- Provider.GOOGLE
507
+ 'google'
508
508
  )
509
509
 
510
510
  // Or with custom options
511
511
  const linkWithOptions = await recal.oauth.getLink(
512
512
  'user_id',
513
- Provider.GOOGLE,
513
+ 'google',
514
514
  {
515
515
  scope: 'edit', // 'edit' or 'free-busy' (for OAuth scopes)
516
516
  accessType: 'offline', // 'offline' or 'online'
@@ -530,7 +530,7 @@ const links = await recal.oauth.getBulkLinks('user_id')
530
530
  const linksFiltered = await recal.oauth.getBulkLinks(
531
531
  'user_id',
532
532
  {
533
- provider: [Provider.GOOGLE, Provider.MICROSOFT],
533
+ provider: ['google', 'microsoft'],
534
534
  scope: 'edit',
535
535
  accessType: 'offline'
536
536
  }
@@ -549,14 +549,14 @@ const connections = await recal.oauth.getAllConnections(
549
549
  // Get specific provider connection
550
550
  const googleConnection = await recal.oauth.getConnection(
551
551
  'user_id',
552
- Provider.GOOGLE,
552
+ 'google',
553
553
  false // redacted
554
554
  )
555
555
 
556
556
  // Set OAuth tokens manually
557
557
  const connection = await recal.oauth.setConnection(
558
558
  'user_id',
559
- Provider.GOOGLE,
559
+ 'google',
560
560
  {
561
561
  accessToken: 'access_token',
562
562
  refreshToken: 'refresh_token', // optional
@@ -567,7 +567,7 @@ const connection = await recal.oauth.setConnection(
567
567
  )
568
568
 
569
569
  // Disconnect a provider
570
- await recal.oauth.disconnect('user_id', Provider.GOOGLE)
570
+ await recal.oauth.disconnect('user_id', 'google')
571
571
  ```
572
572
 
573
573
  #### Verify OAuth Callback
@@ -575,7 +575,7 @@ await recal.oauth.disconnect('user_id', Provider.GOOGLE)
575
575
  ```typescript
576
576
  // Verify OAuth code from callback
577
577
  const result = await recal.oauth.verify(
578
- Provider.GOOGLE,
578
+ 'google',
579
579
  'auth_code_from_callback',
580
580
  'edit', // 'edit' or 'free-busy' - single scope, not array
581
581
  'state_parameter',
@@ -600,7 +600,7 @@ import {
600
600
  try {
601
601
  const event = await recal.calendar.getEvent({
602
602
  userId: 'user_id',
603
- provider: Provider.GOOGLE,
603
+ provider: 'google',
604
604
  calendarId: 'calendar_id',
605
605
  eventId: 'event_id'
606
606
  })
@@ -645,7 +645,7 @@ const allBusy = await recal.calendar.getBusy(
645
645
  )
646
646
 
647
647
  // Or aggregate by specific providers
648
- const providers: Provider[] = [Provider.GOOGLE, Provider.MICROSOFT]
648
+ const providers: Provider[] = ['google', 'microsoft']
649
649
  const busyTimes = await Promise.all(
650
650
  providers.map(provider =>
651
651
  recal.calendar.getBusy(
@@ -702,7 +702,7 @@ const clientEmail = 'john@example.com'
702
702
  // 4. Create an event for the selected slot (using calendar service)
703
703
  const booking = await recal.calendar.createEvent({
704
704
  userId: 'consultant_id',
705
- provider: Provider.GOOGLE,
705
+ provider: 'google',
706
706
  calendarId: 'primary',
707
707
  event: {
708
708
  subject: 'Consultation with ' + clientName,
@@ -734,7 +734,7 @@ async function syncCalendars(userId: string) {
734
734
  userId,
735
735
  new Date(),
736
736
  new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
737
- { provider: Provider.GOOGLE }
737
+ { provider: 'google' }
738
738
  )
739
739
 
740
740
  // Copy to Microsoft calendar
@@ -742,7 +742,7 @@ async function syncCalendars(userId: string) {
742
742
  if (!event.metaId) { // Not already synced
743
743
  await recal.calendar.createEvent({
744
744
  userId,
745
- provider: Provider.MICROSOFT,
745
+ provider: 'microsoft',
746
746
  calendarId: 'primary',
747
747
  event: {
748
748
  subject: event.subject,
@@ -798,9 +798,9 @@ async function findTeamSlot(
798
798
 
799
799
  ### Prerequisites
800
800
 
801
- - Node.js 18+ or Bun 1.0+
801
+ - Node.js 18+ or Bun 1.0+, or any other JavaScript runtime
802
802
  - TypeScript 5.0+
803
- - Biome 2.1.2 (optional)
803
+ - Biome 2.1.2 (for contributing)
804
804
 
805
805
  ### Setup
806
806
 
@@ -1,9 +1,9 @@
1
1
  import type { Static } from '@sinclair/typebox';
2
- import type { organizationSchema } from 'src/typebox/organization.tb';
2
+ import type { organizationSchema } from '../typebox/organization.tb';
3
3
  import type { FetchHelper } from '../utils/fetch.helper';
4
4
  import { User } from './user';
5
5
  export declare class Organization {
6
- private fetchHelper;
6
+ private readonly fetchHelper;
7
7
  slug: string;
8
8
  name: string | null;
9
9
  createdAt: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../src/entities/organization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,qBAAa,YAAY;IACrB,OAAO,CAAC,WAAW,CAAa;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,OAAO,CAAC,EAAE,IAAI,EAAE,CAAA;gBAEX,EACR,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,WAAW,GACd,EAAE;QACC,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,SAAS,EAAE,IAAI,CAAA;QACf,OAAO,CAAC,EAAE,IAAI,EAAE,CAAA;QAChB,WAAW,EAAE,WAAW,CAAA;KAC3B;IAQD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,kBAAkB,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY;IAQnF,UAAU,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;CAQ5D"}
1
+ {"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../src/entities/organization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,OAAO,CAAC,EAAE,IAAI,EAAE,CAAA;gBAEX,EACR,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,WAAW,GACd,EAAE;QACC,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,SAAS,EAAE,IAAI,CAAA;QACf,OAAO,CAAC,EAAE,IAAI,EAAE,CAAA;QAChB,WAAW,EAAE,WAAW,CAAA;KAC3B;IAQD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,kBAAkB,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY;IAQnF,UAAU,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;CAQ5D"}
@@ -0,0 +1,32 @@
1
+ import { OrganizationsService } from '../services/organizations.service.js';
2
+ import { User } from './user.js';
3
+ export class Organization {
4
+ fetchHelper;
5
+ slug;
6
+ name;
7
+ createdAt;
8
+ members;
9
+ constructor({ slug, name, createdAt, members, fetchHelper, }) {
10
+ this.slug = slug;
11
+ this.name = name;
12
+ this.createdAt = createdAt;
13
+ this.members = members;
14
+ this.fetchHelper = fetchHelper;
15
+ }
16
+ static fromJson(json, fetchHelper) {
17
+ return new Organization({
18
+ ...json,
19
+ members: json.members?.map((member) => User.fromJson(member, fetchHelper)),
20
+ fetchHelper,
21
+ });
22
+ }
23
+ async getMembers(refetch = false) {
24
+ if (refetch) {
25
+ const organizationsService = new OrganizationsService(this.fetchHelper);
26
+ const newData = await organizationsService.getMembers(this.slug);
27
+ this.members = newData;
28
+ }
29
+ return this.members ?? [];
30
+ }
31
+ }
32
+ //# sourceMappingURL=organization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization.js","sourceRoot":"","sources":["../../src/entities/organization.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAGvE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,MAAM,OAAO,YAAY;IACJ,WAAW,CAAa;IAClC,IAAI,CAAQ;IACZ,IAAI,CAAe;IACnB,SAAS,CAAM;IACf,OAAO,CAAS;IAEvB,YAAY,EACR,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,WAAW,GAOd;QACG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAuC,EAAE,WAAwB;QAC7E,OAAO,IAAI,YAAY,CAAC;YACpB,GAAG,IAAI;YACP,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1E,WAAW;SACd,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,KAAK;QACnC,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACvE,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;IAC7B,CAAC;CACJ"}
@@ -1,10 +1,10 @@
1
1
  import type { Static } from '@sinclair/typebox';
2
- import type { userSchema } from 'src/typebox/user.tb';
2
+ import type { userSchema } from '../typebox/user.tb';
3
3
  import type { OAuthConnection } from '../types/oauth.types';
4
4
  import type { FetchHelper } from '../utils/fetch.helper';
5
5
  import { Organization } from './organization';
6
6
  export declare class User {
7
- private fetchHelper;
7
+ private readonly fetchHelper;
8
8
  id: string;
9
9
  createdAt: Date;
10
10
  organizations?: Organization[];
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,qBAAa,IAAI;IACb,OAAO,CAAC,WAAW,CAAa;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,IAAI,CAAA;IACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;gBAE/B,EACR,EAAE,EACF,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,WAAW,GACd,EAAE;QACC,EAAE,EAAE,MAAM,CAAA;QACV,SAAS,EAAE,IAAI,CAAA;QACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;QAC9B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;QACpC,WAAW,EAAE,WAAW,CAAA;KAC3B;IAQD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,UAAU,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IASnE,gBAAgB,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAU1D,mBAAmB,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAQhF"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,qBAAa,IAAI;IACb,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,IAAI,CAAA;IACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;gBAE/B,EACR,EAAE,EACF,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,WAAW,GACd,EAAE;QACC,EAAE,EAAE,MAAM,CAAA;QACV,SAAS,EAAE,IAAI,CAAA;QACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;QAC9B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;QACpC,WAAW,EAAE,WAAW,CAAA;KAC3B;IAQD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,UAAU,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IASnE,gBAAgB,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAU1D,mBAAmB,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAQhF"}
@@ -0,0 +1,45 @@
1
+ import { UserNotFoundError } from '../errors.js';
2
+ import { OAuthService } from '../services/oauth.service.js';
3
+ import { OrganizationsService } from '../services/organizations.service.js';
4
+ import { Organization } from './organization.js';
5
+ export class User {
6
+ fetchHelper;
7
+ id;
8
+ createdAt;
9
+ organizations;
10
+ oauthConnections;
11
+ constructor({ id, createdAt, organizations, oauthConnections, fetchHelper, }) {
12
+ this.id = id;
13
+ this.createdAt = createdAt;
14
+ this.organizations = organizations;
15
+ this.oauthConnections = oauthConnections;
16
+ this.fetchHelper = fetchHelper;
17
+ }
18
+ static fromJson(json, fetchHelper) {
19
+ return new User({
20
+ ...json,
21
+ organizations: json.organizations?.map((org) => Organization.fromJson(org, fetchHelper)),
22
+ oauthConnections: json.oauthConnections,
23
+ fetchHelper,
24
+ });
25
+ }
26
+ async getOrganizations(refetch = false) {
27
+ if (this.organizations === undefined || refetch) {
28
+ const organizationsService = new OrganizationsService(this.fetchHelper);
29
+ const orgs = await organizationsService.listAllFromUser(this.id);
30
+ if (!orgs)
31
+ throw new UserNotFoundError(this.id);
32
+ this.organizations = orgs;
33
+ }
34
+ return this.organizations ?? [];
35
+ }
36
+ async getOAuthConnections(refetch = false) {
37
+ if (this.oauthConnections === undefined || refetch) {
38
+ const oauthService = new OAuthService(this.fetchHelper);
39
+ const connections = await oauthService.getAllConnections(this.id);
40
+ this.oauthConnections = connections;
41
+ }
42
+ return this.oauthConnections ?? [];
43
+ }
44
+ }
45
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/entities/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAIvE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,OAAO,IAAI;IACI,WAAW,CAAa;IAClC,EAAE,CAAQ;IACV,SAAS,CAAM;IACf,aAAa,CAAiB;IAC9B,gBAAgB,CAAoB;IAE3C,YAAY,EACR,EAAE,EACF,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,WAAW,GAOd;QACG,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QACxC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAA+B,EAAE,WAAwB;QACrE,OAAO,IAAI,IAAI,CAAC;YACZ,GAAG,IAAI;YACP,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACxF,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,WAAW;SACd,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,KAAK;QACzC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YAC9C,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACvE,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAChE,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC/C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,IAAI,EAAE,CAAA;IACnC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,OAAO,GAAG,KAAK;QAC5C,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YACjD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACvD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACjE,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAA;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAA;IACtC,CAAC;CACJ"}
package/dist/errors.js ADDED
@@ -0,0 +1,36 @@
1
+ export class OrganizationNotFoundError extends Error {
2
+ constructor(slug) {
3
+ super(`[Recal] Organization ${slug} not found`);
4
+ }
5
+ }
6
+ export class OrganizationAlreadyExistsError extends Error {
7
+ constructor(slug) {
8
+ super(`[Recal] Organization ${slug} already exists`);
9
+ }
10
+ }
11
+ export class UserAlreadyExistsError extends Error {
12
+ constructor(userId) {
13
+ super(`[Recal] User ${userId} already exists`);
14
+ }
15
+ }
16
+ export class UserNotFoundError extends Error {
17
+ constructor(userId) {
18
+ super(`[Recal] User ${userId} not found`);
19
+ }
20
+ }
21
+ export class ProviderCredentialsNotSetError extends Error {
22
+ constructor(provider) {
23
+ super(`[Recal] Provider ${provider} credentials not set`);
24
+ }
25
+ }
26
+ export class OAuthConnectionNotFoundError extends Error {
27
+ constructor(userId, provider) {
28
+ super(`[Recal] OAuth connection not found for user ${userId} and provider ${provider}`);
29
+ }
30
+ }
31
+ export class EventNotFoundError extends Error {
32
+ constructor(eventId) {
33
+ super(`[Recal] Event ${eventId} not found`);
34
+ }
35
+ }
36
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAChD,YAAmB,IAAY;QAC3B,KAAK,CAAC,wBAAwB,IAAI,YAAY,CAAC,CAAA;IACnD,CAAC;CACJ;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACrD,YAAmB,IAAY;QAC3B,KAAK,CAAC,wBAAwB,IAAI,iBAAiB,CAAC,CAAA;IACxD,CAAC;CACJ;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC7C,YAAmB,MAAc;QAC7B,KAAK,CAAC,gBAAgB,MAAM,iBAAiB,CAAC,CAAA;IAClD,CAAC;CACJ;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACxC,YAAmB,MAAc;QAC7B,KAAK,CAAC,gBAAgB,MAAM,YAAY,CAAC,CAAA;IAC7C,CAAC;CACJ;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACrD,YAAmB,QAAgB;QAC/B,KAAK,CAAC,oBAAoB,QAAQ,sBAAsB,CAAC,CAAA;IAC7D,CAAC;CACJ;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACnD,YAAmB,MAAc,EAAE,QAAgB;QAC/C,KAAK,CAAC,+CAA+C,MAAM,iBAAiB,QAAQ,EAAE,CAAC,CAAA;IAC3F,CAAC;CACJ;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzC,YAAmB,OAAe;QAC9B,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAA;IAC/C,CAAC;CACJ"}
package/dist/index.d.ts CHANGED
@@ -6,8 +6,8 @@ import { UsersService } from './services/users.service';
6
6
  import type { RecalOptions } from './types/internal.types';
7
7
  /**
8
8
  * Recal SDK
9
- * @description Recal SDK for Node.js
10
- * @version 0.1.0
9
+ * @description Recal SDK for JavaScript/TypeScript
10
+ * @version 0.2.0
11
11
  * @author Recal <team@recal.dev>
12
12
  * @license MIT
13
13
  */
@@ -26,8 +26,7 @@ export * from './entities/organization';
26
26
  export * from './entities/user';
27
27
  export * from './errors';
28
28
  export * from './types/calendar.types';
29
- export * from './types/scheduling.types';
29
+ export type { RecalOptions, RecalOptions as RecalClientOptions } from './types/internal.types';
30
30
  export * from './types/oauth.types';
31
- export type { RecalOptions } from './types/internal.types';
32
- export type { RecalOptions as RecalClientOptions } from './types/internal.types';
31
+ export * from './types/scheduling.types';
33
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAI1D;;;;;;GAMG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAa;IAGhC,KAAK,EAAE,YAAY,CAAA;IACnB,aAAa,EAAE,oBAAoB,CAAA;IACnC,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,iBAAiB,CAAA;gBAEV,OAAO,CAAC,EAAE,YAAY;CAe5C;AAED,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AAExB,cAAc,wBAAwB,CAAA;AACtC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,YAAY,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAI1D;;;;;;GAMG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAa;IAGhC,KAAK,EAAE,YAAY,CAAA;IACnB,aAAa,EAAE,oBAAoB,CAAA;IACnC,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,iBAAiB,CAAA;gBAEV,OAAO,CAAC,EAAE,YAAY;CAiB5C;AAED,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AAExB,cAAc,wBAAwB,CAAA;AACtC,YAAY,EAAE,YAAY,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA"}