mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-11 04:22:13 +00:00
Compare commits
24 Commits
@vercel/fr
...
@vercel/py
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c0055eaf0 | ||
|
|
910a905192 | ||
|
|
156a9be06e | ||
|
|
e2132ee36d | ||
|
|
4572230c1d | ||
|
|
8cfac4cf86 | ||
|
|
4f20783000 | ||
|
|
968b7c3fb5 | ||
|
|
407c4ec5f4 | ||
|
|
bcf393d125 | ||
|
|
115ae0a229 | ||
|
|
d149489c9e | ||
|
|
5b2e6052fc | ||
|
|
38cb5a3b99 | ||
|
|
84e828a0ca | ||
|
|
157ce5346d | ||
|
|
0256157391 | ||
|
|
a45b3d0982 | ||
|
|
26af6dbc03 | ||
|
|
38130103a0 | ||
|
|
978485818a | ||
|
|
0270784cbb | ||
|
|
345e514924 | ||
|
|
df62ec6ed0 |
2
.github/workflows/test-integration-cli.yml
vendored
2
.github/workflows/test-integration-cli.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/test-integration-dev.yml
vendored
2
.github/workflows/test-integration-dev.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/test-unit.yml
vendored
2
.github/workflows/test-unit.yml
vendored
@@ -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
|
||||
|
||||
5
examples/jekyll/.gitignore
vendored
5
examples/jekyll/.gitignore
vendored
@@ -1,6 +1,9 @@
|
||||
_site
|
||||
public
|
||||
.sass-cache
|
||||
.jekyll-cache
|
||||
.jekyll-metadata
|
||||
vendor
|
||||
public
|
||||
.env
|
||||
.env.build
|
||||
.vercel
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
README.md
|
||||
yarn.lock
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
permalink: /404.html
|
||||
layout: default
|
||||
---
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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
|
||||
---
|
||||
|
||||
You’ll 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 [Jekyll’s 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/
|
||||
1
examples/middleman/.gitignore
vendored
1
examples/middleman/.gitignore
vendored
@@ -3,3 +3,4 @@
|
||||
.DS_Store
|
||||
.sass-cache
|
||||
build/
|
||||
.vercel
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
README.md
|
||||
yarn.lock
|
||||
@@ -1,2 +1 @@
|
||||
README.md
|
||||
build
|
||||
@@ -13,6 +13,6 @@
|
||||
"nuxt": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^1.18.9"
|
||||
"nodemon": "^2.0.7"
|
||||
}
|
||||
}
|
||||
|
||||
8116
examples/nuxtjs/yarn.lock
Normal file
8116
examples/nuxtjs/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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}`
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
1
packages/now-build-utils/test/symlinks/dir/b.txt
Normal file
1
packages/now-build-utils/test/symlinks/dir/b.txt
Normal file
@@ -0,0 +1 @@
|
||||
contents
|
||||
1
packages/now-build-utils/test/symlinks/link-dir
Symbolic link
1
packages/now-build-utils/test/symlinks/link-dir
Symbolic link
@@ -0,0 +1 @@
|
||||
dir
|
||||
@@ -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'];
|
||||
|
||||
|
||||
60
packages/now-build-utils/test/unit.test.js
vendored
60
packages/now-build-utils/test/unit.test.js
vendored
@@ -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');
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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}`);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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),
|
||||
|
||||
11
packages/now-cli/test/integration.js
vendored
11
packages/now-cli/test/integration.js
vendored
@@ -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']);
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
import { downloadGo } from './go-helpers';
|
||||
|
||||
downloadGo().catch(err => {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -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"
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
11
packages/now-go/test/fixtures/01-cowsay/now.json
vendored
11
packages/now-go/test/fixtures/01-cowsay/now.json
vendored
@@ -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" }
|
||||
]
|
||||
}
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
14
packages/now-go/test/fixtures/01-cowsay/vercel.json
vendored
Normal file
14
packages/now-go/test/fixtures/01-cowsay/vercel.json
vendored
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
module go-mod
|
||||
|
||||
go 1.12
|
||||
go 1.15
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "index.go", "use": "@vercel/go" }],
|
||||
"probes": [{ "path": "/", "mustContain": "RANDOMNESS_PLACEHOLDER" }]
|
||||
}
|
||||
7
packages/now-go/test/fixtures/10-go-mod/vercel.json
vendored
Normal file
7
packages/now-go/test/fixtures/10-go-mod/vercel.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "index.go", "use": "@vercel/go" }],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "version:go1.15.8:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module with-shared
|
||||
|
||||
go 1.12
|
||||
go 1.13
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "api/*.go", "use": "@vercel/go" }],
|
||||
"probes": [{ "path": "/api", "mustContain": "RANDOMNESS_PLACEHOLDER" }]
|
||||
}
|
||||
10
packages/now-go/test/fixtures/11-go-mod-shared/vercel.json
vendored
Normal file
10
packages/now-go/test/fixtures/11-go-mod-shared/vercel.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "api/*.go", "use": "@vercel/go" }],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/api",
|
||||
"mustContain": "version:go1.13.15:RANDOMNESS_PLACEHOLDER"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
module custom-flag
|
||||
|
||||
go 1.12
|
||||
go 1.14
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -13,6 +13,6 @@
|
||||
"noImplicitThis": false,
|
||||
"types": ["node"],
|
||||
"strict": true,
|
||||
"target": "esnext"
|
||||
"target": "es2018"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
6
utils/changelog.js
vendored
@@ -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:');
|
||||
|
||||
Reference in New Issue
Block a user