Compare commits

...

24 Commits

Author SHA1 Message Date
Nathan Rajlich
4c0055eaf0 Publish Stable
- vercel@21.3.2
 - @vercel/python@2.0.0
2021-03-02 11:03:53 -08:00
Nathan Rajlich
910a905192 Remove @vercel/python stable publish blacklist (#5920) 2021-03-02 11:01:02 -08:00
Steven
156a9be06e Publish Stable
- vercel@21.3.1
 - @vercel/go@1.2.1
2021-02-26 16:21:51 -05:00
Steven
e2132ee36d Publish Canary
- vercel@21.3.1-canary.0
 - @vercel/go@1.2.1-canary.0
2021-02-26 15:22:59 -05:00
Steven
4572230c1d [go] Fix analyze ignore list (#5906)
A regression was introduced in #5873 that caused the analyze step to parse Go's internal source files (eg `golang/test/bombad.go`) instead of only parsing the user's source code (eg `api/users.go`).

This resulted in the error:

```
Failed to parse AST for "api/users.go"
Error: Command failed: /vercel/1ab928d537d26157/.build-utils/.builder/node_modules/@vercel/go/dist/analyze -modpath=/vercel/workpath1 /vercel/workpath1/api/users.go
2021/02/26 14:26:42 Could not parse Go file "/vercel/workpath1/.vercel/cache/golang/test/bombad.go"
```
2021-02-26 20:15:34 +00:00
Steven
8cfac4cf86 Publish Stable
- @vercel/frameworks@0.3.0
 - @vercel/build-utils@2.10.0
 - vercel@21.3.0
 - @vercel/client@9.0.7
 - @vercel/go@1.2.0
 - @vercel/routing-utils@1.10.0
2021-02-25 19:53:07 -05:00
Steven
4f20783000 Publish Canary
- vercel@21.2.4-canary.14
2021-02-25 17:47:42 -05:00
Mark Glagola
968b7c3fb5 [cli] Use inspectorUrl from api (#5904)
Uses inspector url from api rather than generating one locally.

### 📋 Checklist

#### Tests

- [ ] The code changed/added as part of this PR has been covered with tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a reviewer
- [ ] Issue from task tracker has a link to this PR
2021-02-25 22:29:19 +00:00
Steven
407c4ec5f4 Publish Canary
- @vercel/build-utils@2.9.1-canary.10
 - vercel@21.2.4-canary.13
 - @vercel/client@9.0.7-canary.10
2021-02-24 17:52:33 -05:00
Steven
bcf393d125 [build-utils] Fix warning for canary (#5892)
### Related Issues

Follow up to #5888

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [x] This PR has a concise title and thorough description useful to a reviewer
- [x] Issue from task tracker has a link to this PR
2021-02-24 17:52:03 -05:00
Steven
115ae0a229 Publish Canary
- @vercel/build-utils@2.9.1-canary.9
 - vercel@21.2.4-canary.12
 - @vercel/client@9.0.7-canary.9
2021-02-24 08:43:24 -05:00
Steven
d149489c9e [build-utils] Update warning for api + pages/api (#5888)
This PR updates the warning for `api` + `pages/api` to only be printed when Next.js is mixed with `@vercel/node` functions. It should not print the warning with `@vercel/go` functions for example.

### 📋 Checklist

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [x] This PR has a concise title and thorough description useful to a reviewer
- [x] Issue from task tracker has a link to this PR
2021-02-24 01:12:14 +00:00
Steven
5b2e6052fc Publish Canary
- vercel@21.2.4-canary.11
 - @vercel/go@1.1.9-canary.1
2021-02-23 17:45:14 -05:00
Steven
38cb5a3b99 [go] Add Go version selection via go.mod (#5873)
### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [x] This PR has a concise title and thorough description useful to a reviewer
- [x] Issue from task tracker has a link to this PR
2021-02-23 16:41:59 -05:00
Steven
84e828a0ca Publish Canary
- @vercel/frameworks@0.2.1-canary.7
 - @vercel/build-utils@2.9.1-canary.8
 - vercel@21.2.4-canary.10
 - @vercel/client@9.0.7-canary.8
2021-02-23 13:13:43 -05:00
Steven
157ce5346d [build-utils] Update Node.js 10 deprecation message (#5881)
This PR updates the discontinued date according to the changelog.

It also conditionally prints a hint to update `engines` if present or update Project Settings.

https://vercel.com/changelog/node-js-10-is-being-deprecated
2021-02-23 18:12:43 +00:00
Nathan Rajlich
0256157391 [examples] Fix "nuxtjs" example by adding a yarn.lock file (#5882)
`@babel/preset-env` shipped a change that broke Nuxt.js usage of the
module, so here we add a `yarn.lock` file that pins the preset-env
version to 7.12.17.

See: https://github.com/nuxt/nuxt.js/issues/8882
2021-02-22 18:03:50 -08:00
Steven
a45b3d0982 [examples] Update jekyll and middleman (#5871)
This PR updates the examples for jekyll and middleman to use the latest version.

I confirmed these examples work with both stable and canary.
2021-02-22 10:14:32 -05:00
Connor Davis
26af6dbc03 [tests] Update 502 to 504 for Serverless Function timeout (#5874)
We now return a 504 for lambda timeouts

### Related Issues

Related to https://github.com/vercel/now-proxy/pull/1970

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [x] This PR has a concise title and thorough description useful to a reviewer
2021-02-20 17:04:29 +00:00
Mark Glagola
38130103a0 [cli] Replace now.sh tests with vercel.app 2021-02-19 19:22:51 -05:00
Steven
978485818a Publish Canary
- @vercel/build-utils@2.9.1-canary.7
 - vercel@21.2.4-canary.9
 - @vercel/client@9.0.7-canary.7
2021-02-19 14:38:17 -05:00
Steven
0270784cbb [build-utils] Remove flags from bundle install (#5865)
This PR removes the flags from `bundle install` which fixes the deprecated warnings such as 

```
[DEPRECATED] The `--no-prune` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local no_prune 'true'`, and stop using this flag
```

These flags already represent the defaults for `bundle install` anyway and we can pass environment variables in the spawn options instead.
2021-02-19 19:37:39 +00:00
Naoyuki Kanezawa
345e514924 [build-utils] Fix glob to find symlinks pointing to a directory (#5870)
https://app.clubhouse.io/vercel/story/16876

This will fix the issue that symlinks pointing to a directory is not returned on `prepareCache` and node modules linked to local files don't work.

### Related Issues

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [x] This PR has a concise title and thorough description useful to a reviewer
- [x] Issue from task tracker has a link to this PR

Co-authored-by: Steven <steven@ceriously.com>
2021-02-19 12:43:52 -05:00
Steven
df62ec6ed0 [cli] Disable Next.js gif test and Node.js 10 tests (#5867)
* Disable gif optimization test

* Disable Node 10 tests
2021-02-19 11:20:35 -05:00
61 changed files with 8591 additions and 337 deletions

View File

@@ -16,7 +16,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest]
node: [10, 12]
node: [12]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2

View File

@@ -16,7 +16,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
node: [10, 12]
node: [12]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2

View File

@@ -16,7 +16,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
node: [10, 12]
node: [12]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2

View File

@@ -1,6 +1,9 @@
_site
public
.sass-cache
.jekyll-cache
.jekyll-metadata
vendor
public
.env
.env.build
.vercel

View File

@@ -1,2 +0,0 @@
README.md
yarn.lock

View File

@@ -1,4 +1,5 @@
---
permalink: /404.html
layout: default
---

View File

@@ -1,5 +1,4 @@
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
@@ -8,27 +7,23 @@ source "https://rubygems.org"
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "jekyll", "~> 3.8.6"
gem "jekyll", "~> 4.2.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
gem "minima", "~> 2.0"
gem "minima", "~> 2.5"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
gem "jekyll-feed", "~> 0.6"
gem "jekyll-feed", "~> 0.12"
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library.
install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do
platforms :mingw, :x64_mingw, :mswin, :jruby do
gem "tzinfo", "~> 1.2"
gem "tzinfo-data"
end
# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1.0", :install_if => Gem.win_platform?
gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]

View File

@@ -1,82 +1,80 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.6.0)
public_suffix (>= 2.0.2, < 4.0)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0)
concurrent-ruby (1.1.5)
em-websocket (0.5.1)
concurrent-ruby (1.1.8)
em-websocket (0.5.2)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
ffi (1.11.1)
ffi (1.14.2)
forwardable-extended (2.6.0)
http_parser.rb (0.6.0)
i18n (0.9.5)
i18n (1.8.9)
concurrent-ruby (~> 1.0)
jekyll (3.8.6)
jekyll (4.2.0)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 0.7)
jekyll-sass-converter (~> 1.0)
i18n (~> 1.0)
jekyll-sass-converter (~> 2.0)
jekyll-watch (~> 2.0)
kramdown (~> 1.14)
kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (~> 0.3.3)
mercenary (~> 0.4.0)
pathutil (~> 0.9)
rouge (>= 1.7, < 4)
rouge (~> 3.0)
safe_yaml (~> 1.0)
jekyll-feed (0.12.1)
terminal-table (~> 2.0)
jekyll-feed (0.15.1)
jekyll (>= 3.7, < 5.0)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
jekyll-seo-tag (2.6.1)
jekyll (>= 3.3, < 5.0)
jekyll-sass-converter (2.1.0)
sassc (> 2.0.1, < 3.0)
jekyll-seo-tag (2.7.1)
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (1.17.0)
kramdown (2.3.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
mercenary (0.3.6)
minima (2.5.0)
jekyll (~> 3.5)
listen (3.4.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
minima (2.5.1)
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (3.1.1)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
public_suffix (4.0.6)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
rouge (3.6.0)
ruby_dep (1.5.0)
rexml (3.2.4)
rouge (3.26.0)
safe_yaml (1.0.5)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
tzinfo-data (1.2019.2)
tzinfo (>= 1.0.0)
wdm (0.1.1)
sassc (2.4.0)
ffi (~> 1.9)
terminal-table (2.0.0)
unicode-display_width (~> 1.1, >= 1.1.1)
unicode-display_width (1.7.0)
PLATFORMS
ruby
x86_64-linux
DEPENDENCIES
jekyll (~> 3.8.6)
jekyll-feed (~> 0.6)
minima (~> 2.0)
jekyll (~> 4.2.0)
jekyll-feed (~> 0.12)
minima (~> 2.5)
tzinfo (~> 1.2)
tzinfo-data
wdm (~> 0.1.0)
wdm (~> 0.1.1)
BUNDLED WITH
2.1.4
2.2.4

View File

@@ -7,12 +7,17 @@
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
#
# If you need help with YAML syntax, here are some quick references for you:
# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
# https://learnxinyminutes.com/docs/yaml/
#
# Site settings
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.
title: Your awesome title
email: your-email@example.com
description: >- # this means to ignore newlines until "baseurl:"
@@ -23,21 +28,27 @@ baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname & protocol for your site, e.g. http://example.com
twitter_username: jekyllrb
github_username: jekyll
permalink: pretty
# Build settings
markdown: kramdown
theme: minima
plugins:
- jekyll-feed
# Exclude from processing.
# The following items will not be processed, by default. Create a custom list
# to override the default setting.
# The following items will not be processed, by default.
# Any item listed under the `exclude:` key here will be automatically added to
# the internal "default list".
#
# Excluded items can be processed by explicitly listing the directories or
# their entries' file path in the `include:` list.
#
# exclude:
# - .sass-cache/
# - .jekyll-cache/
# - gemfiles/
# - Gemfile
# - Gemfile.lock
# - node_modules
# - node_modules/
# - vendor/bundle/
# - vendor/cache/
# - vendor/gems/

View File

@@ -1,18 +1,23 @@
---
layout: post
title: "Welcome to Jekyll!"
date: 2019-07-18 00:15:52 +0100
title: 'Welcome to Jekyll!'
date: 2021-02-19 23:17:16 +0000
categories: jekyll update
---
Youll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.
To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.
Jekyll requires blog post files to be named according to the following format:
`YEAR-MONTH-DAY-title.MARKUP`
Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit numbers, and `MARKUP` is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.
Jekyll also offers powerful support for code snippets:
{% highlight ruby %}
def print_hi(name)
puts "Hi, #{name}"
puts "Hi, #{name}"
end
print_hi('Tom')
#=> prints 'Hi, Tom' to STDOUT.
@@ -21,5 +26,5 @@ print_hi('Tom')
Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekylls GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk].
[jekyll-docs]: https://jekyllrb.com/docs/home
[jekyll-gh]: https://github.com/jekyll/jekyll
[jekyll-gh]: https://github.com/jekyll/jekyll
[jekyll-talk]: https://talk.jekyllrb.com/

View File

@@ -3,3 +3,4 @@
.DS_Store
.sass-cache
build/
.vercel

View File

@@ -1,29 +1,29 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (5.0.7.2)
activesupport (5.2.4.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
autoprefixer-rails (9.6.1.1)
autoprefixer-rails (9.8.6.5)
execjs
backports (3.15.0)
backports (3.20.2)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.5)
concurrent-ruby (1.1.8)
contracts (0.13.0)
dotenv (2.7.5)
dotenv (2.7.6)
erubis (2.7.0)
execjs (2.7.0)
fast_blank (1.0.0)
fastimage (2.1.7)
ffi (1.11.1)
haml (5.1.2)
fastimage (2.2.2)
ffi (1.14.2)
haml (5.2.1)
temple (>= 0.8.0)
tilt
hamster (3.0.0)
@@ -31,24 +31,25 @@ GEM
hashie (3.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
kramdown (1.17.0)
kramdown (2.3.0)
rexml
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
memoist (0.16.0)
middleman (4.3.5)
memoist (0.16.2)
middleman (4.3.11)
coffee-script (~> 2.2)
haml (>= 4.0.5)
kramdown (~> 1.2)
middleman-cli (= 4.3.5)
middleman-core (= 4.3.5)
kramdown (>= 2.3.0)
middleman-cli (= 4.3.11)
middleman-core (= 4.3.11)
middleman-autoprefixer (2.10.1)
autoprefixer-rails (~> 9.1)
middleman-core (>= 3.3.3)
middleman-cli (4.3.5)
middleman-cli (4.3.11)
thor (>= 0.17.0, < 2.0)
middleman-core (4.3.5)
activesupport (>= 4.2, < 5.1)
middleman-core (4.3.11)
activesupport (>= 4.2, < 6.0)
addressable (~> 2.3)
backports (~> 3.6)
bundler
@@ -70,33 +71,34 @@ GEM
servolux
tilt (~> 2.0.9)
uglifier (~> 3.0)
minitest (5.12.2)
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.13.3.4)
activesupport (>= 3.1)
parallel (1.17.0)
public_suffix (4.0.1)
rack (2.0.7)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
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)
sassc (2.2.1)
rexml (3.2.4)
sassc (2.4.0)
ffi (~> 1.9)
servolux (0.13.0)
temple (0.8.2)
thor (0.20.3)
thor (1.1.0)
thread_safe (0.3.6)
tilt (2.0.10)
tzinfo (1.2.5)
tzinfo (1.2.9)
thread_safe (~> 0.1)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
PLATFORMS
ruby
x86_64-linux
DEPENDENCIES
middleman (~> 4.2)
@@ -105,4 +107,4 @@ DEPENDENCIES
wdm (~> 0.1)
BUNDLED WITH
2.1.4
2.2.4

View File

@@ -1,2 +0,0 @@
README.md
yarn.lock

View File

@@ -1,2 +1 @@
README.md
build

View File

@@ -13,6 +13,6 @@
"nuxt": "^2.0.0"
},
"devDependencies": {
"nodemon": "^1.18.9"
"nodemon": "^2.0.7"
}
}

8116
examples/nuxtjs/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/frameworks",
"version": "0.2.1-canary.6",
"version": "0.3.0",
"main": "./dist/frameworks.js",
"types": "./dist/frameworks.d.ts",
"files": [
@@ -20,7 +20,7 @@
"@types/js-yaml": "3.12.1",
"@types/node": "12.0.4",
"@types/node-fetch": "2.5.8",
"@vercel/routing-utils": "1.9.3-canary.0",
"@vercel/routing-utils": "1.10.0",
"ajv": "6.12.2",
"jest": "24.9.0",
"ts-jest": "24.1.0",

View File

@@ -1391,7 +1391,7 @@ export const frameworks = [
{
name: 'Jekyll',
slug: 'jekyll',
demo: 'https://jekyll.now-examples.now.sh',
demo: 'https://jekyll.now-examples.vercel.app',
logo:
'https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/jekyll.svg',
tagline:
@@ -1468,7 +1468,7 @@ export const frameworks = [
{
name: 'Middleman',
slug: 'middleman',
demo: 'https://middleman.now-examples.now.sh',
demo: 'https://middleman.now-examples.vercel.app',
logo:
'https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/middleman.svg',
tagline:

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/build-utils",
"version": "2.9.1-canary.6",
"version": "2.10.0",
"license": "MIT",
"main": "./dist/index.js",
"types": "./dist/index.d.js",
@@ -29,7 +29,7 @@
"@types/node-fetch": "^2.1.6",
"@types/semver": "6.0.0",
"@types/yazl": "^2.4.1",
"@vercel/frameworks": "0.2.1-canary.6",
"@vercel/frameworks": "0.3.0",
"@vercel/ncc": "0.24.0",
"aggregate-error": "3.0.1",
"async-retry": "1.2.3",

View File

@@ -311,11 +311,16 @@ export async function detectBuilders(
if (frontendBuilder) {
builders.push(frontendBuilder);
if (hasNextApiFiles && apiBuilders.length) {
if (
hasNextApiFiles &&
apiBuilders.some(b => isOfficialRuntime('node', b.use))
) {
warnings.push({
code: 'conflicting_files',
message:
'It is not possible to use `api` and `pages/api` at the same time, please only use one option',
'When using Next.js, it is recommended to place Node.js Serverless Functions inside of the `pages/api` (provided by Next.js) directory instead of `api` (provided by Vercel).',
link: 'https://nextjs.org/docs/api-routes/introduction',
action: 'Learn More',
});
}
}
@@ -944,8 +949,8 @@ function getRouteResult(
const rewriteRoutes: Route[] = [];
const errorRoutes: Route[] = [];
const framework = frontendBuilder?.config?.framework || '';
const use = frontendBuilder?.use || '';
const isNextjs = framework === 'nextjs' || use.startsWith('@vercel/next');
const isNextjs =
framework === 'nextjs' || isOfficialRuntime('next', frontendBuilder?.use);
const ignoreRuntimes = slugToFramework.get(framework)?.ignoreRuntimes;
if (apiRoutes && apiRoutes.length > 0) {

View File

@@ -51,8 +51,8 @@ export default async function glob(
stat,
`statCache does not contain value for ${relativePath} (resolved to ${fsPath})`
);
if (stat.isFile()) {
const isSymlink = options.symlinks![fsPath];
const isSymlink = options.symlinks![fsPath];
if (isSymlink || stat.isFile()) {
if (isSymlink) {
stat = await lstat(fsPath);
}

View File

@@ -1,5 +1,4 @@
import { intersects, validRange } from 'semver';
import boxen from 'boxen';
import { NodeVersion } from '../types';
import { NowBuildError } from '../errors';
import debug from '../debug';
@@ -11,7 +10,7 @@ const allOptions = [
major: 10,
range: '10.x',
runtime: 'nodejs10.x',
discontinueDate: new Date('2021-03-30'),
discontinueDate: new Date('2021-04-20'),
},
{
major: 8,
@@ -21,15 +20,15 @@ const allOptions = [
},
] as const;
const pleaseSet =
'Please change your Project Settings or set "engines": { "node": "' +
getLatestNodeVersion().range +
'" } in your `package.json` file to use Node.js ' +
getLatestNodeVersion().major +
'.';
function getHint(isAuto: boolean) {
const { major, range } = getLatestNodeVersion();
return isAuto
? `Please set Node.js Version to ${range} in your Project Settings to use Node.js ${major}.`
: `Please set "engines": { "node": "${range}" } in your \`package.json\` file to use Node.js ${major}.`;
}
const upstreamProvider =
'This change is the result of a decision made by an upstream infrastructure provider (AWS).' +
'\nRead more: https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html';
'This change is the result of a decision made by an upstream infrastructure provider (AWS).';
export function getLatestNodeVersion() {
return allOptions[0];
@@ -40,8 +39,8 @@ export function getDiscontinuedNodeVersions(): NodeVersion[] {
}
export async function getSupportedNodeVersion(
engineRange?: string,
isAuto?: boolean
engineRange: string | undefined,
isAuto: boolean
): Promise<NodeVersion> {
let selection: NodeVersion = getLatestNodeVersion();
@@ -55,60 +54,35 @@ export async function getSupportedNodeVersion(
return intersects(o.range, engineRange);
});
if (!found) {
const intro =
isAuto || !engineRange
? 'This project is using an invalid version of Node.js and must be changed.'
: 'Found `engines` in `package.json` with an invalid Node.js version range: "' +
engineRange +
'".';
throw new NowBuildError({
code: 'BUILD_UTILS_NODE_VERSION_INVALID',
link:
'https://vercel.com/docs/runtimes#official-runtimes/node-js/node-js-version',
message: intro + '\n' + pleaseSet,
link: 'http://vercel.link/node-version',
message: `Found invalid Node.js Version: "${engineRange}". ${getHint(
isAuto
)}`,
});
}
}
if (isDiscontinued(selection)) {
const intro =
isAuto || !engineRange
? 'This project is using a discontinued version of Node.js (' +
selection.range +
') and must be upgraded.'
: 'Found `engines` in `package.json` with a discontinued Node.js version range: "' +
engineRange +
'".';
const intro = `Node.js Version "${selection.range}" is discontinued and must be upgraded.`;
throw new NowBuildError({
code: 'BUILD_UTILS_NODE_VERSION_DISCONTINUED',
link:
'https://vercel.com/docs/runtimes#official-runtimes/node-js/node-js-version',
message: intro + '\n' + pleaseSet + '\n' + upstreamProvider,
link: 'http://vercel.link/node-version',
message: `${intro} ${getHint(isAuto)} ${upstreamProvider}`,
});
}
debug(
isAuto || !engineRange
? 'Using default Node.js range: "' + selection.range + '".'
: 'Found `engines` in `package.json`, selecting range: "' +
selection.range +
'".'
);
debug(`Selected Node.js ${selection.range}`);
if (selection.discontinueDate) {
const d = selection.discontinueDate.toISOString().split('T')[0];
console.warn(
boxen(
'NOTICE' +
'\n' +
`\nNode.js version ${selection.range} has reached end-of-life.` +
`\nAs a result, deployments created on or after ${d} will fail to build.` +
'\n' +
pleaseSet +
'\n' +
upstreamProvider,
{ padding: 1 }
)
`Error: Node.js version ${
selection.range
} is deprecated. Deployments created on or after ${d} will fail to build. ${getHint(
isAuto
)} ${upstreamProvider}`
);
}

View File

@@ -5,7 +5,6 @@ import debug from '../debug';
import spawn from 'cross-spawn';
import { SpawnOptions } from 'child_process';
import { deprecate } from 'util';
import { cpus } from 'os';
import { NowBuildError } from '../errors';
import { Meta, PackageJson, NodeVersion, Config } from '../types';
import { getSupportedNodeVersion, getLatestNodeVersion } from './node-version';
@@ -177,16 +176,13 @@ export async function getNodeVersion(
let { nodeVersion } = config;
let isAuto = true;
if (packageJson && packageJson.engines && packageJson.engines.node) {
if (
nodeVersion &&
nodeVersion !== packageJson.engines.node &&
!meta.isDev
) {
const { node } = packageJson.engines;
if (nodeVersion && nodeVersion !== node && !meta.isDev) {
console.warn(
'Warning: Due to `engines` existing in your `package.json` file, the Node.js Version defined in your Project Settings will not apply. Learn More: http://vercel.link/node-version'
`Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${nodeVersion}") will not apply. Learn More: http://vercel.link/node-version`
);
}
nodeVersion = packageJson.engines.node;
nodeVersion = node;
isAuto = false;
}
return getSupportedNodeVersion(nodeVersion, isAuto);
@@ -328,18 +324,7 @@ export async function runBundleInstall(
assert(path.isAbsolute(destPath));
const opts = { ...spawnOpts, cwd: destPath, prettyCommand: 'bundle install' };
await spawnAsync(
'bundle',
args.concat([
'install',
'--no-prune',
'--retry',
'3',
'--jobs',
String(cpus().length || 1),
]),
opts
);
await spawnAsync('bundle', args.concat(['install']), opts);
}
export async function runPipInstall(

View File

@@ -0,0 +1 @@
contents

View File

@@ -0,0 +1 @@
dir

View File

@@ -2572,6 +2572,101 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
]);
}
{
const files = ['api/external.js', 'pages/api/internal.js'];
const { builders, warnings } = await detectBuilders(files, null, {
featHandleMiss,
projectSettings: { framework: 'nextjs' },
});
expect(builders).toStrictEqual([
{
config: {
zeroConfig: true,
},
src: 'api/external.js',
use: '@vercel/node',
},
{
config: {
framework: 'nextjs',
zeroConfig: true,
},
src: 'package.json',
use: '@vercel/next',
},
]);
expect(warnings).toStrictEqual([
{
code: 'conflicting_files',
message:
'When using Next.js, it is recommended to place Node.js Serverless Functions inside of the `pages/api` (provided by Next.js) directory instead of `api` (provided by Vercel).',
link: 'https://nextjs.org/docs/api-routes/introduction',
action: 'Learn More',
},
]);
}
{
const files = ['api/external.js', 'pages/api/internal.js'];
const { builders, warnings } = await detectBuilders(files, null, {
featHandleMiss,
tag: 'canary',
projectSettings: { framework: 'nextjs' },
});
expect(builders).toStrictEqual([
{
config: {
zeroConfig: true,
},
src: 'api/external.js',
use: '@vercel/node@canary',
},
{
config: {
framework: 'nextjs',
zeroConfig: true,
},
src: 'package.json',
use: '@vercel/next@canary',
},
]);
expect(warnings).toStrictEqual([
{
code: 'conflicting_files',
message:
'When using Next.js, it is recommended to place Node.js Serverless Functions inside of the `pages/api` (provided by Next.js) directory instead of `api` (provided by Vercel).',
link: 'https://nextjs.org/docs/api-routes/introduction',
action: 'Learn More',
},
]);
}
{
const files = ['api/external.go', 'pages/api/internal.js'];
const { builders, warnings } = await detectBuilders(files, null, {
featHandleMiss,
projectSettings: { framework: 'nextjs' },
});
expect(builders).toStrictEqual([
{
config: {
zeroConfig: true,
},
src: 'api/external.go',
use: '@vercel/go',
},
{
config: {
framework: 'nextjs',
zeroConfig: true,
},
src: 'package.json',
use: '@vercel/next',
},
]);
expect(warnings).toStrictEqual([]);
}
{
const files = ['public/index.html'];

View File

@@ -22,7 +22,11 @@ async function expectBuilderError(promise, pattern) {
}
assert('message' in result, `Expected error message but found ${result}`);
assert(
pattern.test(result.message),
typeof result.message === 'string',
`Expected error to be a string but found ${typeof result.message}`
);
assert(
result.message.includes(pattern),
`Expected ${pattern} but found "${result.message}"`
);
}
@@ -46,19 +50,21 @@ it('should re-create symlinks properly', async () => {
return;
}
const files = await glob('**', path.join(__dirname, 'symlinks'));
assert.equal(Object.keys(files).length, 2);
assert.equal(Object.keys(files).length, 4);
const outDir = path.join(__dirname, 'symlinks-out');
await fs.remove(outDir);
const files2 = await download(files, outDir);
assert.equal(Object.keys(files2).length, 2);
assert.equal(Object.keys(files2).length, 4);
const [linkStat, aStat] = await Promise.all([
const [linkStat, linkDirStat, aStat] = await Promise.all([
fs.lstat(path.join(outDir, 'link.txt')),
fs.lstat(path.join(outDir, 'link-dir')),
fs.lstat(path.join(outDir, 'a.txt')),
]);
assert(linkStat.isSymbolicLink());
assert(linkDirStat.isSymbolicLink());
assert(aStat.isFile());
});
@@ -68,7 +74,7 @@ it('should create zip files with symlinks properly', async () => {
return;
}
const files = await glob('**', path.join(__dirname, 'symlinks'));
assert.equal(Object.keys(files).length, 2);
assert.equal(Object.keys(files).length, 4);
const outFile = path.join(__dirname, 'symlinks.zip');
await fs.remove(outFile);
@@ -80,15 +86,17 @@ it('should create zip files with symlinks properly', async () => {
await fs.writeFile(outFile, await createZip(files));
await spawnAsync('unzip', [outFile], { cwd: outDir });
const [linkStat, aStat] = await Promise.all([
const [linkStat, linkDirStat, aStat] = await Promise.all([
fs.lstat(path.join(outDir, 'link.txt')),
fs.lstat(path.join(outDir, 'link-dir')),
fs.lstat(path.join(outDir, 'a.txt')),
]);
assert(linkStat.isSymbolicLink());
assert(linkDirStat.isSymbolicLink());
assert(aStat.isFile());
});
it('should only match supported node versions', async () => {
it('should only match supported node versions, otherwise throw an error', async () => {
expect(await getSupportedNodeVersion('10.x', false)).toHaveProperty(
'major',
10
@@ -101,12 +109,9 @@ it('should only match supported node versions', async () => {
'major',
14
);
expect(getSupportedNodeVersion('8.11.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('6.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('999.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('foo', false)).rejects.toThrow();
const autoMessage = /This project is using an invalid version of Node.js and must be changed/;
const autoMessage =
'Please set Node.js Version to 14.x in your Project Settings to use Node.js 14.';
await expectBuilderError(
getSupportedNodeVersion('8.11.x', true),
autoMessage
@@ -128,7 +133,9 @@ it('should only match supported node versions', async () => {
'major',
14
);
const foundMessage = /Found `engines` in `package\.json` with an invalid Node\.js version range/;
const foundMessage =
'Please set "engines": { "node": "14.x" } in your `package.json` file to use Node.js 14.';
await expectBuilderError(
getSupportedNodeVersion('8.11.x', false),
foundMessage
@@ -191,7 +198,7 @@ it('should prefer package.json engines over project setting from config and warn
)
).toHaveProperty('range', '14.x');
expect(warningMessages).toStrictEqual([
'Warning: Due to `engines` existing in your `package.json` file, the Node.js Version defined in your Project Settings will not apply. Learn More: http://vercel.link/node-version',
'Warning: Due to "engines": { "node": "14.x" } in your `package.json` file, the Node.js Version defined in your Project Settings ("12.x") will not apply. Learn More: http://vercel.link/node-version',
]);
});
@@ -212,9 +219,9 @@ it('should get latest node version', async () => {
});
it('should throw for discontinued versions', async () => {
// Mock a future date so that Node 8 becomes discontinued
// Mock a future date so that Node 8 and 10 become discontinued
const realDateNow = Date.now.bind(global.Date);
global.Date.now = () => new Date('2021-04-01').getTime();
global.Date.now = () => new Date('2021-05-01').getTime();
expect(getSupportedNodeVersion('8.10.x', false)).rejects.toThrow();
expect(getSupportedNodeVersion('8.10.x', true)).rejects.toThrow();
@@ -229,6 +236,27 @@ it('should throw for discontinued versions', async () => {
global.Date.now = realDateNow;
});
it('should warn for deprecated versions, soon to be discontinued', async () => {
// 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(warningMessages).toStrictEqual([
'Error: Node.js version 10.x is deprecated. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "14.x" } in your `package.json` file to use Node.js 14. This change is the result of a decision made by an upstream infrastructure provider (AWS).',
'Error: Node.js version 10.x is deprecated. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 14.x in your Project Settings to use Node.js 14. This change is the result of a decision made by an upstream infrastructure provider (AWS).',
]);
global.Date.now = realDateNow;
});
it('should support require by path for legacy builders', () => {
const index = require('@vercel/build-utils');

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "21.2.4-canary.8",
"version": "21.3.2",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -61,10 +61,10 @@
"node": ">= 10"
},
"dependencies": {
"@vercel/build-utils": "2.9.1-canary.6",
"@vercel/go": "1.1.9-canary.0",
"@vercel/build-utils": "2.10.0",
"@vercel/go": "1.2.1",
"@vercel/node": "1.9.1-canary.0",
"@vercel/python": "1.2.5-canary.1",
"@vercel/python": "2.0.0",
"@vercel/ruby": "1.2.6-canary.0",
"update-notifier": "4.1.0"
},
@@ -100,7 +100,7 @@
"@types/universal-analytics": "0.4.2",
"@types/which": "1.3.2",
"@types/write-json-file": "2.2.1",
"@vercel/frameworks": "0.2.1-canary.6",
"@vercel/frameworks": "0.3.0",
"@vercel/ncc": "0.24.0",
"@zeit/fun": "0.11.2",
"@zeit/source-map-support": "0.6.2",

View File

@@ -17,29 +17,12 @@ import { prependEmoji, emoji } from '../emoji';
function printInspectUrl(
output: Output,
deploymentUrl: string,
deployStamp: () => string,
orgSlug: string
inspectorUrl: string,
deployStamp: () => string
) {
const url = deploymentUrl.replace('https://', '');
// example urls:
// lucim-fyulaijvg.now.sh
// s-66p6vb23x.n8.io (custom domain suffix)
const [sub, ...p] = url.split('.');
const apex = p.join('.');
const q = sub.split('-');
const deploymentShortId = q.pop();
const projectName = q.join('-');
const inspectUrl = `https://vercel.com/${orgSlug}/${projectName}/${deploymentShortId}${
apex !== 'now.sh' && apex !== 'vercel.app' ? `/${apex}` : ''
}`;
output.print(
prependEmoji(
`Inspect: ${chalk.bold(inspectUrl)} ${deployStamp()}`,
`Inspect: ${chalk.bold(inspectorUrl)} ${deployStamp()}`,
emoji('inspect')
) + `\n`
);
@@ -178,7 +161,7 @@ export default async function processDeployment({
output.stopSpinner();
printInspectUrl(output, event.payload.url, deployStamp, org.slug);
printInspectUrl(output, event.payload.inspectorUrl, deployStamp);
if (quiet) {
process.stdout.write(`https://${event.payload.url}`);

View File

@@ -589,7 +589,9 @@ export default class DevServer {
}
if (warnings && warnings.length > 0) {
warnings.forEach(warning => this.output.warn(warning.message));
warnings.forEach(warning =>
this.output.warn(warning.message, null, warning.link, warning.action)
);
}
if (builders) {

View File

@@ -1692,6 +1692,9 @@ test(
expectHeader('image/webp'),
fetchOpts('image/webp')
);
/*
* Disabled gif in https://github.com/vercel/next.js/pull/22253
* Eventually we should enable again when `next dev` supports it
await testPath(
200,
toUrl('/test.gif', 64, 80),
@@ -1699,6 +1702,7 @@ test(
expectHeader('image/webp'),
fetchOpts('image/webp')
);
*/
await testPath(
200,
toUrl('/test.svg', 64, 70),

View File

@@ -1939,6 +1939,11 @@ test('create a production deployment', async t => {
/Setting target to production/gm,
formatOutput(targetCall)
);
t.regex(
targetCall.stderr,
/Inspect: https:\/\/vercel.com\//gm,
formatOutput(targetCall)
);
t.regex(targetCall.stdout, /https:\/\//gm);
const { host: targetHost } = new URL(targetCall.stdout);
@@ -2674,7 +2679,7 @@ test('deploy a Lambda with 3 seconds of maxDuration', async t => {
]);
t.is(response1.status, 200, url);
t.is(response2.status, 502, url);
t.is(response2.status, 504, url);
});
test('fail to deploy a Lambda with an incorrect value for maxDuration', async t => {
@@ -2726,7 +2731,7 @@ test('fail to deploy a Lambda with a specific runtime but without a locked versi
});
test('fail to add a domain without a project', async t => {
const output = await execute(['domains', 'add', 'my-domain.now.sh']);
const output = await execute(['domains', 'add', 'my-domain.vercel.app']);
t.is(output.exitCode, 1, formatOutput(output));
t.regex(output.stderr, /expects two arguments/gm, formatOutput(output));
});
@@ -2759,7 +2764,7 @@ test('change user', async t => {
});
test('assign a domain to a project', async t => {
const domain = `project-domain.${contextName}.now.sh`;
const domain = `project-domain.${contextName}.vercel.app`;
const directory = fixture('static-deployment');
const deploymentOutput = await execute([directory, '--public', '--confirm']);

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/client",
"version": "9.0.7-canary.6",
"version": "9.0.7",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"homepage": "https://vercel.com",
@@ -37,7 +37,7 @@
]
},
"dependencies": {
"@vercel/build-utils": "2.9.1-canary.6",
"@vercel/build-utils": "2.10.0",
"@zeit/fetch": "5.2.0",
"async-retry": "1.2.3",
"async-sema": "3.0.0",

View File

@@ -26,30 +26,6 @@ async function main() {
stdio: 'inherit',
}
);
const installDir = join(outDir, 'install');
await execa(
'ncc',
[
'build',
'install.ts',
'-e',
'@vercel/build-utils',
'-e',
'@now/build-utils',
'-o',
installDir,
],
{
stdio: 'inherit',
}
);
// Move compiled ncc file to out dir
await fs.rename(join(installDir, 'index.js'), join(outDir, 'install.js'));
// Delete leftover "install" dir
await fs.remove(installDir);
}
main().catch(err => {

View File

@@ -1,19 +1,26 @@
import tar from 'tar';
import execa from 'execa';
import fetch from 'node-fetch';
import { mkdirp, pathExists } from 'fs-extra';
import { dirname, join } from 'path';
import { mkdirp, pathExists, readFile } from 'fs-extra';
import { join } from 'path';
import buildUtils from './build-utils';
import stringArgv from 'string-argv';
const { debug } = buildUtils;
const archMap = new Map([['x64', 'amd64'], ['x86', '386']]);
const versionMap = new Map([
['1.16', '1.16'],
['1.15', '1.15.8'],
['1.14', '1.14.15'],
['1.13', '1.13.15'],
]);
const archMap = new Map([
['x64', 'amd64'],
['x86', '386'],
]);
const platformMap = new Map([['win32', 'windows']]);
// Location where the `go` binary will be installed after `postinstall`
const GO_DIR = join(__dirname, 'go');
const GO_BIN = join(GO_DIR, 'bin', 'go');
export const cacheDir = join('.vercel', 'cache', 'golang');
const getGoDir = (workPath: string) => join(workPath, cacheDir);
const GO_FLAGS = process.platform === 'win32' ? [] : ['-ldflags', '-s -w'];
const GO_MIN_VERSION = 13;
const getPlatform = (p: string) => platformMap.get(p) || p;
const getArch = (a: string) => archMap.get(a) || a;
const getGoUrl = (version: string, platform: string, arch: string) => {
@@ -25,14 +32,18 @@ const getGoUrl = (version: string, platform: string, arch: string) => {
export const OUT_EXTENSION = process.platform === 'win32' ? '.exe' : '';
export async function getAnalyzedEntrypoint(filePath: string, modulePath = '') {
debug('Analyzing entrypoint %o', filePath);
export async function getAnalyzedEntrypoint(
workPath: string,
filePath: string,
modulePath: string
) {
debug('Analyzing entrypoint %o with modulePath %o', filePath, modulePath);
const bin = join(__dirname, `analyze${OUT_EXTENSION}`);
const isAnalyzeExist = await pathExists(bin);
if (!isAnalyzeExist) {
const src = join(__dirname, 'util', 'analyze.go');
const go = await downloadGo();
const go = await downloadGo(workPath, modulePath);
await go.build(src, bin);
}
@@ -100,13 +111,16 @@ class GoWrapper {
}
export async function createGo(
workPath: string,
goPath: string,
platform = process.platform,
arch = process.arch,
opts: execa.Options = {},
goMod = false
) {
const path = `${dirname(GO_BIN)}:${process.env.PATH}`;
const binPath = join(getGoDir(workPath), 'bin');
debug(`Adding ${binPath} to PATH`);
const path = `${binPath}:${process.env.PATH}`;
const env: { [key: string]: string } = {
...process.env,
PATH: path,
@@ -120,21 +134,20 @@ export async function createGo(
return new GoWrapper(env, opts);
}
export async function downloadGo(
dir = GO_DIR,
version = '1.16',
platform = process.platform,
arch = process.arch
) {
export async function downloadGo(workPath: string, modulePath: string) {
const dir = getGoDir(workPath);
const { platform, arch } = process;
const version = await parseGoVersion(modulePath);
// Check if `go` is already installed in user's `$PATH`
const { failed, stdout } = await execa('go', ['version'], { reject: false });
if (!failed && parseInt(stdout.split('.')[1]) >= 11) {
if (!failed && parseInt(stdout.split('.')[1]) >= GO_MIN_VERSION) {
debug('Using system installed version of `go`: %o', stdout.trim());
return createGo(dir, platform, arch);
return createGo(workPath, dir, platform, arch);
}
// Check `go` bin in builder CWD
// Check `go` bin in cacheDir
const isGoExist = await pathExists(join(dir, 'bin'));
if (!isGoExist) {
debug('Installing `go` v%s to %o for %s %s', version, dir, platform, arch);
@@ -156,5 +169,32 @@ export async function downloadGo(
.on('finish', resolve);
});
}
return createGo(dir, platform, arch);
return createGo(workPath, dir, platform, arch);
}
async function parseGoVersion(modulePath: string): Promise<string> {
// default to newest (first)
let version = Array.from(versionMap.values())[0];
const file = join(modulePath, 'go.mod');
try {
const content = await readFile(file, 'utf8');
const matches = /^go (\d+)\.(\d+)\.?$/gm.exec(content) || [];
const major = parseInt(matches[1], 10);
const minor = parseInt(matches[2], 10);
const full = versionMap.get(`${major}.${minor}`);
if (major === 1 && minor >= GO_MIN_VERSION && full) {
version = full;
} else {
console.log(`Warning: Unknown Go version in ${file}`);
}
} catch (err) {
if (err.code === 'ENOENT') {
debug(`File not found: ${file}`);
} else {
throw err;
}
}
debug(`Selected Go version ${version}`);
return version;
}

View File

@@ -17,6 +17,7 @@ import {
BuildOptions,
Meta,
Files,
PrepareCacheOptions,
StartDevServerOptions,
StartDevServerResult,
} from '@vercel/build-utils';
@@ -33,7 +34,12 @@ const {
const TMP = tmpdir();
import { createGo, getAnalyzedEntrypoint, OUT_EXTENSION } from './go-helpers';
import {
createGo,
getAnalyzedEntrypoint,
cacheDir,
OUT_EXTENSION,
} from './go-helpers';
const handlerFileName = `handler${OUT_EXTENSION}`;
export { shouldServe };
@@ -125,7 +131,7 @@ Learn more: https://github.com/golang/go/wiki/Modules
const forceMove = Boolean(meta.isDev);
const srcPath = join(goPath, 'src', 'lambda');
let downloadPath = (meta.isDev || meta.skipDownload) ? workPath : srcPath;
let downloadPath = meta.isDev || meta.skipDownload ? workPath : srcPath;
let downloadedFiles = await download(files, downloadPath, meta);
debug(`Parsing AST for "${entrypoint}"`);
@@ -136,8 +142,12 @@ Learn more: https://github.com/golang/go/wiki/Modules
if (fileName in downloadedFiles) {
goModAbsPathDir = dirname(downloadedFiles[fileName].fsPath);
debug(`Found ${fileName} file in "${goModAbsPathDir}"`);
} else if ('api/go.mod' in downloadedFiles) {
goModAbsPathDir = dirname(downloadedFiles['api/go.mod'].fsPath);
debug(`Found ${fileName} file in "${goModAbsPathDir}"`);
}
analyzed = await getAnalyzedEntrypoint(
workPath,
downloadedFiles[entrypoint].fsPath,
goModAbsPathDir
);
@@ -244,6 +254,7 @@ Learn more: https://vercel.com/docs/runtimes#official-runtimes/go
if (packageName !== 'main') {
const go = await createGo(
workPath,
goPath,
process.platform,
process.arch,
@@ -392,6 +403,7 @@ Learn more: https://vercel.com/docs/runtimes#official-runtimes/go
// we need `main.go` in the same dir as the entrypoint,
// otherwise `go build` will refuse to build
const go = await createGo(
workPath,
goPath,
process.platform,
process.arch,
@@ -515,6 +527,7 @@ export async function startDevServer(
goModAbsPathDir = workPath;
}
const analyzedRaw = await getAnalyzedEntrypoint(
workPath,
entrypointWithExt,
goModAbsPathDir
);
@@ -620,3 +633,10 @@ async function waitForPortFile_(opts: {
}
}
}
export async function prepareCache({
workPath,
}: PrepareCacheOptions): Promise<Files> {
const cache = await glob(`${cacheDir}/**`, workPath);
return cache;
}

View File

@@ -1,6 +0,0 @@
import { downloadGo } from './go-helpers';
downloadGo().catch(err => {
console.error(err);
process.exit(1);
});

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/go",
"version": "1.1.9-canary.0",
"version": "1.2.1",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
@@ -12,8 +12,7 @@
"scripts": {
"build": "node build",
"test-integration-once": "jest --env node --verbose --runInBand --bail",
"prepublish": "node build",
"now-postinstall": "node dist/install.js"
"prepublishOnly": "node build"
},
"files": [
"dist"

View File

@@ -3,11 +3,12 @@ package cowsay
import (
"fmt"
"net/http"
"runtime"
say "github.com/dhruvbird/go-cowsay"
)
// Handler function
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, say.Format("cow:RANDOMNESS_PLACEHOLDER"))
fmt.Fprintf(w, say.Format("cow:" + runtime.Version() + ":RANDOMNESS_PLACEHOLDER"))
}

View File

@@ -1,11 +0,0 @@
{
"version": 2,
"builds": [
{ "src": "index.go", "use": "@vercel/go" },
{ "src": "subdirectory/index.go", "use": "@vercel/go" }
],
"probes": [
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
{ "path": "/subdirectory", "mustContain": "subcow:RANDOMNESS_PLACEHOLDER" }
]
}

View File

@@ -3,11 +3,12 @@ package subcow
import (
"fmt"
"net/http"
"runtime"
say "github.com/dhruvbird/go-cowsay"
)
// Handler function
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, say.Format("subcow:RANDOMNESS_PLACEHOLDER"))
fmt.Fprintf(w, say.Format("subcow:" + runtime.Version() + ":RANDOMNESS_PLACEHOLDER"))
}

View File

@@ -0,0 +1,14 @@
{
"version": 2,
"builds": [
{ "src": "index.go", "use": "@vercel/go" },
{ "src": "subdirectory/index.go", "use": "@vercel/go" }
],
"probes": [
{ "path": "/", "mustContain": "cow:go1.16:RANDOMNESS_PLACEHOLDER" },
{
"path": "/subdirectory",
"mustContain": "subcow:go1.16:RANDOMNESS_PLACEHOLDER"
}
]
}

View File

@@ -1,3 +1,3 @@
module go-mod
go 1.12
go 1.15

View File

@@ -3,9 +3,10 @@ package handler
import (
"fmt"
"net/http"
"runtime"
)
// Handler func
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "RANDOMNESS_PLACEHOLDER")
fmt.Fprintf(w, "version:%s:RANDOMNESS_PLACEHOLDER", runtime.Version())
}

View File

@@ -1,5 +0,0 @@
{
"version": 2,
"builds": [{ "src": "index.go", "use": "@vercel/go" }],
"probes": [{ "path": "/", "mustContain": "RANDOMNESS_PLACEHOLDER" }]
}

View File

@@ -0,0 +1,7 @@
{
"version": 2,
"builds": [{ "src": "index.go", "use": "@vercel/go" }],
"probes": [
{ "path": "/", "mustContain": "version:go1.15.8:RANDOMNESS_PLACEHOLDER" }
]
}

View File

@@ -3,10 +3,11 @@ package api
import (
"fmt"
"net/http"
"runtime"
"with-shared/shared"
)
// Handler func
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, shared.Say("RANDOMNESS_PLACEHOLDER"))
fmt.Fprintf(w, "version:%s:%s", runtime.Version(), shared.Say("RANDOMNESS_PLACEHOLDER"))
}

View File

@@ -1,3 +1,3 @@
module with-shared
go 1.12
go 1.13

View File

@@ -1,5 +0,0 @@
{
"version": 2,
"builds": [{ "src": "api/*.go", "use": "@vercel/go" }],
"probes": [{ "path": "/api", "mustContain": "RANDOMNESS_PLACEHOLDER" }]
}

View File

@@ -0,0 +1,10 @@
{
"version": 2,
"builds": [{ "src": "api/*.go", "use": "@vercel/go" }],
"probes": [
{
"path": "/api",
"mustContain": "version:go1.13.15:RANDOMNESS_PLACEHOLDER"
}
]
}

View File

@@ -1,3 +1,3 @@
module custom-flag
go 1.12
go 1.14

View File

@@ -3,11 +3,12 @@ package handler
import (
"fmt"
"net/http"
"runtime"
"custom-flag/custom"
)
// Index func
func Index(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, custom.Random)
fmt.Fprintf(w, "version:%v:%v", runtime.Version(), custom.Random)
}

View File

@@ -2,5 +2,10 @@
"version": 2,
"builds": [{ "src": "index.go", "use": "@vercel/go" }],
"build": { "env": { "GO_BUILD_FLAGS": "-tags first -ldflags '-s -w'" } },
"probes": [{ "path": "/", "mustContain": "first:RANDOMNESS_PLACEHOLDER" }]
"probes": [
{
"path": "/",
"mustContain": "version:go1.14.15:first:RANDOMNESS_PLACEHOLDER"
}
]
}

View File

@@ -3,10 +3,11 @@ package routes
import (
"fmt"
"net/http"
"runtime"
"github.com/vercel/does-not-exist/api/_pkg/somepackage"
)
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello %v", somepackage.Foo)
fmt.Fprintf(w, "version:%v:%v", runtime.Version(), somepackage.Foo)
}

View File

@@ -2,7 +2,7 @@
"version": 2,
"builds": [
{
"src": "api/v1/**/*.go",
"src": "api/v1/routes/**/*.go",
"use": "@vercel/go",
"config": { "zeroConfig": true }
}
@@ -10,7 +10,7 @@
"probes": [
{
"path": "/api/v1/routes/someroute.go",
"mustContain": "Hello Dependency:RANDOMNESS_PLACEHOLDER"
"mustContain": "version:go1.13.15:Dependency:RANDOMNESS_PLACEHOLDER"
}
]
}

View File

@@ -13,6 +13,6 @@
"noImplicitThis": false,
"types": ["node"],
"strict": true,
"target": "esnext"
"target": "es2018"
}
}

View File

@@ -18,7 +18,7 @@ import (
var ignoredFoldersRegex []*regexp.Regexp
func init() {
ignoredFolders := []string{"vendor", "testdata", ".now"}
ignoredFolders := []string{"vendor", "testdata", ".now", ".vercel"}
// Build the regex that matches if a path contains the respective ignored folder
// The pattern will look like: (.*/)?vendor/.*, which matches every path that contains a vendor folder

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/python",
"version": "1.2.5-canary.1",
"version": "2.0.0",
"main": "./dist/index.js",
"license": "MIT",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/python",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/routing-utils",
"version": "1.9.3-canary.0",
"version": "1.10.0",
"description": "Vercel routing utilities",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",

6
utils/changelog.js vendored
View File

@@ -48,12 +48,6 @@ async function main() {
pkgs.add('vercel');
}
// NOTE: `@vercel/python` stable must not be released
// until March 1st, 2021 due to breaking behavior with
// the request URL (https://github.com/vercel/vercel/pull/5739).
// After that date this can be removed.
pkgs.delete('@vercel/python');
const pub = Array.from(pkgs).join(',');
console.log('To publish a stable release, execute the following:');