@@ -13,6 +13,7 @@ import type { Loader } from "esbuild";
1313import type { EsbuildOptions } from "../esbuild.js" ;
1414import { Component , Transform , transform } from "../component" ;
1515import { WorkerUrl } from "./providers/worker-url.js" ;
16+ import { WorkerPlacement } from "./providers/worker-placement.js" ;
1617import { Link } from "../link.js" ;
1718import type { Input } from "../input.js" ;
1819import { ZoneLookup } from "./providers/zone-lookup.js" ;
@@ -181,6 +182,36 @@ export interface WorkerArgs {
181182 */
182183 directory : Input < string > ;
183184 } > ;
185+ /**
186+ * Configure [placement](https://developers.cloudflare.com/workers/configuration/placement/)
187+ * for your Worker.
188+ *
189+ * @example
190+ *
191+ * #### Smart Placement
192+ * ```js
193+ * {
194+ * placement: {
195+ * mode: "smart"
196+ * }
197+ * }
198+ * ```
199+ *
200+ * #### Explicit region
201+ * ```js
202+ * {
203+ * placement: {
204+ * region: "aws:us-east-1"
205+ * }
206+ * }
207+ * ```
208+ */
209+ placement ?: Input < {
210+ mode ?: Input < string > ;
211+ region ?: Input < string > ;
212+ host ?: Input < string > ;
213+ hostname ?: Input < string > ;
214+ } > ;
184215 /**
185216 * [Transform](/docs/components/#transform) how this component creates its underlying
186217 * resources.
@@ -261,6 +292,7 @@ export interface WorkerArgs {
261292export class Worker extends Component implements Link . Linkable {
262293 private script : cf . WorkersScript ;
263294 private workerUrl : WorkerUrl ;
295+ private workerPlacement ?: WorkerPlacement ;
264296 private workerDomain ?: cf . WorkerDomain ;
265297
266298 constructor ( name : string , args : WorkerArgs , opts ?: ComponentResourceOptions ) {
@@ -290,10 +322,12 @@ export class Worker extends Component implements Link.Linkable {
290322 const build = buildHandler ( ) ;
291323 const script = createScript ( ) ;
292324 const workerUrl = createWorkersUrl ( ) ;
325+ const workerPlacement = createWorkerPlacement ( ) ;
293326 const workerDomain = createWorkersDomain ( ) ;
294327
295328 this . script = script ;
296329 this . workerUrl = workerUrl ;
330+ this . workerPlacement = workerPlacement ;
297331 this . workerDomain = workerDomain ;
298332
299333 all ( [ dev , buildInput , script . scriptName ] ) . apply (
@@ -539,6 +573,22 @@ export class Worker extends Component implements Link.Linkable {
539573 ) ;
540574 }
541575
576+ // workaround: pulumi cloudflare provider marks placement as read-only,
577+ // so we use the CF API directly until upstream support lands
578+ function createWorkerPlacement ( ) {
579+ if ( ! args . placement ) return ;
580+
581+ return new WorkerPlacement (
582+ `${ name } Placement` ,
583+ {
584+ accountId : DEFAULT_ACCOUNT_ID ,
585+ scriptName : script . scriptName ,
586+ ...args . placement ,
587+ } ,
588+ { parent } ,
589+ ) ;
590+ }
591+
542592 function createWorkersDomain ( ) {
543593 if ( ! args . domain ) return ;
544594
0 commit comments