Compare commits

..

9 Commits

Author SHA1 Message Date
Malte Ubl
35c6b19af7 Don't chunk-group prerender functions 2023-12-11 13:35:40 -08:00
Malte Ubl
4a3023e100 log2 2023-12-09 15:44:46 -08:00
Malte Ubl
03d8071c73 log 2023-12-09 15:23:22 -08:00
Malte Ubl
3a70a60064 log 2023-12-09 14:57:58 -08:00
Malte Ubl
178ba78028 Ignore prefix 2023-12-09 14:55:42 -08:00
Malte Ubl
5fd2674247 Log chunks 2023-12-09 11:46:38 -08:00
Malte Ubl
02ac64686b Log chunks 2023-12-09 11:20:45 -08:00
Malte Ubl
ed277ae07a Group by chunks 2023-12-09 11:19:00 -08:00
Malte Ubl
e06501d06f Just logging 2023-12-09 11:00:03 -08:00
935 changed files with 45645 additions and 98699 deletions

View File

@@ -0,0 +1,5 @@
---
'@vercel/ruby': patch
---
Remove `VERCEL_ALLOW_RUBY32` env var check

View File

@@ -0,0 +1,6 @@
---
"@vercel/build-utils": minor
"vercel": minor
---
[cli] add `--deprecated` option to `vc project ls` command

View File

@@ -0,0 +1,5 @@
---
'@vercel/frameworks': patch
---
This new screenshot matches the template. It removes the version number so this screenshot will not go stale.

View File

@@ -0,0 +1,5 @@
---
'@vercel/ruby': patch
---
Use Ruby 3.2 in test fixtures

View File

@@ -0,0 +1,3 @@
---
---

View File

@@ -0,0 +1,5 @@
---
'vercel': patch
---
Remove some debug statements and make log into warning

View File

@@ -0,0 +1,5 @@
---
'@vercel/remix-builder': patch
---
Update `@remix-run/dev` fork to v2.3.1

View File

@@ -10,7 +10,6 @@ packages/*/test/fixtures
packages/cli/@types
packages/cli/download
packages/cli/dist
packages/cli/test/fixtures
packages/cli/test/dev/fixtures
packages/cli/bin
packages/cli/link
@@ -39,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

22
.github/CODEOWNERS vendored
View File

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

View File

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

164
.github/dependabot.yml vendored
View File

@@ -1,164 +0,0 @@
version: 2
updates:
- directory: /packages/static-build/test/fixtures/angular-v17
schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
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'
- directory: /packages/static-build/test/fixtures/astro-v4
schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
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'
- directory: /packages/static-build/test/fixtures/hydrogen-v2023
schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
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'
- directory: /packages/static-build/test/fixtures/ionic-angular-v7
schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
allow:
- dependency-name: '@angular*'
- dependency-name: '@ionic*'
groups:
core:
patterns:
- '@angular*'
- '@ionic*'
update-types:
- 'minor'
- directory: /packages/static-build/test/fixtures/nuxt-v3
schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
allow:
- dependency-name: 'nuxt'
- dependency-name: 'vue'
- dependency-name: 'vue-router'
- dependency-name: '@nuxt-devtools'
ignore:
- dependency-name: 'nuxt'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
- dependency-name: 'vue'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
- dependency-name: 'vue-router'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
- dependency-name: '@nuxt-devtools'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
groups:
core:
patterns:
- 'nuxt'
- 'vue'
- 'vue-router'
- '@nuxt-devtools'
update-types:
- 'minor'
- directory: /packages/static-build/test/fixtures/stencil-v4
schedule:
interval: 'daily'
open-pull-requests-limit: 1
reviewers:
- 'trek'
- 'TooTallNate'
- 'EndangeredMassa'
commit-message:
prefix: '[framework-fixtures]'
package-ecosystem: 'npm'
allow:
- dependency-name: '@stencil/core'
ignore:
- dependency-name: '@stencil/core'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
groups:
core:
patterns:
- '@stencil/core'
update-types:
- 'minor'

View File

@@ -76,12 +76,3 @@ jobs:
script: |
const script = require('./utils/update-latest-release.js')
await script({ github, context })
summary:
name: Summary
runs-on: ubuntu-latest
timeout-minutes: 5
needs:
- release
steps:
- name: Check All
run: echo OK

View File

@@ -29,7 +29,6 @@ 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

@@ -13,7 +13,7 @@
<a href="https://vercel.com/docs"><strong>Documentation</strong></a> ·
<a href="https://vercel.com/changelog"><strong>Changelog</strong></a> ·
<a href="https://vercel.com/templates"><strong>Templates</strong></a> ·
<a href="https://vercel.com/docs/cli"><strong>CLI</strong></a>
<a href="https://vercel.com/cli"><strong>CLI</strong></a>
</p>
<br/>
@@ -23,7 +23,7 @@ Vercels Frontend Cloud provides the developer experience and infrastructure t
## Deploy
Get started by [importing a project](https://vercel.com/new) or using the [Vercel CLI](https://vercel.com/docs/cli). Then, `git push` to deploy.
Get started by [importing a project](https://vercel.com/new) or using the [Vercel CLI](https://vercel.com/cli). Then, `git push` to deploy.
## Documentation

2
examples/README.md vendored
View File

@@ -1,6 +1,6 @@
# Vercel Examples
To get started using any of these examples as your own project, [install Vercel](https://vercel.com/docs/cli) and use either of the following commands in your terminal:
To get started using any of these examples as your own project, [install Vercel](https://vercel.com/cli) and use either of the following commands in your terminal:
```sh
vercel init # Pick an example in the CLI

View File

@@ -4,7 +4,7 @@ import { lstatSync, readdirSync } from 'fs';
export async function deployExample(filename: string) {
const { testDeployment } = require('../../test/lib/deployment/test-deployment.js');
const example = basename(filename).replace(/\.test\.ts$/, '');
await testDeployment(join(process.cwd(), example));
await testDeployment(join(filename, '..', '..', '..', example));
}
export function getExamples() {

View File

@@ -1,5 +0,0 @@
{
"engines": {
"node": "18.x"
}
}

View File

@@ -8,6 +8,6 @@ menu:
main: {}
---
This is an example of a custom shortcode that you can put right into your content. You will need to add a form action to the shortcode to make it work. Check out [Formspree](https://formspree.io/) for a simple, free form service.
This is an example of a custom shortcode that you can put right into your content. You will need to add a form action to the the shortcode to make it work. Check out [Formspree](https://formspree.io/) for a simple, free form service.
{{< form-contact action="https://example.com" >}}

View File

@@ -8,7 +8,7 @@ This directory is a brief example of a [Hydrogen v2](https://shopify.dev/custom-
_Live Example: https://hydrogen-v2-template.vercel.app_
You can also deploy using the [Vercel CLI](https://vercel.com/docs/cli):
You can also deploy using the [Vercel CLI](https://vercel.com/cli):
```sh
npm i -g vercel

View File

@@ -23,7 +23,7 @@
"react-router": "^5.1.2",
"react-router-dom": "^5.1.2",
"react-scripts": "3.3.0",
"typescript": "4.9.5"
"typescript": "3.8.3"
},
"scripts": {
"start": "react-scripts start",

File diff suppressed because it is too large Load Diff

View File

@@ -27,6 +27,3 @@ 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.8.6)
public_suffix (>= 2.0.2, < 6.0)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0)
concurrent-ruby (1.2.3)
em-websocket (0.5.3)
concurrent-ruby (1.1.8)
em-websocket (0.5.2)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
ffi (1.16.3)
ffi (1.14.2)
forwardable-extended (2.6.0)
http_parser.rb (0.8.0)
i18n (1.14.1)
http_parser.rb (0.6.0)
i18n (1.8.9)
concurrent-ruby (~> 1.0)
jekyll (4.2.2)
jekyll (4.2.0)
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.17.0)
jekyll-feed (0.15.1)
jekyll (>= 3.7, < 5.0)
jekyll-sass-converter (2.2.0)
jekyll-sass-converter (2.1.0)
sassc (> 2.0.1, < 3.0)
jekyll-seo-tag (2.8.0)
jekyll-seo-tag (2.7.1)
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.4.0)
kramdown (2.3.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.9.0)
liquid (4.0.3)
listen (3.4.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
@@ -52,22 +52,21 @@ GEM
jekyll-seo-tag (~> 2.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (5.0.4)
rb-fsevent (0.11.2)
public_suffix (4.0.6)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.6)
rouge (3.30.0)
rexml (3.2.4)
rouge (3.26.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.8.0)
webrick (1.8.1)
unicode-display_width (1.7.0)
PLATFORMS
ruby
x86_64-linux
DEPENDENCIES
jekyll (~> 4.2.0)
@@ -76,7 +75,6 @@ DEPENDENCIES
tzinfo (~> 1.2)
tzinfo-data
wdm (~> 0.1.1)
webrick
BUNDLED WITH
2.5.6
2.2.4

View File

@@ -1,5 +0,0 @@
{
"engines": {
"node": "18.x"
}
}

View File

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

View File

@@ -1,60 +1,59 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (7.0.8.1)
activesupport (5.2.4.5)
concurrent-ruby (~> 1.0, >= 1.0.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)
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)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.2.3)
contracts (0.16.1)
dotenv (3.1.0)
concurrent-ruby (1.1.8)
contracts (0.13.0)
dotenv (2.7.6)
erubis (2.7.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
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)
tilt
hamster (3.0.0)
concurrent-ruby (~> 1.0)
hashie (3.6.0)
i18n (1.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
kramdown (2.4.0)
kramdown (2.3.0)
rexml
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
memoist (0.16.2)
middleman (4.5.1)
middleman (4.3.11)
coffee-script (~> 2.2)
haml (>= 4.0.5)
kramdown (>= 2.3.0)
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)
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)
backports (~> 3.6)
bundler (~> 2.0)
contracts (~> 0.13, < 0.17)
bundler
contracts (~> 0.13.0)
dotenv
erubis
execjs (~> 2.0)
@@ -62,52 +61,48 @@ GEM
fastimage (~> 2.0)
hamster (~> 3.0)
hashie (~> 3.4)
i18n (~> 1.6.0)
listen (~> 3.0)
i18n (~> 0.9.0)
listen (~> 3.0.0)
memoist (~> 0.14)
padrino-helpers (~> 0.15.0)
padrino-helpers (~> 0.13.0)
parallel
rack (>= 1.4.5, < 3)
sassc (~> 2.0)
servolux
tilt (~> 2.0.9)
toml
uglifier (~> 3.0)
webrick
minitest (5.22.2)
padrino-helpers (0.15.3)
i18n (>= 0.6.7, < 2)
padrino-support (= 0.15.3)
minitest (5.14.3)
padrino-helpers (0.13.3.4)
i18n (~> 0.6, >= 0.6.7)
padrino-support (= 0.13.3.4)
tilt (>= 1.4.1, < 3)
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)
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)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.6)
rexml (3.2.4)
sassc (2.4.0)
ffi (~> 1.9)
servolux (0.13.0)
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)
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)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
webrick (1.8.1)
PLATFORMS
x86_64-linux
DEPENDENCIES
middleman (~> 4.5)
middleman-autoprefixer (~> 3.0)
middleman (~> 4.2)
middleman-autoprefixer (~> 2.7)
tzinfo-data
wdm (~> 0.1)

View File

@@ -1,5 +0,0 @@
{
"engines": {
"node": "18.x"
}
}

View File

@@ -25,9 +25,3 @@ 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,
}: Readonly<{
children: React.ReactNode;
}>) {
}: {
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-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]">
<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]">
<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 text-balance`}>
<p className={`m-0 max-w-[30ch] text-sm opacity-50`}>
Instantly deploy your Next.js site to a shareable URL with Vercel.
</p>
</a>
</div>
</main>
);
)
}

View File

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

View File

@@ -1,4 +0,0 @@
/** @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.1.4"
"next": "14.0.4"
},
"devDependencies": {
"typescript": "^5",
@@ -22,6 +22,6 @@
"postcss": "^8",
"tailwindcss": "^3.3.0",
"eslint": "^8",
"eslint-config-next": "14.1.4"
"eslint-config-next": "14.0.4"
}
}

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,5 +1,6 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,

View File

@@ -9,8 +9,7 @@
},
"devDependencies": {
"@types/jest": "27.4.1",
"@vercel/build-utils": "7.10.0",
"@vercel/frameworks": "3.0.1"
"@vercel/frameworks": "2.0.4"
},
"version": null
}

View File

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

View File

@@ -14,7 +14,7 @@ npx create-remix@latest --template vercel/vercel/examples/remix
_Live Example: https://remix-run-template.vercel.app_
You can also deploy using the [Vercel CLI](https://vercel.com/docs/cli):
You can also deploy using the [Vercel CLI](https://vercel.com/cli):
```sh
npm i -g vercel
@@ -35,4 +35,4 @@ Afterwards, start the Remix development server like so:
npm run dev
```
Open up [http://localhost:5173](http://localhost:5173) and you should be ready to go!
Open up [http://localhost:3000](http://localhost:3000) and you should be ready to go!

View File

@@ -1,13 +1,20 @@
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 function Layout({ children }: { children: React.ReactNode }) {
export const links: LinksFunction = () => [
...(cssBundleHref ? [{ rel: "stylesheet", href: cssBundleHref }] : []),
];
export default function App() {
return (
<html lang="en">
<head>
@@ -17,15 +24,12 @@ export function Layout({ children }: { children: React.ReactNode }) {
<Links />
</head>
<body>
{children}
<Outlet />
<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 vite:build",
"dev": "remix vite:dev",
"build": "remix build",
"dev": "remix dev --manual",
"start": "remix-serve ./build/index.js",
"typecheck": "tsc"
},
"dependencies": {
"@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",
"@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",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@remix-run/dev": "^2.8.0",
"@remix-run/eslint-config": "^2.8.0",
"@remix-run/dev": "^2.0.0",
"@remix-run/eslint-config": "^2.0.0",
"@types/react": "^18.2.20",
"@types/react-dom": "^18.2.7",
"eslint": "^8.38.0",
"typescript": "^5.1.6",
"vite": "^5.1.0",
"vite-tsconfig-paths": "^4.2.1"
"typescript": "^5.1.6"
},
"engines": {
"node": ">=18.0.0"

View File

@@ -1,25 +1,22 @@
{
"include": ["**/*.ts", "**/*.tsx"],
"include": ["remix.env.d.ts", "**/*.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/*"]
},
// Vite takes care of building everything, not tsc.
// Remix takes care of building everything in `remix build`.
"noEmit": true
}
}

View File

@@ -1,11 +0,0 @@
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

@@ -18,7 +18,7 @@ Install dependencies:
npx @sanity/cli install
```
Pull down environment variables from your Vercel project (requires the [Vercel CLI](https://vercel.com/docs/cli)):
Pull down environment variables from your Vercel project (requires the [Vercel CLI](https://vercel.com/cli)):
```sh
vercel env pull

View File

@@ -15,21 +15,21 @@
"devDependencies": {
"@fontsource/fira-mono": "^4.5.10",
"@neoconfetti/svelte": "^1.0.0",
"@playwright/test": "^1.40.1",
"@sveltejs/adapter-vercel": "^3.1.0",
"@sveltejs/kit": "^1.30.3",
"@types/cookie": "^0.5.4",
"eslint": "^8.55.0",
"eslint-config-prettier": "^8.10.0",
"eslint-plugin-svelte": "^2.35.1",
"prettier": "^2.8.8",
"prettier-plugin-svelte": "^2.10.1",
"svelte": "^3.59.2",
"svelte-check": "^3.6.2",
"typescript": "^5.3.3",
"vite": "^4.5.1",
"vitest": "^0.25.8",
"web-vitals": "^3.5.0"
"@playwright/test": "^1.28.1",
"@sveltejs/adapter-vercel": "^3.0.0",
"@sveltejs/kit": "^1.5.0",
"@types/cookie": "^0.5.1",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte": "^2.26.0",
"prettier": "^2.8.0",
"prettier-plugin-svelte": "^2.8.1",
"svelte": "^3.54.0",
"svelte-check": "^3.0.1",
"typescript": "^5.0.0",
"vite": "^4.3.0",
"vitest": "^0.25.3",
"web-vitals": "^3.3.1"
},
"type": "module"
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +0,0 @@
{
"engines": {
"node": "18.x"
}
}

View File

@@ -1,89 +1,5 @@
# @vercel-internals/types
## 1.0.28
### Patch Changes
- Updated dependencies [[`1825b58df`](https://github.com/vercel/vercel/commit/1825b58df8d783e79f0addf262618f422246f4b3)]:
- @vercel/build-utils@7.10.0
## 1.0.27
### Patch Changes
- Updated dependencies [[`11218a179`](https://github.com/vercel/vercel/commit/11218a179870a5420c5a6ff720cd4aec4f7e1c5e)]:
- @vercel/build-utils@7.9.1
## 1.0.26
### Patch Changes
- Updated dependencies [[`8ea93839c`](https://github.com/vercel/vercel/commit/8ea93839ccc70816f3ece9d7cfdb857aa7a4b015)]:
- @vercel/build-utils@7.9.0
## 1.0.25
### Patch Changes
- Updated dependencies [[`908e7837d`](https://github.com/vercel/vercel/commit/908e7837d55bc02e708f402c700e00208415e954), [`5e3656ec1`](https://github.com/vercel/vercel/commit/5e3656ec1b3f0561091636582715ba09ddd8cb2d)]:
- @vercel/build-utils@7.8.0
## 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
- Updated dependencies [[`67fa2f3dd`](https://github.com/vercel/vercel/commit/67fa2f3dd6a6d5a3504b7f9081e56deff7b36eab)]:
- @vercel/build-utils@7.4.1
## 1.0.18
### Patch Changes
- Updated dependencies [[`4d63d9e95`](https://github.com/vercel/vercel/commit/4d63d9e954549d811063d259250d1865b7de2ba1)]:
- @vercel/build-utils@7.4.0
## 1.0.17
### Patch Changes
- Updated dependencies [[`dfe47f6e6`](https://github.com/vercel/vercel/commit/dfe47f6e6c1d395ae24d802f4b7c98e39b9f90f4)]:
- @vercel/build-utils@7.3.0
## 1.0.16
### Patch Changes

View File

@@ -5,12 +5,7 @@ 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'
| 'sensitive';
export type ProjectEnvType = 'plain' | 'secret' | 'encrypted' | 'system';
export type ProjectSettings = import('@vercel/build-utils').ProjectSettings;

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "@vercel-internals/types",
"version": "1.0.28",
"version": "1.0.16",
"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.10.0",
"@vercel/build-utils": "7.2.5",
"@vercel/routing-utils": "3.1.0"
},
"devDependencies": {

View File

@@ -17,7 +17,7 @@
"create-svelte": "2.0.1",
"dot": "1.1.3",
"esbuild": "0.19.2",
"eslint": "8.24.0",
"eslint": "8.14.0",
"eslint-config-prettier": "8.5.0",
"eslint-plugin-jest": "26.1.5",
"execa": "3.2.0",
@@ -29,11 +29,11 @@
"lint-staged": "9.2.5",
"node-fetch": "2.6.7",
"npm-package-arg": "6.1.0",
"prettier": "2.7.0",
"prettier": "2.6.2",
"source-map-support": "0.5.12",
"ts-eager": "2.0.2",
"ts-jest": "29.1.0",
"turbo": "1.13.0",
"turbo": "1.10.16",
"typescript": "4.9.5"
},
"scripts": {

View File

@@ -1,89 +1,5 @@
# @vercel/build-utils
## 7.10.0
### Minor Changes
- Allow environment variables to be specified for `EdgeFunction` ([#11029](https://github.com/vercel/vercel/pull/11029))
## 7.9.1
### Patch Changes
- Export `getSupportedNodeVersion` ([#11277](https://github.com/vercel/vercel/pull/11277))
## 7.9.0
### Minor Changes
- Add `base` parameter to `scanParentDirs()` ([#11261](https://github.com/vercel/vercel/pull/11261))
## 7.8.0
### Minor Changes
- Remove `VERCEL_ENABLE_NPM_DEFAULT` env var check ([#11242](https://github.com/vercel/vercel/pull/11242))
### Patch Changes
- Rename variants to flags and remove legacy flags ([#11121](https://github.com/vercel/vercel/pull/11121))
## 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
- Extend Node v16 discontinue date to 2024-06-15 ([#10967](https://github.com/vercel/vercel/pull/10967))
## 7.4.0
### Minor Changes
- Adds new helper `getPathForPackageManager()` ([#10918](https://github.com/vercel/vercel/pull/10918))
## 7.3.0
### Minor Changes
- [cli] add `--deprecated` option to `vc project ls` command ([#10919](https://github.com/vercel/vercel/pull/10919))
## 7.2.5
### Patch Changes

View File

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

View File

@@ -1,4 +1,4 @@
import type { Env, Files, FunctionFramework } from './types';
import type { Files, FunctionFramework } from './types';
/**
* An Edge Functions output
@@ -8,13 +8,12 @@ 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';
@@ -23,11 +22,6 @@ export class EdgeFunction {
*/
entrypoint: string;
/**
* Environment variables for the edge function to use at runtime.
*/
environment?: Env;
/**
* The list of files to be included in the edge function bundle.
*/
@@ -53,6 +47,5 @@ export class EdgeFunction {
this.assets = params.assets;
this.regions = params.regions;
this.framework = params.framework;
this.environment = params.environment;
}
}

View File

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

View File

@@ -13,7 +13,7 @@ export const NODE_VERSIONS: NodeVersion[] = [
major: 16,
range: '16.x',
runtime: 'nodejs16.x',
discontinueDate: new Date('2024-06-15'),
discontinueDate: new Date('2024-02-06'),
},
{
major: 14,

View File

@@ -276,13 +276,12 @@ export async function getNodeVersion(
export async function scanParentDirs(
destPath: string,
readPackageJson = false,
base = '/'
readPackageJson = false
): Promise<ScanParentDirsResult> {
assert(path.isAbsolute(destPath));
const pkgJsonPath = await walkParentDirs({
base,
base: '/',
start: destPath,
filename: 'package.json',
});
@@ -292,7 +291,7 @@ export async function scanParentDirs(
: undefined;
const [yarnLockPath, npmLockPath, pnpmLockPath, bunLockPath] =
await walkParentDirsMulti({
base,
base: '/',
start: destPath,
filenames: [
'yarn.lock',
@@ -303,7 +302,7 @@ export async function scanParentDirs(
});
let lockfilePath: string | undefined;
let lockfileVersion: number | undefined;
let cliType: CliType;
let cliType: CliType = 'yarn';
const [hasYarnLock, packageLockJson, pnpmLockYaml, bunLockBin] =
await Promise.all([
@@ -339,8 +338,6 @@ export async function scanParentDirs(
lockfilePath = bunLockPath;
// TODO: read "bun-lockfile-format-v0"
lockfileVersion = 0;
} else {
cliType = 'npm';
}
const packageJsonPath = pkgJsonPath || undefined;
@@ -417,14 +414,6 @@ 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) {
@@ -527,10 +516,6 @@ export async function runNpmInstall(
}
}
/**
* Prepares the input environment based on the used package manager and lockfile
* versions.
*/
export function getEnvForPackageManager({
cliType,
lockfileVersion,
@@ -542,90 +527,7 @@ export function getEnvForPackageManager({
nodeVersion: NodeVersion | undefined;
env: { [x: string]: string | undefined };
}) {
const {
detectedLockfile,
detectedPackageManager,
path: newPath,
yarnNodeLinker,
} = getPathForPackageManager({
cliType,
lockfileVersion,
nodeVersion,
env,
});
const newEnv: { [x: string]: string | undefined } = {
...env,
};
if (newPath) {
// Ensure that the binaries of the detected package manager are at the
// beginning of the `$PATH`.
const oldPath = env.PATH + '';
newEnv.PATH = `${newPath}${path.delimiter}${oldPath}`;
}
if (yarnNodeLinker) {
newEnv.YARN_NODE_LINKER = yarnNodeLinker;
}
if (detectedLockfile && detectedPackageManager) {
// For pnpm we also show the version of the lockfile we found
const versionString =
cliType === 'pnpm' ? `version ${lockfileVersion} ` : '';
console.log(
`Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
);
if (cliType === 'bun') {
console.warn(
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions'
);
}
}
return newEnv;
}
/**
* Helper to get the binary paths that link to the used package manager.
* Note: Make sure it doesn't contain any `console.log` calls.
*/
export function getPathForPackageManager({
cliType,
lockfileVersion,
nodeVersion,
env,
}: {
cliType: CliType;
lockfileVersion: number | undefined;
nodeVersion: NodeVersion | undefined;
env: { [x: string]: string | undefined };
}): {
/**
* Which lockfile was detected.
*/
detectedLockfile: string | undefined;
/**
* Detected package manager that generated the found lockfile.
*/
detectedPackageManager: string | undefined;
/**
* Value of $PATH that includes the binaries for the detected package manager.
* Undefined if no $PATH are necessary.
*/
path: string | undefined;
/**
* Set if yarn was identified as package manager and `YARN_NODE_LINKER`
* environment variable was not found on the input environment.
*/
yarnNodeLinker: string | undefined;
} {
let detectedLockfile: string | undefined;
let detectedPackageManager: string | undefined;
let pathValue: string | undefined;
let yarnNodeLinker: string | undefined;
const newEnv: { [x: string]: string | undefined } = { ...env };
const oldPath = env.PATH + '';
const npm7 = '/node16/bin-npm7';
const pnpm7 = '/pnpm7/node_modules/.bin';
@@ -640,10 +542,9 @@ export function getPathForPackageManager({
!oldPath.includes(npm7) &&
!corepackEnabled
) {
// npm 7
pathValue = npm7;
detectedLockfile = 'package-lock.json';
detectedPackageManager = 'npm 7+';
// Ensure that npm 7 is at the beginning of the `$PATH`
newEnv.PATH = `${npm7}${path.delimiter}${oldPath}`;
console.log('Detected `package-lock.json` generated by npm 7+');
}
} else if (cliType === 'pnpm') {
if (
@@ -652,40 +553,39 @@ export function getPathForPackageManager({
!oldPath.includes(pnpm7) &&
!corepackEnabled
) {
// pnpm 7
pathValue = pnpm7;
detectedLockfile = 'pnpm-lock.yaml';
detectedPackageManager = 'pnpm 7';
// Ensure that pnpm 7 is at the beginning of the `$PATH`
newEnv.PATH = `${pnpm7}${path.delimiter}${oldPath}`;
console.log(
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 7`
);
} else if (
typeof lockfileVersion === 'number' &&
lockfileVersion >= 6 &&
!oldPath.includes(pnpm8) &&
!corepackEnabled
) {
// pnpm 8
pathValue = pnpm8;
detectedLockfile = 'pnpm-lock.yaml';
detectedPackageManager = 'pnpm 8';
// Ensure that pnpm 8 is at the beginning of the `$PATH`
newEnv.PATH = `${pnpm8}${path.delimiter}${oldPath}`;
console.log(
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 8`
);
}
} else if (cliType === 'bun') {
if (!oldPath.includes(bun1) && !corepackEnabled) {
// Bun 1
pathValue = bun1;
detectedLockfile = 'bun.lockb';
detectedPackageManager = 'Bun';
// Ensure that Bun 1 is at the beginning of the `$PATH`
newEnv.PATH = `${bun1}${path.delimiter}${oldPath}`;
console.log('Detected `bun.lockb` generated by Bun');
console.warn(
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions'
);
}
} else {
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
if (!env.YARN_NODE_LINKER) {
yarnNodeLinker = 'node-modules';
newEnv.YARN_NODE_LINKER = 'node-modules';
}
}
return {
detectedLockfile,
detectedPackageManager,
path: pathValue,
yarnNodeLinker,
};
return newEnv;
}
export async function runCustomInstallCommand({

View File

@@ -28,7 +28,6 @@ import {
runCustomInstallCommand,
getEnvForPackageManager,
getNodeVersion,
getPathForPackageManager,
getSpawnOptions,
getNodeBinPath,
getNodeBinPaths,
@@ -38,7 +37,6 @@ import {
import {
getLatestNodeVersion,
getDiscontinuedNodeVersions,
getSupportedNodeVersion,
} from './fs/node-version';
import streamToBuffer from './fs/stream-to-buffer';
import debug from './debug';
@@ -73,7 +71,6 @@ export {
walkParentDirs,
getNodeBinPath,
getNodeBinPaths,
getSupportedNodeVersion,
runNpmInstall,
runBundleInstall,
runPipInstall,
@@ -81,7 +78,6 @@ export {
runCustomInstallCommand,
getEnvForPackageManager,
getNodeVersion,
getPathForPackageManager,
getLatestNodeVersion,
getDiscontinuedNodeVersions,
getSpawnOptions,

View File

@@ -5,7 +5,11 @@ import minimatch from 'minimatch';
import { readlink } from 'fs-extra';
import { isSymbolicLink, isDirectory } from './fs/download';
import streamToBuffer from './fs/stream-to-buffer';
import type { Config, Env, Files, FunctionFramework } from './types';
import type { Files, Config, FunctionFramework } from './types';
interface Environment {
[key: string]: string;
}
export type LambdaOptions = LambdaOptionsWithFiles | LambdaOptionsWithZipBuffer;
@@ -17,7 +21,7 @@ export interface LambdaOptionsBase {
architecture?: LambdaArchitecture;
memory?: number;
maxDuration?: number;
environment?: Env;
environment?: Environment;
allowQuery?: string[];
regions?: string[];
supportsMultiPayloads?: boolean;
@@ -33,7 +37,6 @@ export interface LambdaOptionsBase {
export interface LambdaOptionsWithFiles extends LambdaOptionsBase {
files: Files;
experimentalAllowBundling?: boolean;
}
/**
@@ -65,7 +68,7 @@ export class Lambda {
architecture?: LambdaArchitecture;
memory?: number;
maxDuration?: number;
environment: Env;
environment: Environment;
allowQuery?: string[];
regions?: string[];
/**
@@ -76,7 +79,6 @@ export class Lambda {
supportsWrapper?: boolean;
supportsResponseStreaming?: boolean;
framework?: FunctionFramework;
experimentalAllowBundling?: boolean;
constructor(opts: LambdaOptions) {
const {
@@ -112,16 +114,6 @@ 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');
}
@@ -191,10 +183,6 @@ 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: 3009,
maximum: 3008,
},
maxDuration: {
type: 'number',

View File

@@ -196,12 +196,6 @@ export interface StartDevServerSuccess {
* shut down the dev server once an HTTP request has been fulfilled.
*/
pid: number;
/**
* An optional function to shut down the dev server. If not provided, the
* dev server will forcefully be killed.
*/
shutdown?: () => Promise<void>;
}
/**
@@ -440,6 +434,13 @@ export interface Cron {
schedule: string;
}
// TODO: Proper description once complete
export interface Flag {
key: string;
defaultValue?: unknown;
metadata: Record<string, unknown>;
}
/** The framework which created the function */
export interface FunctionFramework {
slug: string;
@@ -464,7 +465,7 @@ export interface BuildResultV2Typical {
framework?: {
version: string;
};
flags?: { definitions: FlagDefinitions };
flags?: Flag[];
}
export type BuildResultV2 = BuildResultV2Typical | BuildResultBuildOutput;
@@ -484,30 +485,3 @@ export type ShouldServe = (
export type StartDevServer = (
options: StartDevServerOptions
) => Promise<StartDevServerResult>;
/**
* TODO: The following types will eventually be exported by a more
* relevant package.
*/
type FlagJSONArray = ReadonlyArray<FlagJSONValue>;
type FlagJSONValue =
| string
| boolean
| number
| null
| FlagJSONArray
| { [key: string]: FlagJSONValue };
type FlagOption = {
value: FlagJSONValue;
label?: string;
};
export interface FlagDefinition {
options?: FlagOption[];
origin?: string;
description?: string;
}
export type FlagDefinitions = Record<string, FlagDefinition>;

View File

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

View File

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

View File

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

View File

@@ -3,8 +3,5 @@
"version": "1.0.0",
"scripts": {
"build": "mkdir -p public && (printf \"npm version: \" && npm -v) > public/index.txt"
},
"engines": {
"node": "16.x"
}
}

View File

@@ -5,8 +5,5 @@
},
"dependencies": {
"once": "^1.4.0"
},
"engines": {
"node": "16.x"
}
}

View File

@@ -6,8 +6,5 @@
"dependencies": {
"exeggcute": "^1.0.0",
"once": "^1.4.0"
},
"engines": {
"node": "16.x"
}
}

View File

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

View File

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

View File

@@ -1,34 +1,13 @@
import assert from 'assert';
import { delimiter } from 'path';
import { getEnvForPackageManager, getPathForPackageManager } from '../src';
import { getEnvForPackageManager } from '../src';
describe('Test `getEnvForPackageManager()`', () => {
let consoleLogSpy: jest.SpyInstance;
let consoleWarnSpy: jest.SpyInstance;
beforeEach(() => {
consoleLogSpy = jest.spyOn(console, 'log');
consoleWarnSpy = jest.spyOn(console, 'warn');
});
afterEach(() => {
jest.restoreAllMocks();
});
test.each<{
const cases: Array<{
name: string;
args: Parameters<typeof getEnvForPackageManager>[0];
want: unknown;
/**
* Expected output on `console.log`. Set to `null` when no output is
* expected.
*/
consoleLogOutput?: string | null;
/**
* Expected output on `console.warn`. Set to `null` when no output is
* expected.
*/
consoleWarnOutput?: string | null;
}>([
}> = [
{
name: 'should do nothing to env for npm < 6 and node < 16',
args: {
@@ -42,8 +21,6 @@ describe('Test `getEnvForPackageManager()`', () => {
want: {
FOO: 'bar',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should set path if npm 7+ is detected and node < 16',
@@ -60,8 +37,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/node16/bin-npm7${delimiter}foo`,
},
consoleLogOutput: 'Detected `package-lock.json` generated by npm 7+',
consoleWarnOutput: null,
},
{
name: 'should not set npm path if corepack enabled',
@@ -78,8 +53,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not prepend npm path again if already detected',
@@ -96,8 +69,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/node16/bin-npm7${delimiter}foo`,
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not set path if node is 16 and npm 7+ is detected',
@@ -114,8 +85,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: 'foo',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should set YARN_NODE_LINKER w/yarn if it is not already defined',
@@ -131,8 +100,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
YARN_NODE_LINKER: 'node-modules',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not set YARN_NODE_LINKER if it already exists',
@@ -149,8 +116,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
YARN_NODE_LINKER: 'exists',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should set path if pnpm 7+ is detected',
@@ -167,9 +132,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
},
consoleLogOutput:
'Detected `pnpm-lock.yaml` version 5.4 generated by pnpm 7',
consoleWarnOutput: null,
},
{
name: 'should set path if bun v1 is detected',
@@ -186,9 +148,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/bun1${delimiter}/usr/local/bin`,
},
consoleLogOutput: 'Detected `bun.lockb` generated by Bun',
consoleWarnOutput:
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions',
},
{
name: 'should not set pnpm path if corepack is enabled',
@@ -205,8 +164,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not prepend pnpm path again if already detected',
@@ -223,8 +180,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not set path if pnpm 6 is detected',
@@ -239,262 +194,20 @@ describe('Test `getEnvForPackageManager()`', () => {
want: {
FOO: 'bar',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
])('$name', ({ args, want, consoleLogOutput, consoleWarnOutput }) => {
expect(
getEnvForPackageManager({
cliType: args.cliType,
lockfileVersion: args.lockfileVersion,
nodeVersion: args.nodeVersion,
env: args.env,
})
).toStrictEqual(want);
];
// Check console.log output
if (typeof consoleLogOutput === 'string') {
expect(consoleLogSpy).toHaveBeenCalledWith(consoleLogOutput);
} else if (consoleLogOutput === null) {
expect(consoleLogSpy).not.toHaveBeenCalled();
}
// Check console.warn output
if (typeof consoleWarnOutput === 'string') {
expect(consoleWarnSpy).toHaveBeenCalledWith(consoleWarnOutput);
} else if (consoleLogOutput === null) {
expect(consoleWarnSpy).not.toHaveBeenCalled();
}
});
});
describe('Test `getPathForPackageManager()`', () => {
test.each<{
name: string;
args: Parameters<typeof getEnvForPackageManager>[0];
want: unknown;
}>([
{
name: 'should do nothing to env for npm < 6 and node < 16',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 1,
env: {
FOO: 'bar',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should set path if npm 7+ is detected and node < 16',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
PATH: 'foo',
},
},
want: {
detectedLockfile: 'package-lock.json',
detectedPackageManager: 'npm 7+',
path: '/node16/bin-npm7',
yarnNodeLinker: undefined,
},
},
{
name: 'should not set npm path if corepack enabled',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not prepend npm path again if already detected',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
PATH: `/node16/bin-npm7${delimiter}foo`,
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not set path if node is 16 and npm 7+ is detected',
args: {
cliType: 'npm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
PATH: 'foo',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should set YARN_NODE_LINKER w/yarn if it is not already defined',
args: {
cliType: 'yarn',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: 'node-modules',
},
},
{
name: 'should not set YARN_NODE_LINKER if it already exists',
args: {
cliType: 'yarn',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
YARN_NODE_LINKER: 'exists',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should set path if pnpm 7+ is detected',
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 5.4,
env: {
FOO: 'bar',
PATH: 'foo',
},
},
want: {
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 7',
path: '/pnpm7/node_modules/.bin',
yarnNodeLinker: undefined,
},
},
{
name: 'should set path if bun v1 is detected',
args: {
cliType: 'bun',
nodeVersion: { major: 18, range: '18.x', runtime: 'nodejs18.x' },
lockfileVersion: 0,
env: {
FOO: 'bar',
PATH: '/usr/local/bin',
},
},
want: {
detectedLockfile: 'bun.lockb',
detectedPackageManager: 'Bun',
path: '/bun1',
yarnNodeLinker: undefined,
},
},
{
name: 'should not set pnpm path if corepack is enabled',
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 5.4,
env: {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not prepend pnpm path again if already detected',
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 5.4,
env: {
FOO: 'bar',
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not set path if pnpm 6 is detected',
args: {
cliType: 'pnpm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 5.3,
env: {
FOO: 'bar',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
])('$name', ({ args, want }) => {
expect(
getPathForPackageManager({
cliType: args.cliType,
lockfileVersion: args.lockfileVersion,
nodeVersion: args.nodeVersion,
env: args.env,
})
).toStrictEqual(want);
});
for (const { name, want, args } of cases) {
it(name, () => {
assert.deepStrictEqual(
getEnvForPackageManager({
cliType: args.cliType,
lockfileVersion: args.lockfileVersion,
nodeVersion: args.nodeVersion,
env: args.env,
}),
want
);
});
}
});

View File

@@ -268,85 +268,81 @@ it('should get latest node version with Node 20.x in build-container', async ()
});
it('should throw for discontinued versions', async () => {
// Mock a future date so that Node 16 becomes discontinued
const realDateNow = Date.now;
try {
global.Date.now = () => new Date('2024-07-16').getTime();
// Mock a future date so that Node 8 and 10 become discontinued
const realDateNow = Date.now.bind(global.Date);
global.Date.now = () => new Date('2024-02-13').getTime();
expect(getSupportedNodeVersion('8.10.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('8.10.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('10.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('10.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('12.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('12.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('14.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('14.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('16.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('16.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('8.10.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('8.10.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('10.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('10.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('12.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('12.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('14.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('14.x', true)).rejects.toThrow();
expect(getSupportedNodeVersion('16.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('16.x', true)).rejects.toThrow();
const discontinued = getDiscontinuedNodeVersions();
expect(discontinued.length).toBe(5);
expect(discontinued[0]).toHaveProperty('range', '16.x');
expect(discontinued[1]).toHaveProperty('range', '14.x');
expect(discontinued[2]).toHaveProperty('range', '12.x');
expect(discontinued[3]).toHaveProperty('range', '10.x');
expect(discontinued[4]).toHaveProperty('range', '8.10.x');
} finally {
global.Date.now = realDateNow;
}
const discontinued = getDiscontinuedNodeVersions();
expect(discontinued.length).toBe(5);
expect(discontinued[0]).toHaveProperty('range', '16.x');
expect(discontinued[1]).toHaveProperty('range', '14.x');
expect(discontinued[2]).toHaveProperty('range', '12.x');
expect(discontinued[3]).toHaveProperty('range', '10.x');
expect(discontinued[4]).toHaveProperty('range', '8.10.x');
global.Date.now = realDateNow;
});
it('should warn for deprecated versions, soon to be discontinued', async () => {
// Mock a future date so that Node 16 warns
const realDateNow = Date.now;
try {
global.Date.now = () => new Date('2021-02-23').getTime();
// Mock a future date so that Node 10 warns
const realDateNow = Date.now.bind(global.Date);
global.Date.now = () => new Date('2021-02-23').getTime();
expect(await getSupportedNodeVersion('10.x', false)).toHaveProperty(
'major',
10
);
expect(await getSupportedNodeVersion('10.x', true)).toHaveProperty(
'major',
10
);
expect(await getSupportedNodeVersion('12.x', false)).toHaveProperty(
'major',
12
);
expect(await getSupportedNodeVersion('12.x', true)).toHaveProperty(
'major',
12
);
expect(await getSupportedNodeVersion('14.x', false)).toHaveProperty(
'major',
14
);
expect(await getSupportedNodeVersion('14.x', true)).toHaveProperty(
'major',
14
);
expect(await getSupportedNodeVersion('16.x', false)).toHaveProperty(
'major',
16
);
expect(await getSupportedNodeVersion('16.x', true)).toHaveProperty(
'major',
16
);
expect(warningMessages).toStrictEqual([
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-06-15 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-06-15 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
]);
} finally {
global.Date.now = realDateNow;
}
expect(await getSupportedNodeVersion('10.x', false)).toHaveProperty(
'major',
10
);
expect(await getSupportedNodeVersion('10.x', true)).toHaveProperty(
'major',
10
);
expect(await getSupportedNodeVersion('12.x', false)).toHaveProperty(
'major',
12
);
expect(await getSupportedNodeVersion('12.x', true)).toHaveProperty(
'major',
12
);
expect(await getSupportedNodeVersion('14.x', false)).toHaveProperty(
'major',
14
);
expect(await getSupportedNodeVersion('14.x', true)).toHaveProperty(
'major',
14
);
expect(await getSupportedNodeVersion('16.x', false)).toHaveProperty(
'major',
16
);
expect(await getSupportedNodeVersion('16.x', true)).toHaveProperty(
'major',
16
);
expect(warningMessages).toStrictEqual([
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-02-06 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-02-06 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
]);
global.Date.now = realDateNow;
});
it('should support initialHeaders and initialStatus correctly', async () => {
@@ -576,28 +572,6 @@ it(
ms('1m')
);
it('should return cliType "npm" when no lockfile is present', 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('npm');
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,259 +1,5 @@
# vercel
## 33.6.2
### Patch Changes
- Added sunset warning to secrets command. ([#11333](https://github.com/vercel/vercel/pull/11333))
- Swap jest for vitest in CLI unit tests ([#11302](https://github.com/vercel/vercel/pull/11302))
- Updated dependencies [[`988f7b75a`](https://github.com/vercel/vercel/commit/988f7b75a27387e84fce541b844f984d2c151980), [`1825b58df`](https://github.com/vercel/vercel/commit/1825b58df8d783e79f0addf262618f422246f4b3)]:
- @vercel/remix-builder@2.1.5
- @vercel/build-utils@7.10.0
- @vercel/node@3.0.25
- @vercel/static-build@2.4.5
## 33.6.1
### Patch Changes
- Don't send `projectSettings.nodeVersion` for unsupported versions ([#11277](https://github.com/vercel/vercel/pull/11277))
- Updated dependencies [[`4bca0c6d0`](https://github.com/vercel/vercel/commit/4bca0c6d0bc25052b95bd02b12a0b891c86c4b49), [`a67ad4b5a`](https://github.com/vercel/vercel/commit/a67ad4b5a130bf0e56e18111b3f9ddad69cec0e1), [`11218a179`](https://github.com/vercel/vercel/commit/11218a179870a5420c5a6ff720cd4aec4f7e1c5e), [`64b97bf4b`](https://github.com/vercel/vercel/commit/64b97bf4b5203ecf9a95f63ce26a5c3360208966)]:
- @vercel/next@4.1.6
- @vercel/remix-builder@2.1.4
- @vercel/build-utils@7.9.1
- @vercel/static-build@2.4.4
- @vercel/node@3.0.24
## 33.6.0
### Minor Changes
- Set `projectSettings.nodeVersion` in `vc deploy` based on "engines.node" field ([#11261](https://github.com/vercel/vercel/pull/11261))
### Patch Changes
- Stops warning about legacy Speed Insights for Next.js apps ([#11268](https://github.com/vercel/vercel/pull/11268))
- Fix framework version detection in monorepos ([#11212](https://github.com/vercel/vercel/pull/11212))
- Updated dependencies [[`8ea93839c`](https://github.com/vercel/vercel/commit/8ea93839ccc70816f3ece9d7cfdb857aa7a4b015), [`58ef91bfe`](https://github.com/vercel/vercel/commit/58ef91bfe8c2e7176e8783cc4eb91ee8580c70dc)]:
- @vercel/build-utils@7.9.0
- @vercel/remix-builder@2.1.3
- @vercel/node@3.0.23
- @vercel/static-build@2.4.3
## 33.5.5
### Patch Changes
- Rename variants to flags and remove legacy flags ([#11121](https://github.com/vercel/vercel/pull/11121))
- fix vc with root dir issues ([#11243](https://github.com/vercel/vercel/pull/11243))
- Updated dependencies [[`908e7837d`](https://github.com/vercel/vercel/commit/908e7837d55bc02e708f402c700e00208415e954), [`5e3656ec1`](https://github.com/vercel/vercel/commit/5e3656ec1b3f0561091636582715ba09ddd8cb2d), [`a53d1b0d3`](https://github.com/vercel/vercel/commit/a53d1b0d38efa9637f8b8f81a70898add87530e3)]:
- @vercel/build-utils@7.8.0
- @vercel/next@4.1.5
- @vercel/remix-builder@2.1.2
- @vercel/node@3.0.22
- @vercel/static-build@2.4.2
## 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
- Log extension execution failures ([#10937](https://github.com/vercel/vercel/pull/10937))
- Updated dependencies [[`fbe08fe57`](https://github.com/vercel/vercel/commit/fbe08fe57eededc0bcd2409692b23d185c70069d), [`77585013d`](https://github.com/vercel/vercel/commit/77585013dec5fc406b8b7ea00918e49fdb8f10ec), [`c536a74bc`](https://github.com/vercel/vercel/commit/c536a74bc9e7188a87b292615fa88d6fc506b105), [`91f8763ed`](https://github.com/vercel/vercel/commit/91f8763edce672a3c05b6096db6084f1e6741384), [`7f8f5f865`](https://github.com/vercel/vercel/commit/7f8f5f86516934acb0c4b936ea601433c8d30c5c)]:
- @vercel/next@4.0.17
- @vercel/go@3.0.5
- @vercel/node@3.0.15
- @vercel/redwood@2.0.6
- @vercel/remix-builder@2.0.16
## 33.0.1
### Patch Changes
- Updated dependencies [[`67fa2f3dd`](https://github.com/vercel/vercel/commit/67fa2f3dd6a6d5a3504b7f9081e56deff7b36eab), [`7b0adf371`](https://github.com/vercel/vercel/commit/7b0adf371bae64d33ed0a1b966fc50b1f7c9639b)]:
- @vercel/build-utils@7.4.1
- @vercel/next@4.0.16
- @vercel/static-build@2.0.16
- @vercel/node@3.0.14
## 33.0.0
### Major Changes
- [cli] replace `--deprecated` with `--update-required` in `vc project ls` ([#10965](https://github.com/vercel/vercel/pull/10965))
### Patch Changes
- Fix `vercel bisect` selecting too many deployments ([#10956](https://github.com/vercel/vercel/pull/10956))
- Updated dependencies [[`6a9002f22`](https://github.com/vercel/vercel/commit/6a9002f2296c5ccce4522c0fa9a8938c3d7a4849), [`4d63d9e95`](https://github.com/vercel/vercel/commit/4d63d9e954549d811063d259250d1865b7de2ba1)]:
- @vercel/remix-builder@2.0.15
- @vercel/build-utils@7.4.0
- @vercel/static-build@2.0.15
- @vercel/node@3.0.13
## 32.7.2
### Patch Changes
- [cli] Use new `deprecated` query param in projects api for `vc project ls --deprecated` ([#10938](https://github.com/vercel/vercel/pull/10938))
## 32.7.1
### Patch Changes
- [cli] double page limit for vc project ls --deprecated ([#10932](https://github.com/vercel/vercel/pull/10932))
- Updated dependencies [[`d09dd1794`](https://github.com/vercel/vercel/commit/d09dd1794b5ffa28c15d3ad2880b90db2f4c06f0)]:
- @vercel/remix-builder@2.0.14
## 32.7.0
### Minor Changes
- [cli] add `--deprecated` option to `vc project ls` command ([#10919](https://github.com/vercel/vercel/pull/10919))
### Patch Changes
- Remove some debug statements and make log into warning ([#10926](https://github.com/vercel/vercel/pull/10926))
- Updated dependencies [[`3cede43ca`](https://github.com/vercel/vercel/commit/3cede43ca7ea3aec3ff33864b7d33da57891ddb2), [`dfe47f6e6`](https://github.com/vercel/vercel/commit/dfe47f6e6c1d395ae24d802f4b7c98e39b9f90f4), [`1dbb22bb6`](https://github.com/vercel/vercel/commit/1dbb22bb6d33657faa78376f527fe350188c5257), [`204c3592c`](https://github.com/vercel/vercel/commit/204c3592c78fc544e62f0210b0e7e1e4cd382a0c)]:
- @vercel/ruby@2.0.4
- @vercel/build-utils@7.3.0
- @vercel/remix-builder@2.0.13
- @vercel/node@3.0.12
- @vercel/static-build@2.0.14
## 32.6.1
### Patch Changes

View File

@@ -7,7 +7,6 @@ module.exports = {
{
diagnostics: true,
isolatedModules: true,
tsconfig: 'test/tsconfig.json',
},
],
},

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "33.6.2",
"version": "32.6.1",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -12,7 +12,7 @@
},
"scripts": {
"test": "jest --reporters=default --reporters=jest-junit --env node --verbose --bail",
"test-unit": "pnpm vitest test/unit/",
"test-unit": "pnpm test test/unit/",
"test-e2e": "rimraf test/fixtures/integration && pnpm test test/integration-1.test.ts test/integration-2.test.ts test/integration-3.test.ts",
"test-dev": "pnpm test test/dev/",
"coverage": "codecov",
@@ -31,22 +31,22 @@
"node": ">= 16"
},
"dependencies": {
"@vercel/build-utils": "7.10.0",
"@vercel/build-utils": "7.2.5",
"@vercel/fun": "1.1.0",
"@vercel/go": "3.0.5",
"@vercel/hydrogen": "1.0.2",
"@vercel/next": "4.1.6",
"@vercel/node": "3.0.25",
"@vercel/python": "4.1.1",
"@vercel/redwood": "2.0.8",
"@vercel/remix-builder": "2.1.5",
"@vercel/ruby": "2.0.5",
"@vercel/static-build": "2.4.5",
"@vercel/go": "3.0.4",
"@vercel/hydrogen": "1.0.1",
"@vercel/next": "4.0.15",
"@vercel/node": "3.0.11",
"@vercel/python": "4.1.0",
"@vercel/redwood": "2.0.5",
"@vercel/remix-builder": "2.0.12",
"@vercel/ruby": "2.0.3",
"@vercel/static-build": "2.0.13",
"chokidar": "3.3.1"
},
"devDependencies": {
"@alex_neo/jest-expect-message": "1.0.5",
"@edge-runtime/node-utils": "2.3.0",
"@edge-runtime/node-utils": "2.2.2",
"@next/env": "11.1.2",
"@sentry/node": "5.5.0",
"@sindresorhus/slugify": "0.11.0",
@@ -88,13 +88,12 @@
"@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.28",
"@vercel/client": "13.1.8",
"@vercel-internals/types": "1.0.16",
"@vercel/client": "13.0.9",
"@vercel/error-utils": "2.0.2",
"@vercel/frameworks": "3.0.1",
"@vercel/fs-detectors": "5.2.2",
"@vercel/frameworks": "2.0.4",
"@vercel/fs-detectors": "5.1.4",
"@vercel/routing-utils": "3.1.0",
"@vitest/expect": "1.4.0",
"ajv": "6.12.2",
"alpha-sort": "2.0.1",
"ansi-escapes": "4.3.2",
@@ -166,8 +165,6 @@
"ts-node": "10.9.1",
"universal-analytics": "0.4.20",
"utility-types": "2.1.0",
"vite": "5.1.6",
"vitest": "1.3.1",
"which": "3.0.0",
"write-json-file": "2.2.0",
"xdg-app-paths": "5.1.0",

View File

@@ -188,18 +188,15 @@ export default async function bisect(client: Client): Promise<number> {
let newDeployments = chunk.deployments;
// If we have the "good" deployment in this chunk, then we're done
let hasGood = false;
for (let i = 0; i < newDeployments.length; i++) {
if (newDeployments[i].url === good) {
// grab all deployments up until the good one
newDeployments = newDeployments.slice(0, i);
hasGood = true;
break;
}
}
deployments = deployments.concat(newDeployments);
if (hasGood) break;
}
if (!deployments.length) {

View File

@@ -1,10 +1,10 @@
import fs, { readJSON } from 'fs-extra';
import fs from 'fs-extra';
import chalk from 'chalk';
import dotenv from 'dotenv';
import semver from 'semver';
import minimatch from 'minimatch';
import { join, normalize, relative, resolve, sep } from 'path';
import { frameworkList } from '@vercel/frameworks';
import frameworks from '@vercel/frameworks';
import {
getDiscontinuedNodeVersions,
normalizePath,
@@ -21,7 +21,7 @@ import {
NowBuildError,
Cron,
validateNpmrc,
type FlagDefinitions,
Flag,
} from '@vercel/build-utils';
import {
detectBuilders,
@@ -71,7 +71,6 @@ 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;
@@ -95,6 +94,7 @@ interface BuildOutputConfig {
version: string;
};
crons?: Cron[];
flags?: Flag[];
}
/**
@@ -432,6 +432,29 @@ 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 => {
@@ -451,9 +474,10 @@ async function doBuild(
];
})
);
buildsJson.builds = Array.from(buildsJsonBuilds.values());
await writeBuildJson(buildsJson, outputDir);
await fs.writeJSON(join(outputDir, 'builds.json'), buildsJson, {
spaces: 2,
});
// The `meta` config property is re-used for each Builder
// invocation so that Builders can share state between
@@ -549,7 +573,6 @@ async function doBuild(
// Start flushing the file outputs to the filesystem asynchronously
ops.push(
writeBuildResult(
repoRootPath,
outputDir,
buildResult,
build,
@@ -585,33 +608,6 @@ 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);
@@ -660,8 +656,9 @@ async function doBuild(
const mergedWildcard = mergeWildcard(buildResults.values());
const mergedOverrides: Record<string, PathOverride> =
overrides.length > 0 ? Object.assign({}, ...overrides) : undefined;
const mergedFlags = mergeFlags(buildResults.values());
const framework = await getFramework(workPath, buildResults);
const framework = await getFramework(cwd, buildResults);
// Write out the final `config.json` file based on the
// user configuration and Builder build results
@@ -673,11 +670,10 @@ async function doBuild(
overrides: mergedOverrides,
framework,
crons: mergedCrons,
flags: mergedFlags,
};
await fs.writeJSON(join(outputDir, 'config.json'), config, { spaces: 2 });
await writeFlagsJSON(client, buildResults.values(), outputDir);
const relOutputDir = relative(cwd, outputDir);
output.print(
`${prependEmoji(
@@ -695,7 +691,7 @@ async function getFramework(
): Promise<{ version: string } | undefined> {
const detectedFramework = await detectFrameworkRecord({
fs: new LocalFileSystemDetector(cwd),
frameworkList,
frameworkList: frameworks,
});
if (!detectedFramework) {
@@ -810,72 +806,21 @@ function mergeWildcard(
return wildcard;
}
/**
* Takes the build output and writes all the flags into the `flags.json`
* file. It'll skip flags that already exist.
*/
async function writeFlagsJSON(
{ output }: Client,
buildResults: Iterable<BuildResult | BuildOutputConfig>,
outputDir: string
): Promise<void> {
const flagsFilePath = join(outputDir, 'flags.json');
let hasFlags = true;
const flags = (await fs.readJSON(flagsFilePath).catch(error => {
if (error.code === 'ENOENT') {
hasFlags = false;
return { definitions: {} };
function mergeFlags(
buildResults: Iterable<BuildResult | BuildOutputConfig>
): BuildResultV2Typical['flags'] {
return Array.from(buildResults).flatMap(result => {
if ('flags' in result) {
return result.flags ?? [];
}
throw error;
})) as { definitions: FlagDefinitions };
for (const result of buildResults) {
if (!('flags' in result) || !result.flags || !result.flags.definitions)
continue;
for (const [key, definition] of Object.entries(result.flags.definitions)) {
if (result.flags.definitions[key]) {
output.warn(
`The flag "${key}" was found multiple times. Only its first occurrence will be considered.`
);
continue;
}
hasFlags = true;
flags.definitions[key] = definition;
}
}
// Only create the file when there are flags to write,
// or when the file already exists.
// Checking `definitions` alone won't be enough in case there
// are other properties set.
if (hasFlags) {
await fs.writeJSON(flagsFilePath, flags, { spaces: 2 });
}
return [];
});
}
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;
function makeDepencyMap(pkg: PackageJson | null): Map<string, string> {
return new Map([
...Object.entries(pkg?.devDependencies ?? {}),
...Object.entries(pkg?.dependencies ?? {}),
]);
}

View File

@@ -112,8 +112,7 @@ export const deployCommand: Command = {
shorthand: null,
type: 'boolean',
deprecated: false,
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',
description: undefined,
multi: false,
},
{

View File

@@ -1,78 +1,73 @@
import {
getPrettyError,
getSupportedNodeVersion,
scanParentDirs,
} from '@vercel/build-utils';
import { isZeroConfigBuild } from '../../util/is-zero-config-build';
import ms from 'ms';
import fs from 'fs-extra';
import bytes from 'bytes';
import chalk from 'chalk';
import { join, resolve } from 'path';
import {
fileNameSymbol,
VALID_ARCHIVE_FORMATS,
VercelConfig,
} from '@vercel/client';
import { errorToString, isErrnoException, isError } from '@vercel/error-utils';
import bytes from 'bytes';
import chalk from 'chalk';
import fs from 'fs-extra';
import ms from 'ms';
import { join, resolve } from 'path';
import Now, { CreateOptions } from '../../util';
import Client from '../../util/client';
import code from '../../util/output/code';
import highlight from '../../util/output/highlight';
import { readLocalConfig } from '../../util/config/files';
import { createGitMeta } from '../../util/create-git-meta';
import createDeploy from '../../util/deploy/create-deploy';
import { getDeploymentChecks } from '../../util/deploy/get-deployment-checks';
import getPrebuiltJson from '../../util/deploy/get-prebuilt-json';
import parseTarget from '../../util/deploy/parse-target';
import { printDeploymentStatus } from '../../util/deploy/print-deployment-status';
import { isValidArchive } from '../../util/deploy/validate-archive-format';
import purchaseDomainIfAvailable from '../../util/domains/purchase-domain-if-available';
import { emoji, prependEmoji } from '../../util/emoji';
import getArgs from '../../util/get-args';
import { handleError } from '../../util/error';
import { SchemaValidationFailed } from '../../util/errors';
import Client from '../../util/client';
import { getPrettyError } from '@vercel/build-utils';
import toHumanPath from '../../util/humanize-path';
import Now, { CreateOptions } from '../../util';
import stamp from '../../util/output/stamp';
import createDeploy from '../../util/deploy/create-deploy';
import getDeployment from '../../util/get-deployment';
import parseMeta from '../../util/parse-meta';
import param from '../../util/output/param';
import {
AliasDomainConfigured,
BuildError,
BuildsRateLimited,
ConflictingFilePath,
ConflictingPathSegment,
DeploymentNotFound,
DeploymentsRateLimited,
DomainNotFound,
DomainNotVerified,
DomainPermissionDenied,
DomainVerificationFailed,
InvalidDomain,
isAPIError,
MissingBuildScript,
NotDomainOwner,
TooManyRequests,
UserAborted,
DeploymentsRateLimited,
AliasDomainConfigured,
MissingBuildScript,
ConflictingFilePath,
ConflictingPathSegment,
BuildError,
NotDomainOwner,
isAPIError,
} from '../../util/errors-ts';
import getArgs from '../../util/get-args';
import getDeployment from '../../util/get-deployment';
import getProjectName from '../../util/get-project-name';
import toHumanPath from '../../util/humanize-path';
import { SchemaValidationFailed } from '../../util/errors';
import purchaseDomainIfAvailable from '../../util/domains/purchase-domain-if-available';
import confirm from '../../util/input/confirm';
import editProjectSettings from '../../util/input/edit-project-settings';
import inputProject from '../../util/input/input-project';
import { inputRootDirectory } from '../../util/input/input-root-directory';
import selectOrg from '../../util/input/select-org';
import { Output } from '../../util/output';
import code from '../../util/output/code';
import highlight from '../../util/output/highlight';
import param from '../../util/output/param';
import stamp from '../../util/output/stamp';
import { parseEnv } from '../../util/parse-env';
import parseMeta from '../../util/parse-meta';
import { getCommandName } from '../../util/pkg-name';
import {
getLinkedProject,
linkFolderToProject,
} from '../../util/projects/link';
import { pickOverrides } from '../../util/projects/project-settings';
import getProjectName from '../../util/get-project-name';
import selectOrg from '../../util/input/select-org';
import inputProject from '../../util/input/input-project';
import { prependEmoji, emoji } from '../../util/emoji';
import { inputRootDirectory } from '../../util/input/input-root-directory';
import validatePaths, {
validateRootDirectory,
} from '../../util/validate-paths';
import { getCommandName } from '../../util/pkg-name';
import { Output } from '../../util/output';
import { getDeploymentChecks } from '../../util/deploy/get-deployment-checks';
import parseTarget from '../../util/deploy/parse-target';
import getPrebuiltJson from '../../util/deploy/get-prebuilt-json';
import { createGitMeta } from '../../util/create-git-meta';
import { isValidArchive } from '../../util/deploy/validate-archive-format';
import { parseEnv } from '../../util/parse-env';
import { errorToString, isErrnoException, isError } from '@vercel/error-utils';
import { pickOverrides } from '../../util/projects/project-settings';
import { printDeploymentStatus } from '../../util/deploy/print-deployment-status';
import { help } from '../help';
import { deployCommand } from './command';
@@ -518,23 +513,6 @@ export default async (client: Client): Promise<number> => {
);
}
const { packageJson } = await scanParentDirs(
join(cwd, project?.rootDirectory ?? ''),
true,
cwd
);
let nodeVersion: string | undefined;
if (packageJson?.engines?.node) {
try {
const { range } = await getSupportedNodeVersion(packageJson.engines.node);
nodeVersion = range;
} catch (error) {
if (error instanceof Error) {
output.warn(error.message);
}
}
}
try {
// if this flag is not set, use `undefined` to allow the project setting to be used
const autoAssignCustomDomains = argv['--skip-domain'] ? false : undefined;
@@ -565,20 +543,14 @@ export default async (client: Client): Promise<number> => {
autoAssignCustomDomains,
};
if (isZeroConfigBuild(localConfig.builds)) {
if (!localConfig.builds || localConfig.builds.length === 0) {
// Only add projectSettings for zero config deployments
createArgs.projectSettings = {
sourceFilesOutsideRootDirectory,
rootDirectory,
nodeVersion,
};
if (status !== 'not_linked') {
createArgs.projectSettings = {
...createArgs.projectSettings,
...localConfigurationOverrides,
};
}
createArgs.projectSettings =
status === 'not_linked'
? {
sourceFilesOutsideRootDirectory,
}
: { ...localConfigurationOverrides, sourceFilesOutsideRootDirectory };
}
deployment = await createDeploy(

View File

@@ -19,7 +19,6 @@ import { isAPIError } from '../../util/errors-ts';
type Options = {
'--debug': boolean;
'--sensitive': boolean;
};
export default async function add(
@@ -30,7 +29,7 @@ export default async function add(
output: Output
) {
// improve the way we show inquirer prompts
await import('../../util/input/patch-inquirer');
require('../../util/input/patch-inquirer');
const stdInput = await readStandardInput(client.stdin);
let [envName, envTargetArg, envGitBranch] = args;
@@ -145,8 +144,6 @@ export default async function add(
envGitBranch = inputValue || '';
}
const type = opts['--sensitive'] ? 'sensitive' : 'encrypted';
const addStamp = stamp();
try {
output.spinner('Saving');
@@ -154,7 +151,7 @@ export default async function add(
output,
client,
project.id,
type,
'encrypted',
envName,
envValue,
envTargets,

View File

@@ -34,16 +34,7 @@ export const envCommand: Command = {
required: false,
},
],
options: [
{
name: 'sensitive',
description: 'Add a sensitive Environment Variable',
shorthand: null,
type: 'string',
deprecated: false,
multi: false,
},
],
options: [],
examples: [],
},
{
@@ -126,10 +117,6 @@ 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,7 +34,6 @@ export default async function main(client: Client) {
'-y': '--yes',
'--environment': String,
'--git-branch': String,
'--sensitive': Boolean,
});
} catch (error) {
handleError(error);

View File

@@ -30,7 +30,7 @@ export default async function rm(
output: Output
) {
// improve the way we show inquirer prompts
await import('../../util/input/patch-inquirer');
require('../../util/input/patch-inquirer');
if (args.length > 3) {
output.error(

View File

@@ -17,9 +17,9 @@ export const projectCommand: Command = {
arguments: [],
options: [
{
name: 'update-required',
description: 'A list of projects affected by an upcoming deprecation',
argument: 'update-required',
name: 'deprecated',
description: 'A list of projects affected by a deprecation',
argument: 'deprecated',
shorthand: null,
type: 'boolean',
deprecated: false,

View File

@@ -23,7 +23,7 @@ export default async function main(client: Client) {
argv = getArgs(client.argv.slice(2), {
'--next': Number,
'-N': '--next',
'--update-required': Boolean,
'--deprecated': Boolean,
});
} catch (error) {
handleError(error);

View File

@@ -28,18 +28,15 @@ export default async function list(
output.spinner(`Fetching projects in ${chalk.bold(contextName)}`);
let projectsUrl = `/v4/projects/?limit=20`;
const deprecated = argv['--update-required'] || false;
if (deprecated) {
projectsUrl += `&deprecated=${deprecated}`;
}
let projectsUrl = '/v4/projects/?limit=20';
const next = argv['--next'] || false;
if (next) {
projectsUrl += `&until=${next}`;
}
const deprecated = argv['--deprecated'] || false;
let {
projects: projectList,
pagination,
@@ -55,21 +52,24 @@ export default async function list(
const elapsed = ms(Date.now() - start);
if (deprecated) {
const upcomingDeprecationVersionsList = [];
for (const nodeVersion of NODE_VERSIONS) {
if (
const upcomingDeprecationVersions = NODE_VERSIONS.filter(
nodeVersion =>
nodeVersion.discontinueDate &&
nodeVersion.discontinueDate.valueOf() > Date.now()
) {
upcomingDeprecationVersionsList.push(nodeVersion.range);
}
}
);
const upcomingDeprecationVersionsList = upcomingDeprecationVersions.map(
nodeVersion => nodeVersion.range
);
projectList = projectList.filter(
project =>
project.nodeVersion &&
upcomingDeprecationVersionsList.includes(project.nodeVersion)
);
output.warn(
`The following Node.js versions will be deprecated soon: ${upcomingDeprecationVersionsList.join(
', '
)}. Please upgrade your projects immediately.`
)}. Upgrade your projects immediately.`
);
output.log(
`For more information visit: https://vercel.com/docs/functions/serverless-functions/runtimes/node-js#node.js-version`

View File

@@ -2,14 +2,9 @@ import { packageName, getCommandName } from '../../util/pkg-name';
export const secretsCommand = {
name: 'secrets',
description:
'WARNING: On May 1st, 2024 secrets will be automatically converted to sensitive Environment Variables for Preview and Production environments. Secrets attached to Development environments will not be migrated.\n' +
`The ${getCommandName(
'secrets'
)} command will be deprecated at this time, please use the ${getCommandName(
'env'
)} command instead.\n` +
'See https://vercel.com/changelog/legacy-environment-variable-secrets-are-being-sunset for more information.',
description: `NOTE: The ${getCommandName(
'env'
)} command is recommended instead of ${getCommandName('secrets')}`,
arguments: [
{
name: 'command',

View File

@@ -78,12 +78,6 @@ async function run({ output, contextName, currentTeam, client }) {
const commandName = getCommandName('secret ' + subcommand);
output.warn(
'On May 1st, 2024 secrets will be automatically converted to sensitive Environment Variables for Preview and Production environments.\n' +
'Secrets attached to Development environments will not be migrated.' +
'See https://vercel.com/changelog/legacy-environment-variable-secrets-are-being-sunset for more information.'
);
if (subcommand === 'ls' || subcommand === 'list') {
output.note(
`The ${getCommandName(

View File

@@ -465,15 +465,6 @@ 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

@@ -1,10 +1,11 @@
import { frameworkList } from '@vercel/frameworks';
import frameworkList from '@vercel/frameworks';
export function sortBuilders<B extends { use: string }>(builds: B[]): B[] {
const frontendRuntimeSet = new Set(
frameworkList.map(f => f.useRuntime?.use || '@vercel/static-build')
);
const toNumber = (build: B) => (frontendRuntimeSet.has(build.use) ? 0 : 1);
return builds.sort((build1, build2) => {
return toNumber(build1) - toNumber(build2);
});

View File

@@ -14,7 +14,6 @@ import {
BuildResultV2,
BuildResultV3,
File,
Files,
FileFsRef,
BuilderV2,
BuilderV3,
@@ -46,7 +45,6 @@ interface FunctionConfiguration {
}
export async function writeBuildResult(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV2 | BuildResultV3,
build: Builder,
@@ -57,7 +55,6 @@ export async function writeBuildResult(
const { version } = builder;
if (typeof version !== 'number' || version === 2) {
return writeBuildResultV2(
repoRootPath,
outputDir,
buildResult as BuildResultV2,
build,
@@ -65,7 +62,6 @@ export async function writeBuildResult(
);
} else if (version === 3) {
return writeBuildResultV3(
repoRootPath,
outputDir,
buildResult as BuildResultV3,
build,
@@ -111,7 +107,6 @@ function stripDuplicateSlashes(path: string): string {
* the filesystem.
*/
async function writeBuildResultV2(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV2,
build: Builder,
@@ -134,20 +129,13 @@ async function writeBuildResultV2(
);
}
const existingFunctions = new Map<Lambda | EdgeFunction, string>();
const lambdas = new Map<Lambda, string>();
const overrides: Record<string, PathOverride> = {};
for (const [path, output] of Object.entries(buildResult.output)) {
const normalizedPath = stripDuplicateSlashes(path);
if (isLambda(output)) {
await writeLambda(
repoRootPath,
outputDir,
output,
normalizedPath,
undefined,
existingFunctions
);
await writeLambda(outputDir, output, normalizedPath, undefined, lambdas);
} else if (isPrerender(output)) {
if (!output.lambda) {
throw new Error(
@@ -156,12 +144,11 @@ async function writeBuildResultV2(
}
await writeLambda(
repoRootPath,
outputDir,
output.lambda,
normalizedPath,
undefined,
existingFunctions
lambdas
);
// Write the fallback file alongside the Lambda directory
@@ -216,13 +203,7 @@ async function writeBuildResultV2(
vercelConfig?.cleanUrls
);
} else if (isEdgeFunction(output)) {
await writeEdgeFunction(
repoRootPath,
outputDir,
output,
normalizedPath,
existingFunctions
);
await writeEdgeFunction(outputDir, output, normalizedPath);
} else {
throw new Error(
`Unsupported output type: "${
@@ -239,7 +220,6 @@ async function writeBuildResultV2(
* the filesystem.
*/
async function writeBuildResultV3(
repoRootPath: string,
outputDir: string,
buildResult: BuildResultV3,
build: Builder,
@@ -263,15 +243,9 @@ async function writeBuildResultV3(
build.config?.zeroConfig ? src.substring(0, src.length - ext.length) : src
);
if (isLambda(output)) {
await writeLambda(
repoRootPath,
outputDir,
output,
path,
functionConfiguration
);
await writeLambda(outputDir, output, path, functionConfiguration);
} else if (isEdgeFunction(output)) {
await writeEdgeFunction(repoRootPath, outputDir, output, path);
await writeEdgeFunction(outputDir, output, path);
} else {
throw new Error(
`Unsupported output type: "${(output as any).type}" for ${build.src}`
@@ -341,79 +315,27 @@ 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,
existingFunctions?: Map<Lambda | EdgeFunction, string>
path: 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>[] = [];
const { files, filePathMap } = filesWithoutFsRefs(
edgeFunction.files,
repoRootPath
);
ops.push(download(files, dest));
ops.push(download(edgeFunction.files, dest));
const config = {
runtime: 'edge',
...edgeFunction,
entrypoint: normalizePath(edgeFunction.entrypoint),
filePathMap,
files: undefined,
type: undefined,
};
@@ -429,39 +351,42 @@ 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 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
* @param lambdas (optional) Map of `Lambda` instances that have previously been written
*/
async function writeLambda(
repoRootPath: string,
outputDir: string,
lambda: Lambda,
path: string,
functionConfiguration?: FunctionConfiguration,
existingFunctions?: Map<Lambda | EdgeFunction, string>
lambdas?: Map<Lambda, string>
) {
const dest = join(outputDir, 'functions', `${path}.func`);
if (existingFunctions) {
if (
await writeFunctionSymlink(outputDir, dest, lambda, existingFunctions)
) {
return;
}
existingFunctions.set(lambda, path);
// 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;
}
lambdas?.set(lambda, path);
await fs.mkdirp(dest);
const ops: Promise<any>[] = [];
let filePathMap: Record<string, string> | undefined;
if (lambda.files) {
// `files` is defined
const f = filesWithoutFsRefs(lambda.files, repoRootPath);
filePathMap = f.filePathMap;
ops.push(download(f.files, dest));
ops.push(download(lambda.files, dest));
} else if (lambda.zipBuffer) {
// Builders that use the deprecated `createLambda()` might only have `zipBuffer`
ops.push(unzip(lambda.zipBuffer, dest));
@@ -477,7 +402,6 @@ async function writeLambda(
handler: normalizePath(lambda.handler),
memory,
maxDuration,
filePathMap,
type: undefined,
files: undefined,
zipBuffer: undefined,
@@ -585,25 +509,3 @@ 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

@@ -4,12 +4,12 @@ export const defaultGlobalConfig: GlobalConfig = {
'// Note':
'This is your Vercel config file. For more information see the global configuration documentation.',
'// Docs':
'https://vercel.com/docs/projects/project-configuration/global-configuration#config.json',
'https://vercel.com/docs/project-configuration#global-configuration/config-json',
collectMetrics: true,
};
export const defaultAuthConfig: AuthConfig = {
'// Note': 'This is your Vercel credentials file. DO NOT SHARE!',
'// Docs':
'https://vercel.com/docs/projects/project-configuration/global-configuration#auth.json',
'https://vercel.com/docs/project-configuration#global-configuration/auth-json',
};

View File

@@ -30,7 +30,7 @@ const getGlobalPathConfig = (): string => {
];
// The customPath flag is the preferred location,
// followed by the vercel directory,
// followed by the the vercel directory,
// followed by the now directory.
// If none of those exist, use the vercel directory.
return (

View File

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

View File

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

View File

@@ -45,7 +45,7 @@ import {
detectApiExtensions,
isOfficialRuntime,
} from '@vercel/fs-detectors';
import { frameworkList } from '@vercel/frameworks';
import frameworkList from '@vercel/frameworks';
import cmd from '../output/cmd';
import link from '../output/link';
@@ -158,10 +158,7 @@ export default class DevServer {
private podId: string;
private devProcess?: ChildProcess;
private devProcessOrigin?: string;
private shutdownCallbacks: Map<
number /* PID */,
undefined | (() => Promise<void>)
>;
private devServerPids: Set<number>;
private originalProjectSettings?: ProjectSettings;
private projectSettings?: ProjectSettings;
@@ -214,7 +211,7 @@ export default class DevServer {
this.filter = path => Boolean(path);
this.podId = Math.random().toString(32).slice(-5);
this.shutdownCallbacks = new Map();
this.devServerPids = new Set();
}
async exit(code = 1) {
@@ -1009,7 +1006,7 @@ export default class DevServer {
ops.push(this.watcher.close());
}
for (const pid of this.shutdownCallbacks.keys()) {
for (const pid of this.devServerPids) {
ops.push(this.killBuilderDevServer(pid));
}
@@ -1027,15 +1024,7 @@ export default class DevServer {
async killBuilderDevServer(pid: number) {
const { debug } = this.output;
debug(`Killing builder dev server with PID ${pid}`);
const shutdownCb = this.shutdownCallbacks.get(pid);
this.shutdownCallbacks.delete(pid);
if (shutdownCb) {
debug(`Running shutdown callback for PID ${pid}`);
await shutdownCb();
return;
}
this.devServerPids.delete(pid);
try {
await treeKill(pid);
debug(`Killed builder dev server with PID ${pid}`);
@@ -1443,9 +1432,9 @@ export default class DevServer {
}
if (startMiddlewareResult) {
const { port, pid, shutdown } = startMiddlewareResult;
const { port, pid } = startMiddlewareResult;
middlewarePid = pid;
this.shutdownCallbacks.set(pid, shutdown);
this.devServerPids.add(pid);
const middlewareReqHeaders = nodeHeadersToFetchHeaders(req.headers);
@@ -1910,8 +1899,8 @@ export default class DevServer {
// is also included in the request ID. So use the same `dev1` fake region.
requestId = generateRequestId(this.podId, true);
const { port, pid, shutdown } = devServerResult;
this.shutdownCallbacks.set(pid, shutdown);
const { port, pid } = devServerResult;
this.devServerPids.add(pid);
res.once('close', () => {
this.killBuilderDevServer(pid);

View File

@@ -21,7 +21,7 @@ export async function execExtension(
args: string[],
cwd: string
): Promise<number> {
const { debug, log } = client.output;
const { debug } = client.output;
const extensionCommand = `vercel-${name}`;
const { packageJsonPath, lockfilePath } = await scanParentDirs(cwd);
@@ -76,7 +76,7 @@ export async function execExtension(
proxy.close();
if (result instanceof Error) {
log(`Error running extension ${extensionCommand}: ${result.message}`);
debug(`error running extension: ${result.message}`);
}
return result.exitCode;

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