mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-24 19:00:03 +00:00
Compare commits
20 Commits
@vercel/no
...
@vercel/ne
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31f79c7de1 | ||
|
|
4c230c8436 | ||
|
|
7941f5a104 | ||
|
|
5b931afbf3 | ||
|
|
15080364b8 | ||
|
|
47e3381c6d | ||
|
|
33aefdc029 | ||
|
|
30fe76a0cf | ||
|
|
97ef88dc28 | ||
|
|
f679098d7a | ||
|
|
2b57e12ad3 | ||
|
|
c4e94ad03f | ||
|
|
32afd67d29 | ||
|
|
7523e39f18 | ||
|
|
99f2f2f1ba | ||
|
|
63830d38ce | ||
|
|
f3428dd212 | ||
|
|
5eb8b16cbd | ||
|
|
226bf02be2 | ||
|
|
8505872f55 |
@@ -35,6 +35,6 @@ For details on how to use Vercel, check out our [documentation](https://vercel.c
|
||||
|
||||
## Contributing
|
||||
|
||||
- [Code of Conduct](https://github.com/vercel/vercel/blob/main/.github/CODE_OF_CONDUCT.md)
|
||||
- [Contributing Guidelines](https://github.com/vercel/vercel/blob/main/.github/CONTRIBUTING.md)
|
||||
- [MIT License](https://github.com/vercel/vercel/blob/main/LICENSE)
|
||||
- [Code of Conduct](./.github/CODE_OF_CONDUCT.md)
|
||||
- [Contributing Guidelines](./.github/CONTRIBUTING.md)
|
||||
- [MIT License](./LICENSE)
|
||||
|
||||
1
examples/astro/.gitignore
vendored
1
examples/astro/.gitignore
vendored
@@ -18,3 +18,4 @@ pnpm-debug.log*
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
.vercel
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
README.md
|
||||
@@ -1,10 +1,16 @@
|
||||
# Welcome to [Astro](https://astro.build)
|
||||
# Astro
|
||||
|
||||
[](https://stackblitz.com/github/withastro/astro/tree/latest/examples/starter)
|
||||
This directory is a brief example of an [Astro](https://astro.build/) site that can be deployed to Vercel with zero configuration.
|
||||
|
||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||
## Deploy Your Own
|
||||
|
||||
## 🚀 Project Structure
|
||||
Deploy your own Astro project with Vercel.
|
||||
|
||||
[](https://vercel.com/new/clone?repository-url=https://github.com/vercel/vercel/tree/main/examples/astro&template=astro)
|
||||
|
||||
_Live Example: https://astro-template.vercel.app_
|
||||
|
||||
## Project Structure
|
||||
|
||||
Inside of your Astro project, you'll see the following folders and files:
|
||||
|
||||
@@ -26,17 +32,15 @@ There's nothing special about `src/components/`, but that's where we like to put
|
||||
|
||||
Any static assets, like images, can be placed in the `public/` directory.
|
||||
|
||||
## 🧞 Commands
|
||||
## Commands
|
||||
|
||||
All commands are run from the root of the project, from a terminal:
|
||||
|
||||
| Command | Action |
|
||||
| :---------------- | :------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:3000` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
|
||||
## 👀 Want to learn more?
|
||||
|
||||
Feel free to check [our documentation](https://github.com/withastro/astro) or jump into our [Discord server](https://astro.build/chat).
|
||||
| Command | Action |
|
||||
| :--------------------- | :------------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:3000` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
|
||||
| `npm run astro --help` | Get help using the Astro CLI |
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
{
|
||||
"name": "@example/basics",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"start": "astro dev",
|
||||
"build": "astro build",
|
||||
"preview": "astro preview"
|
||||
"preview": "astro preview",
|
||||
"astro": "astro"
|
||||
},
|
||||
"devDependencies": {
|
||||
"astro": "^1.0.0-beta.20"
|
||||
"astro": "^1.0.0-rc.8"
|
||||
}
|
||||
}
|
||||
|
||||
76
examples/astro/src/components/Card.astro
Normal file
76
examples/astro/src/components/Card.astro
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
export interface Props {
|
||||
title: string;
|
||||
body: string;
|
||||
href: string;
|
||||
}
|
||||
|
||||
const { href, title, body } = Astro.props as Props;
|
||||
---
|
||||
|
||||
<li class="link-card">
|
||||
<a href={href}>
|
||||
<h2>
|
||||
{title}
|
||||
<span>→</span>
|
||||
</h2>
|
||||
<p>
|
||||
{body}
|
||||
</p>
|
||||
</a>
|
||||
</li>
|
||||
<style>
|
||||
:root {
|
||||
--link-gradient: linear-gradient(45deg, #4f39fa, #da62c4 30%, var(--color-border) 60%);
|
||||
}
|
||||
|
||||
.link-card {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
padding: 0.15rem;
|
||||
background-image: var(--link-gradient);
|
||||
background-size: 400%;
|
||||
border-radius: 0.5rem;
|
||||
background-position: 100%;
|
||||
transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
}
|
||||
|
||||
.link-card > a {
|
||||
width: 100%;
|
||||
text-decoration: none;
|
||||
line-height: 1.4;
|
||||
padding: 1em 1.3em;
|
||||
border-radius: 0.35rem;
|
||||
color: var(--text-color);
|
||||
background-color: white;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 0;
|
||||
transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.75rem;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
h2 span {
|
||||
display: inline-block;
|
||||
transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
}
|
||||
|
||||
.link-card:is(:hover, :focus-within) {
|
||||
background-position: 0;
|
||||
}
|
||||
|
||||
.link-card:is(:hover, :focus-within) h2 {
|
||||
color: #4f39fa;
|
||||
}
|
||||
|
||||
.link-card:is(:hover, :focus-within) h2 span {
|
||||
will-change: transform;
|
||||
transform: translateX(2px);
|
||||
}
|
||||
</style>
|
||||
@@ -1,55 +0,0 @@
|
||||
---
|
||||
export interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props as Props;
|
||||
---
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
<title>{title}</title>
|
||||
</head>
|
||||
<body>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--font-size-base: clamp(1rem, 0.34vw + 0.91rem, 1.19rem);
|
||||
--font-size-lg: clamp(1.2rem, 0.7vw + 1.2rem, 1.5rem);
|
||||
--font-size-xl: clamp(2.44rem, 2.38vw + 1.85rem, 3.75rem);
|
||||
|
||||
--color-text: hsl(12, 5%, 4%);
|
||||
--color-bg: hsl(10, 21%, 95%);
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: system-ui, sans-serif;
|
||||
font-size: var(--font-size-base);
|
||||
color: var(--color-text);
|
||||
background-color: var(--color-bg);
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
:global(h1) {
|
||||
font-size: var(--font-size-xl);
|
||||
}
|
||||
|
||||
:global(h2) {
|
||||
font-size: var(--font-size-lg);
|
||||
}
|
||||
|
||||
:global(code) {
|
||||
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
|
||||
Bitstream Vera Sans Mono, Courier New, monospace;
|
||||
}
|
||||
</style>
|
||||
1
examples/astro/src/env.d.ts
vendored
Normal file
1
examples/astro/src/env.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/// <reference types="astro/client" />
|
||||
56
examples/astro/src/layouts/Layout.astro
Normal file
56
examples/astro/src/layouts/Layout.astro
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
export interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props as Props;
|
||||
---
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<title>{title}</title>
|
||||
</head>
|
||||
<body>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
||||
<style>
|
||||
:root {
|
||||
--font-size-base: clamp(1rem, 0.34vw + 0.91rem, 1.19rem);
|
||||
--font-size-lg: clamp(1.2rem, 0.7vw + 1.2rem, 1.5rem);
|
||||
--font-size-xl: clamp(2.44rem, 2.38vw + 1.85rem, 3.75rem);
|
||||
|
||||
--color-text: hsl(12, 5%, 4%);
|
||||
--color-bg: hsl(10, 21%, 95%);
|
||||
--color-border: hsl(17, 24%, 90%);
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: system-ui, sans-serif;
|
||||
font-size: var(--font-size-base);
|
||||
color: var(--color-text);
|
||||
background-color: var(--color-bg);
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
:global(h1) {
|
||||
font-size: var(--font-size-xl);
|
||||
}
|
||||
|
||||
:global(h2) {
|
||||
font-size: var(--font-size-lg);
|
||||
}
|
||||
|
||||
:global(code) {
|
||||
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
|
||||
Bitstream Vera Sans Mono, Courier New, monospace;
|
||||
}
|
||||
</style>
|
||||
@@ -1,81 +1,52 @@
|
||||
---
|
||||
import Layout from '../components/Layout.astro';
|
||||
import Layout from '../layouts/Layout.astro';
|
||||
import Card from '../components/Card.astro';
|
||||
---
|
||||
|
||||
<Layout title="Welcome to Astro.">
|
||||
<main>
|
||||
<h1>Welcome to <span class="text-gradient">Astro</span></h1>
|
||||
<p class="instructions"><strong>Your first mission:</strong> tweak this message to try our hot module reloading. Check the <code>src/pages</code> directory!</p>
|
||||
<p class="instructions">
|
||||
Check out the <code>src/pages</code> directory to get started.<br />
|
||||
<strong>Code Challenge:</strong> Tweak the "Welcome to Astro" message above.
|
||||
</p>
|
||||
<ul role="list" class="link-card-grid">
|
||||
<li class="link-card">
|
||||
<a href="https://astro.build/integrations/">
|
||||
<h2>Integrations <span>→</span></h2>
|
||||
<p>Add component frameworks, Tailwind, Partytown, and more!</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="link-card">
|
||||
<a href="https://astro.build/themes/">
|
||||
<h2>Themes <span>→</span></h2>
|
||||
<p>Explore a galaxy of community-built starters.</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="link-card">
|
||||
<a href="https://docs.astro.build/">
|
||||
<h2>Docs <span>→</span></h2>
|
||||
<p>Learn our complete feature set and explore the API.</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="link-card">
|
||||
<a href="https://astro.build/chat/">
|
||||
<h2>Chat <span>→</span></h2>
|
||||
<p>
|
||||
Ask, contribute, and have fun on our community Discord
|
||||
<svg
|
||||
class="heart"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 512 512"
|
||||
width="16"
|
||||
height="16"
|
||||
fill="currentColor"
|
||||
>
|
||||
<title>heart</title>
|
||||
<path d="M256 448l-30.164-27.211C118.718 322.442 48 258.61 48 179.095 48 114.221 97.918 64 162.4 64c36.399 0 70.717 16.742 93.6 43.947C278.882 80.742 313.199 64 349.6 64 414.082 64 464 114.221 464 179.095c0 79.516-70.719 143.348-177.836 241.694L256 448z" />
|
||||
</svg>
|
||||
</p>
|
||||
</a>
|
||||
</li>
|
||||
<Card
|
||||
href="https://docs.astro.build/"
|
||||
title="Documentation"
|
||||
body="Learn how Astro works and explore the official API docs."
|
||||
/>
|
||||
<Card
|
||||
href="https://astro.build/integrations/"
|
||||
title="Integrations"
|
||||
body="Supercharge your project with new frameworks and libraries."
|
||||
/>
|
||||
<Card
|
||||
href="https://astro.build/themes/"
|
||||
title="Themes"
|
||||
body="Explore a galaxy of community-built starter themes."
|
||||
/>
|
||||
<Card
|
||||
href="https://astro.build/chat/"
|
||||
title="Chat"
|
||||
body="Come say hi to our amazing Discord community. ❤️"
|
||||
/>
|
||||
</ul>
|
||||
</main>
|
||||
</Layout>
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--color-border: hsl(17, 24%, 90%);
|
||||
--astro-gradient: linear-gradient(0deg,#4F39FA, #DA62C4);
|
||||
--link-gradient: linear-gradient(45deg, #4F39FA, #DA62C4 30%, var(--color-border) 60%);
|
||||
--night-sky-gradient: linear-gradient(0deg, #392362 -33%, #431f69 10%, #30216b 50%, #1f1638 100%);
|
||||
--astro-gradient: linear-gradient(0deg, #4f39fa, #da62c4);
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 0;
|
||||
transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
}
|
||||
|
||||
h2 span {
|
||||
display: inline-block;
|
||||
transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
border: 0.1em solid var(--color-border);
|
||||
border-radius: 4px;
|
||||
padding: 0.15em 0.25em;
|
||||
h1 {
|
||||
margin: 2rem 0;
|
||||
}
|
||||
|
||||
main {
|
||||
margin: auto;
|
||||
padding: 1em;
|
||||
padding: 1em;
|
||||
max-width: 60ch;
|
||||
}
|
||||
|
||||
@@ -83,7 +54,7 @@ import Layout from '../components/Layout.astro';
|
||||
font-weight: 900;
|
||||
background-image: var(--astro-gradient);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-size: 100% 200%;
|
||||
background-position-y: 100%;
|
||||
border-radius: 0.4rem;
|
||||
@@ -91,7 +62,8 @@ import Layout from '../components/Layout.astro';
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% {
|
||||
0%,
|
||||
100% {
|
||||
background-position-y: 0%;
|
||||
}
|
||||
50% {
|
||||
@@ -100,75 +72,25 @@ import Layout from '../components/Layout.astro';
|
||||
}
|
||||
|
||||
.instructions {
|
||||
line-height: 1.8;
|
||||
margin-bottom: 2rem;
|
||||
background-image: var(--night-sky-gradient);
|
||||
padding: 1.5rem;
|
||||
line-height: 1.6;
|
||||
margin: 1rem 0;
|
||||
background: #4f39fa;
|
||||
padding: 1rem;
|
||||
border-radius: 0.4rem;
|
||||
color: var(--color-bg);
|
||||
}
|
||||
|
||||
.instructions code {
|
||||
font-size: 0.875em;
|
||||
border: 0.1em solid var(--color-border);
|
||||
border-radius: 4px;
|
||||
padding: 0.15em 0.25em;
|
||||
}
|
||||
|
||||
.link-card-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(24ch, 1fr));
|
||||
gap: 1rem;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.link-card {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
padding: 0.15rem;
|
||||
background-image: var(--link-gradient);
|
||||
background-size: 400%;
|
||||
border-radius: 0.5rem;
|
||||
background-position: 100%;
|
||||
transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
}
|
||||
|
||||
.link-card > a {
|
||||
width: 100%;
|
||||
text-decoration: none;
|
||||
line-height: 1.4;
|
||||
padding: 1em 1.3em;
|
||||
border-radius: 0.35rem;
|
||||
color: var(--text-color);
|
||||
background-color: white;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.link-card:is(:hover, :focus-within) {
|
||||
background-position: 0;
|
||||
}
|
||||
|
||||
.link-card:is(:hover, :focus-within) h2 {
|
||||
color: #4F39FA;
|
||||
}
|
||||
|
||||
.link-card:is(:hover, :focus-within) h2 span {
|
||||
transform: translateX(2px);
|
||||
}
|
||||
|
||||
.heart {
|
||||
display: inline-block;
|
||||
color: #DA62C4;
|
||||
animation: heartbeat 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes heartbeat {
|
||||
0%,
|
||||
50%,
|
||||
100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
5% {
|
||||
transform: scale(1.125);
|
||||
}
|
||||
10% {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
15% {
|
||||
transform: scale(1.25);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
// Enable top-level await, and other modern ESM features.
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
// Enable node-style module resolution, for things like npm package imports.
|
||||
"moduleResolution": "node",
|
||||
// Enable JSON imports.
|
||||
"resolveJsonModule": true,
|
||||
// Enable stricter transpilation for better output.
|
||||
"isolatedModules": true,
|
||||
// Add type definitions for our Vite runtime.
|
||||
"types": ["vite/client"]
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/build-utils",
|
||||
"version": "5.1.0",
|
||||
"version": "5.3.0",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.js",
|
||||
@@ -14,8 +14,7 @@
|
||||
"build": "node build",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "yarn test test/unit.*test.*",
|
||||
"test-integration-once": "yarn test test/integration.test.ts",
|
||||
"prepublishOnly": "node build"
|
||||
"test-integration-once": "yarn test test/integration.test.ts"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iarna/toml": "2.2.3",
|
||||
|
||||
@@ -10,7 +10,7 @@ const allOptions = [
|
||||
major: 12,
|
||||
range: '12.x',
|
||||
runtime: 'nodejs12.x',
|
||||
discontinueDate: new Date('2022-08-09'),
|
||||
discontinueDate: new Date('2022-10-01'),
|
||||
},
|
||||
{
|
||||
major: 10,
|
||||
|
||||
32
packages/build-utils/src/get-prefixed-env-vars.ts
Normal file
32
packages/build-utils/src/get-prefixed-env-vars.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
type Envs = { [key: string]: string | undefined };
|
||||
|
||||
/**
|
||||
* Get the framework-specific prefixed System Environment Variables.
|
||||
* See https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables
|
||||
* @param envPrefix - Prefix, typically from `@vercel/frameworks`
|
||||
* @param envs - Environment Variables, typically from `process.env`
|
||||
*/
|
||||
export function getPrefixedEnvVars({
|
||||
envPrefix,
|
||||
envs,
|
||||
}: {
|
||||
envPrefix: string | undefined;
|
||||
envs: Envs;
|
||||
}): Envs {
|
||||
const vercelSystemEnvPrefix = 'VERCEL_';
|
||||
const newEnvs: Envs = {};
|
||||
if (envPrefix && envs.VERCEL_URL) {
|
||||
Object.keys(envs)
|
||||
.filter(key => key.startsWith(vercelSystemEnvPrefix))
|
||||
.forEach(key => {
|
||||
const newKey = `${envPrefix}${key}`;
|
||||
if (!(newKey in envs)) {
|
||||
newEnvs[newKey] = envs[key];
|
||||
}
|
||||
});
|
||||
// Tell turbo to exclude all Vercel System Env Vars
|
||||
// See https://github.com/vercel/turborepo/pull/1622
|
||||
newEnvs.TURBO_CI_VENDOR_ENV_KEY = `${envPrefix}${vercelSystemEnvPrefix}`;
|
||||
}
|
||||
return newEnvs;
|
||||
}
|
||||
@@ -40,6 +40,7 @@ import streamToBuffer from './fs/stream-to-buffer';
|
||||
import debug from './debug';
|
||||
import getIgnoreFilter from './get-ignore-filter';
|
||||
import { getPlatformEnv } from './get-platform-env';
|
||||
import { getPrefixedEnvVars } from './get-prefixed-env-vars';
|
||||
|
||||
export {
|
||||
FileBlob,
|
||||
@@ -76,6 +77,7 @@ export {
|
||||
getDiscontinuedNodeVersions,
|
||||
getSpawnOptions,
|
||||
getPlatformEnv,
|
||||
getPrefixedEnvVars,
|
||||
streamToBuffer,
|
||||
debug,
|
||||
isSymbolicLink,
|
||||
|
||||
@@ -22,6 +22,7 @@ export interface LambdaOptionsBase {
|
||||
allowQuery?: string[];
|
||||
regions?: string[];
|
||||
supportsMultiPayloads?: boolean;
|
||||
supportsWrapper?: boolean;
|
||||
}
|
||||
|
||||
export interface LambdaOptionsWithFiles extends LambdaOptionsBase {
|
||||
@@ -58,6 +59,7 @@ export class Lambda {
|
||||
*/
|
||||
zipBuffer?: Buffer;
|
||||
supportsMultiPayloads?: boolean;
|
||||
supportsWrapper?: boolean;
|
||||
|
||||
constructor(opts: LambdaOptions) {
|
||||
const {
|
||||
@@ -69,6 +71,7 @@ export class Lambda {
|
||||
allowQuery,
|
||||
regions,
|
||||
supportsMultiPayloads,
|
||||
supportsWrapper,
|
||||
} = opts;
|
||||
if ('files' in opts) {
|
||||
assert(typeof opts.files === 'object', '"files" must be an object');
|
||||
@@ -103,6 +106,13 @@ export class Lambda {
|
||||
);
|
||||
}
|
||||
|
||||
if (supportsWrapper !== undefined) {
|
||||
assert(
|
||||
typeof supportsWrapper === 'boolean',
|
||||
'"supportsWrapper" is not a boolean'
|
||||
);
|
||||
}
|
||||
|
||||
if (regions !== undefined) {
|
||||
assert(Array.isArray(regions), '"regions" is not an Array');
|
||||
assert(
|
||||
@@ -121,6 +131,7 @@ export class Lambda {
|
||||
this.regions = regions;
|
||||
this.zipBuffer = 'zipBuffer' in opts ? opts.zipBuffer : undefined;
|
||||
this.supportsMultiPayloads = supportsMultiPayloads;
|
||||
this.supportsWrapper = supportsWrapper;
|
||||
}
|
||||
|
||||
async createZip(): Promise<Buffer> {
|
||||
|
||||
87
packages/build-utils/test/unit.get-prefixed-env-vars.test.ts
vendored
Normal file
87
packages/build-utils/test/unit.get-prefixed-env-vars.test.ts
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
import { getPrefixedEnvVars } from '../src';
|
||||
|
||||
describe('Test `getPrefixedEnvVars()`', () => {
|
||||
const cases: Array<{
|
||||
name: string;
|
||||
args: Parameters<typeof getPrefixedEnvVars>[0];
|
||||
want: ReturnType<typeof getPrefixedEnvVars>;
|
||||
}> = [
|
||||
{
|
||||
name: 'should work with NEXT_PUBLIC_',
|
||||
args: {
|
||||
envPrefix: 'NEXT_PUBLIC_',
|
||||
envs: {
|
||||
VERCEL: '1',
|
||||
VERCEL_URL: 'example.vercel.sh',
|
||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||
FOO: 'bar',
|
||||
},
|
||||
},
|
||||
want: {
|
||||
NEXT_PUBLIC_VERCEL_URL: 'example.vercel.sh',
|
||||
TURBO_CI_VENDOR_ENV_KEY: 'NEXT_PUBLIC_VERCEL_',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'should work with GATSBY_',
|
||||
args: {
|
||||
envPrefix: 'GATSBY_',
|
||||
envs: {
|
||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||
FOO: 'bar',
|
||||
VERCEL_URL: 'example.vercel.sh',
|
||||
VERCEL_ENV: 'production',
|
||||
VERCEL_REGION: 'iad1',
|
||||
VERCEL_GIT_COMMIT_AUTHOR_LOGIN: 'rauchg',
|
||||
},
|
||||
},
|
||||
want: {
|
||||
GATSBY_VERCEL_URL: 'example.vercel.sh',
|
||||
GATSBY_VERCEL_ENV: 'production',
|
||||
GATSBY_VERCEL_REGION: 'iad1',
|
||||
GATSBY_VERCEL_GIT_COMMIT_AUTHOR_LOGIN: 'rauchg',
|
||||
TURBO_CI_VENDOR_ENV_KEY: 'GATSBY_VERCEL_',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'should not return anything if no system env vars detected',
|
||||
args: {
|
||||
envPrefix: 'GATSBY_',
|
||||
envs: {
|
||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||
FOO: 'bar',
|
||||
BLARG_VERCEL_THING: 'fake',
|
||||
},
|
||||
},
|
||||
want: {},
|
||||
},
|
||||
{
|
||||
name: 'should not return anything if envPrefix is empty string',
|
||||
args: {
|
||||
envPrefix: '',
|
||||
envs: {
|
||||
VERCEL: '1',
|
||||
VERCEL_URL: 'example.vercel.sh',
|
||||
},
|
||||
},
|
||||
want: {},
|
||||
},
|
||||
{
|
||||
name: 'should not return anything if envPrefix is undefined',
|
||||
args: {
|
||||
envPrefix: undefined,
|
||||
envs: {
|
||||
VERCEL: '1',
|
||||
VERCEL_URL: 'example.vercel.sh',
|
||||
},
|
||||
},
|
||||
want: {},
|
||||
},
|
||||
];
|
||||
|
||||
for (const { name, args, want } of cases) {
|
||||
it(name, () => {
|
||||
expect(getPrefixedEnvVars(args)).toEqual(want);
|
||||
});
|
||||
}
|
||||
});
|
||||
6
packages/build-utils/test/unit.test.ts
vendored
6
packages/build-utils/test/unit.test.ts
vendored
@@ -394,7 +394,7 @@ it('should get latest node version', async () => {
|
||||
it('should throw for discontinued versions', async () => {
|
||||
// Mock a future date so that Node 8 and 10 become discontinued
|
||||
const realDateNow = Date.now.bind(global.Date);
|
||||
global.Date.now = () => new Date('2022-09-01').getTime();
|
||||
global.Date.now = () => new Date('2022-10-15').getTime();
|
||||
|
||||
expect(getSupportedNodeVersion('8.10.x', false)).rejects.toThrow();
|
||||
expect(getSupportedNodeVersion('8.10.x', true)).rejects.toThrow();
|
||||
@@ -436,8 +436,8 @@ it('should warn for deprecated versions, soon to be discontinued', async () => {
|
||||
expect(warningMessages).toStrictEqual([
|
||||
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
|
||||
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
|
||||
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-08-09 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
|
||||
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-08-09 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
|
||||
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-01 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
|
||||
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-01 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
|
||||
]);
|
||||
|
||||
global.Date.now = realDateNow;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vercel",
|
||||
"version": "27.3.5",
|
||||
"version": "27.4.0",
|
||||
"preferGlobal": true,
|
||||
"license": "Apache-2.0",
|
||||
"description": "The command-line interface for Vercel",
|
||||
@@ -16,7 +16,6 @@
|
||||
"test-unit": "yarn test test/unit/",
|
||||
"test-integration-cli": "rimraf test/fixtures/integration && ava test/integration.js --serial --fail-fast --verbose",
|
||||
"test-integration-dev": "yarn test test/dev/",
|
||||
"prepublishOnly": "yarn build",
|
||||
"coverage": "codecov",
|
||||
"build": "ts-node ./scripts/build.ts",
|
||||
"dev": "ts-node ./src/index.ts"
|
||||
@@ -42,16 +41,16 @@
|
||||
"node": ">= 14"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/go": "2.0.13",
|
||||
"@vercel/hydrogen": "0.0.10",
|
||||
"@vercel/next": "3.1.13",
|
||||
"@vercel/node": "2.5.4",
|
||||
"@vercel/python": "3.1.5",
|
||||
"@vercel/redwood": "1.0.14",
|
||||
"@vercel/remix": "1.0.15",
|
||||
"@vercel/ruby": "1.3.21",
|
||||
"@vercel/static-build": "1.0.14",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/go": "2.1.0",
|
||||
"@vercel/hydrogen": "0.0.13",
|
||||
"@vercel/next": "3.1.17",
|
||||
"@vercel/node": "2.5.7",
|
||||
"@vercel/python": "3.1.8",
|
||||
"@vercel/redwood": "1.0.17",
|
||||
"@vercel/remix": "1.0.18",
|
||||
"@vercel/ruby": "1.3.24",
|
||||
"@vercel/static-build": "1.0.17",
|
||||
"update-notifier": "5.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -97,9 +96,9 @@
|
||||
"@types/which": "1.3.2",
|
||||
"@types/write-json-file": "2.2.1",
|
||||
"@types/yauzl-promise": "2.1.0",
|
||||
"@vercel/client": "12.1.8",
|
||||
"@vercel/frameworks": "1.1.1",
|
||||
"@vercel/fs-detectors": "2.0.3",
|
||||
"@vercel/client": "12.1.11",
|
||||
"@vercel/frameworks": "1.1.3",
|
||||
"@vercel/fs-detectors": "2.0.5",
|
||||
"@vercel/fun": "1.0.4",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"@zeit/source-map-support": "0.6.2",
|
||||
|
||||
@@ -37,6 +37,7 @@ const help = () => {
|
||||
)} Login token
|
||||
-S, --scope Set a custom scope
|
||||
-N, --next Show next page of results
|
||||
-y, --yes Skip the confirmation prompt when removing an alias
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ const help = () => {
|
||||
--output [path] Directory where built assets should be written to
|
||||
--prod Build a production deployment
|
||||
-d, --debug Debug mode [off]
|
||||
-y, --yes Skip the confirmation prompt
|
||||
-y, --yes Pull environment variables and project settings if not found locally
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
@@ -157,7 +157,7 @@ export default async function main(client: Client): Promise<number> {
|
||||
client.output.print(
|
||||
`No Project Settings found locally. Run ${cli.getCommandName(
|
||||
'pull --yes'
|
||||
)} to retreive them.`
|
||||
)} to retrieve them.`
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ export const help = () => `
|
||||
-S, --scope Set a custom scope
|
||||
--regions Set default regions to enable the deployment on
|
||||
--prod Create a production deployment
|
||||
-c, --confirm Confirm default options and skip questions
|
||||
-y, --yes Skip questions when setting up new project using default scope and settings
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
|
||||
@@ -87,20 +87,27 @@ export default async (client: Client) => {
|
||||
'--regions': String,
|
||||
'--prebuilt': Boolean,
|
||||
'--prod': Boolean,
|
||||
'--confirm': Boolean,
|
||||
'--yes': Boolean,
|
||||
'-f': '--force',
|
||||
'-p': '--public',
|
||||
'-e': '--env',
|
||||
'-b': '--build-env',
|
||||
'-m': '--meta',
|
||||
'-c': '--confirm',
|
||||
'-y': '--yes',
|
||||
|
||||
// deprecated
|
||||
'--name': String,
|
||||
'-n': '--name',
|
||||
'--no-clipboard': Boolean,
|
||||
'--target': String,
|
||||
'--confirm': Boolean,
|
||||
'-c': '--confirm',
|
||||
});
|
||||
|
||||
if ('--confirm' in argv) {
|
||||
output.warn('`--confirm` is deprecated, please use `--yes` instead');
|
||||
argv['--yes'] = argv['--confirm'];
|
||||
}
|
||||
} catch (error) {
|
||||
handleError(error);
|
||||
return 1;
|
||||
@@ -173,7 +180,7 @@ export default async (client: Client) => {
|
||||
}
|
||||
|
||||
const { path } = pathValidation;
|
||||
const autoConfirm = argv['--confirm'];
|
||||
const autoConfirm = argv['--yes'];
|
||||
|
||||
// deprecate --name
|
||||
if (argv['--name']) {
|
||||
|
||||
@@ -17,7 +17,7 @@ import { OUTPUT_DIR } from '../../util/build/write-build-result';
|
||||
|
||||
type Options = {
|
||||
'--listen': string;
|
||||
'--confirm': boolean;
|
||||
'--yes': boolean;
|
||||
};
|
||||
|
||||
export default async function dev(
|
||||
@@ -38,7 +38,7 @@ export default async function dev(
|
||||
|
||||
if (link.status === 'not_linked' && !process.env.__VERCEL_SKIP_DEV_CMD) {
|
||||
link = await setupAndLink(client, cwd, {
|
||||
autoConfirm: opts['--confirm'],
|
||||
autoConfirm: opts['--yes'],
|
||||
successEmoji: 'link',
|
||||
setupMsg: 'Set up and develop',
|
||||
});
|
||||
@@ -54,14 +54,13 @@ export default async function dev(
|
||||
client.output.error(
|
||||
`Command ${getCommandName(
|
||||
'dev'
|
||||
)} requires confirmation. Use option ${param('--confirm')} to confirm.`
|
||||
)} requires confirmation. Use option ${param('--yes')} to confirm.`
|
||||
);
|
||||
}
|
||||
return link.exitCode;
|
||||
}
|
||||
|
||||
let devCommand: string | undefined;
|
||||
let frameworkSlug: string | undefined;
|
||||
let projectSettings: ProjectSettings | undefined;
|
||||
let projectEnvs: ProjectEnvVariable[] = [];
|
||||
let systemEnvValues: string[] = [];
|
||||
@@ -77,10 +76,6 @@ export default async function dev(
|
||||
const framework = frameworks.find(f => f.slug === project.framework);
|
||||
|
||||
if (framework) {
|
||||
if (framework.slug) {
|
||||
frameworkSlug = framework.slug;
|
||||
}
|
||||
|
||||
const defaults = framework.settings.devCommand.value;
|
||||
if (defaults) {
|
||||
devCommand = defaults;
|
||||
@@ -120,7 +115,6 @@ export default async function dev(
|
||||
const devServer = new DevServer(cwd, {
|
||||
output,
|
||||
devCommand,
|
||||
frameworkSlug,
|
||||
projectSettings,
|
||||
projectEnvs,
|
||||
systemEnvValues,
|
||||
|
||||
@@ -33,7 +33,7 @@ const help = () => {
|
||||
-d, --debug Debug mode [off]
|
||||
-l, --listen [uri] Specify a URI endpoint on which to listen [0.0.0.0:3000]
|
||||
-t, --token [token] Specify an Authorization Token
|
||||
--confirm Skip questions and use defaults when setting up a new project
|
||||
-y, --yes Skip questions when setting up new project using default scope and settings
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
@@ -74,14 +74,22 @@ export default async function main(client: Client) {
|
||||
argv = getArgs(client.argv.slice(2), {
|
||||
'--listen': String,
|
||||
'-l': '--listen',
|
||||
'--confirm': Boolean,
|
||||
'--yes': Boolean,
|
||||
'-y': '--yes',
|
||||
|
||||
// Deprecated
|
||||
'--port': Number,
|
||||
'-p': '--port',
|
||||
'--confirm': Boolean,
|
||||
'-c': '--confirm',
|
||||
});
|
||||
args = getSubcommand(argv._.slice(1), COMMAND_CONFIG).args;
|
||||
|
||||
if ('--confirm' in argv) {
|
||||
output.warn('`--confirm` is deprecated, please use `--yes` instead');
|
||||
argv['--yes'] = argv['--confirm'];
|
||||
}
|
||||
|
||||
if ('--port' in argv) {
|
||||
output.warn('`--port` is deprecated, please use `--listen` instead');
|
||||
argv['--listen'] = String(argv['--port']);
|
||||
|
||||
@@ -45,6 +45,7 @@ const help = () => {
|
||||
)} Login token
|
||||
-S, --scope Set a custom scope
|
||||
-N, --next Show next page of results
|
||||
-y, --yes Skip the confirmation prompt when removing a domain
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
@@ -92,6 +93,7 @@ export default async function main(client: Client) {
|
||||
'--force': Boolean,
|
||||
'--next': Number,
|
||||
'-N': '--next',
|
||||
'-y': '--yes',
|
||||
});
|
||||
} catch (error) {
|
||||
handleError(error);
|
||||
|
||||
1
packages/cli/src/commands/env/index.ts
vendored
1
packages/cli/src/commands/env/index.ts
vendored
@@ -42,6 +42,7 @@ const help = () => {
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline(
|
||||
'TOKEN'
|
||||
)} Login token
|
||||
-y, --yes Skip the confirmation prompt when overwriting env file on pull or removing an env variable
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ export default async function connect(
|
||||
org: Org | undefined
|
||||
) {
|
||||
const { output } = client;
|
||||
const confirm = Boolean(argv['--confirm']);
|
||||
const confirm = Boolean(argv['--yes']);
|
||||
|
||||
if (args.length !== 0) {
|
||||
output.error(
|
||||
|
||||
@@ -16,15 +16,16 @@ const help = () => {
|
||||
|
||||
${chalk.dim('Commands:')}
|
||||
|
||||
connect Connect your Git config "origin" remote as a Git provider to your project
|
||||
disconnect Disconnect the Git provider repository from your project
|
||||
connect Connect your Git config "origin" remote as a Git provider to your project
|
||||
disconnect Disconnect the Git provider repository from your project
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-h, --help Output usage information
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline(
|
||||
'TOKEN'
|
||||
)} Login token
|
||||
)} Login token
|
||||
-y, --yes Skip questions when setting up new project using default scope and settings
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
@@ -49,7 +50,12 @@ export default async function main(client: Client) {
|
||||
|
||||
try {
|
||||
argv = getArgs(client.argv.slice(2), {
|
||||
'--confirm': Boolean,
|
||||
'--yes': Boolean,
|
||||
'-y': '--yes',
|
||||
|
||||
// deprecated
|
||||
'-c': '--yes',
|
||||
'--confirm': '--yes',
|
||||
});
|
||||
} catch (error) {
|
||||
handleError(error);
|
||||
@@ -64,7 +70,7 @@ export default async function main(client: Client) {
|
||||
argv._ = argv._.slice(1);
|
||||
subcommand = argv._[0];
|
||||
const args = argv._.slice(1);
|
||||
const confirm = Boolean(argv['--confirm']);
|
||||
const confirm = Boolean(argv['--yes']);
|
||||
const { output } = client;
|
||||
|
||||
let paths = [process.cwd()];
|
||||
|
||||
@@ -27,7 +27,7 @@ const help = () => {
|
||||
-p ${chalk.bold.underline('NAME')}, --project=${chalk.bold.underline(
|
||||
'NAME'
|
||||
)} Project name
|
||||
--confirm Confirm default options and skip questions
|
||||
-y, --yes Skip questions when setting up new project using default scope and settings
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
@@ -39,7 +39,7 @@ const help = () => {
|
||||
'–'
|
||||
)} Link current directory with default options and skip questions
|
||||
|
||||
${chalk.cyan(`$ ${getPkgName()} link --confirm`)}
|
||||
${chalk.cyan(`$ ${getPkgName()} link --yes`)}
|
||||
|
||||
${chalk.gray('–')} Link a specific directory to a Vercel Project
|
||||
|
||||
@@ -49,9 +49,14 @@ const help = () => {
|
||||
|
||||
export default async function main(client: Client) {
|
||||
const argv = getArgs(client.argv.slice(2), {
|
||||
'--confirm': Boolean,
|
||||
'--yes': Boolean,
|
||||
'-y': '--yes',
|
||||
'--project': String,
|
||||
'-p': '--project',
|
||||
|
||||
// deprecated
|
||||
'--confirm': Boolean,
|
||||
'-c': '--confirm',
|
||||
});
|
||||
|
||||
if (argv['--help']) {
|
||||
@@ -59,10 +64,15 @@ export default async function main(client: Client) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
if ('--confirm' in argv) {
|
||||
client.output.warn('`--confirm` is deprecated, please use `--yes` instead');
|
||||
argv['--yes'] = argv['--confirm'];
|
||||
}
|
||||
|
||||
const cwd = argv._[1] || process.cwd();
|
||||
const link = await setupAndLink(client, cwd, {
|
||||
forceDelete: true,
|
||||
autoConfirm: argv['--confirm'],
|
||||
autoConfirm: argv['--yes'],
|
||||
projectName: argv['--project'],
|
||||
successEmoji: 'success',
|
||||
setupMsg: 'Set up',
|
||||
@@ -73,7 +83,7 @@ export default async function main(client: Client) {
|
||||
client.output.error(
|
||||
`Command ${getCommandName(
|
||||
'link'
|
||||
)} requires confirmation. Use option ${param('--confirm')} to confirm.`
|
||||
)} requires confirmation. Use option ${param('--yes')} to confirm.`
|
||||
);
|
||||
}
|
||||
return link.exitCode;
|
||||
|
||||
@@ -35,7 +35,7 @@ const help = () => {
|
||||
'DIR'
|
||||
)} Path to the global ${'`.vercel`'} directory
|
||||
-d, --debug Debug mode [off]
|
||||
--confirm Skip the confirmation prompt
|
||||
-y, --yes Skip questions when setting up new project using default scope and settings
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline(
|
||||
'TOKEN'
|
||||
)} Login token
|
||||
@@ -78,7 +78,12 @@ export default async function main(client: Client) {
|
||||
'-m': '--meta',
|
||||
'--next': Number,
|
||||
'-N': '--next',
|
||||
'--yes': Boolean,
|
||||
'-y': '--yes',
|
||||
|
||||
// deprecated
|
||||
'--confirm': Boolean,
|
||||
'-c': '--confirm',
|
||||
});
|
||||
} catch (err) {
|
||||
handleError(err);
|
||||
@@ -87,6 +92,11 @@ export default async function main(client: Client) {
|
||||
|
||||
const { output, config } = client;
|
||||
|
||||
if ('--confirm' in argv) {
|
||||
output.warn('`--confirm` is deprecated, please use `--yes` instead');
|
||||
argv['--yes'] = argv['--confirm'];
|
||||
}
|
||||
|
||||
const { print, log, error, note, debug, spinner } = output;
|
||||
|
||||
if (argv._.length > 2) {
|
||||
@@ -99,7 +109,7 @@ export default async function main(client: Client) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
const yes = argv['--confirm'] || false;
|
||||
const yes = !!argv['--yes'];
|
||||
|
||||
const meta = parseMeta(argv['--meta']);
|
||||
const { includeScheme } = config;
|
||||
|
||||
@@ -38,7 +38,7 @@ const help = () => {
|
||||
)} Path to the global ${'`.vercel`'} directory
|
||||
-d, --debug Debug mode [off]
|
||||
--environment [environment] Deployment environment [development]
|
||||
-y, --yes Skip the confirmation prompt
|
||||
-y, --yes Skip questions when setting up new project using default scope and settings
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
|
||||
@@ -226,7 +226,8 @@ async function run({ output, contextName, currentTeam, client }) {
|
||||
|
||||
if (theSecret) {
|
||||
const yes =
|
||||
argv.yes || (await readConfirmation(output, theSecret, contextName));
|
||||
argv.yes ||
|
||||
(await readConfirmation(client, output, theSecret, contextName));
|
||||
if (!yes) {
|
||||
output.print(`Aborted. Secret not deleted.\n`);
|
||||
return 0;
|
||||
@@ -353,7 +354,7 @@ async function run({ output, contextName, currentTeam, client }) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
async function readConfirmation(output, secret, contextName) {
|
||||
async function readConfirmation(client, output, secret, contextName) {
|
||||
const time = chalk.gray(`${ms(new Date() - new Date(secret.created))} ago`);
|
||||
const tbl = table([[chalk.bold(secret.name), time]], {
|
||||
align: ['r', 'l'],
|
||||
@@ -367,5 +368,5 @@ async function readConfirmation(output, secret, contextName) {
|
||||
);
|
||||
output.print(` ${tbl}\n`);
|
||||
|
||||
return confirm(`${chalk.bold.red('Are you sure?')}`, false);
|
||||
return confirm(client, `${chalk.bold.red('Are you sure?')}`, false);
|
||||
}
|
||||
|
||||
@@ -131,7 +131,6 @@ export default class DevServer {
|
||||
public output: Output;
|
||||
public proxy: httpProxy;
|
||||
public envConfigs: EnvConfigs;
|
||||
public frameworkSlug?: string;
|
||||
public files: BuilderInputs;
|
||||
public address: string;
|
||||
public devCacheDir: string;
|
||||
@@ -175,7 +174,6 @@ export default class DevServer {
|
||||
this.address = '';
|
||||
this.devCommand = options.devCommand;
|
||||
this.projectSettings = options.projectSettings;
|
||||
this.frameworkSlug = options.frameworkSlug;
|
||||
this.caseSensitive = false;
|
||||
this.apiDir = null;
|
||||
this.apiExtensions = new Set();
|
||||
@@ -2210,7 +2208,10 @@ export default class DevServer {
|
||||
// Because of child process 'pipe' below, isTTY will be false.
|
||||
// Most frameworks use `chalk`/`supports-color` so we enable it anyway.
|
||||
FORCE_COLOR: process.stdout.isTTY ? '1' : '0',
|
||||
...(this.frameworkSlug === 'create-react-app' ? { BROWSER: 'none' } : {}),
|
||||
// Prevent framework dev servers from automatically opening a web
|
||||
// browser window, since it will not be the port that `vc dev`
|
||||
// is listening on and thus will be missing Vercel features.
|
||||
BROWSER: 'none',
|
||||
...process.env,
|
||||
...this.envConfigs.allEnv,
|
||||
PORT: `${port}`,
|
||||
|
||||
@@ -24,7 +24,6 @@ export { VercelConfig };
|
||||
export interface DevServerOptions {
|
||||
output: Output;
|
||||
devCommand?: string;
|
||||
frameworkSlug?: string;
|
||||
projectSettings?: ProjectSettings;
|
||||
systemEnvValues?: string[];
|
||||
projectEnvs?: ProjectEnvVariable[];
|
||||
|
||||
@@ -9,6 +9,7 @@ type LinkResult = {
|
||||
org: Org;
|
||||
project: Project;
|
||||
};
|
||||
|
||||
export async function ensureLink(
|
||||
commandName: string,
|
||||
client: Client,
|
||||
|
||||
@@ -305,7 +305,7 @@ function testFixtureStdio(
|
||||
? ['--scope', process.env.VERCEL_TEAM_ID]
|
||||
: []),
|
||||
'link',
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{ cwd, stdio: 'pipe', reject: false }
|
||||
);
|
||||
|
||||
125
packages/cli/test/integration.js
vendored
125
packages/cli/test/integration.js
vendored
@@ -126,7 +126,7 @@ ${stdout}
|
||||
async function vcLink(t, projectPath) {
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
['link', '--confirm', ...defaultArgs],
|
||||
['link', '--yes', ...defaultArgs],
|
||||
{
|
||||
reject: false,
|
||||
cwd: projectPath,
|
||||
@@ -658,7 +658,7 @@ test('[vc link] with vercel.json configuration overrides should create a valid d
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
['link', '--confirm', ...defaultArgs],
|
||||
['link', '--yes', ...defaultArgs],
|
||||
{
|
||||
reject: false,
|
||||
cwd: directory,
|
||||
@@ -683,7 +683,7 @@ test('deploy using only now.json with `redirects` defined', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[target, ...defaultArgs, '--confirm'],
|
||||
[target, ...defaultArgs, '--yes'],
|
||||
{
|
||||
reject: false,
|
||||
}
|
||||
@@ -703,14 +703,7 @@ test('deploy using --local-config flag v2', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[
|
||||
'deploy',
|
||||
target,
|
||||
'--local-config',
|
||||
configPath,
|
||||
...defaultArgs,
|
||||
'--confirm',
|
||||
],
|
||||
['deploy', target, '--local-config', configPath, ...defaultArgs, '--yes'],
|
||||
{
|
||||
reject: false,
|
||||
}
|
||||
@@ -747,7 +740,7 @@ test('deploy fails using --local-config flag with non-existent path', async t =>
|
||||
'--local-config',
|
||||
'does-not-exist.json',
|
||||
...defaultArgs,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{
|
||||
reject: false,
|
||||
@@ -772,7 +765,7 @@ test('deploy using --local-config flag above target', async t => {
|
||||
'--local-config',
|
||||
'./now-root.json',
|
||||
...defaultArgs,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{
|
||||
cwd: root,
|
||||
@@ -801,7 +794,7 @@ test('Deploy `api-env` fixture and test `vercel env` command', async t => {
|
||||
async function vcLink() {
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
['link', '--confirm', ...defaultArgs],
|
||||
['link', '--yes', ...defaultArgs],
|
||||
{
|
||||
reject: false,
|
||||
cwd: target,
|
||||
@@ -1345,7 +1338,7 @@ test('deploy with metadata containing "=" in the value', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[target, ...defaultArgs, '--confirm', '--meta', 'someKey=='],
|
||||
[target, ...defaultArgs, '--yes', '--meta', 'someKey=='],
|
||||
{ reject: false }
|
||||
);
|
||||
|
||||
@@ -1421,7 +1414,7 @@ test('should add secret with hyphen prefix', async t => {
|
||||
formatOutput({ stderr: secretCall.stderr, stdout: secretCall.stdout })
|
||||
);
|
||||
|
||||
let targetCall = await execa(binaryPath, [...defaultArgs, '--confirm'], {
|
||||
let targetCall = await execa(binaryPath, [...defaultArgs, '--yes'], {
|
||||
cwd: target,
|
||||
reject: false,
|
||||
});
|
||||
@@ -1475,7 +1468,7 @@ test('ignore files specified in .nowignore', async t => {
|
||||
'--name',
|
||||
session,
|
||||
...defaultArgs,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
];
|
||||
const targetCall = await execa(binaryPath, args, {
|
||||
cwd: directory,
|
||||
@@ -1503,7 +1496,7 @@ test('ignore files specified in .nowignore via allowlist', async t => {
|
||||
'--name',
|
||||
session,
|
||||
...defaultArgs,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
];
|
||||
const targetCall = await execa(binaryPath, args, {
|
||||
cwd: directory,
|
||||
@@ -1575,7 +1568,7 @@ test('domains inspect', async t => {
|
||||
`-V`,
|
||||
`2`,
|
||||
`--name=${projectName}`,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
'--public',
|
||||
]);
|
||||
t.is(output.exitCode, 0, formatOutput(output));
|
||||
@@ -1811,7 +1804,7 @@ test('ensure we render a warning for deployments with no files', async t => {
|
||||
'--name',
|
||||
session,
|
||||
...defaultArgs,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
'--force',
|
||||
],
|
||||
{
|
||||
@@ -1939,7 +1932,7 @@ test('ensure the `scope` property works with email', async t => {
|
||||
session,
|
||||
...defaultArgs,
|
||||
'--force',
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{
|
||||
reject: false,
|
||||
@@ -1979,7 +1972,7 @@ test('ensure the `scope` property works with username', async t => {
|
||||
session,
|
||||
...defaultArgs,
|
||||
'--force',
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{
|
||||
reject: false,
|
||||
@@ -2012,7 +2005,7 @@ test('try to create a builds deployments with wrong now.json', async t => {
|
||||
|
||||
const { stderr, stdout, exitCode } = await execa(
|
||||
binaryPath,
|
||||
[directory, '--public', ...defaultArgs, '--confirm'],
|
||||
[directory, '--public', ...defaultArgs, '--yes'],
|
||||
{
|
||||
reject: false,
|
||||
}
|
||||
@@ -2037,7 +2030,7 @@ test('try to create a builds deployments with wrong vercel.json', async t => {
|
||||
|
||||
const { stderr, stdout, exitCode } = await execa(
|
||||
binaryPath,
|
||||
[directory, '--public', ...defaultArgs, '--confirm'],
|
||||
[directory, '--public', ...defaultArgs, '--yes'],
|
||||
{
|
||||
reject: false,
|
||||
}
|
||||
@@ -2061,7 +2054,7 @@ test('try to create a builds deployments with wrong `build.env` property', async
|
||||
|
||||
const { stderr, stdout, exitCode } = await execa(
|
||||
binaryPath,
|
||||
['--public', ...defaultArgs, '--confirm'],
|
||||
['--public', ...defaultArgs, '--yes'],
|
||||
{
|
||||
cwd: directory,
|
||||
reject: false,
|
||||
@@ -2093,7 +2086,7 @@ test('create a builds deployments with no actual builds', async t => {
|
||||
session,
|
||||
...defaultArgs,
|
||||
'--force',
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{
|
||||
reject: false,
|
||||
@@ -2120,7 +2113,7 @@ test('create a staging deployment', async t => {
|
||||
directory,
|
||||
'--target=staging',
|
||||
...args,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
]);
|
||||
|
||||
console.log(targetCall.stderr);
|
||||
@@ -2150,7 +2143,7 @@ test('create a production deployment', async t => {
|
||||
directory,
|
||||
'--target=production',
|
||||
...args,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
]);
|
||||
|
||||
console.log(targetCall.stderr);
|
||||
@@ -2211,7 +2204,7 @@ test('use build-env', async t => {
|
||||
|
||||
const { stdout, stderr, exitCode } = await execa(
|
||||
binaryPath,
|
||||
[directory, '--public', ...defaultArgs, '--confirm'],
|
||||
[directory, '--public', ...defaultArgs, '--yes'],
|
||||
{
|
||||
reject: false,
|
||||
}
|
||||
@@ -2244,7 +2237,7 @@ test('use `--debug` CLI flag', async t => {
|
||||
session,
|
||||
'--debug',
|
||||
...defaultArgs,
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{
|
||||
reject: false,
|
||||
@@ -2276,7 +2269,7 @@ test('try to deploy non-existing path', async t => {
|
||||
|
||||
const { stderr, stdout, exitCode } = await execa(
|
||||
binaryPath,
|
||||
[session, ...defaultArgs, '--confirm'],
|
||||
[session, ...defaultArgs, '--yes'],
|
||||
{
|
||||
reject: false,
|
||||
}
|
||||
@@ -2296,7 +2289,7 @@ test('try to deploy with non-existing team', async t => {
|
||||
|
||||
const { stderr, stdout, exitCode } = await execa(
|
||||
binaryPath,
|
||||
[target, '--scope', session, ...defaultArgs, '--confirm'],
|
||||
[target, '--scope', session, ...defaultArgs, '--yes'],
|
||||
{
|
||||
reject: false,
|
||||
}
|
||||
@@ -2434,7 +2427,7 @@ test('try to revert a deployment and assign the automatic aliases', async t => {
|
||||
stdout: deploymentUrl,
|
||||
stderr,
|
||||
exitCode,
|
||||
} = await execute([firstDeployment, '--confirm']);
|
||||
} = await execute([firstDeployment, '--yes']);
|
||||
|
||||
t.is(exitCode, 0, formatOutput({ stderr, stdout: deploymentUrl }));
|
||||
|
||||
@@ -2455,7 +2448,7 @@ test('try to revert a deployment and assign the automatic aliases', async t => {
|
||||
stdout: deploymentUrl,
|
||||
stderr,
|
||||
exitCode,
|
||||
} = await execute([secondDeployment, '--confirm']);
|
||||
} = await execute([secondDeployment, '--yes']);
|
||||
|
||||
t.is(exitCode, 0, formatOutput({ stderr, stdout: deploymentUrl }));
|
||||
|
||||
@@ -2478,7 +2471,7 @@ test('try to revert a deployment and assign the automatic aliases', async t => {
|
||||
stdout: deploymentUrl,
|
||||
stderr,
|
||||
exitCode,
|
||||
} = await execute([firstDeployment, '--confirm']);
|
||||
} = await execute([firstDeployment, '--yes']);
|
||||
|
||||
t.is(exitCode, 0, formatOutput({ stderr, stdout: deploymentUrl }));
|
||||
|
||||
@@ -2560,7 +2553,7 @@ test('`vercel rm` removes a deployment', async t => {
|
||||
'-V',
|
||||
2,
|
||||
'--force',
|
||||
'--confirm',
|
||||
'--yes',
|
||||
],
|
||||
{
|
||||
reject: false,
|
||||
@@ -2616,7 +2609,7 @@ test('`vercel rm` 404 exits quickly', async t => {
|
||||
|
||||
test('render build errors', async t => {
|
||||
const deploymentPath = fixture('failing-build');
|
||||
const output = await execute([deploymentPath, '--confirm']);
|
||||
const output = await execute([deploymentPath, '--yes']);
|
||||
|
||||
console.log(output.stderr);
|
||||
console.log(output.stdout);
|
||||
@@ -2690,12 +2683,7 @@ test('vercel hasOwnProperty not a valid subcommand', async t => {
|
||||
|
||||
test('create zero-config deployment', async t => {
|
||||
const fixturePath = fixture('zero-config-next-js');
|
||||
const output = await execute([
|
||||
fixturePath,
|
||||
'--force',
|
||||
'--public',
|
||||
'--confirm',
|
||||
]);
|
||||
const output = await execute([fixturePath, '--force', '--public', '--yes']);
|
||||
|
||||
console.log('isCanary', isCanary);
|
||||
console.log(output.stderr);
|
||||
@@ -2726,12 +2714,7 @@ test('create zero-config deployment', async t => {
|
||||
|
||||
test('next unsupported functions config shows warning link', async t => {
|
||||
const fixturePath = fixture('zero-config-next-js-functions-warning');
|
||||
const output = await execute([
|
||||
fixturePath,
|
||||
'--force',
|
||||
'--public',
|
||||
'--confirm',
|
||||
]);
|
||||
const output = await execute([fixturePath, '--force', '--public', '--yes']);
|
||||
|
||||
console.log('isCanary', isCanary);
|
||||
console.log(output.stderr);
|
||||
@@ -2819,7 +2802,7 @@ test('vercel secret rm', async t => {
|
||||
|
||||
test('deploy a Lambda with 128MB of memory', async t => {
|
||||
const directory = fixture('lambda-with-128-memory');
|
||||
const output = await execute([directory, '--confirm']);
|
||||
const output = await execute([directory, '--yes']);
|
||||
|
||||
t.is(output.exitCode, 0, formatOutput(output));
|
||||
|
||||
@@ -2836,7 +2819,7 @@ test('deploy a Lambda with 128MB of memory', async t => {
|
||||
|
||||
test('fail to deploy a Lambda with an incorrect value for of memory', async t => {
|
||||
const directory = fixture('lambda-with-200-memory');
|
||||
const output = await execute([directory, '--confirm']);
|
||||
const output = await execute([directory, '--yes']);
|
||||
|
||||
t.is(output.exitCode, 1, formatOutput(output));
|
||||
t.regex(output.stderr, /steps of 64/gm, formatOutput(output));
|
||||
@@ -2845,7 +2828,7 @@ test('fail to deploy a Lambda with an incorrect value for of memory', async t =>
|
||||
|
||||
test('deploy a Lambda with 3 seconds of maxDuration', async t => {
|
||||
const directory = fixture('lambda-with-3-second-timeout');
|
||||
const output = await execute([directory, '--confirm']);
|
||||
const output = await execute([directory, '--yes']);
|
||||
|
||||
t.is(output.exitCode, 0, formatOutput(output));
|
||||
|
||||
@@ -2872,7 +2855,7 @@ test('deploy a Lambda with 3 seconds of maxDuration', async t => {
|
||||
|
||||
test('fail to deploy a Lambda with an incorrect value for maxDuration', async t => {
|
||||
const directory = fixture('lambda-with-1000-second-timeout');
|
||||
const output = await execute([directory, '--confirm']);
|
||||
const output = await execute([directory, '--yes']);
|
||||
|
||||
t.is(output.exitCode, 1, formatOutput(output));
|
||||
t.regex(
|
||||
@@ -2895,7 +2878,7 @@ test('invalid `--token`', async t => {
|
||||
|
||||
test('deploy a Lambda with a specific runtime', async t => {
|
||||
const directory = fixture('lambda-with-php-runtime');
|
||||
const output = await execute([directory, '--public', '--confirm']);
|
||||
const output = await execute([directory, '--public', '--yes']);
|
||||
|
||||
t.is(output.exitCode, 0, formatOutput(output));
|
||||
|
||||
@@ -2907,7 +2890,7 @@ test('deploy a Lambda with a specific runtime', async t => {
|
||||
|
||||
test('fail to deploy a Lambda with a specific runtime but without a locked version', async t => {
|
||||
const directory = fixture('lambda-with-invalid-runtime');
|
||||
const output = await execute([directory, '--confirm']);
|
||||
const output = await execute([directory, '--yes']);
|
||||
|
||||
t.is(output.exitCode, 1, formatOutput(output));
|
||||
t.regex(
|
||||
@@ -2957,7 +2940,7 @@ test('assign a domain to a project', async t => {
|
||||
const domain = `project-domain.${contextName}.vercel.app`;
|
||||
const directory = fixture('static-deployment');
|
||||
|
||||
const deploymentOutput = await execute([directory, '--public', '--confirm']);
|
||||
const deploymentOutput = await execute([directory, '--public', '--yes']);
|
||||
t.is(deploymentOutput.exitCode, 0, formatOutput(deploymentOutput));
|
||||
|
||||
const host = deploymentOutput.stdout.trim().replace('https://', '');
|
||||
@@ -2977,7 +2960,7 @@ test('assign a domain to a project', async t => {
|
||||
|
||||
test('ensure `github` and `scope` are not sent to the API', async t => {
|
||||
const directory = fixture('github-and-scope-config');
|
||||
const output = await execute([directory, '--confirm']);
|
||||
const output = await execute([directory, '--yes']);
|
||||
|
||||
t.is(output.exitCode, 0, formatOutput(output));
|
||||
});
|
||||
@@ -3292,7 +3275,7 @@ test('deploy with `VERCEL_ORG_ID` and `VERCEL_PROJECT_ID`', async t => {
|
||||
const directory = fixture('static-deployment');
|
||||
|
||||
// generate `.vercel`
|
||||
await execute([directory, '--confirm']);
|
||||
await execute([directory, '--yes']);
|
||||
|
||||
const link = require(path.join(directory, '.vercel/project.json'));
|
||||
await remove(path.join(directory, '.vercel'));
|
||||
@@ -3343,7 +3326,7 @@ test('deploy shows notice when project in `.vercel` does not exists', async t =>
|
||||
test('use `rootDirectory` from project when deploying', async t => {
|
||||
const directory = fixture('project-root-directory');
|
||||
|
||||
const firstResult = await execute([directory, '--confirm', '--public']);
|
||||
const firstResult = await execute([directory, '--yes', '--public']);
|
||||
t.is(firstResult.exitCode, 0, formatOutput(firstResult));
|
||||
|
||||
const { host: firstHost } = new URL(firstResult.stdout);
|
||||
@@ -3438,7 +3421,7 @@ test('deploys with only now.json and README.md', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[...defaultArgs, '--confirm'],
|
||||
[...defaultArgs, '--yes'],
|
||||
{
|
||||
cwd: directory,
|
||||
reject: false,
|
||||
@@ -3457,7 +3440,7 @@ test('deploys with only vercel.json and README.md', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[...defaultArgs, '--confirm'],
|
||||
[...defaultArgs, '--yes'],
|
||||
{
|
||||
cwd: directory,
|
||||
reject: false,
|
||||
@@ -3476,7 +3459,7 @@ test('reject conflicting `vercel.json` and `now.json` files', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[...defaultArgs, '--confirm'],
|
||||
[...defaultArgs, '--yes'],
|
||||
{
|
||||
cwd: directory,
|
||||
reject: false,
|
||||
@@ -3515,7 +3498,7 @@ test('deploy gatsby twice and print cached directories', async t => {
|
||||
const pkg = JSON.parse(packageJsonOriginal);
|
||||
|
||||
async function tryDeploy(cwd) {
|
||||
await execa(binaryPath, [...defaultArgs, '--public', '--confirm'], {
|
||||
await execa(binaryPath, [...defaultArgs, '--public', '--yes'], {
|
||||
cwd,
|
||||
stdio: 'inherit',
|
||||
reject: true,
|
||||
@@ -3553,7 +3536,7 @@ test('deploy pnpm twice using pnp and symlink=false', async t => {
|
||||
session,
|
||||
...defaultArgs,
|
||||
'--public',
|
||||
'--confirm',
|
||||
'--yes',
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -3581,7 +3564,7 @@ test('reject deploying with wrong team .vercel config', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[...defaultArgs, '--confirm'],
|
||||
[...defaultArgs, '--yes'],
|
||||
{
|
||||
cwd: directory,
|
||||
reject: false,
|
||||
@@ -3601,7 +3584,7 @@ test('reject deploying with invalid token', async t => {
|
||||
const directory = fixture('unauthorized-vercel-config');
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
[...defaultArgs, '--confirm'],
|
||||
[...defaultArgs, '--yes'],
|
||||
{
|
||||
cwd: directory,
|
||||
reject: false,
|
||||
@@ -3658,7 +3641,7 @@ test('[vc link] should show prompts to set up project', async t => {
|
||||
);
|
||||
});
|
||||
|
||||
test('[vc link --confirm] should not show prompts and autolink', async t => {
|
||||
test('[vc link --yes] should not show prompts and autolink', async t => {
|
||||
const dir = fixture('project-link-confirm');
|
||||
|
||||
// remove previously linked project if it exists
|
||||
@@ -3666,7 +3649,7 @@ test('[vc link --confirm] should not show prompts and autolink', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
['link', '--confirm', ...defaultArgs],
|
||||
['link', '--yes', ...defaultArgs],
|
||||
{ cwd: dir, reject: false }
|
||||
);
|
||||
|
||||
@@ -3701,7 +3684,7 @@ test('[vc link] should not duplicate paths in .gitignore', async t => {
|
||||
|
||||
const { exitCode, stderr, stdout } = await execa(
|
||||
binaryPath,
|
||||
['link', '--confirm', ...defaultArgs],
|
||||
['link', '--yes', ...defaultArgs],
|
||||
{
|
||||
cwd: dir,
|
||||
reject: false,
|
||||
@@ -3875,7 +3858,7 @@ test('[vc link] should support the `--project` flag', async t => {
|
||||
|
||||
const [user, output] = await Promise.all([
|
||||
fetchTokenInformation(token),
|
||||
execute(['link', '--confirm', '--project', projectName, directory]),
|
||||
execute(['link', '--yes', '--project', projectName, directory]),
|
||||
]);
|
||||
|
||||
t.is(output.exitCode, 0, formatOutput(output));
|
||||
@@ -3996,7 +3979,7 @@ test('vercel.json configuration overrides in an existing project do not prompt u
|
||||
const deployment = await execa(
|
||||
binaryPath,
|
||||
[directory, ...defaultArgs, '--public'].concat(
|
||||
autoConfirm ? ['--confirm'] : []
|
||||
autoConfirm ? ['--yes'] : []
|
||||
),
|
||||
{ reject: false }
|
||||
);
|
||||
|
||||
@@ -902,7 +902,6 @@ describe('build', () => {
|
||||
output = join(cwd, '.vercel/output');
|
||||
|
||||
process.chdir(cwd);
|
||||
client.stderr.pipe(process.stderr);
|
||||
const exitCode = await build(client);
|
||||
expect(exitCode).toEqual(0);
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ describe('git', () => {
|
||||
id: 'no-git-config',
|
||||
name: 'no-git-config',
|
||||
});
|
||||
client.setArgv('git', 'connect', '--confirm');
|
||||
client.setArgv('git', 'connect', '--yes');
|
||||
const exitCode = await git(client);
|
||||
expect(exitCode).toEqual(1);
|
||||
await expect(client.stderr).toOutput(
|
||||
@@ -98,7 +98,7 @@ describe('git', () => {
|
||||
id: 'no-remote-url',
|
||||
name: 'no-remote-url',
|
||||
});
|
||||
client.setArgv('git', 'connect', '--confirm');
|
||||
client.setArgv('git', 'connect', '--yes');
|
||||
const exitCode = await git(client);
|
||||
expect(exitCode).toEqual(1);
|
||||
await expect(client.stderr).toOutput(
|
||||
@@ -121,7 +121,7 @@ describe('git', () => {
|
||||
id: 'bad-remote-url',
|
||||
name: 'bad-remote-url',
|
||||
});
|
||||
client.setArgv('git', 'connect', '--confirm');
|
||||
client.setArgv('git', 'connect', '--yes');
|
||||
const exitCode = await git(client);
|
||||
expect(exitCode).toEqual(1);
|
||||
|
||||
@@ -148,7 +148,7 @@ describe('git', () => {
|
||||
id: 'new-connection',
|
||||
name: 'new-connection',
|
||||
});
|
||||
client.setArgv('git', 'connect', '--confirm');
|
||||
client.setArgv('git', 'connect', '--yes');
|
||||
const gitPromise = git(client);
|
||||
|
||||
await expect(client.stderr).toOutput(
|
||||
@@ -201,7 +201,7 @@ describe('git', () => {
|
||||
updatedAt: 1656109539791,
|
||||
};
|
||||
|
||||
client.setArgv('git', 'connect', '--confirm');
|
||||
client.setArgv('git', 'connect', '--yes');
|
||||
const gitPromise = git(client);
|
||||
|
||||
await expect(client.stderr).toOutput(
|
||||
@@ -253,7 +253,7 @@ describe('git', () => {
|
||||
createdAt: 1656109539791,
|
||||
updatedAt: 1656109539791,
|
||||
};
|
||||
client.setArgv('git', 'connect', '--confirm');
|
||||
client.setArgv('git', 'connect', '--yes');
|
||||
const gitPromise = git(client);
|
||||
|
||||
await expect(client.stderr).toOutput(
|
||||
@@ -283,7 +283,7 @@ describe('git', () => {
|
||||
name: 'invalid-repo',
|
||||
});
|
||||
|
||||
client.setArgv('git', 'connect', '--confirm');
|
||||
client.setArgv('git', 'connect', '--yes');
|
||||
const gitPromise = git(client);
|
||||
|
||||
await expect(client.stderr).toOutput(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/client",
|
||||
"version": "12.1.8",
|
||||
"version": "12.1.11",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"homepage": "https://vercel.com",
|
||||
@@ -42,8 +42,8 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/routing-utils": "2.0.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"@zeit/fetch": "5.2.0",
|
||||
"async-retry": "1.2.3",
|
||||
"async-sema": "3.0.0",
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"name": "@vercel/edge",
|
||||
"version": "0.0.1",
|
||||
"version": "0.0.3",
|
||||
"license": "MIT",
|
||||
"main": "dist/index.js",
|
||||
"module": "dist/index.mjs",
|
||||
"types": "dist/index.d.ts",
|
||||
"scripts": {
|
||||
"build": "tsup src/index.ts --dts --format esm,cjs",
|
||||
"test-unit": "jest",
|
||||
"prepublishOnly": "yarn build"
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "yarn test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@edge-runtime/jest-environment": "1.1.0-beta.7",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/frameworks",
|
||||
"version": "1.1.1",
|
||||
"version": "1.1.3",
|
||||
"main": "./dist/frameworks.js",
|
||||
"types": "./dist/frameworks.d.ts",
|
||||
"files": [
|
||||
@@ -21,7 +21,7 @@
|
||||
"@types/js-yaml": "3.12.1",
|
||||
"@types/node": "12.0.4",
|
||||
"@types/node-fetch": "2.5.8",
|
||||
"@vercel/routing-utils": "2.0.0",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"ajv": "6.12.2",
|
||||
"typescript": "4.3.4"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/fs-detectors",
|
||||
"version": "2.0.3",
|
||||
"version": "2.0.5",
|
||||
"description": "Vercel filesystem detectors",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -14,14 +14,13 @@
|
||||
},
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"prepublishOnly": "tsc",
|
||||
"build": "tsc",
|
||||
"test": "yarn jest --env node --verbose --runInBand --bail test/unit.*test.*",
|
||||
"test": "jest --env node --verbose --runInBand --bail test/unit.*test.*",
|
||||
"test-unit": "yarn test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/frameworks": "1.1.1",
|
||||
"@vercel/routing-utils": "2.0.0",
|
||||
"@vercel/frameworks": "1.1.3",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"glob": "8.0.3",
|
||||
"js-yaml": "4.1.0",
|
||||
"minimatch": "3.0.4",
|
||||
|
||||
@@ -90,6 +90,12 @@ type UndoFileAction = {
|
||||
to: string | undefined;
|
||||
};
|
||||
|
||||
type UndoFunctionRename = {
|
||||
fsPath: string;
|
||||
from: string;
|
||||
to: string;
|
||||
};
|
||||
|
||||
export const version = 3;
|
||||
|
||||
export async function build({
|
||||
@@ -109,6 +115,7 @@ export async function build({
|
||||
// in order to undo the action, not what the original action was
|
||||
const undoFileActions: UndoFileAction[] = [];
|
||||
const undoDirectoryCreation: string[] = [];
|
||||
const undoFunctionRenames: UndoFunctionRename[] = [];
|
||||
|
||||
try {
|
||||
if (process.env.GIT_CREDENTIALS) {
|
||||
@@ -128,6 +135,7 @@ export async function build({
|
||||
`);
|
||||
}
|
||||
|
||||
const originalEntrypointAbsolute = join(workPath, entrypoint);
|
||||
const renamedEntrypoint = getRenamedEntrypoint(entrypoint);
|
||||
if (renamedEntrypoint) {
|
||||
await move(join(workPath, entrypoint), join(workPath, renamedEntrypoint));
|
||||
@@ -245,10 +253,21 @@ export async function build({
|
||||
}
|
||||
}
|
||||
|
||||
const handlerFunctionName = parsedAnalyzed.functionName;
|
||||
debug(
|
||||
`Found exported function "${handlerFunctionName}" in "${entrypoint}"`
|
||||
const originalFunctionName = parsedAnalyzed.functionName;
|
||||
const handlerFunctionName = getNewHandlerFunctionName(
|
||||
originalFunctionName,
|
||||
entrypoint
|
||||
);
|
||||
await renameHandlerFunction(
|
||||
entrypointAbsolute,
|
||||
originalFunctionName,
|
||||
handlerFunctionName
|
||||
);
|
||||
undoFunctionRenames.push({
|
||||
fsPath: originalEntrypointAbsolute,
|
||||
from: handlerFunctionName,
|
||||
to: originalFunctionName,
|
||||
});
|
||||
|
||||
if (!isGoModExist) {
|
||||
if (await pathExists(join(workPath, 'vendor'))) {
|
||||
@@ -302,7 +321,7 @@ export async function build({
|
||||
}
|
||||
}
|
||||
|
||||
const mainModGoFileName = 'main__mod__.go';
|
||||
const mainModGoFileName = 'main.go';
|
||||
const modMainGoContents = await readFile(
|
||||
join(__dirname, mainModGoFileName),
|
||||
'utf8'
|
||||
@@ -430,14 +449,13 @@ export async function build({
|
||||
},
|
||||
false
|
||||
);
|
||||
const origianlMainGoContents = await readFile(
|
||||
const originalMainGoContents = await readFile(
|
||||
join(__dirname, 'main.go'),
|
||||
'utf8'
|
||||
);
|
||||
const mainGoContents = origianlMainGoContents.replace(
|
||||
'__VC_HANDLER_FUNC_NAME',
|
||||
handlerFunctionName
|
||||
);
|
||||
const mainGoContents = originalMainGoContents
|
||||
.replace('"__VC_HANDLER_PACKAGE_NAME"', '')
|
||||
.replace('__VC_HANDLER_FUNC_NAME', handlerFunctionName);
|
||||
|
||||
// in order to allow the user to have `main.go`,
|
||||
// we need our `main.go` to be called something else
|
||||
@@ -479,6 +497,7 @@ export async function build({
|
||||
files: { ...(await glob('**', outDir)), ...includedFiles },
|
||||
handler: handlerFileName,
|
||||
runtime: 'go1.x',
|
||||
supportsWrapper: true,
|
||||
environment: {},
|
||||
});
|
||||
|
||||
@@ -501,7 +520,11 @@ export async function build({
|
||||
throw error;
|
||||
} finally {
|
||||
try {
|
||||
await cleanupFileSystem(undoFileActions, undoDirectoryCreation);
|
||||
await cleanupFileSystem(
|
||||
undoFileActions,
|
||||
undoDirectoryCreation,
|
||||
undoFunctionRenames
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(`Build cleanup failed: ${error.message}`);
|
||||
debug('Cleanup Error: ' + error);
|
||||
@@ -509,9 +532,47 @@ export async function build({
|
||||
}
|
||||
}
|
||||
|
||||
async function renameHandlerFunction(fsPath: string, from: string, to: string) {
|
||||
let fileContents = await readFile(fsPath, 'utf8');
|
||||
|
||||
const fromRegex = new RegExp(`\\b${from}\\b`, 'g');
|
||||
fileContents = fileContents.replace(fromRegex, to);
|
||||
|
||||
await writeFile(fsPath, fileContents);
|
||||
}
|
||||
|
||||
export function getNewHandlerFunctionName(
|
||||
originalFunctionName: string,
|
||||
entrypoint: string
|
||||
) {
|
||||
if (!originalFunctionName) {
|
||||
throw new Error(
|
||||
'Handler function renaming failed because original function name was empty.'
|
||||
);
|
||||
}
|
||||
|
||||
if (!entrypoint) {
|
||||
throw new Error(
|
||||
'Handler function renaming failed because entrypoint was empty.'
|
||||
);
|
||||
}
|
||||
|
||||
debug(`Found exported function "${originalFunctionName}" in "${entrypoint}"`);
|
||||
|
||||
const pathSlug = entrypoint.replace(/(\s|\\|\/|\]|\[|-|\.)/g, '_');
|
||||
|
||||
const newHandlerName = `${originalFunctionName}_${pathSlug}`;
|
||||
debug(
|
||||
`Renaming handler function temporarily from "${originalFunctionName}" to "${newHandlerName}"`
|
||||
);
|
||||
|
||||
return newHandlerName;
|
||||
}
|
||||
|
||||
async function cleanupFileSystem(
|
||||
undoFileActions: UndoFileAction[],
|
||||
undoDirectoryCreation: string[]
|
||||
undoDirectoryCreation: string[],
|
||||
undoFunctionRenames: UndoFunctionRename[]
|
||||
) {
|
||||
// we have to undo the actions in reverse order in cases
|
||||
// where one file was moved multiple times, which happens
|
||||
@@ -524,6 +585,12 @@ async function cleanupFileSystem(
|
||||
}
|
||||
}
|
||||
|
||||
// after files are moved back, we can undo function renames
|
||||
// these reference the original file location
|
||||
for (const rename of undoFunctionRenames) {
|
||||
await renameHandlerFunction(rename.fsPath, rename.from, rename.to);
|
||||
}
|
||||
|
||||
const undoDirectoryPromises = undoDirectoryCreation.map(async directory => {
|
||||
const contents = await readdir(directory);
|
||||
// only delete an empty directory
|
||||
|
||||
@@ -1,10 +1,31 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
vc "github.com/vercel/go-bridge/go/bridge"
|
||||
"net/http"
|
||||
"os"
|
||||
"syscall"
|
||||
|
||||
"__VC_HANDLER_PACKAGE_NAME"
|
||||
vc "github.com/vercel/go-bridge/go/bridge"
|
||||
)
|
||||
|
||||
func checkForLambdaWrapper() {
|
||||
wrapper := os.Getenv("AWS_LAMBDA_EXEC_WRAPPER")
|
||||
if wrapper == "" {
|
||||
return
|
||||
}
|
||||
|
||||
// Removing the env var doesn't work
|
||||
// Set it to empty string to override the previous value
|
||||
os.Setenv("AWS_LAMBDA_EXEC_WRAPPER", "")
|
||||
argv := append([]string{wrapper}, os.Args...)
|
||||
err := syscall.Exec(wrapper, argv, os.Environ())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
checkForLambdaWrapper()
|
||||
vc.Start(http.HandlerFunc(__VC_HANDLER_FUNC_NAME))
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"__VC_HANDLER_PACKAGE_NAME"
|
||||
"net/http"
|
||||
|
||||
vc "github.com/vercel/go-bridge/go/bridge"
|
||||
)
|
||||
|
||||
func main() {
|
||||
vc.Start(http.HandlerFunc(__VC_HANDLER_FUNC_NAME))
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/go",
|
||||
"version": "2.0.13",
|
||||
"version": "2.1.0",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
|
||||
@@ -11,21 +11,31 @@
|
||||
},
|
||||
"scripts": {
|
||||
"build": "node build",
|
||||
"test": "yarn jest --env node --verbose --runInBand --bail",
|
||||
"test-integration-once": "yarn test",
|
||||
"prepublishOnly": "node build"
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-integration-once": "yarn test"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"jest": {
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node",
|
||||
"globals": {
|
||||
"ts-jest": {
|
||||
"diagnostics": true,
|
||||
"isolatedModules": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tootallnate/once": "1.1.2",
|
||||
"@types/async-retry": "1.4.2",
|
||||
"@types/execa": "^0.9.0",
|
||||
"@types/fs-extra": "^5.0.5",
|
||||
"@types/jest": "28.1.6",
|
||||
"@types/node-fetch": "^2.3.0",
|
||||
"@types/tar": "^4.0.0",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"async-retry": "1.3.1",
|
||||
"execa": "^1.0.0",
|
||||
|
||||
12
packages/go/test/fixtures/21-func-conflicts/dupe-handler.go
vendored
Normal file
12
packages/go/test/fixtures/21-func-conflicts/dupe-handler.go
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// "Handler" conflicts with the other files' exported function,
|
||||
// but should still work
|
||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "from dupe-handler.go")
|
||||
}
|
||||
3
packages/go/test/fixtures/21-func-conflicts/go.mod
vendored
Normal file
3
packages/go/test/fixtures/21-func-conflicts/go.mod
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
module go-mod
|
||||
|
||||
go 1.15
|
||||
11
packages/go/test/fixtures/21-func-conflicts/index.go
vendored
Normal file
11
packages/go/test/fixtures/21-func-conflicts/index.go
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Handler func
|
||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "from index.go")
|
||||
}
|
||||
12
packages/go/test/fixtures/21-func-conflicts/other-package.go
vendored
Normal file
12
packages/go/test/fixtures/21-func-conflicts/other-package.go
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
package other
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// "Handler" conflicts with the other files' exported function,
|
||||
// but not in the same package
|
||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "from other-package.go")
|
||||
}
|
||||
11
packages/go/test/fixtures/21-func-conflicts/sub/one.go
vendored
Normal file
11
packages/go/test/fixtures/21-func-conflicts/sub/one.go
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// "Handler" conflicts with the other files' exported function
|
||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "from /sub/one.go")
|
||||
}
|
||||
11
packages/go/test/fixtures/21-func-conflicts/sub/two.go
vendored
Normal file
11
packages/go/test/fixtures/21-func-conflicts/sub/two.go
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// "Handler" conflicts with the other files' exported function
|
||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "from /sub/two.go")
|
||||
}
|
||||
11
packages/go/test/fixtures/21-func-conflicts/vercel.json
vendored
Normal file
11
packages/go/test/fixtures/21-func-conflicts/vercel.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "**/*.go", "use": "@vercel/go" }],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "from index.go" },
|
||||
{ "path": "/dupe-handler.go", "mustContain": "from dupe-handler.go" },
|
||||
{ "path": "/other-package.go", "mustContain": "from other-package.go" },
|
||||
{ "path": "/sub/one.go", "mustContain": "from /sub/one.go" },
|
||||
{ "path": "/sub/two.go", "mustContain": "from /sub/two.go" }
|
||||
]
|
||||
}
|
||||
1
packages/go/test/fixtures/22-large-environment/env/go.mod
vendored
Normal file
1
packages/go/test/fixtures/22-large-environment/env/go.mod
vendored
Normal file
@@ -0,0 +1 @@
|
||||
module env
|
||||
19
packages/go/test/fixtures/22-large-environment/env/index.go
vendored
Normal file
19
packages/go/test/fixtures/22-large-environment/env/index.go
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
package env
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
// Handler function
|
||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||
rdm := os.Getenv("RANDOMNESS_ENV")
|
||||
if rdm == "" {
|
||||
fmt.Println("No env received")
|
||||
}
|
||||
|
||||
fmt.Fprintln(w, rdm)
|
||||
fmt.Fprintln(w, os.Getenv("LOREM"))
|
||||
fmt.Fprintln(w, os.Getenv("IPSUM"))
|
||||
}
|
||||
28
packages/go/test/fixtures/22-large-environment/now.json
vendored
Normal file
28
packages/go/test/fixtures/22-large-environment/now.json
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{
|
||||
"src": "env/index.go",
|
||||
"use": "@vercel/go"
|
||||
}
|
||||
],
|
||||
"env": {
|
||||
"RANDOMNESS_ENV": "RANDOMNESS_PLACEHOLDER",
|
||||
"LOREM": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis nisl, porta vel dictum id, placerat eu massa. Curabitur id diam at urna elementum condimentum a eget augue. Sed vehicula, mauris quis tincidunt iaculis, lacus quam dictum nulla, eu pellentesque justo lectus a erat. Integer volutpat magna tortor, non mollis tortor rhoncus quis. Donec id urna ligula. Praesent et ligula id ligula blandit rhoncus. Proin consequat, justo id maximus lacinia, tortor dui facilisis nunc, at aliquet odio orci nec tellus. Vestibulum sagittis nec sem id mollis. Donec eleifend risus eget lectus mattis convallis. Nam ac urna commodo, venenatis massa ut, varius magna. Aliquam erat volutpat. Ut ac lacinia erat. Mauris finibus vehicula elementum. Proin mauris neque, fringilla a erat fermentum, convallis elementum urna. Pellentesque bibendum nisl eget nisi sodales, a faucibus felis scelerisque. Fusce blandit imperdiet nunc, ac hendrerit ante placerat sed. Cras metus dolor, cursus non orci sed, iaculis tempor nunc. Quisque vitae enim pharetra, viverra massa non, mollis magna. Vivamus sit amet ultricies ligula, in vulputate sapien. Praesent ullamcorper justo in elit vulputate, et varius augue egestas. Donec quis rutrum mauris. Suspendisse placerat volutpat gravida. Nunc laoreet velit a accumsan faucibus. Nunc eu lorem sem. Sed id nunc a metus gravida accumsan. Morbi aliquet purus id ipsum dictum, nec finibus quam ullamcorper. Quisque sapien nulla, laoreet a accumsan non, luctus quis ante. Sed sit amet pellentesque magna. Aenean pulvinar porta est sed posuere. Aenean id nisl dictum, varius diam vel, facilisis ex. Praesent quis justo id mi eleifend eleifend. Aliquam imperdiet purus non ligula lobortis laoreet. Sed mollis aliquet dui et luctus. Donec ut lacus vel tellus porta feugiat. Nam lacinia euismod libero. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi facilisis quam nec nisl pretium, id blandit sapien pretium. Donec id sapien varius, ornare mi sed, pretium magna. Phasellus tortor ligula, porttitor sit amet magna in, semper condimentum elit.",
|
||||
"IPSUM": "Phasellus ac orci eleifend, dignissim turpis et, aliquet libero. Praesent aliquet justo augue, vel vulputate ex dictum ut. Donec eu interdum ex, sit amet hendrerit felis. Maecenas eget iaculis orci, eget porta eros. Pellentesque vitae neque in velit dapibus luctus. Pellentesque ornare et tellus eu congue. Aliquam eu sem vel neque varius faucibus. Ut eget tortor ornare, fermentum enim nec, pellentesque massa. Phasellus rhoncus aliquet nunc nec semper. Nullam sed iaculis tellus. Mauris a sollicitudin velit, id egestas odio. Suspendisse commodo commodo turpis, et sollicitudin sem commodo a. Vivamus condimentum, arcu ac tempus blandit, lectus ligula pulvinar est, in congue mi nunc et lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi sodales ipsum quis scelerisque vehicula. Quisque gravida nibh vitae mattis sollicitudin. Donec fringilla dapibus urna non gravida. Phasellus et eros id magna tristique consequat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In lacus neque, auctor sed arcu at, varius volutpat est. Maecenas eget ante sed ipsum sagittis laoreet ut nec nisi. Quisque scelerisque, risus ut efficitur sollicitudin, neque est faucibus lacus, vitae eleifend nulla sem a magna. Integer viverra, diam eget venenatis pretium, augue ex pulvinar justo, ac ultrices neque nisl laoreet risus. Pellentesque commodo ultrices laoreet. Nulla nec ipsum non augue hendrerit vulputate sed eget diam. Maecenas semper rutrum ligula. Sed egestas, orci sed volutpat varius, eros mi lacinia magna, tincidunt aliquet nibh lacus eget dui. Integer vestibulum velit in interdum ultrices. Mauris porta vitae quam non placerat. In nisi risus, hendrerit rhoncus hendrerit at, lacinia vel mauris. Curabitur tempus mattis eros nec consequat. Sed posuere elit lobortis libero porta, sed pharetra tortor ornare. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse pulvinar ante vitae metus ullamcorper euismod. Nulla facilisi. Donec quam nulla, eleifend vel consequat sed, maximus et nisi. Donec molestie euismod semper. Fusce eget arcu feugiat, efficitur lectus sed, feugiat justo. Mauris ultricies pretium ante non faucibus. Aenean egestas ante nunc, id pellentesque metus blandit eu. Nullam faucibus fringilla lectus, quis dapibus turpis elementum eu. Nunc eget dolor in velit molestie interdum id eu justo. Aliquam ornare arcu quis tincidunt posuere. Mauris sed porttitor ligula. Vestibulum tincidunt non lacus id lacinia. Donec ex augue, convallis vel justo vel, faucibus ultricies tortor."
|
||||
},
|
||||
"probes": [
|
||||
{
|
||||
"path": "/env",
|
||||
"mustContain": "RANDOMNESS_PLACEHOLDER"
|
||||
},
|
||||
{
|
||||
"path": "/env",
|
||||
"mustContain": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis nisl, porta vel dictum id, placerat eu massa. Curabitur id diam at urna elementum condimentum a eget augue. Sed vehicula, mauris quis tincidunt iaculis, lacus quam dictum nulla, eu pellentesque justo lectus a erat. Integer volutpat magna tortor, non mollis tortor rhoncus quis. Donec id urna ligula. Praesent et ligula id ligula blandit rhoncus. Proin consequat, justo id maximus lacinia, tortor dui facilisis nunc, at aliquet odio orci nec tellus. Vestibulum sagittis nec sem id mollis. Donec eleifend risus eget lectus mattis convallis. Nam ac urna commodo, venenatis massa ut, varius magna. Aliquam erat volutpat. Ut ac lacinia erat. Mauris finibus vehicula elementum. Proin mauris neque, fringilla a erat fermentum, convallis elementum urna. Pellentesque bibendum nisl eget nisi sodales, a faucibus felis scelerisque. Fusce blandit imperdiet nunc, ac hendrerit ante placerat sed. Cras metus dolor, cursus non orci sed, iaculis tempor nunc. Quisque vitae enim pharetra, viverra massa non, mollis magna. Vivamus sit amet ultricies ligula, in vulputate sapien. Praesent ullamcorper justo in elit vulputate, et varius augue egestas. Donec quis rutrum mauris. Suspendisse placerat volutpat gravida. Nunc laoreet velit a accumsan faucibus. Nunc eu lorem sem. Sed id nunc a metus gravida accumsan. Morbi aliquet purus id ipsum dictum, nec finibus quam ullamcorper. Quisque sapien nulla, laoreet a accumsan non, luctus quis ante. Sed sit amet pellentesque magna. Aenean pulvinar porta est sed posuere. Aenean id nisl dictum, varius diam vel, facilisis ex. Praesent quis justo id mi eleifend eleifend. Aliquam imperdiet purus non ligula lobortis laoreet. Sed mollis aliquet dui et luctus. Donec ut lacus vel tellus porta feugiat. Nam lacinia euismod libero. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi facilisis quam nec nisl pretium, id blandit sapien pretium. Donec id sapien varius, ornare mi sed, pretium magna. Phasellus tortor ligula, porttitor sit amet magna in, semper condimentum elit."
|
||||
},
|
||||
{
|
||||
"path": "/env",
|
||||
"mustContain": "Phasellus ac orci eleifend, dignissim turpis et, aliquet libero. Praesent aliquet justo augue, vel vulputate ex dictum ut. Donec eu interdum ex, sit amet hendrerit felis. Maecenas eget iaculis orci, eget porta eros. Pellentesque vitae neque in velit dapibus luctus. Pellentesque ornare et tellus eu congue. Aliquam eu sem vel neque varius faucibus. Ut eget tortor ornare, fermentum enim nec, pellentesque massa. Phasellus rhoncus aliquet nunc nec semper. Nullam sed iaculis tellus. Mauris a sollicitudin velit, id egestas odio. Suspendisse commodo commodo turpis, et sollicitudin sem commodo a. Vivamus condimentum, arcu ac tempus blandit, lectus ligula pulvinar est, in congue mi nunc et lacus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi sodales ipsum quis scelerisque vehicula. Quisque gravida nibh vitae mattis sollicitudin. Donec fringilla dapibus urna non gravida. Phasellus et eros id magna tristique consequat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In lacus neque, auctor sed arcu at, varius volutpat est. Maecenas eget ante sed ipsum sagittis laoreet ut nec nisi. Quisque scelerisque, risus ut efficitur sollicitudin, neque est faucibus lacus, vitae eleifend nulla sem a magna. Integer viverra, diam eget venenatis pretium, augue ex pulvinar justo, ac ultrices neque nisl laoreet risus. Pellentesque commodo ultrices laoreet. Nulla nec ipsum non augue hendrerit vulputate sed eget diam. Maecenas semper rutrum ligula. Sed egestas, orci sed volutpat varius, eros mi lacinia magna, tincidunt aliquet nibh lacus eget dui. Integer vestibulum velit in interdum ultrices. Mauris porta vitae quam non placerat. In nisi risus, hendrerit rhoncus hendrerit at, lacinia vel mauris. Curabitur tempus mattis eros nec consequat. Sed posuere elit lobortis libero porta, sed pharetra tortor ornare. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse pulvinar ante vitae metus ullamcorper euismod. Nulla facilisi. Donec quam nulla, eleifend vel consequat sed, maximus et nisi. Donec molestie euismod semper. Fusce eget arcu feugiat, efficitur lectus sed, feugiat justo. Mauris ultricies pretium ante non faucibus. Aenean egestas ante nunc, id pellentesque metus blandit eu. Nullam faucibus fringilla lectus, quis dapibus turpis elementum eu. Nunc eget dolor in velit molestie interdum id eu justo. Aliquam ornare arcu quis tincidunt posuere. Mauris sed porttitor ligula. Vestibulum tincidunt non lacus id lacinia. Donec ex augue, convallis vel justo vel, faucibus ultricies tortor."
|
||||
}
|
||||
]
|
||||
}
|
||||
92
packages/go/test/index.test.ts
vendored
Normal file
92
packages/go/test/index.test.ts
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
import { getNewHandlerFunctionName } from '../index';
|
||||
|
||||
describe('getNewHandlerFunctionName', function () {
|
||||
it('does nothing with empty original function name', async () => {
|
||||
let error;
|
||||
try {
|
||||
getNewHandlerFunctionName('', 'some/kind-of-file.js');
|
||||
} catch (err) {
|
||||
error = err;
|
||||
}
|
||||
|
||||
expect(error).toBeDefined();
|
||||
expect(error.message).toEqual(
|
||||
'Handler function renaming failed because original function name was empty.'
|
||||
);
|
||||
});
|
||||
|
||||
it('does nothing with empty original function name', async () => {
|
||||
let error;
|
||||
try {
|
||||
getNewHandlerFunctionName('Handler', '');
|
||||
} catch (err) {
|
||||
error = err;
|
||||
}
|
||||
|
||||
expect(error).toBeDefined();
|
||||
expect(error.message).toEqual(
|
||||
'Handler function renaming failed because entrypoint was empty.'
|
||||
);
|
||||
});
|
||||
|
||||
it('generates slug with back slashes in file path', async () => {
|
||||
const newFunctionName = getNewHandlerFunctionName(
|
||||
'Handler',
|
||||
'some\\file.js'
|
||||
);
|
||||
expect(newFunctionName).toEqual('Handler_some_file_js');
|
||||
});
|
||||
|
||||
it('generates slug with forward slashes in file path', async () => {
|
||||
const newFunctionName = getNewHandlerFunctionName(
|
||||
'Handler',
|
||||
'some/file.js'
|
||||
);
|
||||
expect(newFunctionName).toEqual('Handler_some_file_js');
|
||||
});
|
||||
|
||||
it('generates slug with dashes in file path', async () => {
|
||||
const newFunctionName = getNewHandlerFunctionName(
|
||||
'Handler',
|
||||
'kind-of-file.js'
|
||||
);
|
||||
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
|
||||
});
|
||||
|
||||
it('generates slug with dashes in file path', async () => {
|
||||
const newFunctionName = getNewHandlerFunctionName(
|
||||
'Handler',
|
||||
'kind-of-file.js'
|
||||
);
|
||||
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
|
||||
});
|
||||
|
||||
it('generates slug with brackets in file path', async () => {
|
||||
const newFunctionName = getNewHandlerFunctionName(
|
||||
'Handler',
|
||||
'[segment].js'
|
||||
);
|
||||
// this expects two underscores on each side intentionally
|
||||
// left (1): there's an added separator between original function name and slug;
|
||||
// left (2): the opening bracket is replaced
|
||||
// right (1): the closing bracket is replaced
|
||||
// right (2): the period is replaced
|
||||
expect(newFunctionName).toEqual('Handler__segment__js');
|
||||
});
|
||||
|
||||
it('generates slug with space in file path', async () => {
|
||||
const newFunctionName = getNewHandlerFunctionName(
|
||||
'Handler',
|
||||
'kind of file.js'
|
||||
);
|
||||
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
|
||||
});
|
||||
|
||||
it('generates slug with periods in file path', async () => {
|
||||
const newFunctionName = getNewHandlerFunctionName(
|
||||
'Handler',
|
||||
'kind.of.file.js'
|
||||
);
|
||||
expect(newFunctionName).toEqual('Handler_kind_of_file_js');
|
||||
});
|
||||
});
|
||||
@@ -11,7 +11,7 @@
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noImplicitThis": false,
|
||||
"types": ["node"],
|
||||
"types": ["node", "jest"],
|
||||
"strict": true,
|
||||
"target": "ES2020"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/hydrogen",
|
||||
"version": "0.0.10",
|
||||
"version": "0.0.13",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -12,8 +12,7 @@
|
||||
"scripts": {
|
||||
"build": "node build.js",
|
||||
"test-integration-once": "yarn test test/test.js",
|
||||
"test": "jest --env node --verbose --bail --runInBand",
|
||||
"prepublishOnly": "node build.js"
|
||||
"test": "jest --env node --verbose --bail --runInBand"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
@@ -22,7 +21,7 @@
|
||||
"devDependencies": {
|
||||
"@types/jest": "27.5.1",
|
||||
"@types/node": "*",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"typescript": "4.6.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/next",
|
||||
"version": "3.1.13",
|
||||
"version": "3.1.17",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
|
||||
@@ -11,8 +11,7 @@
|
||||
"test-unit": "yarn test test/build.test.ts test/unit/",
|
||||
"test-next-local": "jest --env node --verbose --bail --forceExit --testTimeout=360000 test/integration/*.test.js test/integration/*.test.ts",
|
||||
"test-next-local:middleware": "jest --env node --verbose --bail --useStderr --testTimeout=360000 test/integration/middleware.test.ts",
|
||||
"test-integration-once": "rm test/builder-info.json; jest --env node --verbose --runInBand --bail test/fixtures/**/*.test.js",
|
||||
"prepublishOnly": "yarn build"
|
||||
"test-integration-once": "rm test/builder-info.json; jest --env node --verbose --runInBand --bail test/fixtures/**/*.test.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -45,9 +44,9 @@
|
||||
"@types/semver": "6.0.0",
|
||||
"@types/text-table": "0.2.1",
|
||||
"@types/webpack-sources": "3.2.0",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/nft": "0.21.0",
|
||||
"@vercel/routing-utils": "2.0.0",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"async-sema": "3.0.1",
|
||||
"buffer-crc32": "0.2.13",
|
||||
"cheerio": "1.0.0-rc.10",
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
download,
|
||||
getLambdaOptionsFromFunction,
|
||||
getNodeVersion,
|
||||
getPrefixedEnvVars,
|
||||
getSpawnOptions,
|
||||
getScriptName,
|
||||
glob,
|
||||
@@ -224,14 +225,14 @@ export const build: BuildV2 = async ({
|
||||
)
|
||||
);
|
||||
|
||||
Object.keys(process.env)
|
||||
.filter(key => key.startsWith('VERCEL_'))
|
||||
.forEach(key => {
|
||||
const newKey = `NEXT_PUBLIC_${key}`;
|
||||
if (!(newKey in process.env)) {
|
||||
process.env[newKey] = process.env[key];
|
||||
}
|
||||
});
|
||||
const prefixedEnvs = getPrefixedEnvVars({
|
||||
envPrefix: 'NEXT_PUBLIC_',
|
||||
envs: process.env,
|
||||
});
|
||||
|
||||
for (const [key, value] of Object.entries(prefixedEnvs)) {
|
||||
process.env[key] = value;
|
||||
}
|
||||
|
||||
await download(files, workPath, meta);
|
||||
|
||||
|
||||
@@ -58,7 +58,6 @@ const CORRECT_MIDDLEWARE_ORDER_VERSION = 'v12.1.7-canary.29';
|
||||
const NEXT_DATA_MIDDLEWARE_RESOLVING_VERSION = 'v12.1.7-canary.33';
|
||||
const EMPTY_ALLOW_QUERY_FOR_PRERENDERED_VERSION = 'v12.2.0';
|
||||
const CORRECTED_MANIFESTS_VERSION = 'v12.2.0';
|
||||
const NON_NESTED_MIDDLEWARE_VERSION = 'v12.1.7-canary.9';
|
||||
|
||||
export async function serverBuild({
|
||||
dynamicPages,
|
||||
@@ -152,10 +151,7 @@ export async function serverBuild({
|
||||
nextVersion,
|
||||
CORRECTED_MANIFESTS_VERSION
|
||||
);
|
||||
const isNonNestedMiddleware = semver.gte(
|
||||
nextVersion,
|
||||
NON_NESTED_MIDDLEWARE_VERSION
|
||||
);
|
||||
|
||||
let hasStatic500 = !!staticPages[path.join(entryDirectory, '500')];
|
||||
|
||||
if (lambdaPageKeys.length === 0) {
|
||||
@@ -1059,23 +1055,6 @@ export async function serverBuild({
|
||||
});
|
||||
}
|
||||
|
||||
// We stopped duplicating matchers for _next/data routes when we added
|
||||
// x-nextjs-data header resolving but we should still resolve middleware
|
||||
// when the header isn't present so we augment the source to include that.
|
||||
// We don't apply this modification for nested middleware > 1 staticRoute
|
||||
if (isNonNestedMiddleware) {
|
||||
middleware.staticRoutes.forEach(route => {
|
||||
if (!route.src?.match(/_next[\\/]{1,}data/)) {
|
||||
route.src =
|
||||
`^(\\/_next\\/data\\/${escapedBuildId})?(` +
|
||||
route.src
|
||||
?.replace(/\|\^/g, '|')
|
||||
.replace(/\$$/, ')$')
|
||||
.replace(/\$/g, '(\\.json)?$');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
wildcard: wildcardConfig,
|
||||
images:
|
||||
|
||||
@@ -1832,7 +1832,10 @@ export const onPrerenderRoute =
|
||||
if (nonDynamicSsg || isFallback || isOmitted) {
|
||||
outputPathData = outputPathData.replace(
|
||||
new RegExp(`${escapeStringRegexp(origRouteFileNoExt)}.json$`),
|
||||
`${routeFileNoExt}.json`
|
||||
// ensure we escape "$" correctly while replacing as "$" is a special
|
||||
// character, we need to do double escaping as first is for the initial
|
||||
// replace on the routeFile and then the second on the outputPath
|
||||
`${routeFileNoExt.replace(/\$/g, '$$$$')}.json`
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
19
packages/next/test/fixtures/00-i18n-support/pages/$$.js
vendored
Normal file
19
packages/next/test/fixtures/00-i18n-support/pages/$$.js
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
function Page({ date }) {
|
||||
return (
|
||||
<>
|
||||
<h1>$$</h1>
|
||||
<p>Date: {date}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return {
|
||||
props: {
|
||||
date: new Date().toISOString(),
|
||||
page: '$$',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default Page;
|
||||
20
packages/next/test/fixtures/00-i18n-support/pages/$$b.js
vendored
Normal file
20
packages/next/test/fixtures/00-i18n-support/pages/$$b.js
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
function Page({ date }) {
|
||||
return (
|
||||
<>
|
||||
<h1>$$b</h1>
|
||||
<p>Date: {date}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return {
|
||||
props: {
|
||||
date: new Date().toISOString(),
|
||||
page: '$$b',
|
||||
},
|
||||
revalidate: 5,
|
||||
};
|
||||
}
|
||||
|
||||
export default Page;
|
||||
20
packages/next/test/fixtures/00-i18n-support/pages/b$$.js
vendored
Normal file
20
packages/next/test/fixtures/00-i18n-support/pages/b$$.js
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
function Page({ date }) {
|
||||
return (
|
||||
<>
|
||||
<h1>b$$</h1>
|
||||
<p>Date: {date}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return {
|
||||
props: {
|
||||
date: new Date().toISOString(),
|
||||
page: 'b$$',
|
||||
},
|
||||
revalidate: 5,
|
||||
};
|
||||
}
|
||||
|
||||
export default Page;
|
||||
@@ -7,6 +7,36 @@
|
||||
}
|
||||
],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/$$",
|
||||
"status": 200,
|
||||
"mustContain": ">$$<"
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/en/$$.json",
|
||||
"status": 200,
|
||||
"mustContain": "\"$$\""
|
||||
},
|
||||
{
|
||||
"path": "/$$b",
|
||||
"status": 200,
|
||||
"mustContain": ">$$b<"
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/en/$$b.json",
|
||||
"status": 200,
|
||||
"mustContain": "\"$$b\""
|
||||
},
|
||||
{
|
||||
"path": "/b$$",
|
||||
"status": 200,
|
||||
"mustContain": ">b$$<"
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/en/b$$.json",
|
||||
"status": 200,
|
||||
"mustContain": "\"b$$\""
|
||||
},
|
||||
{
|
||||
"path": "/",
|
||||
"headers": {
|
||||
|
||||
@@ -7,13 +7,6 @@
|
||||
}
|
||||
],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/en/about.json",
|
||||
"status": 200,
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/en/about"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/en/dynamic/static.json",
|
||||
"status": 200,
|
||||
@@ -104,16 +97,6 @@
|
||||
},
|
||||
"mustContain": "{}"
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/en/redirect-me.json",
|
||||
"status": 307,
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
},
|
||||
"responseHeaders": {
|
||||
"Location": "/from-middleware/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/en/_sites/subdomain-1.json",
|
||||
"status": 200,
|
||||
|
||||
@@ -7,13 +7,6 @@
|
||||
}
|
||||
],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/about.json",
|
||||
"status": 200,
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/about"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/dynamic/static.json",
|
||||
"status": 200,
|
||||
|
||||
20
packages/next/test/fixtures/00-server-build/pages/$$.js
vendored
Normal file
20
packages/next/test/fixtures/00-server-build/pages/$$.js
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
function Page({ date }) {
|
||||
return (
|
||||
<>
|
||||
<h1>$$</h1>
|
||||
<p>Date: {date}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return {
|
||||
props: {
|
||||
date: new Date().toISOString(),
|
||||
page: '$$',
|
||||
},
|
||||
revalidate: 5,
|
||||
};
|
||||
}
|
||||
|
||||
export default Page;
|
||||
20
packages/next/test/fixtures/00-server-build/pages/$$b.js
vendored
Normal file
20
packages/next/test/fixtures/00-server-build/pages/$$b.js
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
function Page({ date }) {
|
||||
return (
|
||||
<>
|
||||
<h1>$$b</h1>
|
||||
<p>Date: {date}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return {
|
||||
props: {
|
||||
date: new Date().toISOString(),
|
||||
page: '$$b',
|
||||
},
|
||||
revalidate: 5,
|
||||
};
|
||||
}
|
||||
|
||||
export default Page;
|
||||
20
packages/next/test/fixtures/00-server-build/pages/b$$.js
vendored
Normal file
20
packages/next/test/fixtures/00-server-build/pages/b$$.js
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
function Page({ date }) {
|
||||
return (
|
||||
<>
|
||||
<h1>b$$</h1>
|
||||
<p>Date: {date}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return {
|
||||
props: {
|
||||
date: new Date().toISOString(),
|
||||
page: 'b$$',
|
||||
},
|
||||
revalidate: 5,
|
||||
};
|
||||
}
|
||||
|
||||
export default Page;
|
||||
@@ -26,6 +26,36 @@
|
||||
}
|
||||
],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/$$",
|
||||
"status": 200,
|
||||
"mustContain": ">$$<"
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/$$.json",
|
||||
"status": 200,
|
||||
"mustContain": "\"$$\""
|
||||
},
|
||||
{
|
||||
"path": "/$$b",
|
||||
"status": 200,
|
||||
"mustContain": ">$$b<"
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/$$b.json",
|
||||
"status": 200,
|
||||
"mustContain": "\"$$b\""
|
||||
},
|
||||
{
|
||||
"path": "/b$$",
|
||||
"status": 200,
|
||||
"mustContain": ">b$$<"
|
||||
},
|
||||
{
|
||||
"path": "/_next/data/testing-build-id/b$$.json",
|
||||
"status": 200,
|
||||
"mustContain": "\"b$$\""
|
||||
},
|
||||
{
|
||||
"path": "/",
|
||||
"status": 200,
|
||||
|
||||
@@ -47,9 +47,6 @@ describe('Middleware simple project', () => {
|
||||
expect(redirectIndex).toBeLessThan(beforeFilesIndex);
|
||||
expect(middlewareIndex).toBeLessThan(beforeFilesIndex);
|
||||
expect(middlewareIndex).toBeLessThan(handleFileSystemIndex);
|
||||
expect(ctx.buildResult.routes[middlewareIndex].src).toMatch(
|
||||
/_next[\\/]{1,}data/
|
||||
);
|
||||
});
|
||||
|
||||
it('generates deterministic code', async () => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/node",
|
||||
"version": "2.5.4",
|
||||
"version": "2.5.7",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
|
||||
@@ -13,8 +13,7 @@
|
||||
"build": "node build",
|
||||
"test": "jest --env node --verbose --bail --runInBand",
|
||||
"test-unit": "yarn test test/prepare-cache.test.ts test/utils.test.ts",
|
||||
"test-integration-once": "yarn test test/integration-*.test.js",
|
||||
"prepublishOnly": "node build"
|
||||
"test-integration-once": "yarn test test/integration-*.test.js"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
@@ -32,9 +31,9 @@
|
||||
"dependencies": {
|
||||
"@edge-runtime/vm": "1.1.0-beta.23",
|
||||
"@types/node": "*",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/node-bridge": "3.0.0",
|
||||
"@vercel/static-config": "2.0.1",
|
||||
"@vercel/static-config": "2.0.3",
|
||||
"edge-runtime": "1.1.0-beta.23",
|
||||
"esbuild": "0.14.47",
|
||||
"exit-hook": "2.2.1",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/python",
|
||||
"version": "3.1.5",
|
||||
"version": "3.1.8",
|
||||
"main": "./dist/index.js",
|
||||
"license": "MIT",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/python",
|
||||
@@ -17,13 +17,12 @@
|
||||
"build": "node build",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "yarn test test/unit.test.ts",
|
||||
"test-integration-once": "yarn test test/integration.test.ts",
|
||||
"prepublishOnly": "node build"
|
||||
"test-integration-once": "yarn test test/integration.test.ts"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/execa": "^0.9.0",
|
||||
"@types/jest": "27.4.1",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"execa": "^1.0.0",
|
||||
"typescript": "4.3.4"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/redwood",
|
||||
"version": "1.0.14",
|
||||
"version": "1.0.17",
|
||||
"main": "./dist/index.js",
|
||||
"license": "MIT",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -16,18 +16,17 @@
|
||||
"build": "node build.js",
|
||||
"test-integration-once": "yarn test test/test.js",
|
||||
"test": "jest --env node --verbose --bail --runInBand",
|
||||
"test-unit": "yarn test test/prepare-cache.test.js",
|
||||
"prepublishOnly": "node build.js"
|
||||
"test-unit": "yarn test test/prepare-cache.test.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/nft": "0.21.0",
|
||||
"@vercel/routing-utils": "2.0.0",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"semver": "6.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/aws-lambda": "8.10.19",
|
||||
"@types/node": "*",
|
||||
"@types/semver": "6.0.0",
|
||||
"@vercel/build-utils": "5.1.0"
|
||||
"@vercel/build-utils": "5.3.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
glob,
|
||||
debug,
|
||||
getNodeVersion,
|
||||
getPrefixedEnvVars,
|
||||
getSpawnOptions,
|
||||
runNpmInstall,
|
||||
runPackageJsonScript,
|
||||
@@ -54,14 +55,14 @@ export const build: BuildV2 = async ({
|
||||
}) => {
|
||||
await download(files, workPath, meta);
|
||||
|
||||
Object.keys(process.env)
|
||||
.filter(key => key.startsWith('VERCEL_'))
|
||||
.forEach(key => {
|
||||
const newKey = `REDWOOD_ENV_${key}`;
|
||||
if (!(newKey in process.env)) {
|
||||
process.env[newKey] = process.env[key];
|
||||
}
|
||||
});
|
||||
const prefixedEnvs = getPrefixedEnvVars({
|
||||
envPrefix: 'REDWOOD_ENV_',
|
||||
envs: process.env,
|
||||
});
|
||||
|
||||
for (const [key, value] of Object.entries(prefixedEnvs)) {
|
||||
process.env[key] = value;
|
||||
}
|
||||
|
||||
const { installCommand, buildCommand } = config;
|
||||
const mountpoint = dirname(entrypoint);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/remix",
|
||||
"version": "1.0.15",
|
||||
"version": "1.0.18",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -13,8 +13,7 @@
|
||||
"build": "node build.js",
|
||||
"test-integration-once": "yarn test test/test.js",
|
||||
"test": "jest --env node --verbose --bail --runInBand",
|
||||
"test-unit": "yarn test test/build.test.ts",
|
||||
"prepublishOnly": "node build.js"
|
||||
"test-unit": "yarn test test/build.test.ts"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
@@ -26,7 +25,7 @@
|
||||
"devDependencies": {
|
||||
"@types/jest": "27.5.1",
|
||||
"@types/node": "*",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"typescript": "4.6.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/routing-utils",
|
||||
"version": "2.0.0",
|
||||
"version": "2.0.2",
|
||||
"description": "Vercel routing utilities",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -14,9 +14,7 @@
|
||||
},
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"prepublishOnly": "tsc",
|
||||
"build": "tsc",
|
||||
"watch": "tsc --watch",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "yarn test"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@vercel/ruby",
|
||||
"author": "Nathan Cahill <nathan@nathancahill.com>",
|
||||
"version": "1.3.21",
|
||||
"version": "1.3.24",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/ruby",
|
||||
@@ -17,13 +17,12 @@
|
||||
"scripts": {
|
||||
"build": "node build",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-integration-once": "yarn test",
|
||||
"prepublishOnly": "node build"
|
||||
"test-integration-once": "yarn test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/fs-extra": "8.0.0",
|
||||
"@types/semver": "6.0.0",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"execa": "2.0.4",
|
||||
"fs-extra": "^7.0.1",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/static-build",
|
||||
"version": "1.0.14",
|
||||
"version": "1.0.17",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/build-step",
|
||||
@@ -16,8 +16,7 @@
|
||||
"build": "node build",
|
||||
"test": "jest --env node --verbose --bail --runInBand",
|
||||
"test-unit": "yarn test test/build.test.ts test/prepare-cache.test.ts",
|
||||
"test-integration-once": "yarn test test/integration-*.test.js",
|
||||
"prepublishOnly": "node build"
|
||||
"test-integration-once": "yarn test test/integration-*.test.js"
|
||||
},
|
||||
"jest": {
|
||||
"preset": "ts-jest/presets/default",
|
||||
@@ -37,10 +36,10 @@
|
||||
"@types/ms": "0.7.31",
|
||||
"@types/node-fetch": "2.5.4",
|
||||
"@types/promise-timeout": "1.3.0",
|
||||
"@vercel/build-utils": "5.1.0",
|
||||
"@vercel/frameworks": "1.1.1",
|
||||
"@vercel/build-utils": "5.3.0",
|
||||
"@vercel/frameworks": "1.1.3",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"@vercel/routing-utils": "2.0.0",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"fs-extra": "10.0.0",
|
||||
"get-port": "5.0.0",
|
||||
"is-port-reachable": "2.0.1",
|
||||
|
||||
@@ -20,6 +20,7 @@ import {
|
||||
spawnCommand,
|
||||
runNpmInstall,
|
||||
getEnvForPackageManager,
|
||||
getPrefixedEnvVars,
|
||||
getNodeBinPath,
|
||||
runBundleInstall,
|
||||
runPipInstall,
|
||||
@@ -366,22 +367,13 @@ export const build: BuildV2 = async ({
|
||||
`Detected ${framework.name} framework. Optimizing your deployment...`
|
||||
);
|
||||
|
||||
if (process.env.VERCEL_URL) {
|
||||
const vercelSystemEnvPrefix = 'VERCEL_';
|
||||
const { envPrefix } = framework;
|
||||
if (envPrefix) {
|
||||
Object.keys(process.env)
|
||||
.filter(key => key.startsWith(vercelSystemEnvPrefix))
|
||||
.forEach(key => {
|
||||
const newKey = `${envPrefix}${key}`;
|
||||
if (!(newKey in process.env)) {
|
||||
process.env[newKey] = process.env[key];
|
||||
}
|
||||
});
|
||||
const prefixedEnvs = getPrefixedEnvVars({
|
||||
envPrefix: framework.envPrefix,
|
||||
envs: process.env,
|
||||
});
|
||||
|
||||
// tell turbo to exclude all vercel system env vars (envPrefix includes trailing underscore)
|
||||
process.env.TURBO_CI_VENDOR_ENV_KEY = `${envPrefix}${vercelSystemEnvPrefix}`;
|
||||
}
|
||||
for (const [key, value] of Object.entries(prefixedEnvs)) {
|
||||
process.env[key] = value;
|
||||
}
|
||||
|
||||
if (process.env.VERCEL_ANALYTICS_ID) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/static-config",
|
||||
"version": "2.0.1",
|
||||
"version": "2.0.3",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"repository": {
|
||||
@@ -10,9 +10,8 @@
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test-unit": "jest",
|
||||
"test": "jest",
|
||||
"prepublishOnly": "tsc"
|
||||
"test-unit": "yarn test",
|
||||
"test": "jest --env node --verbose --runInBand --bail"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
|
||||
55
yarn.lock
55
yarn.lock
@@ -1035,6 +1035,13 @@
|
||||
dependencies:
|
||||
"@sinclair/typebox" "^0.23.3"
|
||||
|
||||
"@jest/schemas@^28.1.3":
|
||||
version "28.1.3"
|
||||
resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905"
|
||||
integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==
|
||||
dependencies:
|
||||
"@sinclair/typebox" "^0.24.1"
|
||||
|
||||
"@jest/source-map@^28.0.2":
|
||||
version "28.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90"
|
||||
@@ -2060,6 +2067,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.4.tgz#6ff93fd2585ce44f7481c9ff6af610fbb5de98a4"
|
||||
integrity sha512-0/WqSvpVbCBAV1yPeko7eAczKbs78dNVAaX14quVlwOb2wxfKuXCx91h4NrEfkYK9zEnyVSW4JVI/trP3iS+Qg==
|
||||
|
||||
"@sinclair/typebox@^0.24.1":
|
||||
version "0.24.27"
|
||||
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.27.tgz#d55643516a1546174e10da681a8aaa81e757452d"
|
||||
integrity sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==
|
||||
|
||||
"@sindresorhus/is@^0.14.0":
|
||||
version "0.14.0"
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
|
||||
@@ -2653,6 +2665,14 @@
|
||||
jest-matcher-utils "^27.0.0"
|
||||
pretty-format "^27.0.0"
|
||||
|
||||
"@types/jest@28.1.6":
|
||||
version "28.1.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.6.tgz#d6a9cdd38967d2d746861fb5be6b120e38284dd4"
|
||||
integrity sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==
|
||||
dependencies:
|
||||
jest-matcher-utils "^28.0.0"
|
||||
pretty-format "^28.0.0"
|
||||
|
||||
"@types/js-yaml@3.12.1":
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656"
|
||||
@@ -5343,6 +5363,11 @@ diff-sequences@^28.0.2:
|
||||
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41"
|
||||
integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==
|
||||
|
||||
diff-sequences@^28.1.1:
|
||||
version "28.1.1"
|
||||
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6"
|
||||
integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==
|
||||
|
||||
diff@^4.0.1:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
|
||||
@@ -8016,6 +8041,16 @@ jest-diff@^28.0.2:
|
||||
jest-get-type "^28.0.2"
|
||||
pretty-format "^28.0.2"
|
||||
|
||||
jest-diff@^28.1.3:
|
||||
version "28.1.3"
|
||||
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f"
|
||||
integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==
|
||||
dependencies:
|
||||
chalk "^4.0.0"
|
||||
diff-sequences "^28.1.1"
|
||||
jest-get-type "^28.0.2"
|
||||
pretty-format "^28.1.3"
|
||||
|
||||
jest-docblock@^28.0.2:
|
||||
version "28.0.2"
|
||||
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.0.2.tgz#3cab8abea53275c9d670cdca814fc89fba1298c2"
|
||||
@@ -8093,6 +8128,16 @@ jest-matcher-utils@^27.0.0:
|
||||
jest-get-type "^27.5.1"
|
||||
pretty-format "^27.5.1"
|
||||
|
||||
jest-matcher-utils@^28.0.0:
|
||||
version "28.1.3"
|
||||
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e"
|
||||
integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==
|
||||
dependencies:
|
||||
chalk "^4.0.0"
|
||||
jest-diff "^28.1.3"
|
||||
jest-get-type "^28.0.2"
|
||||
pretty-format "^28.1.3"
|
||||
|
||||
jest-matcher-utils@^28.0.2:
|
||||
version "28.0.2"
|
||||
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.0.2.tgz#eb461af204b6d0f05281e9228094f0ab7e9e8537"
|
||||
@@ -10420,6 +10465,16 @@ pretty-format@^27.5.1:
|
||||
ansi-styles "^5.0.0"
|
||||
react-is "^17.0.1"
|
||||
|
||||
pretty-format@^28.0.0, pretty-format@^28.1.3:
|
||||
version "28.1.3"
|
||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5"
|
||||
integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==
|
||||
dependencies:
|
||||
"@jest/schemas" "^28.1.3"
|
||||
ansi-regex "^5.0.1"
|
||||
ansi-styles "^5.0.0"
|
||||
react-is "^18.0.0"
|
||||
|
||||
pretty-format@^28.0.2:
|
||||
version "28.0.2"
|
||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.0.2.tgz#6a24d71cbb61a5e5794ba7513fe22101675481bc"
|
||||
|
||||
Reference in New Issue
Block a user