[build-utils] Extend finalizeLambda with pluggable ZIP strategy and pre-digest validation hook#15856
Conversation
…re-digest validation hook
🦋 Changeset detectedLatest commit: d8db542 The changes in this PR will be included in the next version bump. This PR includes changesets to release 16 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
📦 CLI Tarball ReadyThe Vercel CLI tarball for this PR is now available! Quick TestYou can test this PR's CLI directly by running: npx https://vercel-1r8gknvd3.vercel.sh/tarballs/vercel.tgz --helpUse in vercel.jsonTo use this CLI version in your project builds, add to your {
"build": {
"env": {
"VERCEL_CLI_VERSION": "vercel@https://vercel-1r8gknvd3.vercel.sh/tarballs/vercel.tgz"
}
}
}Python Runtime WheelA Python Workers WheelA |
|
Low Risk — Additive API extension with optional params and backward-compatible defaults.
Assessed at d8db542. |
🧪 Unit Test StrategyComparing: Strategy: Code changed outside of a package - running all unit tests Affected packages - 40 (100%)
Results
This comment is automatically generated based on the affected testing strategy |
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @vercel/build-utils@13.13.0 ### Minor Changes - Extend `finalizeLambda` with pluggable ZIP strategy (`createZip`), pre-digest validation hook (`validateZip`), and optional trace tags. Widen `getLambdaEnvironment` buffer param to `{ byteLength: number }`. ([#15856](#15856)) ## vercel@50.41.0 ### Minor Changes - Add `vercel edge-config` with `list`, `add`, `get`, `update`, `remove`, `items`, and `tokens` subcommands for Edge Config dashboard API parity. ([#15822](#15822)) - Add `vercel project checks` to list a project's deployment checks configuration (parity with dashboard), including `--format json` and non-interactive error payloads. ([#15816](#15816)) ### Patch Changes - Improve `vercel teams request` in non-interactive mode: validation, missing team scope, and API errors emit structured JSON on stdout with stable `reason` values and `next[]` commands that preserve global flags (for example `--cwd` and `--non-interactive`). ([#15815](#15815)) - Hide `--search` flag from `vc logs --help` output while continuing to accept it, and update the `--query` flag description to indicate advanced querying with filter syntax support. ([#15854](#15854)) - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 - @vercel/backends@0.0.56 - @vercel/elysia@0.1.59 - @vercel/express@0.1.69 - @vercel/fastify@0.1.62 - @vercel/go@3.4.7 - @vercel/h3@0.1.68 - @vercel/hono@0.2.62 - @vercel/hydrogen@1.3.6 - @vercel/koa@0.1.42 - @vercel/nestjs@0.2.63 - @vercel/next@4.16.5 - @vercel/node@5.7.1 - @vercel/python@6.29.0 - @vercel/redwood@2.4.12 - @vercel/remix-builder@5.7.2 - @vercel/ruby@2.3.2 - @vercel/rust@1.0.6 - @vercel/static-build@2.9.9 ## @vercel/backends@0.0.56 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/cervel@0.0.43 ### Patch Changes - Updated dependencies \[]: - @vercel/backends@0.0.56 ## @vercel/client@17.2.68 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/elysia@0.1.59 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/express@0.1.69 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 - @vercel/cervel@0.0.43 ## @vercel/fastify@0.1.62 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/fs-detectors@5.14.3 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/gatsby-plugin-vercel-builder@2.1.9 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/h3@0.1.68 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/hono@0.2.62 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/koa@0.1.42 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/nestjs@0.2.63 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/node@5.7.1 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/static-build@2.9.9 ### Patch Changes - Updated dependencies \[]: - @vercel/gatsby-plugin-vercel-builder@2.1.9 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…re-digest validation hook (#15856) Callers that handle large functions (multi-GiB) need to stream zips to disk instead of holding them in memory. The current `finalizeLambda` always creates an in-memory `Buffer`, forcing callers to duplicate the entire finalization pipeline (encrypted env, environment setup, streaming detection) just to swap out the zip step. Additionally, callers need to validate zip size before `sha256` runs so the size check must come first. ### How - Add optional `createZip` callback to `FinalizeLambdaParams`. Callers can provide a custom ZIP strategy (e.g. streaming to disk) and the shared function handles everything else - Add optional `validateZip` hook that runs after zip creation but before digest computation - Add `size` and `zipPath to `FinalizeLambdaResult` so callers don't need to re-derive them - Extend `TraceFn` with optional tags param so callers can attach tracing metadata - Widen `getLambdaEnvironment` / `getLambdaPreloadScripts` `buffer` param from `Buffer` to `{ byteLength: number }` (this is what was actually used, removes the need for `as Buffer` casts when the zip is on disk. - Export new types: `CreateZipResult`, `CreateZipFn` ### Notes - No behavioral change for callers that don't use the new params - All new params are optional with backward-compatible defaults
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @vercel/build-utils@13.13.0 ### Minor Changes - Extend `finalizeLambda` with pluggable ZIP strategy (`createZip`), pre-digest validation hook (`validateZip`), and optional trace tags. Widen `getLambdaEnvironment` buffer param to `{ byteLength: number }`. ([#15856](#15856)) ## vercel@50.41.0 ### Minor Changes - Add `vercel edge-config` with `list`, `add`, `get`, `update`, `remove`, `items`, and `tokens` subcommands for Edge Config dashboard API parity. ([#15822](#15822)) - Add `vercel project checks` to list a project's deployment checks configuration (parity with dashboard), including `--format json` and non-interactive error payloads. ([#15816](#15816)) ### Patch Changes - Improve `vercel teams request` in non-interactive mode: validation, missing team scope, and API errors emit structured JSON on stdout with stable `reason` values and `next[]` commands that preserve global flags (for example `--cwd` and `--non-interactive`). ([#15815](#15815)) - Hide `--search` flag from `vc logs --help` output while continuing to accept it, and update the `--query` flag description to indicate advanced querying with filter syntax support. ([#15854](#15854)) - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 - @vercel/backends@0.0.56 - @vercel/elysia@0.1.59 - @vercel/express@0.1.69 - @vercel/fastify@0.1.62 - @vercel/go@3.4.7 - @vercel/h3@0.1.68 - @vercel/hono@0.2.62 - @vercel/hydrogen@1.3.6 - @vercel/koa@0.1.42 - @vercel/nestjs@0.2.63 - @vercel/next@4.16.5 - @vercel/node@5.7.1 - @vercel/python@6.29.0 - @vercel/redwood@2.4.12 - @vercel/remix-builder@5.7.2 - @vercel/ruby@2.3.2 - @vercel/rust@1.0.6 - @vercel/static-build@2.9.9 ## @vercel/backends@0.0.56 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/cervel@0.0.43 ### Patch Changes - Updated dependencies \[]: - @vercel/backends@0.0.56 ## @vercel/client@17.2.68 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/elysia@0.1.59 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/express@0.1.69 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 - @vercel/cervel@0.0.43 ## @vercel/fastify@0.1.62 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/fs-detectors@5.14.3 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/gatsby-plugin-vercel-builder@2.1.9 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/h3@0.1.68 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/hono@0.2.62 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/koa@0.1.42 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/nestjs@0.2.63 ### Patch Changes - Updated dependencies \[]: - @vercel/node@5.7.1 ## @vercel/node@5.7.1 ### Patch Changes - Updated dependencies \[[`a80217a9ed60d7b7f3e98537b0468cc5488078c1`](a80217a)]: - @vercel/build-utils@13.13.0 ## @vercel/static-build@2.9.9 ### Patch Changes - Updated dependencies \[]: - @vercel/gatsby-plugin-vercel-builder@2.1.9 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Follow up to: - #15856 After using the exported functions for existing callers, I realized we didn't get the `zipPath` type correct. As the goal is to avoid any semantic changes for existing callers, we have to fix it here.
Callers that handle large functions (multi-GiB) need to stream zips to disk instead of holding them in memory. The current
finalizeLambdaalways creates an in-memoryBuffer, forcing callers to duplicate the entire finalization pipeline (encrypted env, environment setup, streaming detection) just to swap out the zip step.Additionally, callers need to validate zip size before
sha256runs so the size check must come first.How
createZipcallback toFinalizeLambdaParams. Callers can provide a custom ZIP strategy (e.g. streaming to disk) and the shared function handles everything elsevalidateZiphook that runs after zip creation but before digest computationsizeandzipPath toFinalizeLambdaResult` so callers don't need to re-derive themTraceFnwith optional tags param so callers can attach tracing metadatagetLambdaEnvironment/getLambdaPreloadScriptsbufferparam fromBufferto{ byteLength: number }(this is what was actually used, removes the need foras Buffercasts when the zip is on disk.CreateZipResult,CreateZipFnNotes