alchemy 0.46.0 → 0.47.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/bin/alchemy.mjs +713 -255
- package/bin/commands/login.ts +2 -5
- package/lib/build-date.d.ts +1 -1
- package/lib/build-date.js +1 -1
- package/lib/cloudflare/api.d.ts +9 -5
- package/lib/cloudflare/api.d.ts.map +1 -1
- package/lib/cloudflare/api.js +6 -46
- package/lib/cloudflare/api.js.map +1 -1
- package/lib/cloudflare/auth.d.ts +16 -35
- package/lib/cloudflare/auth.d.ts.map +1 -1
- package/lib/cloudflare/auth.js +54 -24
- package/lib/cloudflare/auth.js.map +1 -1
- package/lib/cloudflare/{auth-wrangler.d.ts → oauth.d.ts} +11 -14
- package/lib/cloudflare/oauth.d.ts.map +1 -0
- package/lib/cloudflare/{auth-wrangler.js → oauth.js} +101 -111
- package/lib/cloudflare/oauth.js.map +1 -0
- package/lib/cloudflare/user.d.ts +1 -1
- package/lib/cloudflare/user.d.ts.map +1 -1
- package/lib/cloudflare/user.js +20 -29
- package/lib/cloudflare/user.js.map +1 -1
- package/lib/cloudflare/worker-metadata.d.ts +6 -0
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
- package/lib/cloudflare/worker-metadata.js +1 -0
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +27 -1
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +8 -3
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/zone.d.ts +1 -1
- package/lib/cloudflare/zone.d.ts.map +1 -1
- package/lib/cloudflare/zone.js +38 -56
- package/lib/cloudflare/zone.js.map +1 -1
- package/lib/util/memoize.d.ts +0 -1
- package/lib/util/memoize.d.ts.map +1 -1
- package/lib/util/memoize.js +0 -13
- package/lib/util/memoize.js.map +1 -1
- package/lib/util/neverthrow.d.ts +7 -0
- package/lib/util/neverthrow.d.ts.map +1 -1
- package/lib/util/neverthrow.js +17 -0
- package/lib/util/neverthrow.js.map +1 -1
- package/lib/util/telemetry/constants.js +2 -2
- package/lib/util/telemetry/constants.js.map +1 -1
- package/package.json +2 -1
- package/src/build-date.ts +1 -1
- package/src/cloudflare/api.ts +18 -57
- package/src/cloudflare/auth.ts +84 -68
- package/src/cloudflare/{auth-wrangler.ts → oauth.ts} +156 -169
- package/src/cloudflare/user.ts +33 -51
- package/src/cloudflare/worker-metadata.ts +7 -0
- package/src/cloudflare/worker.ts +40 -4
- package/src/cloudflare/zone.ts +50 -70
- package/src/util/memoize.ts +0 -17
- package/src/util/neverthrow.ts +28 -0
- package/src/util/telemetry/constants.ts +2 -2
- package/lib/cloudflare/auth-wrangler.d.ts.map +0 -1
- package/lib/cloudflare/auth-wrangler.js.map +0 -1
- package/lib/util/xdg-paths.d.ts +0 -9
- package/lib/util/xdg-paths.d.ts.map +0 -1
- package/lib/util/xdg-paths.js +0 -41
- package/lib/util/xdg-paths.js.map +0 -1
- package/src/util/xdg-paths.ts +0 -48
package/bin/commands/login.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { cancel, intro, log, outro } from "@clack/prompts";
|
|
2
2
|
import pc from "picocolors";
|
|
3
|
-
import z from "
|
|
4
|
-
import {
|
|
5
|
-
DEFAULT_SCOPES,
|
|
6
|
-
wranglerLogin,
|
|
7
|
-
} from "../../src/cloudflare/auth-wrangler.ts";
|
|
3
|
+
import { zod as z } from "trpc-cli";
|
|
4
|
+
import { DEFAULT_SCOPES, wranglerLogin } from "../../src/cloudflare/oauth.ts";
|
|
8
5
|
import { throwWithContext } from "../errors.ts";
|
|
9
6
|
import { t } from "../trpc.ts";
|
|
10
7
|
|
package/lib/build-date.d.ts
CHANGED
package/lib/build-date.js
CHANGED
package/lib/cloudflare/api.d.ts
CHANGED
|
@@ -29,22 +29,24 @@ export interface CloudflareApiOptions {
|
|
|
29
29
|
*/
|
|
30
30
|
email?: string;
|
|
31
31
|
}
|
|
32
|
+
/** Used to propagate normalized auth options from a parent resource to `createCloudflareApi` in a child resource */
|
|
33
|
+
export type InternalCloudflareApiOptions = CloudflareAuthOptions & {
|
|
34
|
+
baseUrl?: string;
|
|
35
|
+
accountId: string;
|
|
36
|
+
};
|
|
32
37
|
/**
|
|
33
38
|
* Creates a CloudflareApi instance with automatic account ID discovery if not provided
|
|
34
39
|
*
|
|
35
40
|
* @param options API options
|
|
36
41
|
* @returns Promise resolving to a CloudflareApi instance
|
|
37
42
|
*/
|
|
38
|
-
export declare function createCloudflareApi(options?: Partial<CloudflareApiOptions>): Promise<CloudflareApi>;
|
|
43
|
+
export declare function createCloudflareApi(options?: Partial<CloudflareApiOptions> | InternalCloudflareApiOptions): Promise<CloudflareApi>;
|
|
39
44
|
/**
|
|
40
45
|
* Cloudflare API client using raw fetch
|
|
41
46
|
*/
|
|
42
47
|
export declare class CloudflareApi {
|
|
43
48
|
readonly accountId: string;
|
|
44
49
|
readonly baseUrl: string;
|
|
45
|
-
readonly apiKey: Secret | undefined;
|
|
46
|
-
readonly apiToken: Secret | undefined;
|
|
47
|
-
readonly email: string | undefined;
|
|
48
50
|
readonly authOptions: CloudflareAuthOptions;
|
|
49
51
|
/**
|
|
50
52
|
* Create a new Cloudflare API client
|
|
@@ -53,8 +55,10 @@ export declare class CloudflareApi {
|
|
|
53
55
|
*
|
|
54
56
|
* @param options API options
|
|
55
57
|
*/
|
|
56
|
-
constructor(options:
|
|
58
|
+
constructor(options: {
|
|
59
|
+
baseUrl?: string;
|
|
57
60
|
accountId: string;
|
|
61
|
+
authOptions: CloudflareAuthOptions;
|
|
58
62
|
});
|
|
59
63
|
/**
|
|
60
64
|
* Make a fetch request to the Cloudflare API
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAC;AAGnB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oHAAoH;AACpH,MAAM,MAAM,4BAA4B,GAAG,qBAAqB,GAAG;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,4BAAiC,GACzE,OAAO,CAAC,aAAa,CAAC,CAYxB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,WAAW,EAAE,qBAAqB,CAAC;IAEnD;;;;;;OAMG;gBACS,OAAO,EAAE;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,qBAAqB,CAAC;KACpC;IAMD;;;;;;OAMG;IACU,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA8D3E;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIlE;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAGnE;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAUpB;;OAEG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAKpB;;OAEG;IACG,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAQpB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGtE"}
|
package/lib/cloudflare/api.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { alchemy } from "../alchemy.js";
|
|
2
1
|
import { withExponentialBackoff } from "../util/retry.js";
|
|
3
2
|
import { safeFetch } from "../util/safe-fetch.js";
|
|
4
|
-
import { getCloudflareAuthHeaders, } from "./auth.js";
|
|
5
|
-
import {
|
|
3
|
+
import { getCloudflareAuthHeaders, normalizeAuthOptions, } from "./auth.js";
|
|
4
|
+
import { getCloudflareAccountId } from "./user.js";
|
|
6
5
|
/**
|
|
7
6
|
* Creates a CloudflareApi instance with automatic account ID discovery if not provided
|
|
8
7
|
*
|
|
@@ -10,35 +9,15 @@ import { getCloudflareAccounts, getUserEmailFromApiKey } from "./user.js";
|
|
|
10
9
|
* @returns Promise resolving to a CloudflareApi instance
|
|
11
10
|
*/
|
|
12
11
|
export async function createCloudflareApi(options = {}) {
|
|
13
|
-
const
|
|
14
|
-
(process.env.CLOUDFLARE_API_KEY
|
|
15
|
-
? alchemy.secret(process.env.CLOUDFLARE_API_KEY)
|
|
16
|
-
: undefined);
|
|
17
|
-
const apiToken = options.apiToken ??
|
|
18
|
-
(process.env.CLOUDFLARE_API_TOKEN
|
|
19
|
-
? alchemy.secret(process.env.CLOUDFLARE_API_TOKEN)
|
|
20
|
-
: undefined);
|
|
21
|
-
let email = options.email ?? process.env.CLOUDFLARE_EMAIL;
|
|
22
|
-
if (apiKey && !email) {
|
|
23
|
-
email = await getUserEmailFromApiKey(apiKey.unencrypted);
|
|
24
|
-
}
|
|
12
|
+
const authOptions = await normalizeAuthOptions(options);
|
|
25
13
|
const accountId = options.accountId ??
|
|
26
14
|
process.env.CLOUDFLARE_ACCOUNT_ID ??
|
|
27
15
|
process.env.CF_ACCOUNT_ID ??
|
|
28
|
-
(await
|
|
29
|
-
apiKey,
|
|
30
|
-
apiToken,
|
|
31
|
-
email,
|
|
32
|
-
}))[0]?.id;
|
|
33
|
-
if (accountId === undefined) {
|
|
34
|
-
throw new Error("Either accountId or CLOUDFLARE_ACCOUNT_ID must be provided");
|
|
35
|
-
}
|
|
16
|
+
(await getCloudflareAccountId(authOptions));
|
|
36
17
|
return new CloudflareApi({
|
|
37
18
|
baseUrl: options.baseUrl,
|
|
38
19
|
accountId,
|
|
39
|
-
|
|
40
|
-
apiKey,
|
|
41
|
-
apiToken,
|
|
20
|
+
authOptions,
|
|
42
21
|
});
|
|
43
22
|
}
|
|
44
23
|
/**
|
|
@@ -47,9 +26,6 @@ export async function createCloudflareApi(options = {}) {
|
|
|
47
26
|
export class CloudflareApi {
|
|
48
27
|
accountId;
|
|
49
28
|
baseUrl;
|
|
50
|
-
apiKey;
|
|
51
|
-
apiToken;
|
|
52
|
-
email;
|
|
53
29
|
authOptions;
|
|
54
30
|
/**
|
|
55
31
|
* Create a new Cloudflare API client
|
|
@@ -61,23 +37,7 @@ export class CloudflareApi {
|
|
|
61
37
|
constructor(options) {
|
|
62
38
|
this.accountId = options.accountId;
|
|
63
39
|
this.baseUrl = options.baseUrl ?? "https://api.cloudflare.com/client/v4";
|
|
64
|
-
this.
|
|
65
|
-
this.apiToken = options.apiToken;
|
|
66
|
-
this.email = options.email;
|
|
67
|
-
if (this.apiKey && this.apiToken) {
|
|
68
|
-
throw new Error("'apiKey' and 'apiToken' cannot both be provided");
|
|
69
|
-
}
|
|
70
|
-
else if (this.apiKey && !this.email) {
|
|
71
|
-
throw new Error("'email' must be provided if 'apiKey' is provided");
|
|
72
|
-
}
|
|
73
|
-
this.authOptions = this.apiKey
|
|
74
|
-
? {
|
|
75
|
-
apiKey: this.apiKey,
|
|
76
|
-
email: this.email,
|
|
77
|
-
}
|
|
78
|
-
: {
|
|
79
|
-
apiToken: this.apiToken,
|
|
80
|
-
};
|
|
40
|
+
this.authOptions = options.authOptions;
|
|
81
41
|
}
|
|
82
42
|
/**
|
|
83
43
|
* Make a fetch request to the Cloudflare API
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"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"}
|
package/lib/cloudflare/auth.d.ts
CHANGED
|
@@ -1,38 +1,19 @@
|
|
|
1
1
|
import type { Secret } from "../secret.ts";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
2
|
+
import type { CloudflareApiOptions } from "./api.ts";
|
|
3
|
+
export interface CloudflareApiTokenAuthOptions {
|
|
4
|
+
type: "api-token";
|
|
5
|
+
apiToken: Secret<string>;
|
|
6
|
+
}
|
|
7
|
+
export interface CloudflareApiKeyAuthOptions {
|
|
8
|
+
type: "api-key";
|
|
10
9
|
apiKey: Secret;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
21
|
-
export declare function isCloudflareApiKeyAuthOptions(options: CloudflareAuthOptions | undefined): options is CloudflareApiKeyAuthOptions;
|
|
22
|
-
export type CloudflareApiTokenAuthOptions = {
|
|
23
|
-
/**
|
|
24
|
-
* API Token to use with API Key
|
|
25
|
-
*/
|
|
26
|
-
apiToken?: Secret;
|
|
27
|
-
/**
|
|
28
|
-
* API Key to use with API Token
|
|
29
|
-
*/
|
|
30
|
-
apiKey?: undefined;
|
|
31
|
-
/**
|
|
32
|
-
* Email to use with API Token
|
|
33
|
-
*/
|
|
34
|
-
email?: undefined;
|
|
35
|
-
};
|
|
36
|
-
export declare function isCloudflareApiTokenAuthOptions(options: CloudflareAuthOptions | undefined): options is CloudflareApiTokenAuthOptions;
|
|
37
|
-
export declare function getCloudflareAuthHeaders(options: CloudflareAuthOptions | undefined): Promise<Record<string, string>>;
|
|
10
|
+
apiEmail: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CloudflareWranglerAuthOptions {
|
|
13
|
+
type: "wrangler";
|
|
14
|
+
}
|
|
15
|
+
export type CloudflareAuthOptions = CloudflareApiTokenAuthOptions | CloudflareApiKeyAuthOptions | CloudflareWranglerAuthOptions;
|
|
16
|
+
export declare const isCloudflareAuthOptions: (input?: CloudflareApiOptions | CloudflareAuthOptions) => input is CloudflareAuthOptions;
|
|
17
|
+
export declare function normalizeAuthOptions(input?: CloudflareApiOptions | CloudflareAuthOptions): Promise<CloudflareAuthOptions>;
|
|
18
|
+
export declare function getCloudflareAuthHeaders(authOptions: CloudflareAuthOptions): Promise<Record<string, string>>;
|
|
38
19
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAC7B,6BAA6B,GAC7B,2BAA2B,GAC3B,6BAA6B,CAAC;AAElC,eAAO,MAAM,uBAAuB,GAClC,QAAQ,oBAAoB,GAAG,qBAAqB,KACnD,KAAK,IAAI,qBAQX,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,KAAK,CAAC,EAAE,oBAAoB,GAAG,qBAAqB,GACnD,OAAO,CAAC,qBAAqB,CAAC,CA+BhC;AAED,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,qBAAqB,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAyBjC"}
|
package/lib/cloudflare/auth.js
CHANGED
|
@@ -1,34 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
1
|
+
import { alchemy } from "../alchemy.js";
|
|
2
|
+
import { getRefreshedWranglerConfig } from "./oauth.js";
|
|
3
|
+
import { getUserEmailFromApiKey } from "./user.js";
|
|
4
|
+
export const isCloudflareAuthOptions = (input) => {
|
|
5
|
+
return (input !== undefined &&
|
|
6
|
+
"type" in input &&
|
|
7
|
+
(input.type === "api-token" ||
|
|
8
|
+
input.type === "api-key" ||
|
|
9
|
+
input.type === "wrangler"));
|
|
10
|
+
};
|
|
11
|
+
export async function normalizeAuthOptions(input) {
|
|
12
|
+
if (isCloudflareAuthOptions(input)) {
|
|
13
|
+
return input;
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
const email = async (apiKey) => input?.email ??
|
|
16
|
+
process.env.CLOUDFLARE_EMAIL ??
|
|
17
|
+
(await getUserEmailFromApiKey(apiKey.unencrypted));
|
|
18
|
+
if (input?.apiKey) {
|
|
18
19
|
return {
|
|
19
|
-
|
|
20
|
+
type: "api-key",
|
|
21
|
+
apiKey: input.apiKey,
|
|
22
|
+
apiEmail: await email(input.apiKey),
|
|
20
23
|
};
|
|
21
24
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
if (input?.apiToken) {
|
|
26
|
+
return { type: "api-token", apiToken: input.apiToken };
|
|
27
|
+
}
|
|
28
|
+
if (process.env.CLOUDFLARE_API_KEY) {
|
|
29
|
+
const key = alchemy.secret(process.env.CLOUDFLARE_API_KEY);
|
|
30
|
+
return { type: "api-key", apiKey: key, apiEmail: await email(key) };
|
|
31
|
+
}
|
|
32
|
+
if (process.env.CLOUDFLARE_API_TOKEN) {
|
|
25
33
|
return {
|
|
26
|
-
|
|
34
|
+
type: "api-token",
|
|
35
|
+
apiToken: alchemy.secret(process.env.CLOUDFLARE_API_TOKEN),
|
|
27
36
|
};
|
|
28
37
|
}
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
return { type: "wrangler" };
|
|
39
|
+
}
|
|
40
|
+
export async function getCloudflareAuthHeaders(authOptions) {
|
|
41
|
+
switch (authOptions.type) {
|
|
42
|
+
case "api-token":
|
|
43
|
+
return { Authorization: `Bearer ${authOptions.apiToken.unencrypted}` };
|
|
44
|
+
case "api-key":
|
|
45
|
+
return {
|
|
46
|
+
"X-Auth-Key": authOptions.apiKey.unencrypted,
|
|
47
|
+
"X-Auth-Email": authOptions.apiEmail,
|
|
48
|
+
};
|
|
49
|
+
case "wrangler": {
|
|
50
|
+
const wranglerConfig = await getRefreshedWranglerConfig();
|
|
51
|
+
if (wranglerConfig.isErr()) {
|
|
52
|
+
throw new Error([
|
|
53
|
+
wranglerConfig.error.message,
|
|
54
|
+
"Please run `alchemy login`, or set either CLOUDFLARE_API_TOKEN or CLOUDFLARE_API_KEY in your environment.",
|
|
55
|
+
"Learn more: https://alchemy.run/guides/cloudflare/",
|
|
56
|
+
].join("\n"));
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
Authorization: `Bearer ${wranglerConfig.value.oauth_token}`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
31
62
|
}
|
|
32
|
-
throw new Error("Cloudflare authentication required. Did you forget to login with `wrangler login` or set CLOUDFLARE_API_TOKEN, CLOUDFLARE_API_KEY?");
|
|
33
63
|
}
|
|
34
64
|
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,20 +6,17 @@ interface WranglerConfig {
|
|
|
6
6
|
expiration_time: Date;
|
|
7
7
|
scopes: string[];
|
|
8
8
|
}
|
|
9
|
-
export declare const getRefreshedWranglerConfig: () => ResultAsync<WranglerConfig
|
|
9
|
+
export declare const getRefreshedWranglerConfig: () => ResultAsync<WranglerConfig, OAuthError>;
|
|
10
|
+
export declare const wranglerLogin: (scopes?: string[], log?: (message: string) => void) => ResultAsync<WranglerConfig, OAuthError>;
|
|
11
|
+
interface OAuthErrorParams {
|
|
12
|
+
error: string;
|
|
13
|
+
error_description: string;
|
|
14
|
+
error_verbose?: string;
|
|
15
|
+
error_hint?: string;
|
|
16
|
+
status_code: number;
|
|
17
|
+
}
|
|
10
18
|
declare class OAuthError extends Error {
|
|
11
|
-
|
|
12
|
-
readonly error_verbose?: string;
|
|
13
|
-
readonly error_hint?: string;
|
|
14
|
-
readonly status_code: number;
|
|
15
|
-
constructor(params: {
|
|
16
|
-
error: string;
|
|
17
|
-
error_verbose?: string;
|
|
18
|
-
error_description: string;
|
|
19
|
-
error_hint?: string;
|
|
20
|
-
status_code: number;
|
|
21
|
-
});
|
|
19
|
+
constructor(params: OAuthErrorParams);
|
|
22
20
|
}
|
|
23
|
-
export declare const wranglerLogin: (scopes?: string[], log?: (message: string) => void) => ResultAsync<WranglerConfig, OAuthError>;
|
|
24
21
|
export {};
|
|
25
|
-
//# sourceMappingURL=
|
|
22
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/cloudflare/oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAoB3D,eAAO,MAAM,cAAc,UAkB1B,CAAC;AAGF,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,eAAO,MAAM,0BAA0B,+CAkBtC,CAAC;AAyDF,eAAO,MAAM,aAAa,GACxB,SAAQ,MAAM,EAAmB,EACjC,MAAK,CAAC,OAAO,EAAE,MAAM,KAAK,IAAkB,4CAgF7C,CAAC;AA6BF,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,cAAM,UAAW,SAAQ,KAAK;gBAChB,MAAM,EAAE,gBAAgB;CAKrC"}
|