Compare commits

..

91 Commits

Author SHA1 Message Date
Vercel Release Bot
96117d3f17 Version Packages (#11210)
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@7.7.1

### Patch Changes

- [build-utils] increase max memory limit
([#11209](https://github.com/vercel/vercel/pull/11209))

## vercel@33.5.4

### Patch Changes

- [build-utils] increase max memory limit
([#11209](https://github.com/vercel/vercel/pull/11209))

- Updated dependencies
\[[`b1d8b83ab`](b1d8b83abb),
[`37b193c84`](37b193c845),
[`20237d4f7`](20237d4f7b),
[`f8fab639b`](f8fab639bf),
[`6ed0fe6fb`](6ed0fe6fb1)]:
    -   @vercel/next@4.1.4
    -   @vercel/build-utils@7.7.1
    -   @vercel/remix-builder@2.1.1
    -   @vercel/static-build@2.4.1
    -   @vercel/node@3.0.21

## @vercel/client@13.1.4

### Patch Changes

- Updated dependencies
\[[`37b193c84`](37b193c845)]:
    -   @vercel/build-utils@7.7.1

## @vercel/fs-detectors@5.2.1

### Patch Changes

- [build-utils] increase max memory limit
([#11209](https://github.com/vercel/vercel/pull/11209))

## @vercel/gatsby-plugin-vercel-builder@2.0.19

### Patch Changes

- Updated dependencies
\[[`37b193c84`](37b193c845)]:
    -   @vercel/build-utils@7.7.1

## @vercel/next@4.1.4

### Patch Changes

- Enable partial prerendering support for pre-generated pages
([#11183](https://github.com/vercel/vercel/pull/11183))

## @vercel/node@3.0.21

### Patch Changes

- Updated dependencies
\[[`37b193c84`](37b193c845)]:
    -   @vercel/build-utils@7.7.1

## @vercel/remix-builder@2.1.1

### Patch Changes

- [build-utils] increase max memory limit
([#11209](https://github.com/vercel/vercel/pull/11209))

- Remove usage of `ensureResolvable()` in Vite builds
([#11213](https://github.com/vercel/vercel/pull/11213))

- Update `@remix-run/dev` fork to v2.8.0
([#11206](https://github.com/vercel/vercel/pull/11206))

- Ensure the symlink directory exists in `ensureSymlink()`
([#11205](https://github.com/vercel/vercel/pull/11205))

## @vercel/static-build@2.4.1

### Patch Changes

- [build-utils] increase max memory limit
([#11209](https://github.com/vercel/vercel/pull/11209))

-   Updated dependencies \[]:
    -   @vercel/gatsby-plugin-vercel-builder@2.0.19

## @vercel-internals/types@1.0.24

### Patch Changes

- Updated dependencies
\[[`37b193c84`](37b193c845)]:
    -   @vercel/build-utils@7.7.1

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-03-06 10:19:42 -06:00
Nathan Rajlich
20237d4f7b [remix] Remove usage of ensureResolvable() in Vite builds (#11213)
This function can lead to unexpected results (for example, in a monorepo setup where there were different versions of Remix being used, I encountered the wrong version of Remix being symlinked causing issues at runtime).

Instead, throw an error at build time at the NFT step if `@remix-run/node` is missing for routes using Node.js, or when `@remix-run/server-runtime` is missing for routes using Edge.

Less magical is better. Explicit is better than implicit.
2024-03-06 02:10:22 +00:00
Nathan Rajlich
293770a2f6 [cli] Fix failing test due to npm default change (#11230) 2024-03-05 17:52:19 -08:00
Nathan Rajlich
c9c0a203cc [examples] Update Remix template to use Vite (#11229)
Updates the Remix example template to use Vite and latest version of
dependencies.
2024-03-05 16:22:46 -08:00
Nathan Rajlich
5064dd404d Revert "[examples] Update Remix template to use Vite (#11217)" (#11227)
This reverts commit 1a45731c92. This
should not have been merged yet. There is still an issue with framework
detection selecting Vite instead of Remix preset.
2024-03-05 14:45:00 -08:00
Nathan Rajlich
1a45731c92 [examples] Update Remix template to use Vite (#11217)
Updates the Remix example template to use Vite and latest version of dependencies.
2024-03-05 20:10:19 +00:00
Trek Glowacki
168f9578cf [tests] Update dependabot.yml to ignore major/patch (#11223)
Update dependebot to skip patch and major version updates. Patch is too noisy, major requires a new fixture.
2024-03-05 19:49:38 +00:00
Vercel Release Bot
c2728ef9c0 [examples][tests] Upgrade Next.js to version 14.1.2 (#11224)
This auto-generated PR updates 7 packages to Next.js version 14.1.2
2024-03-05 10:15:27 -05:00
Trek Glowacki
c5fe7c2bea [examples] Bump Middleman and Jekyll dependencies to support ruby 3.x (#11203)
Some dependency updates are required to support Ruby 3.x+
2024-03-04 10:19:42 -06:00
Wyatt Johnson
b1d8b83abb [next] Support pre-generated pages without fallbacks with Partial Prerendering (#11183) 2024-03-01 18:29:31 -07:00
Vercel Release Bot
24ec5c5aca [examples][tests] Upgrade Next.js to version 14.1.1 (#11215)
This auto-generated PR updates 7 packages to Next.js version 14.1.1
2024-03-01 13:35:53 -05:00
Shohei Maeda
37b193c845 [build-utils] increase max memory limit (#11209)
internal ref. https://github.com/vercel/api/pull/25997

increasing max limit from 3008 -> 3009 MB

---------

Co-authored-by: Nathan Rajlich <n@n8.io>
2024-03-01 08:23:11 +09:00
Vercel Release Bot
f8fab639bf [remix] Update @remix-run/dev to v2.8.0 (#11206)
This auto-generated PR updates `@remix-run/dev` to version 2.8.0.
2024-02-29 19:21:11 +00:00
Nathan Rajlich
6ed0fe6fb1 [remix] Ensure the symlink directory exists in ensureSymlink() (#11205)
Customer reported an edge case where (in a monorepo) their project's
`package.json` did not list any dependencies (instead they are listed at
the root-level `package.json`) and this caused the `node_modules`
directory to not exist in the app subdirectory, causing
`ensureSymlink()` to fail.
2024-02-29 10:44:18 -08:00
Vercel Release Bot
de2738ba06 Version Packages (#11193)
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/frameworks@3.0.0

### Major Changes

- Make "remix" framework preset supersede "vite"
([#11031](https://github.com/vercel/vercel/pull/11031))

## @vercel/fs-detectors@5.2.0

### Minor Changes

- Make "remix" framework preset supersede "vite"
([#11031](https://github.com/vercel/vercel/pull/11031))

### Patch Changes

- Updated dependencies
\[[`1333071a3`](1333071a3a)]:
    -   @vercel/frameworks@3.0.0

## @vercel/remix-builder@2.1.0

### Minor Changes

- Remix Vite plugin support
([#11031](https://github.com/vercel/vercel/pull/11031))

## vercel@33.5.3

### Patch Changes

- Updated dependencies
\[[`c2d99855e`](c2d99855ea),
[`1333071a3`](1333071a3a)]:
    -   @vercel/next@4.1.3
    -   @vercel/remix-builder@2.1.0

## @vercel/next@4.1.3

### Patch Changes

- Fix manifest with experimental flag
([#11192](https://github.com/vercel/vercel/pull/11192))

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-02-28 11:34:25 -06:00
Nathan Rajlich
1333071a3a Remix Vite plugin support (#11031)
Adds support for Remix apps which use the new Remix Vite plugin.

* The vanilla Remix + Vite template deploys correctly out-of-the-box,
however only a single Node.js function will be used, and a warning will
be printed saying to configure the `vercelPreset()` Preset.
* When used in conjunction with the `vercelPreset()` Preset
(https://github.com/vercel/remix/pull/81), allows for the application to
utilize Vercel-specific features, like per-route `export const config`
configuration, including multi-runtime (Node.js / Edge runtimes) within
the same app.

## To test this today

1. Generate a Remix + Vite project from the template:
    ```
    npx create-remix@latest --template remix-run/remix/templates/vite
    ```
1. Install `@vercel/remix`:
    ```
    npm i --save-dev @vercel/remix
    ```
1. **(Before Remix v2.8.0 is released)** - Update the `@remix-run/dev`
dependency to use the "pre" tag which contains [a bug
fix](https://github.com/remix-run/remix/pull/8864):
    ```
    npm i --save--dev @remix-run/dev@pre @remix-run/serve@pre
    ```
1. Configure the `vercelPreset()` in the `vite.config.ts` file:
    ```diff
    --- a/vite.config.ts
    +++ b/vite.config.ts
    @@ -1,10 +1,11 @@
     import { vitePlugin as remix } from "@remix-run/dev";
     import { installGlobals } from "@remix-run/node";
     import { defineConfig } from "vite";
    +import { vercelPreset } from "@vercel/remix/vite";
     import tsconfigPaths from "vite-tsconfig-paths";
    
     installGlobals();
    
     export default defineConfig({
    -  plugins: [remix(), tsconfigPaths()],
    +  plugins: [remix({ presets: [vercelPreset()] }), tsconfigPaths()],
     });
    ```
1. Create a new Vercel Project in the dashboard, and ensure the Vercel
preset is set to "Remix" in the Project Settings. The autodetection will
work correctly once this PR is merged, but for now it gets incorrectly
detected as "Vite" preset.
* **Hint**: You can create a new empty Project by running the `vercel
link` command.
<img width="545" alt="Screenshot 2024-02-27 at 10 37 11"
src="https://github.com/vercel/vercel/assets/71256/f46baf57-5d97-4bde-9529-c9165632cb30">
1. Deploy to Vercel, setting the `VERCEL_CLI_VERSION` environment
variable to use the changes in this PR:
    ```
vercel deploy -b
VERCEL_CLI_VERSION=https://vercel-git-tootallnate-zero-1217-research-remix-v-next-vite.vercel.sh/tarballs/vercel.tgz
    ```
2024-02-28 11:22:05 -06:00
JJ Kasper
c2d99855ea Fix manifest with experimental flag (#11192)
This ensures we don't attempt the manifests filtering behavior with this
experimental flag enabled as it is incompatible with it as we don't know
what to filter by at this point.
2024-02-23 01:02:17 -08:00
Vercel Release Bot
0d112c848a Version Packages (#11154)
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@33.5.2

### Patch Changes

- Updated dependencies
\[[`e109e3325`](e109e3325a),
[`d17abf463`](d17abf463a),
[`644721a90`](644721a90d),
[`ea0e9aeae`](ea0e9aeaec),
[`e318a0eea`](e318a0eea5),
[`1fee87e76`](1fee87e76f),
[`bfc01fd98`](bfc01fd98f),
[`7910f2f30`](7910f2f307),
[`440ef3ba9`](440ef3ba98)]:
    -   @vercel/remix-builder@2.0.20
    -   @vercel/next@4.1.2
    -   @vercel/node@3.0.20
    -   @vercel/redwood@2.0.8

## @vercel/next@4.1.2

### Patch Changes

- Update experimental bundle flag
([#11187](https://github.com/vercel/vercel/pull/11187))

- [next] Add flag for experimental grouping
([#11177](https://github.com/vercel/vercel/pull/11177))

- bump `@vercel/nft@0.26.4`
([#11155](https://github.com/vercel/vercel/pull/11155))

- fix: missing experimental field
([#11184](https://github.com/vercel/vercel/pull/11184))

## @vercel/node@3.0.20

### Patch Changes

- bump `@vercel/nft@0.26.4`
([#11155](https://github.com/vercel/vercel/pull/11155))

## @vercel/redwood@2.0.8

### Patch Changes

- bump `@vercel/nft@0.26.4`
([#11155](https://github.com/vercel/vercel/pull/11155))

## @vercel/remix-builder@2.0.20

### Patch Changes

- Don't install Remix fork when not using split configuration
([#11152](https://github.com/vercel/vercel/pull/11152))

- Add `serverBundles` post-build sanity check and fallback
([#11153](https://github.com/vercel/vercel/pull/11153))

- bump `@vercel/nft@0.26.4`
([#11155](https://github.com/vercel/vercel/pull/11155))

- Update `@remix-run/dev` fork to v2.6.0
([#11162](https://github.com/vercel/vercel/pull/11162))

- Update `@remix-run/dev` fork to v2.7.0
([#11180](https://github.com/vercel/vercel/pull/11180))

- Update `@remix-run/dev` fork to v2.7.2
([#11186](https://github.com/vercel/vercel/pull/11186))

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-02-22 10:08:24 -06:00
JJ Kasper
d17abf463a Update experimental bundle flag (#11187)
Makes bailing from grouping logic more explicit
2024-02-21 20:53:16 -08:00
Vercel Release Bot
440ef3ba98 [remix] Update @remix-run/dev to v2.7.2 (#11186) 2024-02-21 16:27:49 -08:00
Wyatt Johnson
38c5e93625 Add immutability modifiers to types (#11182)
This doesn't change any functionality, and only replaces some mutable types (like `Map`, `Set`, and `Array`) with their immutable versions (like `ReadonlyMap`, `ReadonlySet`, and `ReadonlyArray`). This can help keep functions as pure as possible and improves the readability of some of the involved functions.
2024-02-21 17:50:56 +00:00
Vercel Release Bot
4d51d777fe [tests] Upgrade Turbo to version 1.12.4 (#11173)
This auto-generated PR updates Turbo to version 1.12.4
2024-02-21 15:56:50 +00:00
JJ Kasper
1fee87e76f fix: missing experimental field (#11184)
Ensures we pass this through properly when the flag is enabled
2024-02-20 23:11:38 -08:00
JJ Kasper
ea0e9aeaec [next] Add flag for experimental grouping (#11177)
Just adds a flag for experimenting
2024-02-20 18:03:03 -08:00
Vercel Release Bot
7910f2f307 [remix] Update @remix-run/dev to v2.7.0 (#11180)
This auto-generated PR updates `@remix-run/dev` to version 2.7.0.
2024-02-20 17:34:45 -08:00
Trek Glowacki
670441620f [tests] Add hydrogen-2023 to static-build test fixtures (#11163)
Add hydrogen-2023 to static-build test fixtures
2024-02-15 14:59:00 -06:00
Vercel Release Bot
bfc01fd98f [remix] Update @remix-run/dev to v2.6.0 (#11162)
This auto-generated PR updates `@remix-run/dev` to version 2.6.0.
2024-02-15 19:32:15 +00:00
Trek Glowacki
6d74b9b61a [tests] Add astro to dependabot (#11161)
Add astro to dependabot
2024-02-15 12:41:02 -06:00
dependabot[bot]
9483d49f72 [framework-fixtures]: Bump the core group in /packages/static-build/test/fixtures/angular-v17 with 15 updates (#11160)
Bumps the core group in /packages/static-build/test/fixtures/angular-v17 with 15 updates:

| Package | From | To |
| --- | --- | --- |
| [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `17.0.7` | `17.2.1` |
| [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `17.0.7` | `17.2.1` |
| [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `17.0.7` | `17.2.1` |
| [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `17.0.7` | `17.2.1` |
| [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `17.0.7` | `17.2.1` |
| [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `17.0.7` | `17.2.1` |
| [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `17.0.7` | `17.2.1` |
| [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `17.0.7` | `17.2.1` |
| [@angular-devkit/build-angular](https://github.com/angular/angular-cli) | `17.0.7` | `17.2.0` |
| [@angular/cli](https://github.com/angular/angular-cli) | `17.0.7` | `17.2.0` |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `17.0.7` | `17.2.1` |
| [@angular-devkit/architect](https://github.com/angular/angular-cli) | `0.1700.7` | `0.1702.0` |
| [@angular-devkit/build-webpack](https://github.com/angular/angular-cli) | `0.1700.7` | `0.1702.0` |
| [@angular-devkit/core](https://github.com/angular/angular-cli) | `17.0.7` | `17.2.0` |
| [@angular-devkit/schematics](https://github.com/angular/angular-cli) | `17.0.7` | `17.2.0` |

Updates `@angular/animations` from 17.0.7 to 17.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/angular/angular/releases"><code>@​angular/animations</code>'s releases</a>.</em></p>
<blockquote>
<h2>v17.2.1</h2>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.1 (2024-02-14)</h1>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7234824228"><img src="https://img.shields.io/badge/7234824228-fix-green" alt="fix - 7234824228" /></a></td>
<td>fix broken version detection condition (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54443">#54443</a>)</td>
</tr>
</tbody>
</table>
<h2>v17.2.0</h2>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.0 (2024-02-14)</h1>
<h3>common</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="03c3b3eb79"><img src="https://img.shields.io/badge/03c3b3eb79-feat-blue" alt="feat - 03c3b3eb79" /></a></td>
<td>add Netlify image loader (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54311">#54311</a>)</td>
</tr>
<tr>
<td><a href="f5c520b836"><img src="https://img.shields.io/badge/f5c520b836-feat-blue" alt="feat - f5c520b836" /></a></td>
<td>add placeholder to NgOptimizedImage (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53783">#53783</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="47e6e84101"><img src="https://img.shields.io/badge/47e6e84101-feat-blue" alt="feat - 47e6e84101" /></a></td>
<td>Add a TSConfig option <code>useTemplatePipeline</code> (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54057">#54057</a>)</td>
</tr>
<tr>
<td><a href="66e940aebf"><img src="https://img.shields.io/badge/66e940aebf-feat-blue" alt="feat - 66e940aebf" /></a></td>
<td>scope selectors in <a href="https://github.com/starting-style"><code>@​starting-style</code></a> (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53943">#53943</a>)</td>
</tr>
<tr>
<td><a href="7b4d275f49"><img src="https://img.shields.io/badge/7b4d275f49-fix-green" alt="fix - 7b4d275f49" /></a></td>
<td>Fix the template pipeline option (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54148">#54148</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7e861c640e"><img src="https://img.shields.io/badge/7e861c640e-feat-blue" alt="feat - 7e861c640e" /></a></td>
<td>generate extra imports for component local dependencies in local mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="3263df23f2"><img src="https://img.shields.io/badge/3263df23f2-feat-blue" alt="feat - 3263df23f2" /></a></td>
<td>generate global imports in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="b774e22d8e"><img src="https://img.shields.io/badge/b774e22d8e-feat-blue" alt="feat - b774e22d8e" /></a></td>
<td>make it configurable to generate alias reexports (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53937">#53937</a>)</td>
</tr>
<tr>
<td><a href="3e1384048e"><img src="https://img.shields.io/badge/3e1384048e-feat-blue" alt="feat - 3e1384048e" /></a></td>
<td>support host directives for local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53877">#53877</a>)</td>
</tr>
<tr>
<td><a href="a592904c69"><img src="https://img.shields.io/badge/a592904c69-fix-green" alt="fix - a592904c69" /></a></td>
<td>allow custom/duplicate decorators for <code>@Injectable</code> classes in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="4b1d948b36"><img src="https://img.shields.io/badge/4b1d948b36-fix-green" alt="fix - 4b1d948b36" /></a></td>
<td>consider the case of duplicate Angular decorators in local compilation diagnostics (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="96bcf4fb12"><img src="https://img.shields.io/badge/96bcf4fb12-fix-green" alt="fix - 96bcf4fb12" /></a></td>
<td>forbid custom/duplicate decorator when option <code>forbidOrphanComponents</code> is set (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="64fa5715c6"><img src="https://img.shields.io/badge/64fa5715c6-fix-green" alt="fix - 64fa5715c6" /></a></td>
<td>generating extra imports in local compilation mode when cycle is introduced (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="6c8b09468a"><img src="https://img.shields.io/badge/6c8b09468a-fix-green" alt="fix - 6c8b09468a" /></a></td>
<td>highlight the unresolved element in the <a href="https://github.com/Component"><code>@​Component</code></a>.styles array for the error LOCAL_COMPILATION_UNRESOLVED_CONST (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="0970129e20"><img src="https://img.shields.io/badge/0970129e20-fix-green" alt="fix - 0970129e20" /></a></td>
<td>show proper error for custom decorators in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53983">#53983</a>)</td>
</tr>
<tr>
<td><a href="f39cb06418"><img src="https://img.shields.io/badge/f39cb06418-fix-green" alt="fix - f39cb06418" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/Directive"><code>@​Directive</code></a>.exportAs in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="f3851b5945"><img src="https://img.shields.io/badge/f3851b5945-fix-green" alt="fix - f3851b5945" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/HostBinding"><code>@​HostBinding</code></a>'s argument in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="39ddd884e8"><img src="https://img.shields.io/badge/39ddd884e8-fix-green" alt="fix - 39ddd884e8" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/HostListener"><code>@​HostListener</code></a>'s event name in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="5d633240fd"><img src="https://img.shields.io/badge/5d633240fd-fix-green" alt="fix - 5d633240fd" /></a></td>
<td>show the correct message for the error LOCAL_COMPILATION_UNRESOLVED_CONST when an unresolved symbol used for <a href="https://github.com/Component"><code>@​Component</code></a>.styles (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="58b8a232d6"><img src="https://img.shields.io/badge/58b8a232d6-fix-green" alt="fix - 58b8a232d6" /></a></td>
<td>support jumping to definitions of signal-based inputs (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54053">#54053</a>)</td>
</tr>
</tbody>
</table>
<h3>core</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="702ab28b4c"><img src="https://img.shields.io/badge/702ab28b4c-feat-blue" alt="feat - 702ab28b4c" /></a></td>
<td>add support for model inputs (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54252">#54252</a>)</td>
</tr>
<tr>
<td><a href="e95ef2cbc6"><img src="https://img.shields.io/badge/e95ef2cbc6-feat-blue" alt="feat - e95ef2cbc6" /></a></td>
<td>expose queries as signals (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54283">#54283</a>)</td>
</tr>
<tr>
<td><a href="656bc282e3"><img src="https://img.shields.io/badge/656bc282e3-fix-green" alt="fix - 656bc282e3" /></a></td>
<td>add toString implementation to signals (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54002">#54002</a>)</td>
</tr>
<tr>
<td><a href="62b87b4551"><img src="https://img.shields.io/badge/62b87b4551-fix-green" alt="fix - 62b87b4551" /></a></td>
<td>do not crash for signal query that does not have any matches (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54353">#54353</a>)</td>
</tr>
<tr>
<td><a href="4b96f370ee"><img src="https://img.shields.io/badge/4b96f370ee-fix-green" alt="fix - 4b96f370ee" /></a></td>
<td>expose model signal subcribe for type checking purposes (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54357">#54357</a>)</td>
</tr>
<tr>
<td><a href="744cb1e561"><img src="https://img.shields.io/badge/744cb1e561-fix-green" alt="fix - 744cb1e561" /></a></td>
<td>return the same children query results if there are no changes (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54392">#54392</a>)</td>
</tr>
<tr>
<td><a href="6d00115bf4"><img src="https://img.shields.io/badge/6d00115bf4-fix-green" alt="fix - 6d00115bf4" /></a></td>
<td>show placeholder block on the server with immediate trigger (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/54394">#54394</a>)</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/angular/angular/blob/main/CHANGELOG.md"><code>@​angular/animations</code>'s changelog</a>.</em></p>
<blockquote>
<h1>17.2.1 (2024-02-14)</h1>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7234824228">7234824228</a></td>
<td>fix</td>
<td>fix broken version detection condition (<a href="https://redirect.github.com/angular/angular/pull/54443">#54443</a>)</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.0 (2024-02-14)</h1>
<h3>common</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="03c3b3eb79">03c3b3eb79</a></td>
<td>feat</td>
<td>add Netlify image loader (<a href="https://redirect.github.com/angular/angular/pull/54311">#54311</a>)</td>
</tr>
<tr>
<td><a href="f5c520b836">f5c520b836</a></td>
<td>feat</td>
<td>add placeholder to NgOptimizedImage (<a href="https://redirect.github.com/angular/angular/pull/53783">#53783</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="47e6e84101">47e6e84101</a></td>
<td>feat</td>
<td>Add a TSConfig option <code>useTemplatePipeline</code> (<a href="https://redirect.github.com/angular/angular/pull/54057">#54057</a>)</td>
</tr>
<tr>
<td><a href="66e940aebf">66e940aebf</a></td>
<td>feat</td>
<td>scope selectors in <a href="https://github.com/starting-style"><code>@​starting-style</code></a> (<a href="https://redirect.github.com/angular/angular/pull/53943">#53943</a>)</td>
</tr>
<tr>
<td><a href="7b4d275f49">7b4d275f49</a></td>
<td>fix</td>
<td>Fix the template pipeline option (<a href="https://redirect.github.com/angular/angular/pull/54148">#54148</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7e861c640e">7e861c640e</a></td>
<td>feat</td>
<td>generate extra imports for component local dependencies in local mode (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="3263df23f2">3263df23f2</a></td>
<td>feat</td>
<td>generate global imports in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="b774e22d8e">b774e22d8e</a></td>
<td>feat</td>
<td>make it configurable to generate alias reexports (<a href="https://redirect.github.com/angular/angular/pull/53937">#53937</a>)</td>
</tr>
<tr>
<td><a href="3e1384048e">3e1384048e</a></td>
<td>feat</td>
<td>support host directives for local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/53877">#53877</a>)</td>
</tr>
<tr>
<td><a href="a592904c69">a592904c69</a></td>
<td>fix</td>
<td>allow custom/duplicate decorators for <code>@Injectable</code> classes in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="4b1d948b36">4b1d948b36</a></td>
<td>fix</td>
<td>consider the case of duplicate Angular decorators in local compilation diagnostics (<a href="https://redirect.github.com/angular/angular/pull/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="96bcf4fb12">96bcf4fb12</a></td>
<td>fix</td>
<td>forbid custom/duplicate decorator when option <code>forbidOrphanComponents</code> is set (<a href="https://redirect.github.com/angular/angular/pull/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="64fa5715c6">64fa5715c6</a></td>
<td>fix</td>
<td>generating extra imports in local compilation mode when cycle is introduced (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="6c8b09468a">6c8b09468a</a></td>
<td>fix</td>
<td>highlight the unresolved element in the <a href="https://github.com/Component"><code>@​Component</code></a>.styles array for the error LOCAL_COMPILATION_UNRESOLVED_CONST (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="0970129e20">0970129e20</a></td>
<td>fix</td>
<td>show proper error for custom decorators in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/53983">#53983</a>)</td>
</tr>
<tr>
<td><a href="f39cb06418">f39cb06418</a></td>
<td>fix</td>
<td>show specific error for unresolved <a href="https://github.com/Directive"><code>@​Directive</code></a>.exportAs in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="f3851b5945">f3851b5945</a></td>
<td>fix</td>
<td>show specific error for unresolved <a href="https://github.com/HostBinding"><code>@​HostBinding</code></a>'s argument in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="39ddd884e8">39ddd884e8</a></td>
<td>fix</td>
<td>show specific error for unresolved <a href="https://github.com/HostListener"><code>@​HostListener</code></a>'s event name in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="5d633240fd">5d633240fd</a></td>
<td>fix</td>
<td>show the correct message for the error LOCAL_COMPILATION_UNRESOLVED_CONST when an unresolved symbol used for <a href="https://github.com/Component"><code>@​Component</code></a>.styles (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="58b8a232d6">58b8a232d6</a></td>
<td>fix</td>
<td>support jumping to definitions of signal-based inputs (<a href="https://redirect.github.com/angular/angular/pull/54053">#54053</a>)</td>
</tr>
</tbody>
</table>
<h3>core</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="702ab28b4c">702ab28b4c</a></td>
<td>feat</td>
<td>add support for model inputs (<a href="https://redirect.github.com/angular/angular/pull/54252">#54252</a>)</td>
</tr>
<tr>
<td><a href="e95ef2cbc6">e95ef2cbc6</a></td>
<td>feat</td>
<td>expose queries as signals (<a href="https://redirect.github.com/angular/angular/pull/54283">#54283</a>)</td>
</tr>
<tr>
<td><a href="656bc282e3">656bc282e3</a></td>
<td>fix</td>
<td>add toString implementation to signals (<a href="https://redirect.github.com/angular/angular/pull/54002">#54002</a>)</td>
</tr>
<tr>
<td><a href="62b87b4551">62b87b4551</a></td>
<td>fix</td>
<td>do not crash for signal query that does not have any matches (<a href="https://redirect.github.com/angular/angular/pull/54353">#54353</a>)</td>
</tr>
<tr>
<td><a href="4b96f370ee">4b96f370ee</a></td>
<td>fix</td>
<td>expose model signal subcribe for type checking purposes (<a href="https://redirect.github.com/angular/angular/pull/54357">#54357</a>)</td>
</tr>
<tr>
<td><a href="744cb1e561">744cb1e561</a></td>
<td>fix</td>
<td>return the same children query results if there are no changes (<a href="https://redirect.github.com/angular/angular/pull/54392">#54392</a>)</td>
</tr>
<tr>
<td><a href="6d00115bf4">6d00115bf4</a></td>
<td>fix</td>
<td>show placeholder block on the server with immediate trigger (<a href="https://redirect.github.com/angular/angular/pull/54394">#54394</a>)</td>
</tr>
</tbody>
</table>
<h3>http</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="bbbe477f47"><code>bbbe477</code></a> refactor: migrate animations to prettier formatting (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/53977">#53977</a>)</li>
<li><a href="5ae85e4849"><code>5ae85e4</code></a> refactor(core): node removal notifies scheduler only when animations are enab...</li>
<li><a href="91f250dab7"><code>91f250d</code></a> build: configure cross-pkg resolution for api extraction (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/52499">#52499</a>)</li>
<li><a href="c4de4e1f89"><code>c4de4e1</code></a> refactor(docs-infra): build adev application using local generated assets (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/5">#5</a>...</li>
<li><a href="d7e7409e81"><code>d7e7409</code></a> refactor(animations): drop <code>convertToMap</code> &amp; <code>copyStyles</code> and use native funct...</li>
<li><a href="d28ce0a4cf"><code>d28ce0a</code></a> refactor(animations): use a spread operator instead of custom <code>copyObj</code> (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/52441">#52441</a>)</li>
<li><a href="6a347d36eb"><code>6a347d3</code></a> refactor(animations): use a spread operator to convert an iterable to an arra...</li>
<li><a href="635c3b4fa8"><code>635c3b4</code></a> refactor(animations): use existing helper methods. (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/52441">#52441</a>)</li>
<li><a href="5ee11a74ec"><code>5ee11a7</code></a> fix(animations): prevent the AsyncAnimationRenderer from calling the delegate...</li>
<li><a href="a02a745a4a"><code>a02a745</code></a> fix(animations): remove <code>finish</code> listener once player is destroyed (<a href="https://github.com/angular/angular/tree/HEAD/packages/animations/issues/51136">#51136</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/angular/angular/commits/17.2.1/packages/animations">compare view</a></li>
</ul>
</details>
<br />

Updates `@angular/common` from 17.0.7 to 17.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/angular/angular/releases"><code>@​angular/common</code>'s releases</a>.</em></p>
<blockquote>
<h2>v17.2.1</h2>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.1 (2024-02-14)</h1>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7234824228"><img src="https://img.shields.io/badge/7234824228-fix-green" alt="fix - 7234824228" /></a></td>
<td>fix broken version detection condition (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54443">#54443</a>)</td>
</tr>
</tbody>
</table>
<h2>v17.2.0</h2>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.0 (2024-02-14)</h1>
<h3>common</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="03c3b3eb79"><img src="https://img.shields.io/badge/03c3b3eb79-feat-blue" alt="feat - 03c3b3eb79" /></a></td>
<td>add Netlify image loader (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54311">#54311</a>)</td>
</tr>
<tr>
<td><a href="f5c520b836"><img src="https://img.shields.io/badge/f5c520b836-feat-blue" alt="feat - f5c520b836" /></a></td>
<td>add placeholder to NgOptimizedImage (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53783">#53783</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="47e6e84101"><img src="https://img.shields.io/badge/47e6e84101-feat-blue" alt="feat - 47e6e84101" /></a></td>
<td>Add a TSConfig option <code>useTemplatePipeline</code> (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54057">#54057</a>)</td>
</tr>
<tr>
<td><a href="66e940aebf"><img src="https://img.shields.io/badge/66e940aebf-feat-blue" alt="feat - 66e940aebf" /></a></td>
<td>scope selectors in <a href="https://github.com/starting-style"><code>@​starting-style</code></a> (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53943">#53943</a>)</td>
</tr>
<tr>
<td><a href="7b4d275f49"><img src="https://img.shields.io/badge/7b4d275f49-fix-green" alt="fix - 7b4d275f49" /></a></td>
<td>Fix the template pipeline option (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54148">#54148</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7e861c640e"><img src="https://img.shields.io/badge/7e861c640e-feat-blue" alt="feat - 7e861c640e" /></a></td>
<td>generate extra imports for component local dependencies in local mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="3263df23f2"><img src="https://img.shields.io/badge/3263df23f2-feat-blue" alt="feat - 3263df23f2" /></a></td>
<td>generate global imports in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="b774e22d8e"><img src="https://img.shields.io/badge/b774e22d8e-feat-blue" alt="feat - b774e22d8e" /></a></td>
<td>make it configurable to generate alias reexports (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53937">#53937</a>)</td>
</tr>
<tr>
<td><a href="3e1384048e"><img src="https://img.shields.io/badge/3e1384048e-feat-blue" alt="feat - 3e1384048e" /></a></td>
<td>support host directives for local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53877">#53877</a>)</td>
</tr>
<tr>
<td><a href="a592904c69"><img src="https://img.shields.io/badge/a592904c69-fix-green" alt="fix - a592904c69" /></a></td>
<td>allow custom/duplicate decorators for <code>@Injectable</code> classes in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="4b1d948b36"><img src="https://img.shields.io/badge/4b1d948b36-fix-green" alt="fix - 4b1d948b36" /></a></td>
<td>consider the case of duplicate Angular decorators in local compilation diagnostics (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="96bcf4fb12"><img src="https://img.shields.io/badge/96bcf4fb12-fix-green" alt="fix - 96bcf4fb12" /></a></td>
<td>forbid custom/duplicate decorator when option <code>forbidOrphanComponents</code> is set (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="64fa5715c6"><img src="https://img.shields.io/badge/64fa5715c6-fix-green" alt="fix - 64fa5715c6" /></a></td>
<td>generating extra imports in local compilation mode when cycle is introduced (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="6c8b09468a"><img src="https://img.shields.io/badge/6c8b09468a-fix-green" alt="fix - 6c8b09468a" /></a></td>
<td>highlight the unresolved element in the <a href="https://github.com/Component"><code>@​Component</code></a>.styles array for the error LOCAL_COMPILATION_UNRESOLVED_CONST (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="0970129e20"><img src="https://img.shields.io/badge/0970129e20-fix-green" alt="fix - 0970129e20" /></a></td>
<td>show proper error for custom decorators in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53983">#53983</a>)</td>
</tr>
<tr>
<td><a href="f39cb06418"><img src="https://img.shields.io/badge/f39cb06418-fix-green" alt="fix - f39cb06418" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/Directive"><code>@​Directive</code></a>.exportAs in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="f3851b5945"><img src="https://img.shields.io/badge/f3851b5945-fix-green" alt="fix - f3851b5945" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/HostBinding"><code>@​HostBinding</code></a>'s argument in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="39ddd884e8"><img src="https://img.shields.io/badge/39ddd884e8-fix-green" alt="fix - 39ddd884e8" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/HostListener"><code>@​HostListener</code></a>'s event name in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="5d633240fd"><img src="https://img.shields.io/badge/5d633240fd-fix-green" alt="fix - 5d633240fd" /></a></td>
<td>show the correct message for the error LOCAL_COMPILATION_UNRESOLVED_CONST when an unresolved symbol used for <a href="https://github.com/Component"><code>@​Component</code></a>.styles (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="58b8a232d6"><img src="https://img.shields.io/badge/58b8a232d6-fix-green" alt="fix - 58b8a232d6" /></a></td>
<td>support jumping to definitions of signal-based inputs (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54053">#54053</a>)</td>
</tr>
</tbody>
</table>
<h3>core</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="702ab28b4c"><img src="https://img.shields.io/badge/702ab28b4c-feat-blue" alt="feat - 702ab28b4c" /></a></td>
<td>add support for model inputs (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54252">#54252</a>)</td>
</tr>
<tr>
<td><a href="e95ef2cbc6"><img src="https://img.shields.io/badge/e95ef2cbc6-feat-blue" alt="feat - e95ef2cbc6" /></a></td>
<td>expose queries as signals (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54283">#54283</a>)</td>
</tr>
<tr>
<td><a href="656bc282e3"><img src="https://img.shields.io/badge/656bc282e3-fix-green" alt="fix - 656bc282e3" /></a></td>
<td>add toString implementation to signals (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54002">#54002</a>)</td>
</tr>
<tr>
<td><a href="62b87b4551"><img src="https://img.shields.io/badge/62b87b4551-fix-green" alt="fix - 62b87b4551" /></a></td>
<td>do not crash for signal query that does not have any matches (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54353">#54353</a>)</td>
</tr>
<tr>
<td><a href="4b96f370ee"><img src="https://img.shields.io/badge/4b96f370ee-fix-green" alt="fix - 4b96f370ee" /></a></td>
<td>expose model signal subcribe for type checking purposes (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54357">#54357</a>)</td>
</tr>
<tr>
<td><a href="744cb1e561"><img src="https://img.shields.io/badge/744cb1e561-fix-green" alt="fix - 744cb1e561" /></a></td>
<td>return the same children query results if there are no changes (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54392">#54392</a>)</td>
</tr>
<tr>
<td><a href="6d00115bf4"><img src="https://img.shields.io/badge/6d00115bf4-fix-green" alt="fix - 6d00115bf4" /></a></td>
<td>show placeholder block on the server with immediate trigger (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54394">#54394</a>)</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/angular/angular/blob/main/CHANGELOG.md"><code>@​angular/common</code>'s changelog</a>.</em></p>
<blockquote>
<h1>17.2.1 (2024-02-14)</h1>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7234824228">7234824228</a></td>
<td>fix</td>
<td>fix broken version detection condition (<a href="https://redirect.github.com/angular/angular/pull/54443">#54443</a>)</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.0 (2024-02-14)</h1>
<h3>common</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="03c3b3eb79">03c3b3eb79</a></td>
<td>feat</td>
<td>add Netlify image loader (<a href="https://redirect.github.com/angular/angular/pull/54311">#54311</a>)</td>
</tr>
<tr>
<td><a href="f5c520b836">f5c520b836</a></td>
<td>feat</td>
<td>add placeholder to NgOptimizedImage (<a href="https://redirect.github.com/angular/angular/pull/53783">#53783</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="47e6e84101">47e6e84101</a></td>
<td>feat</td>
<td>Add a TSConfig option <code>useTemplatePipeline</code> (<a href="https://redirect.github.com/angular/angular/pull/54057">#54057</a>)</td>
</tr>
<tr>
<td><a href="66e940aebf">66e940aebf</a></td>
<td>feat</td>
<td>scope selectors in <a href="https://github.com/starting-style"><code>@​starting-style</code></a> (<a href="https://redirect.github.com/angular/angular/pull/53943">#53943</a>)</td>
</tr>
<tr>
<td><a href="7b4d275f49">7b4d275f49</a></td>
<td>fix</td>
<td>Fix the template pipeline option (<a href="https://redirect.github.com/angular/angular/pull/54148">#54148</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7e861c640e">7e861c640e</a></td>
<td>feat</td>
<td>generate extra imports for component local dependencies in local mode (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="3263df23f2">3263df23f2</a></td>
<td>feat</td>
<td>generate global imports in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="b774e22d8e">b774e22d8e</a></td>
<td>feat</td>
<td>make it configurable to generate alias reexports (<a href="https://redirect.github.com/angular/angular/pull/53937">#53937</a>)</td>
</tr>
<tr>
<td><a href="3e1384048e">3e1384048e</a></td>
<td>feat</td>
<td>support host directives for local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/53877">#53877</a>)</td>
</tr>
<tr>
<td><a href="a592904c69">a592904c69</a></td>
<td>fix</td>
<td>allow custom/duplicate decorators for <code>@Injectable</code> classes in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="4b1d948b36">4b1d948b36</a></td>
<td>fix</td>
<td>consider the case of duplicate Angular decorators in local compilation diagnostics (<a href="https://redirect.github.com/angular/angular/pull/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="96bcf4fb12">96bcf4fb12</a></td>
<td>fix</td>
<td>forbid custom/duplicate decorator when option <code>forbidOrphanComponents</code> is set (<a href="https://redirect.github.com/angular/angular/pull/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="64fa5715c6">64fa5715c6</a></td>
<td>fix</td>
<td>generating extra imports in local compilation mode when cycle is introduced (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="6c8b09468a">6c8b09468a</a></td>
<td>fix</td>
<td>highlight the unresolved element in the <a href="https://github.com/Component"><code>@​Component</code></a>.styles array for the error LOCAL_COMPILATION_UNRESOLVED_CONST (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="0970129e20">0970129e20</a></td>
<td>fix</td>
<td>show proper error for custom decorators in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/53983">#53983</a>)</td>
</tr>
<tr>
<td><a href="f39cb06418">f39cb06418</a></td>
<td>fix</td>
<td>show specific error for unresolved <a href="https://github.com/Directive"><code>@​Directive</code></a>.exportAs in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="f3851b5945">f3851b5945</a></td>
<td>fix</td>
<td>show specific error for unresolved <a href="https://github.com/HostBinding"><code>@​HostBinding</code></a>'s argument in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="39ddd884e8">39ddd884e8</a></td>
<td>fix</td>
<td>show specific error for unresolved <a href="https://github.com/HostListener"><code>@​HostListener</code></a>'s event name in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="5d633240fd">5d633240fd</a></td>
<td>fix</td>
<td>show the correct message for the error LOCAL_COMPILATION_UNRESOLVED_CONST when an unresolved symbol used for <a href="https://github.com/Component"><code>@​Component</code></a>.styles (<a href="https://redirect.github.com/angular/angular/pull/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="58b8a232d6">58b8a232d6</a></td>
<td>fix</td>
<td>support jumping to definitions of signal-based inputs (<a href="https://redirect.github.com/angular/angular/pull/54053">#54053</a>)</td>
</tr>
</tbody>
</table>
<h3>core</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="702ab28b4c">702ab28b4c</a></td>
<td>feat</td>
<td>add support for model inputs (<a href="https://redirect.github.com/angular/angular/pull/54252">#54252</a>)</td>
</tr>
<tr>
<td><a href="e95ef2cbc6">e95ef2cbc6</a></td>
<td>feat</td>
<td>expose queries as signals (<a href="https://redirect.github.com/angular/angular/pull/54283">#54283</a>)</td>
</tr>
<tr>
<td><a href="656bc282e3">656bc282e3</a></td>
<td>fix</td>
<td>add toString implementation to signals (<a href="https://redirect.github.com/angular/angular/pull/54002">#54002</a>)</td>
</tr>
<tr>
<td><a href="62b87b4551">62b87b4551</a></td>
<td>fix</td>
<td>do not crash for signal query that does not have any matches (<a href="https://redirect.github.com/angular/angular/pull/54353">#54353</a>)</td>
</tr>
<tr>
<td><a href="4b96f370ee">4b96f370ee</a></td>
<td>fix</td>
<td>expose model signal subcribe for type checking purposes (<a href="https://redirect.github.com/angular/angular/pull/54357">#54357</a>)</td>
</tr>
<tr>
<td><a href="744cb1e561">744cb1e561</a></td>
<td>fix</td>
<td>return the same children query results if there are no changes (<a href="https://redirect.github.com/angular/angular/pull/54392">#54392</a>)</td>
</tr>
<tr>
<td><a href="6d00115bf4">6d00115bf4</a></td>
<td>fix</td>
<td>show placeholder block on the server with immediate trigger (<a href="https://redirect.github.com/angular/angular/pull/54394">#54394</a>)</td>
</tr>
</tbody>
</table>
<h3>http</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="1c536250b6"><code>1c53625</code></a> fix(http): Use string body to generate transfer cache key. (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54379">#54379</a>)</li>
<li><a href="03c3b3eb79"><code>03c3b3e</code></a> feat(common): add Netlify image loader (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54311">#54311</a>)</li>
<li><a href="122213d37d"><code>122213d</code></a> fix(common): The date pipe should return ISO format for week and week-year as...</li>
<li><a href="4a44f73288"><code>4a44f73</code></a> docs: Update docs about equality. (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54158">#54158</a>)</li>
<li><a href="0460a9dfaf"><code>0460a9d</code></a> refactor: migrate common to prettier formatting (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/54150">#54150</a>)</li>
<li><a href="f3567bbc26"><code>f3567bb</code></a> refactor(common): simplify i18n plural and select pipe metadata (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53939">#53939</a>)</li>
<li><a href="3c881acc5d"><code>3c881ac</code></a> refactor(common): simplify date pipe metadata (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53939">#53939</a>)</li>
<li><a href="15c48113c2"><code>15c4811</code></a> refactor(router): Update integration tests to cover navigation and history AP...</li>
<li><a href="f5c520b836"><code>f5c520b</code></a> feat(common): add placeholder to NgOptimizedImage (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/53783">#53783</a>)</li>
<li><a href="7800a3c9f5"><code>7800a3c</code></a> refactor(core): remove <code>InjectionToken</code> descriptions in optimized builds. (<a href="https://github.com/angular/angular/tree/HEAD/packages/common/issues/5">#5</a>...</li>
<li>Additional commits viewable in <a href="https://github.com/angular/angular/commits/17.2.1/packages/common">compare view</a></li>
</ul>
</details>
<br />

Updates `@angular/compiler` from 17.0.7 to 17.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/angular/angular/releases"><code>@​angular/compiler</code>'s releases</a>.</em></p>
<blockquote>
<h2>v17.2.1</h2>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.1 (2024-02-14)</h1>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7234824228"><img src="https://img.shields.io/badge/7234824228-fix-green" alt="fix - 7234824228" /></a></td>
<td>fix broken version detection condition (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54443">#54443</a>)</td>
</tr>
</tbody>
</table>
<h2>v17.2.0</h2>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.0 (2024-02-14)</h1>
<h3>common</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="03c3b3eb79"><img src="https://img.shields.io/badge/03c3b3eb79-feat-blue" alt="feat - 03c3b3eb79" /></a></td>
<td>add Netlify image loader (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54311">#54311</a>)</td>
</tr>
<tr>
<td><a href="f5c520b836"><img src="https://img.shields.io/badge/f5c520b836-feat-blue" alt="feat - f5c520b836" /></a></td>
<td>add placeholder to NgOptimizedImage (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53783">#53783</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="47e6e84101"><img src="https://img.shields.io/badge/47e6e84101-feat-blue" alt="feat - 47e6e84101" /></a></td>
<td>Add a TSConfig option <code>useTemplatePipeline</code> (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54057">#54057</a>)</td>
</tr>
<tr>
<td><a href="66e940aebf"><img src="https://img.shields.io/badge/66e940aebf-feat-blue" alt="feat - 66e940aebf" /></a></td>
<td>scope selectors in <a href="https://github.com/starting-style"><code>@​starting-style</code></a> (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53943">#53943</a>)</td>
</tr>
<tr>
<td><a href="7b4d275f49"><img src="https://img.shields.io/badge/7b4d275f49-fix-green" alt="fix - 7b4d275f49" /></a></td>
<td>Fix the template pipeline option (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54148">#54148</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7e861c640e"><img src="https://img.shields.io/badge/7e861c640e-feat-blue" alt="feat - 7e861c640e" /></a></td>
<td>generate extra imports for component local dependencies in local mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="3263df23f2"><img src="https://img.shields.io/badge/3263df23f2-feat-blue" alt="feat - 3263df23f2" /></a></td>
<td>generate global imports in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="b774e22d8e"><img src="https://img.shields.io/badge/b774e22d8e-feat-blue" alt="feat - b774e22d8e" /></a></td>
<td>make it configurable to generate alias reexports (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53937">#53937</a>)</td>
</tr>
<tr>
<td><a href="3e1384048e"><img src="https://img.shields.io/badge/3e1384048e-feat-blue" alt="feat - 3e1384048e" /></a></td>
<td>support host directives for local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53877">#53877</a>)</td>
</tr>
<tr>
<td><a href="a592904c69"><img src="https://img.shields.io/badge/a592904c69-fix-green" alt="fix - a592904c69" /></a></td>
<td>allow custom/duplicate decorators for <code>@Injectable</code> classes in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="4b1d948b36"><img src="https://img.shields.io/badge/4b1d948b36-fix-green" alt="fix - 4b1d948b36" /></a></td>
<td>consider the case of duplicate Angular decorators in local compilation diagnostics (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="96bcf4fb12"><img src="https://img.shields.io/badge/96bcf4fb12-fix-green" alt="fix - 96bcf4fb12" /></a></td>
<td>forbid custom/duplicate decorator when option <code>forbidOrphanComponents</code> is set (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54139">#54139</a>)</td>
</tr>
<tr>
<td><a href="64fa5715c6"><img src="https://img.shields.io/badge/64fa5715c6-fix-green" alt="fix - 64fa5715c6" /></a></td>
<td>generating extra imports in local compilation mode when cycle is introduced (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="6c8b09468a"><img src="https://img.shields.io/badge/6c8b09468a-fix-green" alt="fix - 6c8b09468a" /></a></td>
<td>highlight the unresolved element in the <a href="https://github.com/Component"><code>@​Component</code></a>.styles array for the error LOCAL_COMPILATION_UNRESOLVED_CONST (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="0970129e20"><img src="https://img.shields.io/badge/0970129e20-fix-green" alt="fix - 0970129e20" /></a></td>
<td>show proper error for custom decorators in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/53983">#53983</a>)</td>
</tr>
<tr>
<td><a href="f39cb06418"><img src="https://img.shields.io/badge/f39cb06418-fix-green" alt="fix - f39cb06418" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/Directive"><code>@​Directive</code></a>.exportAs in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="f3851b5945"><img src="https://img.shields.io/badge/f3851b5945-fix-green" alt="fix - f3851b5945" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/HostBinding"><code>@​HostBinding</code></a>'s argument in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="39ddd884e8"><img src="https://img.shields.io/badge/39ddd884e8-fix-green" alt="fix - 39ddd884e8" /></a></td>
<td>show specific error for unresolved <a href="https://github.com/HostListener"><code>@​HostListener</code></a>'s event name in local compilation mode (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="5d633240fd"><img src="https://img.shields.io/badge/5d633240fd-fix-green" alt="fix - 5d633240fd" /></a></td>
<td>show the correct message for the error LOCAL_COMPILATION_UNRESOLVED_CONST when an unresolved symbol used for <a href="https://github.com/Component"><code>@​Component</code></a>.styles (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54230">#54230</a>)</td>
</tr>
<tr>
<td><a href="58b8a232d6"><img src="https://img.shields.io/badge/58b8a232d6-fix-green" alt="fix - 58b8a232d6" /></a></td>
<td>support jumping to definitions of signal-based inputs (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54053">#54053</a>)</td>
</tr>
</tbody>
</table>
<h3>core</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="702ab28b4c"><img src="https://img.shields.io/badge/702ab28b4c-feat-blue" alt="feat - 702ab28b4c" /></a></td>
<td>add support for model inputs (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54252">#54252</a>)</td>
</tr>
<tr>
<td><a href="e95ef2cbc6"><img src="https://img.shields.io/badge/e95ef2cbc6-feat-blue" alt="feat - e95ef2cbc6" /></a></td>
<td>expose queries as signals (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54283">#54283</a>)</td>
</tr>
<tr>
<td><a href="656bc282e3"><img src="https://img.shields.io/badge/656bc282e3-fix-green" alt="fix - 656bc282e3" /></a></td>
<td>add toString implementation to signals (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54002">#54002</a>)</td>
</tr>
<tr>
<td><a href="62b87b4551"><img src="https://img.shields.io/badge/62b87b4551-fix-green" alt="fix - 62b87b4551" /></a></td>
<td>do not crash for signal query that does not have any matches (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54353">#54353</a>)</td>
</tr>
<tr>
<td><a href="4b96f370ee"><img src="https://img.shields.io/badge/4b96f370ee-fix-green" alt="fix - 4b96f370ee" /></a></td>
<td>expose model signal subcribe for type checking purposes (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54357">#54357</a>)</td>
</tr>
<tr>
<td><a href="744cb1e561"><img src="https://img.shields.io/badge/744cb1e561-fix-green" alt="fix - 744cb1e561" /></a></td>
<td>return the same children query results if there are no changes (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54392">#54392</a>)</td>
</tr>
<tr>
<td><a href="6d00115bf4"><img src="https://img.shields.io/badge/6d00115bf4-fix-green" alt="fix - 6d00115bf4" /></a></td>
<td>show placeholder block on the server with immediate trigger (<a href="https://github.com/angular/angular/tree/HEAD/packages/compiler/issues/54394">#54394</a>)</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/angular/angular/blob/main/CHANGELOG.md"><code>@​angular/compiler</code>'s changelog</a>.</em></p>
<blockquote>
<h1>17.2.1 (2024-02-14)</h1>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7234824228">7234824228</a></td>
<td>fix</td>
<td>fix broken version detection condition (<a href="https://redirect.github.com/angular/angular/pull/54443">#54443</a>)</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h1>17.2.0 (2024-02-14)</h1>
<h3>common</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="03c3b3eb79">03c3b3eb79</a></td>
<td>feat</td>
<td>add Netlify image loader (<a href="https://redirect.github.com/angular/angular/pull/54311">#54311</a>)</td>
</tr>
<tr>
<td><a href="f5c520b836">f5c520b836</a></td>
<td>feat</td>
<td>add placeholder to NgOptimizedImage (<a href="https://redirect.github.com/angular/angular/pull/53783">#53783</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="47e6e84101">47e6e84101</a></td>
<td>feat</td>
<td>Add a TSConfig option <code>useTemplatePipeline</code> (<a href="https://redirect.github.com/angular/angular/pull/54057">#54057</a>)</td>
</tr>
<tr>
<td><a href="66e940aebf">66e940aebf</a></td>
<td>feat</td>
<td>scope selectors in <a href="https://github.com/starting-style"><code>@​starting-style</code></a> (<a href="https://redirect.github.com/angular/angular/pull/53943">#53943</a>)</td>
</tr>
<tr>
<td><a href="7b4d275f49">7b4d275f49</a></td>
<td>fix</td>
<td>Fix the template pipeline option (<a href="https://redirect.github.com/angular/angular/pull/54148">#54148</a>)</td>
</tr>
</tbody>
</table>
<h3>compiler-cli</h3>
<table>
<thead>
<tr>
<th>Commit</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="7e861c640e">7e861c640e</a></td>
<td>feat</td>
<td>generate extra imports for component local dependencies in local mode (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="3263df23f2">3263df23f2</a></td>
<td>feat</td>
<td>generate global imports in local compilation mode (<a href="https://redirect.github.com/angular/angular/pull/53543">#53543</a>)</td>
</tr>
<tr>
<td><a href="https://github.com/angular/angular/commit/b774e22d8e384f43e9cd8f5c...

_Description has been truncated_
2024-02-15 17:25:58 +00:00
Trek Glowacki
6740f9b155 [tests] Add dependabot for fixture updates (#11159)
Gradually adding dependabot updaters to avoid the problem of getting
hundreds of individual updates:

* Using the new `groups` key (new as of [~September
2023](https://github.blog/changelog/2023-08-24-grouped-version-updates-for-dependabot-are-generally-available/)).
* Focused only to "core" dependencies of the framework.
* Tested on [separate
repo](https://github.com/trek/test-dependabot/pull/5) to avoid PR spam.
2024-02-15 10:53:13 -06:00
Trek Glowacki
b663f813e1 Restore ruby fixtures post deploy (#11151)
These fixtures were disabled to allow us to do a deploy of some newer
ruby stuff. Restoring them now that the changes are out.
2024-02-14 13:18:58 -06:00
Steven
e318a0eea5 [node][next][redwood][remix] bump @vercel/nft@0.26.4 (#11155)
- Release https://github.com/vercel/nft/releases/tag/0.26.4
2024-02-13 18:12:48 -05:00
Nathan Rajlich
644721a90d [remix] Add serverBundles post-build sanity check and fallback (#11153)
Adds a check to ensure the `serverBuildPath` for the server bundles was created. If it was not, then that means the Vercel forked Remix compiler was not used, and we must fall back to a singular server bundle.
2024-02-13 22:04:40 +00:00
Nathan Rajlich
e109e3325a [remix] Don't install Remix fork when not using split configuration (#11152)
The fork of the Remix compiler is only necessary when the project is utilizing split configurations in their routes (i.e. mixing Node.js and Edge functions).

However, the injecting of the forked compiler has proven to be brittle and has many edge cases which cause the fork to not be present. Considering that the more common case is to _not_ use split configuration, skip the fork entirely when that is the case.

This is somewhat of a band-aid / hold over for the "old" Remix. With the Remix + Vite configuration, the fork will be entirely unnecessary.
2024-02-13 21:26:31 +00:00
Vercel Release Bot
92b2fbe372 [tests] Upgrade Turbo to version 1.12.3 (#11139)
This auto-generated PR updates Turbo to version 1.12.3
2024-02-13 18:18:03 +00:00
Vercel Release Bot
e50fe2b37c Version Packages (#11149)
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@7.7.0

### Minor Changes

- Revert "Revert "Default ruby to only currently supported version
(3.2.0)"" ([#11137](https://github.com/vercel/vercel/pull/11137))

## @vercel/static-build@2.4.0

### Minor Changes

- Revert "Revert "Default ruby to only currently supported version
(3.2.0)"" ([#11137](https://github.com/vercel/vercel/pull/11137))

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/gatsby-plugin-vercel-builder@2.0.18

## vercel@33.5.1

### Patch Changes

- build: upgrade edge-runtime
([#11148](https://github.com/vercel/vercel/pull/11148))

- Updated dependencies
\[[`24c3dd282`](24c3dd282d),
[`10e200e0b`](10e200e0bf),
[`678ebbe52`](678ebbe525)]:
    -   @vercel/build-utils@7.7.0
    -   @vercel/static-build@2.4.0
    -   @vercel/node@3.0.19

## @vercel/client@13.1.3

### Patch Changes

- Updated dependencies
\[[`24c3dd282`](24c3dd282d)]:
    -   @vercel/build-utils@7.7.0

## @vercel/gatsby-plugin-vercel-builder@2.0.18

### Patch Changes

- Updated dependencies
\[[`24c3dd282`](24c3dd282d)]:
    -   @vercel/build-utils@7.7.0

## @vercel/node@3.0.19

### Patch Changes

- build: upgrade edge-runtime
([#11148](https://github.com/vercel/vercel/pull/11148))

- refactor: simplify content-length check
([#11150](https://github.com/vercel/vercel/pull/11150))

- Updated dependencies
\[[`24c3dd282`](24c3dd282d)]:
    -   @vercel/build-utils@7.7.0

## @vercel-internals/types@1.0.23

### Patch Changes

- Updated dependencies
\[[`24c3dd282`](24c3dd282d)]:
    -   @vercel/build-utils@7.7.0

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-02-13 11:52:52 -06:00
Kiko Beats
678ebbe525 refactor: simplify content-length check (#11150)
Co-authored-by: Sean Massa <EndangeredMassa@gmail.com>
2024-02-13 11:45:29 -06:00
Kiko Beats
10e200e0bf build: upgrade edge-runtime (#11148)
Upgrade Edge Runtime and related dependencies 🙂

---------

Co-authored-by: Sean Massa <EndangeredMassa@gmail.com>
2024-02-13 11:20:11 -06:00
Trek Glowacki
24c3dd282d Revert "Revert "Default ruby to only currently supported version (3.2.0)"" (#11137)
🔁 Uno Reverse! 🔁
2024-02-13 14:52:46 +00:00
Sean Massa
142a397d8e [tests] fix next.js tests (#11145)
The Next.js change in https://github.com/vercel/next.js/pull/61794 means
that the `Vary` header will contain `Next-Url` less often. We need to
update the assertions on our end to accommodate.
2024-02-13 08:27:46 -06:00
Vercel Release Bot
0dd9a27859 Version Packages (#11108)
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@7.6.0

### Minor Changes

- Revert "Default ruby to only currently supported version (3.2.0)"
([#11135](https://github.com/vercel/vercel/pull/11135))

- Mark `flags` as deprecated and replace them with `variants`
([#11098](https://github.com/vercel/vercel/pull/11098))

- [build-utils] change default package manager when no lockfile detected
from `yarn` to `npm` (gated behind feature flag)
([#11131](https://github.com/vercel/vercel/pull/11131))

### Patch Changes

- Update internal type for variants
([#11111](https://github.com/vercel/vercel/pull/11111))

## vercel@33.5.0

### Minor Changes

- Mark `flags` as deprecated and replace them with `variants`
([#11098](https://github.com/vercel/vercel/pull/11098))

### Patch Changes

- Updated dependencies
\[[`c32a909af`](c32a909afc),
[`b6ed28b9b`](b6ed28b9b1),
[`d21bb9f87`](d21bb9f87e),
[`4027a1833`](4027a18337),
[`8ba0ce932`](8ba0ce9324),
[`0d034b682`](0d034b6820),
[`abaa700ce`](abaa700cea),
[`3bad73401`](3bad73401b)]:
    -   @vercel/next@4.1.1
    -   @vercel/node@3.0.18
    -   @vercel/redwood@2.0.7
    -   @vercel/remix-builder@2.0.19
    -   @vercel/build-utils@7.6.0
    -   @vercel/static-build@2.3.0

## @vercel/static-build@2.3.0

### Minor Changes

- Revert "Default ruby to only currently supported version (3.2.0)"
([#11135](https://github.com/vercel/vercel/pull/11135))

### Patch Changes

- Updated dependencies
\[[`ab2444466`](ab24444660)]:
    -   @vercel/gatsby-plugin-vercel-builder@2.0.17

## @vercel/client@13.1.2

### Patch Changes

- Updated dependencies
\[[`b6ed28b9b`](b6ed28b9b1),
[`8ba0ce932`](8ba0ce9324),
[`0d034b682`](0d034b6820),
[`abaa700ce`](abaa700cea)]:
    -   @vercel/build-utils@7.6.0

## @vercel/gatsby-plugin-vercel-builder@2.0.17

### Patch Changes

- [gatsby-plugin-vercel-builder] use --keep-names esbuild flag
([#11117](https://github.com/vercel/vercel/pull/11117))

- Updated dependencies
\[[`b6ed28b9b`](b6ed28b9b1),
[`8ba0ce932`](8ba0ce9324),
[`0d034b682`](0d034b6820),
[`abaa700ce`](abaa700cea)]:
    -   @vercel/build-utils@7.6.0

## @vercel/next@4.1.1

### Patch Changes

- [node][next][redwood][remix] bump `@vercel/nft@0.26.3`
([#11115](https://github.com/vercel/vercel/pull/11115))

- Load common chunks on module initialization
([#11126](https://github.com/vercel/vercel/pull/11126))

- Fix index normalizing for app outputs
([#11099](https://github.com/vercel/vercel/pull/11099))

- Mark `flags` as deprecated and replace them with `variants`
([#11098](https://github.com/vercel/vercel/pull/11098))

- Fix rewrite RSC handling with trailingSlash
([#11107](https://github.com/vercel/vercel/pull/11107))

## @vercel/node@3.0.18

### Patch Changes

- [node][next][redwood][remix] bump `@vercel/nft@0.26.3`
([#11115](https://github.com/vercel/vercel/pull/11115))

- Updated dependencies
\[[`b6ed28b9b`](b6ed28b9b1),
[`8ba0ce932`](8ba0ce9324),
[`0d034b682`](0d034b6820),
[`abaa700ce`](abaa700cea)]:
    -   @vercel/build-utils@7.6.0

## @vercel/redwood@2.0.7

### Patch Changes

- [node][next][redwood][remix] bump `@vercel/nft@0.26.3`
([#11115](https://github.com/vercel/vercel/pull/11115))

## @vercel/remix-builder@2.0.19

### Patch Changes

- [node][next][redwood][remix] bump `@vercel/nft@0.26.3`
([#11115](https://github.com/vercel/vercel/pull/11115))

## @vercel-internals/types@1.0.22

### Patch Changes

- Updated dependencies
\[[`b6ed28b9b`](b6ed28b9b1),
[`8ba0ce932`](8ba0ce9324),
[`0d034b682`](0d034b6820),
[`abaa700ce`](abaa700cea)]:
    -   @vercel/build-utils@7.6.0

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-02-09 10:26:27 -06:00
Trek Glowacki
b6ed28b9b1 Revert "Default ruby to only currently supported version (3.2.0)" (#11135)
This reverts commit de63e35622 / #11104.
We had no great way to test this without release but we have other
things we'd like to deploy today. Will revert the revert when we're
closer to fixing just this issue.
2024-02-09 10:10:18 -06:00
Steven
0d034b6820 [build-utils] change default package manager when no lockfile detected from yarn to npm (gated behind feature flag) (#11131)
This PR changes the default package manager from `yarn` to `npm` in the case that no lockfile is present.

Many years ago when `yarn` was first released, it was much faster than `npm` so we used it by default. That is no longer the case today and `yarn@1` is no longer receiving new features.

For example, `sharp` and `esbuild` no longer works with `yarn@1`:


### Related

- https://github.com/lovell/sharp/issues/3750
- https://github.com/evanw/esbuild/issues/2949

Note that this change will not impact most projects because most used a lockfile.
2024-02-08 21:26:01 +00:00
Trek Glowacki
05c8be1a6d [static-build] Add a new Astro@4 fixture (#11090)
Add a new Astro@4 fixture. We were missing this one entirely.
2024-02-08 17:27:47 +00:00
Javi Velasco
d21bb9f87e [next] Preload common chunks (#11126)
This PR adds requiring the modules that _we know_ will be required in
the Next.js Lambda in the module scope in a attempt to make a better use
of resources.

---------

Co-authored-by: JJ Kasper <jj@jjsweb.site>
2024-02-06 11:51:38 -08:00
Shohei Maeda
ab24444660 [gatsby-plugin-vercel-builder] use --keep-names esbuild flag (#11117)
Some packages are very sensitive to minification.
For example: https://github.com/node-fetch/node-fetch/issues/784 which ends up in runtime error, and is hard to notice as they don't reproduce on local dev.

Setting `--keep-names` should prevent those edge cases: https://esbuild.github.io/api/#keep-names
2024-02-05 21:15:50 +00:00
Vercel Release Bot
20080d4ae7 [tests] Upgrade Turbo to version 1.12.2 (#11122)
This auto-generated PR updates Turbo to version 1.12.2
2024-02-05 15:34:48 +00:00
Steven
c32a909afc [node][next][redwood][remix] bump @vercel/nft@0.26.3 (#11115)
https://github.com/vercel/nft/releases/tag/0.26.3
2024-02-01 21:56:27 +00:00
Andy
abaa700cea [build-utils] Update variants type (#11111)
Follow up to https://github.com/vercel/vercel/pull/11098 to address the type changes.
2024-02-01 14:44:38 +00:00
Andy
8ba0ce9324 [cli] Add Variants to Build Output API (#11098)
Makes adjustments to replace `flags` with `variants`.

Also marks the current `flags` implementation as deprecated, as it
should get removed soon. Which I'll do in a follow up PR.
2024-02-01 10:28:12 +01:00
JJ Kasper
4027a18337 Fix index normalizing for app outputs (#11099)
This ensures we don't apply the index output normalizing for app paths which was previously already gated for prerenders but not all routes.
2024-01-31 22:13:23 +00:00
JJ Kasper
3bad73401b Fix rewrite RSC handling with trailingSlash (#11107)
This ensures our rewrite patching to handle RSC requests handles a trailing slash being present with added regression tests.
2024-01-30 22:34:17 +00:00
Vercel Release Bot
50e135ea47 Version Packages (#11106)
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/static-build@2.2.0

### Minor Changes

- Default ruby to only currently supported version (3.2.0)
([#11104](https://github.com/vercel/vercel/pull/11104))

### Patch Changes

- [tests] Update Gatsby fixture versions
([#11101](https://github.com/vercel/vercel/pull/11101))

## vercel@33.4.1

### Patch Changes

- Updated dependencies
\[[`d05e41eea`](d05e41eeaf),
[`de63e3562`](de63e35622)]:
    -   @vercel/static-build@2.2.0

## @vercel/client@13.1.1

### Patch Changes

- More helpful error message when `vc deploy --prebuilt` has missing
files ([#11105](https://github.com/vercel/vercel/pull/11105))

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-01-30 16:07:17 -06:00
Vercel Release Bot
d05e41eeaf [tests] Update Gatsby fixture versions (#11101)
Automatically generated PR to update Gatsby fixture versions in `@vercel/static-build`
2024-01-30 21:35:14 +00:00
Trek Glowacki
de63e35622 Default ruby to only currently supported version (3.2.0) (#11104)
We're currently using the directory name at `./vendor/bundle/ruby/`[0]
to determine ruby version. This directory is created as part of running
`bundle install` during the build process. However, when multiple ruby
versions are available, you can end up with multiple directories and the
0th entry at `./vendor/bundle/ruby/` isn't guaranteed to be the Ruby
version specified in the project.

Other companies in this space seem to do some order of 
 - check for value in `.ruby-version` file
 - check for value passed into `ruby` directive in the Gemfile
- check the value in the `*.gemspec` file if the Gemfile has a `gemspec`
directive.

We'll do that work in a future PR but for _now_ our only supported Ruby
version is Ruby 3.2.x [as of
2023-11-22](https://vercel.com/changelog/upgrading-ruby-v2-7-to-v3-2).
So this can be hard-coded for the moment.

Skipping ruby tests now since these target _current_ prod where Ruby
3.2.x is not in `PATH` until we redeploy after this gets deployed.
2024-01-30 15:10:17 -06:00
Nathan Rajlich
4d1ab422d3 [client] More helpful error message when vc deploy --prebuilt has missing files (#11105)
Print a more helpful error message for the scenario the user encountered here: https://github.com/orgs/vercel/discussions/5612

What was happening in they were running `vc build` in one GH Action job, and then `vc deploy --prebuilt` in a different job. The later job was does not have `node_modules` populated, causing the deploy command to fail:

<img width="1374" alt="Screenshot 2024-01-29 at 6 31 19 PM" src="https://github.com/vercel/vercel/assets/71256/0402c2fb-35bb-435c-bf4c-10368a27f3ee">

The updated error message hints to the user that the `node_modules` should be installed for the command to succeed:

<img width="813" alt="Screenshot 2024-01-29 at 6 30 54 PM" src="https://github.com/vercel/vercel/assets/71256/2c095e61-9b8a-4dac-9eb7-56363a8b89b8">
2024-01-30 05:09:33 +00:00
Vercel Release Bot
a03cfa1040 Version Packages (#11103)
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@33.4.0

### Minor Changes

- Added a new option to add a sensitive environment variable
([#11033](https://github.com/vercel/vercel/pull/11033))

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-01-29 11:19:25 -06:00
Trek Glowacki
eaae86d776 [static-build] update umijs@4 fixture to latest (#11089) 2024-01-29 16:08:28 +00:00
Ana Trajkovska
77bc00f92e [cli] Add support for sensitive env var (#11033)
This PR updates the `vercel env add` command to support a new option
called `--sensitive` that allows an env var to be created of type
`sensitive`.
2024-01-29 16:48:07 +01:00
Vercel Release Bot
19a373288f Version Packages (#11079)
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@33.3.0

### Minor Changes

- Emit "filePathMap" in `vc-config.json` for `FileFsRef` instances
([#11060](https://github.com/vercel/vercel/pull/11060))

### Patch Changes

- Update `vc dev` to support `Lambda` instances without `zipBuffer`
([#11080](https://github.com/vercel/vercel/pull/11080))

- Updated dependencies
\[[`322c88536`](322c88536d),
[`62ca2efa7`](62ca2efa73)]:
    -   @vercel/ruby@2.0.5
    -   @vercel/python@4.1.1

## @vercel/client@13.1.0

### Minor Changes

- Upload files referenced by "filePathMap" during `vc deploy --prebuilt`
([#11077](https://github.com/vercel/vercel/pull/11077))

## @vercel/python@4.1.1

### Patch Changes

- Remove deprecated `createLambda()` usage
([#11080](https://github.com/vercel/vercel/pull/11080))

## @vercel/ruby@2.0.5

### Patch Changes

- add ruby3 to path during build
([#11094](https://github.com/vercel/vercel/pull/11094))

- Remove deprecated `createLambda()` usage
([#11080](https://github.com/vercel/vercel/pull/11080))

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-01-25 14:29:57 -06:00
Sean Massa
322c88536d add ruby3 to path during build (#11094)
Add ruby to the path plus some debug code. I'll remove the debug code
after we verify this works.
2024-01-25 14:16:53 -06:00
Trek Glowacki
1f259d5eb9 [static-build] Update parcel@2 fixture to latest minor (#11087) 2024-01-24 21:51:10 +00:00
Trek Glowacki
3759da57ab [static-build] update blitzjs@2 fixture to latest minor (#11086)
update blitzjs@2 fixture to latest minor
2024-01-24 10:15:16 -06:00
Nathan Rajlich
30ba68edf9 [cli] Emit "filePathMap" in vc-config.json for FileFsRef instances (#11060)
This is a performance / bandwidth / storage space optimization for the **Build Output API**.

When a Builder returns function which contains a file that is a `FileFsRef` instance, it _won't_ be copied into the corresponding `.func` directory, but instead will be added to a `"files"` mapping in the `.vc-config.json` file. This mapping represents keys which are destination file paths within the function filesystem, and values which are relative paths from the root of the project codebase. This allows for common files (i.e. `node_modules`) to be referenced (instead of physically copied on the disk).

This introduces an additional complexity to `vc deploy --prebuilt`, in such that now it needs to build up the list of `"files"` referenced from the `.vc-config.json` files, and _also_ upload those file paths along with the `.vercel/output` directory.

Depends on:

* https://github.com/vercel/vercel/pull/11077
* https://github.com/vercel/vercel/pull/11080
2024-01-23 20:54:34 +00:00
Nathan Rajlich
62ca2efa73 [python][ruby][cli] Remove deprecated createLambda() usage (#11080)
* Use `Lambda` constructor instead of `createLambda()`
* Return `FileBlob` instance for the entrypoint files, so that they do not get written to cwd
* In `vc dev`, support `Lambda` instances which do not have `zipBuffer` property
2024-01-23 19:53:36 +00:00
Nathan Rajlich
2b71ee6b42 [client] Upload files referenced by "filePathMap" during vc deploy --prebuilt (#11077)
Ensure that files referenced by the `filePathMap` property in the `.vc-config.json` files for functions in the Build Output API `.vercel/output` directory are uploaded during the prebuilt deployment process.

Related to / precursor for https://github.com/vercel/vercel/pull/11060.
2024-01-22 22:48:12 +00:00
Vercel Release Bot
acb2acf953 Version Packages (#11034)
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@33.2.0

### Minor Changes

-   chore: deprecate next/nuxt/gastby Speed Insights injection in favor of @vercel/speed-insights ([#11048](https://github.com/vercel/vercel/pull/11048))

### Patch Changes

-   fix error when @vercel/analytics is a transitive dependency of the deployed application ([#10892](https://github.com/vercel/vercel/pull/10892))

-   [cli] Add documentation string for `skip-domain` option ([#11051](https://github.com/vercel/vercel/pull/11051))

-   Updated dependencies \[[`260125784`](2601257846), [`cdddb33ad`](cdddb33ad4), [`72d8604c9`](72d8604c9d), [`90d0455e1`](90d0455e1f), [`0716130e5`](0716130e58), [`b6b151f39`](b6b151f391), [`b185a7e20`](b185a7e207)]:
    -   @vercel/static-build@2.1.0
    -   @vercel/build-utils@7.5.1
    -   @vercel/next@4.1.0
    -   @vercel/remix-builder@2.0.18
    -   @vercel/node@3.0.17

## @vercel/next@4.1.0

### Minor Changes

-   fix error when @vercel/analytics is a transitive dependency of the deployed application ([#10892](https://github.com/vercel/vercel/pull/10892))

### Patch Changes

-   Use `worker.name` instead of edge function name to fix type error in `@vercel/next` ([#11050](https://github.com/vercel/vercel/pull/11050))

## @vercel/static-build@2.1.0

### Minor Changes

-   chore: deprecate next/nuxt/gastby Speed Insights injection in favor of @vercel/speed-insights ([#11048](https://github.com/vercel/vercel/pull/11048))

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/gatsby-plugin-vercel-builder@2.0.16

## @vercel/build-utils@7.5.1

### Patch Changes

-   Add experimental field to Lambda and size to FileFsRef output ([#11059](https://github.com/vercel/vercel/pull/11059))

## @vercel/client@13.0.14

### Patch Changes

-   Updated dependencies \[[`cdddb33ad`](cdddb33ad4)]:
    -   @vercel/build-utils@7.5.1

## @vercel/gatsby-plugin-vercel-builder@2.0.16

### Patch Changes

-   Updated dependencies \[[`cdddb33ad`](cdddb33ad4)]:
    -   @vercel/build-utils@7.5.1

## @vercel/node@3.0.17

### Patch Changes

-   Updated dependencies \[[`cdddb33ad`](cdddb33ad4)]:
    -   @vercel/build-utils@7.5.1

## @vercel/remix-builder@2.0.18

### Patch Changes

-   Fix functions without a output path edge case ([#11038](https://github.com/vercel/vercel/pull/11038))

-   Update `@remix-run/dev` fork to v2.5.0 ([#11054](https://github.com/vercel/vercel/pull/11054))

-   Update `@remix-run/dev` fork to v2.5.1 ([#11065](https://github.com/vercel/vercel/pull/11065))

## @vercel-internals/types@1.0.21

### Patch Changes

-   Updated dependencies \[[`cdddb33ad`](cdddb33ad4)]:
    -   @vercel/build-utils@7.5.1
2024-01-19 22:07:42 +00:00
Damien Simonin Feugas
2601257846 [cli, static-builds] deprecation notice for speed insights injection (#11048)
### 🧐 What's in there?

With the recent release of [`@vercel/speed-insights`](https://vercel.com/docs/speed-insights/package) own package (like [`@vercel/analytics`](https://vercel.com/docs/analytics/package)), it's time to encourage users to migrate.

With the availability of `@vercel/speed-insights`, users will have to opt-in explicitly by installing the package. Their benefit is a better and fine-grained control of the reporting (in particular, per-application sample rate).

###  Note to reviewers

I used `console.warn` and hope it will stands out in the build logs. I'm happy to use anything else if you have better suggestions.

There's also a deprecation warning in Next.js, which covers a related but slightly different case, when users explicitly pass analyticsId in their configuration. https://github.com/vercel/next.js/pull/60677
2024-01-19 19:10:31 +00:00
jane
30b0925218 fix support link (#11067) 2024-01-19 16:55:43 +00:00
Vercel Release Bot
eddd432e06 [examples][tests] Upgrade Next.js to version 14.1.0 (#11066)
This auto-generated PR updates 7 packages to Next.js version 14.1.0

Co-authored-by: Steven <steven@ceriously.com>
2024-01-19 11:08:14 -05:00
Vercel Release Bot
b185a7e207 [remix] Update @remix-run/dev to v2.5.1 (#11065)
This auto-generated PR updates `@remix-run/dev` to version 2.5.1.
2024-01-19 00:29:36 +00:00
Trek Glowacki
5c910bf937 [static-build] bump stencil test fixture to latest (#11058)
Bump stencil test fixture to latest
2024-01-18 23:15:45 +00:00
JJ Kasper
cdddb33ad4 Add experimental field to Lambda and size to FileFsRef output (#11059)
This adds a new experimental field for new bundling behavior. This also
adds an optional `size` field to the FileFsRef output since we already
stat to avoid having to re-stat to get this value.
2024-01-18 14:51:54 -08:00
JJ Kasper
0da7ea7b78 Add retry handling when hitting SSO (#11061)
This aims to reduce flakiness when SSO disabling for a test project is
still disabling/propagating.

x-ref:
https://github.com/vercel/vercel/actions/runs/7563953104/job/20597320056?pr=11059
x-ref:
https://github.com/vercel/vercel/actions/runs/7563953104/job/20597322078?pr=11059

---------

Co-authored-by: Nathan Rajlich <n@n8.io>
Co-authored-by: Sean Massa <EndangeredMassa@gmail.com>
2024-01-18 13:17:49 -08:00
Trek Glowacki
7de754398e [cli] Add documentation string for skip-domain option (#11051)
Text taken directly from https://vercel.com/docs/cli/deploy#skip-domain
2024-01-18 18:10:22 +00:00
Trek Glowacki
d4cc520814 [tests] update FastAPI fixture to latest (#11053)
Bumping this test fixture for python to keep up with releases.
2024-01-17 19:57:44 +00:00
Sean Massa
03d07dd163 update codeowners (#11057)
Update codeowners for shifting responsibilities.
2024-01-17 11:22:47 -06:00
Vercel Release Bot
b6b151f391 [remix] Update @remix-run/dev to v2.5.0 (#11054)
This auto-generated PR updates `@remix-run/dev` to version 2.5.0.
2024-01-17 05:07:26 +00:00
Vercel Release Bot
8c4b732d41 [tests] Upgrade Turbo to version 1.11.3 (#11021)
This auto-generated PR updates Turbo to version 1.11.3
2024-01-17 00:07:06 +00:00
Nathan Rajlich
d4335f0b56 Remove @cb1kenobi from CODEOWNERS (#11039)
:salute:
2024-01-16 15:43:30 -08:00
Nathan Rajlich
90d0455e1f [remix] Fix functions without a output path edge case (#11038)
Fixes an edge case where a route without a path was causing the build to
fail. Reproducible with this `remix.config.js` file:

```js
export default {
    ignoredRouteFiles: ["**/.*"],
    routes(defineRoutes) {
        return defineRoutes((route) => {
            route("/", "foo.tsx", { index: true });
        });
    },
};
```
2024-01-16 14:37:05 -08:00
Ethan Arrowood
0716130e58 Use worker.name instead of edge function name to fix type error in @vercel/next (#11050)
Uses another `name` property instead of the now deprecated one.
2024-01-16 12:56:28 -08:00
Ethan Arrowood
8b7479fb6e [python] update fastapi to 0.105.0 (#10958)
Updates python fixture `fastapi` to version `0.105.1`
2024-01-16 16:53:55 +00:00
Damien Simonin Feugas
72d8604c9d [cli] fix error when @vercel/analytics is a transitive dependency of the deployed application (#10892) 2024-01-11 15:48:20 +01:00
Vercel Release Bot
5fe7b57b8d Version Packages (#11015)
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@7.5.0

### Minor Changes

- Deprecate `EdgeFunction#name` property
([#11010](https://github.com/vercel/vercel/pull/11010))

## vercel@33.1.0

### Minor Changes

- Serialize duplicate `EdgeFunction` references as symlinks in `vc
build` ([#11027](https://github.com/vercel/vercel/pull/11027))

### Patch Changes

- Handle rate limit response when fetching /teams
([#11013](https://github.com/vercel/vercel/pull/11013))

- Display actual deployment's 'target'
([#11025](https://github.com/vercel/vercel/pull/11025))

- Updated dependencies
\[[`98040ec24`](98040ec24e)]:
    -   @vercel/build-utils@7.5.0
    -   @vercel/static-build@2.0.17
    -   @vercel/hydrogen@1.0.2
    -   @vercel/remix-builder@2.0.17
    -   @vercel/node@3.0.16

## @vercel/client@13.0.13

### Patch Changes

- Updated dependencies
\[[`98040ec24`](98040ec24e)]:
    -   @vercel/build-utils@7.5.0

## @vercel/gatsby-plugin-vercel-builder@2.0.15

### Patch Changes

- Updated dependencies
\[[`98040ec24`](98040ec24e)]:
    -   @vercel/build-utils@7.5.0

## @vercel/hydrogen@1.0.2

### Patch Changes

- Deprecate `EdgeFunction#name` property
([#11010](https://github.com/vercel/vercel/pull/11010))

## @vercel/node@3.0.16

### Patch Changes

- Deprecate `EdgeFunction#name` property
([#11010](https://github.com/vercel/vercel/pull/11010))

- Updated dependencies
\[[`98040ec24`](98040ec24e)]:
    -   @vercel/build-utils@7.5.0

## @vercel/remix-builder@2.0.17

### Patch Changes

- Deprecate `EdgeFunction#name` property
([#11010](https://github.com/vercel/vercel/pull/11010))

## @vercel/static-build@2.0.17

### Patch Changes

- Deprecate `EdgeFunction#name` property
([#11010](https://github.com/vercel/vercel/pull/11010))

-   Updated dependencies \[]:
    -   @vercel/gatsby-plugin-vercel-builder@2.0.15

## @vercel-internals/types@1.0.20

### Patch Changes

- Updated dependencies
\[[`98040ec24`](98040ec24e)]:
    -   @vercel/build-utils@7.5.0

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-01-10 15:51:08 -06:00
Nathan Rajlich
ab826eb83d [cli] Serialize duplicate EdgeFunction references as symlinks in vc build (#11027)
Enables the symlink optimization that currently exists for `Lambda`
instances, but now for `EdgeFunction` instances as well. This will be
particularly beneficial for Remix applications which use edge functions
for many routes, since they will now all be represented by the same
underling function in production.

---------

Co-authored-by: Sean Massa <EndangeredMassa@gmail.com>
2024-01-10 13:17:59 -08:00
Nathan Rajlich
98040ec24e [build-utils] Deprecate EdgeFunction#name property (#11010)
The `name` property of the `EdgeFunction` class is no longer necessary
on the infra side. Instead, its value is inferred based on the URL path
that the function is representing. So deprecate the property on the
class, and remove its usage throughout the codebase.
2024-01-10 12:32:38 -08:00
Chris Barber
21c700aa93 [cli] Display actual deployment's 'target' (#11025)
The CLI renders the deploy URL with the "Preview" label on first deploy because the CLI treats deploys as previews unless `--prod` is set. However the first deploy for a new project is always production, so the CLI needs to render the deploy URL based on the actual deployment's `target`.
2024-01-10 14:05:52 +00:00
Juan Pinilla
50ed13b6ed [docs] fix edge IP_HEADER_NAME header typedoc typo (#11028)
Fix small typo in the `IP_HEADER_NAME` description.

<img width="362" alt="Screenshot 2024-01-08 at 7 25 34 PM"
src="https://github.com/vercel/vercel/assets/762112/db4d684a-5a12-45d0-8428-981bf2489999">
2024-01-08 19:26:57 -08:00
Trek Glowacki
597508ffa6 [cli] handle rate limit respones when fetching /teams endpoint (#11013)
Not the biggest fan of handling this here but of all the various location we do response handling, this seems to be the appropriate location.
2024-01-04 15:04:54 +00:00
Vercel Release Bot
57ee3e1fd5 [tests] Update Gatsby fixture versions (#10995)
Automatically generated PR to update Gatsby fixture versions in `@vercel/static-build`
2024-01-04 07:08:17 +00:00
610 changed files with 48291 additions and 31795 deletions

View File

@@ -38,7 +38,7 @@ packages/static-build/test/cache-fixtures
packages/redwood/test/fixtures
# remix
packages/remix/test/fixtures
packages/remix/test/fixtures-*
# gatsby-plugin-vercel-analytics
packages/gatsby-plugin-vercel-analytics

16
.github/CODEOWNERS vendored
View File

@@ -2,17 +2,17 @@
# https://help.github.com/en/articles/about-code-owners
# Restricted Paths
* @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek
/.github/workflows @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek @ijjk
/packages/fs-detectors @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek @agadzik @chloetedder
/packages/next @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek @ijjk @ztanner
/packages/routing-utils @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek @ijjk
/packages/static-build @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek
/packages/edge @vercel/compute @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek
* @TooTallNate @EndangeredMassa @trek
/.github/workflows @TooTallNate @EndangeredMassa @trek @ijjk
/packages/fs-detectors @TooTallNate @EndangeredMassa @trek @agadzik @chloetedder
/packages/next @TooTallNate @EndangeredMassa @Ethan-Arrowood @trek @ijjk @ztanner
/packages/routing-utils @TooTallNate @EndangeredMassa @trek @ijjk
/packages/static-build @TooTallNate @EndangeredMassa @trek
/packages/edge @vercel/compute @TooTallNate @EndangeredMassa @trek
/examples @leerob
/examples/create-react-app @Timer
/examples/nextjs @timneutkens @ijjk @ztanner @huozhi
/packages/node @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek @Kikobeats
/packages/node @TooTallNate @EndangeredMassa @trek @Kikobeats
# Unrestricted Paths
.changeset/

View File

@@ -1,8 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: Bug Report
url: https://vercel.com/support/request
about: Report a bug using the Vercel support form
url: https://vercel.com/help
about: Reach out to our support team
- name: Feature Request
url: https://github.com/orgs/vercel/discussions/new?category=ideas
about: Share ideas for new features

79
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,79 @@
version: 2
updates:
- schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
directory: /packages/static-build/test/fixtures/angular-v17
allow:
- dependency-name: '@angular*'
ignore:
- dependency-name: '@angular*'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
groups:
core:
patterns:
- '@angular*'
update-types:
- 'minor'
- schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
directory: /packages/static-build/test/fixtures/astro-v4
allow:
- dependency-name: 'astro*'
ignore:
- dependency-name: 'astro*'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
groups:
core:
patterns:
- 'astro*'
update-types:
- 'minor'
- schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
directory: /packages/static-build/test/fixtures/hydrogen-v2023
allow:
- dependency-name: '@remix-run*'
- dependency-name: '@shopify*'
ignore:
- dependency-name: '@remix-run*'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
- dependency-name: '@shopify*'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
groups:
core:
patterns:
- '@remix-run*'
- '@shopify*'
update-types:
- 'minor'

View File

@@ -29,6 +29,7 @@ turbo-cache-key.json
packages/*/dist
packages/*/node_modules
packages/**/test/fixtures
packages/**/test/fixtures-*
packages/**/test/dev/fixtures
packages/**/test/build-fixtures
packages/**/test/cache-fixtures

View File

@@ -27,3 +27,6 @@ end
# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]
# Webrick not installed by default in Ruby 3.0+
gem "webrick"

View File

@@ -1,20 +1,20 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
colorator (1.1.0)
concurrent-ruby (1.1.8)
em-websocket (0.5.2)
concurrent-ruby (1.2.3)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.14.2)
ffi (1.16.3)
forwardable-extended (2.6.0)
http_parser.rb (0.6.0)
i18n (1.8.9)
http_parser.rb (0.8.0)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
jekyll (4.2.0)
jekyll (4.2.2)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
@@ -29,20 +29,20 @@ GEM
rouge (~> 3.0)
safe_yaml (~> 1.0)
terminal-table (~> 2.0)
jekyll-feed (0.15.1)
jekyll-feed (0.17.0)
jekyll (>= 3.7, < 5.0)
jekyll-sass-converter (2.1.0)
jekyll-sass-converter (2.2.0)
sassc (> 2.0.1, < 3.0)
jekyll-seo-tag (2.7.1)
jekyll-seo-tag (2.8.0)
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.3.0)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
listen (3.4.1)
liquid (4.0.4)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
@@ -52,21 +52,22 @@ GEM
jekyll-seo-tag (~> 2.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (4.0.6)
rb-fsevent (0.10.4)
public_suffix (5.0.4)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.4)
rouge (3.26.0)
rexml (3.2.6)
rouge (3.30.0)
safe_yaml (1.0.5)
sassc (2.4.0)
ffi (~> 1.9)
terminal-table (2.0.0)
unicode-display_width (~> 1.1, >= 1.1.1)
unicode-display_width (1.7.0)
unicode-display_width (1.8.0)
webrick (1.8.1)
PLATFORMS
x86_64-linux
ruby
DEPENDENCIES
jekyll (~> 4.2.0)
@@ -75,6 +76,7 @@ DEPENDENCIES
tzinfo (~> 1.2)
tzinfo-data
wdm (~> 0.1.1)
webrick
BUNDLED WITH
2.2.4
2.5.6

View File

@@ -1,6 +1,6 @@
source 'https://rubygems.org'
gem 'middleman', '~> 4.2'
gem 'middleman-autoprefixer', '~> 2.7'
gem 'middleman', '~> 4.5'
gem 'middleman-autoprefixer', '~> 3.0'
gem 'tzinfo-data', platforms: [:mswin, :mingw, :jruby, :x64_mingw]
gem 'wdm', '~> 0.1', platforms: [:mswin, :mingw, :x64_mingw]

View File

@@ -1,59 +1,60 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (5.2.4.5)
activesupport (7.0.8.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
autoprefixer-rails (9.8.6.5)
execjs
backports (3.20.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
autoprefixer-rails (10.4.16.0)
execjs (~> 2)
backports (3.24.1)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.8)
contracts (0.13.0)
dotenv (2.7.6)
concurrent-ruby (1.2.3)
contracts (0.16.1)
dotenv (3.1.0)
erubis (2.7.0)
execjs (2.7.0)
fast_blank (1.0.0)
fastimage (2.2.2)
ffi (1.14.2)
haml (5.2.1)
temple (>= 0.8.0)
execjs (2.9.1)
fast_blank (1.0.1)
fastimage (2.3.0)
ffi (1.16.3)
haml (6.3.0)
temple (>= 0.8.2)
thor
tilt
hamster (3.0.0)
concurrent-ruby (~> 1.0)
hashie (3.6.0)
i18n (0.9.5)
i18n (1.6.0)
concurrent-ruby (~> 1.0)
kramdown (2.3.0)
kramdown (2.4.0)
rexml
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
memoist (0.16.2)
middleman (4.3.11)
middleman (4.5.1)
coffee-script (~> 2.2)
haml (>= 4.0.5)
kramdown (>= 2.3.0)
middleman-cli (= 4.3.11)
middleman-core (= 4.3.11)
middleman-autoprefixer (2.10.1)
autoprefixer-rails (~> 9.1)
middleman-core (>= 3.3.3)
middleman-cli (4.3.11)
thor (>= 0.17.0, < 2.0)
middleman-core (4.3.11)
activesupport (>= 4.2, < 6.0)
addressable (~> 2.3)
middleman-cli (= 4.5.1)
middleman-core (= 4.5.1)
middleman-autoprefixer (3.0.0)
autoprefixer-rails (~> 10.0)
middleman-core (>= 4.0.0)
middleman-cli (4.5.1)
thor (>= 0.17.0, < 1.3.0)
middleman-core (4.5.1)
activesupport (>= 6.1, < 7.1)
addressable (~> 2.4)
backports (~> 3.6)
bundler
contracts (~> 0.13.0)
bundler (~> 2.0)
contracts (~> 0.13, < 0.17)
dotenv
erubis
execjs (~> 2.0)
@@ -61,48 +62,52 @@ GEM
fastimage (~> 2.0)
hamster (~> 3.0)
hashie (~> 3.4)
i18n (~> 0.9.0)
listen (~> 3.0.0)
i18n (~> 1.6.0)
listen (~> 3.0)
memoist (~> 0.14)
padrino-helpers (~> 0.13.0)
padrino-helpers (~> 0.15.0)
parallel
rack (>= 1.4.5, < 3)
sassc (~> 2.0)
servolux
tilt (~> 2.0.9)
toml
uglifier (~> 3.0)
minitest (5.14.3)
padrino-helpers (0.13.3.4)
i18n (~> 0.6, >= 0.6.7)
padrino-support (= 0.13.3.4)
webrick
minitest (5.22.2)
padrino-helpers (0.15.3)
i18n (>= 0.6.7, < 2)
padrino-support (= 0.15.3)
tilt (>= 1.4.1, < 3)
padrino-support (0.13.3.4)
activesupport (>= 3.1)
parallel (1.20.1)
public_suffix (4.0.6)
rack (2.2.3)
rb-fsevent (0.10.4)
padrino-support (0.15.3)
parallel (1.24.0)
parslet (2.0.0)
public_suffix (5.0.4)
rack (2.2.8.1)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.4)
rexml (3.2.6)
sassc (2.4.0)
ffi (~> 1.9)
servolux (0.13.0)
temple (0.8.2)
thor (1.1.0)
thread_safe (0.3.6)
tilt (2.0.10)
tzinfo (1.2.9)
thread_safe (~> 0.1)
temple (0.10.3)
thor (1.2.2)
tilt (2.0.11)
toml (0.3.0)
parslet (>= 1.8.0, < 3.0.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
webrick (1.8.1)
PLATFORMS
x86_64-linux
DEPENDENCIES
middleman (~> 4.2)
middleman-autoprefixer (~> 2.7)
middleman (~> 4.5)
middleman-autoprefixer (~> 3.0)
tzinfo-data
wdm (~> 0.1)

View File

@@ -25,3 +25,9 @@ body {
)
rgb(var(--background-start-rgb));
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
}

View File

@@ -1,22 +1,22 @@
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import './globals.css'
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
const inter = Inter({ subsets: ['latin'] })
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: 'Create Next App',
description: 'Generated by create next app',
}
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body className={inter.className}>{children}</body>
</html>
)
);
}

View File

@@ -1,4 +1,4 @@
import Image from 'next/image'
import Image from "next/image";
export default function Home() {
return (
@@ -15,7 +15,7 @@ export default function Home() {
target="_blank"
rel="noopener noreferrer"
>
By{' '}
By{" "}
<Image
src="/vercel.svg"
alt="Vercel Logo"
@@ -28,7 +28,7 @@ export default function Home() {
</div>
</div>
<div className="relative flex place-items-center before:absolute before:h-[300px] before:w-[480px] before:-translate-x-1/2 before:rounded-full before:bg-gradient-radial before:from-white before:to-transparent before:blur-2xl before:content-[''] after:absolute after:-z-20 after:h-[180px] after:w-[240px] after:translate-x-1/3 after:bg-gradient-conic after:from-sky-200 after:via-blue-200 after:blur-2xl after:content-[''] before:dark:bg-gradient-to-br before:dark:from-transparent before:dark:to-blue-700 before:dark:opacity-10 after:dark:from-sky-900 after:dark:via-[#0141ff] after:dark:opacity-40 before:lg:h-[360px] z-[-1]">
<div className="relative flex place-items-center before:absolute before:h-[300px] before:w-full sm:before:w-[480px] before:-translate-x-1/2 before:rounded-full before:bg-gradient-radial before:from-white before:to-transparent before:blur-2xl before:content-[''] after:absolute after:-z-20 after:h-[180px] after:w-full sm:after:w-[240px] after:translate-x-1/3 after:bg-gradient-conic after:from-sky-200 after:via-blue-200 after:blur-2xl after:content-[''] before:dark:bg-gradient-to-br before:dark:from-transparent before:dark:to-blue-700 before:dark:opacity-10 after:dark:from-sky-900 after:dark:via-[#0141ff] after:dark:opacity-40 before:lg:h-[360px] z-[-1]">
<Image
className="relative dark:drop-shadow-[0_0_0.3rem_#ffffff70] dark:invert"
src="/next.svg"
@@ -47,7 +47,7 @@ export default function Home() {
rel="noopener noreferrer"
>
<h2 className={`mb-3 text-2xl font-semibold`}>
Docs{' '}
Docs{" "}
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
-&gt;
</span>
@@ -64,7 +64,7 @@ export default function Home() {
rel="noopener noreferrer"
>
<h2 className={`mb-3 text-2xl font-semibold`}>
Learn{' '}
Learn{" "}
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
-&gt;
</span>
@@ -81,7 +81,7 @@ export default function Home() {
rel="noopener noreferrer"
>
<h2 className={`mb-3 text-2xl font-semibold`}>
Templates{' '}
Templates{" "}
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
-&gt;
</span>
@@ -98,16 +98,16 @@ export default function Home() {
rel="noopener noreferrer"
>
<h2 className={`mb-3 text-2xl font-semibold`}>
Deploy{' '}
Deploy{" "}
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
-&gt;
</span>
</h2>
<p className={`m-0 max-w-[30ch] text-sm opacity-50`}>
<p className={`m-0 max-w-[30ch] text-sm opacity-50 text-balance`}>
Instantly deploy your Next.js site to a shareable URL with Vercel.
</p>
</a>
</div>
</main>
)
);
}

View File

@@ -1,4 +0,0 @@
/** @type {import('next').NextConfig} */
const nextConfig = {}
module.exports = nextConfig

View File

@@ -0,0 +1,4 @@
/** @type {import('next').NextConfig} */
const nextConfig = {};
export default nextConfig;

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@
"dependencies": {
"react": "^18",
"react-dom": "^18",
"next": "14.0.4"
"next": "14.1.2"
},
"devDependencies": {
"typescript": "^5",
@@ -22,6 +22,6 @@
"postcss": "^8",
"tailwindcss": "^3.3.0",
"eslint": "^8",
"eslint-config-next": "14.0.4"
"eslint-config-next": "14.1.2"
}
}

View File

@@ -3,4 +3,4 @@ module.exports = {
tailwindcss: {},
autoprefixer: {},
},
}
};

View File

@@ -1,20 +1,20 @@
import type { Config } from 'tailwindcss'
import type { Config } from "tailwindcss";
const config: Config = {
content: [
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}",
"./app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
backgroundImage: {
'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
'gradient-conic':
'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
"gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
"gradient-conic":
"conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
},
},
},
plugins: [],
}
export default config
};
export default config;

View File

@@ -1,6 +1,5 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,

View File

@@ -9,7 +9,7 @@
},
"devDependencies": {
"@types/jest": "27.4.1",
"@vercel/frameworks": "2.0.6"
"@vercel/frameworks": "3.0.0"
},
"version": null
}

View File

@@ -1,7 +1,5 @@
node_modules
/.cache
/build
/public/build
.env
.vercel

View File

@@ -1,20 +1,13 @@
import { cssBundleHref } from "@remix-run/css-bundle";
import {
Links,
LiveReload,
Meta,
Outlet,
Scripts,
ScrollRestoration,
} from "@remix-run/react";
import { Analytics } from "@vercel/analytics/react";
import type { LinksFunction } from "@vercel/remix";
export const links: LinksFunction = () => [
...(cssBundleHref ? [{ rel: "stylesheet", href: cssBundleHref }] : []),
];
export default function App() {
export function Layout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<head>
@@ -24,12 +17,15 @@ export default function App() {
<Links />
</head>
<body>
<Outlet />
{children}
<ScrollRestoration />
<Scripts />
<LiveReload />
<Analytics />
</body>
</html>
);
}
export default function App() {
return <Outlet />;
}

View File

@@ -4,29 +4,29 @@
"sideEffects": false,
"type": "module",
"scripts": {
"build": "remix build",
"dev": "remix dev --manual",
"start": "remix-serve ./build/index.js",
"build": "remix vite:build",
"dev": "remix vite:dev",
"typecheck": "tsc"
},
"dependencies": {
"@remix-run/css-bundle": "^2.0.0",
"@remix-run/node": "^2.0.0",
"@remix-run/react": "^2.0.0",
"@remix-run/serve": "^2.0.0",
"@vercel/analytics": "^1.0.2",
"@vercel/remix": "^2.0.0",
"isbot": "^3.6.8",
"@remix-run/node": "^2.8.0",
"@remix-run/react": "^2.8.0",
"@remix-run/server-runtime": "^2.8.0",
"@vercel/analytics": "^1.2.2",
"@vercel/remix": "^2.8.0",
"isbot": "^4",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@remix-run/dev": "^2.0.0",
"@remix-run/eslint-config": "^2.0.0",
"@remix-run/dev": "^2.8.0",
"@remix-run/eslint-config": "^2.8.0",
"@types/react": "^18.2.20",
"@types/react-dom": "^18.2.7",
"eslint": "^8.38.0",
"typescript": "^5.1.6"
"typescript": "^5.1.6",
"vite": "^5.1.0",
"vite-tsconfig-paths": "^4.2.1"
},
"engines": {
"node": ">=18.0.0"

View File

@@ -1,22 +1,25 @@
{
"include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"],
"include": ["**/*.ts", "**/*.tsx"],
"compilerOptions": {
"lib": ["DOM", "DOM.Iterable", "ES2022"],
"types": ["@vercel/remix", "node", "vite/client"],
"isolatedModules": true,
"esModuleInterop": true,
"jsx": "react-jsx",
"module": "ESNext",
"moduleResolution": "Bundler",
"resolveJsonModule": true,
"target": "ES2022",
"strict": true,
"allowJs": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"baseUrl": ".",
"paths": {
"~/*": ["./app/*"]
},
// Remix takes care of building everything in `remix build`.
// Vite takes care of building everything, not tsc.
"noEmit": true
}
}

View File

@@ -0,0 +1,11 @@
import { vitePlugin as remix } from "@remix-run/dev";
import { installGlobals } from "@remix-run/node";
import { defineConfig } from "vite";
import { vercelPreset } from '@vercel/remix/vite';
import tsconfigPaths from "vite-tsconfig-paths";
installGlobals();
export default defineConfig({
plugins: [remix({ presets: [vercelPreset()] }), tsconfigPaths()],
});

View File

@@ -1,5 +1,40 @@
# @vercel-internals/types
## 1.0.24
### Patch Changes
- Updated dependencies [[`37b193c84`](https://github.com/vercel/vercel/commit/37b193c845d8b63d93bb0017fbc1a6a35306ef1f)]:
- @vercel/build-utils@7.7.1
## 1.0.23
### Patch Changes
- Updated dependencies [[`24c3dd282`](https://github.com/vercel/vercel/commit/24c3dd282d7714cd63d2b94fb94745c45fdc79ab)]:
- @vercel/build-utils@7.7.0
## 1.0.22
### Patch Changes
- Updated dependencies [[`b6ed28b9b`](https://github.com/vercel/vercel/commit/b6ed28b9b1712f882c93fe053b70d3eb1df21819), [`8ba0ce932`](https://github.com/vercel/vercel/commit/8ba0ce932434c6295fedb5307bee59a804b7e6a8), [`0d034b682`](https://github.com/vercel/vercel/commit/0d034b6820c0f3252949c0ffc483048c5aac7f04), [`abaa700ce`](https://github.com/vercel/vercel/commit/abaa700cea44c723cfc851baa2dfe9e1ae2e8a5c)]:
- @vercel/build-utils@7.6.0
## 1.0.21
### Patch Changes
- Updated dependencies [[`cdddb33ad`](https://github.com/vercel/vercel/commit/cdddb33ad49f6080c49f4fff3767e6111acd0bbe)]:
- @vercel/build-utils@7.5.1
## 1.0.20
### Patch Changes
- Updated dependencies [[`98040ec24`](https://github.com/vercel/vercel/commit/98040ec24e1ee585865d11eb216b6525d39d209e)]:
- @vercel/build-utils@7.5.0
## 1.0.19
### Patch Changes

View File

@@ -5,7 +5,12 @@ import type { Route } from '@vercel/routing-utils';
import { PROJECT_ENV_TARGET } from '@vercel-internals/constants';
export type ProjectEnvTarget = typeof PROJECT_ENV_TARGET[number];
export type ProjectEnvType = 'plain' | 'secret' | 'encrypted' | 'system';
export type ProjectEnvType =
| 'plain'
| 'secret'
| 'encrypted'
| 'system'
| 'sensitive';
export type ProjectSettings = import('@vercel/build-utils').ProjectSettings;

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "@vercel-internals/types",
"version": "1.0.19",
"version": "1.0.24",
"types": "index.d.ts",
"main": "index.d.ts",
"files": [
@@ -10,7 +10,7 @@
"dependencies": {
"@types/node": "14.14.31",
"@vercel-internals/constants": "1.0.4",
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"@vercel/routing-utils": "3.1.0"
},
"devDependencies": {

View File

@@ -33,7 +33,7 @@
"source-map-support": "0.5.12",
"ts-eager": "2.0.2",
"ts-jest": "29.1.0",
"turbo": "1.11.2",
"turbo": "1.12.4",
"typescript": "4.9.5"
},
"scripts": {

View File

@@ -1,5 +1,43 @@
# @vercel/build-utils
## 7.7.1
### Patch Changes
- [build-utils] increase max memory limit ([#11209](https://github.com/vercel/vercel/pull/11209))
## 7.7.0
### Minor Changes
- Revert "Revert "Default ruby to only currently supported version (3.2.0)"" ([#11137](https://github.com/vercel/vercel/pull/11137))
## 7.6.0
### Minor Changes
- Revert "Default ruby to only currently supported version (3.2.0)" ([#11135](https://github.com/vercel/vercel/pull/11135))
- Mark `flags` as deprecated and replace them with `variants` ([#11098](https://github.com/vercel/vercel/pull/11098))
- [build-utils] change default package manager when no lockfile detected from `yarn` to `npm` (gated behind feature flag) ([#11131](https://github.com/vercel/vercel/pull/11131))
### Patch Changes
- Update internal type for variants ([#11111](https://github.com/vercel/vercel/pull/11111))
## 7.5.1
### Patch Changes
- Add experimental field to Lambda and size to FileFsRef output ([#11059](https://github.com/vercel/vercel/pull/11059))
## 7.5.0
### Minor Changes
- Deprecate `EdgeFunction#name` property ([#11010](https://github.com/vercel/vercel/pull/11010))
## 7.4.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/build-utils",
"version": "7.4.1",
"version": "7.7.1",
"license": "Apache-2.0",
"main": "./dist/index.js",
"types": "./dist/index.d.js",

View File

@@ -8,12 +8,13 @@ export class EdgeFunction {
/**
* A display name for the edge function.
* @deprecated This property should no longer be used. The name is inferred from the URL path of the function.
*/
name: string;
name?: string;
/**
* The deployment target.
* Only v8-worker is currently supported.
* Only `v8-worker` is currently supported.
*/
deploymentTarget: 'v8-worker';

View File

@@ -11,6 +11,7 @@ interface FileFsRefOptions {
mode?: number;
contentType?: string;
fsPath: string;
size?: number;
}
interface FromStreamOptions {
@@ -24,28 +25,38 @@ class FileFsRef implements FileBase {
public type: 'FileFsRef';
public mode: number;
public fsPath: string;
public size?: number;
public contentType: string | undefined;
constructor({ mode = 0o100644, contentType, fsPath }: FileFsRefOptions) {
constructor({
mode = 0o100644,
contentType,
fsPath,
size,
}: FileFsRefOptions) {
assert(typeof mode === 'number');
assert(typeof fsPath === 'string');
this.type = 'FileFsRef';
this.mode = mode;
this.contentType = contentType;
this.fsPath = fsPath;
this.size = size;
}
static async fromFsPath({
mode,
contentType,
fsPath,
size,
}: FileFsRefOptions): Promise<FileFsRef> {
let m = mode;
if (!m) {
let s = size;
if (!m || typeof s === 'undefined') {
const stat = await fs.lstat(fsPath);
m = stat.mode;
s = stat.size;
}
return new FileFsRef({ mode: m, contentType, fsPath });
return new FileFsRef({ mode: m, contentType, fsPath, size: s });
}
static async fromStream({
@@ -69,7 +80,7 @@ class FileFsRef implements FileBase {
dest.on('error', reject);
});
return new FileFsRef({ mode, contentType, fsPath });
return FileFsRef.fromFsPath({ mode, contentType, fsPath });
}
async toStreamAsync(): Promise<NodeJS.ReadableStream> {

View File

@@ -302,7 +302,7 @@ export async function scanParentDirs(
});
let lockfilePath: string | undefined;
let lockfileVersion: number | undefined;
let cliType: CliType = 'yarn';
let cliType: CliType;
const [hasYarnLock, packageLockJson, pnpmLockYaml, bunLockBin] =
await Promise.all([
@@ -338,6 +338,12 @@ export async function scanParentDirs(
lockfilePath = bunLockPath;
// TODO: read "bun-lockfile-format-v0"
lockfileVersion = 0;
} else {
if (process.env.VERCEL_ENABLE_NPM_DEFAULT === '1') {
cliType = 'npm';
} else {
cliType = 'yarn';
}
}
const packageJsonPath = pkgJsonPath || undefined;
@@ -414,6 +420,14 @@ export async function runNpmInstall(
destPath
);
if (!packageJsonPath) {
debug(
`Skipping dependency installation because no package.json was found for ${destPath}`
);
runNpmInstallSema.release();
return false;
}
// Only allow `runNpmInstall()` to run once per `package.json`
// when doing a default install (no additional args)
if (meta && packageJsonPath && args.length === 0) {

View File

@@ -37,6 +37,7 @@ export interface LambdaOptionsBase {
export interface LambdaOptionsWithFiles extends LambdaOptionsBase {
files: Files;
experimentalAllowBundling?: boolean;
}
/**
@@ -79,6 +80,7 @@ export class Lambda {
supportsWrapper?: boolean;
supportsResponseStreaming?: boolean;
framework?: FunctionFramework;
experimentalAllowBundling?: boolean;
constructor(opts: LambdaOptions) {
const {
@@ -114,6 +116,16 @@ export class Lambda {
);
}
if (
'experimentalAllowBundling' in opts &&
opts.experimentalAllowBundling !== undefined
) {
assert(
typeof opts.experimentalAllowBundling === 'boolean',
'"experimentalAllowBundling" is not a boolean'
);
}
if (memory !== undefined) {
assert(typeof memory === 'number', '"memory" is not a number');
}
@@ -183,6 +195,10 @@ export class Lambda {
this.supportsResponseStreaming =
supportsResponseStreaming ?? experimentalResponseStreaming;
this.framework = framework;
this.experimentalAllowBundling =
'experimentalAllowBundling' in opts
? opts.experimentalAllowBundling
: undefined;
}
async createZip(): Promise<Buffer> {

View File

@@ -14,7 +14,7 @@ export const functionsSchema = {
},
memory: {
minimum: 128,
maximum: 3008,
maximum: 3009,
},
maxDuration: {
type: 'number',

View File

@@ -440,7 +440,9 @@ export interface Cron {
schedule: string;
}
// TODO: Proper description once complete
/**
* @deprecated Replaced by Variants. Remove once fully replaced.
*/
export interface Flag {
key: string;
defaultValue?: unknown;
@@ -471,7 +473,9 @@ export interface BuildResultV2Typical {
framework?: {
version: string;
};
/** @deprecated Replaced by Variants. Remove once fully replaced. */
flags?: Flag[];
variants?: Record<string, VariantDefinition>;
}
export type BuildResultV2 = BuildResultV2Typical | BuildResultBuildOutput;
@@ -491,3 +495,28 @@ export type ShouldServe = (
export type StartDevServer = (
options: StartDevServerOptions
) => Promise<StartDevServerResult>;
/**
* TODO: The following types will eventually be exported by a more
* relevant package.
*/
type VariantJSONArray = ReadonlyArray<VariantJSONValue>;
type VariantJSONValue =
| string
| boolean
| number
| null
| VariantJSONArray
| { [key: string]: VariantJSONValue };
type VariantOption = {
value: VariantJSONValue;
label?: string;
};
export interface VariantDefinition {
options?: VariantOption[];
origin?: string;
description?: string;
}

View File

@@ -0,0 +1,4 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1

View File

@@ -0,0 +1,4 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1

View File

@@ -0,0 +1,4 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1

View File

@@ -0,0 +1,9 @@
{
"private": true,
"scripts": {
"build": "mkdir -p public && (printf \"npm version: \" && npm -v) > public/index.txt"
},
"dependencies": {
"sharp": "0.33.2"
}
}

View File

@@ -0,0 +1,3 @@
{
"probes": [{ "path": "/", "mustContain": "npm version: 8" }]
}

View File

@@ -0,0 +1,7 @@
{
"build": {
"env": {
"VERCEL_ENABLE_NPM_DEFAULT": "1"
}
}
}

View File

@@ -576,6 +576,52 @@ it(
ms('1m')
);
it('should return cliType npm when no lockfile is present and VERCEL_ENABLE_NPM_DEFAULT is set', async () => {
const originalRepoLockfilePath = path.join(
__dirname,
'..',
'..',
'..',
'pnpm-lock.yaml'
);
const originalRepoLockfileData = await fs.readFile(originalRepoLockfilePath);
await fs.remove(originalRepoLockfilePath);
try {
process.env.VERCEL_ENABLE_NPM_DEFAULT = '1';
const fixture = path.join(__dirname, 'fixtures', '40-no-lockfile');
const result = await scanParentDirs(fixture);
expect(result.cliType).toEqual('npm');
expect(result.lockfileVersion).toEqual(undefined);
expect(result.lockfilePath).toEqual(undefined);
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
} finally {
delete process.env.VERCEL_ENABLE_NPM_DEFAULT;
await fs.writeFile(originalRepoLockfilePath, originalRepoLockfileData);
}
});
it('should return cliType yarn when no lockfile is present and VERCEL_ENABLE_NPM_DEFAULT is not set', async () => {
const originalRepoLockfilePath = path.join(
__dirname,
'..',
'..',
'..',
'pnpm-lock.yaml'
);
const originalRepoLockfileData = await fs.readFile(originalRepoLockfilePath);
await fs.remove(originalRepoLockfilePath);
try {
const fixture = path.join(__dirname, 'fixtures', '40-no-lockfile');
const result = await scanParentDirs(fixture);
expect(result.cliType).toEqual('yarn');
expect(result.lockfileVersion).toEqual(undefined);
expect(result.lockfilePath).toEqual(undefined);
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
} finally {
await fs.writeFile(originalRepoLockfilePath, originalRepoLockfileData);
}
});
it('should return cliType bun and correct lock file for bun v1', async () => {
const fixture = path.join(__dirname, 'fixtures', '31-bun-v1-with-yarn-lock');
const result = await scanParentDirs(fixture);

View File

@@ -1,5 +1,128 @@
# vercel
## 33.5.4
### Patch Changes
- [build-utils] increase max memory limit ([#11209](https://github.com/vercel/vercel/pull/11209))
- Updated dependencies [[`b1d8b83ab`](https://github.com/vercel/vercel/commit/b1d8b83abbf23a3485aedb490992d0a3bf44573f), [`37b193c84`](https://github.com/vercel/vercel/commit/37b193c845d8b63d93bb0017fbc1a6a35306ef1f), [`20237d4f7`](https://github.com/vercel/vercel/commit/20237d4f7b55b0697b57db15636c11204cb0dc39), [`f8fab639b`](https://github.com/vercel/vercel/commit/f8fab639bf49a60389b8d0b7b265a737c17b4ae1), [`6ed0fe6fb`](https://github.com/vercel/vercel/commit/6ed0fe6fb1e487545a790ff5b9fc691cf625f005)]:
- @vercel/next@4.1.4
- @vercel/build-utils@7.7.1
- @vercel/remix-builder@2.1.1
- @vercel/static-build@2.4.1
- @vercel/node@3.0.21
## 33.5.3
### Patch Changes
- Updated dependencies [[`c2d99855e`](https://github.com/vercel/vercel/commit/c2d99855ea6132380434ed29643120680f95fad7), [`1333071a3`](https://github.com/vercel/vercel/commit/1333071a3a2d324679327bfdd4e872f8fd3521c6)]:
- @vercel/next@4.1.3
- @vercel/remix-builder@2.1.0
## 33.5.2
### Patch Changes
- Updated dependencies [[`e109e3325`](https://github.com/vercel/vercel/commit/e109e3325ab5299da0903034175fabe72d486a4e), [`d17abf463`](https://github.com/vercel/vercel/commit/d17abf463acabf9e1e43b91200f18efd34e91f62), [`644721a90`](https://github.com/vercel/vercel/commit/644721a90da8cf98414d272be9da0a821a2ce217), [`ea0e9aeae`](https://github.com/vercel/vercel/commit/ea0e9aeaec8ddddb5a726be0d252df9cdbd84808), [`e318a0eea`](https://github.com/vercel/vercel/commit/e318a0eea55c9b8536b0874f66cfd03aca6f0adf), [`1fee87e76`](https://github.com/vercel/vercel/commit/1fee87e76f18d2f5e5524247cfce615fa1832e49), [`bfc01fd98`](https://github.com/vercel/vercel/commit/bfc01fd98f760a008d0d2e6c52b5216503b44b75), [`7910f2f30`](https://github.com/vercel/vercel/commit/7910f2f3070ff69742e845e795d4db77d598c181), [`440ef3ba9`](https://github.com/vercel/vercel/commit/440ef3ba98af8f05e7714c86c67c36dbda11e85c)]:
- @vercel/remix-builder@2.0.20
- @vercel/next@4.1.2
- @vercel/node@3.0.20
- @vercel/redwood@2.0.8
## 33.5.1
### Patch Changes
- build: upgrade edge-runtime ([#11148](https://github.com/vercel/vercel/pull/11148))
- Updated dependencies [[`24c3dd282`](https://github.com/vercel/vercel/commit/24c3dd282d7714cd63d2b94fb94745c45fdc79ab), [`10e200e0b`](https://github.com/vercel/vercel/commit/10e200e0bf8f692b6740e098e0572b4e7de83850), [`678ebbe52`](https://github.com/vercel/vercel/commit/678ebbe5255766656bf2dddc574e86b2999f11c8)]:
- @vercel/build-utils@7.7.0
- @vercel/static-build@2.4.0
- @vercel/node@3.0.19
## 33.5.0
### Minor Changes
- Mark `flags` as deprecated and replace them with `variants` ([#11098](https://github.com/vercel/vercel/pull/11098))
### Patch Changes
- Updated dependencies [[`c32a909af`](https://github.com/vercel/vercel/commit/c32a909afcedf0ee55777d5dcaecc0c8383dd8c8), [`b6ed28b9b`](https://github.com/vercel/vercel/commit/b6ed28b9b1712f882c93fe053b70d3eb1df21819), [`d21bb9f87`](https://github.com/vercel/vercel/commit/d21bb9f87e1d837666fe8104d4e199b2590725d6), [`4027a1833`](https://github.com/vercel/vercel/commit/4027a1833718a92be74b2b3c5a4df23745d19a36), [`8ba0ce932`](https://github.com/vercel/vercel/commit/8ba0ce932434c6295fedb5307bee59a804b7e6a8), [`0d034b682`](https://github.com/vercel/vercel/commit/0d034b6820c0f3252949c0ffc483048c5aac7f04), [`abaa700ce`](https://github.com/vercel/vercel/commit/abaa700cea44c723cfc851baa2dfe9e1ae2e8a5c), [`3bad73401`](https://github.com/vercel/vercel/commit/3bad73401b4ec1f61e515965732cde8dcc052b17)]:
- @vercel/next@4.1.1
- @vercel/node@3.0.18
- @vercel/redwood@2.0.7
- @vercel/remix-builder@2.0.19
- @vercel/build-utils@7.6.0
- @vercel/static-build@2.3.0
## 33.4.1
### Patch Changes
- Updated dependencies [[`d05e41eea`](https://github.com/vercel/vercel/commit/d05e41eeaf97a024157d2bd843782c95c39389be), [`de63e3562`](https://github.com/vercel/vercel/commit/de63e356223467447cda539ddc435a892303afc7)]:
- @vercel/static-build@2.2.0
## 33.4.0
### Minor Changes
- Added a new option to add a sensitive environment variable ([#11033](https://github.com/vercel/vercel/pull/11033))
## 33.3.0
### Minor Changes
- Emit "filePathMap" in `vc-config.json` for `FileFsRef` instances ([#11060](https://github.com/vercel/vercel/pull/11060))
### Patch Changes
- Update `vc dev` to support `Lambda` instances without `zipBuffer` ([#11080](https://github.com/vercel/vercel/pull/11080))
- Updated dependencies [[`322c88536`](https://github.com/vercel/vercel/commit/322c88536dfa0ba3892eb580858ee54f6b04ed3f), [`62ca2efa7`](https://github.com/vercel/vercel/commit/62ca2efa731c4df46d586b94078b2dcb1c0bb934)]:
- @vercel/ruby@2.0.5
- @vercel/python@4.1.1
## 33.2.0
### Minor Changes
- chore: deprecate next/nuxt/gastby Speed Insights injection in favor of @vercel/speed-insights ([#11048](https://github.com/vercel/vercel/pull/11048))
### Patch Changes
- fix error when @vercel/analytics is a transitive dependency of the deployed application ([#10892](https://github.com/vercel/vercel/pull/10892))
- [cli] Add documentation string for `skip-domain` option ([#11051](https://github.com/vercel/vercel/pull/11051))
- Updated dependencies [[`260125784`](https://github.com/vercel/vercel/commit/2601257846fa201fc9efde021a906c706f6191aa), [`cdddb33ad`](https://github.com/vercel/vercel/commit/cdddb33ad49f6080c49f4fff3767e6111acd0bbe), [`72d8604c9`](https://github.com/vercel/vercel/commit/72d8604c9dba108ccca41d6288b765a7ba727295), [`90d0455e1`](https://github.com/vercel/vercel/commit/90d0455e1ff7b5892ff4960226535f57f704ef6f), [`0716130e5`](https://github.com/vercel/vercel/commit/0716130e580a920d92d249d029ed37f92f2ca847), [`b6b151f39`](https://github.com/vercel/vercel/commit/b6b151f3917c5cb47226951446b9dbb96c7d872b), [`b185a7e20`](https://github.com/vercel/vercel/commit/b185a7e207b153c378bd3db2618eece3a3b6a93e)]:
- @vercel/static-build@2.1.0
- @vercel/build-utils@7.5.1
- @vercel/next@4.1.0
- @vercel/remix-builder@2.0.18
- @vercel/node@3.0.17
## 33.1.0
### Minor Changes
- Serialize duplicate `EdgeFunction` references as symlinks in `vc build` ([#11027](https://github.com/vercel/vercel/pull/11027))
### Patch Changes
- Handle rate limit response when fetching /teams ([#11013](https://github.com/vercel/vercel/pull/11013))
- Display actual deployment's 'target' ([#11025](https://github.com/vercel/vercel/pull/11025))
- Updated dependencies [[`98040ec24`](https://github.com/vercel/vercel/commit/98040ec24e1ee585865d11eb216b6525d39d209e)]:
- @vercel/build-utils@7.5.0
- @vercel/static-build@2.0.17
- @vercel/hydrogen@1.0.2
- @vercel/remix-builder@2.0.17
- @vercel/node@3.0.16
## 33.0.2
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "33.0.2",
"version": "33.5.4",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -31,22 +31,22 @@
"node": ">= 16"
},
"dependencies": {
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"@vercel/fun": "1.1.0",
"@vercel/go": "3.0.5",
"@vercel/hydrogen": "1.0.1",
"@vercel/next": "4.0.17",
"@vercel/node": "3.0.15",
"@vercel/python": "4.1.0",
"@vercel/redwood": "2.0.6",
"@vercel/remix-builder": "2.0.16",
"@vercel/ruby": "2.0.4",
"@vercel/static-build": "2.0.16",
"@vercel/hydrogen": "1.0.2",
"@vercel/next": "4.1.4",
"@vercel/node": "3.0.21",
"@vercel/python": "4.1.1",
"@vercel/redwood": "2.0.8",
"@vercel/remix-builder": "2.1.1",
"@vercel/ruby": "2.0.5",
"@vercel/static-build": "2.4.1",
"chokidar": "3.3.1"
},
"devDependencies": {
"@alex_neo/jest-expect-message": "1.0.5",
"@edge-runtime/node-utils": "2.2.2",
"@edge-runtime/node-utils": "2.3.0",
"@next/env": "11.1.2",
"@sentry/node": "5.5.0",
"@sindresorhus/slugify": "0.11.0",
@@ -88,11 +88,11 @@
"@types/yauzl-promise": "2.1.0",
"@vercel-internals/constants": "1.0.4",
"@vercel-internals/get-package-json": "1.0.0",
"@vercel-internals/types": "1.0.19",
"@vercel/client": "13.0.12",
"@vercel-internals/types": "1.0.24",
"@vercel/client": "13.1.4",
"@vercel/error-utils": "2.0.2",
"@vercel/frameworks": "2.0.6",
"@vercel/fs-detectors": "5.1.6",
"@vercel/frameworks": "3.0.0",
"@vercel/fs-detectors": "5.2.1",
"@vercel/routing-utils": "3.1.0",
"ajv": "6.12.2",
"alpha-sort": "2.0.1",

View File

@@ -1,4 +1,4 @@
import fs from 'fs-extra';
import fs, { readJSON } from 'fs-extra';
import chalk from 'chalk';
import dotenv from 'dotenv';
import semver from 'semver';
@@ -22,6 +22,7 @@ import {
Cron,
validateNpmrc,
Flag,
VariantDefinition,
} from '@vercel/build-utils';
import {
detectBuilders,
@@ -71,6 +72,7 @@ import { setMonorepoDefaultSettings } from '../../util/build/monorepo';
import { help } from '../help';
import { buildCommand } from './command';
import { scrubArgv } from '../../util/build/scrub-argv';
import { cwd } from 'process';
type BuildResult = BuildResultV2 | BuildResultV3;
@@ -94,7 +96,9 @@ interface BuildOutputConfig {
version: string;
};
crons?: Cron[];
/** @deprecated Replaced by Variants. Remove once fully replaced. */
flags?: Flag[];
variants?: Record<string, VariantDefinition>;
}
/**
@@ -257,6 +261,9 @@ export default async function main(client: Client): Promise<number> {
if (project.settings.analyticsId) {
envToUnset.add('VERCEL_ANALYTICS_ID');
process.env.VERCEL_ANALYTICS_ID = project.settings.analyticsId;
output.warn(
'Vercel Speed Insights auto-injection is deprecated in favor of @vercel/speed-insights package. Learn more: https://vercel.link/upgrate-to-speed-insights-package'
);
}
// Some build processes use these env vars to platform detect Vercel
@@ -432,29 +439,6 @@ async function doBuild(
const ops: Promise<Error | void>[] = [];
const dependencyMap = makeDepencyMap(pkg);
const speedInsighsVersion = dependencyMap.get('@vercel/speed-insights');
if (speedInsighsVersion) {
if (process.env.VERCEL_ANALYTICS_ID) {
output.warn(
`The \`VERCEL_ANALYTICS_ID\` environment variable is deprecated and will be removed in a future release. Please remove it from your environment variables`
);
delete process.env.VERCEL_ANALYTICS_ID;
}
buildsJson.features = {
...(buildsJson.features ?? {}),
speedInsightsVersion: speedInsighsVersion,
};
}
const webAnalyticsVersion = dependencyMap.get('@vercel/analytics');
if (webAnalyticsVersion) {
buildsJson.features = {
...(buildsJson.features ?? {}),
webAnalyticsVersion: webAnalyticsVersion,
};
}
// Write the `detectedBuilders` result to output dir
const buildsJsonBuilds = new Map<Builder, SerializedBuilder>(
builds.map(build => {
@@ -474,10 +458,9 @@ async function doBuild(
];
})
);
buildsJson.builds = Array.from(buildsJsonBuilds.values());
await fs.writeJSON(join(outputDir, 'builds.json'), buildsJson, {
spaces: 2,
});
await writeBuildJson(buildsJson, outputDir);
// The `meta` config property is re-used for each Builder
// invocation so that Builders can share state between
@@ -573,6 +556,7 @@ async function doBuild(
// Start flushing the file outputs to the filesystem asynchronously
ops.push(
writeBuildResult(
repoRootPath,
outputDir,
buildResult,
build,
@@ -608,6 +592,33 @@ async function doBuild(
}
}
let needBuildsJsonOverride = false;
const speedInsightsVersion = await readInstalledVersion(
client,
'@vercel/speed-insights'
);
if (speedInsightsVersion) {
buildsJson.features = {
...(buildsJson.features ?? {}),
speedInsightsVersion,
};
needBuildsJsonOverride = true;
}
const webAnalyticsVersion = await readInstalledVersion(
client,
'@vercel/analytics'
);
if (webAnalyticsVersion) {
buildsJson.features = {
...(buildsJson.features ?? {}),
webAnalyticsVersion,
};
needBuildsJsonOverride = true;
}
if (needBuildsJsonOverride) {
await writeBuildJson(buildsJson, outputDir);
}
// Merge existing `config.json` file into the one that will be produced
const configPath = join(outputDir, 'config.json');
const existingConfig = await readJSONFile<BuildOutputConfig>(configPath);
@@ -670,10 +681,13 @@ async function doBuild(
overrides: mergedOverrides,
framework,
crons: mergedCrons,
/** @deprecated Replaced by Variants. Remove once fully replaced. */
flags: mergedFlags,
};
await fs.writeJSON(join(outputDir, 'config.json'), config, { spaces: 2 });
await writeVariantsJson(client, buildResults.values(), outputDir);
const relOutputDir = relative(cwd, outputDir);
output.print(
`${prependEmoji(
@@ -818,9 +832,69 @@ function mergeFlags(
});
}
function makeDepencyMap(pkg: PackageJson | null): Map<string, string> {
return new Map([
...Object.entries(pkg?.devDependencies ?? {}),
...Object.entries(pkg?.dependencies ?? {}),
]);
/**
* Takes the build output and writes all the variants into the `variants.json`
* file. It'll skip variants that already exist.
*/
async function writeVariantsJson(
{ output }: Client,
buildResults: Iterable<BuildResult | BuildOutputConfig>,
outputDir: string
): Promise<void> {
const variantsFilePath = join(outputDir, 'variants.json');
let hasVariants = true;
const variants = (await fs.readJSON(variantsFilePath).catch(error => {
if (error.code === 'ENOENT') {
hasVariants = false;
return { definitions: {} };
}
throw error;
})) as { definitions: Record<string, VariantDefinition> };
for (const result of buildResults) {
if (!('variants' in result) || !result.variants) continue;
for (const [key, defintion] of Object.entries(result.variants)) {
if (result.variants[key]) {
output.warn(
`The variant "${key}" was found multiple times. Only its first occurrence will be considered.`
);
continue;
}
hasVariants = true;
variants.definitions[key] = defintion;
}
}
// Only create the file when there are variants to write,
// or when the file already exists.
if (hasVariants) {
await fs.writeJSON(variantsFilePath, variants, { spaces: 2 });
}
}
async function writeBuildJson(buildsJson: BuildsManifest, outputDir: string) {
await fs.writeJSON(join(outputDir, 'builds.json'), buildsJson, { spaces: 2 });
}
export async function readInstalledVersion(
{ output }: Client,
pkgName: string
): Promise<string | undefined> {
try {
const descriptorPath = require.resolve(`${pkgName}/package.json`, {
paths: [cwd()],
});
const descriptor = await readJSON(descriptorPath);
return descriptor?.version;
} catch (err) {
output.debug(
`Package ${pkgName} is not installed (failed to read its package.json: ${err})`
);
}
return;
}

View File

@@ -112,7 +112,8 @@ export const deployCommand: Command = {
shorthand: null,
type: 'boolean',
deprecated: false,
description: undefined,
description:
'Disable the automatic promotion (aliasing) of the relevant domains to a new production deployment. You can use `vc promote` to complete the domain-assignment process later',
multi: false,
},
{

View File

@@ -19,6 +19,7 @@ import { isAPIError } from '../../util/errors-ts';
type Options = {
'--debug': boolean;
'--sensitive': boolean;
};
export default async function add(
@@ -144,6 +145,8 @@ export default async function add(
envGitBranch = inputValue || '';
}
const type = opts['--sensitive'] ? 'sensitive' : 'encrypted';
const addStamp = stamp();
try {
output.spinner('Saving');
@@ -151,7 +154,7 @@ export default async function add(
output,
client,
project.id,
'encrypted',
type,
envName,
envValue,
envTargets,

View File

@@ -34,7 +34,16 @@ export const envCommand: Command = {
required: false,
},
],
options: [],
options: [
{
name: 'sensitive',
description: 'Add a sensitive Environment Variable',
shorthand: null,
type: 'string',
deprecated: false,
multi: false,
},
],
examples: [],
},
{
@@ -117,6 +126,10 @@ export const envCommand: Command = {
`${packageName} env add DB_PASS production`,
],
},
{
name: 'Add a sensitive Environment Variable',
value: `${packageName} env add API_TOKEN --sensitive`,
},
{
name: 'Add a new variable for a specific Environment and Git Branch',
value: [

View File

@@ -34,6 +34,7 @@ export default async function main(client: Client) {
'-y': '--yes',
'--environment': String,
'--git-branch': String,
'--sensitive': Boolean,
});
} catch (error) {
handleError(error);

View File

@@ -465,6 +465,15 @@ const main = async () => {
return 1;
}
if (isErrnoException(err) && err.code === 'rate_limited') {
output.prettyError({
message:
'Rate limited. Too many requests to the same endpoint: /teams',
});
return 1;
}
console.error(error('Not able to load teams'));
return 1;
}

View File

@@ -14,6 +14,7 @@ import {
BuildResultV2,
BuildResultV3,
File,
Files,
FileFsRef,
BuilderV2,
BuilderV3,
@@ -45,6 +46,7 @@ interface FunctionConfiguration {
}
export async function writeBuildResult(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV2 | BuildResultV3,
build: Builder,
@@ -55,6 +57,7 @@ export async function writeBuildResult(
const { version } = builder;
if (typeof version !== 'number' || version === 2) {
return writeBuildResultV2(
repoRootPath,
outputDir,
buildResult as BuildResultV2,
build,
@@ -62,6 +65,7 @@ export async function writeBuildResult(
);
} else if (version === 3) {
return writeBuildResultV3(
repoRootPath,
outputDir,
buildResult as BuildResultV3,
build,
@@ -107,6 +111,7 @@ function stripDuplicateSlashes(path: string): string {
* the filesystem.
*/
async function writeBuildResultV2(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV2,
build: Builder,
@@ -129,13 +134,20 @@ async function writeBuildResultV2(
);
}
const lambdas = new Map<Lambda, string>();
const existingFunctions = new Map<Lambda | EdgeFunction, string>();
const overrides: Record<string, PathOverride> = {};
for (const [path, output] of Object.entries(buildResult.output)) {
const normalizedPath = stripDuplicateSlashes(path);
if (isLambda(output)) {
await writeLambda(outputDir, output, normalizedPath, undefined, lambdas);
await writeLambda(
repoRootPath,
outputDir,
output,
normalizedPath,
undefined,
existingFunctions
);
} else if (isPrerender(output)) {
if (!output.lambda) {
throw new Error(
@@ -144,11 +156,12 @@ async function writeBuildResultV2(
}
await writeLambda(
repoRootPath,
outputDir,
output.lambda,
normalizedPath,
undefined,
lambdas
existingFunctions
);
// Write the fallback file alongside the Lambda directory
@@ -203,7 +216,13 @@ async function writeBuildResultV2(
vercelConfig?.cleanUrls
);
} else if (isEdgeFunction(output)) {
await writeEdgeFunction(outputDir, output, normalizedPath);
await writeEdgeFunction(
repoRootPath,
outputDir,
output,
normalizedPath,
existingFunctions
);
} else {
throw new Error(
`Unsupported output type: "${
@@ -220,6 +239,7 @@ async function writeBuildResultV2(
* the filesystem.
*/
async function writeBuildResultV3(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV3,
build: Builder,
@@ -243,9 +263,15 @@ async function writeBuildResultV3(
build.config?.zeroConfig ? src.substring(0, src.length - ext.length) : src
);
if (isLambda(output)) {
await writeLambda(outputDir, output, path, functionConfiguration);
await writeLambda(
repoRootPath,
outputDir,
output,
path,
functionConfiguration
);
} else if (isEdgeFunction(output)) {
await writeEdgeFunction(outputDir, output, path);
await writeEdgeFunction(repoRootPath, outputDir, output, path);
} else {
throw new Error(
`Unsupported output type: "${(output as any).type}" for ${build.src}`
@@ -315,27 +341,79 @@ async function writeStaticFile(
await downloadFile(file, dest);
}
/**
* If the `fn` Lambda or Edge function has already been written to
* the filesystem at a different location, then create a symlink
* to the previous location instead of copying the files again.
*
* @param outputPath The path of the `.vercel/output` directory
* @param dest The path of destination function's `.func` directory
* @param fn The Lambda or EdgeFunction instance to create the symlink for
* @param existingFunctions Map of `Lambda`/`EdgeFunction` instances that have previously been written
*/
async function writeFunctionSymlink(
outputDir: string,
dest: string,
fn: Lambda | EdgeFunction,
existingFunctions: Map<Lambda | EdgeFunction, string>
) {
const existingPath = existingFunctions.get(fn);
// Function has not been written to the filesystem, so bail
if (!existingPath) return false;
const destDir = dirname(dest);
const targetDest = join(outputDir, 'functions', `${existingPath}.func`);
const target = relative(destDir, targetDest);
await fs.mkdirp(destDir);
await fs.symlink(target, dest);
return true;
}
/**
* Serializes the `EdgeFunction` instance to the file system.
*
* @param outputPath The path of the `.vercel/output` directory
* @param edgeFunction The `EdgeFunction` instance
* @param path The URL path where the `EdgeFunction` can be accessed from
* @param existingFunctions (optional) Map of `Lambda`/`EdgeFunction` instances that have previously been written
*/
async function writeEdgeFunction(
repoRootPath: string,
outputDir: string,
edgeFunction: EdgeFunction,
path: string
path: string,
existingFunctions?: Map<Lambda | EdgeFunction, string>
) {
const dest = join(outputDir, 'functions', `${path}.func`);
if (existingFunctions) {
if (
await writeFunctionSymlink(
outputDir,
dest,
edgeFunction,
existingFunctions
)
) {
return;
}
existingFunctions.set(edgeFunction, path);
}
await fs.mkdirp(dest);
const ops: Promise<any>[] = [];
ops.push(download(edgeFunction.files, dest));
const { files, filePathMap } = filesWithoutFsRefs(
edgeFunction.files,
repoRootPath
);
ops.push(download(files, dest));
const config = {
runtime: 'edge',
...edgeFunction,
entrypoint: normalizePath(edgeFunction.entrypoint),
filePathMap,
files: undefined,
type: undefined,
};
@@ -351,42 +429,39 @@ async function writeEdgeFunction(
/**
* Writes the file references from the `Lambda` instance to the file system.
*
* @param outputPath The path of the `.vercel/output` directory
* @param lambda The `Lambda` instance
* @param path The URL path where the `Lambda` can be accessed from
* @param lambdas (optional) Map of `Lambda` instances that have previously been written
* @param functionConfiguration (optional) Extra configuration to apply to the function's `.vc-config.json` file
* @param existingFunctions (optional) Map of `Lambda`/`EdgeFunction` instances that have previously been written
*/
async function writeLambda(
repoRootPath: string,
outputDir: string,
lambda: Lambda,
path: string,
functionConfiguration?: FunctionConfiguration,
lambdas?: Map<Lambda, string>
existingFunctions?: Map<Lambda | EdgeFunction, string>
) {
const dest = join(outputDir, 'functions', `${path}.func`);
// If the `lambda` has already been written to the filesystem at a different
// location then create a symlink to the previous location instead of copying
// the files again.
const existingLambdaPath = lambdas?.get(lambda);
if (existingLambdaPath) {
const destDir = dirname(dest);
const targetDest = join(
outputDir,
'functions',
`${existingLambdaPath}.func`
);
const target = relative(destDir, targetDest);
await fs.mkdirp(destDir);
await fs.symlink(target, dest);
return;
if (existingFunctions) {
if (
await writeFunctionSymlink(outputDir, dest, lambda, existingFunctions)
) {
return;
}
existingFunctions.set(lambda, path);
}
lambdas?.set(lambda, path);
await fs.mkdirp(dest);
const ops: Promise<any>[] = [];
let filePathMap: Record<string, string> | undefined;
if (lambda.files) {
// `files` is defined
ops.push(download(lambda.files, dest));
const f = filesWithoutFsRefs(lambda.files, repoRootPath);
filePathMap = f.filePathMap;
ops.push(download(f.files, dest));
} else if (lambda.zipBuffer) {
// Builders that use the deprecated `createLambda()` might only have `zipBuffer`
ops.push(unzip(lambda.zipBuffer, dest));
@@ -402,6 +477,7 @@ async function writeLambda(
handler: normalizePath(lambda.handler),
memory,
maxDuration,
filePathMap,
type: undefined,
files: undefined,
zipBuffer: undefined,
@@ -509,3 +585,25 @@ export async function* findDirs(
}
}
}
/**
* Removes the `FileFsRef` instances from the `Files` object
* and returns them in a JSON serializable map of repo root
* relative paths to Lambda destination paths.
*/
function filesWithoutFsRefs(
files: Files,
repoRootPath: string
): { files: Files; filePathMap?: Record<string, string> } {
let filePathMap: Record<string, string> | undefined;
const out: Files = {};
for (const [path, file] of Object.entries(files)) {
if (file.type === 'FileFsRef') {
if (!filePathMap) filePathMap = {};
filePathMap[path] = relative(repoRootPath, file.fsPath);
} else {
out[path] = file;
}
}
return { files: out, filePathMap };
}

View File

@@ -185,7 +185,7 @@ export default async function processDeployment({
printInspectUrl(output, deployment.inspectorUrl, deployStamp);
const isProdDeployment = requestBody.target === 'production';
const isProdDeployment = deployment.target === 'production';
const previewUrl = `https://${deployment.url}`;
output.print(

View File

@@ -42,6 +42,18 @@ async function processMessage(message) {
// structure to JSON" errors, so delete the property...
delete result.childProcesses;
if (builder.version === 3) {
if (result.output.type === 'Lambda') {
result.output.zipBuffer = await result.output.createZip();
}
} else {
for (const output of Object.values(result.output)) {
if (output.type === 'Lambda') {
output.zipBuffer = await output.createZip();
}
}
}
process.send({ type: 'buildResult', result });
}

View File

@@ -361,11 +361,13 @@ export async function executeBuild(
await oldAsset.fn.destroy();
}
const ZipFile = asset.zipBuffer || (await asset.createZip());
asset.fn = await createFunction({
Code: { ZipFile: asset.zipBuffer },
Code: { ZipFile },
Handler: asset.handler,
Runtime: asset.runtime,
MemorySize: asset.memory || 3008,
MemorySize: asset.memory || 3009,
Environment: {
Variables: {
...vercelConfig.env,

View File

@@ -0,0 +1,21 @@
const { Lambda, EdgeFunction } = require('@vercel/build-utils');
exports.build = async () => {
const lambda = new Lambda({
files: {},
runtime: 'provided',
handler: 'example.js'
});
const edge = new EdgeFunction({
files: {},
deploymentTarget: 'v8-worker',
entrypoint: 'example.js'
});
const output = {
lambda,
lambda2: lambda,
edge,
edge2: edge
};
return { output };
};

View File

@@ -0,0 +1,6 @@
{
"name": "functions-symlink",
"private": true,
"version": "0.0.0",
"main": "main.js"
}

View File

@@ -0,0 +1,7 @@
{
"orgId": ".",
"projectId": ".",
"settings": {
"framework": null
}
}

View File

@@ -0,0 +1,4 @@
{
"name": "functions-symlink-test",
"private": true
}

View File

@@ -0,0 +1,3 @@
{
"builds": [{ "src": "package.json", "use": "functions-symlink@0.0.0" }]
}

View File

@@ -382,6 +382,9 @@ module.exports = async function prepare(session, binaryPath, tmpFixturesDir) {
'index.html': 'Hello',
'vercel.json': '{"builds":[{"src":"*.html","use":"@vercel/static"}]}',
},
'project-sensitive-env-vars': {
'package.json': '{}',
},
'dev-proxy-headers-and-env': {
'package.json': JSON.stringify({}),
'server.js': `require('http').createServer((req, res) => {
@@ -421,7 +424,6 @@ module.exports = async function prepare(session, binaryPath, tmpFixturesDir) {
projectId: '.',
settings: {
framework: null,
installCommand: 'echo "skipping install"',
},
}),
'package.json': JSON.stringify({
@@ -429,7 +431,22 @@ module.exports = async function prepare(session, binaryPath, tmpFixturesDir) {
build: 'mkdir -p public && echo hi > public/index.txt',
},
dependencies: {
'@vercel/speed-insights': '0.0.1',
'@vercel/speed-insights': '0.0.4',
},
}),
},
'vc-build-indirect-web-analytics': {
'.vercel/project.json': JSON.stringify({
orgId: '.',
projectId: '.',
settings: {
framework: null,
installCommand: 'yarn add @vercel/analytics@1.1.1',
},
}),
'package.json': JSON.stringify({
scripts: {
build: 'mkdir -p public && echo hi > public/index.txt',
},
}),
},
@@ -439,7 +456,6 @@ module.exports = async function prepare(session, binaryPath, tmpFixturesDir) {
projectId: '.',
settings: {
framework: null,
installCommand: 'echo "skipping install"',
},
}),
'package.json': JSON.stringify({

View File

@@ -681,6 +681,53 @@ test('vercel env with unknown `VERCEL_ORG_ID` or `VERCEL_PROJECT_ID` should erro
expect(output.stderr).toContain('Project not found');
});
test('add a sensitive env var', async () => {
const dir = await setupE2EFixture('project-sensitive-env-vars');
const projectName = `project-sensitive-env-vars-${
Math.random().toString(36).split('.')[1]
}`;
// remove previously linked project if it exists
await remove(path.join(dir, '.vercel'));
const vc = execCli(binaryPath, ['link'], {
cwd: dir,
env: {
FORCE_TTY: '1',
},
});
await setupProject(vc, projectName, {
buildCommand: `mkdir -p o && echo '<h1>custom hello</h1>' > o/index.html`,
outputDirectory: 'o',
});
await vc;
const link = require(path.join(dir, '.vercel/project.json'));
const addEnvCommand = execCli(
binaryPath,
['env', 'add', 'envVarName', 'production', '--sensitive'],
{
env: {
VERCEL_ORG_ID: link.orgId,
VERCEL_PROJECT_ID: link.projectId,
},
}
);
await waitForPrompt(addEnvCommand, /Whats the value of [^?]+\?/);
addEnvCommand.stdin?.write('test\n');
const output = await addEnvCommand;
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toContain(
'Added Environment Variable envVarName to Project'
);
});
test('whoami with `VERCEL_ORG_ID` should favor `--scope` and should error', async () => {
if (!token) {
throw new Error('Shared state "token" not set.');
@@ -750,7 +797,7 @@ test('deploys with only vercel.json and README.md', async () => {
// assert timing order of showing URLs vs status updates
expect(stderr).toMatch(
/Inspect.*\nPreview.*\nQueued.*\nBuilding.*\nCompleting/
/Inspect.*\nProduction.*\nQueued.*\nBuilding.*\nCompleting/
);
const { host } = new URL(stdout);
@@ -857,7 +904,7 @@ test('deploy pnpm twice using pnp and symlink=false', async () => {
page = await fetch(stdout);
text = await page.text();
expect(text).toBe('cache exists\n');
expect(text).toContain('cache exists\n');
});
test('reject deploying with wrong team .vercel config', async () => {
@@ -1168,23 +1215,25 @@ test('[vc build] should build project with `@vercel/static-build`', async () =>
});
test('[vc build] should build project with `@vercel/speed-insights`', async () => {
try {
process.env.VERCEL_ANALYTICS_ID = '123';
const directory = await setupE2EFixture('vc-build-speed-insights');
const output = await execCli(binaryPath, ['build'], { cwd: directory });
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toContain('Build Completed in .vercel/output');
const builds = await fs.readJSON(
path.join(directory, '.vercel/output/builds.json')
);
expect(builds?.features?.speedInsightsVersion).toEqual('0.0.4');
});
const directory = await setupE2EFixture('vc-build-speed-insights');
const output = await execCli(binaryPath, ['build'], { cwd: directory });
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toContain('Build Completed in .vercel/output');
expect(output.stderr).toContain(
'The `VERCEL_ANALYTICS_ID` environment variable is deprecated and will be removed in a future release. Please remove it from your environment variables'
);
const builds = await fs.readJSON(
path.join(directory, '.vercel/output/builds.json')
);
expect(builds?.features?.speedInsightsVersion).toEqual('0.0.1');
} finally {
delete process.env.VERCEL_ANALYTICS_ID;
}
test('[vc build] should build project with an indirect dependency to `@vercel/analytics`', async () => {
const directory = await setupE2EFixture('vc-build-indirect-web-analytics');
const output = await execCli(binaryPath, ['build'], { cwd: directory });
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toContain('Build Completed in .vercel/output');
const builds = await fs.readJSON(
path.join(directory, '.vercel/output/builds.json')
);
expect(builds?.features?.webAnalyticsVersion).toEqual('1.1.1');
});
test('[vc build] should build project with `@vercel/analytics`', async () => {

View File

@@ -1175,7 +1175,7 @@ test('render build errors', async () => {
const output = await execCli(binaryPath, [deploymentPath, '--yes']);
expect(output.exitCode, formatOutput(output)).toBe(1);
expect(output.stderr).toMatch(/Command "yarn run build" exited with 1/gm);
expect(output.stderr).toMatch(/Command "npm run build" exited with 1/gm);
});
test('invalid deployment, projects and alias names', async () => {

View File

@@ -88,6 +88,26 @@ exports[`help command help output snapshots column width 40 1`] = `
the
deploym…
on
--skip-domain Disable
the
automat…
promoti…
(aliasi…
of the
relevant
domains
to a new
product…
deploym…
You can
use \`vc
promote\`
to
complete
the
domain-…
process
later
--with-cache Retain
build
cache
@@ -192,6 +212,10 @@ exports[`help command help output snapshots column width 80 1`] = `
--prod Create a production deployment
-p, --public Deployment is public (\`/_src\`) is exposed)
--regions Set default regions to enable the deployment on
--skip-domain Disable the automatic promotion (aliasing) of
the relevant domains to a new production
deployment. You can use \`vc promote\` to complete
the domain-assignment process later
--with-cache Retain build cache when using "--force"
-y, --yes Use default options to skip all prompts
@@ -255,6 +279,8 @@ exports[`help command help output snapshots column width 120 1`] = `
--prod Create a production deployment
-p, --public Deployment is public (\`/_src\`) is exposed)
--regions Set default regions to enable the deployment on
--skip-domain Disable the automatic promotion (aliasing) of the relevant domains to a new production
deployment. You can use \`vc promote\` to complete the domain-assignment process later
--with-cache Retain build cache when using "--force"
-y, --yes Use default options to skip all prompts

View File

@@ -785,7 +785,7 @@ describe('build', () => {
expect(files.sort()).toEqual(['index.html', 'package.json']);
});
it('should set `VERCEL_ANALYTICS_ID` environment variable', async () => {
it('should set `VERCEL_ANALYTICS_ID` environment variable and warn users', async () => {
const cwd = fixture('vercel-analytics');
const output = join(cwd, '.vercel/output');
client.cwd = cwd;
@@ -794,6 +794,9 @@ describe('build', () => {
const env = await fs.readJSON(join(output, 'static', 'env.json'));
expect(Object.keys(env).includes('VERCEL_ANALYTICS_ID')).toEqual(true);
await expect(client.stderr).toOutput(
'Vercel Speed Insights auto-injection is deprecated in favor of @vercel/speed-insights package. Learn more: https://vercel.link/upgrate-to-speed-insights-package'
);
});
it('should load environment variables from `.vercel/.env.preview.local`', async () => {
@@ -1248,3 +1251,42 @@ describe('build', () => {
).toEqual('marketing');
});
});
it('should create symlinks for duplicate references to Lambda / EdgeFunction instances', async () => {
if (process.platform === 'win32') {
console.log('Skipping test on Windows');
return;
}
const cwd = fixture('functions-symlink');
const output = join(cwd, '.vercel/output');
client.cwd = cwd;
const exitCode = await build(client);
expect(exitCode).toEqual(0);
// "functions" directory has output Functions
const functions = await fs.readdir(join(output, 'functions'));
expect(functions.sort()).toEqual([
'edge.func',
'edge2.func',
'lambda.func',
'lambda2.func',
]);
expect(
fs.lstatSync(join(output, 'functions/lambda.func')).isDirectory()
).toEqual(true);
expect(
fs.lstatSync(join(output, 'functions/edge.func')).isDirectory()
).toEqual(true);
expect(
fs.lstatSync(join(output, 'functions/lambda2.func')).isSymbolicLink()
).toEqual(true);
expect(
fs.lstatSync(join(output, 'functions/edge2.func')).isSymbolicLink()
).toEqual(true);
expect(fs.readlinkSync(join(output, 'functions/lambda2.func'))).toEqual(
'lambda.func'
);
expect(fs.readlinkSync(join(output, 'functions/edge2.func'))).toEqual(
'edge.func'
);
});

View File

@@ -253,12 +253,12 @@ describe('validateConfig', () => {
const error = validateConfig({
functions: {
'api/test.js': {
memory: 3009,
memory: 3010,
},
},
});
expect(error!.message).toEqual(
"Invalid vercel.json - `functions['api/test.js'].memory` should be <= 3008."
"Invalid vercel.json - `functions['api/test.js'].memory` should be <= 3009."
);
expect(error!.link).toEqual(
'https://vercel.com/docs/concepts/projects/project-configuration#functions'

View File

@@ -1,5 +1,52 @@
# @vercel/client
## 13.1.4
### Patch Changes
- Updated dependencies [[`37b193c84`](https://github.com/vercel/vercel/commit/37b193c845d8b63d93bb0017fbc1a6a35306ef1f)]:
- @vercel/build-utils@7.7.1
## 13.1.3
### Patch Changes
- Updated dependencies [[`24c3dd282`](https://github.com/vercel/vercel/commit/24c3dd282d7714cd63d2b94fb94745c45fdc79ab)]:
- @vercel/build-utils@7.7.0
## 13.1.2
### Patch Changes
- Updated dependencies [[`b6ed28b9b`](https://github.com/vercel/vercel/commit/b6ed28b9b1712f882c93fe053b70d3eb1df21819), [`8ba0ce932`](https://github.com/vercel/vercel/commit/8ba0ce932434c6295fedb5307bee59a804b7e6a8), [`0d034b682`](https://github.com/vercel/vercel/commit/0d034b6820c0f3252949c0ffc483048c5aac7f04), [`abaa700ce`](https://github.com/vercel/vercel/commit/abaa700cea44c723cfc851baa2dfe9e1ae2e8a5c)]:
- @vercel/build-utils@7.6.0
## 13.1.1
### Patch Changes
- More helpful error message when `vc deploy --prebuilt` has missing files ([#11105](https://github.com/vercel/vercel/pull/11105))
## 13.1.0
### Minor Changes
- Upload files referenced by "filePathMap" during `vc deploy --prebuilt` ([#11077](https://github.com/vercel/vercel/pull/11077))
## 13.0.14
### Patch Changes
- Updated dependencies [[`cdddb33ad`](https://github.com/vercel/vercel/commit/cdddb33ad49f6080c49f4fff3767e6111acd0bbe)]:
- @vercel/build-utils@7.5.1
## 13.0.13
### Patch Changes
- Updated dependencies [[`98040ec24`](https://github.com/vercel/vercel/commit/98040ec24e1ee585865d11eb216b6525d39d209e)]:
- @vercel/build-utils@7.5.0
## 13.0.12
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/client",
"version": "13.0.12",
"version": "13.1.4",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"homepage": "https://vercel.com",
@@ -37,7 +37,8 @@
"typescript": "4.9.5"
},
"dependencies": {
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"@vercel/error-utils": "2.0.2",
"@vercel/routing-utils": "3.1.0",
"@zeit/fetch": "5.2.0",
"async-retry": "1.2.3",

View File

@@ -1,9 +1,10 @@
import { lstatSync } from 'fs-extra';
import { isAbsolute, join, relative } from 'path';
import { isAbsolute, join, relative, sep } from 'path';
import { hash, hashes, mapToObject } from './utils/hashes';
import { upload } from './upload';
import { buildFileTree, createDebug } from './utils';
import { DeploymentError } from './errors';
import { isErrnoException } from '@vercel/error-utils';
import {
VercelClientOptions,
DeploymentOptions,
@@ -90,27 +91,43 @@ export default function buildCreateDeployment() {
let files;
if (clientOptions.archive === 'tgz') {
debug('Packing tarball');
const tarStream = tar
.pack(workPath, {
entries: fileList.map(file => relative(workPath, file)),
})
.pipe(createGzip());
const tarBuffer = await streamToBuffer(tarStream);
debug('Packed tarball');
files = new Map([
[
hash(tarBuffer),
{
names: [join(workPath, '.vercel/source.tgz')],
data: tarBuffer,
mode: 0o666,
},
],
]);
} else {
files = await hashes(fileList);
try {
if (clientOptions.archive === 'tgz') {
debug('Packing tarball');
const tarStream = tar
.pack(workPath, {
entries: fileList.map(file => relative(workPath, file)),
})
.pipe(createGzip());
const tarBuffer = await streamToBuffer(tarStream);
debug('Packed tarball');
files = new Map([
[
hash(tarBuffer),
{
names: [join(workPath, '.vercel/source.tgz')],
data: tarBuffer,
mode: 0o666,
},
],
]);
} else {
files = await hashes(fileList);
}
} catch (err: unknown) {
if (
clientOptions.prebuilt &&
isErrnoException(err) &&
err.code === 'ENOENT' &&
err.path
) {
const errPath = relative(workPath, err.path);
err.message = `File does not exist: "${relative(workPath, errPath)}"`;
if (errPath.split(sep).includes('node_modules')) {
err.message = `Please ensure project dependencies have been installed:\n${err.message}`;
}
}
throw err;
}
debug(`Yielding a 'hashes-calculated' event with ${files.size} hashes`);

View File

@@ -1,7 +1,7 @@
import { FilesMap } from './hashes';
import { FetchOptions } from '@zeit/fetch';
import { nodeFetch, zeitFetch } from './fetch';
import { join, sep, relative } from 'path';
import { join, sep, relative, basename } from 'path';
import { URL } from 'url';
import ignore from 'ignore';
import { pkgVersion } from '../pkg';
@@ -109,6 +109,29 @@ export async function buildFileTree(
return ignored;
};
fileList = await readdir(path, [ignores]);
if (prebuilt) {
// Traverse over the `.vc-config.json` files and include
// the files referenced by the "filePathMap" properties
const refs = new Set<string>();
const vcConfigFilePaths = fileList.filter(
file => basename(file) === '.vc-config.json'
);
await Promise.all(
vcConfigFilePaths.map(async p => {
const configJson = await readFile(p, 'utf8');
const config = JSON.parse(configJson);
if (!config.filePathMap) return;
for (const v of Object.values(config.filePathMap) as string[]) {
refs.add(join(path, v));
}
})
);
if (refs.size > 0) {
fileList = fileList.concat(Array.from(refs));
}
}
debug(`Found ${fileList.length} files in the specified directory`);
} else if (Array.isArray(path)) {
// Array of file paths

View File

@@ -0,0 +1 @@
!/.vercel

View File

@@ -0,0 +1,5 @@
{
"filePathMap": {
"node_modules/another/index.js": "node_modules/another/index.js"
}
}

View File

@@ -0,0 +1,5 @@
{
"filePathMap": {
"node_modules/example/index.js": "node_modules/example/index.js"
}
}

View File

@@ -109,7 +109,7 @@ describe('buildFileTree()', () => {
normalizeWindowsPaths(fileList).sort()
);
const expectedIgnoreList = ['.vercel'];
const expectedIgnoreList = ['.gitignore', '.vercel'];
expect(normalizeWindowsPaths(expectedIgnoreList).sort()).toEqual(
normalizeWindowsPaths(ignoreList).sort()
);
@@ -124,14 +124,18 @@ describe('buildFileTree()', () => {
);
const expectedFileList = toAbsolutePaths(cwd, [
'.vercel/output/functions/api/another.func/.vc-config.json',
'.vercel/output/functions/api/example.func/.vc-config.json',
'.vercel/output/static/baz.txt',
'.vercel/output/static/sub/qux.txt',
'node_modules/another/index.js',
'node_modules/example/index.js',
]);
expect(normalizeWindowsPaths(expectedFileList).sort()).toEqual(
normalizeWindowsPaths(fileList).sort()
);
const expectedIgnoreList = ['foo.txt', 'sub'];
const expectedIgnoreList = ['.gitignore', 'foo.txt', 'sub'];
expect(normalizeWindowsPaths(expectedIgnoreList).sort()).toEqual(
normalizeWindowsPaths(ignoreList).sort()
);

View File

@@ -70,7 +70,7 @@ Unicode characters for emoji flags start at this number, and run up to 127469.
`Const` **IP_HEADER_NAME**: `"x-real-ip"`
Client IP as calcualted by Vercel Proxy.
Client IP as calculated by Vercel Proxy.
#### Defined in

View File

@@ -7,7 +7,7 @@ export const CITY_HEADER_NAME = 'x-vercel-ip-city';
*/
export const COUNTRY_HEADER_NAME = 'x-vercel-ip-country';
/**
* Client IP as calcualted by Vercel Proxy.
* Client IP as calculated by Vercel Proxy.
*/
export const IP_HEADER_NAME = 'x-real-ip';
/**

View File

@@ -1,5 +1,11 @@
# @vercel/frameworks
## 3.0.0
### Major Changes
- Make "remix" framework preset supersede "vite" ([#11031](https://github.com/vercel/vercel/pull/11031))
## 2.0.6
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/frameworks",
"version": "2.0.6",
"version": "3.0.0",
"main": "./dist/frameworks.js",
"types": "./dist/frameworks.d.ts",
"files": [

View File

@@ -202,11 +202,14 @@ export const frameworks = [
description: 'A new Remix app — the result of running `npx create-remix`.',
website: 'https://remix.run',
sort: 6,
supersedes: 'hydrogen',
supersedes: ['hydrogen', 'vite'],
useRuntime: { src: 'package.json', use: '@vercel/remix-builder' },
ignoreRuntimes: ['@vercel/node'],
detectors: {
some: [
{
matchPackage: '@remix-run/dev',
},
{
path: 'remix.config.js',
},
@@ -1734,7 +1737,7 @@ export const frameworks = [
tagline: 'React framework for headless commerce',
description: 'React framework for headless commerce',
website: 'https://hydrogen.shopify.dev',
supersedes: 'vite',
supersedes: ['vite'],
useRuntime: { src: 'package.json', use: '@vercel/hydrogen' },
envPrefix: 'PUBLIC_',
detectors: {

View File

@@ -220,7 +220,7 @@ export interface Framework {
*/
defaultVersion?: string;
/**
* Slug of another framework preset in which this framework supersedes.
* Array of slugs for other framework presets which this framework supersedes.
*/
supersedes?: string;
supersedes?: string[];
}

View File

@@ -199,7 +199,7 @@ const Schema = {
dependency: { type: 'string' },
cachePattern: { type: 'string' },
defaultVersion: { type: 'string' },
supersedes: { type: 'string' },
supersedes: { type: 'array', items: { type: 'string' } },
},
},
};

View File

@@ -1,5 +1,22 @@
# @vercel/fs-detectors
## 5.2.1
### Patch Changes
- [build-utils] increase max memory limit ([#11209](https://github.com/vercel/vercel/pull/11209))
## 5.2.0
### Minor Changes
- Make "remix" framework preset supersede "vite" ([#11031](https://github.com/vercel/vercel/pull/11031))
### Patch Changes
- Updated dependencies [[`1333071a3`](https://github.com/vercel/vercel/commit/1333071a3a2d324679327bfdd4e872f8fd3521c6)]:
- @vercel/frameworks@3.0.0
## 5.1.6
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/fs-detectors",
"version": "5.1.6",
"version": "5.2.1",
"description": "Vercel filesystem detectors",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -22,7 +22,7 @@
},
"dependencies": {
"@vercel/error-utils": "2.0.2",
"@vercel/frameworks": "2.0.6",
"@vercel/frameworks": "3.0.0",
"@vercel/routing-utils": "3.1.0",
"glob": "8.0.3",
"js-yaml": "4.1.0",
@@ -37,7 +37,7 @@
"@types/minimatch": "3.0.5",
"@types/node": "14.18.33",
"@types/semver": "7.3.10",
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"jest-junit": "16.0.0",
"typescript": "4.9.5"
}

View File

@@ -612,11 +612,11 @@ function validateFunctions({ functions = {} }: Options) {
if (
func.memory !== undefined &&
(func.memory < 128 || func.memory > 3008)
(func.memory < 128 || func.memory > 3009)
) {
return {
code: 'invalid_function_memory',
message: 'Functions must have a memory value between 128 and 3008',
message: 'Functions must have a memory value between 128 and 3009',
};
}

View File

@@ -143,7 +143,9 @@ function removeSupersededFramework(
const framework = matches[index];
if (framework) {
if (framework.supersedes) {
removeSupersededFramework(matches, framework.supersedes);
for (const slug of framework.supersedes) {
removeSupersededFramework(matches, slug);
}
}
matches.splice(index, 1);
}
@@ -154,7 +156,9 @@ export function removeSupersededFrameworks(
) {
for (const match of matches.slice()) {
if (match?.supersedes) {
removeSupersededFramework(matches, match.supersedes);
for (const slug of match.supersedes) {
removeSupersededFramework(matches, slug);
}
}
}
}

View File

@@ -166,12 +166,12 @@ describe('removeSupersededFrameworks()', () => {
const matches = [
{ slug: 'storybook' },
{ slug: 'vite' },
{ slug: 'hydrogen', supersedes: 'vite' },
{ slug: 'hydrogen', supersedes: ['vite'] },
];
removeSupersededFrameworks(matches);
expect(matches).toEqual([
{ slug: 'storybook' },
{ slug: 'hydrogen', supersedes: 'vite' },
{ slug: 'hydrogen', supersedes: ['vite'] },
]);
});
@@ -179,13 +179,13 @@ describe('removeSupersededFrameworks()', () => {
const matches = [
{ slug: 'storybook' },
{ slug: 'vite' },
{ slug: 'hydrogen', supersedes: 'vite' },
{ slug: 'remix', supersedes: 'hydrogen' },
{ slug: 'hydrogen', supersedes: ['vite'] },
{ slug: 'remix', supersedes: ['hydrogen'] },
];
removeSupersededFrameworks(matches);
expect(matches).toEqual([
{ slug: 'storybook' },
{ slug: 'remix', supersedes: 'hydrogen' },
{ slug: 'remix', supersedes: ['hydrogen'] },
]);
});
});
@@ -442,6 +442,20 @@ describe('detectFramework()', () => {
expect(await detectFramework({ fs, frameworkList })).toBe('storybook');
});
it('Should detect Remix + Vite as `remix`', async () => {
const fs = new VirtualFilesystem({
'vite.config.ts': '',
'package.json': JSON.stringify({
dependencies: {
'@remix-run/dev': 'latest',
vite: 'latest',
},
}),
});
expect(await detectFramework({ fs, frameworkList })).toBe('remix');
});
});
describe('detectFrameworks()', () => {
@@ -497,6 +511,23 @@ describe('detectFrameworks()', () => {
expect(slugs).toEqual(['nextjs', 'storybook']);
});
it('Should detect Remix + Vite as `remix`', async () => {
const fs = new VirtualFilesystem({
'vite.config.ts': '',
'package.json': JSON.stringify({
dependencies: {
'@remix-run/dev': 'latest',
vite: 'latest',
},
}),
});
const slugs = (await detectFrameworks({ fs, frameworkList })).map(
f => f.slug
);
expect(slugs).toEqual(['remix']);
});
it('Should detect "hydrogen" template as `hydrogen`', async () => {
const fs = new LocalFileSystemDetector(join(EXAMPLES_DIR, 'hydrogen'));

View File

@@ -1,5 +1,42 @@
# @vercel/gatsby-plugin-vercel-builder
## 2.0.19
### Patch Changes
- Updated dependencies [[`37b193c84`](https://github.com/vercel/vercel/commit/37b193c845d8b63d93bb0017fbc1a6a35306ef1f)]:
- @vercel/build-utils@7.7.1
## 2.0.18
### Patch Changes
- Updated dependencies [[`24c3dd282`](https://github.com/vercel/vercel/commit/24c3dd282d7714cd63d2b94fb94745c45fdc79ab)]:
- @vercel/build-utils@7.7.0
## 2.0.17
### Patch Changes
- [gatsby-plugin-vercel-builder] use --keep-names esbuild flag ([#11117](https://github.com/vercel/vercel/pull/11117))
- Updated dependencies [[`b6ed28b9b`](https://github.com/vercel/vercel/commit/b6ed28b9b1712f882c93fe053b70d3eb1df21819), [`8ba0ce932`](https://github.com/vercel/vercel/commit/8ba0ce932434c6295fedb5307bee59a804b7e6a8), [`0d034b682`](https://github.com/vercel/vercel/commit/0d034b6820c0f3252949c0ffc483048c5aac7f04), [`abaa700ce`](https://github.com/vercel/vercel/commit/abaa700cea44c723cfc851baa2dfe9e1ae2e8a5c)]:
- @vercel/build-utils@7.6.0
## 2.0.16
### Patch Changes
- Updated dependencies [[`cdddb33ad`](https://github.com/vercel/vercel/commit/cdddb33ad49f6080c49f4fff3767e6111acd0bbe)]:
- @vercel/build-utils@7.5.1
## 2.0.15
### Patch Changes
- Updated dependencies [[`98040ec24`](https://github.com/vercel/vercel/commit/98040ec24e1ee585865d11eb216b6525d39d209e)]:
- @vercel/build-utils@7.5.0
## 2.0.14
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/gatsby-plugin-vercel-builder",
"version": "2.0.14",
"version": "2.0.19",
"main": "dist/index.js",
"files": [
"dist",
@@ -20,7 +20,7 @@
},
"dependencies": {
"@sinclair/typebox": "0.25.24",
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"@vercel/routing-utils": "3.1.0",
"esbuild": "0.14.47",
"etag": "1.8.1",

View File

@@ -35,6 +35,9 @@ export const writeHandler = async ({
platform: 'node',
bundle: true,
minify: true,
// prevents renaming edge cases from causing failures like:
// https://github.com/node-fetch/node-fetch/issues/784
keepNames: true,
define: {
'process.env.NODE_ENV': "'production'",
vercel_pathPrefix: JSON.stringify(prefix),

View File

@@ -29,7 +29,7 @@
"@types/node-fetch": "^2.3.0",
"@types/tar": "6.1.5",
"@types/yauzl-promise": "2.1.0",
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"async-retry": "1.3.3",
"execa": "^1.0.0",
"fs-extra": "^7.0.0",

View File

@@ -1,5 +1,11 @@
# @vercel/hydrogen
## 1.0.2
### Patch Changes
- Deprecate `EdgeFunction#name` property ([#11010](https://github.com/vercel/vercel/pull/11010))
## 1.0.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/hydrogen",
"version": "1.0.1",
"version": "1.0.2",
"license": "Apache-2.0",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -26,7 +26,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "14.18.33",
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"execa": "3.2.0",
"fs-extra": "11.1.0",
"jest-junit": "16.0.0"

View File

@@ -126,7 +126,6 @@ export const build: BuildV2 = async ({
]);
const edgeFunction = new EdgeFunction({
name: 'hydrogen',
deploymentTarget: 'v8-worker',
entrypoint: 'index.js',
files: edgeFunctionFiles,

View File

@@ -1,5 +1,53 @@
# @vercel/next
## 4.1.4
### Patch Changes
- Enable partial prerendering support for pre-generated pages ([#11183](https://github.com/vercel/vercel/pull/11183))
## 4.1.3
### Patch Changes
- Fix manifest with experimental flag ([#11192](https://github.com/vercel/vercel/pull/11192))
## 4.1.2
### Patch Changes
- Update experimental bundle flag ([#11187](https://github.com/vercel/vercel/pull/11187))
- [next] Add flag for experimental grouping ([#11177](https://github.com/vercel/vercel/pull/11177))
- bump `@vercel/nft@0.26.4` ([#11155](https://github.com/vercel/vercel/pull/11155))
- fix: missing experimental field ([#11184](https://github.com/vercel/vercel/pull/11184))
## 4.1.1
### Patch Changes
- [node][next][redwood][remix] bump `@vercel/nft@0.26.3` ([#11115](https://github.com/vercel/vercel/pull/11115))
- Load common chunks on module initialization ([#11126](https://github.com/vercel/vercel/pull/11126))
- Fix index normalizing for app outputs ([#11099](https://github.com/vercel/vercel/pull/11099))
- Mark `flags` as deprecated and replace them with `variants` ([#11098](https://github.com/vercel/vercel/pull/11098))
- Fix rewrite RSC handling with trailingSlash ([#11107](https://github.com/vercel/vercel/pull/11107))
## 4.1.0
### Minor Changes
- fix error when @vercel/analytics is a transitive dependency of the deployed application ([#10892](https://github.com/vercel/vercel/pull/10892))
### Patch Changes
- Use `worker.name` instead of edge function name to fix type error in `@vercel/next` ([#11050](https://github.com/vercel/vercel/pull/11050))
## 4.0.17
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/next",
"version": "4.0.17",
"version": "4.1.4",
"license": "Apache-2.0",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -23,7 +23,7 @@
"dist"
],
"dependencies": {
"@vercel/nft": "0.26.2"
"@vercel/nft": "0.26.4"
},
"devDependencies": {
"@types/aws-lambda": "8.10.19",
@@ -40,7 +40,7 @@
"@types/semver": "6.0.0",
"@types/text-table": "0.2.1",
"@types/webpack-sources": "3.2.0",
"@vercel/build-utils": "7.4.1",
"@vercel/build-utils": "7.7.1",
"@vercel/routing-utils": "3.1.0",
"async-sema": "3.0.1",
"buffer-crc32": "0.2.13",

View File

@@ -511,7 +511,7 @@ export const build: BuildV2 = async ({
entryPath,
outputDirectory
);
const omittedPrerenderRoutes = new Set(
const omittedPrerenderRoutes: ReadonlySet<string> = new Set(
Object.keys(prerenderManifest.omittedRoutes)
);
@@ -1142,6 +1142,10 @@ export const build: BuildV2 = async ({
appPathRoutesManifest,
});
/**
* This is a detection for preview mode that's required for the pages
* router.
*/
const canUsePreviewMode = Object.keys(pages).some(page =>
isApiPage(pages[page].fsPath)
);
@@ -1316,6 +1320,22 @@ export const build: BuildV2 = async ({
}
}
/**
* All of the routes that have `experimentalPPR` enabled.
*/
const experimentalPPRRoutes = new Set<string>();
for (const [route, { experimentalPPR }] of [
...Object.entries(prerenderManifest.staticRoutes),
...Object.entries(prerenderManifest.blockingFallbackRoutes),
...Object.entries(prerenderManifest.fallbackRoutes),
...Object.entries(prerenderManifest.omittedRoutes),
]) {
if (!experimentalPPR) continue;
experimentalPPRRoutes.add(route);
}
if (requiredServerFilesManifest) {
if (!routesManifest) {
throw new Error(
@@ -1371,6 +1391,7 @@ export const build: BuildV2 = async ({
hasIsr404Page,
hasIsr500Page,
variantsManifest,
experimentalPPRRoutes,
});
}
@@ -1883,17 +1904,18 @@ export const build: BuildV2 = async ({
);
}
dynamicRoutes = await getDynamicRoutes(
dynamicRoutes = await getDynamicRoutes({
entryPath,
entryDirectory,
dynamicPages,
false,
isDev: false,
routesManifest,
omittedPrerenderRoutes,
omittedRoutes: omittedPrerenderRoutes,
canUsePreviewMode,
prerenderManifest.bypassToken || '',
isServerMode
).then(arr =>
bypassToken: prerenderManifest.bypassToken || '',
isServerMode,
experimentalPPRRoutes,
}).then(arr =>
localizeDynamicRoutes(
arr,
dynamicPrefix,
@@ -1912,17 +1934,18 @@ export const build: BuildV2 = async ({
// we need to include the prerenderManifest.omittedRoutes here
// for the page to be able to be matched in the lambda for preview mode
const completeDynamicRoutes = await getDynamicRoutes(
const completeDynamicRoutes = await getDynamicRoutes({
entryPath,
entryDirectory,
dynamicPages,
false,
isDev: false,
routesManifest,
undefined,
omittedRoutes: undefined,
canUsePreviewMode,
prerenderManifest.bypassToken || '',
isServerMode
).then(arr =>
bypassToken: prerenderManifest.bypassToken || '',
isServerMode,
experimentalPPRRoutes,
}).then(arr =>
arr.map(route => {
route.src = route.src.replace('^', `^${dynamicPrefix}`);
return route;
@@ -2119,22 +2142,33 @@ export const build: BuildV2 = async ({
appPathRoutesManifest,
isSharedLambdas,
canUsePreviewMode,
omittedPrerenderRoutes,
});
Object.keys(prerenderManifest.staticRoutes).forEach(route =>
prerenderRoute(route, { isBlocking: false, isFallback: false })
await Promise.all(
Object.keys(prerenderManifest.staticRoutes).map(route =>
prerenderRoute(route, {})
)
);
Object.keys(prerenderManifest.fallbackRoutes).forEach(route =>
prerenderRoute(route, { isBlocking: false, isFallback: true })
await Promise.all(
Object.keys(prerenderManifest.fallbackRoutes).map(route =>
prerenderRoute(route, { isFallback: true })
)
);
Object.keys(prerenderManifest.blockingFallbackRoutes).forEach(route =>
prerenderRoute(route, { isBlocking: true, isFallback: false })
await Promise.all(
Object.keys(prerenderManifest.blockingFallbackRoutes).map(route =>
prerenderRoute(route, { isBlocking: true })
)
);
if (static404Page && canUsePreviewMode) {
omittedPrerenderRoutes.forEach(route => {
prerenderRoute(route, { isOmitted: true });
});
await Promise.all(
Array.from(omittedPrerenderRoutes).map(route =>
prerenderRoute(route, { isOmitted: true })
)
);
}
// We still need to use lazyRoutes if the dataRoutes field

View File

@@ -47,11 +47,12 @@ import {
UnwrapPromise,
getOperationType,
FunctionsConfigManifestV1,
VariantsManifest,
VariantsManifestLegacy,
RSC_CONTENT_TYPE,
RSC_PREFETCH_SUFFIX,
normalizePrefetches,
CreateLambdaFromPseudoLayersOptions,
getPostponeResumePathname,
} from './utils';
import {
nodeFileTrace,
@@ -70,6 +71,30 @@ const NEXT_DATA_MIDDLEWARE_RESOLVING_VERSION = 'v12.1.7-canary.33';
const EMPTY_ALLOW_QUERY_FOR_PRERENDERED_VERSION = 'v12.2.0';
const CORRECTED_MANIFESTS_VERSION = 'v12.2.0';
// Ideally this should be in a Next.js manifest so we can change it in
// the future but this also allows us to improve existing versions
const PRELOAD_CHUNKS = {
APP_ROUTER_PAGES: [
'.next/server/webpack-runtime.js',
'next/dist/client/components/action-async-storage.external.js',
'next/dist/client/components/request-async-storage.external.js',
'next/dist/client/components/static-generation-async-storage.external.js',
'next/dist/compiled/next-server/app-page.runtime.prod.js',
],
APP_ROUTER_HANDLER: [
'.next/server/webpack-runtime.js',
'next/dist/compiled/next-server/app-route.runtime.prod.js',
],
PAGES_ROUTER_PAGES: [
'.next/server/webpack-runtime.js',
'next/dist/compiled/next-server/pages.runtime.prod.js',
],
PAGES_ROUTER_API: [
'.next/server/webpack-api-runtime.js',
'next/dist/compiled/next-server/pages-api.runtime.prod.js',
],
};
// related PR: https://github.com/vercel/next.js/pull/52997
// and https://github.com/vercel/next.js/pull/56318
const BUNDLED_SERVER_NEXT_VERSION = 'v13.5.4';
@@ -118,6 +143,7 @@ export async function serverBuild({
lambdaCompressedByteLimit,
requiredServerFilesManifest,
variantsManifest,
experimentalPPRRoutes,
}: {
appPathRoutesManifest?: Record<string, string>;
dynamicPages: string[];
@@ -127,7 +153,7 @@ export async function serverBuild({
pagesDir: string;
baseDir: string;
canUsePreviewMode: boolean;
omittedPrerenderRoutes: Set<string>;
omittedPrerenderRoutes: ReadonlySet<string>;
localePrefixed404: boolean;
staticPages: { [key: string]: FileFsRef };
lambdaAppPaths: { [key: string]: FileFsRef };
@@ -158,10 +184,15 @@ export async function serverBuild({
imagesManifest?: NextImagesManifest;
prerenderManifest: NextPrerenderedRoutes;
requiredServerFilesManifest: NextRequiredServerFilesManifest;
variantsManifest: VariantsManifest | null;
variantsManifest: VariantsManifestLegacy | null;
experimentalPPRRoutes: ReadonlySet<string>;
}): Promise<BuildResult> {
lambdaPages = Object.assign({}, lambdaPages, lambdaAppPaths);
const experimentalAllowBundling = Boolean(
process.env.NEXT_EXPERIMENTAL_FUNCTION_BUNDLING
);
const lambdas: { [key: string]: Lambda } = {};
const prerenders: { [key: string]: Prerender } = {};
const lambdaPageKeys = Object.keys(lambdaPages);
@@ -217,7 +248,7 @@ export async function serverBuild({
for (const rewrite of afterFilesRewrites) {
if (rewrite.src && rewrite.dest) {
rewrite.src = rewrite.src.replace(
'(?:/)?',
/\/?\(\?:\/\)\?/,
'(?<rscsuff>(\\.prefetch)?\\.rsc)?(?:/)?'
);
let destQueryIndex = rewrite.dest.indexOf('?');
@@ -242,10 +273,11 @@ export async function serverBuild({
nextVersion,
CORRECT_MIDDLEWARE_ORDER_VERSION
);
const isCorrectManifests = semver.gte(
nextVersion,
CORRECTED_MANIFESTS_VERSION
);
// experimental bundling prevents filtering manifests
// as we don't know what to filter by at this stage
const isCorrectManifests =
!experimentalAllowBundling &&
semver.gte(nextVersion, CORRECTED_MANIFESTS_VERSION);
let hasStatic500 = !!staticPages[path.posix.join(entryDirectory, '500')];
@@ -324,19 +356,7 @@ export async function serverBuild({
internalPages.push('404.js');
}
const experimentalPPRRoutes = new Set<string>();
for (const [route, { experimentalPPR }] of [
...Object.entries(prerenderManifest.staticRoutes),
...Object.entries(prerenderManifest.blockingFallbackRoutes),
...Object.entries(prerenderManifest.fallbackRoutes),
]) {
if (!experimentalPPR) continue;
experimentalPPRRoutes.add(route);
}
const prerenderRoutes = new Set<string>([
const prerenderRoutes: ReadonlySet<string> = new Set<string>([
...(canUsePreviewMode ? omittedPrerenderRoutes : []),
...Object.keys(prerenderManifest.blockingFallbackRoutes),
...Object.keys(prerenderManifest.fallbackRoutes),
@@ -744,7 +764,7 @@ export async function serverBuild({
.filter(Boolean) as string[];
let traceResult: NodeFileTraceResult | undefined;
let parentFilesMap: Map<string, Set<string>> | undefined;
let parentFilesMap: ReadonlyMap<string, Set<string>> | undefined;
if (pathsToTrace.length > 0) {
traceResult = await nodeFileTrace(pathsToTrace, {
@@ -859,6 +879,7 @@ export async function serverBuild({
const pageExtensions = requiredServerFilesManifest.config?.pageExtensions;
const pageLambdaGroups = await getPageLambdaGroups({
experimentalAllowBundling,
entryPath: projectDir,
config,
functionsConfigManifest,
@@ -880,6 +901,7 @@ export async function serverBuild({
}
const appRouterLambdaGroups = await getPageLambdaGroups({
experimentalAllowBundling,
entryPath: projectDir,
config,
functionsConfigManifest,
@@ -898,6 +920,7 @@ export async function serverBuild({
});
const appRouteHandlersLambdaGroups = await getPageLambdaGroups({
experimentalAllowBundling,
entryPath: projectDir,
config,
functionsConfigManifest,
@@ -1068,9 +1091,58 @@ export async function serverBuild({
}
}
let launcherData = group.isAppRouter ? appLauncher : launcher;
let preloadChunks: string[] = [];
if (process.env.VERCEL_NEXT_PRELOAD_COMMON === '1') {
const nextPackageDir = path.dirname(
resolveFrom(projectDir, 'next/package.json')
);
if (group.isPages) {
preloadChunks = PRELOAD_CHUNKS.PAGES_ROUTER_PAGES;
} else if (group.isApiLambda) {
preloadChunks = PRELOAD_CHUNKS.PAGES_ROUTER_API;
} else if (group.isAppRouter && !group.isAppRouteHandler) {
preloadChunks = PRELOAD_CHUNKS.APP_ROUTER_PAGES;
} else if (group.isAppRouteHandler) {
preloadChunks = PRELOAD_CHUNKS.APP_ROUTER_HANDLER;
}
const normalizedPreloadChunks: string[] = [];
for (const preloadChunk of preloadChunks) {
const absoluteChunk = preloadChunk.startsWith('.next')
? path.join(projectDir, preloadChunk)
: path.join(nextPackageDir, '..', preloadChunk);
// ensure the chunks are actually in this layer
if (
group.pseudoLayer[
path.join('.', path.relative(baseDir, absoluteChunk))
]
) {
normalizedPreloadChunks.push(
// relative files need to be prefixed with ./ for require
preloadChunk.startsWith('.next')
? `./${preloadChunk}`
: preloadChunk
);
}
}
if (normalizedPreloadChunks.length > 0) {
launcherData = launcherData.replace(
'// @preserve next-server-preload-target',
normalizedPreloadChunks
.map(name => `require('${name}');`)
.join('\n')
);
}
}
const launcherFiles: { [name: string]: FileFsRef | FileBlob } = {
[path.join(path.relative(baseDir, projectDir), '___next_launcher.cjs')]:
new FileBlob({ data: group.isAppRouter ? appLauncher : launcher }),
new FileBlob({ data: launcherData }),
};
const operationType = getOperationType({ group, prerenderManifest });
@@ -1090,6 +1162,7 @@ export async function serverBuild({
maxDuration: group.maxDuration,
isStreaming: group.isStreaming,
nextVersion,
experimentalAllowBundling,
};
const lambda = await createLambdaFromPseudoLayers(options);
@@ -1103,7 +1176,7 @@ export async function serverBuild({
// lambda for the page for revalidation.
let revalidate: NodejsLambda | undefined;
if (isPPR) {
if (isPPR && !options.isStreaming) {
if (!options.isStreaming) {
throw new Error("Invariant: PPR lambda isn't streaming");
}
@@ -1115,24 +1188,28 @@ export async function serverBuild({
});
}
for (const page of group.pages) {
const pageNoExt = page.replace(/\.js$/, '');
let isPrerender = prerenderRoutes.has(
path.join('/', pageNoExt === 'index' ? '' : pageNoExt)
);
for (const pageFilename of group.pages) {
// This is the name of the page, where the root is `index`.
const pageName = pageFilename.replace(/\.js$/, '');
// This is the name of the page prefixed with a `/`, where the root is
// `/index`.
const pagePath = path.posix.join('/', pageName);
// This is the routable pathname for the page, where the root is `/`.
const pagePathname = pagePath === '/index' ? '/' : pagePath;
let isPrerender = prerenderRoutes.has(pagePathname);
if (!isPrerender && routesManifest?.i18n) {
isPrerender = routesManifest.i18n.locales.some(locale => {
return prerenderRoutes.has(
path.join('/', locale, pageNoExt === 'index' ? '' : pageNoExt)
path.join('/', locale, pageName === 'index' ? '' : pageName)
);
});
}
let outputName = normalizeIndexOutput(
path.posix.join(entryDirectory, pageNoExt),
true
);
let outputName = path.posix.join(entryDirectory, pageName);
// If this is a PPR page, then we should prefix the output name.
if (isPPR) {
@@ -1140,24 +1217,56 @@ export async function serverBuild({
throw new Error("Invariant: PPR lambda isn't set");
}
// Get the get the base path prefixed route, without the index
// normalization.
outputName = path.posix.join(entryDirectory, pageNoExt);
// Assign the revalidate lambda to the output name. That's used to
// perform the initial static shell render.
lambdas[outputName] = revalidate;
const pprOutputName = path.posix.join(
entryDirectory,
'/_next/postponed/resume',
pageNoExt
);
lambdas[pprOutputName] = lambda;
// If this isn't an omitted page, then we should add the link from the
// page to the postpone resume lambda.
if (!omittedPrerenderRoutes.has(pagePathname)) {
const key = getPostponeResumePathname(entryDirectory, pageName);
lambdas[key] = lambda;
// We want to add the `experimentalStreamingLambdaPath` to this
// output.
experimentalStreamingLambdaPaths.set(outputName, key);
} else {
// As this is an omitted page, we should generate the experimental
// partial prerendering resume route for each of these routes that
// support partial prerendering. This is because the routes that
// haven't been omitted will have rewrite rules in place to rewrite
// the original request `/blog/my-slug` to the dynamic path
// `/blog/[slug]?nxtPslug=my-slug`.
for (const [
routePathname,
{ srcRoute, experimentalPPR },
] of Object.entries(prerenderManifest.staticRoutes)) {
// If the srcRoute doesn't match or this doesn't support
// experimental partial prerendering, then we can skip this route.
if (srcRoute !== pagePathname || !experimentalPPR) continue;
// If this route is the same as the page route, then we can skip
// it, because we've already added the lambda to the output.
if (routePathname === pagePathname) continue;
const key = getPostponeResumePathname(
entryDirectory,
routePathname
);
lambdas[key] = lambda;
outputName = path.posix.join(entryDirectory, routePathname);
experimentalStreamingLambdaPaths.set(outputName, key);
}
}
// We want to add the `experimentalStreamingLambdaPath` to this
// output.
experimentalStreamingLambdaPaths.set(outputName, pprOutputName);
continue;
}
if (!group.isAppRouter && !group.isAppRouteHandler) {
outputName = normalizeIndexOutput(outputName, true);
}
// we add locale prefixed outputs for SSR pages,
// this is handled in onPrerenderRoute for SSG pages
if (
@@ -1165,7 +1274,7 @@ export async function serverBuild({
!isPrerender &&
!group.isAppRouter &&
(!isCorrectLocaleAPIRoutes ||
!(pageNoExt === 'api' || pageNoExt.startsWith('api/')))
!(pageName === 'api' || pageName.startsWith('api/')))
) {
for (const locale of i18n.locales) {
lambdas[
@@ -1173,7 +1282,7 @@ export async function serverBuild({
path.posix.join(
entryDirectory,
locale,
pageNoExt === 'index' ? '' : pageNoExt
pageName === 'index' ? '' : pageName
),
true
)
@@ -1206,6 +1315,7 @@ export async function serverBuild({
hasPages404: routesManifest.pages404,
isCorrectNotFoundRoutes,
isEmptyAllowQueryForPrendered,
omittedPrerenderRoutes,
});
await Promise.all(
@@ -1213,11 +1323,13 @@ export async function serverBuild({
prerenderRoute(route, {})
)
);
await Promise.all(
Object.keys(prerenderManifest.fallbackRoutes).map(route =>
prerenderRoute(route, { isFallback: true })
)
);
await Promise.all(
Object.keys(prerenderManifest.blockingFallbackRoutes).map(route =>
prerenderRoute(route, { isBlocking: true })
@@ -1226,9 +1338,9 @@ export async function serverBuild({
if (static404Page && canUsePreviewMode) {
await Promise.all(
[...omittedPrerenderRoutes].map(route => {
return prerenderRoute(route, { isOmitted: true });
})
Array.from(omittedPrerenderRoutes).map(route =>
prerenderRoute(route, { isOmitted: true })
)
);
}
@@ -1237,6 +1349,7 @@ export async function serverBuild({
if (routesManifest?.i18n) {
route = normalizeLocalePath(route, routesManifest.i18n.locales).pathname;
}
delete lambdas[
normalizeIndexOutput(
path.posix.join('./', entryDirectory, route === '/' ? '/index' : route),
@@ -1260,19 +1373,19 @@ export async function serverBuild({
middleware.staticRoutes.length > 0 &&
semver.gte(nextVersion, NEXT_DATA_MIDDLEWARE_RESOLVING_VERSION);
const dynamicRoutes = await getDynamicRoutes(
const dynamicRoutes = await getDynamicRoutes({
entryPath,
entryDirectory,
dynamicPages,
false,
isDev: false,
routesManifest,
omittedPrerenderRoutes,
omittedRoutes: omittedPrerenderRoutes,
canUsePreviewMode,
prerenderManifest.bypassToken || '',
true,
middleware.dynamicRouteMap,
experimental.ppr
).then(arr =>
bypassToken: prerenderManifest.bypassToken || '',
isServerMode: true,
dynamicMiddlewareRouteMap: middleware.dynamicRouteMap,
experimentalPPRRoutes,
}).then(arr =>
localizeDynamicRoutes(
arr,
dynamicPrefix,
@@ -1443,9 +1556,10 @@ export async function serverBuild({
continue;
}
const pathname = normalizeIndexOutput(
path.posix.join('./', entryDirectory, route === '/' ? '/index' : route),
true
const pathname = path.posix.join(
'./',
entryDirectory,
route === '/' ? '/index' : route
);
if (lambdas[pathname]) {
@@ -1477,6 +1591,46 @@ export async function serverBuild({
throw new Error("Invariant: cannot use PPR without 'rsc.prefetchHeader'");
}
// If we're using the Experimental Partial Prerendering, we should ensure that
// all the routes that support it (and are listed) have configured lambdas.
// This only applies to routes that do not have fallbacks enabled (these are
// routes that have `dynamicParams = false` defined.
if (experimental.ppr) {
for (const { srcRoute, dataRoute, experimentalPPR } of Object.values(
prerenderManifest.staticRoutes
)) {
// Only apply this to the routes that support experimental PPR and
// that also have their `dataRoute` and `srcRoute` defined.
if (!experimentalPPR || !dataRoute || !srcRoute) continue;
// If the srcRoute is not omitted, then we don't need to do anything. This
// is the indicator that a route should only have it's prerender defined
// and not a lambda.
if (!omittedPrerenderRoutes.has(srcRoute)) continue;
// The lambda paths have their leading `/` stripped.
const srcPathname = srcRoute.substring(1);
const dataPathname = dataRoute.substring(1);
// If we already have an associated lambda for the `.rsc` route, then
// we can skip this.
const dataPathnameExists = dataPathname in lambdas;
if (dataPathnameExists) continue;
// We require that the source route has a lambda associated with it. If
// it doesn't this is an error.
const srcPathnameExists = srcPathname in lambdas;
if (!srcPathnameExists) {
throw new Error(
`Invariant: Expected to have a lambda for the source route: ${srcPathname}`
);
}
// Associate the data pathname with the source pathname's lambda.
lambdas[dataPathname] = lambdas[srcPathname];
}
}
return {
wildcard: wildcardConfig,
images: getImagesConfig(imagesManifest),

View File

@@ -23,6 +23,8 @@ if (process.env.NODE_ENV !== 'production' && region !== 'dev1') {
// eslint-disable-next-line
const NextServer = require('__NEXT_SERVER_PATH__').default;
// @preserve next-server-preload-target
// __NEXT_CONFIG__ value is injected
declare const __NEXT_CONFIG__: any;
const conf = __NEXT_CONFIG__;

Some files were not shown because too many files have changed in this diff Show More