diff --git a/README.md b/README.md index 9edc8e5..f01fba2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# ActivitySmith Node.js Library +# ActivitySmith Node SDK -The ActivitySmith Node library provides convenient access to the ActivitySmith API from server-side JavaScript and TypeScript applications. +The ActivitySmith Node SDK provides convenient access to the ActivitySmith API from server-side JavaScript and TypeScript applications. ## Documentation @@ -24,17 +24,13 @@ const client = new ActivitySmith({ }); // Push Notifications -await client.notifications.sendPushNotification({ - pushNotificationRequest: { - // See PushNotificationRequest for fields - }, +await client.notifications.send({ + // See PushNotificationRequest for fields }); // Live Activities -await client.liveActivities.startLiveActivity({ - liveActivityStartRequest: { - // See LiveActivityStartRequest for fields - }, +await client.liveActivities.start({ + // See LiveActivityStartRequest for fields }); ``` diff --git a/src/ActivitySmith.ts b/src/ActivitySmith.ts index 98ae93d..7243d61 100644 --- a/src/ActivitySmith.ts +++ b/src/ActivitySmith.ts @@ -4,9 +4,82 @@ export interface ActivitySmithOptions { apiKey: string; } +type PushRequestBody = Parameters[0]["pushNotificationRequest"]; +type SendInitOverrides = Parameters[1]; +type StartRequestBody = Parameters[0]["liveActivityStartRequest"]; +type UpdateRequestBody = Parameters[0]["liveActivityUpdateRequest"]; +type EndRequestBody = Parameters[0]["liveActivityEndRequest"]; +type LiveInitOverrides = Parameters[1]; + +export class NotificationsResource { + private readonly api: PushNotificationsApi; + + constructor(api: PushNotificationsApi) { + this.api = api; + } + + send(request: PushRequestBody, initOverrides?: SendInitOverrides) { + return this.api.sendPushNotification({ pushNotificationRequest: request }, initOverrides); + } + + // Backward-compatible alias. + sendPushNotification(...args: Parameters) { + return this.api.sendPushNotification(...args); + } + + sendPushNotificationRaw(...args: Parameters) { + return this.api.sendPushNotificationRaw(...args); + } +} + +export class LiveActivitiesResource { + private readonly api: LiveActivitiesApi; + + constructor(api: LiveActivitiesApi) { + this.api = api; + } + + start(request: StartRequestBody, initOverrides?: LiveInitOverrides) { + return this.api.startLiveActivity({ liveActivityStartRequest: request }, initOverrides); + } + + update(request: UpdateRequestBody, initOverrides?: LiveInitOverrides) { + return this.api.updateLiveActivity({ liveActivityUpdateRequest: request }, initOverrides); + } + + end(request: EndRequestBody, initOverrides?: LiveInitOverrides) { + return this.api.endLiveActivity({ liveActivityEndRequest: request }, initOverrides); + } + + // Backward-compatible aliases. + startLiveActivity(...args: Parameters) { + return this.api.startLiveActivity(...args); + } + + updateLiveActivity(...args: Parameters) { + return this.api.updateLiveActivity(...args); + } + + endLiveActivity(...args: Parameters) { + return this.api.endLiveActivity(...args); + } + + startLiveActivityRaw(...args: Parameters) { + return this.api.startLiveActivityRaw(...args); + } + + updateLiveActivityRaw(...args: Parameters) { + return this.api.updateLiveActivityRaw(...args); + } + + endLiveActivityRaw(...args: Parameters) { + return this.api.endLiveActivityRaw(...args); + } +} + export class ActivitySmith { - public readonly notifications: PushNotificationsApi; - public readonly liveActivities: LiveActivitiesApi; + public readonly notifications: NotificationsResource; + public readonly liveActivities: LiveActivitiesResource; constructor(opts: ActivitySmithOptions) { if (!opts?.apiKey) { @@ -18,7 +91,7 @@ export class ActivitySmith { accessToken: opts.apiKey, }); - this.notifications = new PushNotificationsApi(config); - this.liveActivities = new LiveActivitiesApi(config); + this.notifications = new NotificationsResource(new PushNotificationsApi(config)); + this.liveActivities = new LiveActivitiesResource(new LiveActivitiesApi(config)); } } diff --git a/tests/smoke.test.js b/tests/smoke.test.js index 831eeb8..e515448 100644 --- a/tests/smoke.test.js +++ b/tests/smoke.test.js @@ -20,4 +20,38 @@ describe("smoke", () => { expect(client).toBeTruthy(); }); + + it("supports short method names for resources", async () => { + const fetchSpy = vi.fn(async () => + new Response( + JSON.stringify({ + success: true, + devices_notified: 1, + }), + { + status: 200, + headers: { "content-type": "application/json" }, + }, + ), + ); + + globalThis.fetch = fetchSpy; + + const ActivitySmith = require("../dist/src/index.js"); + const client = new ActivitySmith({ apiKey: "test" }); + + await client.notifications.send({ title: "Build Failed" }); + await client.liveActivities.start({ + content_state: { + title: "Deploy", + number_of_steps: 4, + current_step: 1, + type: "segmented_progress", + }, + }); + + expect(fetchSpy).toHaveBeenCalledTimes(2); + expect(String(fetchSpy.mock.calls[0][0])).toContain("/push-notification"); + expect(String(fetchSpy.mock.calls[1][0])).toContain("/live-activity/start"); + }); });