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
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence for user-registered services in config.json.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { dirname } from 'node:path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { RegisteredService } from './registeredService.js';
|
|
8
|
+
const RegisteredServiceEntrySchema = z.object({
|
|
9
|
+
baseApiUrl: z.string(),
|
|
10
|
+
serviceFamily: z.string(),
|
|
11
|
+
loginUrl: z.string().optional(),
|
|
12
|
+
});
|
|
13
|
+
const RegisteredServicesSchema = z.record(z.string(), RegisteredServiceEntrySchema);
|
|
14
|
+
export function loadRegisteredServices(configPath) {
|
|
15
|
+
if (!existsSync(configPath)) {
|
|
16
|
+
return new Map();
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
20
|
+
const data = JSON.parse(content);
|
|
21
|
+
if (typeof data !== 'object' || data === null) {
|
|
22
|
+
return new Map();
|
|
23
|
+
}
|
|
24
|
+
const record = data;
|
|
25
|
+
const registeredServices = RegisteredServicesSchema.parse(record.registeredServices ?? {});
|
|
26
|
+
return new Map(Object.entries(registeredServices));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return new Map();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function saveRegisteredService(configPath, name, entry) {
|
|
33
|
+
const directory = dirname(configPath);
|
|
34
|
+
if (!existsSync(directory)) {
|
|
35
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
36
|
+
}
|
|
37
|
+
let existingConfig = {};
|
|
38
|
+
if (existsSync(configPath)) {
|
|
39
|
+
try {
|
|
40
|
+
const existingContent = readFileSync(configPath, 'utf-8');
|
|
41
|
+
existingConfig = JSON.parse(existingContent);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Ignore parse errors, start fresh
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const registeredServices = typeof existingConfig.registeredServices === 'object' &&
|
|
48
|
+
existingConfig.registeredServices !== null
|
|
49
|
+
? existingConfig.registeredServices
|
|
50
|
+
: {};
|
|
51
|
+
registeredServices[name] = entry;
|
|
52
|
+
existingConfig.registeredServices = registeredServices;
|
|
53
|
+
const content = JSON.stringify(existingConfig, null, 2);
|
|
54
|
+
writeFileSync(configPath, content, { encoding: 'utf-8' });
|
|
55
|
+
}
|
|
56
|
+
export function loadRegisteredServicesIntoRegistry(configPath, registry) {
|
|
57
|
+
const entries = loadRegisteredServices(configPath);
|
|
58
|
+
for (const [name, entry] of entries) {
|
|
59
|
+
const familyService = registry.getByName(entry.serviceFamily);
|
|
60
|
+
if (familyService === null) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (registry.getByName(name) !== null) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const registeredService = new RegisteredService(name, entry.baseApiUrl, familyService, entry.loginUrl);
|
|
67
|
+
registry.addService(registeredService);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=registeredServiceStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registeredServiceStore.js","sourceRoot":"","sources":["../../src/registeredServiceStore.ts"],"names":[],"mappings":"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"}
|
package/dist/src/registry.d.ts
CHANGED
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
* Service registry for looking up services by name or URL.
|
|
3
3
|
*/
|
|
4
4
|
import { Service } from './services/index.js';
|
|
5
|
+
export declare class DuplicateServiceNameError extends Error {
|
|
6
|
+
constructor(name: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class InvalidServiceNameError extends Error {
|
|
9
|
+
constructor(name: string);
|
|
10
|
+
}
|
|
11
|
+
export declare function canonicalizeServiceName(name: string): string;
|
|
5
12
|
export declare class Registry {
|
|
6
|
-
|
|
13
|
+
private readonly _services;
|
|
7
14
|
constructor(services: readonly Service[]);
|
|
15
|
+
get services(): readonly Service[];
|
|
16
|
+
addService(service: Service): void;
|
|
8
17
|
getByName(name: string): Service | null;
|
|
9
18
|
getByUrl(url: string): Service | null;
|
|
10
19
|
}
|
|
20
|
+
export declare function loadRegisteredServicesIntoRegistry(configPath: string, registry: Registry): void;
|
|
11
21
|
export declare const REGISTRY: Registry;
|
|
12
22
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACL,OAAO,EAyBR,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,IAAI,EAAE,MAAM;CAMzB;AAID,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,QAAQ,EAAE,SAAS,OAAO,EAAE;IAIxC,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IASvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;CAgBtC;AAED,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAqB/F;AAED,eAAO,MAAM,QAAQ,UAyBnB,CAAC"}
|
package/dist/src/registry.js
CHANGED
|
@@ -1,14 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Service registry for looking up services by name or URL.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { loadRegisteredServices } from './configDataStore.js';
|
|
5
|
+
import { RegisteredService } from './services/core/registered.js';
|
|
6
|
+
import { SLACK, DISCORD, DROPBOX, GITHUB, LINEAR, NOTION, GOOGLE_GMAIL, GOOGLE_CALENDAR, GOOGLE_DRIVE, GOOGLE_SHEETS, GOOGLE_DOCS, GOOGLE_PEOPLE, MAILCHIMP, GITLAB, ZOOM, SENTRY, STRIPE, FIGMA, GOOGLE_ANALYTICS, CALENDLY, YELP, TELEGRAM, AWS, GOOGLE_DIRECTIONS, } from './services/index.js';
|
|
7
|
+
export class DuplicateServiceNameError extends Error {
|
|
8
|
+
constructor(name) {
|
|
9
|
+
super(`A service with the name '${name}' already exists.`);
|
|
10
|
+
this.name = 'DuplicateServiceNameError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class InvalidServiceNameError extends Error {
|
|
14
|
+
constructor(name) {
|
|
15
|
+
super(`Invalid service name '${name}'. Names must contain only lowercase letters, digits, hyphens, and underscores.`);
|
|
16
|
+
this.name = 'InvalidServiceNameError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const SERVICE_NAME_PATTERN = /^[a-z0-9][a-z0-9_-]*$/;
|
|
20
|
+
export function canonicalizeServiceName(name) {
|
|
21
|
+
const canonicalized = name.toLowerCase().replace(/\s+/g, '-');
|
|
22
|
+
if (!SERVICE_NAME_PATTERN.test(canonicalized)) {
|
|
23
|
+
throw new InvalidServiceNameError(name);
|
|
24
|
+
}
|
|
25
|
+
return canonicalized;
|
|
26
|
+
}
|
|
5
27
|
export class Registry {
|
|
6
|
-
|
|
28
|
+
_services;
|
|
7
29
|
constructor(services) {
|
|
8
|
-
this.
|
|
30
|
+
this._services = [...services];
|
|
31
|
+
}
|
|
32
|
+
get services() {
|
|
33
|
+
return this._services;
|
|
34
|
+
}
|
|
35
|
+
addService(service) {
|
|
36
|
+
if (this.getByName(service.name) !== null) {
|
|
37
|
+
throw new DuplicateServiceNameError(service.name);
|
|
38
|
+
}
|
|
39
|
+
this._services.push(service);
|
|
9
40
|
}
|
|
10
41
|
getByName(name) {
|
|
11
|
-
for (const service of this.
|
|
42
|
+
for (const service of this._services) {
|
|
12
43
|
if (service.name === name) {
|
|
13
44
|
return service;
|
|
14
45
|
}
|
|
@@ -16,7 +47,7 @@ export class Registry {
|
|
|
16
47
|
return null;
|
|
17
48
|
}
|
|
18
49
|
getByUrl(url) {
|
|
19
|
-
for (const service of this.
|
|
50
|
+
for (const service of this._services) {
|
|
20
51
|
for (const baseApiUrl of service.baseApiUrls) {
|
|
21
52
|
if (typeof baseApiUrl === 'string') {
|
|
22
53
|
if (url.startsWith(baseApiUrl)) {
|
|
@@ -33,6 +64,23 @@ export class Registry {
|
|
|
33
64
|
return null;
|
|
34
65
|
}
|
|
35
66
|
}
|
|
67
|
+
export function loadRegisteredServicesIntoRegistry(configPath, registry) {
|
|
68
|
+
const entries = loadRegisteredServices(configPath);
|
|
69
|
+
for (const [name, entry] of entries) {
|
|
70
|
+
let familyService;
|
|
71
|
+
if (entry.serviceFamily !== undefined) {
|
|
72
|
+
familyService = registry.getByName(entry.serviceFamily) ?? undefined;
|
|
73
|
+
if (familyService === undefined) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (registry.getByName(name) !== null) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const registeredService = new RegisteredService(name, entry.baseApiUrl, familyService, entry.loginUrl);
|
|
81
|
+
registry.addService(registeredService);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
36
84
|
export const REGISTRY = new Registry([
|
|
37
85
|
SLACK,
|
|
38
86
|
DISCORD,
|
|
@@ -40,7 +88,23 @@ export const REGISTRY = new Registry([
|
|
|
40
88
|
GITHUB,
|
|
41
89
|
LINEAR,
|
|
42
90
|
NOTION,
|
|
43
|
-
|
|
91
|
+
GOOGLE_GMAIL,
|
|
92
|
+
GOOGLE_CALENDAR,
|
|
93
|
+
GOOGLE_DRIVE,
|
|
94
|
+
GOOGLE_SHEETS,
|
|
95
|
+
GOOGLE_DOCS,
|
|
96
|
+
GOOGLE_PEOPLE,
|
|
44
97
|
MAILCHIMP,
|
|
98
|
+
GITLAB,
|
|
99
|
+
ZOOM,
|
|
100
|
+
SENTRY,
|
|
101
|
+
STRIPE,
|
|
102
|
+
FIGMA,
|
|
103
|
+
GOOGLE_ANALYTICS,
|
|
104
|
+
CALENDLY,
|
|
105
|
+
YELP,
|
|
106
|
+
TELEGRAM,
|
|
107
|
+
AWS,
|
|
108
|
+
GOOGLE_DIRECTIONS,
|
|
45
109
|
]);
|
|
46
110
|
//# sourceMappingURL=registry.js.map
|
package/dist/src/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type ApiCredentials } from '../apiCredentials.js';
|
|
3
|
+
import { Service } from './core/base.js';
|
|
4
|
+
/**
|
|
5
|
+
* AWS credentials using Signature Version 4 request signing.
|
|
6
|
+
* Stores an access key ID and secret access key, and signs each request
|
|
7
|
+
* by computing the Authorization, x-amz-date, and x-amz-content-sha256 headers.
|
|
8
|
+
*/
|
|
9
|
+
export declare const AwsCredentialsSchema: z.ZodObject<{
|
|
10
|
+
objectType: z.ZodLiteral<"aws">;
|
|
11
|
+
accessKeyId: z.ZodString;
|
|
12
|
+
secretAccessKey: z.ZodString;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
objectType: "aws";
|
|
15
|
+
accessKeyId: string;
|
|
16
|
+
secretAccessKey: string;
|
|
17
|
+
}, {
|
|
18
|
+
objectType: "aws";
|
|
19
|
+
accessKeyId: string;
|
|
20
|
+
secretAccessKey: string;
|
|
21
|
+
}>;
|
|
22
|
+
export type AwsCredentialsData = z.infer<typeof AwsCredentialsSchema>;
|
|
23
|
+
export declare class AwsCredentials implements ApiCredentials {
|
|
24
|
+
readonly objectType: "aws";
|
|
25
|
+
readonly accessKeyId: string;
|
|
26
|
+
readonly secretAccessKey: string;
|
|
27
|
+
constructor(accessKeyId: string, secretAccessKey: string);
|
|
28
|
+
injectIntoCurlCall(curlArguments: readonly string[]): readonly string[];
|
|
29
|
+
isExpired(): boolean | undefined;
|
|
30
|
+
toJSON(): AwsCredentialsData;
|
|
31
|
+
static fromJSON(data: AwsCredentialsData): AwsCredentials;
|
|
32
|
+
}
|
|
33
|
+
export declare class Aws extends Service {
|
|
34
|
+
readonly name = "aws";
|
|
35
|
+
readonly displayName = "AWS";
|
|
36
|
+
readonly baseApiUrls: readonly [RegExp];
|
|
37
|
+
readonly loginUrl = "https://console.aws.amazon.com/";
|
|
38
|
+
readonly info = "https://docs.aws.amazon.com/.";
|
|
39
|
+
readonly credentialCheckCurlArguments: readonly ["https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15"];
|
|
40
|
+
setCredentialsExample(serviceName: string): string;
|
|
41
|
+
getCredentialsNoCurl(arguments_: readonly string[]): ApiCredentials;
|
|
42
|
+
}
|
|
43
|
+
export declare const AWS: Aws;
|
|
44
|
+
//# sourceMappingURL=aws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../../src/services/aws.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAO3D,OAAO,EAAsC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAI/B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAkMtE,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,UAAU,EAAG,KAAK,CAAU;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;gBAErB,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAKxD,kBAAkB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE;IAuBvE,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,MAAM,IAAI,kBAAkB;IAQ5B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc;CAG1D;AAED,qBAAa,GAAI,SAAQ,OAAO;IAC9B,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,SAAS;IAC7B,QAAQ,CAAC,WAAW,oBAAmD;IACvE,QAAQ,CAAC,QAAQ,qCAAqC;IACtD,QAAQ,CAAC,IAAI,mCAAmC;IAEhD,QAAQ,CAAC,4BAA4B,sFAE1B;IAEX,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc;CAkB7E;AAUD,eAAO,MAAM,GAAG,KAAY,CAAC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { createHash, createHmac } from 'node:crypto';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { extractBodyFromCurlArguments, extractHeadersFromCurlArguments, extractMethodFromCurlArguments, extractUrlFromCurlArguments, } from '../curl.js';
|
|
4
|
+
import { NoCurlCredentialsNotSupportedError, Service } from './core/base.js';
|
|
5
|
+
/**
|
|
6
|
+
* AWS credentials using Signature Version 4 request signing.
|
|
7
|
+
* Stores an access key ID and secret access key, and signs each request
|
|
8
|
+
* by computing the Authorization, x-amz-date, and x-amz-content-sha256 headers.
|
|
9
|
+
*/
|
|
10
|
+
export const AwsCredentialsSchema = z.object({
|
|
11
|
+
objectType: z.literal('aws'),
|
|
12
|
+
accessKeyId: z.string(),
|
|
13
|
+
secretAccessKey: z.string(),
|
|
14
|
+
});
|
|
15
|
+
function sha256Hex(data) {
|
|
16
|
+
return createHash('sha256').update(data, 'utf-8').digest('hex');
|
|
17
|
+
}
|
|
18
|
+
function hmacSha256(key, message) {
|
|
19
|
+
return createHmac('sha256', key).update(message, 'utf-8').digest();
|
|
20
|
+
}
|
|
21
|
+
function hmacSha256Hex(key, message) {
|
|
22
|
+
return createHmac('sha256', key).update(message, 'utf-8').digest('hex');
|
|
23
|
+
}
|
|
24
|
+
/** URI-encode per RFC 3986: unreserved chars A-Za-z0-9 - _ . ~ are left as-is. */
|
|
25
|
+
function awsUriEncode(value, encodeSlash) {
|
|
26
|
+
const result = [];
|
|
27
|
+
for (const character of value) {
|
|
28
|
+
if ((character >= 'A' && character <= 'Z') ||
|
|
29
|
+
(character >= 'a' && character <= 'z') ||
|
|
30
|
+
(character >= '0' && character <= '9') ||
|
|
31
|
+
character === '-' ||
|
|
32
|
+
character === '_' ||
|
|
33
|
+
character === '.' ||
|
|
34
|
+
character === '~') {
|
|
35
|
+
result.push(character);
|
|
36
|
+
}
|
|
37
|
+
else if (character === '/' && !encodeSlash) {
|
|
38
|
+
result.push('/');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
for (const byte of Buffer.from(character, 'utf-8')) {
|
|
42
|
+
result.push('%' + byte.toString(16).toUpperCase().padStart(2, '0'));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return result.join('');
|
|
47
|
+
}
|
|
48
|
+
function deriveSigningKey(secretAccessKey, datestamp, region, service) {
|
|
49
|
+
const kDate = hmacSha256(Buffer.from('AWS4' + secretAccessKey, 'utf-8'), datestamp);
|
|
50
|
+
const kRegion = hmacSha256(kDate, region);
|
|
51
|
+
const kService = hmacSha256(kRegion, service);
|
|
52
|
+
return hmacSha256(kService, 'aws4_request');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Detect the AWS region and service from a hostname like "sts.us-east-1.amazonaws.com"
|
|
56
|
+
* or "s3.amazonaws.com" or "bedrock-runtime.us-west-2.amazonaws.com".
|
|
57
|
+
*/
|
|
58
|
+
function parseAwsHostname(hostname) {
|
|
59
|
+
// Strip ".amazonaws.com" suffix
|
|
60
|
+
const suffix = '.amazonaws.com';
|
|
61
|
+
if (!hostname.endsWith(suffix)) {
|
|
62
|
+
return { region: 'us-east-1', service: 'execute-api' };
|
|
63
|
+
}
|
|
64
|
+
const prefix = hostname.slice(0, -suffix.length);
|
|
65
|
+
// Patterns: "service.region", "service", "region.service" (for S3)
|
|
66
|
+
const parts = prefix.split('.');
|
|
67
|
+
// S3 virtual-hosted-style: "bucket.s3.amazonaws.com" or
|
|
68
|
+
// "bucket.s3.us-west-2.amazonaws.com". Strip the bucket prefix so the
|
|
69
|
+
// remaining parts describe only service (+ optional region).
|
|
70
|
+
const s3Index = parts.indexOf('s3');
|
|
71
|
+
if (s3Index > 0) {
|
|
72
|
+
const afterS3 = parts.slice(s3Index + 1);
|
|
73
|
+
if (afterS3.length === 0) {
|
|
74
|
+
// bucket.s3.amazonaws.com → default region
|
|
75
|
+
return { region: 'us-east-1', service: 's3' };
|
|
76
|
+
}
|
|
77
|
+
// bucket.s3.us-west-2.amazonaws.com
|
|
78
|
+
return { region: afterS3[0], service: 's3' };
|
|
79
|
+
}
|
|
80
|
+
if (parts.length === 1) {
|
|
81
|
+
// e.g., "sts" → global service, default region
|
|
82
|
+
return { region: 'us-east-1', service: parts[0] };
|
|
83
|
+
}
|
|
84
|
+
if (parts.length === 2) {
|
|
85
|
+
// e.g., "sts.us-east-1" or "s3.us-west-2"
|
|
86
|
+
// Heuristic: if second part looks like a region (contains a dash and digit)
|
|
87
|
+
if (/^[a-z]{2}-[a-z]+-\d+$/.test(parts[1])) {
|
|
88
|
+
return { region: parts[1], service: parts[0] };
|
|
89
|
+
}
|
|
90
|
+
// e.g., "us-east-1.s3" (S3 path-style)
|
|
91
|
+
if (/^[a-z]{2}-[a-z]+-\d+$/.test(parts[0])) {
|
|
92
|
+
return { region: parts[0], service: parts[1] };
|
|
93
|
+
}
|
|
94
|
+
// Fallback: first is service, second is region
|
|
95
|
+
return { region: parts[1], service: parts[0] };
|
|
96
|
+
}
|
|
97
|
+
// 3+ parts: e.g., "bedrock-runtime.us-west-2" split further
|
|
98
|
+
// Try to find the region-like part
|
|
99
|
+
for (let i = 1; i < parts.length; i++) {
|
|
100
|
+
if (/^[a-z]{2}-[a-z]+-\d+$/.test(parts[i])) {
|
|
101
|
+
return { region: parts[i], service: parts.slice(0, i).join('.') };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { region: 'us-east-1', service: parts[0] };
|
|
105
|
+
}
|
|
106
|
+
function signAwsRequest(method, url, existingHeaders, body, accessKeyId, secretAccessKey) {
|
|
107
|
+
const { region, service } = parseAwsHostname(url.hostname);
|
|
108
|
+
const now = new Date();
|
|
109
|
+
const amzDate = now
|
|
110
|
+
.toISOString()
|
|
111
|
+
.replace(/[-:]/g, '')
|
|
112
|
+
.replace(/\.\d+Z$/, 'Z');
|
|
113
|
+
const datestamp = amzDate.slice(0, 8);
|
|
114
|
+
const payloadHash = sha256Hex(body);
|
|
115
|
+
// Build headers to sign
|
|
116
|
+
const headersToSign = {
|
|
117
|
+
host: url.host,
|
|
118
|
+
'x-amz-date': amzDate,
|
|
119
|
+
'x-amz-content-sha256': payloadHash,
|
|
120
|
+
};
|
|
121
|
+
// Include content-type if present
|
|
122
|
+
if (existingHeaders['content-type'] !== undefined) {
|
|
123
|
+
headersToSign['content-type'] = existingHeaders['content-type'];
|
|
124
|
+
}
|
|
125
|
+
const signedHeaderNames = Object.keys(headersToSign).sort();
|
|
126
|
+
const signedHeadersString = signedHeaderNames.join(';');
|
|
127
|
+
// Step 1: Canonical request
|
|
128
|
+
const canonicalUri = awsUriEncode(decodeURIComponent(url.pathname || '/'), false);
|
|
129
|
+
const queryParameters = [];
|
|
130
|
+
url.searchParams.forEach((value, key) => {
|
|
131
|
+
queryParameters.push([awsUriEncode(key, true), awsUriEncode(value, true)]);
|
|
132
|
+
});
|
|
133
|
+
queryParameters.sort((a, b) => a[0].localeCompare(b[0]) || a[1].localeCompare(b[1]));
|
|
134
|
+
const canonicalQueryString = queryParameters.map(([k, v]) => `${k}=${v}`).join('&');
|
|
135
|
+
const canonicalHeaders = signedHeaderNames.map((name) => `${name}:${headersToSign[name].trim()}`).join('\n') + '\n';
|
|
136
|
+
const canonicalRequest = [
|
|
137
|
+
method,
|
|
138
|
+
canonicalUri,
|
|
139
|
+
canonicalQueryString,
|
|
140
|
+
canonicalHeaders,
|
|
141
|
+
signedHeadersString,
|
|
142
|
+
payloadHash,
|
|
143
|
+
].join('\n');
|
|
144
|
+
// Step 2: String to sign
|
|
145
|
+
const credentialScope = `${datestamp}/${region}/${service}/aws4_request`;
|
|
146
|
+
const stringToSign = [
|
|
147
|
+
'AWS4-HMAC-SHA256',
|
|
148
|
+
amzDate,
|
|
149
|
+
credentialScope,
|
|
150
|
+
sha256Hex(canonicalRequest),
|
|
151
|
+
].join('\n');
|
|
152
|
+
// Step 3: Signature
|
|
153
|
+
const signingKey = deriveSigningKey(secretAccessKey, datestamp, region, service);
|
|
154
|
+
const signature = hmacSha256Hex(signingKey, stringToSign);
|
|
155
|
+
// Step 4: Authorization header
|
|
156
|
+
const authorization = `AWS4-HMAC-SHA256 Credential=${accessKeyId}/${credentialScope}, ` +
|
|
157
|
+
`SignedHeaders=${signedHeadersString}, ` +
|
|
158
|
+
`Signature=${signature}`;
|
|
159
|
+
return [
|
|
160
|
+
'-H',
|
|
161
|
+
`Authorization: ${authorization}`,
|
|
162
|
+
'-H',
|
|
163
|
+
`x-amz-date: ${amzDate}`,
|
|
164
|
+
'-H',
|
|
165
|
+
`x-amz-content-sha256: ${payloadHash}`,
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
export class AwsCredentials {
|
|
169
|
+
objectType = 'aws';
|
|
170
|
+
accessKeyId;
|
|
171
|
+
secretAccessKey;
|
|
172
|
+
constructor(accessKeyId, secretAccessKey) {
|
|
173
|
+
this.accessKeyId = accessKeyId;
|
|
174
|
+
this.secretAccessKey = secretAccessKey;
|
|
175
|
+
}
|
|
176
|
+
injectIntoCurlCall(curlArguments) {
|
|
177
|
+
const url = extractUrlFromCurlArguments(curlArguments);
|
|
178
|
+
if (url === null) {
|
|
179
|
+
return curlArguments;
|
|
180
|
+
}
|
|
181
|
+
const method = extractMethodFromCurlArguments(curlArguments);
|
|
182
|
+
const body = extractBodyFromCurlArguments(curlArguments);
|
|
183
|
+
const existingHeaders = extractHeadersFromCurlArguments(curlArguments);
|
|
184
|
+
const parsedUrl = new URL(url);
|
|
185
|
+
const signingHeaders = signAwsRequest(method, parsedUrl, existingHeaders, body, this.accessKeyId, this.secretAccessKey);
|
|
186
|
+
return [...signingHeaders, ...curlArguments];
|
|
187
|
+
}
|
|
188
|
+
isExpired() {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
toJSON() {
|
|
192
|
+
return {
|
|
193
|
+
objectType: this.objectType,
|
|
194
|
+
accessKeyId: this.accessKeyId,
|
|
195
|
+
secretAccessKey: this.secretAccessKey,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
static fromJSON(data) {
|
|
199
|
+
return new AwsCredentials(data.accessKeyId, data.secretAccessKey);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export class Aws extends Service {
|
|
203
|
+
name = 'aws';
|
|
204
|
+
displayName = 'AWS';
|
|
205
|
+
baseApiUrls = [/^https:\/\/[^/]*\.amazonaws\.com\//];
|
|
206
|
+
loginUrl = 'https://console.aws.amazon.com/';
|
|
207
|
+
info = 'https://docs.aws.amazon.com/.';
|
|
208
|
+
credentialCheckCurlArguments = [
|
|
209
|
+
'https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15',
|
|
210
|
+
];
|
|
211
|
+
setCredentialsExample(serviceName) {
|
|
212
|
+
return `latchkey auth set-nocurl ${serviceName} <access-key-id> <secret-access-key>`;
|
|
213
|
+
}
|
|
214
|
+
getCredentialsNoCurl(arguments_) {
|
|
215
|
+
if (arguments_.length !== 2 || arguments_[0] === undefined || arguments_[1] === undefined) {
|
|
216
|
+
throw new AwsCredentialError('Expected exactly two arguments: <access-key-id> <secret-access-key>.\n' +
|
|
217
|
+
'Example: latchkey auth set-nocurl aws <access-key-id> <secret-access-key>');
|
|
218
|
+
}
|
|
219
|
+
const accessKeyId = arguments_[0];
|
|
220
|
+
const secretAccessKey = arguments_[1];
|
|
221
|
+
if (!accessKeyId.startsWith('AKIA') && !accessKeyId.startsWith('ASIA')) {
|
|
222
|
+
throw new AwsCredentialError("The provided access key ID doesn't look like an AWS access key ID " +
|
|
223
|
+
'(expected to start with AKIA or ASIA).\n' +
|
|
224
|
+
'Example: <access-key-id>');
|
|
225
|
+
}
|
|
226
|
+
return new AwsCredentials(accessKeyId, secretAccessKey);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
class AwsCredentialError extends NoCurlCredentialsNotSupportedError {
|
|
230
|
+
constructor(message) {
|
|
231
|
+
super('aws');
|
|
232
|
+
this.message = message;
|
|
233
|
+
this.name = 'AwsCredentialError';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export const AWS = new Aws();
|
|
237
|
+
//# sourceMappingURL=aws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../src/services/aws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;CAC5B,CAAC,CAAC;AAIH,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,OAAe;IAC9C,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,OAAe;IACjD,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,kFAAkF;AAClF,SAAS,YAAY,CAAC,KAAa,EAAE,WAAoB;IACvD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,IACE,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;YACtC,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;YACtC,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;YACtC,SAAS,KAAK,GAAG;YACjB,SAAS,KAAK,GAAG;YACjB,SAAS,KAAK,GAAG;YACjB,SAAS,KAAK,GAAG,EACjB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CACvB,eAAuB,EACvB,SAAiB,EACjB,MAAc,EACd,OAAe;IAEf,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,gCAAgC;IAChC,MAAM,MAAM,GAAG,gBAAgB,CAAC;IAChC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IACzD,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEjD,mEAAmE;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEhC,wDAAwD;IACxD,sEAAsE;IACtE,6DAA6D;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,2CAA2C;YAC3C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;QACD,oCAAoC;QACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,+CAA+C;QAC/C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,0CAA0C;QAC1C,4EAA4E;QAC5E,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;QACnD,CAAC;QACD,uCAAuC;QACvC,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;QACnD,CAAC;QACD,+CAA+C;QAC/C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;IACnD,CAAC;IAED,4DAA4D;IAC5D,mCAAmC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CACrB,MAAc,EACd,GAAQ,EACR,eAAuC,EACvC,IAAY,EACZ,WAAmB,EACnB,eAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEpC,wBAAwB;IACxB,MAAM,aAAa,GAA2B;QAC5C,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,YAAY,EAAE,OAAO;QACrB,sBAAsB,EAAE,WAAW;KACpC,CAAC;IAEF,kCAAkC;IAClC,IAAI,eAAe,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE,CAAC;QAClD,aAAa,CAAC,cAAc,CAAC,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExD,4BAA4B;IAC5B,MAAM,YAAY,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAElF,MAAM,eAAe,GAAuB,EAAE,CAAC;IAC/C,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtC,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,oBAAoB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpF,MAAM,gBAAgB,GACpB,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC,IAAI,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE9F,MAAM,gBAAgB,GAAG;QACvB,MAAM;QACN,YAAY;QACZ,oBAAoB;QACpB,gBAAgB;QAChB,mBAAmB;QACnB,WAAW;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,yBAAyB;IACzB,MAAM,eAAe,GAAG,GAAG,SAAS,IAAI,MAAM,IAAI,OAAO,eAAe,CAAC;IACzE,MAAM,YAAY,GAAG;QACnB,kBAAkB;QAClB,OAAO;QACP,eAAe;QACf,SAAS,CAAC,gBAAgB,CAAC;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,oBAAoB;IACpB,MAAM,UAAU,GAAG,gBAAgB,CAAC,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAE1D,+BAA+B;IAC/B,MAAM,aAAa,GACjB,+BAA+B,WAAW,IAAI,eAAe,IAAI;QACjE,iBAAiB,mBAAmB,IAAI;QACxC,aAAa,SAAS,EAAE,CAAC;IAE3B,OAAO;QACL,IAAI;QACJ,kBAAkB,aAAa,EAAE;QACjC,IAAI;QACJ,eAAe,OAAO,EAAE;QACxB,IAAI;QACJ,yBAAyB,WAAW,EAAE;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,cAAc;IAChB,UAAU,GAAG,KAAc,CAAC;IAC5B,WAAW,CAAS;IACpB,eAAe,CAAS;IAEjC,YAAY,WAAmB,EAAE,eAAuB;QACtD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,kBAAkB,CAAC,aAAgC;QACjD,MAAM,GAAG,GAAG,2BAA2B,CAAC,aAAyB,CAAC,CAAC;QACnE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,MAAM,MAAM,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,4BAA4B,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,eAAe,GAAG,+BAA+B,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,MAAM,cAAc,GAAG,cAAc,CACnC,MAAM,EACN,SAAS,EACT,eAAe,EACf,IAAI,EACJ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,eAAe,CACrB,CAAC;QAEF,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAwB;QACtC,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACpE,CAAC;CACF;AAED,MAAM,OAAO,GAAI,SAAQ,OAAO;IACrB,IAAI,GAAG,KAAK,CAAC;IACb,WAAW,GAAG,KAAK,CAAC;IACpB,WAAW,GAAG,CAAC,oCAAoC,CAAU,CAAC;IAC9D,QAAQ,GAAG,iCAAiC,CAAC;IAC7C,IAAI,GAAG,+BAA+B,CAAC;IAEvC,4BAA4B,GAAG;QACtC,wEAAwE;KAChE,CAAC;IAEX,qBAAqB,CAAC,WAAmB;QACvC,OAAO,4BAA4B,WAAW,sCAAsC,CAAC;IACvF,CAAC;IAEQ,oBAAoB,CAAC,UAA6B;QACzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1F,MAAM,IAAI,kBAAkB,CAC1B,wEAAwE;gBACtE,2EAA2E,CAC9E,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,kBAAkB,CAC1B,oEAAoE;gBAClE,0CAA0C;gBAC1C,0BAA0B,CAC7B,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,kBAAmB,SAAQ,kCAAkC;IACjE,YAAY,OAAe;QACzB,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC"}
|
|
@@ -5,6 +5,9 @@ import type { Browser, BrowserContext, Response } from 'playwright';
|
|
|
5
5
|
import { ApiCredentialStatus, ApiCredentials } from '../apiCredentials.js';
|
|
6
6
|
import { EncryptedStorage } from '../encryptedStorage.js';
|
|
7
7
|
import { type BrowserLaunchOptions } from '../playwrightUtils.js';
|
|
8
|
+
export declare class NoCurlCredentialsNotSupportedError extends Error {
|
|
9
|
+
constructor(serviceName: string);
|
|
10
|
+
}
|
|
8
11
|
export declare class LoginCancelledError extends Error {
|
|
9
12
|
constructor(message?: string);
|
|
10
13
|
}
|
|
@@ -32,6 +35,17 @@ export declare abstract class Service {
|
|
|
32
35
|
* Check if the given API credentials are valid for this service.
|
|
33
36
|
*/
|
|
34
37
|
checkApiCredentials(apiCredentials: ApiCredentials): ApiCredentialStatus;
|
|
38
|
+
/**
|
|
39
|
+
* Return an example showing how to set credentials for this service via the CLI.
|
|
40
|
+
* The service name is passed as a parameter (not baked in) so the same example
|
|
41
|
+
* can be reused for aliased services in the future.
|
|
42
|
+
*/
|
|
43
|
+
abstract setCredentialsExample(serviceName: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Set credentials from arbitrary (non-curl) arguments.
|
|
46
|
+
* Services that support this should override to validate and return typed credentials.
|
|
47
|
+
*/
|
|
48
|
+
getCredentialsNoCurl(_arguments: readonly string[]): ApiCredentials;
|
|
35
49
|
/**
|
|
36
50
|
* Get a new session for the login flow.
|
|
37
51
|
* Services that don't support browser login should not implement this method.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/services/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAQ,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAwD;CAI5E;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,SAAiD;CAIrE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAU1D;AAMD;;GAEG;AACH,8BAAsB,OAAO;IAC3B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC5D,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAC;IAElE;;OAEG;IACH,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/services/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
import { ApiCredentialStatus, ApiCredentialsUsageError, } from '../apiCredentials.js';
|
|
5
5
|
import { runCaptured } from '../curl.js';
|
|
6
6
|
import { showSpinnerPage, withTempBrowserContext, } from '../playwrightUtils.js';
|
|
7
|
+
export class NoCurlCredentialsNotSupportedError extends Error {
|
|
8
|
+
constructor(serviceName) {
|
|
9
|
+
super(`Service '${serviceName}' does not support set-nocurl credentials.`);
|
|
10
|
+
this.name = 'NoCurlCredentialsNotSupportedError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
7
13
|
export class LoginCancelledError extends Error {
|
|
8
14
|
constructor(message = 'Login was cancelled because the browser was closed.') {
|
|
9
15
|
super(message);
|
|
@@ -36,9 +42,16 @@ export class Service {
|
|
|
36
42
|
* Check if the given API credentials are valid for this service.
|
|
37
43
|
*/
|
|
38
44
|
checkApiCredentials(apiCredentials) {
|
|
39
|
-
let
|
|
45
|
+
let allCurlArgs;
|
|
40
46
|
try {
|
|
41
|
-
|
|
47
|
+
allCurlArgs = apiCredentials.injectIntoCurlCall([
|
|
48
|
+
'-s',
|
|
49
|
+
'-o',
|
|
50
|
+
'/dev/null',
|
|
51
|
+
'-w',
|
|
52
|
+
'%{http_code}',
|
|
53
|
+
...this.credentialCheckCurlArguments,
|
|
54
|
+
]);
|
|
42
55
|
}
|
|
43
56
|
catch (error) {
|
|
44
57
|
if (error instanceof ApiCredentialsUsageError) {
|
|
@@ -46,20 +59,19 @@ export class Service {
|
|
|
46
59
|
}
|
|
47
60
|
throw error;
|
|
48
61
|
}
|
|
49
|
-
const result = runCaptured(
|
|
50
|
-
'-s',
|
|
51
|
-
'-o',
|
|
52
|
-
'/dev/null',
|
|
53
|
-
'-w',
|
|
54
|
-
'%{http_code}',
|
|
55
|
-
...curlArgs,
|
|
56
|
-
...this.credentialCheckCurlArguments,
|
|
57
|
-
], 10);
|
|
62
|
+
const result = runCaptured(allCurlArgs, 10);
|
|
58
63
|
if (result.stdout === '200') {
|
|
59
64
|
return ApiCredentialStatus.Valid;
|
|
60
65
|
}
|
|
61
66
|
return ApiCredentialStatus.Invalid;
|
|
62
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Set credentials from arbitrary (non-curl) arguments.
|
|
70
|
+
* Services that support this should override to validate and return typed credentials.
|
|
71
|
+
*/
|
|
72
|
+
getCredentialsNoCurl(_arguments) {
|
|
73
|
+
throw new NoCurlCredentialsNotSupportedError(this.name);
|
|
74
|
+
}
|
|
63
75
|
}
|
|
64
76
|
/**
|
|
65
77
|
* Base class for service sessions that handle browser-based interactions.
|