latchkey 1.0.1 → 2.1.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 +66 -8
- package/dist/integrations/SKILL.md +15 -3
- package/dist/package.json +2 -2
- package/dist/scripts/codegen.js +1 -1
- package/dist/scripts/codegen.js.map +1 -1
- package/dist/src/apiCredentialStore.d.ts +1 -1
- package/dist/src/apiCredentialStore.d.ts.map +1 -1
- package/dist/src/apiCredentialStore.js +1 -1
- package/dist/src/apiCredentialStore.js.map +1 -1
- package/dist/src/apiCredentials.d.ts +13 -115
- package/dist/src/apiCredentials.d.ts.map +1 -1
- package/dist/src/apiCredentials.js +10 -101
- package/dist/src/apiCredentials.js.map +1 -1
- package/dist/src/apiCredentialsSerialization.d.ts +119 -0
- package/dist/src/apiCredentialsSerialization.d.ts.map +1 -0
- package/dist/src/apiCredentialsSerialization.js +90 -0
- package/dist/src/apiCredentialsSerialization.js.map +1 -0
- package/dist/src/browserConfig.d.ts +2 -33
- package/dist/src/browserConfig.d.ts.map +1 -1
- package/dist/src/browserConfig.js +6 -81
- package/dist/src/browserConfig.js.map +1 -1
- package/dist/src/cli.js +22 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/cliCommands.d.ts +0 -1
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +148 -44
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/config.d.ts +4 -3
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +17 -23
- package/dist/src/config.js.map +1 -1
- package/dist/src/configDataStore.d.ts +43 -0
- package/dist/src/configDataStore.d.ts.map +1 -0
- package/dist/src/configDataStore.js +108 -0
- package/dist/src/configDataStore.js.map +1 -0
- package/dist/src/curl.d.ts +10 -0
- package/dist/src/curl.d.ts.map +1 -1
- package/dist/src/curl.js +88 -0
- package/dist/src/curl.js.map +1 -1
- package/dist/src/encryptedStorage.d.ts +9 -0
- package/dist/src/encryptedStorage.d.ts.map +1 -1
- package/dist/src/encryptedStorage.js +12 -0
- package/dist/src/encryptedStorage.js.map +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrations.d.ts +9 -0
- package/dist/src/migrations.d.ts.map +1 -0
- package/dist/src/migrations.js +77 -0
- package/dist/src/migrations.js.map +1 -0
- package/dist/src/oauthUtils.d.ts +4 -1
- package/dist/src/oauthUtils.d.ts.map +1 -1
- package/dist/src/oauthUtils.js +1 -1
- package/dist/src/oauthUtils.js.map +1 -1
- package/dist/src/playwrightUtils.d.ts +2 -2
- package/dist/src/playwrightUtils.d.ts.map +1 -1
- package/dist/src/playwrightUtils.js +4 -4
- package/dist/src/playwrightUtils.js.map +1 -1
- package/dist/src/registeredService.d.ts +20 -0
- package/dist/src/registeredService.d.ts.map +1 -0
- package/dist/src/registeredService.js +34 -0
- package/dist/src/registeredService.js.map +1 -0
- package/dist/src/registeredServiceStore.d.ts +24 -0
- package/dist/src/registeredServiceStore.d.ts.map +1 -0
- package/dist/src/registeredServiceStore.js +70 -0
- package/dist/src/registeredServiceStore.js.map +1 -0
- package/dist/src/registry.d.ts +11 -1
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +70 -6
- package/dist/src/registry.js.map +1 -1
- package/dist/src/services/aws.d.ts +44 -0
- package/dist/src/services/aws.d.ts.map +1 -0
- package/dist/src/services/aws.js +237 -0
- package/dist/src/services/aws.js.map +1 -0
- package/dist/src/services/base.d.ts +14 -0
- package/dist/src/services/base.d.ts.map +1 -1
- package/dist/src/services/base.js +23 -11
- package/dist/src/services/base.js.map +1 -1
- package/dist/src/services/calendly.d.ts +12 -0
- package/dist/src/services/calendly.d.ts.map +1 -0
- package/dist/src/services/calendly.js +18 -0
- package/dist/src/services/calendly.js.map +1 -0
- package/dist/src/services/core/base.d.ts +141 -0
- package/dist/src/services/core/base.d.ts.map +1 -0
- package/dist/src/services/core/base.js +189 -0
- package/dist/src/services/core/base.js.map +1 -0
- package/dist/src/services/core/registered.d.ts +24 -0
- package/dist/src/services/core/registered.d.ts.map +1 -0
- package/dist/src/services/core/registered.js +53 -0
- package/dist/src/services/core/registered.js.map +1 -0
- package/dist/src/services/discord.d.ts +2 -1
- package/dist/src/services/discord.d.ts.map +1 -1
- package/dist/src/services/discord.js +4 -1
- package/dist/src/services/discord.js.map +1 -1
- package/dist/src/services/dropbox.d.ts +3 -2
- package/dist/src/services/dropbox.d.ts.map +1 -1
- package/dist/src/services/dropbox.js +6 -1
- package/dist/src/services/dropbox.js.map +1 -1
- package/dist/src/services/figma.d.ts +12 -0
- package/dist/src/services/figma.d.ts.map +1 -0
- package/dist/src/services/figma.js +14 -0
- package/dist/src/services/figma.js.map +1 -0
- package/dist/src/services/github.d.ts +2 -1
- package/dist/src/services/github.d.ts.map +1 -1
- package/dist/src/services/github.js +4 -1
- package/dist/src/services/github.js.map +1 -1
- package/dist/src/services/gitlab.d.ts +12 -0
- package/dist/src/services/gitlab.d.ts.map +1 -0
- package/dist/src/services/gitlab.js +14 -0
- package/dist/src/services/gitlab.js.map +1 -0
- package/dist/src/services/google/analytics.d.ts +11 -0
- package/dist/src/services/google/analytics.d.ts.map +1 -0
- package/dist/src/services/google/analytics.js +22 -0
- package/dist/src/services/google/analytics.js.map +1 -0
- package/dist/src/services/google/base.d.ts +73 -0
- package/dist/src/services/google/base.d.ts.map +1 -0
- package/dist/src/services/google/base.js +323 -0
- package/dist/src/services/google/base.js.map +1 -0
- package/dist/src/services/google/calendar.d.ts +11 -0
- package/dist/src/services/google/calendar.d.ts.map +1 -0
- package/dist/src/services/google/calendar.js +22 -0
- package/dist/src/services/google/calendar.js.map +1 -0
- package/dist/src/services/google/directions.d.ts +14 -0
- package/dist/src/services/google/directions.d.ts.map +1 -0
- package/dist/src/services/google/directions.js +49 -0
- package/dist/src/services/google/directions.js.map +1 -0
- package/dist/src/services/google/docs.d.ts +11 -0
- package/dist/src/services/google/docs.d.ts.map +1 -0
- package/dist/src/services/google/docs.js +19 -0
- package/dist/src/services/google/docs.js.map +1 -0
- package/dist/src/services/google/drive.d.ts +11 -0
- package/dist/src/services/google/drive.d.ts.map +1 -0
- package/dist/src/services/google/drive.js +19 -0
- package/dist/src/services/google/drive.js.map +1 -0
- package/dist/src/services/google/gmail.d.ts +11 -0
- package/dist/src/services/google/gmail.d.ts.map +1 -0
- package/dist/src/services/google/gmail.js +24 -0
- package/dist/src/services/google/gmail.js.map +1 -0
- package/dist/src/services/google/maps.d.ts +39 -0
- package/dist/src/services/google/maps.d.ts.map +1 -0
- package/dist/src/services/google/maps.js +94 -0
- package/dist/src/services/google/maps.js.map +1 -0
- package/dist/src/services/google/people.d.ts +11 -0
- package/dist/src/services/google/people.d.ts.map +1 -0
- package/dist/src/services/google/people.js +22 -0
- package/dist/src/services/google/people.js.map +1 -0
- package/dist/src/services/google/sheets.d.ts +11 -0
- package/dist/src/services/google/sheets.d.ts.map +1 -0
- package/dist/src/services/google/sheets.js +19 -0
- package/dist/src/services/google/sheets.js.map +1 -0
- package/dist/src/services/googleAnalytics.d.ts +11 -0
- package/dist/src/services/googleAnalytics.d.ts.map +1 -0
- package/dist/src/services/googleAnalytics.js +18 -0
- package/dist/src/services/googleAnalytics.js.map +1 -0
- package/dist/src/services/googleMaps.d.ts +12 -0
- package/dist/src/services/googleMaps.d.ts.map +1 -0
- package/dist/src/services/googleMaps.js +17 -0
- package/dist/src/services/googleMaps.js.map +1 -0
- package/dist/src/services/index.d.ts +21 -3
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +21 -3
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/linear.d.ts +2 -1
- package/dist/src/services/linear.d.ts.map +1 -1
- package/dist/src/services/linear.js +4 -1
- package/dist/src/services/linear.js.map +1 -1
- package/dist/src/services/mailchimp.d.ts +3 -2
- package/dist/src/services/mailchimp.d.ts.map +1 -1
- package/dist/src/services/mailchimp.js +5 -4
- package/dist/src/services/mailchimp.js.map +1 -1
- package/dist/src/services/notion.d.ts +2 -1
- package/dist/src/services/notion.d.ts.map +1 -1
- package/dist/src/services/notion.js +4 -1
- package/dist/src/services/notion.js.map +1 -1
- package/dist/src/services/sentry.d.ts +14 -0
- package/dist/src/services/sentry.d.ts.map +1 -0
- package/dist/src/services/sentry.js +43 -0
- package/dist/src/services/sentry.js.map +1 -0
- package/dist/src/services/slack.d.ts +31 -2
- package/dist/src/services/slack.d.ts.map +1 -1
- package/dist/src/services/slack.js +46 -3
- package/dist/src/services/slack.js.map +1 -1
- package/dist/src/services/stripe.d.ts +12 -0
- package/dist/src/services/stripe.d.ts.map +1 -0
- package/dist/src/services/stripe.js +14 -0
- package/dist/src/services/stripe.js.map +1 -0
- package/dist/src/services/telegram.d.ts +40 -0
- package/dist/src/services/telegram.d.ts.map +1 -0
- package/dist/src/services/telegram.js +73 -0
- package/dist/src/services/telegram.js.map +1 -0
- package/dist/src/services/yelp.d.ts +12 -0
- package/dist/src/services/yelp.d.ts.map +1 -0
- package/dist/src/services/yelp.js +16 -0
- package/dist/src/services/yelp.js.map +1 -0
- package/dist/src/services/zoom.d.ts +12 -0
- package/dist/src/services/zoom.d.ts.map +1 -0
- package/dist/src/services/zoom.js +18 -0
- package/dist/src/services/zoom.js.map +1 -0
- package/dist/tests/apiCredentialStore.test.js +2 -19
- package/dist/tests/apiCredentialStore.test.js.map +1 -1
- package/dist/tests/apiCredentials.test.js +139 -178
- package/dist/tests/apiCredentials.test.js.map +1 -1
- package/dist/tests/cli.test.js +755 -255
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/encryptedStorage.test.js +0 -4
- package/dist/tests/encryptedStorage.test.js.map +1 -1
- package/dist/tests/encryptedStorageKeyGeneration.test.d.ts +2 -0
- package/dist/tests/encryptedStorageKeyGeneration.test.d.ts.map +1 -0
- package/dist/tests/encryptedStorageKeyGeneration.test.js +22 -0
- package/dist/tests/encryptedStorageKeyGeneration.test.js.map +1 -0
- package/dist/tests/encryption.test.js +3 -35
- package/dist/tests/encryption.test.js.map +1 -1
- package/dist/tests/migrations.test.d.ts +2 -0
- package/dist/tests/migrations.test.d.ts.map +1 -0
- package/dist/tests/migrations.test.js +164 -0
- package/dist/tests/migrations.test.js.map +1 -0
- package/dist/tests/playwrightDownload.test.js +2 -65
- package/dist/tests/playwrightDownload.test.js.map +1 -1
- package/dist/tests/registry.test.js +147 -75
- package/dist/tests/registry.test.js.map +1 -1
- package/dist/tests/servicesAgainstRecordings.test.js +2 -2
- package/dist/tests/servicesAgainstRecordings.test.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -20,7 +20,8 @@ Latchkey is a command-line tool that injects credentials into curl
|
|
|
20
20
|
requests to known public APIs.
|
|
21
21
|
|
|
22
22
|
- `latchkey services list`
|
|
23
|
-
- List
|
|
23
|
+
- List third-party services (Slack, Google Workspace, Linear, GitHub, etc.) that are supported out-of-the-box.
|
|
24
|
+
- (In simple cases, `latchkey services register` can be used to add basic support for a new service at runtime.)
|
|
24
25
|
- `latchkey curl <arguments>`
|
|
25
26
|
- Automatically inject credentials to your otherwise standard curl calls to public APIs.
|
|
26
27
|
- Credentials must already exist (see below).
|
|
@@ -139,6 +140,61 @@ so you can use the same interface you are used to. The return
|
|
|
139
140
|
code, stdout and stderr are passed back from curl to the caller
|
|
140
141
|
of `latchkey`.
|
|
141
142
|
|
|
143
|
+
|
|
144
|
+
### Self-hosted services
|
|
145
|
+
|
|
146
|
+
For services that can be self-hosted, like GitLab, first make Latchkey aware of your service instance:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
latchkey services register my-gitlab-instance --service-family=gitlab --base-api-url="https://gitlab.example.com/api/v4/"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Then continue as usual.
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
latchkey auth set my-gitlab-instance -H "PRIVATE-TOKEN: <token>"
|
|
156
|
+
|
|
157
|
+
# Agents can then call the API.
|
|
158
|
+
latchkey curl https://gitlab.example.com/api/v4/user
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
### Entirely new services
|
|
163
|
+
|
|
164
|
+
If you want to use Latchkey with a service that is not in the
|
|
165
|
+
list of supported built-in services, you can still use the
|
|
166
|
+
mechanism described above to register a new service at runtime:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
latchkey services register mastodon --base-api-url="https://mastodon.social/api/v1/"
|
|
170
|
+
latchkey auth set mastodon -H "Authorization: Bearer <your_access_token>"
|
|
171
|
+
|
|
172
|
+
# Agents can then call the service:
|
|
173
|
+
latchkey curl https://mastodon.social/api/v1/timelines/public?limit=2
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
User-registered services only support authentication via static curl arguments provided through `latchkey auth set`.
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
### Indirect credentials
|
|
180
|
+
|
|
181
|
+
Some services can't express their credentials as static curl
|
|
182
|
+
arguments. For example:
|
|
183
|
+
|
|
184
|
+
- AWS requires a signature that changes with each request.
|
|
185
|
+
- Telegram expects bot tokens to be directly part of the URL.
|
|
186
|
+
|
|
187
|
+
In similar cases, when supported, you can use the `latchkey auth set-nocurl` command, e.g.
|
|
188
|
+
like this:
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
latchkey auth set-nocurl telegram <bot-token>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Latchkey will then modify subsequent `latchkey curl` requests as
|
|
195
|
+
needed. You can find more information (including the expected
|
|
196
|
+
signature) by calling `latchkey services info <service_name>`.
|
|
197
|
+
|
|
142
198
|
### Remembering API credentials
|
|
143
199
|
|
|
144
200
|
Your API credentials and browser state are encrypted and stored
|
|
@@ -154,6 +210,7 @@ credentials status line will show one of:
|
|
|
154
210
|
- `missing`
|
|
155
211
|
- `invalid`
|
|
156
212
|
- `valid`
|
|
213
|
+
- `unknown` (for user-registered services)
|
|
157
214
|
|
|
158
215
|
### Clearing credentials
|
|
159
216
|
|
|
@@ -200,14 +257,8 @@ latchkey auth clear
|
|
|
200
257
|
You can set these environment variables to override certain
|
|
201
258
|
defaults:
|
|
202
259
|
|
|
203
|
-
- `
|
|
204
|
-
containing stored API credentials
|
|
205
|
-
- `LATCHKEY_BROWSER_STATE`: path to the (typically encrypted) file
|
|
206
|
-
containing the state (cookies, local storage, etc.) of
|
|
207
|
-
the browser used for the login popup
|
|
260
|
+
- `LATCHKEY_DIRECTORY`: path to the directory where Latchkey stores its data (defaults to `~/.latchkey`)
|
|
208
261
|
- `LATCHKEY_CURL`: path to the curl binary
|
|
209
|
-
- `LATCHKEY_CONFIG`: path to the configuration file
|
|
210
|
-
(defaults to `~/.latchkey/config.json`)
|
|
211
262
|
- `LATCHKEY_KEYRING_SERVICE_NAME`, `LATCHKEY_KEYRING_ACCOUNT_NAME`: identifiers that are used to store the encryption password in your keyring
|
|
212
263
|
- `LATCHKEY_ENCRYPTION_KEY`: override the encryption key, e.g. when a keyring is not available. Example: `export LATCHKEY_ENCRYPTION_KEY="$(openssl rand -base64 32)"`
|
|
213
264
|
- `LATCHKEY_DISABLE_BROWSER`: when set (to any non-empty value), disables the browser login flow; commands that would trigger a browser login (`auth browser`, `auth browser-prepare`) will fail with an error instead
|
|
@@ -222,3 +273,10 @@ the browser used for the login popup
|
|
|
222
273
|
- Using agents for automated access may be prohibited by some services' ToS.
|
|
223
274
|
- We reserve the right to change the license of future releases of Latchkey.
|
|
224
275
|
- Latchkey was not tested on Windows.
|
|
276
|
+
|
|
277
|
+
## Currently supported services
|
|
278
|
+
|
|
279
|
+
Latchkey currently offers varying levels of support for the
|
|
280
|
+
following services: AWS, Calendly, Discord, Dropbox, Figma, GitHub, GitLab,
|
|
281
|
+
Gmail, Google Analytics, Google Calendar, Google Docs, Google Drive, Google Sheets,
|
|
282
|
+
Linear, Mailchimp, Notion, Sentry, Slack, Stripe, Telegram, Yelp, Zoom, and more.
|
|
@@ -20,7 +20,7 @@ Usage:
|
|
|
20
20
|
4. **Use `latchkey services info <service_name>`** to get information about a specific service (auth options, credentials status, API docs links, special requirements, etc.).
|
|
21
21
|
5. **If necessary, get or renew credentials first.** Run `latchkey auth browser <service_name>` to open a browser login pop-up window if supported.
|
|
22
22
|
6. **Look for the newest documentation of the desired public API online.** If using the `browser` auth command, avoid bot-only endpoints.
|
|
23
|
-
7. **Do not initiate a new login if the credentials status is `valid`** - the user might just not have the necessary permissions for the action you're trying to do.
|
|
23
|
+
7. **Do not initiate a new login if the credentials status is `valid` or `unknown`** - the user might just not have the necessary permissions for the action you're trying to do.
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
## Examples
|
|
@@ -68,10 +68,22 @@ latchkey services info slack
|
|
|
68
68
|
Returns auth options, credentials status, and developer notes
|
|
69
69
|
about the service. If `browser` is not present in the
|
|
70
70
|
`authOptions` field, the service requires the user to directly
|
|
71
|
-
set API credentials via `latchkey auth set`
|
|
72
|
-
requests.
|
|
71
|
+
set API credentials via `latchkey auth set` or `latchkey auth
|
|
72
|
+
set-nocurl` before making requests.
|
|
73
73
|
|
|
74
74
|
## Notes
|
|
75
75
|
|
|
76
76
|
- All curl arguments are passed through unchanged
|
|
77
77
|
- Return code, stdout and stderr are passed back from curl
|
|
78
|
+
|
|
79
|
+
## Currently supported services
|
|
80
|
+
|
|
81
|
+
Latchkey currently offers varying levels of support for the
|
|
82
|
+
following services: AWS, Calendly, Discord, Dropbox, Figma, GitHub, GitLab,
|
|
83
|
+
Gmail, Google Analytics, Google Calendar, Google Docs, Google Drive, Google Sheets,
|
|
84
|
+
Linear, Mailchimp, Notion, Sentry, Slack, Stripe, Telegram, Yelp, Zoom, and more.
|
|
85
|
+
|
|
86
|
+
### User-registered services
|
|
87
|
+
|
|
88
|
+
Note for humans: users can also add limited support for new services
|
|
89
|
+
at runtime using the `latchkey services register` command.
|
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "latchkey",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "A CLI tool that injects API credentials into curl requests
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "A CLI tool that injects API credentials into curl requests to third-party services",
|
|
5
5
|
"author": "Imbue <hynek@imbue.com>",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
package/dist/scripts/codegen.js
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* npx tsx scripts/codegen.ts wordpress https://wordpress.com/generate-api-key
|
|
21
21
|
* npx tsx scripts/codegen.ts slack https://api.slack.com/apps
|
|
22
22
|
*/
|
|
23
|
-
import { loadBrowserConfig } from '../src/
|
|
23
|
+
import { loadBrowserConfig } from '../src/configDataStore.js';
|
|
24
24
|
import { CONFIG } from '../src/config.js';
|
|
25
25
|
import { runCodegen } from './codegen/index.js';
|
|
26
26
|
class InvalidArgumentsError extends Error {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../scripts/codegen.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../scripts/codegen.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* API credential store for persisting and loading API credentials.
|
|
3
3
|
*/
|
|
4
|
-
import { ApiCredentials } from './apiCredentials.js';
|
|
4
|
+
import type { ApiCredentials } from './apiCredentials.js';
|
|
5
5
|
import { EncryptedStorage } from './encryptedStorage.js';
|
|
6
6
|
export declare class ApiCredentialStoreError extends Error {
|
|
7
7
|
constructor(message: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiCredentialStore.d.ts","sourceRoot":"","sources":["../../src/apiCredentialStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"apiCredentialStore.d.ts","sourceRoot":"","sources":["../../src/apiCredentialStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAM1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAID,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAExC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB;IAK5D,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,aAAa;IAUrB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAiB/C,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI;IAM/D,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;IAe7C,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CASrC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* API credential store for persisting and loading API credentials.
|
|
3
3
|
*/
|
|
4
|
-
import { ApiCredentialsSchema, deserializeCredentials, serializeCredentials, } from './
|
|
4
|
+
import { ApiCredentialsSchema, deserializeCredentials, serializeCredentials, } from './apiCredentialsSerialization.js';
|
|
5
5
|
export class ApiCredentialStoreError extends Error {
|
|
6
6
|
constructor(message) {
|
|
7
7
|
super(message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiCredentialStore.js","sourceRoot":"","sources":["../../src/apiCredentialStore.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"apiCredentialStore.js","sourceRoot":"","sources":["../../src/apiCredentialStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Base API credentials types and generic credential implementations.
|
|
4
3
|
*/
|
|
5
4
|
import { z } from 'zod';
|
|
6
5
|
export declare enum ApiCredentialStatus {
|
|
7
6
|
Missing = "missing",
|
|
8
7
|
Valid = "valid",
|
|
9
|
-
Invalid = "invalid"
|
|
8
|
+
Invalid = "invalid",
|
|
9
|
+
Unknown = "unknown"
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Base interface for all API credentials.
|
|
13
|
-
* Each credential type must specify how to
|
|
13
|
+
* Each credential type must specify how to inject itself into a curl call.
|
|
14
14
|
*/
|
|
15
15
|
export interface ApiCredentials {
|
|
16
16
|
readonly objectType: string;
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Inject credentials into a curl call by modifying the given arguments array.
|
|
19
|
+
* Implementations may add headers, change the URL, or transform arguments in any way.
|
|
20
|
+
*/
|
|
21
|
+
injectIntoCurlCall(curlArguments: readonly string[]): readonly string[];
|
|
18
22
|
/**
|
|
19
23
|
* Check if the credentials are expired.
|
|
20
24
|
* Returns true if expired, false if valid, or undefined if expiration is unknown.
|
|
@@ -39,7 +43,7 @@ export declare class AuthorizationBearer implements ApiCredentials {
|
|
|
39
43
|
readonly objectType: "authorizationBearer";
|
|
40
44
|
readonly token: string;
|
|
41
45
|
constructor(token: string);
|
|
42
|
-
|
|
46
|
+
injectIntoCurlCall(curlArguments: readonly string[]): readonly string[];
|
|
43
47
|
isExpired(): boolean | undefined;
|
|
44
48
|
toJSON(): AuthorizationBearerData;
|
|
45
49
|
static fromJSON(data: AuthorizationBearerData): AuthorizationBearer;
|
|
@@ -62,38 +66,11 @@ export declare class AuthorizationBare implements ApiCredentials {
|
|
|
62
66
|
readonly objectType: "authorizationBare";
|
|
63
67
|
readonly token: string;
|
|
64
68
|
constructor(token: string);
|
|
65
|
-
|
|
69
|
+
injectIntoCurlCall(curlArguments: readonly string[]): readonly string[];
|
|
66
70
|
isExpired(): boolean | undefined;
|
|
67
71
|
toJSON(): AuthorizationBareData;
|
|
68
72
|
static fromJSON(data: AuthorizationBareData): AuthorizationBare;
|
|
69
73
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Slack-specific credentials (token + d cookie).
|
|
72
|
-
*/
|
|
73
|
-
export declare const SlackApiCredentialsSchema: z.ZodObject<{
|
|
74
|
-
objectType: z.ZodLiteral<"slack">;
|
|
75
|
-
token: z.ZodString;
|
|
76
|
-
dCookie: z.ZodString;
|
|
77
|
-
}, "strip", z.ZodTypeAny, {
|
|
78
|
-
objectType: "slack";
|
|
79
|
-
token: string;
|
|
80
|
-
dCookie: string;
|
|
81
|
-
}, {
|
|
82
|
-
objectType: "slack";
|
|
83
|
-
token: string;
|
|
84
|
-
dCookie: string;
|
|
85
|
-
}>;
|
|
86
|
-
export type SlackApiCredentialsData = z.infer<typeof SlackApiCredentialsSchema>;
|
|
87
|
-
export declare class SlackApiCredentials implements ApiCredentials {
|
|
88
|
-
readonly objectType: "slack";
|
|
89
|
-
readonly token: string;
|
|
90
|
-
readonly dCookie: string;
|
|
91
|
-
constructor(token: string, dCookie: string);
|
|
92
|
-
asCurlArguments(): readonly string[];
|
|
93
|
-
isExpired(): boolean | undefined;
|
|
94
|
-
toJSON(): SlackApiCredentialsData;
|
|
95
|
-
static fromJSON(data: SlackApiCredentialsData): SlackApiCredentials;
|
|
96
|
-
}
|
|
97
74
|
/**
|
|
98
75
|
* Raw curl arguments stored directly as credentials.
|
|
99
76
|
* Allows users to manually set arbitrary curl arguments for a service.
|
|
@@ -113,7 +90,7 @@ export declare class RawCurlCredentials implements ApiCredentials {
|
|
|
113
90
|
readonly objectType: "rawCurl";
|
|
114
91
|
readonly curlArguments: readonly string[];
|
|
115
92
|
constructor(curlArguments: readonly string[]);
|
|
116
|
-
|
|
93
|
+
injectIntoCurlCall(curlArguments: readonly string[]): readonly string[];
|
|
117
94
|
isExpired(): boolean | undefined;
|
|
118
95
|
toJSON(): RawCurlCredentialsData;
|
|
119
96
|
static fromJSON(data: RawCurlCredentialsData): RawCurlCredentials;
|
|
@@ -159,7 +136,7 @@ export declare class OAuthCredentials implements ApiCredentials {
|
|
|
159
136
|
readonly accessTokenExpiresAt?: string;
|
|
160
137
|
readonly refreshTokenExpiresAt?: string;
|
|
161
138
|
constructor(clientId: string, clientSecret: string, accessToken?: string, refreshToken?: string, accessTokenExpiresAt?: string, refreshTokenExpiresAt?: string);
|
|
162
|
-
|
|
139
|
+
injectIntoCurlCall(curlArguments: readonly string[]): readonly string[];
|
|
163
140
|
isExpired(): boolean | undefined;
|
|
164
141
|
toJSON(): OAuthCredentialsData;
|
|
165
142
|
static fromJSON(data: OAuthCredentialsData): OAuthCredentials;
|
|
@@ -167,83 +144,4 @@ export declare class OAuthCredentials implements ApiCredentials {
|
|
|
167
144
|
export declare class ApiCredentialsUsageError extends Error {
|
|
168
145
|
constructor(message: string);
|
|
169
146
|
}
|
|
170
|
-
/**
|
|
171
|
-
* Union schema for all credential types.
|
|
172
|
-
*/
|
|
173
|
-
export declare const ApiCredentialsSchema: z.ZodDiscriminatedUnion<"objectType", [z.ZodObject<{
|
|
174
|
-
objectType: z.ZodLiteral<"authorizationBearer">;
|
|
175
|
-
token: z.ZodString;
|
|
176
|
-
}, "strip", z.ZodTypeAny, {
|
|
177
|
-
objectType: "authorizationBearer";
|
|
178
|
-
token: string;
|
|
179
|
-
}, {
|
|
180
|
-
objectType: "authorizationBearer";
|
|
181
|
-
token: string;
|
|
182
|
-
}>, z.ZodObject<{
|
|
183
|
-
objectType: z.ZodLiteral<"authorizationBare">;
|
|
184
|
-
token: z.ZodString;
|
|
185
|
-
}, "strip", z.ZodTypeAny, {
|
|
186
|
-
objectType: "authorizationBare";
|
|
187
|
-
token: string;
|
|
188
|
-
}, {
|
|
189
|
-
objectType: "authorizationBare";
|
|
190
|
-
token: string;
|
|
191
|
-
}>, z.ZodObject<{
|
|
192
|
-
objectType: z.ZodLiteral<"slack">;
|
|
193
|
-
token: z.ZodString;
|
|
194
|
-
dCookie: z.ZodString;
|
|
195
|
-
}, "strip", z.ZodTypeAny, {
|
|
196
|
-
objectType: "slack";
|
|
197
|
-
token: string;
|
|
198
|
-
dCookie: string;
|
|
199
|
-
}, {
|
|
200
|
-
objectType: "slack";
|
|
201
|
-
token: string;
|
|
202
|
-
dCookie: string;
|
|
203
|
-
}>, z.ZodObject<{
|
|
204
|
-
objectType: z.ZodLiteral<"oauth">;
|
|
205
|
-
accessToken: z.ZodOptional<z.ZodString>;
|
|
206
|
-
refreshToken: z.ZodOptional<z.ZodString>;
|
|
207
|
-
clientId: z.ZodString;
|
|
208
|
-
clientSecret: z.ZodString;
|
|
209
|
-
accessTokenExpiresAt: z.ZodOptional<z.ZodString>;
|
|
210
|
-
refreshTokenExpiresAt: z.ZodOptional<z.ZodString>;
|
|
211
|
-
}, "strip", z.ZodTypeAny, {
|
|
212
|
-
objectType: "oauth";
|
|
213
|
-
clientId: string;
|
|
214
|
-
clientSecret: string;
|
|
215
|
-
accessToken?: string | undefined;
|
|
216
|
-
refreshToken?: string | undefined;
|
|
217
|
-
accessTokenExpiresAt?: string | undefined;
|
|
218
|
-
refreshTokenExpiresAt?: string | undefined;
|
|
219
|
-
}, {
|
|
220
|
-
objectType: "oauth";
|
|
221
|
-
clientId: string;
|
|
222
|
-
clientSecret: string;
|
|
223
|
-
accessToken?: string | undefined;
|
|
224
|
-
refreshToken?: string | undefined;
|
|
225
|
-
accessTokenExpiresAt?: string | undefined;
|
|
226
|
-
refreshTokenExpiresAt?: string | undefined;
|
|
227
|
-
}>, z.ZodObject<{
|
|
228
|
-
objectType: z.ZodLiteral<"rawCurl">;
|
|
229
|
-
curlArguments: z.ZodArray<z.ZodString, "many">;
|
|
230
|
-
}, "strip", z.ZodTypeAny, {
|
|
231
|
-
objectType: "rawCurl";
|
|
232
|
-
curlArguments: string[];
|
|
233
|
-
}, {
|
|
234
|
-
objectType: "rawCurl";
|
|
235
|
-
curlArguments: string[];
|
|
236
|
-
}>]>;
|
|
237
|
-
export type ApiCredentialsData = z.infer<typeof ApiCredentialsSchema>;
|
|
238
|
-
/**
|
|
239
|
-
* Deserialize credentials from JSON data.
|
|
240
|
-
*/
|
|
241
|
-
export declare function deserializeCredentials(data: ApiCredentialsData): ApiCredentials;
|
|
242
|
-
/**
|
|
243
|
-
* Serialize credentials to JSON data.
|
|
244
|
-
*/
|
|
245
|
-
export declare function serializeCredentials(credentials: ApiCredentials): ApiCredentialsData;
|
|
246
|
-
export declare class ApiCredentialsSerializationError extends Error {
|
|
247
|
-
constructor(message: string);
|
|
248
|
-
}
|
|
249
147
|
//# sourceMappingURL=apiCredentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiCredentials.d.ts","sourceRoot":"","sources":["../../src/apiCredentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"apiCredentials.d.ts","sourceRoot":"","sources":["../../src/apiCredentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Base API credentials types and generic credential implementations.
|
|
4
3
|
*/
|
|
5
4
|
import { z } from 'zod';
|
|
6
5
|
export var ApiCredentialStatus;
|
|
@@ -8,6 +7,7 @@ export var ApiCredentialStatus;
|
|
|
8
7
|
ApiCredentialStatus["Missing"] = "missing";
|
|
9
8
|
ApiCredentialStatus["Valid"] = "valid";
|
|
10
9
|
ApiCredentialStatus["Invalid"] = "invalid";
|
|
10
|
+
ApiCredentialStatus["Unknown"] = "unknown";
|
|
11
11
|
})(ApiCredentialStatus || (ApiCredentialStatus = {}));
|
|
12
12
|
/**
|
|
13
13
|
* Bearer token authentication (Authorization: Bearer <token>).
|
|
@@ -22,8 +22,8 @@ export class AuthorizationBearer {
|
|
|
22
22
|
constructor(token) {
|
|
23
23
|
this.token = token;
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
return ['-H', `Authorization: Bearer ${this.token}
|
|
25
|
+
injectIntoCurlCall(curlArguments) {
|
|
26
|
+
return ['-H', `Authorization: Bearer ${this.token}`, ...curlArguments];
|
|
27
27
|
}
|
|
28
28
|
isExpired() {
|
|
29
29
|
return undefined;
|
|
@@ -51,8 +51,8 @@ export class AuthorizationBare {
|
|
|
51
51
|
constructor(token) {
|
|
52
52
|
this.token = token;
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
return ['-H', `Authorization: ${this.token}
|
|
54
|
+
injectIntoCurlCall(curlArguments) {
|
|
55
|
+
return ['-H', `Authorization: ${this.token}`, ...curlArguments];
|
|
56
56
|
}
|
|
57
57
|
isExpired() {
|
|
58
58
|
return undefined;
|
|
@@ -67,39 +67,6 @@ export class AuthorizationBare {
|
|
|
67
67
|
return new AuthorizationBare(data.token);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Slack-specific credentials (token + d cookie).
|
|
72
|
-
*/
|
|
73
|
-
export const SlackApiCredentialsSchema = z.object({
|
|
74
|
-
objectType: z.literal('slack'),
|
|
75
|
-
token: z.string(),
|
|
76
|
-
dCookie: z.string(),
|
|
77
|
-
});
|
|
78
|
-
export class SlackApiCredentials {
|
|
79
|
-
objectType = 'slack';
|
|
80
|
-
token;
|
|
81
|
-
dCookie;
|
|
82
|
-
constructor(token, dCookie) {
|
|
83
|
-
this.token = token;
|
|
84
|
-
this.dCookie = dCookie;
|
|
85
|
-
}
|
|
86
|
-
asCurlArguments() {
|
|
87
|
-
return ['-H', `Authorization: Bearer ${this.token}`, '-H', `Cookie: d=${this.dCookie}`];
|
|
88
|
-
}
|
|
89
|
-
isExpired() {
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
toJSON() {
|
|
93
|
-
return {
|
|
94
|
-
objectType: this.objectType,
|
|
95
|
-
token: this.token,
|
|
96
|
-
dCookie: this.dCookie,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
static fromJSON(data) {
|
|
100
|
-
return new SlackApiCredentials(data.token, data.dCookie);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
70
|
/**
|
|
104
71
|
* Raw curl arguments stored directly as credentials.
|
|
105
72
|
* Allows users to manually set arbitrary curl arguments for a service.
|
|
@@ -114,8 +81,8 @@ export class RawCurlCredentials {
|
|
|
114
81
|
constructor(curlArguments) {
|
|
115
82
|
this.curlArguments = curlArguments;
|
|
116
83
|
}
|
|
117
|
-
|
|
118
|
-
return this.curlArguments;
|
|
84
|
+
injectIntoCurlCall(curlArguments) {
|
|
85
|
+
return [...this.curlArguments, ...curlArguments];
|
|
119
86
|
}
|
|
120
87
|
isExpired() {
|
|
121
88
|
return undefined;
|
|
@@ -161,11 +128,11 @@ export class OAuthCredentials {
|
|
|
161
128
|
this.accessTokenExpiresAt = accessTokenExpiresAt;
|
|
162
129
|
this.refreshTokenExpiresAt = refreshTokenExpiresAt;
|
|
163
130
|
}
|
|
164
|
-
|
|
131
|
+
injectIntoCurlCall(curlArguments) {
|
|
165
132
|
if (this.accessToken === undefined) {
|
|
166
133
|
throw new ApiCredentialsUsageError('OAuth credentials missing access token. Run login to obtain access tokens.');
|
|
167
134
|
}
|
|
168
|
-
return ['-H', `Authorization: Bearer ${this.accessToken}
|
|
135
|
+
return ['-H', `Authorization: Bearer ${this.accessToken}`, ...curlArguments];
|
|
169
136
|
}
|
|
170
137
|
isExpired() {
|
|
171
138
|
if (this.accessTokenExpiresAt === undefined) {
|
|
@@ -196,62 +163,4 @@ export class ApiCredentialsUsageError extends Error {
|
|
|
196
163
|
this.name = 'ApiCredentialsUsageError';
|
|
197
164
|
}
|
|
198
165
|
}
|
|
199
|
-
/**
|
|
200
|
-
* Union schema for all credential types.
|
|
201
|
-
*/
|
|
202
|
-
export const ApiCredentialsSchema = z.discriminatedUnion('objectType', [
|
|
203
|
-
AuthorizationBearerSchema,
|
|
204
|
-
AuthorizationBareSchema,
|
|
205
|
-
SlackApiCredentialsSchema,
|
|
206
|
-
OAuthCredentialsSchema,
|
|
207
|
-
RawCurlCredentialsSchema,
|
|
208
|
-
]);
|
|
209
|
-
/**
|
|
210
|
-
* Deserialize credentials from JSON data.
|
|
211
|
-
*/
|
|
212
|
-
export function deserializeCredentials(data) {
|
|
213
|
-
switch (data.objectType) {
|
|
214
|
-
case 'authorizationBearer':
|
|
215
|
-
return AuthorizationBearer.fromJSON(data);
|
|
216
|
-
case 'authorizationBare':
|
|
217
|
-
return AuthorizationBare.fromJSON(data);
|
|
218
|
-
case 'slack':
|
|
219
|
-
return SlackApiCredentials.fromJSON(data);
|
|
220
|
-
case 'oauth':
|
|
221
|
-
return OAuthCredentials.fromJSON(data);
|
|
222
|
-
case 'rawCurl':
|
|
223
|
-
return RawCurlCredentials.fromJSON(data);
|
|
224
|
-
default: {
|
|
225
|
-
const exhaustiveCheck = data;
|
|
226
|
-
throw new ApiCredentialsSerializationError(`Unknown credential type: ${exhaustiveCheck.objectType}`);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Serialize credentials to JSON data.
|
|
232
|
-
*/
|
|
233
|
-
export function serializeCredentials(credentials) {
|
|
234
|
-
if (credentials instanceof AuthorizationBearer) {
|
|
235
|
-
return credentials.toJSON();
|
|
236
|
-
}
|
|
237
|
-
if (credentials instanceof AuthorizationBare) {
|
|
238
|
-
return credentials.toJSON();
|
|
239
|
-
}
|
|
240
|
-
if (credentials instanceof SlackApiCredentials) {
|
|
241
|
-
return credentials.toJSON();
|
|
242
|
-
}
|
|
243
|
-
if (credentials instanceof OAuthCredentials) {
|
|
244
|
-
return credentials.toJSON();
|
|
245
|
-
}
|
|
246
|
-
if (credentials instanceof RawCurlCredentials) {
|
|
247
|
-
return credentials.toJSON();
|
|
248
|
-
}
|
|
249
|
-
throw new ApiCredentialsSerializationError(`Unknown credential type: ${credentials.objectType}`);
|
|
250
|
-
}
|
|
251
|
-
export class ApiCredentialsSerializationError extends Error {
|
|
252
|
-
constructor(message) {
|
|
253
|
-
super(message);
|
|
254
|
-
this.name = 'ApiCredentialsSerializationError';
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
166
|
//# sourceMappingURL=apiCredentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiCredentials.js","sourceRoot":"","sources":["../../src/apiCredentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"apiCredentials.js","sourceRoot":"","sources":["../../src/apiCredentials.ts"],"names":[],"mappings":"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"}
|