@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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 type definitions for Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides types for OAuth configuration, tokens, and exchange requests.
|
|
5
|
+
* Supports both standard OAuth 2.0 and Basecamp's Launchpad legacy format.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* OAuth 2.0 server configuration from discovery endpoint.
|
|
9
|
+
*/
|
|
10
|
+
export interface OAuthConfig {
|
|
11
|
+
/** The authorization server's issuer identifier */
|
|
12
|
+
issuer: string;
|
|
13
|
+
/** URL of the authorization endpoint */
|
|
14
|
+
authorizationEndpoint: string;
|
|
15
|
+
/** URL of the token endpoint */
|
|
16
|
+
tokenEndpoint: string;
|
|
17
|
+
/** URL of the dynamic client registration endpoint (optional) */
|
|
18
|
+
registrationEndpoint?: string;
|
|
19
|
+
/** List of OAuth 2.0 scopes supported (optional) */
|
|
20
|
+
scopesSupported?: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* OAuth 2.0 access token response.
|
|
24
|
+
*/
|
|
25
|
+
export interface OAuthToken {
|
|
26
|
+
/** The access token string */
|
|
27
|
+
accessToken: string;
|
|
28
|
+
/** The refresh token string (optional) */
|
|
29
|
+
refreshToken?: string;
|
|
30
|
+
/** Token type (usually "Bearer") */
|
|
31
|
+
tokenType: string;
|
|
32
|
+
/** Lifetime of the access token in seconds (optional) */
|
|
33
|
+
expiresIn?: number;
|
|
34
|
+
/** Calculated expiration date (optional) */
|
|
35
|
+
expiresAt?: Date;
|
|
36
|
+
/** OAuth scope granted (optional) */
|
|
37
|
+
scope?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parameters for exchanging an authorization code for tokens.
|
|
41
|
+
*/
|
|
42
|
+
export interface ExchangeRequest {
|
|
43
|
+
/** URL of the token endpoint */
|
|
44
|
+
tokenEndpoint: string;
|
|
45
|
+
/** The authorization code received from the authorization server */
|
|
46
|
+
code: string;
|
|
47
|
+
/** The redirect URI used in the authorization request */
|
|
48
|
+
redirectUri: string;
|
|
49
|
+
/** The client identifier */
|
|
50
|
+
clientId: string;
|
|
51
|
+
/** The client secret (optional for public clients) */
|
|
52
|
+
clientSecret?: string;
|
|
53
|
+
/** PKCE code verifier (optional) */
|
|
54
|
+
codeVerifier?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Use Launchpad's non-standard token format.
|
|
57
|
+
* When true, uses `type=web_server` instead of `grant_type=authorization_code`.
|
|
58
|
+
*/
|
|
59
|
+
useLegacyFormat?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parameters for refreshing an access token.
|
|
63
|
+
*/
|
|
64
|
+
export interface RefreshRequest {
|
|
65
|
+
/** URL of the token endpoint */
|
|
66
|
+
tokenEndpoint: string;
|
|
67
|
+
/** The refresh token */
|
|
68
|
+
refreshToken: string;
|
|
69
|
+
/** The client identifier (optional) */
|
|
70
|
+
clientId?: string;
|
|
71
|
+
/** The client secret (optional) */
|
|
72
|
+
clientSecret?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Use Launchpad's non-standard token format.
|
|
75
|
+
* When true, uses `type=refresh` instead of `grant_type=refresh_token`.
|
|
76
|
+
*/
|
|
77
|
+
useLegacyFormat?: boolean;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Raw token response from OAuth server.
|
|
81
|
+
* Used internally for JSON parsing.
|
|
82
|
+
*/
|
|
83
|
+
export interface RawTokenResponse {
|
|
84
|
+
access_token: string;
|
|
85
|
+
refresh_token?: string;
|
|
86
|
+
token_type: string;
|
|
87
|
+
expires_in?: number;
|
|
88
|
+
scope?: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* OAuth error response from server.
|
|
92
|
+
*/
|
|
93
|
+
export interface OAuthErrorResponse {
|
|
94
|
+
error: string;
|
|
95
|
+
error_description?: string;
|
|
96
|
+
error_uri?: string;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/oauth/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/oauth/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination utility functions.
|
|
3
|
+
*
|
|
4
|
+
* Extracted to its own module to avoid circular dependencies between
|
|
5
|
+
* client.ts (which imports generated services) and base.ts (which
|
|
6
|
+
* generated services extend).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parses the next URL from a Link header.
|
|
10
|
+
* Looks for rel="next" in the header value.
|
|
11
|
+
*
|
|
12
|
+
* @param linkHeader - The Link header value
|
|
13
|
+
* @returns The URL for the next page, or null if not found
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseNextLink(linkHeader: string | null): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves a possibly-relative URL against a base URL.
|
|
18
|
+
* If target is already absolute, it is returned unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveURL(base: string, target: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Checks whether two absolute URLs share the same origin (scheme + host + port).
|
|
23
|
+
* Handles default port normalization (e.g. https://example.com:443 === https://example.com).
|
|
24
|
+
* Relative URLs should be resolved with resolveURL before calling this function.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isSameOrigin(a: string, b: string): boolean;
|
|
27
|
+
//# sourceMappingURL=pagination-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination-utils.d.ts","sourceRoot":"","sources":["../src/pagination-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAYtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ1D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination utility functions.
|
|
3
|
+
*
|
|
4
|
+
* Extracted to its own module to avoid circular dependencies between
|
|
5
|
+
* client.ts (which imports generated services) and base.ts (which
|
|
6
|
+
* generated services extend).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parses the next URL from a Link header.
|
|
10
|
+
* Looks for rel="next" in the header value.
|
|
11
|
+
*
|
|
12
|
+
* @param linkHeader - The Link header value
|
|
13
|
+
* @returns The URL for the next page, or null if not found
|
|
14
|
+
*/
|
|
15
|
+
export function parseNextLink(linkHeader) {
|
|
16
|
+
if (!linkHeader)
|
|
17
|
+
return null;
|
|
18
|
+
for (const part of linkHeader.split(",")) {
|
|
19
|
+
const trimmed = part.trim();
|
|
20
|
+
if (trimmed.includes('rel="next"')) {
|
|
21
|
+
const match = trimmed.match(/<([^>]+)>/);
|
|
22
|
+
return match?.[1] ?? null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolves a possibly-relative URL against a base URL.
|
|
29
|
+
* If target is already absolute, it is returned unchanged.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveURL(base, target) {
|
|
32
|
+
try {
|
|
33
|
+
return new URL(target, base).href;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return target;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks whether two absolute URLs share the same origin (scheme + host + port).
|
|
41
|
+
* Handles default port normalization (e.g. https://example.com:443 === https://example.com).
|
|
42
|
+
* Relative URLs should be resolved with resolveURL before calling this function.
|
|
43
|
+
*/
|
|
44
|
+
export function isSameOrigin(a, b) {
|
|
45
|
+
try {
|
|
46
|
+
const urlA = new URL(a);
|
|
47
|
+
const urlB = new URL(b);
|
|
48
|
+
return urlA.origin === urlB.origin;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=pagination-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination-utils.js","sourceRoot":"","sources":["../src/pagination-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB;IACrD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACzC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAc;IACrD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination types and utilities for the Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides ListResult (an Array subclass with metadata), pagination options,
|
|
5
|
+
* and header parsing utilities used by generated service methods.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Metadata about a paginated list response.
|
|
9
|
+
*/
|
|
10
|
+
export interface ListMeta {
|
|
11
|
+
/** Total number of items across all pages (from X-Total-Count header). */
|
|
12
|
+
readonly totalCount: number;
|
|
13
|
+
/** True when results were truncated (by maxItems or page safety cap). */
|
|
14
|
+
readonly truncated: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Options for controlling pagination behavior.
|
|
18
|
+
*/
|
|
19
|
+
export interface PaginationOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Maximum number of items to return across all pages.
|
|
22
|
+
* When undefined or 0, all pages are fetched.
|
|
23
|
+
*/
|
|
24
|
+
maxItems?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* An array of results with pagination metadata.
|
|
28
|
+
*
|
|
29
|
+
* Extends Array<T> so it's fully backwards-compatible: works with
|
|
30
|
+
* .forEach(), .map(), spread, .length, indexing, and Array.isArray().
|
|
31
|
+
* Additional metadata is accessible via the `.meta` property.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const todos = await client.todos.list(projectId, todolistId);
|
|
36
|
+
* console.log(`Showing ${todos.length} of ${todos.meta.totalCount} todos`);
|
|
37
|
+
* todos.forEach(todo => console.log(todo.content));
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class ListResult<T> extends Array<T> {
|
|
41
|
+
readonly meta: ListMeta;
|
|
42
|
+
/**
|
|
43
|
+
* Array species methods (map, filter, slice, etc.) should return plain
|
|
44
|
+
* Arrays, not ListResult instances. Without this override, those methods
|
|
45
|
+
* would call `new ListResult(length)` which fails because our constructor
|
|
46
|
+
* expects (items[], meta).
|
|
47
|
+
*/
|
|
48
|
+
static get [Symbol.species](): ArrayConstructor;
|
|
49
|
+
constructor(items: T[], meta: ListMeta);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parses the X-Total-Count header from a Response.
|
|
53
|
+
* Returns 0 if the header is missing or invalid.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseTotalCount(response: Response): number;
|
|
56
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAExB;;;;;OAKG;IACH,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAEW,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ;CAavC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAK1D"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination types and utilities for the Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides ListResult (an Array subclass with metadata), pagination options,
|
|
5
|
+
* and header parsing utilities used by generated service methods.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* An array of results with pagination metadata.
|
|
9
|
+
*
|
|
10
|
+
* Extends Array<T> so it's fully backwards-compatible: works with
|
|
11
|
+
* .forEach(), .map(), spread, .length, indexing, and Array.isArray().
|
|
12
|
+
* Additional metadata is accessible via the `.meta` property.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const todos = await client.todos.list(projectId, todolistId);
|
|
17
|
+
* console.log(`Showing ${todos.length} of ${todos.meta.totalCount} todos`);
|
|
18
|
+
* todos.forEach(todo => console.log(todo.content));
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export class ListResult extends Array {
|
|
22
|
+
meta;
|
|
23
|
+
/**
|
|
24
|
+
* Array species methods (map, filter, slice, etc.) should return plain
|
|
25
|
+
* Arrays, not ListResult instances. Without this override, those methods
|
|
26
|
+
* would call `new ListResult(length)` which fails because our constructor
|
|
27
|
+
* expects (items[], meta).
|
|
28
|
+
*/
|
|
29
|
+
static get [Symbol.species]() {
|
|
30
|
+
return Array;
|
|
31
|
+
}
|
|
32
|
+
constructor(items, meta) {
|
|
33
|
+
// Use super(0) + length + indexed assignment to avoid:
|
|
34
|
+
// 1. The single-number-argument trap (super(5) creates 5 empty slots)
|
|
35
|
+
// 2. The ...spread limit (push(...items) throws RangeError on ~300k+ items)
|
|
36
|
+
super(0);
|
|
37
|
+
if (items.length > 0) {
|
|
38
|
+
this.length = items.length;
|
|
39
|
+
for (let i = 0; i < items.length; i++) {
|
|
40
|
+
this[i] = items[i];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
this.meta = meta;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parses the X-Total-Count header from a Response.
|
|
48
|
+
* Returns 0 if the header is missing or invalid.
|
|
49
|
+
*/
|
|
50
|
+
export function parseTotalCount(response) {
|
|
51
|
+
const header = response.headers.get("X-Total-Count");
|
|
52
|
+
if (!header)
|
|
53
|
+
return 0;
|
|
54
|
+
const parsed = parseInt(header, 10);
|
|
55
|
+
return isNaN(parsed) ? 0 : parsed;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,UAAc,SAAQ,KAAQ;IAChC,IAAI,CAAW;IAExB;;;;;OAKG;IACH,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,KAAU,EAAE,IAAc;QACpC,uDAAuD;QACvD,sEAAsE;QACtE,4EAA4E;QAC5E,KAAK,CAAC,CAAC,CAAC,CAAC;QACT,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security utilities for the Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides helpers for safely logging HTTP requests without exposing
|
|
5
|
+
* sensitive information like tokens and cookies.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Returns a copy of the headers with sensitive values replaced by "[REDACTED]".
|
|
9
|
+
*
|
|
10
|
+
* This is useful for safely logging HTTP requests and responses without
|
|
11
|
+
* exposing tokens, cookies, or other credentials.
|
|
12
|
+
*
|
|
13
|
+
* Redacted headers:
|
|
14
|
+
* - Authorization
|
|
15
|
+
* - Cookie
|
|
16
|
+
* - Set-Cookie
|
|
17
|
+
* - X-CSRF-Token
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const safeHeaders = redactHeaders(response.headers);
|
|
22
|
+
* console.log("Response headers:", safeHeaders);
|
|
23
|
+
* // { "content-type": "application/json", "authorization": "[REDACTED]" }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function redactHeaders(headers: Headers): Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Returns a copy of the header record with sensitive values replaced by "[REDACTED]".
|
|
29
|
+
*
|
|
30
|
+
* Similar to redactHeaders, but works with plain objects instead of Headers instances.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* const headers = { Authorization: "Bearer token", "Content-Type": "application/json" };
|
|
35
|
+
* const safe = redactHeadersRecord(headers);
|
|
36
|
+
* // { Authorization: "[REDACTED]", "Content-Type": "application/json" }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function redactHeadersRecord(headers: Record<string, string>): Record<string, string>;
|
|
40
|
+
/**
|
|
41
|
+
* Checks if a hostname represents localhost for development/testing purposes.
|
|
42
|
+
*
|
|
43
|
+
* Matches:
|
|
44
|
+
* - "localhost" exactly
|
|
45
|
+
* - Any subdomain of localhost (e.g., "api.localhost", "dev.api.localhost")
|
|
46
|
+
* - IPv4 loopback "127.0.0.1"
|
|
47
|
+
* - IPv6 loopback "::1"
|
|
48
|
+
* - The .localhost TLD (RFC 6761) - any hostname ending in ".localhost"
|
|
49
|
+
*
|
|
50
|
+
* This is used to allow HTTP (non-HTTPS) connections during local development
|
|
51
|
+
* while enforcing HTTPS for all production traffic.
|
|
52
|
+
*
|
|
53
|
+
* @param hostname - The hostname to check (without port)
|
|
54
|
+
* @returns true if the hostname represents localhost
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* isLocalhost("localhost"); // true
|
|
59
|
+
* isLocalhost("api.localhost"); // true
|
|
60
|
+
* isLocalhost("myapp.localhost"); // true
|
|
61
|
+
* isLocalhost("127.0.0.1"); // true
|
|
62
|
+
* isLocalhost("::1"); // true
|
|
63
|
+
* isLocalhost("example.com"); // false
|
|
64
|
+
* isLocalhost("localhost.example.com"); // false
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function isLocalhost(hostname: string): boolean;
|
|
68
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAatE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQrD"}
|
package/dist/security.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security utilities for the Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides helpers for safely logging HTTP requests without exposing
|
|
5
|
+
* sensitive information like tokens and cookies.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Headers that contain sensitive values and should be redacted.
|
|
9
|
+
*/
|
|
10
|
+
const SENSITIVE_HEADERS = [
|
|
11
|
+
"authorization",
|
|
12
|
+
"cookie",
|
|
13
|
+
"set-cookie",
|
|
14
|
+
"x-csrf-token",
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Returns a copy of the headers with sensitive values replaced by "[REDACTED]".
|
|
18
|
+
*
|
|
19
|
+
* This is useful for safely logging HTTP requests and responses without
|
|
20
|
+
* exposing tokens, cookies, or other credentials.
|
|
21
|
+
*
|
|
22
|
+
* Redacted headers:
|
|
23
|
+
* - Authorization
|
|
24
|
+
* - Cookie
|
|
25
|
+
* - Set-Cookie
|
|
26
|
+
* - X-CSRF-Token
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const safeHeaders = redactHeaders(response.headers);
|
|
31
|
+
* console.log("Response headers:", safeHeaders);
|
|
32
|
+
* // { "content-type": "application/json", "authorization": "[REDACTED]" }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function redactHeaders(headers) {
|
|
36
|
+
const result = {};
|
|
37
|
+
headers.forEach((value, key) => {
|
|
38
|
+
const lowerKey = key.toLowerCase();
|
|
39
|
+
if (SENSITIVE_HEADERS.includes(lowerKey)) {
|
|
40
|
+
result[key] = "[REDACTED]";
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
result[key] = value;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns a copy of the header record with sensitive values replaced by "[REDACTED]".
|
|
50
|
+
*
|
|
51
|
+
* Similar to redactHeaders, but works with plain objects instead of Headers instances.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const headers = { Authorization: "Bearer token", "Content-Type": "application/json" };
|
|
56
|
+
* const safe = redactHeadersRecord(headers);
|
|
57
|
+
* // { Authorization: "[REDACTED]", "Content-Type": "application/json" }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export function redactHeadersRecord(headers) {
|
|
61
|
+
const result = {};
|
|
62
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
63
|
+
const lowerKey = key.toLowerCase();
|
|
64
|
+
if (SENSITIVE_HEADERS.includes(lowerKey)) {
|
|
65
|
+
result[key] = "[REDACTED]";
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
result[key] = value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Checks if a hostname represents localhost for development/testing purposes.
|
|
75
|
+
*
|
|
76
|
+
* Matches:
|
|
77
|
+
* - "localhost" exactly
|
|
78
|
+
* - Any subdomain of localhost (e.g., "api.localhost", "dev.api.localhost")
|
|
79
|
+
* - IPv4 loopback "127.0.0.1"
|
|
80
|
+
* - IPv6 loopback "::1"
|
|
81
|
+
* - The .localhost TLD (RFC 6761) - any hostname ending in ".localhost"
|
|
82
|
+
*
|
|
83
|
+
* This is used to allow HTTP (non-HTTPS) connections during local development
|
|
84
|
+
* while enforcing HTTPS for all production traffic.
|
|
85
|
+
*
|
|
86
|
+
* @param hostname - The hostname to check (without port)
|
|
87
|
+
* @returns true if the hostname represents localhost
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* isLocalhost("localhost"); // true
|
|
92
|
+
* isLocalhost("api.localhost"); // true
|
|
93
|
+
* isLocalhost("myapp.localhost"); // true
|
|
94
|
+
* isLocalhost("127.0.0.1"); // true
|
|
95
|
+
* isLocalhost("::1"); // true
|
|
96
|
+
* isLocalhost("example.com"); // false
|
|
97
|
+
* isLocalhost("localhost.example.com"); // false
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export function isLocalhost(hostname) {
|
|
101
|
+
const normalized = hostname.toLowerCase();
|
|
102
|
+
return (normalized === "localhost" ||
|
|
103
|
+
normalized === "127.0.0.1" ||
|
|
104
|
+
normalized === "::1" ||
|
|
105
|
+
normalized.endsWith(".localhost"));
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,eAAe;IACf,QAAQ;IACR,YAAY;IACZ,cAAc;CACf,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA+B;IAE/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAO,CACL,UAAU,KAAK,WAAW;QAC1B,UAAU,KAAK,WAAW;QAC1B,UAAU,KAAK,KAAK;QACpB,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorization service for Basecamp SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides functionality to fetch authorization information including
|
|
5
|
+
* the authenticated user's identity and list of accessible accounts.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseService, type RawClient } from "./base.js";
|
|
8
|
+
import type { BasecampHooks } from "../hooks.js";
|
|
9
|
+
import type { AuthStrategy } from "../auth-strategy.js";
|
|
10
|
+
/**
|
|
11
|
+
* The authenticated user's identity.
|
|
12
|
+
*/
|
|
13
|
+
export interface Identity {
|
|
14
|
+
/** User's unique identifier */
|
|
15
|
+
id: number;
|
|
16
|
+
/** User's first name */
|
|
17
|
+
firstName: string;
|
|
18
|
+
/** User's last name */
|
|
19
|
+
lastName: string;
|
|
20
|
+
/** User's email address */
|
|
21
|
+
emailAddress: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A Basecamp account the user has access to.
|
|
25
|
+
*/
|
|
26
|
+
export interface AuthorizedAccount {
|
|
27
|
+
/** Account's unique identifier */
|
|
28
|
+
id: number;
|
|
29
|
+
/** Account name */
|
|
30
|
+
name: string;
|
|
31
|
+
/** Product type (e.g., "bc3" for Basecamp, "hey" for HEY) */
|
|
32
|
+
product: string;
|
|
33
|
+
/** API URL for this account */
|
|
34
|
+
href: string;
|
|
35
|
+
/** Web app URL for this account */
|
|
36
|
+
appHref: string;
|
|
37
|
+
/** Whether the account is hidden from the user's view */
|
|
38
|
+
hidden?: boolean;
|
|
39
|
+
/** Whether the account subscription has expired */
|
|
40
|
+
expired?: boolean;
|
|
41
|
+
/** Whether this is the user's featured/primary account */
|
|
42
|
+
featured?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Authorization information response.
|
|
46
|
+
*/
|
|
47
|
+
export interface AuthorizationInfo {
|
|
48
|
+
/** Token expiration timestamp */
|
|
49
|
+
expiresAt: Date;
|
|
50
|
+
/** The authenticated user's identity */
|
|
51
|
+
identity: Identity;
|
|
52
|
+
/** List of accounts the user can access */
|
|
53
|
+
accounts: AuthorizedAccount[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Options for fetching authorization information.
|
|
57
|
+
*/
|
|
58
|
+
export interface GetAuthorizationInfoOptions {
|
|
59
|
+
/**
|
|
60
|
+
* Override the default authorization endpoint URL.
|
|
61
|
+
* Defaults to "https://launchpad.37signals.com/authorization.json"
|
|
62
|
+
*/
|
|
63
|
+
endpoint?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Filter accounts by product type.
|
|
66
|
+
* Common values: "bc3" (Basecamp 3), "bcx" (Basecamp 2), "hey" (HEY)
|
|
67
|
+
*/
|
|
68
|
+
filterProduct?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Service for authorization-related operations.
|
|
72
|
+
*
|
|
73
|
+
* This service communicates with the Launchpad authorization endpoint
|
|
74
|
+
* rather than the standard Basecamp API.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* import { createBasecampClient } from "@37signals/basecamp";
|
|
79
|
+
*
|
|
80
|
+
* const client = createBasecampClient({
|
|
81
|
+
* accountId: "12345",
|
|
82
|
+
* accessToken: "your-token",
|
|
83
|
+
* });
|
|
84
|
+
*
|
|
85
|
+
* // Get all accounts
|
|
86
|
+
* const info = await client.authorization.getInfo();
|
|
87
|
+
* console.log(`Logged in as ${info.identity.firstName}`);
|
|
88
|
+
*
|
|
89
|
+
* // Filter to only Basecamp 3 accounts
|
|
90
|
+
* const bc3Info = await client.authorization.getInfo({ filterProduct: "bc3" });
|
|
91
|
+
* for (const account of bc3Info.accounts) {
|
|
92
|
+
* console.log(account.name);
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare class AuthorizationService extends BaseService {
|
|
97
|
+
private authStrategy;
|
|
98
|
+
private userAgent;
|
|
99
|
+
constructor(client: RawClient, hooks: BasecampHooks | undefined, authStrategy: AuthStrategy, userAgent: string);
|
|
100
|
+
/**
|
|
101
|
+
* Fetches authorization information for the current access token.
|
|
102
|
+
*
|
|
103
|
+
* Returns the authenticated user's identity and list of accounts
|
|
104
|
+
* they have access to.
|
|
105
|
+
*
|
|
106
|
+
* @param options - Optional configuration
|
|
107
|
+
* @returns Authorization information including identity and accounts
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const info = await authService.getInfo();
|
|
112
|
+
*
|
|
113
|
+
* console.log(`User: ${info.identity.firstName} ${info.identity.lastName}`);
|
|
114
|
+
* console.log(`Email: ${info.identity.emailAddress}`);
|
|
115
|
+
* console.log(`Token expires: ${info.expiresAt}`);
|
|
116
|
+
*
|
|
117
|
+
* for (const account of info.accounts) {
|
|
118
|
+
* console.log(`${account.name} (${account.product})`);
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
getInfo(options?: GetAuthorizationInfoOptions): Promise<AuthorizationInfo>;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=authorization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/services/authorization.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,SAAS,EAAE,IAAI,CAAC;IAChB,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAS;gBAGxB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM;IAOnB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,OAAO,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA8DrF"}
|