Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/angry-keys-dance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"wrangler": minor
---

Added new [[pipelines]] bindings
105 changes: 105 additions & 0 deletions packages/wrangler/src/__tests__/configuration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ describe("normalizeAndValidateConfig()", () => {
upload_source_maps: undefined,
placement: undefined,
tail_consumers: undefined,
pipelines: [],
});
expect(diagnostics.hasErrors()).toBe(false);
expect(diagnostics.hasWarnings()).toBe(false);
Expand Down Expand Up @@ -3181,6 +3182,110 @@ describe("normalizeAndValidateConfig()", () => {
});
});

describe("[pipelines]", () => {
it("should error if pipelines is an object", () => {
const { diagnostics } = normalizeAndValidateConfig(
{ pipelines: {} } as unknown as RawConfig,
undefined,
{ env: undefined }
);

expect(diagnostics.hasWarnings()).toBe(false);
expect(diagnostics.renderErrors()).toMatchInlineSnapshot(`
"Processing wrangler configuration:
- The field \\"pipelines\\" should be an array but got {}."
`);
});

it("should error if pipelines is a string", () => {
const { diagnostics } = normalizeAndValidateConfig(
{ pipelines: "BAD" } as unknown as RawConfig,
undefined,
{ env: undefined }
);

expect(diagnostics.hasWarnings()).toBe(false);
expect(diagnostics.renderErrors()).toMatchInlineSnapshot(`
"Processing wrangler configuration:
- The field \\"pipelines\\" should be an array but got \\"BAD\\"."
`);
});

it("should error if pipelines is a number", () => {
const { diagnostics } = normalizeAndValidateConfig(
{ pipelines: 999 } as unknown as RawConfig,
undefined,
{ env: undefined }
);

expect(diagnostics.hasWarnings()).toBe(false);
expect(diagnostics.renderErrors()).toMatchInlineSnapshot(`
"Processing wrangler configuration:
- The field \\"pipelines\\" should be an array but got 999."
`);
});

it("should error if pipelines is null", () => {
const { diagnostics } = normalizeAndValidateConfig(
{ pipelines: null } as unknown as RawConfig,
undefined,
{ env: undefined }
);

expect(diagnostics.hasWarnings()).toBe(false);
expect(diagnostics.renderErrors()).toMatchInlineSnapshot(`
"Processing wrangler configuration:
- The field \\"pipelines\\" should be an array but got null."
`);
});

it("should accept valid bindings", () => {
const { diagnostics } = normalizeAndValidateConfig(
{
pipelines: [
{
binding: "VALID",
pipeline: "343cd4f1d58c42fbb5bd082592fd7143",
},
],
} as unknown as RawConfig,
undefined,
{ env: undefined }
);

expect(diagnostics.hasErrors()).toBe(false);
});

it("should error if pipelines.bindings are not valid", () => {
const { diagnostics } = normalizeAndValidateConfig(
{
pipelines: [
{},
{
binding: "VALID",
pipeline: "343cd4f1d58c42fbb5bd082592fd7143",
},
{ binding: 2000, project: 2111 },
],
} as unknown as RawConfig,
undefined,
{ env: undefined }
);
expect(diagnostics.renderWarnings()).toMatchInlineSnapshot(`
"Processing wrangler configuration:
- Unexpected fields found in pipelines[2] field: \\"project\\""
`);
expect(diagnostics.hasWarnings()).toBe(true);
expect(diagnostics.renderErrors()).toMatchInlineSnapshot(`
"Processing wrangler configuration:
- \\"pipelines[0]\\" bindings should have a string \\"binding\\" field but got {}.
- \\"pipelines[0]\\" bindings must have a \\"pipeline\\" field but got {}.
- \\"pipelines[2]\\" bindings should have a string \\"binding\\" field but got {\\"binding\\":2000,\\"project\\":2111}.
- \\"pipelines[2]\\" bindings must have a \\"pipeline\\" field but got {\\"binding\\":2000,\\"project\\":2111}."
`);
});
});

describe("[unsafe.bindings]", () => {
it("should error if unsafe is an array", () => {
const { diagnostics } = normalizeAndValidateConfig(
Expand Down
41 changes: 41 additions & 0 deletions packages/wrangler/src/__tests__/deploy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10466,6 +10466,47 @@ export default{
});
});

describe("pipelines", () => {
it("should upload pipelines bindings", async () => {
writeWranglerToml({
pipelines: [
{
binding: "MY_PIPELINE",
pipeline: "0123456789ABCDEF0123456789ABCDEF",
},
],
});
await fs.promises.writeFile("index.js", `export default {};`);
mockSubDomainRequest();
mockUploadWorkerRequest({
expectedBindings: [
{
type: "pipelines",
name: "MY_PIPELINE",
id: "0123456789ABCDEF0123456789ABCDEF",
},
],
});

await runWrangler("deploy index.js");
expect(std.out).toMatchInlineSnapshot(`
"Total Upload: xx KiB / gzip: xx KiB
Worker Startup Time: 100 ms
Your worker has access to the following bindings:
- Pipelines:
- MY_PIPELINE: 0123456789ABCDEF0123456789ABCDEF
Uploaded test-name (TIMINGS)
Published test-name (TIMINGS)
https://test-name.test-sub-domain.workers.dev
Current Deployment ID: Galaxy-Class
Current Version ID: Galaxy-Class


Note: Deployment ID has been renamed to Version ID. Deployment ID is present to maintain compatibility with the previous behavior of this command. This output will change in a future version of Wrangler. To learn more visit: https://developers.cloudflare.com/workers/configuration/versions-and-deployments"
`);
});
});

describe("--keep-vars", () => {
it("should send keepVars when keep-vars is passed in", async () => {
vi.stubEnv("CLOUDFLARE_API_TOKEN", "hunter2");
Expand Down
1 change: 1 addition & 0 deletions packages/wrangler/src/__tests__/type-generation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ const bindingsConfigMock: Omit<
},
{ type: "CompiledWasm", globs: ["**/*.wasm"], fallthrough: true },
],
pipelines: [],
};

describe("generateTypes()", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ function createWorkerBundleFormData(
text_blobs: undefined,
data_blobs: undefined,
dispatch_namespaces: undefined,
pipelines: undefined,
logfwdr: undefined,
unsafe: undefined,
experimental_assets: undefined,
Expand Down
3 changes: 2 additions & 1 deletion packages/wrangler/src/api/startDevWorker/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ export function convertCfWorkerInitBindingstoBindings(
break;
}
default: {
assertNever(type);
assertNever(type as never);
}
}
}
Expand All @@ -270,6 +270,7 @@ export async function convertBindingsToCfWorkerInitBindings(
version_metadata: undefined,
data_blobs: undefined,
durable_objects: undefined,
pipelines: undefined,
queues: undefined,
r2_buckets: undefined,
d1_databases: undefined,
Expand Down
1 change: 1 addition & 0 deletions packages/wrangler/src/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -402,4 +402,5 @@ export const defaultWranglerConfig: Config = {
},
mtls_certificates: [],
tail_consumers: undefined,
pipelines: [],
};
17 changes: 17 additions & 0 deletions packages/wrangler/src/config/environment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,23 @@ export interface EnvironmentNonInheritable {
/** Details about the outbound Worker which will handle outbound requests from your namespace */
outbound?: DispatchNamespaceOutbound;
}[];

/**
* Specifies list of Pipelines bound to this Worker environment
*
* NOTE: This field is not automatically inherited from the top level environment,
* and so must be specified in every named environment.
*
* @default `[]`
* @nonInheritable
*/
pipelines: {
/** The binding name used to refer to the bound service. */
binding: string;

/** Name of the Pipeline to bind */
pipeline: string;
}[];
}

/**
Expand Down
11 changes: 11 additions & 0 deletions packages/wrangler/src/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
wasm_modules,
dispatch_namespaces,
mtls_certificates,
pipelines,
} = bindings;

if (data_blobs !== undefined && Object.keys(data_blobs).length > 0) {
Expand Down Expand Up @@ -443,6 +444,16 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
});
}

if (pipelines != undefined && pipelines.length > 0) {
output.push({
type: "Pipelines",
entries: pipelines.map(({ binding, pipeline }) => ({
key: binding,
value: pipeline,
})),
});
}

if (version_metadata !== undefined) {
output.push({
type: "Worker Version Metadata",
Expand Down
45 changes: 45 additions & 0 deletions packages/wrangler/src/config/validation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1444,6 +1444,16 @@ function normalizeAndValidateEnvironment(
validateAIBinding(envName),
undefined
),
pipelines: notInheritable(
diagnostics,
topLevelEnv,
rawConfig,
rawEnv,
envName,
"pipelines",
validateBindingArray(envName, validatePipelineBinding),
[]
),
version_metadata: notInheritable(
diagnostics,
topLevelEnv,
Expand Down Expand Up @@ -2201,6 +2211,7 @@ const validateUnsafeBinding: ValidatorFn = (diagnostics, field, value) => {
"service",
"logfwdr",
"mtls_certificate",
"pipeline",
];

if (safeBindings.includes(value.type)) {
Expand Down Expand Up @@ -3103,6 +3114,40 @@ const validateConsumer: ValidatorFn = (diagnostics, field, value, _config) => {
return isValid;
};

const validatePipelineBinding: ValidatorFn = (diagnostics, field, value) => {
if (typeof value !== "object" || value === null) {
diagnostics.errors.push(
`"pipeline" bindings should be objects, but got ${JSON.stringify(value)}`
);
return false;
}
let isValid = true;
// Pipelin bindings must have a binding and a pipeline.
if (!isRequiredProperty(value, "binding", "string")) {
diagnostics.errors.push(
`"${field}" bindings should have a string "binding" field but got ${JSON.stringify(
value
)}.`
);
isValid = false;
}
if (!isRequiredProperty(value, "pipeline", "string")) {
diagnostics.errors.push(
`"${field}" bindings must have a "pipeline" field but got ${JSON.stringify(
value
)}.`
);
isValid = false;
}

validateAdditionalProperties(diagnostics, field, Object.keys(value), [
"binding",
"pipeline",
]);

return isValid;
};

function normalizeAndValidateLimits(
diagnostics: Diagnostics,
topLevelEnv: Environment | undefined,
Expand Down
1 change: 1 addition & 0 deletions packages/wrangler/src/deploy/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,7 @@ See https://developers.cloudflare.com/workers/platform/compatibility-dates for m
analytics_engine_datasets: config.analytics_engine_datasets,
dispatch_namespaces: config.dispatch_namespaces,
mtls_certificates: config.mtls_certificates,
pipelines: config.pipelines,
logfwdr: config.logfwdr,
experimental_assets: config.experimental_assets?.binding
? { binding: config.experimental_assets.binding }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ export type WorkerMetadataBinding =
};
}
| { type: "mtls_certificate"; name: string; certificate_id: string }
| { type: "pipelines"; name: string; id: string }
| {
type: "logfwdr";
name: string;
Expand Down Expand Up @@ -316,6 +317,14 @@ export function createWorkerUploadForm(worker: CfWorkerInit): FormData {
});
});

bindings.pipelines?.forEach(({ binding, pipeline }) => {
metadataBindings.push({
name: binding,
type: "pipelines",
id: pipeline,
});
});

bindings.logfwdr?.bindings.forEach(({ name, destination }) => {
metadataBindings.push({
name: name,
Expand Down
6 changes: 6 additions & 0 deletions packages/wrangler/src/deployment-bundle/worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,11 @@ export interface CfExperimentalAssetBinding {
binding: string;
}

export interface CfPipeline {
binding: string;
pipeline: string;
}

export interface CfUnsafeBinding {
name: string;
type: string;
Expand Down Expand Up @@ -326,6 +331,7 @@ export interface CfWorkerInit {
dispatch_namespaces: CfDispatchNamespace[] | undefined;
mtls_certificates: CfMTlsCertificate[] | undefined;
logfwdr: CfLogfwdr | undefined;
pipelines: CfPipeline[] | undefined;
unsafe: CfUnsafe | undefined;
experimental_assets: CfExperimentalAssetBinding | undefined;
};
Expand Down
2 changes: 2 additions & 0 deletions packages/wrangler/src/dev.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@ export async function startDev(args: StartDevOptions) {
analytics_engine_datasets: undefined,
dispatch_namespaces: undefined,
mtls_certificates: undefined,
pipelines: undefined,
logfwdr: undefined,
unsafe: undefined,
experimental_assets: undefined,
Expand Down Expand Up @@ -1599,6 +1600,7 @@ export function getBindings(
experimental_assets: configParam.experimental_assets?.binding
? { binding: configParam.experimental_assets?.binding }
: undefined,
pipelines: configParam.pipelines,
};

return bindings;
Expand Down
Loading