@tiempo/sdk 0.0.0-stage → 0.1.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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +269 -2
  3. package/dist/cjs/client.d.ts +24 -0
  4. package/dist/cjs/client.js +42 -0
  5. package/dist/cjs/core.d.ts +72 -0
  6. package/dist/cjs/core.js +187 -0
  7. package/dist/cjs/crypto.d.ts +5 -0
  8. package/dist/cjs/crypto.js +29 -0
  9. package/dist/cjs/errors.d.ts +86 -0
  10. package/dist/cjs/errors.js +134 -0
  11. package/dist/cjs/events.d.ts +23 -0
  12. package/dist/cjs/events.js +10 -0
  13. package/dist/cjs/generated/events.d.ts +51 -0
  14. package/dist/cjs/generated/events.js +51 -0
  15. package/dist/cjs/generated/meta.d.ts +4 -0
  16. package/dist/cjs/generated/meta.js +8 -0
  17. package/dist/cjs/generated/openapi.d.ts +3721 -0
  18. package/dist/cjs/generated/openapi.js +2 -0
  19. package/dist/cjs/generated/resources.d.ts +416 -0
  20. package/dist/cjs/generated/resources.js +621 -0
  21. package/dist/cjs/generated/types.d.ts +134 -0
  22. package/dist/cjs/generated/types.js +3 -0
  23. package/dist/cjs/index.d.ts +16 -0
  24. package/dist/cjs/index.js +49 -0
  25. package/dist/cjs/list.d.ts +43 -0
  26. package/dist/cjs/list.js +78 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/query.d.ts +8 -0
  29. package/dist/cjs/query.js +47 -0
  30. package/dist/cjs/shared.d.ts +7 -0
  31. package/dist/cjs/shared.js +2 -0
  32. package/dist/cjs/webhooks.d.ts +34 -0
  33. package/dist/cjs/webhooks.js +115 -0
  34. package/dist/esm/client.d.ts +24 -0
  35. package/dist/esm/client.js +38 -0
  36. package/dist/esm/core.d.ts +72 -0
  37. package/dist/esm/core.js +181 -0
  38. package/dist/esm/crypto.d.ts +5 -0
  39. package/dist/esm/crypto.js +26 -0
  40. package/dist/esm/errors.d.ts +86 -0
  41. package/dist/esm/errors.js +120 -0
  42. package/dist/esm/events.d.ts +23 -0
  43. package/dist/esm/events.js +8 -0
  44. package/dist/esm/generated/events.d.ts +51 -0
  45. package/dist/esm/generated/events.js +48 -0
  46. package/dist/esm/generated/meta.d.ts +4 -0
  47. package/dist/esm/generated/meta.js +5 -0
  48. package/dist/esm/generated/openapi.d.ts +3721 -0
  49. package/dist/esm/generated/openapi.js +1 -0
  50. package/dist/esm/generated/resources.d.ts +416 -0
  51. package/dist/esm/generated/resources.js +603 -0
  52. package/dist/esm/generated/types.d.ts +134 -0
  53. package/dist/esm/generated/types.js +2 -0
  54. package/dist/esm/index.d.ts +16 -0
  55. package/dist/esm/index.js +10 -0
  56. package/dist/esm/list.d.ts +43 -0
  57. package/dist/esm/list.js +74 -0
  58. package/dist/esm/package.json +1 -0
  59. package/dist/esm/query.d.ts +8 -0
  60. package/dist/esm/query.js +43 -0
  61. package/dist/esm/shared.d.ts +7 -0
  62. package/dist/esm/shared.js +1 -0
  63. package/dist/esm/webhooks.d.ts +34 -0
  64. package/dist/esm/webhooks.js +109 -0
  65. package/package.json +74 -4
@@ -0,0 +1,86 @@
1
+ import type { Conflict } from './generated/types.js';
2
+ /**
3
+ * The `error` object in Tiempo's error envelope. Besides these four, an error can carry fields of
4
+ * its own, merged straight in: `conflicts` on `booking_conflict` and `session_conflicted`, `occurrences` on
5
+ * `series_update_conflict`, `seats_available` on `seats_unavailable`.
6
+ */
7
+ export interface TiempoErrorBody {
8
+ type?: string;
9
+ code?: string;
10
+ message?: string;
11
+ param?: string | null;
12
+ [key: string]: unknown;
13
+ }
14
+ /** A series occurrence that doesn't fit an edit (`series_update_conflict`). */
15
+ export interface UnplaceableOccurrence {
16
+ booking: string;
17
+ occurrence_key: string;
18
+ conflicts: Conflict[];
19
+ }
20
+ export interface TiempoErrorInit {
21
+ message: string;
22
+ type?: string | undefined;
23
+ code?: string | undefined;
24
+ param?: string | undefined;
25
+ details?: Record<string, unknown> | undefined;
26
+ statusCode?: number | undefined;
27
+ headers?: Record<string, string> | undefined;
28
+ raw?: unknown;
29
+ cause?: unknown;
30
+ }
31
+ /** Base class for every error the SDK throws. */
32
+ export declare class TiempoError extends Error {
33
+ /** The server's error `type`, for example `invalid_request_error`. */
34
+ readonly type: string | undefined;
35
+ /** A machine-readable code, for example `parameter_invalid`. */
36
+ readonly code: string | undefined;
37
+ /** The request parameter the error is about, when there is one. */
38
+ readonly param: string | undefined;
39
+ /**
40
+ * The error's own fields beyond type, code, message and param, for example `{ conflicts: [...] }`.
41
+ * Empty when there are none. {@link TiempoConflictError} has typed shortcuts.
42
+ */
43
+ readonly details: Record<string, unknown>;
44
+ /** HTTP status, when the server answered. */
45
+ readonly statusCode: number | undefined;
46
+ /** Response headers (lower-case names), when the server answered. */
47
+ readonly headers: Record<string, string>;
48
+ /** The parsed response body (or text), when the server answered. */
49
+ readonly raw: unknown;
50
+ constructor(init: TiempoErrorInit);
51
+ }
52
+ /** 400/404/422: the request was invalid (bad params, unknown id, …). */
53
+ export declare class TiempoInvalidRequestError extends TiempoError {
54
+ }
55
+ /** 401: missing or bad API key. */
56
+ export declare class TiempoAuthenticationError extends TiempoError {
57
+ }
58
+ /** 403: the key can't do this (for example live mode not activated). */
59
+ export declare class TiempoPermissionError extends TiempoError {
60
+ }
61
+ /** 409: the request conflicts with current state (slot taken, already cancelled, …). */
62
+ export declare class TiempoConflictError extends TiempoError {
63
+ /** Why the time isn't available, per segment (`booking_conflict`, `session_conflicted`). Empty for other conflicts. */
64
+ get conflicts(): Conflict[];
65
+ /** Occurrences a series edit couldn't place (`series_update_conflict`). */
66
+ get occurrences(): UnplaceableOccurrence[];
67
+ /** Seats still free in the session (`seats_unavailable`). */
68
+ get seatsAvailable(): number | undefined;
69
+ }
70
+ /** An `Idempotency-Key` was reused with different params, or is still in flight. */
71
+ export declare class TiempoIdempotencyError extends TiempoError {
72
+ }
73
+ /** 429: too many requests. */
74
+ export declare class TiempoRateLimitError extends TiempoError {
75
+ }
76
+ /** 5xx: something went wrong on Tiempo's side. */
77
+ export declare class TiempoAPIError extends TiempoError {
78
+ }
79
+ /** The request never got a response: network failure or timeout. */
80
+ export declare class TiempoConnectionError extends TiempoError {
81
+ }
82
+ /** A webhook's `Tiempo-Signature` didn't verify. */
83
+ export declare class TiempoSignatureVerificationError extends TiempoError {
84
+ }
85
+ /** Builds the right error subclass from an HTTP error response. */
86
+ export declare function errorFromResponse(statusCode: number, headers: Record<string, string>, raw: unknown): TiempoError;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TiempoSignatureVerificationError = exports.TiempoConnectionError = exports.TiempoAPIError = exports.TiempoRateLimitError = exports.TiempoIdempotencyError = exports.TiempoConflictError = exports.TiempoPermissionError = exports.TiempoAuthenticationError = exports.TiempoInvalidRequestError = exports.TiempoError = void 0;
4
+ exports.errorFromResponse = errorFromResponse;
5
+ /** Base class for every error the SDK throws. */
6
+ class TiempoError extends Error {
7
+ /** The server's error `type`, for example `invalid_request_error`. */
8
+ type;
9
+ /** A machine-readable code, for example `parameter_invalid`. */
10
+ code;
11
+ /** The request parameter the error is about, when there is one. */
12
+ param;
13
+ /**
14
+ * The error's own fields beyond type, code, message and param, for example `{ conflicts: [...] }`.
15
+ * Empty when there are none. {@link TiempoConflictError} has typed shortcuts.
16
+ */
17
+ details;
18
+ /** HTTP status, when the server answered. */
19
+ statusCode;
20
+ /** Response headers (lower-case names), when the server answered. */
21
+ headers;
22
+ /** The parsed response body (or text), when the server answered. */
23
+ raw;
24
+ constructor(init) {
25
+ super(init.message, init.cause !== undefined ? { cause: init.cause } : undefined);
26
+ this.name = new.target.name;
27
+ this.type = init.type;
28
+ this.code = init.code;
29
+ this.param = init.param;
30
+ this.details = init.details ?? {};
31
+ this.statusCode = init.statusCode;
32
+ this.headers = init.headers ?? {};
33
+ this.raw = init.raw;
34
+ }
35
+ }
36
+ exports.TiempoError = TiempoError;
37
+ /** 400/404/422: the request was invalid (bad params, unknown id, …). */
38
+ class TiempoInvalidRequestError extends TiempoError {
39
+ }
40
+ exports.TiempoInvalidRequestError = TiempoInvalidRequestError;
41
+ /** 401: missing or bad API key. */
42
+ class TiempoAuthenticationError extends TiempoError {
43
+ }
44
+ exports.TiempoAuthenticationError = TiempoAuthenticationError;
45
+ /** 403: the key can't do this (for example live mode not activated). */
46
+ class TiempoPermissionError extends TiempoError {
47
+ }
48
+ exports.TiempoPermissionError = TiempoPermissionError;
49
+ /** 409: the request conflicts with current state (slot taken, already cancelled, …). */
50
+ class TiempoConflictError extends TiempoError {
51
+ /** Why the time isn't available, per segment (`booking_conflict`, `session_conflicted`). Empty for other conflicts. */
52
+ get conflicts() {
53
+ return Array.isArray(this.details.conflicts) ? this.details.conflicts : [];
54
+ }
55
+ /** Occurrences a series edit couldn't place (`series_update_conflict`). */
56
+ get occurrences() {
57
+ return Array.isArray(this.details.occurrences) ? this.details.occurrences : [];
58
+ }
59
+ /** Seats still free in the session (`seats_unavailable`). */
60
+ get seatsAvailable() {
61
+ return typeof this.details.seats_available === 'number' ? this.details.seats_available : undefined;
62
+ }
63
+ }
64
+ exports.TiempoConflictError = TiempoConflictError;
65
+ /** An `Idempotency-Key` was reused with different params, or is still in flight. */
66
+ class TiempoIdempotencyError extends TiempoError {
67
+ }
68
+ exports.TiempoIdempotencyError = TiempoIdempotencyError;
69
+ /** 429: too many requests. */
70
+ class TiempoRateLimitError extends TiempoError {
71
+ }
72
+ exports.TiempoRateLimitError = TiempoRateLimitError;
73
+ /** 5xx: something went wrong on Tiempo's side. */
74
+ class TiempoAPIError extends TiempoError {
75
+ }
76
+ exports.TiempoAPIError = TiempoAPIError;
77
+ /** The request never got a response: network failure or timeout. */
78
+ class TiempoConnectionError extends TiempoError {
79
+ }
80
+ exports.TiempoConnectionError = TiempoConnectionError;
81
+ /** A webhook's `Tiempo-Signature` didn't verify. */
82
+ class TiempoSignatureVerificationError extends TiempoError {
83
+ }
84
+ exports.TiempoSignatureVerificationError = TiempoSignatureVerificationError;
85
+ const BY_TYPE = {
86
+ invalid_request_error: TiempoInvalidRequestError,
87
+ authentication_error: TiempoAuthenticationError,
88
+ permission_error: TiempoPermissionError,
89
+ conflict_error: TiempoConflictError,
90
+ idempotency_error: TiempoIdempotencyError,
91
+ rate_limit_error: TiempoRateLimitError,
92
+ api_error: TiempoAPIError,
93
+ internal_error: TiempoAPIError,
94
+ };
95
+ function byStatus(status) {
96
+ if (status === 401)
97
+ return TiempoAuthenticationError;
98
+ if (status === 403)
99
+ return TiempoPermissionError;
100
+ if (status === 409)
101
+ return TiempoConflictError;
102
+ if (status === 429)
103
+ return TiempoRateLimitError;
104
+ if (status >= 400 && status < 500)
105
+ return TiempoInvalidRequestError;
106
+ return TiempoAPIError;
107
+ }
108
+ /** Builds the right error subclass from an HTTP error response. */
109
+ function errorFromResponse(statusCode, headers, raw) {
110
+ const body = raw && typeof raw === 'object' && 'error' in raw && raw.error && typeof raw.error === 'object'
111
+ ? raw.error
112
+ : undefined;
113
+ const Cls = (body?.type && BY_TYPE[body.type]) || byStatus(statusCode);
114
+ const message = body?.message ?? (typeof raw === 'string' && raw.length > 0 && raw.length < 500 ? raw : `HTTP ${statusCode}`);
115
+ return new Cls({
116
+ message,
117
+ type: body?.type,
118
+ code: body?.code,
119
+ param: body?.param ?? undefined,
120
+ details: body ? extraFields(body) : undefined,
121
+ statusCode,
122
+ headers,
123
+ raw,
124
+ });
125
+ }
126
+ const ENVELOPE_FIELDS = new Set(['type', 'code', 'message', 'param']);
127
+ function extraFields(body) {
128
+ const out = {};
129
+ for (const [key, value] of Object.entries(body)) {
130
+ if (!ENVELOPE_FIELDS.has(key))
131
+ out[key] = value;
132
+ }
133
+ return out;
134
+ }
@@ -0,0 +1,23 @@
1
+ import { EVENT_TYPES, type EventObjectMap, type TiempoEventType } from './generated/events.js';
2
+ import type { components } from './generated/openapi.js';
3
+ export { EVENT_TYPES };
4
+ export type { EventObjectMap, TiempoEventType };
5
+ /** The object an event of type `T` carries in `data.object`. */
6
+ export type EventObject<T extends TiempoEventType> = EventObjectMap[T];
7
+ type EventEnvelope = Omit<components['schemas']['Event'], 'type' | 'data'>;
8
+ /** One event of a specific type. */
9
+ export interface TiempoEventOf<T extends TiempoEventType> extends EventEnvelope {
10
+ type: T;
11
+ data: {
12
+ /** The object the event is about, as it was just after the change. */
13
+ object: EventObject<T>;
14
+ /** On `*.updated`: the changed fields' previous values. Null otherwise. */
15
+ previous_attributes: Partial<EventObject<T>> | null;
16
+ };
17
+ }
18
+ /** Any Tiempo event. Narrow on `type` to get a typed `data.object`. */
19
+ export type TiempoEvent = {
20
+ [T in TiempoEventType]: TiempoEventOf<T>;
21
+ }[TiempoEventType];
22
+ /** True if `type` is one this SDK knows about. */
23
+ export declare function isKnownEventType(type: string): type is TiempoEventType;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVENT_TYPES = void 0;
4
+ exports.isKnownEventType = isKnownEventType;
5
+ const events_js_1 = require("./generated/events.js");
6
+ Object.defineProperty(exports, "EVENT_TYPES", { enumerable: true, get: function () { return events_js_1.EVENT_TYPES; } });
7
+ /** True if `type` is one this SDK knows about. */
8
+ function isKnownEventType(type) {
9
+ return events_js_1.EVENT_TYPES.includes(type);
10
+ }
@@ -0,0 +1,51 @@
1
+ import type { Account, Attendee, Block, Booking, Location, Resource, Schedule, ScheduleOverride, Series, SkippedOccurrence } from './types.js';
2
+ /** Every event type Tiempo sends (from the spec's Event.type). */
3
+ export declare const EVENT_TYPES: readonly ["account.created", "account.updated", "account.deleted", "location.created", "location.updated", "location.deleted", "resource.created", "resource.updated", "resource.archived", "resource.unarchived", "resource.deleted", "schedule.created", "schedule.updated", "schedule.deleted", "schedule_override.created", "schedule_override.updated", "schedule_override.deleted", "block.created", "block.updated", "block.deleted", "booking.created", "booking.confirmed", "booking.rescheduled", "booking.cancelled", "booking.expired", "booking.completed", "booking.no_show", "booking.updated", "booking.conflicted", "booking.conflict_resolved", "booking.imported", "attendee.created", "attendee.confirmed", "attendee.cancelled", "attendee.expired", "attendee.completed", "attendee.no_show", "attendee.updated", "series.created", "series.updated", "series.split", "series.cancelled", "series.ended", "series.occurrence_skipped"];
4
+ export type TiempoEventType = (typeof EVENT_TYPES)[number];
5
+ /** The object each event type carries in `data.object`. */
6
+ export interface EventObjectMap {
7
+ "account.created": Account;
8
+ "account.updated": Account;
9
+ "account.deleted": Account;
10
+ "location.created": Location;
11
+ "location.updated": Location;
12
+ "location.deleted": Location;
13
+ "resource.created": Resource;
14
+ "resource.updated": Resource;
15
+ "resource.archived": Resource;
16
+ "resource.unarchived": Resource;
17
+ "resource.deleted": Resource;
18
+ "schedule.created": Schedule;
19
+ "schedule.updated": Schedule;
20
+ "schedule.deleted": Schedule;
21
+ "schedule_override.created": ScheduleOverride;
22
+ "schedule_override.updated": ScheduleOverride;
23
+ "schedule_override.deleted": ScheduleOverride;
24
+ "block.created": Block;
25
+ "block.updated": Block;
26
+ "block.deleted": Block;
27
+ "booking.created": Booking;
28
+ "booking.confirmed": Booking;
29
+ "booking.rescheduled": Booking;
30
+ "booking.cancelled": Booking;
31
+ "booking.expired": Booking;
32
+ "booking.completed": Booking;
33
+ "booking.no_show": Booking;
34
+ "booking.updated": Booking;
35
+ "booking.conflicted": Booking;
36
+ "booking.conflict_resolved": Booking;
37
+ "booking.imported": Booking;
38
+ "attendee.created": Attendee;
39
+ "attendee.confirmed": Attendee;
40
+ "attendee.cancelled": Attendee;
41
+ "attendee.expired": Attendee;
42
+ "attendee.completed": Attendee;
43
+ "attendee.no_show": Attendee;
44
+ "attendee.updated": Attendee;
45
+ "series.created": Series;
46
+ "series.updated": Series;
47
+ "series.split": Series;
48
+ "series.cancelled": Series;
49
+ "series.ended": Series;
50
+ "series.occurrence_skipped": SkippedOccurrence;
51
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ // Code generated by scripts/generate.mjs from openapi.json. DO NOT EDIT.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.EVENT_TYPES = void 0;
5
+ /** Every event type Tiempo sends (from the spec's Event.type). */
6
+ exports.EVENT_TYPES = [
7
+ "account.created",
8
+ "account.updated",
9
+ "account.deleted",
10
+ "location.created",
11
+ "location.updated",
12
+ "location.deleted",
13
+ "resource.created",
14
+ "resource.updated",
15
+ "resource.archived",
16
+ "resource.unarchived",
17
+ "resource.deleted",
18
+ "schedule.created",
19
+ "schedule.updated",
20
+ "schedule.deleted",
21
+ "schedule_override.created",
22
+ "schedule_override.updated",
23
+ "schedule_override.deleted",
24
+ "block.created",
25
+ "block.updated",
26
+ "block.deleted",
27
+ "booking.created",
28
+ "booking.confirmed",
29
+ "booking.rescheduled",
30
+ "booking.cancelled",
31
+ "booking.expired",
32
+ "booking.completed",
33
+ "booking.no_show",
34
+ "booking.updated",
35
+ "booking.conflicted",
36
+ "booking.conflict_resolved",
37
+ "booking.imported",
38
+ "attendee.created",
39
+ "attendee.confirmed",
40
+ "attendee.cancelled",
41
+ "attendee.expired",
42
+ "attendee.completed",
43
+ "attendee.no_show",
44
+ "attendee.updated",
45
+ "series.created",
46
+ "series.updated",
47
+ "series.split",
48
+ "series.cancelled",
49
+ "series.ended",
50
+ "series.occurrence_skipped",
51
+ ];
@@ -0,0 +1,4 @@
1
+ /** The dated API version this SDK's types describe. Sent as `Tiempo-Version` on every request. */
2
+ export declare const API_VERSION = "2026-10-16";
3
+ /** This package's version. */
4
+ export declare const SDK_VERSION = "0.1.1";
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ // Code generated by scripts/generate.mjs from openapi.json. DO NOT EDIT.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SDK_VERSION = exports.API_VERSION = void 0;
5
+ /** The dated API version this SDK's types describe. Sent as `Tiempo-Version` on every request. */
6
+ exports.API_VERSION = "2026-10-16";
7
+ /** This package's version. */
8
+ exports.SDK_VERSION = "0.1.1";