alchemy 0.16.6 → 0.16.8

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.
Files changed (43) hide show
  1. package/lib/cloudflare/account-api-token.d.ts +1 -1
  2. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  3. package/lib/cloudflare/account-api-token.js.map +1 -1
  4. package/lib/cloudflare/account-id.d.ts +41 -0
  5. package/lib/cloudflare/account-id.d.ts.map +1 -0
  6. package/lib/cloudflare/account-id.js +40 -0
  7. package/lib/cloudflare/account-id.js.map +1 -0
  8. package/lib/cloudflare/index.d.ts +1 -0
  9. package/lib/cloudflare/index.d.ts.map +1 -1
  10. package/lib/cloudflare/index.js +1 -0
  11. package/lib/cloudflare/index.js.map +1 -1
  12. package/lib/cloudflare/permission-groups.d.ts +1 -1
  13. package/lib/cloudflare/permission-groups.d.ts.map +1 -1
  14. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  15. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  16. package/lib/cloudflare/wrangler.json.js +1 -1
  17. package/lib/cloudflare/wrangler.json.js.map +1 -1
  18. package/lib/vercel/api.d.ts +69 -0
  19. package/lib/vercel/api.d.ts.map +1 -0
  20. package/lib/vercel/api.js +112 -0
  21. package/lib/vercel/api.js.map +1 -0
  22. package/lib/vercel/index.d.ts +4 -0
  23. package/lib/vercel/index.d.ts.map +1 -0
  24. package/lib/vercel/index.js +4 -0
  25. package/lib/vercel/index.js.map +1 -0
  26. package/lib/vercel/project-domain.d.ts +106 -0
  27. package/lib/vercel/project-domain.d.ts.map +1 -0
  28. package/lib/vercel/project-domain.js +68 -0
  29. package/lib/vercel/project-domain.js.map +1 -0
  30. package/lib/vercel/project.d.ts +272 -0
  31. package/lib/vercel/project.d.ts.map +1 -0
  32. package/lib/vercel/project.js +170 -0
  33. package/lib/vercel/project.js.map +1 -0
  34. package/package.json +2 -1
  35. package/src/cloudflare/account-api-token.ts +4 -1
  36. package/src/cloudflare/account-id.ts +48 -0
  37. package/src/cloudflare/index.ts +1 -0
  38. package/src/cloudflare/permission-groups.ts +1 -1
  39. package/src/cloudflare/wrangler.json.ts +2 -2
  40. package/src/vercel/api.ts +163 -0
  41. package/src/vercel/index.ts +3 -0
  42. package/src/vercel/project-domain.ts +172 -0
  43. package/src/vercel/project.ts +486 -0
@@ -0,0 +1,68 @@
1
+ import { Resource } from "../resource.js";
2
+ import { createVercelApi } from "./api.js";
3
+ /**
4
+ * Add and manage domains for Vercel projects.
5
+ *
6
+ * @example
7
+ * // Minimal
8
+ * const domain = await ProjectDomain("my-app.com", {
9
+ * name: "my-app.com",
10
+ * project: "prj_123",
11
+ * });
12
+ *
13
+ * @example
14
+ * // With accessToken
15
+ * const domain = await ProjectDomain("my-app.com", {
16
+ * accessToken: alchemy.secret(process.env.VERCEL_ACCESS_TOKEN),
17
+ * name: "my-app.com",
18
+ * project: "prj_123",
19
+ * });
20
+ *
21
+ * @example
22
+ * // With redirect
23
+ * const domain = await ProjectDomain("my-app.com", {
24
+ * name: "my-app.com",
25
+ * project: "prj_123",
26
+ * gitBranch: "main",
27
+ * redirect: "https://example.com",
28
+ * redirectStatusCode: 301,
29
+ * });
30
+ */
31
+ export const ProjectDomain = Resource("vercel::ProjectDomain", async function (id, { accessToken, ...props }) {
32
+ switch (this.phase) {
33
+ case "create": {
34
+ const api = await createVercelApi({
35
+ baseUrl: "https://api.vercel.com/v10",
36
+ accessToken,
37
+ });
38
+ const domain = (await api
39
+ .post(`/projects/${props.project}/domains`, props)
40
+ .then((res) => res.json()));
41
+ return this.create({ ...props, ...domain });
42
+ }
43
+ case "update": {
44
+ const { gitBranch, redirect, redirectStatusCode } = props;
45
+ const api = await createVercelApi({
46
+ baseUrl: "https://api.vercel.com/v9",
47
+ accessToken,
48
+ });
49
+ const domain = (await api
50
+ .patch(`/projects/${props.project}/domains/${this.output.name}`, {
51
+ gitBranch,
52
+ redirect,
53
+ redirectStatusCode,
54
+ })
55
+ .then((res) => res.json()));
56
+ return this.create({ ...props, ...domain });
57
+ }
58
+ case "delete": {
59
+ const api = await createVercelApi({
60
+ baseUrl: "https://api.vercel.com/v9",
61
+ accessToken,
62
+ });
63
+ await api.delete(`/projects/${props.project}/domains/${this.output.name}`);
64
+ return this.destroy();
65
+ }
66
+ }
67
+ });
68
+ //# sourceMappingURL=project-domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-domain.js","sourceRoot":"","sources":["../../src/vercel/project-domain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAyF3C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CACnC,uBAAuB,EACvB,KAAK,WAEH,EAAU,EACV,EAAE,WAAW,EAAE,GAAG,KAAK,EAAiD;IAExE,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC;gBAChC,OAAO,EAAE,4BAA4B;gBACrC,WAAW;aACZ,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG;iBACtB,IAAI,CAAC,aAAa,KAAK,CAAC,OAAO,UAAU,EAAE,KAAK,CAAC;iBACjD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAkB,CAAC;YAE/C,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;YAE1D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC;gBAChC,OAAO,EAAE,2BAA2B;gBACpC,WAAW;aACZ,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG;iBACtB,KAAK,CAAC,aAAa,KAAK,CAAC,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;gBAC/D,SAAS;gBACT,QAAQ;gBACR,kBAAkB;aACnB,CAAC;iBACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAkB,CAAC;YAE/C,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC;gBAChC,OAAO,EAAE,2BAA2B;gBACpC,WAAW;aACZ,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CACd,aAAa,KAAK,CAAC,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CACzD,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,272 @@
1
+ import type { Context } from "../context.js";
2
+ import { Resource } from "../resource.js";
3
+ import { type Secret } from "../secret.js";
4
+ import { type VercelApi } from "./api.js";
5
+ type TargetEnvironment = "production" | "preview" | "development";
6
+ export type EnvironmentVariable = {
7
+ /**
8
+ * The key of the environment variable
9
+ */
10
+ key: string;
11
+ /**
12
+ * The target environment
13
+ */
14
+ target: TargetEnvironment[];
15
+ /**
16
+ * The Git branch
17
+ */
18
+ gitBranch?: string;
19
+ /**
20
+ * The type of environment variable.
21
+ *
22
+ * Defaults to `plain` when `value` is a `string`, and `encrypted` when `value` is a `Secret`.
23
+ */
24
+ type?: "encrypted" | "plain" | "sensitive";
25
+ /**
26
+ * The value of the environment variable
27
+ */
28
+ value: Secret | string;
29
+ } & ({
30
+ type?: "plain" | "system";
31
+ value: string;
32
+ } | {
33
+ type?: "encrypted" | "sensitive";
34
+ value: Secret;
35
+ });
36
+ /**
37
+ * Properties for creating or updating a Project
38
+ */
39
+ export interface ProjectProps {
40
+ /**
41
+ * The desired name for the project
42
+ *
43
+ * Maximum length: `100`
44
+ * Example: `a-project-name`
45
+ */
46
+ name: string;
47
+ /**
48
+ * Opt-in to preview toolbar on the project level
49
+ */
50
+ enablePreviewFeedback?: boolean;
51
+ /**
52
+ * Opt-in to production toolbar on the project level
53
+ */
54
+ enableProductionFeedback?: boolean;
55
+ /**
56
+ * The build command for this project. When `null` is used this value will be automatically detected
57
+ */
58
+ buildCommand?: string;
59
+ commandForIgnoringBuildStep?: string;
60
+ /**
61
+ * The dev command for this project. When `null` is used this value will be automatically detected
62
+ */
63
+ devCommand?: string;
64
+ /**
65
+ * Collection of ENV Variables the Project will use
66
+ */
67
+ environmentVariables?: Array<EnvironmentVariable>;
68
+ /**
69
+ * The framework that is being used for this project. When `null` is used no framework is selected
70
+ */
71
+ framework?: "blitzjs" | "nextjs" | "gatsby" | "remix" | "react-router" | "astro" | "hexo" | "eleventy" | "docusaurus-2" | "docusaurus" | "preact" | "solidstart-1" | "solidstart" | "dojo" | "ember" | "vue" | "scully" | "ionic-angular" | "angular" | "polymer" | "svelte" | "sveltekit" | "sveltekit-1" | "ionic-react" | "create-react-app" | "gridsome" | "umijs" | "sapper" | "saber" | "stencil" | "nuxtjs" | "redwoodjs" | "hugo" | "jekyll" | "brunch" | "middleman" | "zola" | "hydrogen" | "vite" | "vitepress" | "vuepress" | "parcel" | "fasthtml" | "sanity-v3" | "sanity" | "storybook" | (string & {});
72
+ /**
73
+ * The Git Repository that will be connected to the project. When this is defined, any pushes to the specified connected Git Repository will be automatically deployed
74
+ */
75
+ gitRepository?: {
76
+ /**
77
+ * The Git Provider of the repository
78
+ */
79
+ type: "github" | "gitlab" | "bitbucket";
80
+ /**
81
+ * The name of the git repository. For example: `vercel/next.js`
82
+ */
83
+ repo: string;
84
+ };
85
+ /**
86
+ * The install command for this project. When `null` is used this value will be automatically detected
87
+ */
88
+ installCommand?: string;
89
+ /**
90
+ * The output directory of the build. When `null` is used this value will be automatically detected
91
+ */
92
+ outputDirectory?: string;
93
+ /**
94
+ * Specifies whether the source code and logs of the deployments for this project should be public or not
95
+ */
96
+ publicSource?: boolean;
97
+ /**
98
+ * The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root
99
+ */
100
+ rootDirectory?: string;
101
+ /**
102
+ * The region to deploy Serverless Functions in this project
103
+ */
104
+ serverlessFunctionRegion?: string;
105
+ /**
106
+ * Specifies whether Zero Config Failover is enabled for this project.
107
+ */
108
+ serverlessFunctionZeroConfigFailover?: boolean;
109
+ /**
110
+ * OpenID Connect JSON Web Token generation configuration.
111
+ */
112
+ oidcTokenConfig?: {
113
+ /**
114
+ * Whether or not to generate OpenID Connect JSON Web Tokens.
115
+ */
116
+ enabled: boolean;
117
+ /**
118
+ * team: `https://oidc.vercel.com/[team_slug]` global: `https://oidc.vercel.com`
119
+ */
120
+ issuerMode: "team" | "global";
121
+ };
122
+ /**
123
+ * Opt-in to skip deployments when there are no changes to the root directory and its dependencies
124
+ */
125
+ enableAffectedProjectsDeployments?: boolean;
126
+ /**
127
+ * Resource configuration
128
+ */
129
+ resourceConfig?: {
130
+ /**
131
+ * Whether fluid is enabled
132
+ */
133
+ fluid?: boolean;
134
+ /**
135
+ * Default regions for functions
136
+ */
137
+ functionDefaultRegions?: string[];
138
+ /**
139
+ * Default timeout for functions
140
+ */
141
+ functionDefaultTimeout?: number;
142
+ /**
143
+ * Default memory type for functions
144
+ */
145
+ functionDefaultMemoryType?: "standard_legacy" | "standard" | "performance";
146
+ /**
147
+ * Whether function zero config failover is enabled
148
+ */
149
+ functionZeroConfigFailover?: boolean;
150
+ /**
151
+ * Whether elastic concurrency is enabled
152
+ */
153
+ elasticConcurrencyEnabled?: boolean;
154
+ /**
155
+ * The build machine type
156
+ */
157
+ buildMachineType?: "enhanced" | "ultra";
158
+ };
159
+ }
160
+ /**
161
+ * Output returned after Project creation/update
162
+ */
163
+ export interface Project extends Resource<"vercel::Project">, ProjectProps {
164
+ /**
165
+ * The ID of the project
166
+ */
167
+ id: string;
168
+ /**
169
+ * The account ID that the project belongs to
170
+ */
171
+ accountId: string;
172
+ /**
173
+ * The time at which the project was created
174
+ */
175
+ createdAt: number;
176
+ /**
177
+ * The time at which the project was last updated
178
+ */
179
+ updatedAt: number;
180
+ /**
181
+ * The latest deployment of the project
182
+ */
183
+ latestDeployment?: {
184
+ /**
185
+ * The ID of the deployment
186
+ */
187
+ id: string;
188
+ /**
189
+ * The URL of the deployment
190
+ */
191
+ url: string;
192
+ };
193
+ }
194
+ /**
195
+ * Create and manage Vercel projects.
196
+ *
197
+ * @example
198
+ * // With accessToken
199
+ * const project = await Project("my-app", {
200
+ * accessToken: alchemy.secret(process.env.VERCEL_ACCESS_TOKEN),
201
+ * name: "my-app",
202
+ * framework: "astro",
203
+ * });
204
+ *
205
+ * @example
206
+ * // With GitHub
207
+ * const project = await Project("my-app", {
208
+ * name: "my-app",
209
+ * framework: "nextjs",
210
+ * gitRepository: {
211
+ * type: "github",
212
+ * repo: "username/my-app",
213
+ * },
214
+ * });
215
+ *
216
+ * @example
217
+ * // With plain text environment variable
218
+ * const project = await Project("my-app", {
219
+ * name: "my-app",
220
+ * environmentVariables: [
221
+ * {
222
+ * key: "PUBLIC_URL",
223
+ * target: ["production", "preview", "development"],
224
+ * value: "https://example.com",
225
+ * },
226
+ * ],
227
+ * });
228
+ *
229
+ * @example
230
+ * // With encrypted environment variable
231
+ * const project = await Project("my-app", {
232
+ * name: "my-app",
233
+ * environmentVariables: [
234
+ * {
235
+ * key: "DATABASE_URL",
236
+ * target: ["production", "preview"],
237
+ * value: alchemy.secret("DATABASE_URL"),
238
+ * },
239
+ * ],
240
+ * });
241
+ *
242
+ * @example
243
+ * // With sensitive environment variable
244
+ * const project = await Project("my-app", {
245
+ * name: "my-app",
246
+ * environmentVariables: [
247
+ * {
248
+ * key: "DATABASE_URL",
249
+ * target: ["production", "preview"],
250
+ * type: "sensitive",
251
+ * value: alchemy.secret("DATABASE_URL"),
252
+ * },
253
+ * ],
254
+ * });
255
+ *
256
+ * @example
257
+ * // With custom build settings
258
+ * const project = await Project("my-app", {
259
+ * name: "my-app",
260
+ * buildCommand: "npm run build",
261
+ * outputDirectory: "dist",
262
+ * installCommand: "npm install",
263
+ * devCommand: "npm run dev",
264
+ * });
265
+ */
266
+ export declare const Project: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<Project>, id: string, { accessToken, ...props }: ProjectProps & {
267
+ accessToken?: Secret;
268
+ }) => Promise<Project>);
269
+ export declare function createProject(api: VercelApi, props: ProjectProps): Promise<Project>;
270
+ export declare function updateEnvironmentVariables(api: VercelApi, output: Project, props: ProjectProps): Promise<void>;
271
+ export {};
272
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/vercel/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import { Resource } from "../resource.js";
2
+ import { isSecret } from "../secret.js";
3
+ import { createVercelApi } from "./api.js";
4
+ const decryptEnvironmentVariable = (envVar) => {
5
+ let { type, value } = envVar;
6
+ // Decrypt Secret & default `type`
7
+ if (isSecret(value)) {
8
+ value = value.unencrypted;
9
+ type ??= "encrypted";
10
+ }
11
+ else {
12
+ // Otherwise, default to `plain`
13
+ type ??= "plain";
14
+ }
15
+ return { ...envVar, type, value };
16
+ };
17
+ /**
18
+ * Create and manage Vercel projects.
19
+ *
20
+ * @example
21
+ * // With accessToken
22
+ * const project = await Project("my-app", {
23
+ * accessToken: alchemy.secret(process.env.VERCEL_ACCESS_TOKEN),
24
+ * name: "my-app",
25
+ * framework: "astro",
26
+ * });
27
+ *
28
+ * @example
29
+ * // With GitHub
30
+ * const project = await Project("my-app", {
31
+ * name: "my-app",
32
+ * framework: "nextjs",
33
+ * gitRepository: {
34
+ * type: "github",
35
+ * repo: "username/my-app",
36
+ * },
37
+ * });
38
+ *
39
+ * @example
40
+ * // With plain text environment variable
41
+ * const project = await Project("my-app", {
42
+ * name: "my-app",
43
+ * environmentVariables: [
44
+ * {
45
+ * key: "PUBLIC_URL",
46
+ * target: ["production", "preview", "development"],
47
+ * value: "https://example.com",
48
+ * },
49
+ * ],
50
+ * });
51
+ *
52
+ * @example
53
+ * // With encrypted environment variable
54
+ * const project = await Project("my-app", {
55
+ * name: "my-app",
56
+ * environmentVariables: [
57
+ * {
58
+ * key: "DATABASE_URL",
59
+ * target: ["production", "preview"],
60
+ * value: alchemy.secret("DATABASE_URL"),
61
+ * },
62
+ * ],
63
+ * });
64
+ *
65
+ * @example
66
+ * // With sensitive environment variable
67
+ * const project = await Project("my-app", {
68
+ * name: "my-app",
69
+ * environmentVariables: [
70
+ * {
71
+ * key: "DATABASE_URL",
72
+ * target: ["production", "preview"],
73
+ * type: "sensitive",
74
+ * value: alchemy.secret("DATABASE_URL"),
75
+ * },
76
+ * ],
77
+ * });
78
+ *
79
+ * @example
80
+ * // With custom build settings
81
+ * const project = await Project("my-app", {
82
+ * name: "my-app",
83
+ * buildCommand: "npm run build",
84
+ * outputDirectory: "dist",
85
+ * installCommand: "npm install",
86
+ * devCommand: "npm run dev",
87
+ * });
88
+ */
89
+ export const Project = Resource("vercel::Project", async function (id, { accessToken, ...props }) {
90
+ switch (this.phase) {
91
+ case "delete": {
92
+ const api = await createVercelApi({
93
+ baseUrl: "https://api.vercel.com/v9",
94
+ accessToken,
95
+ });
96
+ try {
97
+ if (this.output?.id) {
98
+ await api.delete(`/projects/${this.output.id}`);
99
+ }
100
+ }
101
+ catch (error) {
102
+ console.error("Error deleting project:", error);
103
+ }
104
+ return this.destroy();
105
+ }
106
+ case "update": {
107
+ const api = await createVercelApi({
108
+ baseUrl: "https://api.vercel.com/v9",
109
+ accessToken,
110
+ });
111
+ if (!this.output?.id) {
112
+ throw new Error(`Cannot update project ${id}: missing previous output.id`);
113
+ }
114
+ // 409 Conflict: Can't update name, so remove it from the props
115
+ // 400 Invalid Request: Should NOT have additional property `environmentVariables`
116
+ const { name, environmentVariables, ...rest } = props;
117
+ const response = await api.patch(`/projects/${this.output.id}`, rest);
118
+ const data = (await response.json());
119
+ if (environmentVariables) {
120
+ const envApi = await createVercelApi({
121
+ baseUrl: "https://api.vercel.com/v10",
122
+ accessToken,
123
+ });
124
+ await updateEnvironmentVariables(envApi, this.output, props);
125
+ }
126
+ return this({
127
+ id: data.id,
128
+ accountId: data.accountId,
129
+ createdAt: data.createdAt,
130
+ updatedAt: data.updatedAt,
131
+ latestDeployment: data.latestDeployment,
132
+ ...props,
133
+ });
134
+ }
135
+ case "create": {
136
+ const api = await createVercelApi({
137
+ baseUrl: "https://api.vercel.com/v11",
138
+ accessToken,
139
+ });
140
+ const project = await createProject(api, props);
141
+ return this.create({ ...props, ...project });
142
+ }
143
+ }
144
+ });
145
+ export async function createProject(api, props) {
146
+ const response = await api.post("/projects", {
147
+ ...props,
148
+ environmentVariables: props.environmentVariables?.map(decryptEnvironmentVariable),
149
+ });
150
+ const data = (await response.json());
151
+ return data;
152
+ }
153
+ export async function updateEnvironmentVariables(api, output, props) {
154
+ if (!props.environmentVariables) {
155
+ return;
156
+ }
157
+ // Update explicitly set environment variables
158
+ await api.post(`/projects/${output.id}/env?upsert=true`, props.environmentVariables.map(decryptEnvironmentVariable));
159
+ // Find previous env vars that are not in the new list and delete them
160
+ const { envs } = (await api
161
+ .get(`/projects/${output.id}/env`)
162
+ .then((res) => res.json()));
163
+ for (const previousEnv of envs) {
164
+ if (props.environmentVariables.some((envVar) => envVar.key === previousEnv.key)) {
165
+ continue;
166
+ }
167
+ await api.delete(`/projects/${output.id}/env/${previousEnv.id}`);
168
+ }
169
+ }
170
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/vercel/project.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "0.16.6",
3
+ "version": "0.16.8",
4
4
  "type": "module",
5
5
  "module": "./lib/index.js",
6
6
  "scripts": {
@@ -28,6 +28,7 @@
28
28
  "./stripe": "./lib/stripe/index.js",
29
29
  "./test/bun": "./lib/test/bun.js",
30
30
  "./upstash": "./lib/upstash/index.js",
31
+ "./vercel": "./lib/vercel/index.js",
31
32
  "./web/astro": "./lib/web/astro/index.js",
32
33
  "./web/tailwind": "./lib/web/tailwind/index.js",
33
34
  "./web/vite": "./lib/web/vite/index.js",
@@ -50,12 +50,15 @@ export interface TokenPolicy {
50
50
  * @see https://developers.cloudflare.com/fundamentals/api/reference/permissions/
51
51
  */
52
52
  type TokenPolicyResourceKey =
53
+ | "com.cloudflare.edge.r2.bucket"
54
+ | `com.cloudflare.edge.r2.bucket.${string}`
53
55
  | `com.cloudflare.api.account`
54
56
  | `com.cloudflare.api.account.${string}`
55
57
  // | `com.cloudflare.api.account.zone`
56
58
  | `com.cloudflare.api.account.zone.${string}`
57
59
  // | `com.cloudflare.api.user`
58
- | `com.cloudflare.api.user.${string}`;
60
+ | `com.cloudflare.api.user.${string}`
61
+ | (string & {});
59
62
 
60
63
  /**
61
64
  * Condition for token usage (e.g., IP restrictions)
@@ -0,0 +1,48 @@
1
+ import { createCloudflareApi, type CloudflareApiOptions } from "./api.js";
2
+
3
+ /**
4
+ * Options for getting a Cloudflare account ID
5
+ */
6
+ export interface GetCloudflareAccountIdOptions extends CloudflareApiOptions {}
7
+
8
+ /**
9
+ * Retrieves a Cloudflare Account ID for use with other Cloudflare resources.
10
+ *
11
+ * This function allows you to programmatically access your Cloudflare account ID,
12
+ * which is required for many Cloudflare API operations.
13
+ *
14
+ * If accountId is provided in the options or via CLOUDFLARE_ACCOUNT_ID environment variable,
15
+ * that value will be used. Otherwise, the account ID will be automatically retrieved
16
+ * from the Cloudflare API.
17
+ *
18
+ * @example
19
+ * // Get account ID from environment variables or API token
20
+ * const accountId = await AccountId();
21
+ *
22
+ * @example
23
+ * // Provide an API key and email directly
24
+ * const accountId = await AccountId({
25
+ * apiKey: alchemy.secret(process.env.CLOUDFLARE_API_KEY),
26
+ * email: "user@example.com"
27
+ * });
28
+ *
29
+ * @example
30
+ * // Use the account ID with a Worker
31
+ * import { Worker, AccountId } from "alchemy/cloudflare";
32
+ *
33
+ * const accountId = await AccountId();
34
+ *
35
+ * await Worker("my-worker", {
36
+ * name: "my-worker",
37
+ * script: "console.log('Hello, world!')",
38
+ * accountId
39
+ * });
40
+ */
41
+ export async function AccountId(
42
+ options: GetCloudflareAccountIdOptions = {},
43
+ ): Promise<string> {
44
+ // Create Cloudflare API client with automatic account discovery
45
+ const api = await createCloudflareApi(options);
46
+
47
+ return api.accountId;
48
+ }
@@ -1,4 +1,5 @@
1
1
  export * from "./account-api-token.js";
2
+ export * from "./account-id.js";
2
3
  export * from "./ai-gateway.js";
3
4
  export * from "./ai.js";
4
5
  export * from "./api-error.js";
@@ -32,7 +32,7 @@ interface PermissionGroupsResponse {
32
32
  messages: any[];
33
33
  }
34
34
 
35
- export type PermissionGroupName = R2PermissionGroups;
35
+ export type PermissionGroupName = R2PermissionGroups | (string & {});
36
36
 
37
37
  export type R2PermissionGroups =
38
38
  | "Workers R2 Storage Write"
@@ -236,7 +236,7 @@ export interface WranglerJsonSpec {
236
236
  /**
237
237
  * Vectorize index bindings
238
238
  */
239
- vectorize_indexes?: {
239
+ vectorize?: {
240
240
  binding: string;
241
241
  index_name: string;
242
242
  }[];
@@ -481,7 +481,7 @@ function processBindings(
481
481
  }
482
482
 
483
483
  if (vectorizeIndexes.length > 0) {
484
- spec.vectorize_indexes = vectorizeIndexes;
484
+ spec.vectorize = vectorizeIndexes;
485
485
  }
486
486
 
487
487
  if (new_sqlite_classes.length > 0 || new_classes.length > 0) {