@37signals/basecamp 0.2.0
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/README.md +600 -0
- package/dist/auth-strategy.d.ts +36 -0
- package/dist/auth-strategy.d.ts.map +1 -0
- package/dist/auth-strategy.js +33 -0
- package/dist/auth-strategy.js.map +1 -0
- package/dist/client.d.ts +224 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +715 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +137 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +269 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/metadata.json +2281 -0
- package/dist/generated/openapi-stripped.json +21268 -0
- package/dist/generated/path-mapping.d.ts +8 -0
- package/dist/generated/path-mapping.d.ts.map +1 -0
- package/dist/generated/path-mapping.js +192 -0
- package/dist/generated/path-mapping.js.map +1 -0
- package/dist/generated/path-mapping.ts +199 -0
- package/dist/generated/schema.d.ts +14883 -0
- package/dist/generated/services/attachments.d.ts +27 -0
- package/dist/generated/services/attachments.d.ts.map +1 -0
- package/dist/generated/services/attachments.js +49 -0
- package/dist/generated/services/attachments.js.map +1 -0
- package/dist/generated/services/attachments.ts +59 -0
- package/dist/generated/services/boosts.d.ts +114 -0
- package/dist/generated/services/boosts.d.ts.map +1 -0
- package/dist/generated/services/boosts.js +179 -0
- package/dist/generated/services/boosts.js.map +1 -0
- package/dist/generated/services/boosts.ts +250 -0
- package/dist/generated/services/campfires.d.ts +202 -0
- package/dist/generated/services/campfires.d.ts.map +1 -0
- package/dist/generated/services/campfires.js +309 -0
- package/dist/generated/services/campfires.js.map +1 -0
- package/dist/generated/services/campfires.ts +433 -0
- package/dist/generated/services/card-columns.d.ts +163 -0
- package/dist/generated/services/card-columns.d.ts.map +1 -0
- package/dist/generated/services/card-columns.js +264 -0
- package/dist/generated/services/card-columns.js.map +1 -0
- package/dist/generated/services/card-columns.ts +360 -0
- package/dist/generated/services/card-steps.d.ts +105 -0
- package/dist/generated/services/card-steps.d.ts.map +1 -0
- package/dist/generated/services/card-steps.js +148 -0
- package/dist/generated/services/card-steps.js.map +1 -0
- package/dist/generated/services/card-steps.ts +221 -0
- package/dist/generated/services/card-tables.d.ts +27 -0
- package/dist/generated/services/card-tables.d.ts.map +1 -0
- package/dist/generated/services/card-tables.js +40 -0
- package/dist/generated/services/card-tables.js.map +1 -0
- package/dist/generated/services/card-tables.ts +55 -0
- package/dist/generated/services/cards.d.ts +118 -0
- package/dist/generated/services/cards.d.ts.map +1 -0
- package/dist/generated/services/cards.js +166 -0
- package/dist/generated/services/cards.js.map +1 -0
- package/dist/generated/services/cards.ts +247 -0
- package/dist/generated/services/checkins.d.ts +278 -0
- package/dist/generated/services/checkins.d.ts.map +1 -0
- package/dist/generated/services/checkins.js +420 -0
- package/dist/generated/services/checkins.js.map +1 -0
- package/dist/generated/services/checkins.ts +600 -0
- package/dist/generated/services/client-approvals.d.ts +45 -0
- package/dist/generated/services/client-approvals.d.ts.map +1 -0
- package/dist/generated/services/client-approvals.js +58 -0
- package/dist/generated/services/client-approvals.js.map +1 -0
- package/dist/generated/services/client-approvals.ts +89 -0
- package/dist/generated/services/client-correspondences.d.ts +45 -0
- package/dist/generated/services/client-correspondences.d.ts.map +1 -0
- package/dist/generated/services/client-correspondences.js +58 -0
- package/dist/generated/services/client-correspondences.js.map +1 -0
- package/dist/generated/services/client-correspondences.ts +89 -0
- package/dist/generated/services/client-replies.d.ts +47 -0
- package/dist/generated/services/client-replies.d.ts.map +1 -0
- package/dist/generated/services/client-replies.js +65 -0
- package/dist/generated/services/client-replies.js.map +1 -0
- package/dist/generated/services/client-replies.ts +95 -0
- package/dist/generated/services/client-visibility.d.ts +35 -0
- package/dist/generated/services/client-visibility.d.ts.map +1 -0
- package/dist/generated/services/client-visibility.js +44 -0
- package/dist/generated/services/client-visibility.js.map +1 -0
- package/dist/generated/services/client-visibility.ts +68 -0
- package/dist/generated/services/comments.d.ts +86 -0
- package/dist/generated/services/comments.d.ts.map +1 -0
- package/dist/generated/services/comments.js +129 -0
- package/dist/generated/services/comments.js.map +1 -0
- package/dist/generated/services/comments.ts +185 -0
- package/dist/generated/services/documents.d.ts +92 -0
- package/dist/generated/services/documents.d.ts.map +1 -0
- package/dist/generated/services/documents.js +129 -0
- package/dist/generated/services/documents.js.map +1 -0
- package/dist/generated/services/documents.ts +191 -0
- package/dist/generated/services/events.d.ts +34 -0
- package/dist/generated/services/events.d.ts.map +1 -0
- package/dist/generated/services/events.js +39 -0
- package/dist/generated/services/events.js.map +1 -0
- package/dist/generated/services/events.ts +64 -0
- package/dist/generated/services/forwards.d.ts +112 -0
- package/dist/generated/services/forwards.d.ts.map +1 -0
- package/dist/generated/services/forwards.js +172 -0
- package/dist/generated/services/forwards.js.map +1 -0
- package/dist/generated/services/forwards.ts +241 -0
- package/dist/generated/services/index.d.ts +39 -0
- package/dist/generated/services/index.d.ts.map +1 -0
- package/dist/generated/services/index.js +39 -0
- package/dist/generated/services/index.js.map +1 -0
- package/dist/generated/services/index.ts +38 -0
- package/dist/generated/services/lineup.d.ts +67 -0
- package/dist/generated/services/lineup.d.ts.map +1 -0
- package/dist/generated/services/lineup.js +99 -0
- package/dist/generated/services/lineup.js.map +1 -0
- package/dist/generated/services/lineup.ts +143 -0
- package/dist/generated/services/message-boards.d.ts +27 -0
- package/dist/generated/services/message-boards.d.ts.map +1 -0
- package/dist/generated/services/message-boards.js +40 -0
- package/dist/generated/services/message-boards.js.map +1 -0
- package/dist/generated/services/message-boards.ts +55 -0
- package/dist/generated/services/message-types.d.ts +100 -0
- package/dist/generated/services/message-types.d.ts.map +1 -0
- package/dist/generated/services/message-types.js +144 -0
- package/dist/generated/services/message-types.js.map +1 -0
- package/dist/generated/services/message-types.ts +210 -0
- package/dist/generated/services/messages.d.ts +122 -0
- package/dist/generated/services/messages.d.ts.map +1 -0
- package/dist/generated/services/messages.js +180 -0
- package/dist/generated/services/messages.js.map +1 -0
- package/dist/generated/services/messages.ts +258 -0
- package/dist/generated/services/people.d.ts +122 -0
- package/dist/generated/services/people.d.ts.map +1 -0
- package/dist/generated/services/people.js +167 -0
- package/dist/generated/services/people.js.map +1 -0
- package/dist/generated/services/people.ts +252 -0
- package/dist/generated/services/projects.d.ts +109 -0
- package/dist/generated/services/projects.d.ts.map +1 -0
- package/dist/generated/services/projects.js +153 -0
- package/dist/generated/services/projects.js.map +1 -0
- package/dist/generated/services/projects.ts +224 -0
- package/dist/generated/services/recordings.d.ts +93 -0
- package/dist/generated/services/recordings.d.ts.map +1 -0
- package/dist/generated/services/recordings.js +138 -0
- package/dist/generated/services/recordings.js.map +1 -0
- package/dist/generated/services/recordings.ts +191 -0
- package/dist/generated/services/reports.d.ts +90 -0
- package/dist/generated/services/reports.d.ts.map +1 -0
- package/dist/generated/services/reports.js +124 -0
- package/dist/generated/services/reports.js.map +1 -0
- package/dist/generated/services/reports.ts +187 -0
- package/dist/generated/services/schedules.d.ts +162 -0
- package/dist/generated/services/schedules.d.ts.map +1 -0
- package/dist/generated/services/schedules.js +228 -0
- package/dist/generated/services/schedules.js.map +1 -0
- package/dist/generated/services/schedules.ts +335 -0
- package/dist/generated/services/search.d.ts +45 -0
- package/dist/generated/services/search.d.ts.map +1 -0
- package/dist/generated/services/search.js +56 -0
- package/dist/generated/services/search.js.map +1 -0
- package/dist/generated/services/search.ts +89 -0
- package/dist/generated/services/subscriptions.d.ts +73 -0
- package/dist/generated/services/subscriptions.d.ts.map +1 -0
- package/dist/generated/services/subscriptions.js +119 -0
- package/dist/generated/services/subscriptions.js.map +1 -0
- package/dist/generated/services/subscriptions.ts +160 -0
- package/dist/generated/services/templates.d.ts +140 -0
- package/dist/generated/services/templates.d.ts.map +1 -0
- package/dist/generated/services/templates.js +207 -0
- package/dist/generated/services/templates.js.map +1 -0
- package/dist/generated/services/templates.ts +294 -0
- package/dist/generated/services/timeline.d.ts +31 -0
- package/dist/generated/services/timeline.d.ts.map +1 -0
- package/dist/generated/services/timeline.js +39 -0
- package/dist/generated/services/timeline.js.map +1 -0
- package/dist/generated/services/timeline.ts +62 -0
- package/dist/generated/services/timesheets.d.ts +145 -0
- package/dist/generated/services/timesheets.d.ts.map +1 -0
- package/dist/generated/services/timesheets.js +186 -0
- package/dist/generated/services/timesheets.js.map +1 -0
- package/dist/generated/services/timesheets.ts +289 -0
- package/dist/generated/services/todolist-groups.d.ts +74 -0
- package/dist/generated/services/todolist-groups.d.ts.map +1 -0
- package/dist/generated/services/todolist-groups.js +100 -0
- package/dist/generated/services/todolist-groups.js.map +1 -0
- package/dist/generated/services/todolist-groups.ts +151 -0
- package/dist/generated/services/todolists.d.ts +95 -0
- package/dist/generated/services/todolists.d.ts.map +1 -0
- package/dist/generated/services/todolists.js +130 -0
- package/dist/generated/services/todolists.js.map +1 -0
- package/dist/generated/services/todolists.ts +192 -0
- package/dist/generated/services/todos.d.ts +175 -0
- package/dist/generated/services/todos.d.ts.map +1 -0
- package/dist/generated/services/todos.js +255 -0
- package/dist/generated/services/todos.js.map +1 -0
- package/dist/generated/services/todos.ts +369 -0
- package/dist/generated/services/todosets.d.ts +27 -0
- package/dist/generated/services/todosets.d.ts.map +1 -0
- package/dist/generated/services/todosets.js +40 -0
- package/dist/generated/services/todosets.js.map +1 -0
- package/dist/generated/services/todosets.ts +55 -0
- package/dist/generated/services/tools.d.ts +122 -0
- package/dist/generated/services/tools.d.ts.map +1 -0
- package/dist/generated/services/tools.js +197 -0
- package/dist/generated/services/tools.js.map +1 -0
- package/dist/generated/services/tools.ts +267 -0
- package/dist/generated/services/uploads.d.ts +109 -0
- package/dist/generated/services/uploads.d.ts.map +1 -0
- package/dist/generated/services/uploads.js +153 -0
- package/dist/generated/services/uploads.js.map +1 -0
- package/dist/generated/services/uploads.ts +227 -0
- package/dist/generated/services/vaults.d.ts +86 -0
- package/dist/generated/services/vaults.d.ts.map +1 -0
- package/dist/generated/services/vaults.js +126 -0
- package/dist/generated/services/vaults.js.map +1 -0
- package/dist/generated/services/vaults.ts +182 -0
- package/dist/generated/services/webhooks.d.ts +106 -0
- package/dist/generated/services/webhooks.d.ts.map +1 -0
- package/dist/generated/services/webhooks.js +157 -0
- package/dist/generated/services/webhooks.js.map +1 -0
- package/dist/generated/services/webhooks.ts +226 -0
- package/dist/hooks/otel.d.ts +136 -0
- package/dist/hooks/otel.d.ts.map +1 -0
- package/dist/hooks/otel.js +240 -0
- package/dist/hooks/otel.js.map +1 -0
- package/dist/hooks.d.ts +171 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +196 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth/authorize.d.ts +48 -0
- package/dist/oauth/authorize.d.ts.map +1 -0
- package/dist/oauth/authorize.js +56 -0
- package/dist/oauth/authorize.js.map +1 -0
- package/dist/oauth/callback-server.d.ts +56 -0
- package/dist/oauth/callback-server.d.ts.map +1 -0
- package/dist/oauth/callback-server.js +150 -0
- package/dist/oauth/callback-server.js.map +1 -0
- package/dist/oauth/discovery.d.ts +54 -0
- package/dist/oauth/discovery.d.ts.map +1 -0
- package/dist/oauth/discovery.js +116 -0
- package/dist/oauth/discovery.js.map +1 -0
- package/dist/oauth/exchange.d.ts +96 -0
- package/dist/oauth/exchange.d.ts.map +1 -0
- package/dist/oauth/exchange.js +324 -0
- package/dist/oauth/exchange.js.map +1 -0
- package/dist/oauth/identity.d.ts +30 -0
- package/dist/oauth/identity.d.ts.map +1 -0
- package/dist/oauth/identity.js +82 -0
- package/dist/oauth/identity.js.map +1 -0
- package/dist/oauth/index.d.ts +50 -0
- package/dist/oauth/index.d.ts.map +1 -0
- package/dist/oauth/index.js +58 -0
- package/dist/oauth/index.js.map +1 -0
- package/dist/oauth/interactive-login.d.ts +62 -0
- package/dist/oauth/interactive-login.d.ts.map +1 -0
- package/dist/oauth/interactive-login.js +106 -0
- package/dist/oauth/interactive-login.js.map +1 -0
- package/dist/oauth/pkce.d.ts +68 -0
- package/dist/oauth/pkce.d.ts.map +1 -0
- package/dist/oauth/pkce.js +80 -0
- package/dist/oauth/pkce.js.map +1 -0
- package/dist/oauth/token-manager.d.ts +92 -0
- package/dist/oauth/token-manager.d.ts.map +1 -0
- package/dist/oauth/token-manager.js +126 -0
- package/dist/oauth/token-manager.js.map +1 -0
- package/dist/oauth/token-store.d.ts +45 -0
- package/dist/oauth/token-store.d.ts.map +1 -0
- package/dist/oauth/token-store.js +105 -0
- package/dist/oauth/token-store.js.map +1 -0
- package/dist/oauth/types.d.ts +98 -0
- package/dist/oauth/types.d.ts.map +1 -0
- package/dist/oauth/types.js +8 -0
- package/dist/oauth/types.js.map +1 -0
- package/dist/pagination-utils.d.ts +27 -0
- package/dist/pagination-utils.d.ts.map +1 -0
- package/dist/pagination-utils.js +54 -0
- package/dist/pagination-utils.js.map +1 -0
- package/dist/pagination.d.ts +56 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +57 -0
- package/dist/pagination.js.map +1 -0
- package/dist/security.d.ts +68 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +107 -0
- package/dist/security.js.map +1 -0
- package/dist/services/authorization.d.ts +124 -0
- package/dist/services/authorization.d.ts.map +1 -0
- package/dist/services/authorization.js +117 -0
- package/dist/services/authorization.js.map +1 -0
- package/dist/services/base.d.ts +102 -0
- package/dist/services/base.d.ts.map +1 -0
- package/dist/services/base.js +230 -0
- package/dist/services/base.js.map +1 -0
- package/dist/webhooks/adapters/node-http.d.ts +14 -0
- package/dist/webhooks/adapters/node-http.d.ts.map +1 -0
- package/dist/webhooks/adapters/node-http.js +60 -0
- package/dist/webhooks/adapters/node-http.js.map +1 -0
- package/dist/webhooks/events.d.ts +52 -0
- package/dist/webhooks/events.d.ts.map +1 -0
- package/dist/webhooks/events.js +52 -0
- package/dist/webhooks/events.js.map +1 -0
- package/dist/webhooks/handler.d.ts +62 -0
- package/dist/webhooks/handler.d.ts.map +1 -0
- package/dist/webhooks/handler.js +226 -0
- package/dist/webhooks/handler.js.map +1 -0
- package/dist/webhooks/index.d.ts +5 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +5 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/verify.d.ts +11 -0
- package/dist/webhooks/verify.d.ts.map +1 -0
- package/dist/webhooks/verify.js +25 -0
- package/dist/webhooks/verify.js.map +1 -0
- package/package.json +70 -0
- package/src/generated/metadata.json +2281 -0
- package/src/generated/openapi-stripped.json +21268 -0
- package/src/generated/path-mapping.ts +199 -0
- package/src/generated/schema.d.ts +14883 -0
- package/src/generated/services/attachments.ts +59 -0
- package/src/generated/services/boosts.ts +250 -0
- package/src/generated/services/campfires.ts +433 -0
- package/src/generated/services/card-columns.ts +360 -0
- package/src/generated/services/card-steps.ts +221 -0
- package/src/generated/services/card-tables.ts +55 -0
- package/src/generated/services/cards.ts +247 -0
- package/src/generated/services/checkins.ts +600 -0
- package/src/generated/services/client-approvals.ts +89 -0
- package/src/generated/services/client-correspondences.ts +89 -0
- package/src/generated/services/client-replies.ts +95 -0
- package/src/generated/services/client-visibility.ts +68 -0
- package/src/generated/services/comments.ts +185 -0
- package/src/generated/services/documents.ts +191 -0
- package/src/generated/services/events.ts +64 -0
- package/src/generated/services/forwards.ts +241 -0
- package/src/generated/services/index.ts +38 -0
- package/src/generated/services/lineup.ts +143 -0
- package/src/generated/services/message-boards.ts +55 -0
- package/src/generated/services/message-types.ts +210 -0
- package/src/generated/services/messages.ts +258 -0
- package/src/generated/services/people.ts +252 -0
- package/src/generated/services/projects.ts +224 -0
- package/src/generated/services/recordings.ts +191 -0
- package/src/generated/services/reports.ts +187 -0
- package/src/generated/services/schedules.ts +335 -0
- package/src/generated/services/search.ts +89 -0
- package/src/generated/services/subscriptions.ts +160 -0
- package/src/generated/services/templates.ts +294 -0
- package/src/generated/services/timeline.ts +62 -0
- package/src/generated/services/timesheets.ts +289 -0
- package/src/generated/services/todolist-groups.ts +151 -0
- package/src/generated/services/todolists.ts +192 -0
- package/src/generated/services/todos.ts +369 -0
- package/src/generated/services/todosets.ts +55 -0
- package/src/generated/services/tools.ts +267 -0
- package/src/generated/services/uploads.ts +227 -0
- package/src/generated/services/vaults.ts +182 -0
- package/src/generated/services/webhooks.ts +226 -0
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability hooks system for the Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides a way to observe API operations and HTTP requests
|
|
5
|
+
* without modifying the core client logic. Hooks compile away
|
|
6
|
+
* when unused (no overhead).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { createBasecampClient, consoleHooks } from "@37signals/basecamp";
|
|
11
|
+
*
|
|
12
|
+
* // Simple console logging
|
|
13
|
+
* const client = createBasecampClient({
|
|
14
|
+
* accountId: "12345",
|
|
15
|
+
* accessToken: "token",
|
|
16
|
+
* hooks: consoleHooks(),
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Custom metrics
|
|
20
|
+
* const client = createBasecampClient({
|
|
21
|
+
* accountId: "12345",
|
|
22
|
+
* accessToken: "token",
|
|
23
|
+
* hooks: {
|
|
24
|
+
* onOperationEnd: (info, result) => {
|
|
25
|
+
* metrics.recordLatency(info.service, info.operation, result.durationMs);
|
|
26
|
+
* if (result.error) {
|
|
27
|
+
* metrics.recordError(info.service, info.operation);
|
|
28
|
+
* }
|
|
29
|
+
* },
|
|
30
|
+
* },
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Combines multiple hooks into a single hooks object.
|
|
36
|
+
* All hooks are called in order. Errors in hooks are caught and logged.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* const hooks = chainHooks(
|
|
41
|
+
* consoleHooks(),
|
|
42
|
+
* metricsHooks(),
|
|
43
|
+
* sentryHooks(),
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function chainHooks(...hooks) {
|
|
48
|
+
// Filter out undefined/null hooks
|
|
49
|
+
const activeHooks = hooks.filter(Boolean);
|
|
50
|
+
if (activeHooks.length === 0) {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
if (activeHooks.length === 1) {
|
|
54
|
+
return activeHooks[0];
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
onOperationStart: (info) => {
|
|
58
|
+
for (const h of activeHooks) {
|
|
59
|
+
try {
|
|
60
|
+
h.onOperationStart?.(info);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.error("Hook onOperationStart error:", err);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
onOperationEnd: (info, result) => {
|
|
68
|
+
for (const h of activeHooks) {
|
|
69
|
+
try {
|
|
70
|
+
h.onOperationEnd?.(info, result);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
console.error("Hook onOperationEnd error:", err);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
onRequestStart: (info) => {
|
|
78
|
+
for (const h of activeHooks) {
|
|
79
|
+
try {
|
|
80
|
+
h.onRequestStart?.(info);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error("Hook onRequestStart error:", err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
onRequestEnd: (info, result) => {
|
|
88
|
+
for (const h of activeHooks) {
|
|
89
|
+
try {
|
|
90
|
+
h.onRequestEnd?.(info, result);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
console.error("Hook onRequestEnd error:", err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
onRetry: (info, attempt, error, delayMs) => {
|
|
98
|
+
for (const h of activeHooks) {
|
|
99
|
+
try {
|
|
100
|
+
h.onRetry?.(info, attempt, error, delayMs);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.error("Hook onRetry error:", err);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Creates hooks that log to the console.
|
|
111
|
+
* Useful for debugging and development.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* // Basic usage
|
|
116
|
+
* const hooks = consoleHooks();
|
|
117
|
+
*
|
|
118
|
+
* // With custom options
|
|
119
|
+
* const hooks = consoleHooks({
|
|
120
|
+
* logRequests: true,
|
|
121
|
+
* minDurationMs: 100,
|
|
122
|
+
* });
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
export function consoleHooks(options = {}) {
|
|
126
|
+
const { logOperations = true, logRequests = false, logRetries = true, minDurationMs = 0, logger = console, } = options;
|
|
127
|
+
return {
|
|
128
|
+
onOperationStart: logOperations
|
|
129
|
+
? (info) => {
|
|
130
|
+
const mutation = info.isMutation ? " [mutation]" : "";
|
|
131
|
+
const resource = info.resourceId ? ` #${info.resourceId}` : "";
|
|
132
|
+
const project = info.projectId ? ` (project: ${info.projectId})` : "";
|
|
133
|
+
logger.log(`[Basecamp] ${info.service}.${info.operation}${resource}${project}${mutation}`);
|
|
134
|
+
}
|
|
135
|
+
: undefined,
|
|
136
|
+
onOperationEnd: logOperations
|
|
137
|
+
? (info, result) => {
|
|
138
|
+
if (result.durationMs < minDurationMs)
|
|
139
|
+
return;
|
|
140
|
+
const duration = `${result.durationMs}ms`;
|
|
141
|
+
if (result.error) {
|
|
142
|
+
logger.error(`[Basecamp] ${info.service}.${info.operation} failed (${duration}):`, result.error.message);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
logger.log(`[Basecamp] ${info.service}.${info.operation} completed (${duration})`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
: undefined,
|
|
149
|
+
onRequestStart: logRequests
|
|
150
|
+
? (info) => {
|
|
151
|
+
const retry = info.attempt > 1 ? ` (attempt ${info.attempt})` : "";
|
|
152
|
+
logger.log(`[Basecamp] -> ${info.method} ${info.url}${retry}`);
|
|
153
|
+
}
|
|
154
|
+
: undefined,
|
|
155
|
+
onRequestEnd: logRequests
|
|
156
|
+
? (info, result) => {
|
|
157
|
+
if (result.durationMs < minDurationMs)
|
|
158
|
+
return;
|
|
159
|
+
const cache = result.fromCache ? " (cached)" : "";
|
|
160
|
+
const status = result.error ? "error" : result.statusCode;
|
|
161
|
+
logger.log(`[Basecamp] <- ${info.method} ${info.url} ${status} (${result.durationMs}ms)${cache}`);
|
|
162
|
+
}
|
|
163
|
+
: undefined,
|
|
164
|
+
onRetry: logRetries
|
|
165
|
+
? (info, attempt, error, delayMs) => {
|
|
166
|
+
logger.warn(`[Basecamp] Retrying ${info.method} ${info.url} (attempt ${attempt + 1}, waiting ${delayMs}ms): ${error.message}`);
|
|
167
|
+
}
|
|
168
|
+
: undefined,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Creates a no-op hooks object.
|
|
173
|
+
* Useful as a default when hooks are optional.
|
|
174
|
+
*/
|
|
175
|
+
export function noopHooks() {
|
|
176
|
+
return {};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Internal helper to safely invoke a hook.
|
|
180
|
+
* Returns silently if the hook throws.
|
|
181
|
+
*/
|
|
182
|
+
export function safeInvoke(hooks, hookName, ...args) {
|
|
183
|
+
if (!hooks)
|
|
184
|
+
return;
|
|
185
|
+
const hook = hooks[hookName];
|
|
186
|
+
if (!hook)
|
|
187
|
+
return;
|
|
188
|
+
try {
|
|
189
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
190
|
+
hook(...args);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
console.error(`Hook ${hookName} error:`, err);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basecamp TypeScript SDK
|
|
3
|
+
*
|
|
4
|
+
* Type-safe client for the Basecamp 3 API.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { createBasecampClient } from "@37signals/basecamp";
|
|
9
|
+
*
|
|
10
|
+
* const client = createBasecampClient({
|
|
11
|
+
* accountId: "12345",
|
|
12
|
+
* accessToken: process.env.BASECAMP_TOKEN!,
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* // High-level service methods
|
|
16
|
+
* const projects = await client.projects.list();
|
|
17
|
+
* const todo = await client.todos.create(projectId, todolistId, {
|
|
18
|
+
* content: "Ship the feature",
|
|
19
|
+
* assigneeIds: [userId],
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Or use low-level typed API calls
|
|
23
|
+
* const { data, error } = await client.GET("/projects.json");
|
|
24
|
+
*
|
|
25
|
+
* if (data) {
|
|
26
|
+
* console.log(data.map(p => p.name));
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @packageDocumentation
|
|
31
|
+
*/
|
|
32
|
+
export { createBasecampClient, type BasecampClient, type BasecampClientOptions, type TokenProvider, type RawClient, } from "./client.js";
|
|
33
|
+
export { type AuthStrategy, BearerAuth, bearerAuth } from "./auth-strategy.js";
|
|
34
|
+
export { fetchAllPages, paginateAll } from "./client.js";
|
|
35
|
+
export { ListResult, parseTotalCount, type ListMeta, type PaginationOptions } from "./pagination.js";
|
|
36
|
+
export { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
|
|
37
|
+
export { BasecampError, Errors, errorFromResponse, isBasecampError, isErrorCode, type ErrorCode, type BasecampErrorOptions, } from "./errors.js";
|
|
38
|
+
export { chainHooks, consoleHooks, noopHooks, safeInvoke, type BasecampHooks, type OperationInfo, type RequestInfo, type RequestResult, type OperationResult, type ConsoleHooksOptions, } from "./hooks.js";
|
|
39
|
+
export { BaseService, type FetchResponse } from "./services/base.js";
|
|
40
|
+
export { AuthorizationService, type Identity, type AuthorizedAccount, type AuthorizationInfo, type GetAuthorizationInfoOptions, } from "./services/authorization.js";
|
|
41
|
+
export { ProjectsService, type Project, type ListProjectOptions, type CreateProjectRequest, type UpdateProjectRequest, } from "./generated/services/projects.js";
|
|
42
|
+
export { TodosService, type Todo, type ListTodoOptions, type CreateTodoRequest, type UpdateTodoRequest, type RepositionTodoRequest, } from "./generated/services/todos.js";
|
|
43
|
+
export { TodolistsService, type Todolist, type ListTodolistOptions, type CreateTodolistRequest, type UpdateTodolistRequest, } from "./generated/services/todolists.js";
|
|
44
|
+
export { TodosetsService, type Todoset, } from "./generated/services/todosets.js";
|
|
45
|
+
export { PeopleService, type Person, type UpdateProjectAccessPeopleRequest, } from "./generated/services/people.js";
|
|
46
|
+
export { MessagesService, type Message, type CreateMessageRequest, type UpdateMessageRequest, } from "./generated/services/messages.js";
|
|
47
|
+
export { CommentsService, type Comment, type CreateCommentRequest, type UpdateCommentRequest, } from "./generated/services/comments.js";
|
|
48
|
+
export { CampfiresService, type Campfire, type CampfireLine, type Chatbot, type CreateChatbotCampfireRequest, type UpdateChatbotCampfireRequest, type CreateLineCampfireRequest, } from "./generated/services/campfires.js";
|
|
49
|
+
export { CardTablesService, type CardTable, } from "./generated/services/card-tables.js";
|
|
50
|
+
export { CardsService, type Card, type CreateCardRequest, type UpdateCardRequest, type MoveCardRequest, } from "./generated/services/cards.js";
|
|
51
|
+
export { CardColumnsService, type CardColumn, type CreateCardColumnRequest, type UpdateCardColumnRequest, type MoveCardColumnRequest, type SetColorCardColumnRequest, } from "./generated/services/card-columns.js";
|
|
52
|
+
export { CardStepsService, type CardStep, type CreateCardStepRequest, type UpdateCardStepRequest, } from "./generated/services/card-steps.js";
|
|
53
|
+
export { MessageBoardsService, type MessageBoard, } from "./generated/services/message-boards.js";
|
|
54
|
+
export { MessageTypesService, type MessageType, type CreateMessageTypeRequest, type UpdateMessageTypeRequest, } from "./generated/services/message-types.js";
|
|
55
|
+
export { ForwardsService, type Inbox, type Forward, type ForwardReply, type CreateReplyForwardRequest, } from "./generated/services/forwards.js";
|
|
56
|
+
export { CheckinsService, type Questionnaire, type Question, type Answer, type CreateQuestionCheckinRequest, type UpdateQuestionCheckinRequest, type CreateAnswerCheckinRequest, type UpdateAnswerCheckinRequest, type UpdateNotificationSettingsCheckinRequest, } from "./generated/services/checkins.js";
|
|
57
|
+
export { ClientApprovalsService, type ClientApproval, } from "./generated/services/client-approvals.js";
|
|
58
|
+
export { ClientCorrespondencesService, type ClientCorrespondence, } from "./generated/services/client-correspondences.js";
|
|
59
|
+
export { ClientRepliesService, type ClientReply, } from "./generated/services/client-replies.js";
|
|
60
|
+
export { ClientVisibilityService, } from "./generated/services/client-visibility.js";
|
|
61
|
+
export { WebhooksService, type Webhook, type CreateWebhookRequest, type UpdateWebhookRequest, } from "./generated/services/webhooks.js";
|
|
62
|
+
export { WebhookReceiver, WebhookVerificationError, type WebhookEventHandler, type WebhookMiddleware, type WebhookReceiverOptions, type HeaderAccessor, } from "./webhooks/handler.js";
|
|
63
|
+
export { verifyWebhookSignature, signWebhookPayload } from "./webhooks/verify.js";
|
|
64
|
+
export { parseEventKind, WebhookEventKind, type WebhookEvent, type WebhookDelivery, type WebhookDeliveryRequest, type WebhookDeliveryResponse, type WebhookCopy, } from "./webhooks/events.js";
|
|
65
|
+
export { createNodeHandler, type NodeHandlerOptions } from "./webhooks/adapters/node-http.js";
|
|
66
|
+
export { SubscriptionsService, type Subscription, type UpdateSubscriptionRequest, } from "./generated/services/subscriptions.js";
|
|
67
|
+
export { EventsService, type Event, } from "./generated/services/events.js";
|
|
68
|
+
export { AttachmentsService, } from "./generated/services/attachments.js";
|
|
69
|
+
export { VaultsService, type Vault, type CreateVaultRequest, type UpdateVaultRequest, } from "./generated/services/vaults.js";
|
|
70
|
+
export { DocumentsService, type Document, type CreateDocumentRequest, type UpdateDocumentRequest, } from "./generated/services/documents.js";
|
|
71
|
+
export { UploadsService, type Upload, type CreateUploadRequest, type UpdateUploadRequest, } from "./generated/services/uploads.js";
|
|
72
|
+
export { SchedulesService, type Schedule, type ScheduleEntry, type CreateEntryScheduleRequest, type UpdateEntryScheduleRequest, type UpdateSettingsScheduleRequest, type ListEntriesScheduleOptions, } from "./generated/services/schedules.js";
|
|
73
|
+
export { TimesheetsService, type ForRecordingTimesheetOptions, type ForProjectTimesheetOptions, type ReportTimesheetOptions, } from "./generated/services/timesheets.js";
|
|
74
|
+
export { TimelineService, } from "./generated/services/timeline.js";
|
|
75
|
+
export { SearchService, type SearchSearchOptions, } from "./generated/services/search.js";
|
|
76
|
+
export { ReportsService, } from "./generated/services/reports.js";
|
|
77
|
+
export { RecordingsService, type Recording, type ListRecordingOptions, } from "./generated/services/recordings.js";
|
|
78
|
+
export { TemplatesService, type Template, type ListTemplateOptions, type CreateTemplateRequest, type UpdateTemplateRequest, type CreateProjectTemplateRequest, } from "./generated/services/templates.js";
|
|
79
|
+
export { LineupService, type CreateLineupRequest, type UpdateLineupRequest, } from "./generated/services/lineup.js";
|
|
80
|
+
export { TodolistGroupsService, type TodolistGroup, type CreateTodolistGroupRequest, } from "./generated/services/todolist-groups.js";
|
|
81
|
+
export { ToolsService, type Tool, } from "./generated/services/tools.js";
|
|
82
|
+
export { BoostsService, type ListForRecordingBoostOptions, type CreateForRecordingBoostRequest, type ListForEventBoostOptions, type CreateForEventBoostRequest, } from "./generated/services/boosts.js";
|
|
83
|
+
export { otelHooks, type OtelHooksOptions, } from "./hooks/otel.js";
|
|
84
|
+
export type { OAuthConfig, OAuthToken, ExchangeRequest, RefreshRequest, RawTokenResponse, OAuthErrorResponse, } from "./oauth/types.js";
|
|
85
|
+
export { discover, discoverLaunchpad, LAUNCHPAD_BASE_URL, type DiscoverOptions, } from "./oauth/discovery.js";
|
|
86
|
+
export { exchangeCode, refreshToken, isTokenExpired, type TokenOptions, } from "./oauth/exchange.js";
|
|
87
|
+
export { generatePKCE, generateState, type PKCE, } from "./oauth/pkce.js";
|
|
88
|
+
export { redactHeaders, redactHeadersRecord, } from "./security.js";
|
|
89
|
+
export type { paths } from "./generated/schema.js";
|
|
90
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basecamp TypeScript SDK
|
|
3
|
+
*
|
|
4
|
+
* Type-safe client for the Basecamp 3 API.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { createBasecampClient } from "@37signals/basecamp";
|
|
9
|
+
*
|
|
10
|
+
* const client = createBasecampClient({
|
|
11
|
+
* accountId: "12345",
|
|
12
|
+
* accessToken: process.env.BASECAMP_TOKEN!,
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* // High-level service methods
|
|
16
|
+
* const projects = await client.projects.list();
|
|
17
|
+
* const todo = await client.todos.create(projectId, todolistId, {
|
|
18
|
+
* content: "Ship the feature",
|
|
19
|
+
* assigneeIds: [userId],
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Or use low-level typed API calls
|
|
23
|
+
* const { data, error } = await client.GET("/projects.json");
|
|
24
|
+
*
|
|
25
|
+
* if (data) {
|
|
26
|
+
* console.log(data.map(p => p.name));
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @packageDocumentation
|
|
31
|
+
*/
|
|
32
|
+
// Main client factory
|
|
33
|
+
export { createBasecampClient, } from "./client.js";
|
|
34
|
+
// Authentication strategies
|
|
35
|
+
export { BearerAuth, bearerAuth } from "./auth-strategy.js";
|
|
36
|
+
// Pagination helpers
|
|
37
|
+
export { fetchAllPages, paginateAll } from "./client.js";
|
|
38
|
+
// Pagination types and utilities
|
|
39
|
+
export { ListResult, parseTotalCount } from "./pagination.js";
|
|
40
|
+
export { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
|
|
41
|
+
// Errors
|
|
42
|
+
export { BasecampError, Errors, errorFromResponse, isBasecampError, isErrorCode, } from "./errors.js";
|
|
43
|
+
// Hooks
|
|
44
|
+
export { chainHooks, consoleHooks, noopHooks, safeInvoke, } from "./hooks.js";
|
|
45
|
+
// =============================================================================
|
|
46
|
+
// Services - Generated from OpenAPI spec (spec-driven)
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Base service (for extending) - hand-written infrastructure
|
|
49
|
+
export { BaseService } from "./services/base.js";
|
|
50
|
+
// Authorization service - hand-written (OAuth flows not in OpenAPI spec)
|
|
51
|
+
export { AuthorizationService, } from "./services/authorization.js";
|
|
52
|
+
// Core services - generated
|
|
53
|
+
export { ProjectsService, } from "./generated/services/projects.js";
|
|
54
|
+
export { TodosService, } from "./generated/services/todos.js";
|
|
55
|
+
export { TodolistsService, } from "./generated/services/todolists.js";
|
|
56
|
+
export { TodosetsService, } from "./generated/services/todosets.js";
|
|
57
|
+
export { PeopleService, } from "./generated/services/people.js";
|
|
58
|
+
// Communication services - generated
|
|
59
|
+
export { MessagesService, } from "./generated/services/messages.js";
|
|
60
|
+
export { CommentsService, } from "./generated/services/comments.js";
|
|
61
|
+
export { CampfiresService, } from "./generated/services/campfires.js";
|
|
62
|
+
// Card services (kanban boards) - generated
|
|
63
|
+
export { CardTablesService, } from "./generated/services/card-tables.js";
|
|
64
|
+
export { CardsService, } from "./generated/services/cards.js";
|
|
65
|
+
export { CardColumnsService, } from "./generated/services/card-columns.js";
|
|
66
|
+
export { CardStepsService, } from "./generated/services/card-steps.js";
|
|
67
|
+
// Message services - generated
|
|
68
|
+
export { MessageBoardsService, } from "./generated/services/message-boards.js";
|
|
69
|
+
export { MessageTypesService, } from "./generated/services/message-types.js";
|
|
70
|
+
// Forwards service - generated
|
|
71
|
+
export { ForwardsService, } from "./generated/services/forwards.js";
|
|
72
|
+
// Checkins service - generated
|
|
73
|
+
export { CheckinsService, } from "./generated/services/checkins.js";
|
|
74
|
+
// Client Portal services - generated
|
|
75
|
+
export { ClientApprovalsService, } from "./generated/services/client-approvals.js";
|
|
76
|
+
export { ClientCorrespondencesService, } from "./generated/services/client-correspondences.js";
|
|
77
|
+
export { ClientRepliesService, } from "./generated/services/client-replies.js";
|
|
78
|
+
export { ClientVisibilityService, } from "./generated/services/client-visibility.js";
|
|
79
|
+
// Automation services - generated
|
|
80
|
+
export { WebhooksService, } from "./generated/services/webhooks.js";
|
|
81
|
+
// Webhook Receiving Infrastructure (hand-written, uses generated types)
|
|
82
|
+
export { WebhookReceiver, WebhookVerificationError, } from "./webhooks/handler.js";
|
|
83
|
+
export { verifyWebhookSignature, signWebhookPayload } from "./webhooks/verify.js";
|
|
84
|
+
export { parseEventKind, WebhookEventKind, } from "./webhooks/events.js";
|
|
85
|
+
export { createNodeHandler } from "./webhooks/adapters/node-http.js";
|
|
86
|
+
export { SubscriptionsService, } from "./generated/services/subscriptions.js";
|
|
87
|
+
export { EventsService, } from "./generated/services/events.js";
|
|
88
|
+
// File services - generated
|
|
89
|
+
export { AttachmentsService, } from "./generated/services/attachments.js";
|
|
90
|
+
export { VaultsService, } from "./generated/services/vaults.js";
|
|
91
|
+
export { DocumentsService, } from "./generated/services/documents.js";
|
|
92
|
+
export { UploadsService, } from "./generated/services/uploads.js";
|
|
93
|
+
// Schedule & Time services - generated
|
|
94
|
+
export { SchedulesService, } from "./generated/services/schedules.js";
|
|
95
|
+
export { TimesheetsService, } from "./generated/services/timesheets.js";
|
|
96
|
+
export { TimelineService, } from "./generated/services/timeline.js";
|
|
97
|
+
// Search & Reports services - generated
|
|
98
|
+
export { SearchService, } from "./generated/services/search.js";
|
|
99
|
+
export { ReportsService, } from "./generated/services/reports.js";
|
|
100
|
+
// Recording services - generated
|
|
101
|
+
export { RecordingsService, } from "./generated/services/recordings.js";
|
|
102
|
+
// Templates service - generated
|
|
103
|
+
export { TemplatesService, } from "./generated/services/templates.js";
|
|
104
|
+
// Lineup service - generated
|
|
105
|
+
export { LineupService, } from "./generated/services/lineup.js";
|
|
106
|
+
// Organization services - generated
|
|
107
|
+
export { TodolistGroupsService, } from "./generated/services/todolist-groups.js";
|
|
108
|
+
export { ToolsService, } from "./generated/services/tools.js";
|
|
109
|
+
// Boosts service - generated
|
|
110
|
+
export { BoostsService, } from "./generated/services/boosts.js";
|
|
111
|
+
// OpenTelemetry hooks
|
|
112
|
+
export { otelHooks, } from "./hooks/otel.js";
|
|
113
|
+
// OAuth functions
|
|
114
|
+
export { discover, discoverLaunchpad, LAUNCHPAD_BASE_URL, } from "./oauth/discovery.js";
|
|
115
|
+
export { exchangeCode, refreshToken, isTokenExpired, } from "./oauth/exchange.js";
|
|
116
|
+
// PKCE utilities
|
|
117
|
+
export { generatePKCE, generateState, } from "./oauth/pkce.js";
|
|
118
|
+
// =============================================================================
|
|
119
|
+
// Security Utilities
|
|
120
|
+
// =============================================================================
|
|
121
|
+
export { redactHeaders, redactHeadersRecord, } from "./security.js";
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 authorization URL construction for Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Builds the authorization URL to redirect users to the OAuth provider.
|
|
5
|
+
*/
|
|
6
|
+
import type { PKCE } from "./pkce.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parameters for building an OAuth authorization URL.
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthorizeParams {
|
|
11
|
+
/** URL of the authorization endpoint */
|
|
12
|
+
authorizationEndpoint: string;
|
|
13
|
+
/** The client identifier */
|
|
14
|
+
clientId: string;
|
|
15
|
+
/** The redirect URI for the callback */
|
|
16
|
+
redirectUri: string;
|
|
17
|
+
/** CSRF protection state parameter */
|
|
18
|
+
state: string;
|
|
19
|
+
/** PKCE parameters (optional) */
|
|
20
|
+
pkce?: PKCE;
|
|
21
|
+
/** OAuth scope to request (optional) */
|
|
22
|
+
scope?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Builds an OAuth 2.0 authorization URL.
|
|
26
|
+
*
|
|
27
|
+
* Constructs a URL with the required OAuth parameters for initiating
|
|
28
|
+
* the authorization code flow. Validates that the endpoint uses HTTPS
|
|
29
|
+
* (localhost is allowed for development).
|
|
30
|
+
*
|
|
31
|
+
* @param params - Authorization parameters
|
|
32
|
+
* @returns The complete authorization URL
|
|
33
|
+
* @throws BasecampError on validation errors (non-HTTPS, invalid URL)
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const url = buildAuthorizationUrl({
|
|
38
|
+
* authorizationEndpoint: config.authorizationEndpoint,
|
|
39
|
+
* clientId: "my_client_id",
|
|
40
|
+
* redirectUri: "http://localhost:14923/callback",
|
|
41
|
+
* state: generateState(),
|
|
42
|
+
* pkce: await generatePKCE(),
|
|
43
|
+
* });
|
|
44
|
+
* // Redirect user to url.toString()
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildAuthorizationUrl(params: AuthorizeParams): URL;
|
|
48
|
+
//# sourceMappingURL=authorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../src/oauth/authorize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,GAAG,CA6BlE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 authorization URL construction for Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Builds the authorization URL to redirect users to the OAuth provider.
|
|
5
|
+
*/
|
|
6
|
+
import { BasecampError } from "../errors.js";
|
|
7
|
+
import { isLocalhost } from "../security.js";
|
|
8
|
+
/**
|
|
9
|
+
* Builds an OAuth 2.0 authorization URL.
|
|
10
|
+
*
|
|
11
|
+
* Constructs a URL with the required OAuth parameters for initiating
|
|
12
|
+
* the authorization code flow. Validates that the endpoint uses HTTPS
|
|
13
|
+
* (localhost is allowed for development).
|
|
14
|
+
*
|
|
15
|
+
* @param params - Authorization parameters
|
|
16
|
+
* @returns The complete authorization URL
|
|
17
|
+
* @throws BasecampError on validation errors (non-HTTPS, invalid URL)
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const url = buildAuthorizationUrl({
|
|
22
|
+
* authorizationEndpoint: config.authorizationEndpoint,
|
|
23
|
+
* clientId: "my_client_id",
|
|
24
|
+
* redirectUri: "http://localhost:14923/callback",
|
|
25
|
+
* state: generateState(),
|
|
26
|
+
* pkce: await generatePKCE(),
|
|
27
|
+
* });
|
|
28
|
+
* // Redirect user to url.toString()
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function buildAuthorizationUrl(params) {
|
|
32
|
+
const { authorizationEndpoint, clientId, redirectUri, state, pkce, scope } = params;
|
|
33
|
+
let url;
|
|
34
|
+
try {
|
|
35
|
+
url = new URL(authorizationEndpoint);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new BasecampError("validation", `Invalid authorization endpoint URL: ${authorizationEndpoint}`);
|
|
39
|
+
}
|
|
40
|
+
if (url.protocol !== "https:" && !isLocalhost(url.hostname)) {
|
|
41
|
+
throw new BasecampError("validation", `Authorization endpoint must use HTTPS: ${authorizationEndpoint}`);
|
|
42
|
+
}
|
|
43
|
+
url.searchParams.set("response_type", "code");
|
|
44
|
+
url.searchParams.set("client_id", clientId);
|
|
45
|
+
url.searchParams.set("redirect_uri", redirectUri);
|
|
46
|
+
url.searchParams.set("state", state);
|
|
47
|
+
if (pkce) {
|
|
48
|
+
url.searchParams.set("code_challenge", pkce.challenge);
|
|
49
|
+
url.searchParams.set("code_challenge_method", "S256");
|
|
50
|
+
}
|
|
51
|
+
if (scope) {
|
|
52
|
+
url.searchParams.set("scope", scope);
|
|
53
|
+
}
|
|
54
|
+
return url;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=authorize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../src/oauth/authorize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAqB7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAuB;IAC3D,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEpF,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,uCAAuC,qBAAqB,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,0CAA0C,qBAAqB,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAErC,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local HTTP callback server for OAuth 2.0 authorization code flow.
|
|
3
|
+
*
|
|
4
|
+
* Starts a temporary server to receive the authorization callback,
|
|
5
|
+
* validates the state parameter, and extracts the authorization code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Result from a successful OAuth callback.
|
|
9
|
+
*/
|
|
10
|
+
export interface CallbackResult {
|
|
11
|
+
/** The authorization code */
|
|
12
|
+
code: string;
|
|
13
|
+
/** The state parameter (already validated) */
|
|
14
|
+
state: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Options for the callback server.
|
|
18
|
+
*/
|
|
19
|
+
export interface CallbackServerOptions {
|
|
20
|
+
/** Port to listen on (default: 14923) */
|
|
21
|
+
port?: number;
|
|
22
|
+
/** Host to bind to (default: "localhost") */
|
|
23
|
+
host?: string;
|
|
24
|
+
/** Timeout in milliseconds (default: 120000) */
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
/** Expected state parameter for CSRF validation */
|
|
27
|
+
expectedState: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Starts a local HTTP server to receive the OAuth callback.
|
|
31
|
+
*
|
|
32
|
+
* The server listens for a single GET /callback request, validates
|
|
33
|
+
* the state parameter, and extracts the authorization code.
|
|
34
|
+
* It auto-closes after receiving the callback or on timeout.
|
|
35
|
+
*
|
|
36
|
+
* @param options - Server configuration
|
|
37
|
+
* @returns The callback URL, a promise for the result, and a close function
|
|
38
|
+
* @throws BasecampError if the port is already in use
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const { url, waitForCallback, close } = await startCallbackServer({
|
|
43
|
+
* expectedState: myState,
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* // Use `url` as the redirect_uri in the authorization request
|
|
47
|
+
* // Then wait for the user to complete the flow:
|
|
48
|
+
* const { code } = await waitForCallback();
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function startCallbackServer(options: CallbackServerOptions): Promise<{
|
|
52
|
+
url: string;
|
|
53
|
+
waitForCallback: () => Promise<CallbackResult>;
|
|
54
|
+
close: () => void;
|
|
55
|
+
}>;
|
|
56
|
+
//# sourceMappingURL=callback-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../src/oauth/callback-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CA8H7F"}
|