Compare commits

..

5 Commits

Author SHA1 Message Date
Sean Massa
31f79c7de1 Publish Stable
- vercel@27.4.0
 - @vercel/go@2.1.0
 - @vercel/next@3.1.17
2022-08-09 16:11:57 -05:00
Craig Andrews
4c230c8436 [go] add lambda wrapper support to the go runtime (#8350)
Co-authored-by: Sean Massa <EndangeredMassa@gmail.com>
2022-08-09 16:08:20 -05:00
Lee Robinson
7941f5a104 [examples] Update Astro template for 1.0. (#8357)
To prepare for [Astro 1.0](https://github.com/withastro/astro/releases/tag/astro%401.0.0-rc.1), this PR updates the template (it has [been deployed](https://astro-template.vercel.app/)).
2022-08-09 18:09:38 +00:00
JJ Kasper
5b931afbf3 [next] Ensure $$ in ISR page is handled correctly (#8359)
* Ensure $$ in ISR page is handled correctly

* update test

* Remove duplicate tests

* add comment

* tweak
2022-08-09 11:13:15 -05:00
Chris Barber
15080364b8 [cli] Standardize on --yes instead of --confirm (#8330)
Allow for `--yes` flag consistently throughout CLI commands.

Also adds a deprecation warning for usage of `--confirm`,
since `--yes` is now preferred.
2022-08-08 18:05:22 -07:00
46 changed files with 1344 additions and 1413 deletions

View File

@@ -18,3 +18,4 @@ pnpm-debug.log*
# macOS-specific files
.DS_Store
.vercel

View File

@@ -1 +0,0 @@
README.md

View File

@@ -1,10 +1,16 @@
# Welcome to [Astro](https://astro.build)
# Astro
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](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.
[![Deploy with Vercel](https://vercel.com/button)](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 |

View File

@@ -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"
}
}

View 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>&rarr;</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>

View File

@@ -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
View File

@@ -0,0 +1 @@
/// <reference types="astro/client" />

View 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>

View File

@@ -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>&rarr;</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>&rarr;</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>&rarr;</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>&rarr;</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>

View File

@@ -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

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "27.3.8",
"version": "27.4.0",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -42,9 +42,9 @@
},
"dependencies": {
"@vercel/build-utils": "5.3.0",
"@vercel/go": "2.0.16",
"@vercel/go": "2.1.0",
"@vercel/hydrogen": "0.0.13",
"@vercel/next": "3.1.16",
"@vercel/next": "3.1.17",
"@vercel/node": "2.5.7",
"@vercel/python": "3.1.8",
"@vercel/redwood": "1.0.17",

View File

@@ -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:')}

View File

@@ -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:')}

View File

@@ -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:')}

View File

@@ -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']) {

View File

@@ -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,7 +54,7 @@ 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;

View File

@@ -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']);

View File

@@ -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);

View File

@@ -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:')}

View File

@@ -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(

View File

@@ -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()];

View File

@@ -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;

View File

@@ -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;

View File

@@ -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:')}

View File

@@ -9,6 +9,7 @@ type LinkResult = {
org: Org;
project: Project;
};
export async function ensureLink(
commandName: string,
client: Client,

View File

@@ -305,7 +305,7 @@ function testFixtureStdio(
? ['--scope', process.env.VERCEL_TEAM_ID]
: []),
'link',
'--confirm',
'--yes',
],
{ cwd, stdio: 'pipe', reject: false }
);

View File

@@ -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 }
);

View File

@@ -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(

View File

@@ -321,7 +321,7 @@ export async function build({
}
}
const mainModGoFileName = 'main__mod__.go';
const mainModGoFileName = 'main.go';
const modMainGoContents = await readFile(
join(__dirname, mainModGoFileName),
'utf8'
@@ -449,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
@@ -498,6 +497,7 @@ export async function build({
files: { ...(await glob('**', outDir)), ...includedFiles },
handler: handlerFileName,
runtime: 'go1.x',
supportsWrapper: true,
environment: {},
});

View File

@@ -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))
}

View File

@@ -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))
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/go",
"version": "2.0.16",
"version": "2.1.0",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",

View File

@@ -0,0 +1 @@
module env

View 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"))
}

View 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."
}
]
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/next",
"version": "3.1.16",
"version": "3.1.17",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",

View File

@@ -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`
);
}

View 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;

View 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;

View 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;

View File

@@ -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": {

View 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;

View 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;

View 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;

View File

@@ -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,