latchkey 2.5.0 → 2.5.2
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 +3 -1
- package/dist/src/cli.js +0 -0
- package/package.json +2 -2
- package/dist/integrations/SKILL.md +0 -114
- package/dist/integrations/openclaw/SKILL.md +0 -106
- package/dist/package.json +0 -67
- package/dist/scripts/encryptFile.d.ts +0 -21
- package/dist/scripts/encryptFile.d.ts.map +0 -1
- package/dist/scripts/encryptFile.js +0 -101
- package/dist/scripts/encryptFile.js.map +0 -1
- package/dist/skills/generic/SKILL.md +0 -114
- package/dist/skills/openclaw/SKILL.md +0 -106
- package/dist/src/browserState.d.ts +0 -8
- package/dist/src/browserState.d.ts.map +0 -1
- package/dist/src/browserState.js +0 -21
- package/dist/src/browserState.js.map +0 -1
- package/dist/src/latestVersionCheck.d.ts +0 -10
- package/dist/src/latestVersionCheck.d.ts.map +0 -1
- package/dist/src/latestVersionCheck.js +0 -42
- package/dist/src/latestVersionCheck.js.map +0 -1
- package/dist/src/registeredService.d.ts +0 -20
- package/dist/src/registeredService.d.ts.map +0 -1
- package/dist/src/registeredService.js +0 -34
- package/dist/src/registeredService.js.map +0 -1
- package/dist/src/registeredServiceStore.d.ts +0 -24
- package/dist/src/registeredServiceStore.d.ts.map +0 -1
- package/dist/src/registeredServiceStore.js +0 -70
- package/dist/src/registeredServiceStore.js.map +0 -1
- package/dist/src/services/base.d.ts +0 -141
- package/dist/src/services/base.d.ts.map +0 -1
- package/dist/src/services/base.js +0 -189
- package/dist/src/services/base.js.map +0 -1
- package/dist/src/services/google/maps.d.ts +0 -39
- package/dist/src/services/google/maps.d.ts.map +0 -1
- package/dist/src/services/google/maps.js +0 -94
- package/dist/src/services/google/maps.js.map +0 -1
- package/dist/src/services/google.d.ts +0 -34
- package/dist/src/services/google.d.ts.map +0 -1
- package/dist/src/services/google.js +0 -336
- package/dist/src/services/google.js.map +0 -1
- package/dist/src/services/googleAnalytics.d.ts +0 -11
- package/dist/src/services/googleAnalytics.d.ts.map +0 -1
- package/dist/src/services/googleAnalytics.js +0 -18
- package/dist/src/services/googleAnalytics.js.map +0 -1
- package/dist/src/services/googleMaps.d.ts +0 -12
- package/dist/src/services/googleMaps.d.ts.map +0 -1
- package/dist/src/services/googleMaps.js +0 -17
- package/dist/src/services/googleMaps.js.map +0 -1
- package/dist/tests/latestVersionCheck.test.d.ts +0 -2
- package/dist/tests/latestVersionCheck.test.d.ts.map +0 -1
- package/dist/tests/latestVersionCheck.test.js +0 -80
- package/dist/tests/latestVersionCheck.test.js.map +0 -1
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ApiCredentialStatus, type ApiCredentials } from '../../apiCredentials.js';
|
|
3
|
-
import { Service } from '../base.js';
|
|
4
|
-
/**
|
|
5
|
-
* Google Maps API key credentials.
|
|
6
|
-
* The API key is injected as a `key=` query parameter in the URL.
|
|
7
|
-
*/
|
|
8
|
-
export declare const GoogleMapsApiKeyCredentialsSchema: z.ZodObject<{
|
|
9
|
-
objectType: z.ZodLiteral<"googleMapsApiKey">;
|
|
10
|
-
apiKey: z.ZodString;
|
|
11
|
-
}, "strip", z.ZodTypeAny, {
|
|
12
|
-
objectType: "googleMapsApiKey";
|
|
13
|
-
apiKey: string;
|
|
14
|
-
}, {
|
|
15
|
-
objectType: "googleMapsApiKey";
|
|
16
|
-
apiKey: string;
|
|
17
|
-
}>;
|
|
18
|
-
export type GoogleMapsApiKeyCredentialsData = z.infer<typeof GoogleMapsApiKeyCredentialsSchema>;
|
|
19
|
-
export declare class GoogleMapsApiKeyCredentials implements ApiCredentials {
|
|
20
|
-
readonly objectType: "googleMapsApiKey";
|
|
21
|
-
readonly apiKey: string;
|
|
22
|
-
constructor(apiKey: string);
|
|
23
|
-
injectIntoCurlCall(curlArguments: readonly string[]): readonly string[];
|
|
24
|
-
isExpired(): boolean | undefined;
|
|
25
|
-
toJSON(): GoogleMapsApiKeyCredentialsData;
|
|
26
|
-
static fromJSON(data: GoogleMapsApiKeyCredentialsData): GoogleMapsApiKeyCredentials;
|
|
27
|
-
}
|
|
28
|
-
export declare class GoogleMaps extends Service {
|
|
29
|
-
readonly name = "google-maps";
|
|
30
|
-
readonly displayName = "Google Maps";
|
|
31
|
-
readonly baseApiUrls: readonly ["https://maps.googleapis.com/"];
|
|
32
|
-
readonly loginUrl = "https://console.cloud.google.com/google/maps-apis/";
|
|
33
|
-
readonly info: string;
|
|
34
|
-
readonly credentialCheckCurlArguments: readonly ["https://maps.googleapis.com/maps/api/geocode/json?address=test"];
|
|
35
|
-
getCredentialsNoCurl(arguments_: readonly string[]): ApiCredentials;
|
|
36
|
-
checkApiCredentials(apiCredentials: ApiCredentials): ApiCredentialStatus;
|
|
37
|
-
}
|
|
38
|
-
export declare const GOOGLE_MAPS: GoogleMaps;
|
|
39
|
-
//# sourceMappingURL=maps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"maps.d.ts","sourceRoot":"","sources":["../../../../src/services/google/maps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAsC,OAAO,EAAE,MAAM,YAAY,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;EAG5C,CAAC;AAEH,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAEhG,qBAAa,2BAA4B,YAAW,cAAc;IAChE,QAAQ,CAAC,UAAU,EAAG,kBAAkB,CAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;IAI1B,kBAAkB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE;IAcvE,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,MAAM,IAAI,+BAA+B;IAOzC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,GAAG,2BAA2B;CAGpF;AAED,qBAAa,UAAW,SAAQ,OAAO;IACrC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,WAAW,4CAA6C;IACjE,QAAQ,CAAC,QAAQ,wDAAwD;IACzE,QAAQ,CAAC,IAAI,SAKkC;IAE/C,QAAQ,CAAC,4BAA4B,8EAE1B;IAEF,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc;IAiBnE,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB;CAiBlF;AAUD,eAAO,MAAM,WAAW,YAAmB,CAAC"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ApiCredentialStatus } from '../../apiCredentials.js';
|
|
3
|
-
import { extractUrlFromCurlArguments, runCaptured } from '../../curl.js';
|
|
4
|
-
import { NoCurlCredentialsNotSupportedError, Service } from '../base.js';
|
|
5
|
-
/**
|
|
6
|
-
* Google Maps API key credentials.
|
|
7
|
-
* The API key is injected as a `key=` query parameter in the URL.
|
|
8
|
-
*/
|
|
9
|
-
export const GoogleMapsApiKeyCredentialsSchema = z.object({
|
|
10
|
-
objectType: z.literal('googleMapsApiKey'),
|
|
11
|
-
apiKey: z.string(),
|
|
12
|
-
});
|
|
13
|
-
export class GoogleMapsApiKeyCredentials {
|
|
14
|
-
objectType = 'googleMapsApiKey';
|
|
15
|
-
apiKey;
|
|
16
|
-
constructor(apiKey) {
|
|
17
|
-
this.apiKey = apiKey;
|
|
18
|
-
}
|
|
19
|
-
injectIntoCurlCall(curlArguments) {
|
|
20
|
-
const url = extractUrlFromCurlArguments(curlArguments);
|
|
21
|
-
if (!url?.startsWith('https://maps.googleapis.com/')) {
|
|
22
|
-
return curlArguments;
|
|
23
|
-
}
|
|
24
|
-
const parsed = new URL(url);
|
|
25
|
-
if (parsed.searchParams.has('key')) {
|
|
26
|
-
return curlArguments;
|
|
27
|
-
}
|
|
28
|
-
parsed.searchParams.set('key', this.apiKey);
|
|
29
|
-
const rewrittenUrl = parsed.toString();
|
|
30
|
-
return curlArguments.map((argument) => (argument === url ? rewrittenUrl : argument));
|
|
31
|
-
}
|
|
32
|
-
isExpired() {
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
toJSON() {
|
|
36
|
-
return {
|
|
37
|
-
objectType: this.objectType,
|
|
38
|
-
apiKey: this.apiKey,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
static fromJSON(data) {
|
|
42
|
-
return new GoogleMapsApiKeyCredentials(data.apiKey);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export class GoogleMaps extends Service {
|
|
46
|
-
name = 'google-maps';
|
|
47
|
-
displayName = 'Google Maps';
|
|
48
|
-
baseApiUrls = ['https://maps.googleapis.com/'];
|
|
49
|
-
loginUrl = 'https://console.cloud.google.com/google/maps-apis/';
|
|
50
|
-
info = 'https://developers.google.com/maps/documentation. ' +
|
|
51
|
-
'Browser-based authentication is not yet supported. ' +
|
|
52
|
-
'Use `latchkey auth set-nocurl google-maps <api-key>` to add credentials. ' +
|
|
53
|
-
'Example invocation: `latchkey curl google-maps https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway` ' +
|
|
54
|
-
'(the API key will be added automatically).';
|
|
55
|
-
credentialCheckCurlArguments = [
|
|
56
|
-
'https://maps.googleapis.com/maps/api/geocode/json?address=test',
|
|
57
|
-
];
|
|
58
|
-
getCredentialsNoCurl(arguments_) {
|
|
59
|
-
if (arguments_.length !== 1 || arguments_[0] === undefined) {
|
|
60
|
-
throw new GoogleMapsCredentialError('Expected exactly one argument: the API key.\n' +
|
|
61
|
-
'Example: latchkey auth set-nocurl google-maps AIzaSyA1B2C3D4E5F6G7H8I9J0');
|
|
62
|
-
}
|
|
63
|
-
const apiKey = arguments_[0];
|
|
64
|
-
if (apiKey.length < 10) {
|
|
65
|
-
throw new GoogleMapsCredentialError("The provided key doesn't look like a Google Maps API key (too short).\n" +
|
|
66
|
-
'Example: AIzaSyA1B2C3D4E5F6G7H8I9J0');
|
|
67
|
-
}
|
|
68
|
-
return new GoogleMapsApiKeyCredentials(apiKey);
|
|
69
|
-
}
|
|
70
|
-
checkApiCredentials(apiCredentials) {
|
|
71
|
-
const allCurlArgs = apiCredentials.injectIntoCurlCall([
|
|
72
|
-
'-s',
|
|
73
|
-
'-o',
|
|
74
|
-
'/dev/null',
|
|
75
|
-
'-w',
|
|
76
|
-
'%{http_code}',
|
|
77
|
-
...this.credentialCheckCurlArguments,
|
|
78
|
-
]);
|
|
79
|
-
const result = runCaptured(allCurlArgs, 10);
|
|
80
|
-
if (result.stdout === '200') {
|
|
81
|
-
return ApiCredentialStatus.Valid;
|
|
82
|
-
}
|
|
83
|
-
return ApiCredentialStatus.Invalid;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
class GoogleMapsCredentialError extends NoCurlCredentialsNotSupportedError {
|
|
87
|
-
constructor(message) {
|
|
88
|
-
super('google-maps');
|
|
89
|
-
this.message = message;
|
|
90
|
-
this.name = 'GoogleMapsCredentialError';
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
export const GOOGLE_MAPS = new GoogleMaps();
|
|
94
|
-
//# sourceMappingURL=maps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"maps.js","sourceRoot":"","sources":["../../../../src/services/google/maps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google service implementation with OAuth flow.
|
|
3
|
-
*/
|
|
4
|
-
import type { Browser, BrowserContext, Response } from 'playwright';
|
|
5
|
-
import { ApiCredentials } from '../apiCredentials.js';
|
|
6
|
-
import { type BrowserLaunchOptions } from '../playwrightUtils.js';
|
|
7
|
-
import { Service, BrowserFollowupServiceSession } from './base.js';
|
|
8
|
-
import type { EncryptedStorage } from '../encryptedStorage.js';
|
|
9
|
-
declare class GoogleServiceSession extends BrowserFollowupServiceSession {
|
|
10
|
-
private readonly loginDetector;
|
|
11
|
-
onResponse(response: Response): void;
|
|
12
|
-
protected isLoginComplete(): boolean;
|
|
13
|
-
/**
|
|
14
|
-
* Override to skip the spinner page since the OAuth flow requires user interaction
|
|
15
|
-
* (granting consent on Google's authorization page).
|
|
16
|
-
*/
|
|
17
|
-
protected finalizeCredentials(_browser: Browser, context: BrowserContext, oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
18
|
-
protected performBrowserFollowup(context: BrowserContext, oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
19
|
-
prepare(encryptedStorage: EncryptedStorage, launchOptions?: BrowserLaunchOptions): Promise<ApiCredentials>;
|
|
20
|
-
private performOAuthFlow;
|
|
21
|
-
}
|
|
22
|
-
export declare class Google extends Service {
|
|
23
|
-
readonly name = "google";
|
|
24
|
-
readonly displayName = "Google Workspace";
|
|
25
|
-
readonly baseApiUrls: readonly ["https://www.googleapis.com/"];
|
|
26
|
-
readonly loginUrl = "https://console.cloud.google.com/";
|
|
27
|
-
readonly info: string;
|
|
28
|
-
readonly credentialCheckCurlArguments: readonly ["https://www.googleapis.com/oauth2/v1/userinfo"];
|
|
29
|
-
getSession(): GoogleServiceSession;
|
|
30
|
-
refreshCredentials(apiCredentials: ApiCredentials): Promise<ApiCredentials | null>;
|
|
31
|
-
}
|
|
32
|
-
export declare const GOOGLE: Google;
|
|
33
|
-
export {};
|
|
34
|
-
//# sourceMappingURL=google.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/services/google.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAQ,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAoB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,OAAO,EACP,6BAA6B,EAI9B,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAqQ/D,cAAM,oBAAqB,SAAQ,6BAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIpC,SAAS,CAAC,eAAe,IAAI,OAAO;IAIpC;;;OAGG;cACgB,mBAAmB,CACpC,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;cAIjB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAgClB,OAAO,CACpB,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,CAAC,EAAE,oBAAoB,GACnC,OAAO,CAAC,cAAc,CAAC;YAmBZ,gBAAgB;CAqE/B;AAED,qBAAa,MAAO,SAAQ,OAAO;IACjC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,sBAAsB;IAC1C,QAAQ,CAAC,WAAW,2CAA4C;IAChE,QAAQ,CAAC,QAAQ,uCAAuC;IACxD,QAAQ,CAAC,IAAI,SAG0D;IAEvE,QAAQ,CAAC,4BAA4B,6DAE1B;IAEF,UAAU,IAAI,oBAAoB;IAIlC,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAoC5F;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google service implementation with OAuth flow.
|
|
3
|
-
*/
|
|
4
|
-
import fs from 'node:fs/promises';
|
|
5
|
-
import { OAuthCredentials } from '../apiCredentials.js';
|
|
6
|
-
import { generateLatchkeyAppName, showSpinnerPage, withTempBrowserContext, } from '../playwrightUtils.js';
|
|
7
|
-
import { exchangeCodeForTokens, refreshAccessToken, startOAuthCallbackServer, } from '../oauthUtils.js';
|
|
8
|
-
import { Service, BrowserFollowupServiceSession, LoginFailedError, LoginCancelledError, isBrowserClosedError, } from './base.js';
|
|
9
|
-
const DEFAULT_TIMEOUT_MS = 8000;
|
|
10
|
-
const LOGIN_TIMEOUT_MS = 120000;
|
|
11
|
-
const GOOGLE_TOKEN_ENDPOINT = 'https://oauth2.googleapis.com/token';
|
|
12
|
-
const APIS = [
|
|
13
|
-
'gmail.googleapis.com',
|
|
14
|
-
'calendar-json.googleapis.com',
|
|
15
|
-
'drive.googleapis.com',
|
|
16
|
-
'sheets.googleapis.com',
|
|
17
|
-
'docs.googleapis.com',
|
|
18
|
-
'people.googleapis.com', // Contacts API
|
|
19
|
-
];
|
|
20
|
-
const OAUTH_SCOPES = [
|
|
21
|
-
// User info (for credential validation)
|
|
22
|
-
'https://www.googleapis.com/auth/userinfo.profile',
|
|
23
|
-
'https://www.googleapis.com/auth/userinfo.email',
|
|
24
|
-
// Gmail API
|
|
25
|
-
'https://www.googleapis.com/auth/gmail.readonly',
|
|
26
|
-
'https://www.googleapis.com/auth/gmail.modify',
|
|
27
|
-
'https://www.googleapis.com/auth/gmail.compose',
|
|
28
|
-
'https://www.googleapis.com/auth/gmail.send',
|
|
29
|
-
// Calendar API
|
|
30
|
-
'https://www.googleapis.com/auth/calendar',
|
|
31
|
-
'https://www.googleapis.com/auth/calendar.events',
|
|
32
|
-
// Drive API
|
|
33
|
-
'https://www.googleapis.com/auth/drive',
|
|
34
|
-
'https://www.googleapis.com/auth/drive.file',
|
|
35
|
-
// Sheets API
|
|
36
|
-
'https://www.googleapis.com/auth/spreadsheets',
|
|
37
|
-
// Docs API
|
|
38
|
-
'https://www.googleapis.com/auth/documents',
|
|
39
|
-
// Contacts API
|
|
40
|
-
'https://www.googleapis.com/auth/contacts',
|
|
41
|
-
'https://www.googleapis.com/auth/contacts.readonly',
|
|
42
|
-
];
|
|
43
|
-
/**
|
|
44
|
-
* Parse client_secret.json content.
|
|
45
|
-
*/
|
|
46
|
-
function parseClientSecretJson(content) {
|
|
47
|
-
try {
|
|
48
|
-
const json = JSON.parse(content);
|
|
49
|
-
const config = json.installed ?? json.web;
|
|
50
|
-
if (!config) {
|
|
51
|
-
throw new LoginFailedError('Invalid client_secret.json: missing "installed" or "web" configuration.');
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
clientId: config.client_id,
|
|
55
|
-
clientSecret: config.client_secret,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
if (error instanceof LoginFailedError) {
|
|
60
|
-
throw error;
|
|
61
|
-
}
|
|
62
|
-
throw new LoginFailedError(`Failed to parse client_secret.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
async function createProject(page) {
|
|
66
|
-
// Navigate to the projects page
|
|
67
|
-
await page.goto('https://console.cloud.google.com/projectselector2/home/dashboard', {
|
|
68
|
-
timeout: DEFAULT_TIMEOUT_MS,
|
|
69
|
-
});
|
|
70
|
-
// Always create a new project
|
|
71
|
-
const createProjectButton = page.locator('.projectselector-project-create');
|
|
72
|
-
await createProjectButton.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
73
|
-
await createProjectButton.click();
|
|
74
|
-
const projectNameInput = page.locator('proj-name-id-input input');
|
|
75
|
-
await projectNameInput.waitFor({ timeout: DEFAULT_TIMEOUT_MS * 100 });
|
|
76
|
-
await projectNameInput.fill(generateLatchkeyAppName());
|
|
77
|
-
const createButton = page.locator('button[type="submit"]');
|
|
78
|
-
await createButton.click();
|
|
79
|
-
await page.waitForURL('https://console.cloud.google.com/home/dashboard?project=**', {
|
|
80
|
-
timeout: 16000,
|
|
81
|
-
});
|
|
82
|
-
const urlObj = new URL(page.url());
|
|
83
|
-
const projectId = urlObj.searchParams.get('project');
|
|
84
|
-
if (!projectId) {
|
|
85
|
-
throw new LoginFailedError('Failed to create or retrieve Google Cloud project ID.');
|
|
86
|
-
}
|
|
87
|
-
return projectId;
|
|
88
|
-
}
|
|
89
|
-
async function enableApis(page, projectSlug) {
|
|
90
|
-
for (const api of APIS) {
|
|
91
|
-
await enableApi(page, projectSlug, api);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
async function enableApi(page, projectSlug, apiName) {
|
|
95
|
-
await page.goto(`https://console.cloud.google.com/apis/library/${apiName}?project=${projectSlug}`, {
|
|
96
|
-
timeout: DEFAULT_TIMEOUT_MS,
|
|
97
|
-
});
|
|
98
|
-
const successIcon = page.locator('.cfc-icon-status-success'); // Present when API is already enabled.
|
|
99
|
-
const enableButton = page
|
|
100
|
-
.locator('.mp-details-cta-button-primary button .mdc-button__label')
|
|
101
|
-
.filter({ visible: true });
|
|
102
|
-
const sucessOrEnableButton = successIcon.or(enableButton);
|
|
103
|
-
await sucessOrEnableButton.isVisible({ timeout: DEFAULT_TIMEOUT_MS });
|
|
104
|
-
if (await successIcon.isVisible()) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
await enableButton.click();
|
|
108
|
-
const stopIndicator = page.locator('.cfc-icon-stop');
|
|
109
|
-
await stopIndicator.waitFor({ timeout: 18000 });
|
|
110
|
-
}
|
|
111
|
-
async function configureBranding(page, projectSlug) {
|
|
112
|
-
await page.goto(`https://console.cloud.google.com/auth/branding?project=${projectSlug}`, {
|
|
113
|
-
timeout: DEFAULT_TIMEOUT_MS,
|
|
114
|
-
});
|
|
115
|
-
const getStartedButton = page.locator('cfc-empty-state-actions .mdc-button__label');
|
|
116
|
-
await getStartedButton.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
117
|
-
await getStartedButton.click();
|
|
118
|
-
const appNameInput = page.locator('input[formcontrolname="displayName"]');
|
|
119
|
-
await appNameInput.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
120
|
-
await appNameInput.fill(generateLatchkeyAppName());
|
|
121
|
-
const emailSelector = page.locator('svg[data-icon-name="arrowDropDownIcon"]').nth(0);
|
|
122
|
-
await emailSelector.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
123
|
-
await emailSelector.click();
|
|
124
|
-
const supportEmailOption = page.locator('mat-option > span:nth-child(1)').first();
|
|
125
|
-
await supportEmailOption.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
126
|
-
const supportEmailValue = await supportEmailOption.textContent();
|
|
127
|
-
await supportEmailOption.click();
|
|
128
|
-
const nextButton = page.locator('.cfc-stepper-step-button');
|
|
129
|
-
await nextButton.click();
|
|
130
|
-
const internalAudienceRadio = page.locator('.mdc-radio').nth(0);
|
|
131
|
-
await internalAudienceRadio.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
132
|
-
await internalAudienceRadio.click();
|
|
133
|
-
await nextButton.click();
|
|
134
|
-
const contactEmailInput = page.locator('mat-chip-grid[formcontrolname="emails"] input');
|
|
135
|
-
await contactEmailInput.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
136
|
-
await contactEmailInput.fill(supportEmailValue ?? '');
|
|
137
|
-
await nextButton.click();
|
|
138
|
-
const agreeCheckbox = page.locator('input[type="checkbox"]');
|
|
139
|
-
await agreeCheckbox.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
140
|
-
await agreeCheckbox.click();
|
|
141
|
-
await nextButton.click();
|
|
142
|
-
const createButton = page.locator('.cfc-stepper-submit-button button');
|
|
143
|
-
await createButton.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
144
|
-
await createButton.click();
|
|
145
|
-
}
|
|
146
|
-
async function createOAuthClient(page) {
|
|
147
|
-
// Navigate to credentials page
|
|
148
|
-
await page.goto('https://console.cloud.google.com/apis/credentials', {
|
|
149
|
-
timeout: DEFAULT_TIMEOUT_MS,
|
|
150
|
-
});
|
|
151
|
-
// Click "Create Credentials" button
|
|
152
|
-
const createCredentialsButton = page.locator('services-create-credentials-menu button');
|
|
153
|
-
await createCredentialsButton.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
154
|
-
await createCredentialsButton.click();
|
|
155
|
-
// Click "OAuth client ID"
|
|
156
|
-
const oauthClientIdOption = page.locator('cfc-menu-item[track-metadata-type="OAUTH_CLIENT"]');
|
|
157
|
-
await oauthClientIdOption.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
158
|
-
await oauthClientIdOption.click();
|
|
159
|
-
const applicationTypeDropdown = page.locator('svg[data-icon-name="arrowDropDownIcon"]').nth(0);
|
|
160
|
-
await applicationTypeDropdown.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
161
|
-
await applicationTypeDropdown.click();
|
|
162
|
-
const desktopAppOption = page.locator('#_1rif_mat-option-5');
|
|
163
|
-
await desktopAppOption.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
164
|
-
await desktopAppOption.click();
|
|
165
|
-
const clientNameInput = page.locator('input[formcontrolname="displayName"]');
|
|
166
|
-
await clientNameInput.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
167
|
-
await clientNameInput.fill(generateLatchkeyAppName());
|
|
168
|
-
// Click Create
|
|
169
|
-
const createButton = page.locator('cfc-progress-button button');
|
|
170
|
-
await createButton.click();
|
|
171
|
-
// Download the JSON file
|
|
172
|
-
const downloadButton = page.locator('cfc-icon[icon="download"]');
|
|
173
|
-
await downloadButton.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
174
|
-
const [download] = await Promise.all([page.waitForEvent('download'), downloadButton.click()]);
|
|
175
|
-
const path = await download.path();
|
|
176
|
-
if (!path) {
|
|
177
|
-
throw new LoginFailedError('Failed to download client_secret.json');
|
|
178
|
-
}
|
|
179
|
-
const content = await fs.readFile(path, 'utf-8');
|
|
180
|
-
return parseClientSecretJson(content);
|
|
181
|
-
}
|
|
182
|
-
function checkGoogleLoginResponse(response, loginDetector) {
|
|
183
|
-
if (loginDetector.isLoggedIn) {
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
const request = response.request();
|
|
187
|
-
// Detect successful login by checking for Google account access
|
|
188
|
-
if (request.url().startsWith('https://console.cloud.google.com/')) {
|
|
189
|
-
if (response.status() === 200) {
|
|
190
|
-
void response.text().then((text) => {
|
|
191
|
-
// Check if we're actually logged in (not on login page)
|
|
192
|
-
if (!text.includes('accounts.google.com/signin')) {
|
|
193
|
-
loginDetector.isLoggedIn = true;
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
async function waitForGoogleLogin(page) {
|
|
200
|
-
const loginDetector = { isLoggedIn: false };
|
|
201
|
-
const responseHandler = (response) => {
|
|
202
|
-
checkGoogleLoginResponse(response, loginDetector);
|
|
203
|
-
};
|
|
204
|
-
page.on('response', responseHandler);
|
|
205
|
-
while (!loginDetector.isLoggedIn) {
|
|
206
|
-
await page.waitForTimeout(100);
|
|
207
|
-
}
|
|
208
|
-
page.off('response', responseHandler);
|
|
209
|
-
}
|
|
210
|
-
class GoogleServiceSession extends BrowserFollowupServiceSession {
|
|
211
|
-
loginDetector = { isLoggedIn: false };
|
|
212
|
-
onResponse(response) {
|
|
213
|
-
checkGoogleLoginResponse(response, this.loginDetector);
|
|
214
|
-
}
|
|
215
|
-
isLoginComplete() {
|
|
216
|
-
return this.loginDetector.isLoggedIn;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Override to skip the spinner page since the OAuth flow requires user interaction
|
|
220
|
-
* (granting consent on Google's authorization page).
|
|
221
|
-
*/
|
|
222
|
-
finalizeCredentials(_browser, context, oldCredentials) {
|
|
223
|
-
return this.performBrowserFollowup(context, oldCredentials);
|
|
224
|
-
}
|
|
225
|
-
async performBrowserFollowup(context, oldCredentials) {
|
|
226
|
-
const page = context.pages()[0];
|
|
227
|
-
if (!page) {
|
|
228
|
-
throw new LoginFailedError('No page available in browser context.');
|
|
229
|
-
}
|
|
230
|
-
// Require existing credentials with client ID and secret
|
|
231
|
-
if (!(oldCredentials instanceof OAuthCredentials)) {
|
|
232
|
-
throw new LoginFailedError('Google login requires existing OAuth client credentials. Run browser-prepare first.');
|
|
233
|
-
}
|
|
234
|
-
const clientId = oldCredentials.clientId;
|
|
235
|
-
const clientSecret = oldCredentials.clientSecret;
|
|
236
|
-
// Perform OAuth flow with localhost server
|
|
237
|
-
const { accessToken, refreshToken, accessTokenExpiresAt, refreshTokenExpiresAt } = await this.performOAuthFlow(context, page, clientId, clientSecret);
|
|
238
|
-
await page.close();
|
|
239
|
-
return new OAuthCredentials(clientId, clientSecret, accessToken, refreshToken, accessTokenExpiresAt, refreshTokenExpiresAt);
|
|
240
|
-
}
|
|
241
|
-
async prepare(encryptedStorage, launchOptions) {
|
|
242
|
-
return withTempBrowserContext(encryptedStorage, launchOptions ?? {}, async ({ context }) => {
|
|
243
|
-
const page = await context.newPage();
|
|
244
|
-
await page.goto(this.service.loginUrl);
|
|
245
|
-
await waitForGoogleLogin(page);
|
|
246
|
-
await showSpinnerPage(context, `Finalizing ${this.service.displayName} login...\nThis can take a few minutes.`);
|
|
247
|
-
const projectSlug = await createProject(page);
|
|
248
|
-
await enableApis(page, projectSlug);
|
|
249
|
-
await configureBranding(page, projectSlug);
|
|
250
|
-
const { clientId, clientSecret } = await createOAuthClient(page);
|
|
251
|
-
await page.close();
|
|
252
|
-
return new OAuthCredentials(clientId, clientSecret);
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
async performOAuthFlow(context, page, clientId, clientSecret) {
|
|
256
|
-
// Use an AbortController to signal the OAuth callback server to shut down
|
|
257
|
-
// when the browser is closed. Listen to both page and context close events
|
|
258
|
-
// to handle all cases where the user might close the browser.
|
|
259
|
-
const abortController = new AbortController();
|
|
260
|
-
const closeHandler = () => {
|
|
261
|
-
abortController.abort();
|
|
262
|
-
};
|
|
263
|
-
page.on('close', closeHandler);
|
|
264
|
-
context.on('close', closeHandler);
|
|
265
|
-
try {
|
|
266
|
-
// Start the callback server first to get the auto-assigned port
|
|
267
|
-
const { port, codePromise } = await startOAuthCallbackServer(LOGIN_TIMEOUT_MS, abortController.signal);
|
|
268
|
-
const redirectUri = `http://localhost:${port.toString()}/oauth2callback`;
|
|
269
|
-
const authUrl = new URL('https://accounts.google.com/o/oauth2/v2/auth');
|
|
270
|
-
authUrl.searchParams.set('client_id', clientId);
|
|
271
|
-
authUrl.searchParams.set('redirect_uri', redirectUri);
|
|
272
|
-
authUrl.searchParams.set('response_type', 'code');
|
|
273
|
-
authUrl.searchParams.set('scope', OAUTH_SCOPES.join(' '));
|
|
274
|
-
authUrl.searchParams.set('access_type', 'offline');
|
|
275
|
-
authUrl.searchParams.set('prompt', 'consent');
|
|
276
|
-
await page.goto(authUrl.toString());
|
|
277
|
-
// Wait for the authorization code from the callback
|
|
278
|
-
const code = await codePromise;
|
|
279
|
-
const tokens = exchangeCodeForTokens(GOOGLE_TOKEN_ENDPOINT, code, clientId, clientSecret, redirectUri);
|
|
280
|
-
const accessTokenExpiresAt = new Date(Date.now() + tokens.expires_in * 1000).toISOString();
|
|
281
|
-
// Google refresh tokens typically don't expire, so we don't set refreshTokenExpiresAt
|
|
282
|
-
return {
|
|
283
|
-
accessToken: tokens.access_token,
|
|
284
|
-
// exchangeCodeForTokens() guarantees refresh_token is present
|
|
285
|
-
refreshToken: tokens.refresh_token,
|
|
286
|
-
accessTokenExpiresAt,
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
if (error instanceof Error && isBrowserClosedError(error)) {
|
|
291
|
-
throw new LoginCancelledError();
|
|
292
|
-
}
|
|
293
|
-
throw error;
|
|
294
|
-
}
|
|
295
|
-
finally {
|
|
296
|
-
// Remove the close handlers to prevent them from firing when context
|
|
297
|
-
// is closed normally during cleanup
|
|
298
|
-
page.off('close', closeHandler);
|
|
299
|
-
context.off('close', closeHandler);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
export class Google extends Service {
|
|
304
|
-
name = 'google';
|
|
305
|
-
displayName = 'Google Workspace';
|
|
306
|
-
baseApiUrls = ['https://www.googleapis.com/'];
|
|
307
|
-
loginUrl = 'https://console.cloud.google.com/';
|
|
308
|
-
info = 'Supports some Google Workspace APIs: Gmail, Calendar, Drive, Sheets, Docs, and Contacts. ' +
|
|
309
|
-
'If needed, run "latchkey auth browser-prepare google" to create an OAuth client first. ' +
|
|
310
|
-
'It may take a few minutes before the OAuth client is ready to use.';
|
|
311
|
-
credentialCheckCurlArguments = [
|
|
312
|
-
'https://www.googleapis.com/oauth2/v1/userinfo',
|
|
313
|
-
];
|
|
314
|
-
getSession() {
|
|
315
|
-
return new GoogleServiceSession(this);
|
|
316
|
-
}
|
|
317
|
-
refreshCredentials(apiCredentials) {
|
|
318
|
-
if (!(apiCredentials instanceof OAuthCredentials)) {
|
|
319
|
-
return Promise.resolve(null);
|
|
320
|
-
}
|
|
321
|
-
if (!apiCredentials.refreshToken) {
|
|
322
|
-
return Promise.resolve(null);
|
|
323
|
-
}
|
|
324
|
-
const tokens = refreshAccessToken(GOOGLE_TOKEN_ENDPOINT, apiCredentials.refreshToken, apiCredentials.clientId, apiCredentials.clientSecret);
|
|
325
|
-
if (tokens === null) {
|
|
326
|
-
return Promise.resolve(null);
|
|
327
|
-
}
|
|
328
|
-
// Calculate access token expiration from the expires_in field
|
|
329
|
-
const accessTokenExpiresAt = new Date(Date.now() + tokens.expires_in * 1000).toISOString();
|
|
330
|
-
// Return new credentials with refreshed access token
|
|
331
|
-
// Keep the same refresh token unless a new one is provided
|
|
332
|
-
return Promise.resolve(new OAuthCredentials(apiCredentials.clientId, apiCredentials.clientSecret, tokens.access_token, tokens.refresh_token ?? apiCredentials.refreshToken, accessTokenExpiresAt, apiCredentials.refreshTokenExpiresAt));
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
export const GOOGLE = new Google();
|
|
336
|
-
//# sourceMappingURL=google.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/services/google.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Service } from './base.js';
|
|
2
|
-
export declare class GoogleAnalytics extends Service {
|
|
3
|
-
readonly name = "google-analytics";
|
|
4
|
-
readonly displayName = "Google Analytics";
|
|
5
|
-
readonly baseApiUrls: readonly ["https://analyticsdata.googleapis.com/", "https://analyticsadmin.googleapis.com/"];
|
|
6
|
-
readonly loginUrl = "https://analytics.google.com/";
|
|
7
|
-
readonly info: string;
|
|
8
|
-
readonly credentialCheckCurlArguments: readonly ["https://analyticsadmin.googleapis.com/v1beta/accountSummaries"];
|
|
9
|
-
}
|
|
10
|
-
export declare const GOOGLE_ANALYTICS: GoogleAnalytics;
|
|
11
|
-
//# sourceMappingURL=googleAnalytics.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"googleAnalytics.d.ts","sourceRoot":"","sources":["../../../src/services/googleAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,qBAAa,eAAgB,SAAQ,OAAO;IAC1C,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,WAAW,sBAAsB;IAC1C,QAAQ,CAAC,WAAW,+FAGT;IACX,QAAQ,CAAC,QAAQ,mCAAmC;IACpD,QAAQ,CAAC,IAAI,SAGgG;IAE7G,QAAQ,CAAC,4BAA4B,6EAE1B;CACZ;AAED,eAAO,MAAM,gBAAgB,iBAAwB,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Service } from './base.js';
|
|
2
|
-
export class GoogleAnalytics extends Service {
|
|
3
|
-
name = 'google-analytics';
|
|
4
|
-
displayName = 'Google Analytics';
|
|
5
|
-
baseApiUrls = [
|
|
6
|
-
'https://analyticsdata.googleapis.com/',
|
|
7
|
-
'https://analyticsadmin.googleapis.com/',
|
|
8
|
-
];
|
|
9
|
-
loginUrl = 'https://analytics.google.com/';
|
|
10
|
-
info = 'https://developers.google.com/analytics/devguides/reporting/data/v1. ' +
|
|
11
|
-
'Browser-based authentication is not yet supported. ' +
|
|
12
|
-
'Use `latchkey auth set google-analytics -H "Authorization: Bearer <token>"` to add credentials manually.';
|
|
13
|
-
credentialCheckCurlArguments = [
|
|
14
|
-
'https://analyticsadmin.googleapis.com/v1beta/accountSummaries',
|
|
15
|
-
];
|
|
16
|
-
}
|
|
17
|
-
export const GOOGLE_ANALYTICS = new GoogleAnalytics();
|
|
18
|
-
//# sourceMappingURL=googleAnalytics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"googleAnalytics.js","sourceRoot":"","sources":["../../../src/services/googleAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,OAAO,eAAgB,SAAQ,OAAO;IACjC,IAAI,GAAG,kBAAkB,CAAC;IAC1B,WAAW,GAAG,kBAAkB,CAAC;IACjC,WAAW,GAAG;QACrB,uCAAuC;QACvC,wCAAwC;KAChC,CAAC;IACF,QAAQ,GAAG,+BAA+B,CAAC;IAC3C,IAAI,GACX,uEAAuE;QACvE,qDAAqD;QACrD,0GAA0G,CAAC;IAEpG,4BAA4B,GAAG;QACtC,+DAA+D;KACvD,CAAC;CACZ;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Service } from './base.js';
|
|
2
|
-
/** Work in progress — not yet registered in the service registry. */
|
|
3
|
-
export declare class GoogleMaps extends Service {
|
|
4
|
-
readonly name = "google-maps";
|
|
5
|
-
readonly displayName = "Google Maps";
|
|
6
|
-
readonly baseApiUrls: readonly ["https://maps.googleapis.com/"];
|
|
7
|
-
readonly loginUrl = "https://console.cloud.google.com/google/maps-apis/";
|
|
8
|
-
readonly info: string;
|
|
9
|
-
readonly credentialCheckCurlArguments: readonly ["https://maps.googleapis.com/maps/api/geocode/json?address=test"];
|
|
10
|
-
}
|
|
11
|
-
export declare const GOOGLE_MAPS: GoogleMaps;
|
|
12
|
-
//# sourceMappingURL=googleMaps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"googleMaps.d.ts","sourceRoot":"","sources":["../../../src/services/googleMaps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,qEAAqE;AACrE,qBAAa,UAAW,SAAQ,OAAO;IACrC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,WAAW,4CAA6C;IACjE,QAAQ,CAAC,QAAQ,wDAAwD;IACzE,QAAQ,CAAC,IAAI,SAIgD;IAE7D,QAAQ,CAAC,4BAA4B,8EAE1B;CACZ;AAED,eAAO,MAAM,WAAW,YAAmB,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Service } from './base.js';
|
|
2
|
-
/** Work in progress — not yet registered in the service registry. */
|
|
3
|
-
export class GoogleMaps extends Service {
|
|
4
|
-
name = 'google-maps';
|
|
5
|
-
displayName = 'Google Maps';
|
|
6
|
-
baseApiUrls = ['https://maps.googleapis.com/'];
|
|
7
|
-
loginUrl = 'https://console.cloud.google.com/google/maps-apis/';
|
|
8
|
-
info = 'https://developers.google.com/maps/documentation. ' +
|
|
9
|
-
'Browser-based authentication is not yet supported. ' +
|
|
10
|
-
'Use `latchkey auth set google-maps -H "X-Goog-Api-Key: <key>"` to add credentials manually. ' +
|
|
11
|
-
'Only a subset of the APIs accept API keys in the header.';
|
|
12
|
-
credentialCheckCurlArguments = [
|
|
13
|
-
'https://maps.googleapis.com/maps/api/geocode/json?address=test',
|
|
14
|
-
];
|
|
15
|
-
}
|
|
16
|
-
export const GOOGLE_MAPS = new GoogleMaps();
|
|
17
|
-
//# sourceMappingURL=googleMaps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"googleMaps.js","sourceRoot":"","sources":["../../../src/services/googleMaps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,qEAAqE;AACrE,MAAM,OAAO,UAAW,SAAQ,OAAO;IAC5B,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,aAAa,CAAC;IAC5B,WAAW,GAAG,CAAC,8BAA8B,CAAU,CAAC;IACxD,QAAQ,GAAG,oDAAoD,CAAC;IAChE,IAAI,GACX,oDAAoD;QACpD,qDAAqD;QACrD,8FAA8F;QAC9F,0DAA0D,CAAC;IAEpD,4BAA4B,GAAG;QACtC,gEAAgE;KACxD,CAAC;CACZ;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"latestVersionCheck.test.d.ts","sourceRoot":"","sources":["../../tests/latestVersionCheck.test.ts"],"names":[],"mappings":""}
|