mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-31 03:39:11 +00:00
Compare commits
19 Commits
@vercel/no
...
remove_sec
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a61bb026b | ||
|
|
c3438ea5ed | ||
|
|
699bd6b2e8 | ||
|
|
7fbe60f8cf | ||
|
|
dadba3b975 | ||
|
|
125eeecb06 | ||
|
|
9d6b78b76e | ||
|
|
d0532107dd | ||
|
|
3d58bd8d27 | ||
|
|
6529a9ab9c | ||
|
|
61e6af3740 | ||
|
|
8e44ef5b9d | ||
|
|
fe9e27c459 | ||
|
|
8a6dc204fd | ||
|
|
73e558913a | ||
|
|
464cb26255 | ||
|
|
80e0bab0ec | ||
|
|
f900ca8daf | ||
|
|
9ee7d31957 |
5
.github/dependabot.yml
vendored
5
.github/dependabot.yml
vendored
@@ -63,16 +63,21 @@ updates:
|
||||
allow:
|
||||
- dependency-name: '@remix-run*'
|
||||
- dependency-name: '@shopify*'
|
||||
- dependency-name: 'remix*'
|
||||
ignore:
|
||||
- dependency-name: '@remix-run*'
|
||||
update-types:
|
||||
['version-update:semver-major', 'version-update:semver-patch']
|
||||
- dependency-name: 'remix*'
|
||||
update-types:
|
||||
['version-update:semver-major', 'version-update:semver-patch']
|
||||
- dependency-name: '@shopify*'
|
||||
update-types:
|
||||
['version-update:semver-major', 'version-update:semver-patch']
|
||||
groups:
|
||||
core:
|
||||
patterns:
|
||||
- 'remix*'
|
||||
- '@remix-run*'
|
||||
- '@shopify*'
|
||||
update-types:
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
# Secret Not Found
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You specified the `--env` or `-e` flag with the value of a secret. However, the secret doesn't exist in the current scope you're in.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Make sure to specify the environment variable and secret like that:
|
||||
|
||||
```bash
|
||||
vercel -e VARIABLE_NAME=@secret-name
|
||||
```
|
||||
|
||||
In addition, ensure that the secret (`@secret-name` in the example above) exists in the current scope (the team or user account that you're using).
|
||||
|
||||
You can run `vercel switch` or `--scope` to switch to a different team or user.
|
||||
@@ -11,9 +11,3 @@ Make sure to set the name and value of the variable like this:
|
||||
```bash
|
||||
vercel -e VARIABLE_NAME="VALUE"
|
||||
```
|
||||
|
||||
You can also specify a environment variable that contains a secret:
|
||||
|
||||
```bash
|
||||
vercel -e VARIABLE_NAME=@secret-name
|
||||
```
|
||||
|
||||
12
internals/types/index.d.ts
vendored
12
internals/types/index.d.ts
vendored
@@ -7,7 +7,6 @@ import { PROJECT_ENV_TARGET } from '@vercel-internals/constants';
|
||||
export type ProjectEnvTarget = typeof PROJECT_ENV_TARGET[number];
|
||||
export type ProjectEnvType =
|
||||
| 'plain'
|
||||
| 'secret'
|
||||
| 'encrypted'
|
||||
| 'system'
|
||||
| 'sensitive';
|
||||
@@ -303,17 +302,6 @@ export interface ProjectAliasTarget {
|
||||
deployment?: Deployment | undefined;
|
||||
}
|
||||
|
||||
export interface Secret {
|
||||
uid: string;
|
||||
name: string;
|
||||
value: string;
|
||||
teamId?: string;
|
||||
userId?: string;
|
||||
projectId?: string;
|
||||
created: string;
|
||||
createdAt: number;
|
||||
}
|
||||
|
||||
export interface ProjectEnvVariable {
|
||||
id: string;
|
||||
key: string;
|
||||
|
||||
@@ -1,5 +1,23 @@
|
||||
# vercel
|
||||
|
||||
## 34.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix related to erroring when a prefetch route is not provided but the route is PPR enabled ([#11638](https://github.com/vercel/vercel/pull/11638))
|
||||
|
||||
- Updated dependencies [[`8e44ef5b9`](https://github.com/vercel/vercel/commit/8e44ef5b9d2cdbe743c7f1e3534f182465fed9bf), [`61e6af374`](https://github.com/vercel/vercel/commit/61e6af3740296c11015d0c3da84ee205020b0ea6)]:
|
||||
- @vercel/next@4.2.13
|
||||
|
||||
## 34.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Support incremental PPR for large applications ([#11625](https://github.com/vercel/vercel/pull/11625))
|
||||
|
||||
- Updated dependencies [[`73e558913`](https://github.com/vercel/vercel/commit/73e558913ab30ba097d7536a12fa8a7c967479f0)]:
|
||||
- @vercel/next@4.2.12
|
||||
|
||||
## 34.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vercel",
|
||||
"version": "34.2.0",
|
||||
"version": "34.2.2",
|
||||
"preferGlobal": true,
|
||||
"license": "Apache-2.0",
|
||||
"description": "The command-line interface for Vercel",
|
||||
@@ -36,7 +36,7 @@
|
||||
"@vercel/fun": "1.1.0",
|
||||
"@vercel/go": "3.1.1",
|
||||
"@vercel/hydrogen": "1.0.2",
|
||||
"@vercel/next": "4.2.11",
|
||||
"@vercel/next": "4.2.13",
|
||||
"@vercel/node": "3.1.5",
|
||||
"@vercel/python": "4.2.0",
|
||||
"@vercel/redwood": "2.0.9",
|
||||
|
||||
@@ -39,7 +39,6 @@ export const help = () => `
|
||||
logs [url] Displays the logs for a deployment
|
||||
projects Manages your Projects
|
||||
rm | remove [id] Removes a deployment
|
||||
secrets [name] Manages your global Secrets, for use in Environment Variables
|
||||
teams Manages your teams
|
||||
whoami Shows the username of the currently logged in user
|
||||
|
||||
|
||||
@@ -32,8 +32,6 @@ export default new Map([
|
||||
['remove', 'remove'],
|
||||
['rm', 'remove'],
|
||||
['rollback', 'rollback'],
|
||||
['secret', 'secrets'],
|
||||
['secrets', 'secrets'],
|
||||
['switch', 'teams'],
|
||||
['team', 'teams'],
|
||||
['teams', 'teams'],
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
import { packageName, getCommandName } from '../../util/pkg-name';
|
||||
|
||||
export const secretsCommand = {
|
||||
name: 'secrets',
|
||||
description:
|
||||
'WARNING: On May 1st, 2024 secrets will be automatically converted to sensitive Environment Variables for Preview and Production environments. Secrets attached to Development environments will not be migrated.\n' +
|
||||
`The ${getCommandName(
|
||||
'secrets'
|
||||
)} command will be deprecated at this time, please use the ${getCommandName(
|
||||
'env'
|
||||
)} command instead.\n` +
|
||||
'See https://vercel.com/changelog/legacy-environment-variable-secrets-are-being-sunset for more information.',
|
||||
arguments: [
|
||||
{
|
||||
name: 'command',
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
subcommands: [
|
||||
{
|
||||
name: 'ls',
|
||||
description: 'Show all secrets in a list',
|
||||
arguments: [],
|
||||
options: [],
|
||||
examples: [],
|
||||
},
|
||||
{
|
||||
name: 'add',
|
||||
description: 'Add a new secret',
|
||||
arguments: [
|
||||
{
|
||||
name: 'name',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'value',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
options: [],
|
||||
examples: [],
|
||||
},
|
||||
{
|
||||
name: 'rename',
|
||||
description: 'Change the name of a secret',
|
||||
arguments: [
|
||||
{
|
||||
name: 'old-name',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'new-name',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
options: [],
|
||||
examples: [],
|
||||
},
|
||||
{
|
||||
name: 'rm',
|
||||
description: 'Remove a secret',
|
||||
arguments: [
|
||||
{
|
||||
name: 'name',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
options: [],
|
||||
examples: [],
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'next',
|
||||
description: 'Show next page of results',
|
||||
argument: 'MS',
|
||||
shorthand: 'n',
|
||||
type: 'string',
|
||||
deprecated: false,
|
||||
multi: false,
|
||||
},
|
||||
],
|
||||
examples: [
|
||||
{
|
||||
name: 'Add a new secret',
|
||||
value: `${packageName} secrets add my-secret "my value"
|
||||
|
||||
- Once added, a secret's value can't be retrieved in plain text anymore
|
||||
- If the secret's value is more than one word, wrap it in quotes
|
||||
- When in doubt, always wrap your value in quotes`,
|
||||
},
|
||||
{
|
||||
name: 'Expose a secret as an environment variable (notice the `@` symbol)',
|
||||
value: `${packageName} -e MY_SECRET=@my-secret`,
|
||||
},
|
||||
{
|
||||
name: 'Paginate results, where 1584722256178 is the time in milliseconds since the UNIX epoch',
|
||||
value: `$ ${packageName} secrets ls --next 1584722256178`,
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -1,309 +0,0 @@
|
||||
import isErrnoException from '@vercel/error-utils';
|
||||
import chalk from 'chalk';
|
||||
import table from '../../util/output/table';
|
||||
import ms from 'ms';
|
||||
import { handleError, error } from '../../util/error';
|
||||
import NowSecrets from '../../util/secrets';
|
||||
import getScope from '../../util/get-scope';
|
||||
import confirm from '../../util/input/confirm';
|
||||
import getCommandFlags from '../../util/get-command-flags';
|
||||
import { getCommandName } from '../../util/pkg-name';
|
||||
import getArgs from '../../util/get-args';
|
||||
import { help } from '../help';
|
||||
import { secretsCommand } from './command';
|
||||
|
||||
// Options
|
||||
let argv;
|
||||
let subcommand;
|
||||
let nextTimestamp;
|
||||
|
||||
const main = async client => {
|
||||
argv = getArgs(client.argv.slice(2), {
|
||||
'--yes': Boolean,
|
||||
'--next': Number,
|
||||
'--test-warning': Boolean,
|
||||
'-y': '--yes',
|
||||
'-N': '--next',
|
||||
});
|
||||
|
||||
argv._ = argv._.slice(1);
|
||||
|
||||
subcommand = argv._[0];
|
||||
nextTimestamp = argv.next;
|
||||
|
||||
if (argv.help || !subcommand) {
|
||||
client.output.print(
|
||||
help(secretsCommand, { columns: client.stderr.columns })
|
||||
);
|
||||
return 2;
|
||||
}
|
||||
|
||||
const {
|
||||
output,
|
||||
config: { currentTeam },
|
||||
} = client;
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
({ contextName } = await getScope(client));
|
||||
} catch (err) {
|
||||
if (isErrnoException(err)) {
|
||||
if (err.code === 'NOT_AUTHORIZED' || err.code === 'TEAM_DELETED') {
|
||||
output.error(err.message);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
throw err;
|
||||
}
|
||||
|
||||
return run({ output, contextName, currentTeam, client });
|
||||
};
|
||||
|
||||
export default async client => {
|
||||
try {
|
||||
return await main(client);
|
||||
} catch (err) {
|
||||
handleError(err);
|
||||
process.exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
async function run({ output, contextName, currentTeam, client }) {
|
||||
const secrets = new NowSecrets({ client, currentTeam });
|
||||
const args = argv._.slice(1);
|
||||
const start = Date.now();
|
||||
const { '--test-warning': testWarningFlag } = argv;
|
||||
|
||||
const commandName = getCommandName('secret ' + subcommand);
|
||||
|
||||
output.warn(
|
||||
'On May 1st, 2024 secrets will be automatically converted to sensitive Environment Variables for Preview and Production environments.\n' +
|
||||
'Secrets attached to Development environments will not be migrated.' +
|
||||
'See https://vercel.com/changelog/legacy-environment-variable-secrets-are-being-sunset for more information.'
|
||||
);
|
||||
|
||||
if (subcommand === 'ls' || subcommand === 'list') {
|
||||
output.note(
|
||||
`The ${getCommandName(
|
||||
'env ls'
|
||||
)} command is recommended instead of ${commandName}\n`
|
||||
);
|
||||
if (args.length > 1) {
|
||||
// consider replacing with `output.error`
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(
|
||||
error(
|
||||
`Invalid number of arguments. Usage: ${chalk.cyan(
|
||||
`${getCommandName('secret ls')}`
|
||||
)}`
|
||||
)
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const { secrets: list, pagination } = await secrets.ls(
|
||||
nextTimestamp,
|
||||
testWarningFlag
|
||||
);
|
||||
const elapsed = ms(Date.now() - start);
|
||||
|
||||
output.print(
|
||||
`${list.length > 0 ? 'Secrets' : 'No secrets'} found under ${chalk.bold(
|
||||
contextName
|
||||
)} ${chalk.gray(`[${elapsed}]`)}\n`
|
||||
);
|
||||
|
||||
if (list.length > 0) {
|
||||
const cur = Date.now();
|
||||
const header = [['', 'name', 'created'].map(s => chalk.dim(s))];
|
||||
const out = table(
|
||||
header.concat(
|
||||
list.map(secret => [
|
||||
'',
|
||||
chalk.bold(secret.name),
|
||||
chalk.gray(`${ms(cur - new Date(secret.created))} ago`),
|
||||
])
|
||||
),
|
||||
{ hsep: 2 }
|
||||
);
|
||||
|
||||
if (out) {
|
||||
client.output.print(`\n${out}\n`);
|
||||
}
|
||||
}
|
||||
|
||||
if (pagination && pagination.count === 20) {
|
||||
const flags = getCommandFlags(argv, ['_', '--next', '-N', '-d', '-y']);
|
||||
const nextCmd = `secrets ${subcommand}${flags} --next ${pagination.next}`;
|
||||
output.log(`To display the next page run ${getCommandName(nextCmd)}`);
|
||||
}
|
||||
return secrets.close();
|
||||
}
|
||||
|
||||
if (subcommand === 'rm' || subcommand === 'remove') {
|
||||
output.note(
|
||||
`The ${getCommandName(
|
||||
'env rm'
|
||||
)} command is recommended instead of ${commandName}\n`
|
||||
);
|
||||
if (args.length !== 1) {
|
||||
// consider replacing with `output.error`
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(
|
||||
error(
|
||||
`Invalid number of arguments. Usage: ${chalk.cyan(
|
||||
`${getCommandName('secret rm <name>')}`
|
||||
)}`
|
||||
)
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const theSecret = await secrets.getSecretByNameOrId(args[0]);
|
||||
|
||||
if (theSecret) {
|
||||
const yes =
|
||||
argv['--yes'] ||
|
||||
(await readConfirmation(client, output, theSecret, contextName));
|
||||
if (!yes) {
|
||||
output.print(`Canceled. Secret not deleted.\n`);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
// consider replacing with `output.error`
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(
|
||||
error(
|
||||
`No secret found by name "${args[0]}" under ${chalk.bold(
|
||||
contextName
|
||||
)}`
|
||||
)
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const secret = await secrets.rm(args[0]);
|
||||
const elapsed = ms(new Date() - start);
|
||||
output.success(
|
||||
`Secret ${chalk.bold(secret.name)} under ${chalk.bold(
|
||||
contextName
|
||||
)} removed ${chalk.gray(`[${elapsed}]`)}`
|
||||
);
|
||||
return secrets.close();
|
||||
}
|
||||
|
||||
if (subcommand === 'rename') {
|
||||
output.note(
|
||||
`The ${getCommandName('env rm')} and ${getCommandName(
|
||||
'env add'
|
||||
)} commands are recommended instead of ${commandName}\n`
|
||||
);
|
||||
if (args.length !== 2) {
|
||||
// consider replacing with `output.error`
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(
|
||||
error(
|
||||
`Invalid number of arguments. Usage: ${chalk.cyan(
|
||||
`${getCommandName('secret rename <old-name> <new-name>')}`
|
||||
)}`
|
||||
)
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
const secret = await secrets.rename(args[0], args[1]);
|
||||
const elapsed = ms(new Date() - start);
|
||||
output.success(
|
||||
`Secret ${chalk.bold(secret.oldName)} renamed to ${chalk.bold(
|
||||
args[1]
|
||||
)} under ${chalk.bold(contextName)} ${chalk.gray(`[${elapsed}]`)}`
|
||||
);
|
||||
return secrets.close();
|
||||
}
|
||||
|
||||
if (subcommand === 'add' || subcommand === 'set') {
|
||||
output.note(
|
||||
`The ${getCommandName(
|
||||
'env add'
|
||||
)} command is recommended instead of ${commandName}\n`
|
||||
);
|
||||
if (args.length !== 2) {
|
||||
// consider replacing with `output.error`
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(
|
||||
error(
|
||||
`Invalid number of arguments. Usage: ${chalk.cyan(
|
||||
`${getCommandName('secret add <name> <value>')}`
|
||||
)}`
|
||||
)
|
||||
);
|
||||
|
||||
if (args.length > 2) {
|
||||
const example = chalk.cyan(
|
||||
`$ ${getCommandName('secret add -- "${args[0]}"')}`
|
||||
);
|
||||
output.log(
|
||||
`If your secret has spaces or starts with '-', make sure to terminate command options with double dash and wrap it in quotes. Example: \n ${example} `
|
||||
);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const [name, value] = args;
|
||||
|
||||
if (typeof value === 'boolean') {
|
||||
const example = chalk.cyan(
|
||||
`$ ${getCommandName('secret add -- "${name}"')}`
|
||||
);
|
||||
output.log(
|
||||
`If your secret starts with '-', make sure to terminate command options with double dash and wrap it in quotes. Example: \n ${example} `
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
await secrets.add(name, value);
|
||||
const elapsed = ms(new Date() - start);
|
||||
|
||||
if (name !== name.toLowerCase()) {
|
||||
output.warn(`Your secret name was converted to lower-case`);
|
||||
}
|
||||
|
||||
output.success(
|
||||
`Secret ${chalk.bold(name.toLowerCase())} added under ${chalk.bold(
|
||||
contextName
|
||||
)} ${chalk.gray(`[${elapsed}]`)}`
|
||||
);
|
||||
return secrets.close();
|
||||
}
|
||||
|
||||
// consider replacing with `output.error`
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(
|
||||
error('Please specify a valid subcommand: ls | add | rename | rm')
|
||||
);
|
||||
client.output.print(help(secretsCommand, { columns: client.stderr.columns }));
|
||||
return 2;
|
||||
}
|
||||
|
||||
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'],
|
||||
hsep: 6,
|
||||
});
|
||||
|
||||
output.print(
|
||||
`The following secret will be removed permanently from ${chalk.bold(
|
||||
contextName
|
||||
)}\n`
|
||||
);
|
||||
output.print(` ${tbl}\n`);
|
||||
|
||||
return confirm(client, `${chalk.bold.red('Are you sure?')}`, false);
|
||||
}
|
||||
@@ -601,9 +601,6 @@ const main = async () => {
|
||||
case 'rollback':
|
||||
func = require('./commands/rollback').default;
|
||||
break;
|
||||
case 'secrets':
|
||||
func = require('./commands/secrets').default;
|
||||
break;
|
||||
case 'teams':
|
||||
func = require('./commands/teams').default;
|
||||
break;
|
||||
|
||||
2
packages/cli/src/util/env/known-error.ts
vendored
2
packages/cli/src/util/env/known-error.ts
vendored
@@ -4,7 +4,6 @@ const knownErrorsCodes = new Set([
|
||||
'BAD_REQUEST',
|
||||
'ENV_ALREADY_EXISTS',
|
||||
'ENV_CONFLICT',
|
||||
'ENV_SHOULD_BE_A_SECRET',
|
||||
'EXISTING_KEY_AND_TARGET',
|
||||
'FORBIDDEN',
|
||||
'ID_NOT_FOUND',
|
||||
@@ -21,7 +20,6 @@ const knownErrorsCodes = new Set([
|
||||
'MISSING_VALUE',
|
||||
'NOT_AUTHORIZED',
|
||||
'NOT_DECRYPTABLE',
|
||||
'SECRET_MISSING',
|
||||
'SYSTEM_ENV_WITH_VALUE',
|
||||
'TEAM_NOT_FOUND',
|
||||
'TOO_MANY_IDS',
|
||||
|
||||
@@ -312,35 +312,6 @@ export default class Now extends EventEmitter {
|
||||
return new Error(error.message || error.errorMessage);
|
||||
}
|
||||
|
||||
async listSecrets(next?: number, testWarningFlag?: boolean) {
|
||||
const payload = await this.retry(async bail => {
|
||||
let secretsUrl = '/v3/now/secrets?limit=20';
|
||||
|
||||
if (next) {
|
||||
secretsUrl += `&until=${next}`;
|
||||
}
|
||||
|
||||
if (testWarningFlag) {
|
||||
secretsUrl += '&testWarning=1';
|
||||
}
|
||||
|
||||
const res = await this._fetch(secretsUrl);
|
||||
|
||||
if (res.status === 200) {
|
||||
// What we want
|
||||
return res.json();
|
||||
}
|
||||
if (res.status > 200 && res.status < 500) {
|
||||
// If something is wrong with our request, we don't retry
|
||||
return bail(await responseError(res, 'Failed to list secrets'));
|
||||
}
|
||||
// If something is wrong with the server, we retry
|
||||
throw await responseError(res, 'Failed to list secrets');
|
||||
});
|
||||
|
||||
return payload;
|
||||
}
|
||||
|
||||
async list(
|
||||
app?: string,
|
||||
{ version = 4, meta = {}, nextTimestamp, target }: ListOptions = {},
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
import Now from '.';
|
||||
|
||||
export default class Secrets extends Now {
|
||||
ls(next, testWarningFlag) {
|
||||
return this.listSecrets(next, testWarningFlag);
|
||||
}
|
||||
|
||||
getSecretByNameOrId(nameOrId) {
|
||||
return this.retry(async (bail, attempt) => {
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.time(`> [debug] #${attempt} GET /secrets/${nameOrId}`);
|
||||
}
|
||||
const res = await this._fetch(`/now/secrets/${nameOrId}`, {
|
||||
method: 'GET',
|
||||
});
|
||||
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.timeEnd(`> [debug] #${attempt} GET /secrets/${nameOrId}`);
|
||||
}
|
||||
|
||||
if (res.status === 403) {
|
||||
return bail(new Error('Unauthorized'));
|
||||
}
|
||||
|
||||
if (res.status === 404) {
|
||||
return bail(new Error('Not Found'));
|
||||
}
|
||||
|
||||
if (res.status === 400) {
|
||||
return bail(new Error('Bad Request'));
|
||||
}
|
||||
|
||||
const body = await res.json();
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error(body.error.message);
|
||||
}
|
||||
|
||||
return body;
|
||||
});
|
||||
}
|
||||
|
||||
rm(nameOrId) {
|
||||
return this.retry(async (bail, attempt) => {
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.time(`> [debug] #${attempt} DELETE /secrets/${nameOrId}`);
|
||||
}
|
||||
|
||||
const res = await this._fetch(`/now/secrets/${nameOrId}`, {
|
||||
method: 'DELETE',
|
||||
});
|
||||
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.timeEnd(`> [debug] #${attempt} DELETE /secrets/${nameOrId}`);
|
||||
}
|
||||
|
||||
if (res.status === 403) {
|
||||
return bail(new Error('Unauthorized'));
|
||||
}
|
||||
|
||||
const body = await res.json();
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error(body.error.message);
|
||||
}
|
||||
|
||||
return body;
|
||||
});
|
||||
}
|
||||
|
||||
add(name, value) {
|
||||
return this.retry(async (bail, attempt) => {
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.time(`> [debug] #${attempt} POST /secrets`);
|
||||
}
|
||||
|
||||
const res = await this._fetch('/now/secrets', {
|
||||
method: 'POST',
|
||||
body: {
|
||||
name,
|
||||
value: value.toString(),
|
||||
},
|
||||
});
|
||||
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.timeEnd(`> [debug] #${attempt} POST /secrets`);
|
||||
}
|
||||
|
||||
if (res.status === 403) {
|
||||
return bail(new Error('Unauthorized'));
|
||||
}
|
||||
|
||||
const body = await res.json();
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error(body.error.message);
|
||||
}
|
||||
|
||||
return body;
|
||||
});
|
||||
}
|
||||
|
||||
rename(nameOrId, newName) {
|
||||
return this.retry(async (bail, attempt) => {
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.time(`> [debug] #${attempt} PATCH /secrets/${nameOrId}`);
|
||||
}
|
||||
|
||||
const res = await this._fetch(`/now/secrets/${nameOrId}`, {
|
||||
method: 'PATCH',
|
||||
body: {
|
||||
name: newName,
|
||||
},
|
||||
});
|
||||
|
||||
if (this._debug) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.timeEnd(`> [debug] #${attempt} PATCH /secrets/${nameOrId}`);
|
||||
}
|
||||
|
||||
if (res.status === 403) {
|
||||
return bail(new Error('Unauthorized'));
|
||||
}
|
||||
|
||||
const body = await res.json();
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error(body.error.message);
|
||||
}
|
||||
|
||||
return body;
|
||||
});
|
||||
}
|
||||
}
|
||||
32
packages/cli/test/fixtures/e2e/cli-extension-exit-code/package-lock.json
generated
vendored
Normal file
32
packages/cli/test/fixtures/e2e/cli-extension-exit-code/package-lock.json
generated
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "cli-extension-exit-code",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"cli-extension-fail": "file:../cli-extension-fail"
|
||||
}
|
||||
},
|
||||
"../cli-extension-fail": {
|
||||
"bin": {
|
||||
"vercel-fail": "bin.js"
|
||||
}
|
||||
},
|
||||
"../cli-extension-whoami": {
|
||||
"extraneous": true,
|
||||
"bin": {
|
||||
"vercel-mywhoami": "bin.js"
|
||||
}
|
||||
},
|
||||
"node_modules/cli-extension-fail": {
|
||||
"resolved": "../cli-extension-fail",
|
||||
"link": true
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"cli-extension-fail": {
|
||||
"version": "file:../cli-extension-fail"
|
||||
}
|
||||
}
|
||||
}
|
||||
6
packages/cli/test/fixtures/e2e/cli-extension-exit-code/package.json
vendored
Normal file
6
packages/cli/test/fixtures/e2e/cli-extension-exit-code/package.json
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"cli-extension-fail": "file:../cli-extension-fail"
|
||||
}
|
||||
}
|
||||
2
packages/cli/test/fixtures/e2e/cli-extension-fail/bin.js
vendored
Executable file
2
packages/cli/test/fixtures/e2e/cli-extension-fail/bin.js
vendored
Executable file
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env node
|
||||
process.exit(6);
|
||||
6
packages/cli/test/fixtures/e2e/cli-extension-fail/package.json
vendored
Normal file
6
packages/cli/test/fixtures/e2e/cli-extension-fail/package.json
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "cli-extension-fail",
|
||||
"bin": {
|
||||
"vercel-fail": "bin.js"
|
||||
}
|
||||
}
|
||||
@@ -205,21 +205,6 @@ module.exports = async function prepare(session, binaryPath, tmpFixturesDir) {
|
||||
name: 'nested-level',
|
||||
}),
|
||||
},
|
||||
'build-secret': {
|
||||
'package.json': JSON.stringify({
|
||||
private: true,
|
||||
scripts: {
|
||||
build: 'mkdir public && echo $MY_SECRET > public/index.txt',
|
||||
},
|
||||
}),
|
||||
'now.json': JSON.stringify({
|
||||
build: {
|
||||
env: {
|
||||
MY_SECRET: '@mysecret',
|
||||
},
|
||||
},
|
||||
}),
|
||||
},
|
||||
'api-env': {
|
||||
'api/get-env.js': 'module.exports = (_, res) => res.json(process.env)',
|
||||
'print.js': 'console.log(JSON.stringify(process.env))',
|
||||
|
||||
43
packages/cli/test/integration-1.test.ts
vendored
43
packages/cli/test/integration-1.test.ts
vendored
@@ -757,42 +757,6 @@ test('Deploy `api-env` fixture and test `vercel env` command', async () => {
|
||||
expect(previewEnvs[0]).toMatch(/Encrypted .* Preview /gm);
|
||||
}
|
||||
|
||||
// we create a "legacy" env variable that contains a decryptable secret
|
||||
// to check that vc env pull and vc dev work correctly with decryptable secrets
|
||||
async function createEnvWithDecryptableSecret() {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('creating an env variable with a decryptable secret');
|
||||
|
||||
const name = `my-secret${Math.floor(Math.random() * 10000)}`;
|
||||
|
||||
const res = await apiFetch('/v2/now/secrets', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
name,
|
||||
value: 'decryptable value',
|
||||
decryptable: true,
|
||||
}),
|
||||
});
|
||||
|
||||
expect(res.status).toBe(200);
|
||||
|
||||
const json = await res.json();
|
||||
|
||||
const link = require(path.join(target, '.vercel/project.json'));
|
||||
|
||||
const resEnv = await apiFetch(`/v4/projects/${link.projectId}/env`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
key: 'MY_DECRYPTABLE_SECRET_ENV',
|
||||
value: json.uid,
|
||||
target: ['development'],
|
||||
type: 'secret',
|
||||
}),
|
||||
});
|
||||
|
||||
expect(resEnv.status).toBe(200);
|
||||
}
|
||||
|
||||
async function vcEnvPull() {
|
||||
const { exitCode, stdout, stderr } = await execCli(
|
||||
binaryPath,
|
||||
@@ -809,7 +773,6 @@ test('Deploy `api-env` fixture and test `vercel env` command', async () => {
|
||||
expect(contents).toMatch(/^# Created by Vercel CLI\n/);
|
||||
expect(contents).toMatch(/MY_NEW_ENV_VAR="my plaintext value"/);
|
||||
expect(contents).toMatch(/MY_STDIN_VAR="{"expect":"quotes"}"/);
|
||||
expect(contents).toMatch(/MY_DECRYPTABLE_SECRET_ENV="decryptable value"/);
|
||||
expect(contents).not.toMatch(/MY_PREVIEW/);
|
||||
}
|
||||
|
||||
@@ -878,14 +841,12 @@ test('Deploy `api-env` fixture and test `vercel env` command', async () => {
|
||||
const apiJson = await apiRes.json();
|
||||
|
||||
expect(apiJson['MY_NEW_ENV_VAR']).toBe('my plaintext value');
|
||||
expect(apiJson['MY_DECRYPTABLE_SECRET_ENV']).toBe('decryptable value');
|
||||
|
||||
const homeUrl = localhost[0];
|
||||
|
||||
const homeRes = await fetch(homeUrl);
|
||||
const homeJson = await homeRes.json();
|
||||
expect(homeJson['MY_NEW_ENV_VAR']).toBe('my plaintext value');
|
||||
expect(homeJson['MY_DECRYPTABLE_SECRET_ENV']).toBe('decryptable value');
|
||||
|
||||
// sleep before kill, otherwise the dev process doesn't clean up and exit properly
|
||||
await sleep(100);
|
||||
@@ -908,14 +869,12 @@ test('Deploy `api-env` fixture and test `vercel env` command', async () => {
|
||||
const apiJson = await apiRes.json();
|
||||
expect(apiJson['MY_NEW_ENV_VAR']).toBe('my plaintext value');
|
||||
expect(apiJson['MY_STDIN_VAR']).toBe('{"expect":"quotes"}');
|
||||
expect(apiJson['MY_DECRYPTABLE_SECRET_ENV']).toBe('decryptable value');
|
||||
|
||||
const homeUrl = localhost[0];
|
||||
const homeRes = await fetch(homeUrl);
|
||||
const homeJson = await homeRes.json();
|
||||
expect(homeJson['MY_NEW_ENV_VAR']).toBe('my plaintext value');
|
||||
expect(homeJson['MY_STDIN_VAR']).toBe('{"expect":"quotes"}');
|
||||
expect(homeJson['MY_DECRYPTABLE_SECRET_ENV']).toBe('decryptable value');
|
||||
|
||||
// system env vars are hidden in dev
|
||||
expect(apiJson['VERCEL']).toBeUndefined();
|
||||
@@ -1060,7 +1019,6 @@ test('Deploy `api-env` fixture and test `vercel env` command', async () => {
|
||||
async function vcEnvRemoveAll() {
|
||||
await vcEnvRemoveByName('MY_PREVIEW');
|
||||
await vcEnvRemoveByName('MY_STDIN_VAR');
|
||||
await vcEnvRemoveByName('MY_DECRYPTABLE_SECRET_ENV');
|
||||
await vcEnvRemoveByName('MY_NEW_ENV_VAR');
|
||||
}
|
||||
|
||||
@@ -1073,7 +1031,6 @@ test('Deploy `api-env` fixture and test `vercel env` command', async () => {
|
||||
await vcEnvAddFromStdinPreview();
|
||||
await vcEnvAddFromStdinPreviewWithBranch();
|
||||
await vcEnvLsIncludesVar();
|
||||
await createEnvWithDecryptableSecret();
|
||||
await vcEnvPull();
|
||||
await vcEnvPullOverwrite();
|
||||
await vcEnvPullConfirm();
|
||||
|
||||
93
packages/cli/test/integration-3.test.ts
vendored
93
packages/cli/test/integration-3.test.ts
vendored
@@ -33,7 +33,6 @@ const binaryPath = path.resolve(__dirname, `../scripts/start.js`);
|
||||
|
||||
const deployHelpMessage = `${logo} vercel [options] <command | path>`;
|
||||
let session = 'temp-session';
|
||||
let secretName: string | undefined;
|
||||
|
||||
function fetchTokenInformation(token: string, retries = 3) {
|
||||
const url = `https://api.vercel.com/v2/user`;
|
||||
@@ -294,32 +293,6 @@ test('output the version', async () => {
|
||||
expect(version).toBe(pkg.version);
|
||||
});
|
||||
|
||||
test('should add secret with hyphen prefix', async () => {
|
||||
const target = await setupE2EFixture('build-secret');
|
||||
const key = 'mysecret';
|
||||
const value = '-foo_bar';
|
||||
|
||||
let secretCall = await execCli(
|
||||
binaryPath,
|
||||
['secrets', 'add', '--', key, value],
|
||||
{
|
||||
cwd: target,
|
||||
}
|
||||
);
|
||||
|
||||
expect(secretCall.exitCode, formatOutput(secretCall)).toBe(0);
|
||||
|
||||
let targetCall = await execCli(binaryPath, ['--yes'], {
|
||||
cwd: target,
|
||||
});
|
||||
|
||||
expect(targetCall.exitCode, formatOutput(targetCall)).toBe(0);
|
||||
const { host } = new URL(targetCall.stdout);
|
||||
const response = await fetch(`https://${host}`);
|
||||
expect(response.status).toBe(200);
|
||||
expect(await response.text()).toBe(`${value}\n`);
|
||||
});
|
||||
|
||||
test('login with unregistered user', async () => {
|
||||
const { stdout, stderr, exitCode } = await execCli(binaryPath, [
|
||||
'login',
|
||||
@@ -1151,59 +1124,6 @@ test('next unsupported functions config shows warning link', async () => {
|
||||
);
|
||||
});
|
||||
|
||||
test('vercel secret add', async () => {
|
||||
secretName = `my-secret-${Date.now().toString(36)}`;
|
||||
const value = 'https://my-secret-endpoint.com';
|
||||
|
||||
const output = await execCli(binaryPath, [
|
||||
'secret',
|
||||
'add',
|
||||
secretName,
|
||||
value,
|
||||
]);
|
||||
expect(output.exitCode, formatOutput(output)).toBe(0);
|
||||
});
|
||||
|
||||
test('vercel secret ls', async () => {
|
||||
const output = await execCli(binaryPath, ['secret', 'ls']);
|
||||
expect(output.exitCode, formatOutput(output)).toBe(0);
|
||||
expect(output.stderr).toMatch(/Secrets found under/gm);
|
||||
});
|
||||
|
||||
test('vercel secret ls --test-warning', async () => {
|
||||
const output = await execCli(binaryPath, ['secret', 'ls', '--test-warning']);
|
||||
expect(output.exitCode, formatOutput(output)).toBe(0);
|
||||
expect(output.stderr).toMatch(/Test warning message./gm);
|
||||
expect(output.stderr).toMatch(/Learn more: https:\/\/vercel.com/gm);
|
||||
expect(output.stderr).toMatch(/No secrets found under/gm);
|
||||
});
|
||||
|
||||
test('vercel secret rename', async () => {
|
||||
if (!secretName) {
|
||||
throw new Error('Shared state "secretName" not set.');
|
||||
}
|
||||
|
||||
const nextName = `renamed-secret-${Date.now().toString(36)}`;
|
||||
const output = await execCli(binaryPath, [
|
||||
'secret',
|
||||
'rename',
|
||||
secretName,
|
||||
nextName,
|
||||
]);
|
||||
expect(output.exitCode, formatOutput(output)).toBe(0);
|
||||
|
||||
secretName = nextName;
|
||||
});
|
||||
|
||||
test('vercel secret rm', async () => {
|
||||
if (!secretName) {
|
||||
throw new Error('Shared state "secretName" not set.');
|
||||
}
|
||||
|
||||
const output = await execCli(binaryPath, ['secret', 'rm', secretName, '-y']);
|
||||
expect(output.exitCode, formatOutput(output)).toBe(0);
|
||||
});
|
||||
|
||||
test('deploy a Lambda with 128MB of memory', async () => {
|
||||
const directory = await setupE2EFixture('lambda-with-128-memory');
|
||||
const output = await execCli(binaryPath, [directory, '--yes']);
|
||||
@@ -1327,6 +1247,19 @@ test('should invoke CLI extension', async () => {
|
||||
expect(output.stdout, formatted).toContain(`Username: ${contextName}`);
|
||||
});
|
||||
|
||||
test('should pass through exit code for CLI extension', async () => {
|
||||
const fixture = path.join(__dirname, 'fixtures/e2e/cli-extension-exit-code');
|
||||
|
||||
// Ensure the `.bin` is populated in the fixture
|
||||
await runNpmInstall(fixture);
|
||||
|
||||
const output = await execCli(binaryPath, ['fail'], {
|
||||
cwd: fixture,
|
||||
reject: false,
|
||||
});
|
||||
expect(output.exitCode).toEqual(6);
|
||||
});
|
||||
|
||||
// NOTE: Order matters here. This must be the last test in the file.
|
||||
test('default command should prompt login with empty auth.json', async () => {
|
||||
await clearAuthConfig();
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
import chance from 'chance';
|
||||
import { client } from './client';
|
||||
|
||||
export function useSecrets({
|
||||
name,
|
||||
created,
|
||||
}: {
|
||||
name: string;
|
||||
created: number;
|
||||
}) {
|
||||
const secret = {
|
||||
uid: chance().guid(),
|
||||
name: name || chance().name(),
|
||||
created: created || chance().timestamp(),
|
||||
};
|
||||
|
||||
client.scenario.get('/v3/now/secrets', (_req, res) => {
|
||||
res.json({
|
||||
secrets: [secret],
|
||||
pagination: {
|
||||
count: 1,
|
||||
next: 0,
|
||||
prev: 0,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
return secret;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { client } from '../../mocks/client';
|
||||
import secrets from '../../../src/commands/secrets';
|
||||
import { useSecrets } from '../../mocks/secrets';
|
||||
import { useUser } from '../../mocks/user';
|
||||
import { useTeams } from '../../mocks/team';
|
||||
import ms from 'ms';
|
||||
|
||||
describe('secrets', () => {
|
||||
it('errors when no subcommand is provided', async () => {
|
||||
client.setArgv('secrets');
|
||||
const exitCode = await secrets(client);
|
||||
|
||||
expect(exitCode).toEqual(2);
|
||||
});
|
||||
|
||||
it('lists secrets with ls subcommand', async () => {
|
||||
useUser();
|
||||
useTeams('team_dummy');
|
||||
const name = 'secret-api-password';
|
||||
const created = 1519555701;
|
||||
useSecrets({ name, created });
|
||||
|
||||
client.setArgv('secrets', 'ls');
|
||||
await secrets(client);
|
||||
|
||||
const timeAgo = `${ms(
|
||||
new Date().getTime() - new Date(created).getTime()
|
||||
)} ago`;
|
||||
await expect(client.stderr).toOutput(
|
||||
'> NOTE: The `vercel env ls` command is recommended instead of `vercel secret ls`'
|
||||
);
|
||||
|
||||
const output = client.stderr.read();
|
||||
await expect(output).toMatch(name);
|
||||
await expect(output).toMatch(timeAgo);
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,19 @@
|
||||
# @vercel/next
|
||||
|
||||
## 4.2.13
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix static case for detecting when a page supports PPR ([#11635](https://github.com/vercel/vercel/pull/11635))
|
||||
|
||||
- Fix related to erroring when a prefetch route is not provided but the route is PPR enabled ([#11638](https://github.com/vercel/vercel/pull/11638))
|
||||
|
||||
## 4.2.12
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Support incremental PPR for large applications ([#11625](https://github.com/vercel/vercel/pull/11625))
|
||||
|
||||
## 4.2.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/next",
|
||||
"version": "4.2.11",
|
||||
"version": "4.2.13",
|
||||
"license": "Apache-2.0",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
|
||||
|
||||
@@ -1358,6 +1358,11 @@ export const build: BuildV2 = async ({
|
||||
experimentalPPRRoutes.add(route);
|
||||
}
|
||||
|
||||
const isAppPPREnabled = requiredServerFilesManifest
|
||||
? requiredServerFilesManifest.config.experimental?.ppr === true ||
|
||||
requiredServerFilesManifest.config.experimental?.ppr === 'incremental'
|
||||
: false;
|
||||
|
||||
if (requiredServerFilesManifest) {
|
||||
if (!routesManifest) {
|
||||
throw new Error(
|
||||
@@ -1413,6 +1418,7 @@ export const build: BuildV2 = async ({
|
||||
hasIsr500Page,
|
||||
variantsManifest,
|
||||
experimentalPPRRoutes,
|
||||
isAppPPREnabled,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1932,7 +1938,7 @@ export const build: BuildV2 = async ({
|
||||
canUsePreviewMode,
|
||||
bypassToken: prerenderManifest.bypassToken || '',
|
||||
isServerMode,
|
||||
experimentalPPRRoutes,
|
||||
isAppPPREnabled: false,
|
||||
hasActionOutputSupport: false,
|
||||
}).then(arr =>
|
||||
localizeDynamicRoutes(
|
||||
@@ -1963,7 +1969,7 @@ export const build: BuildV2 = async ({
|
||||
canUsePreviewMode,
|
||||
bypassToken: prerenderManifest.bypassToken || '',
|
||||
isServerMode,
|
||||
experimentalPPRRoutes,
|
||||
isAppPPREnabled: false,
|
||||
hasActionOutputSupport: false,
|
||||
}).then(arr =>
|
||||
arr.map(route => {
|
||||
@@ -2162,6 +2168,7 @@ export const build: BuildV2 = async ({
|
||||
appPathRoutesManifest,
|
||||
isSharedLambdas,
|
||||
canUsePreviewMode,
|
||||
isAppPPREnabled: false,
|
||||
});
|
||||
|
||||
await Promise.all(
|
||||
|
||||
@@ -144,6 +144,7 @@ export async function serverBuild({
|
||||
requiredServerFilesManifest,
|
||||
variantsManifest,
|
||||
experimentalPPRRoutes,
|
||||
isAppPPREnabled,
|
||||
}: {
|
||||
appPathRoutesManifest?: Record<string, string>;
|
||||
dynamicPages: string[];
|
||||
@@ -185,7 +186,15 @@ export async function serverBuild({
|
||||
requiredServerFilesManifest: NextRequiredServerFilesManifest;
|
||||
variantsManifest: VariantsManifest | null;
|
||||
experimentalPPRRoutes: ReadonlySet<string>;
|
||||
isAppPPREnabled: boolean;
|
||||
}): Promise<BuildResult> {
|
||||
if (isAppPPREnabled) {
|
||||
debug(
|
||||
'experimentalPPRRoutes',
|
||||
JSON.stringify(Array.from(experimentalPPRRoutes))
|
||||
);
|
||||
}
|
||||
|
||||
lambdaPages = Object.assign({}, lambdaPages, lambdaAppPaths);
|
||||
|
||||
const experimentalAllowBundling = Boolean(
|
||||
@@ -217,12 +226,6 @@ export async function serverBuild({
|
||||
}
|
||||
}
|
||||
|
||||
const experimental = {
|
||||
ppr:
|
||||
requiredServerFilesManifest.config.experimental?.ppr === true ||
|
||||
requiredServerFilesManifest.config.experimental?.ppr === 'incremental',
|
||||
};
|
||||
|
||||
let appRscPrefetches: UnwrapPromise<ReturnType<typeof glob>> = {};
|
||||
let appBuildTraces: UnwrapPromise<ReturnType<typeof glob>> = {};
|
||||
let appDir: string | null = null;
|
||||
@@ -230,7 +233,7 @@ export async function serverBuild({
|
||||
if (appPathRoutesManifest) {
|
||||
appDir = path.join(pagesDir, '../app');
|
||||
appBuildTraces = await glob('**/*.js.nft.json', appDir);
|
||||
appRscPrefetches = experimental.ppr
|
||||
appRscPrefetches = isAppPPREnabled
|
||||
? {}
|
||||
: await glob(`**/*${RSC_PREFETCH_SUFFIX}`, appDir);
|
||||
|
||||
@@ -251,7 +254,7 @@ export async function serverBuild({
|
||||
if (rewrite.src && rewrite.dest) {
|
||||
rewrite.src = rewrite.src.replace(
|
||||
/\/?\(\?:\/\)\?/,
|
||||
`(?<rscsuff>${experimental.ppr ? '(\\.prefetch)?' : ''}\\.rsc)?(?:/)?`
|
||||
`(?<rscsuff>${isAppPPREnabled ? '(\\.prefetch)?' : ''}\\.rsc)?(?:/)?`
|
||||
);
|
||||
let destQueryIndex = rewrite.dest.indexOf('?');
|
||||
|
||||
@@ -934,9 +937,6 @@ export async function serverBuild({
|
||||
const appRouterStreamingActionLambdaGroups: LambdaGroup[] = [];
|
||||
|
||||
for (const group of appRouterLambdaGroups) {
|
||||
if (!group.isPrerenders || group.isExperimentalPPR) {
|
||||
group.isStreaming = true;
|
||||
}
|
||||
group.isAppRouter = true;
|
||||
|
||||
// We create a streaming variant of the Prerender lambda group
|
||||
@@ -951,9 +951,6 @@ export async function serverBuild({
|
||||
}
|
||||
|
||||
for (const group of appRouteHandlersLambdaGroups) {
|
||||
if (!group.isPrerenders) {
|
||||
group.isStreaming = true;
|
||||
}
|
||||
group.isAppRouter = true;
|
||||
group.isAppRouteHandler = true;
|
||||
}
|
||||
@@ -984,18 +981,24 @@ export async function serverBuild({
|
||||
apiLambdaGroups: apiLambdaGroups.map(group => ({
|
||||
pages: group.pages,
|
||||
isPrerender: group.isPrerenders,
|
||||
isStreaming: group.isStreaming,
|
||||
isExperimentalPPR: group.isExperimentalPPR,
|
||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
||||
})),
|
||||
pageLambdaGroups: pageLambdaGroups.map(group => ({
|
||||
pages: group.pages,
|
||||
isPrerender: group.isPrerenders,
|
||||
isStreaming: group.isStreaming,
|
||||
isExperimentalPPR: group.isExperimentalPPR,
|
||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
||||
})),
|
||||
appRouterLambdaGroups: appRouterLambdaGroups.map(group => ({
|
||||
pages: group.pages,
|
||||
isPrerender: group.isPrerenders,
|
||||
isStreaming: group.isStreaming,
|
||||
isExperimentalPPR: group.isExperimentalPPR,
|
||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
||||
})),
|
||||
@@ -1003,6 +1006,8 @@ export async function serverBuild({
|
||||
appRouterStreamingActionLambdaGroups.map(group => ({
|
||||
pages: group.pages,
|
||||
isPrerender: group.isPrerenders,
|
||||
isStreaming: group.isStreaming,
|
||||
isExperimentalPPR: group.isExperimentalPPR,
|
||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
||||
})),
|
||||
@@ -1010,6 +1015,8 @@ export async function serverBuild({
|
||||
group => ({
|
||||
pages: group.pages,
|
||||
isPrerender: group.isPrerenders,
|
||||
isStreaming: group.isStreaming,
|
||||
isExperimentalPPR: group.isExperimentalPPR,
|
||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
||||
})
|
||||
@@ -1189,15 +1196,10 @@ export async function serverBuild({
|
||||
|
||||
const lambda = await createLambdaFromPseudoLayers(options);
|
||||
|
||||
// This is a PPR lambda if it's an App Page with the PPR experimental flag
|
||||
// enabled.
|
||||
const isPPR =
|
||||
experimental.ppr && group.isAppRouter && !group.isAppRouteHandler;
|
||||
|
||||
// If PPR is enabled and this is an App Page, create the non-streaming
|
||||
// lambda for the page for revalidation.
|
||||
let revalidate: NodejsLambda | undefined;
|
||||
if (isPPR) {
|
||||
if (group.isExperimentalPPR) {
|
||||
if (!options.isStreaming) {
|
||||
throw new Error("Invariant: PPR lambda isn't streaming");
|
||||
}
|
||||
@@ -1214,14 +1216,11 @@ export async function serverBuild({
|
||||
// This is the name of the page, where the root is `index`.
|
||||
const pageName = pageFilename.replace(/\.js$/, '');
|
||||
|
||||
// This is the name of the page prefixed with a `/`, where the root is
|
||||
// `/index`.
|
||||
const pagePath = path.posix.join('/', pageName);
|
||||
|
||||
// This is the routable pathname for the page, where the root is `/`.
|
||||
const pagePathname = pagePath === '/index' ? '/' : pagePath;
|
||||
const pagePathname = normalizePage(pageName);
|
||||
|
||||
let isPrerender = prerenderRoutes.has(pagePathname);
|
||||
const isRoutePPREnabled = experimentalPPRRoutes.has(pagePathname);
|
||||
|
||||
if (!isPrerender && routesManifest?.i18n) {
|
||||
isPrerender = routesManifest.i18n.locales.some(locale => {
|
||||
@@ -1239,7 +1238,7 @@ export async function serverBuild({
|
||||
}
|
||||
|
||||
// If this is a PPR page, then we should prefix the output name.
|
||||
if (isPPR) {
|
||||
if (isRoutePPREnabled) {
|
||||
if (!revalidate) {
|
||||
throw new Error("Invariant: PPR lambda isn't set");
|
||||
}
|
||||
@@ -1320,6 +1319,13 @@ export async function serverBuild({
|
||||
console.timeEnd(lambdaCreationLabel);
|
||||
}
|
||||
|
||||
if (isAppPPREnabled) {
|
||||
debug(
|
||||
'experimentalStreamingLambdaPaths',
|
||||
JSON.stringify(Array.from(experimentalStreamingLambdaPaths))
|
||||
);
|
||||
}
|
||||
|
||||
const prerenderRoute = onPrerenderRoute({
|
||||
appDir,
|
||||
pagesDir,
|
||||
@@ -1339,6 +1345,7 @@ export async function serverBuild({
|
||||
hasPages404: routesManifest.pages404,
|
||||
isCorrectNotFoundRoutes,
|
||||
isEmptyAllowQueryForPrendered,
|
||||
isAppPPREnabled,
|
||||
});
|
||||
|
||||
await Promise.all(
|
||||
@@ -1407,7 +1414,7 @@ export async function serverBuild({
|
||||
bypassToken: prerenderManifest.bypassToken || '',
|
||||
isServerMode: true,
|
||||
dynamicMiddlewareRouteMap: middleware.dynamicRouteMap,
|
||||
experimentalPPRRoutes,
|
||||
isAppPPREnabled,
|
||||
hasActionOutputSupport,
|
||||
}).then(arr =>
|
||||
localizeDynamicRoutes(
|
||||
@@ -1589,7 +1596,7 @@ export async function serverBuild({
|
||||
if (lambdas[pathname]) {
|
||||
lambdas[`${pathname}.rsc`] = lambdas[pathname];
|
||||
|
||||
if (experimental.ppr) {
|
||||
if (isAppPPREnabled) {
|
||||
lambdas[`${pathname}${RSC_PREFETCH_SUFFIX}`] = lambdas[pathname];
|
||||
}
|
||||
}
|
||||
@@ -1597,7 +1604,7 @@ export async function serverBuild({
|
||||
if (edgeFunctions[pathname]) {
|
||||
edgeFunctions[`${pathname}.rsc`] = edgeFunctions[pathname];
|
||||
|
||||
if (experimental.ppr) {
|
||||
if (isAppPPREnabled) {
|
||||
edgeFunctions[`${pathname}${RSC_PREFETCH_SUFFIX}`] =
|
||||
edgeFunctions[pathname];
|
||||
}
|
||||
@@ -1616,7 +1623,7 @@ export async function serverBuild({
|
||||
'RSC, Next-Router-State-Tree, Next-Router-Prefetch';
|
||||
const appNotFoundPath = path.posix.join('.', entryDirectory, '_not-found');
|
||||
|
||||
if (experimental.ppr && !rscPrefetchHeader) {
|
||||
if (isAppPPREnabled && !rscPrefetchHeader) {
|
||||
throw new Error("Invariant: cannot use PPR without 'rsc.prefetchHeader'");
|
||||
}
|
||||
|
||||
@@ -1624,7 +1631,7 @@ export async function serverBuild({
|
||||
// all the routes that support it (and are listed) have configured lambdas.
|
||||
// This only applies to routes that do not have fallbacks enabled (these are
|
||||
// routes that have `dynamicParams = false` defined.
|
||||
if (experimental.ppr) {
|
||||
if (isAppPPREnabled) {
|
||||
for (const { srcRoute, dataRoute, experimentalPPR } of Object.values(
|
||||
prerenderManifest.staticRoutes
|
||||
)) {
|
||||
@@ -1907,7 +1914,7 @@ export async function serverBuild({
|
||||
|
||||
...(appDir
|
||||
? [
|
||||
...(rscPrefetchHeader && experimental.ppr
|
||||
...(rscPrefetchHeader && isAppPPREnabled
|
||||
? [
|
||||
{
|
||||
src: `^${path.posix.join('/', entryDirectory, '/')}`,
|
||||
|
||||
@@ -192,8 +192,12 @@ function normalizePage(page: string): string {
|
||||
if (!page.startsWith('/')) {
|
||||
page = `/${page}`;
|
||||
}
|
||||
// remove '/index' from the end
|
||||
page = page.replace(/\/index$/, '/');
|
||||
|
||||
// Replace the `/index` with `/`
|
||||
if (page === '/index') {
|
||||
page = '/';
|
||||
}
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
@@ -320,8 +324,8 @@ export async function getDynamicRoutes({
|
||||
bypassToken,
|
||||
isServerMode,
|
||||
dynamicMiddlewareRouteMap,
|
||||
experimentalPPRRoutes,
|
||||
hasActionOutputSupport,
|
||||
isAppPPREnabled,
|
||||
}: {
|
||||
entryPath: string;
|
||||
entryDirectory: string;
|
||||
@@ -333,8 +337,8 @@ export async function getDynamicRoutes({
|
||||
bypassToken?: string;
|
||||
isServerMode?: boolean;
|
||||
dynamicMiddlewareRouteMap?: ReadonlyMap<string, RouteWithSrc>;
|
||||
experimentalPPRRoutes: ReadonlySet<string>;
|
||||
hasActionOutputSupport: boolean;
|
||||
isAppPPREnabled: boolean;
|
||||
}): Promise<RouteWithSrc[]> {
|
||||
if (routesManifest) {
|
||||
switch (routesManifest.version) {
|
||||
@@ -408,7 +412,7 @@ export async function getDynamicRoutes({
|
||||
];
|
||||
}
|
||||
|
||||
if (experimentalPPRRoutes.has(page)) {
|
||||
if (isAppPPREnabled) {
|
||||
let dest = route.dest?.replace(/($|\?)/, '.prefetch.rsc$1');
|
||||
|
||||
if (page === '/' || page === '/index') {
|
||||
@@ -1504,9 +1508,9 @@ export type LambdaGroup = {
|
||||
maxDuration?: number;
|
||||
isAppRouter?: boolean;
|
||||
isAppRouteHandler?: boolean;
|
||||
isStreaming?: boolean;
|
||||
isPrerenders?: boolean;
|
||||
isExperimentalPPR?: boolean;
|
||||
readonly isStreaming: boolean;
|
||||
readonly isPrerenders: boolean;
|
||||
readonly isExperimentalPPR: boolean;
|
||||
isActionLambda?: boolean;
|
||||
isPages?: boolean;
|
||||
isApiLambda: boolean;
|
||||
@@ -1561,6 +1565,7 @@ export async function getPageLambdaGroups({
|
||||
const routeName = normalizePage(page.replace(/\.js$/, ''));
|
||||
const isPrerenderRoute = prerenderRoutes.has(routeName);
|
||||
const isExperimentalPPR = experimentalPPRRoutes?.has(routeName) ?? false;
|
||||
const isStreaming = !isPrerenderRoute || isExperimentalPPR;
|
||||
|
||||
let opts: { memory?: number; maxDuration?: number } = {};
|
||||
|
||||
@@ -1632,6 +1637,7 @@ export async function getPageLambdaGroups({
|
||||
...opts,
|
||||
isPrerenders: isPrerenderRoute,
|
||||
isExperimentalPPR,
|
||||
isStreaming,
|
||||
isApiLambda: !!isApiPage(page),
|
||||
pseudoLayerBytes: initialPseudoLayer.pseudoLayerBytes,
|
||||
pseudoLayerUncompressedBytes: initialPseudoLayerUncompressed,
|
||||
@@ -1948,6 +1954,7 @@ type OnPrerenderRouteArgs = {
|
||||
routesManifest?: RoutesManifest;
|
||||
isCorrectNotFoundRoutes?: boolean;
|
||||
isEmptyAllowQueryForPrendered?: boolean;
|
||||
isAppPPREnabled: boolean;
|
||||
};
|
||||
let prerenderGroup = 1;
|
||||
|
||||
@@ -1984,6 +1991,7 @@ export const onPrerenderRoute =
|
||||
routesManifest,
|
||||
isCorrectNotFoundRoutes,
|
||||
isEmptyAllowQueryForPrendered,
|
||||
isAppPPREnabled,
|
||||
} = prerenderRouteArgs;
|
||||
|
||||
if (isBlocking && isFallback) {
|
||||
@@ -2219,22 +2227,6 @@ export const onPrerenderRoute =
|
||||
initialStatus = 404;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the route key had an `/index` suffix added, we need to note it so we
|
||||
* can remove it from the output path later accurately.
|
||||
*/
|
||||
let addedIndexSuffix = false;
|
||||
|
||||
if (isAppPathRoute) {
|
||||
// for literal index routes we need to append an additional /index
|
||||
// due to the proxy's normalizing for /index routes
|
||||
if (routeKey !== '/index' && routeKey.endsWith('/index')) {
|
||||
routeKey = `${routeKey}/index`;
|
||||
routeFileNoExt = routeKey;
|
||||
addedIndexSuffix = true;
|
||||
}
|
||||
}
|
||||
|
||||
let outputPathPage = path.posix.join(entryDirectory, routeFileNoExt);
|
||||
|
||||
if (!isAppPathRoute) {
|
||||
@@ -2271,7 +2263,7 @@ export const onPrerenderRoute =
|
||||
|
||||
let outputPathPrefetchData: null | string = null;
|
||||
if (prefetchDataRoute) {
|
||||
if (!experimentalPPR) {
|
||||
if (!isAppPPREnabled) {
|
||||
throw new Error(
|
||||
"Invariant: prefetchDataRoute can't be set without PPR"
|
||||
);
|
||||
@@ -2428,7 +2420,7 @@ export const onPrerenderRoute =
|
||||
// static route first, then try the srcRoute if it doesn't exist. If we
|
||||
// can't find it at all, this constitutes an error.
|
||||
experimentalStreamingLambdaPath = experimentalStreamingLambdaPaths.get(
|
||||
pathnameToOutputName(entryDirectory, routeKey, addedIndexSuffix)
|
||||
pathnameToOutputName(entryDirectory, routeKey)
|
||||
);
|
||||
if (!experimentalStreamingLambdaPath && srcRoute) {
|
||||
experimentalStreamingLambdaPath =
|
||||
@@ -2689,19 +2681,10 @@ export function getNextServerPath(nextVersion: string) {
|
||||
: 'next/dist/next-server/server';
|
||||
}
|
||||
|
||||
function pathnameToOutputName(
|
||||
entryDirectory: string,
|
||||
pathname: string,
|
||||
addedIndexSuffix = false
|
||||
) {
|
||||
function pathnameToOutputName(entryDirectory: string, pathname: string) {
|
||||
if (pathname === '/') {
|
||||
pathname = '/index';
|
||||
}
|
||||
// If the `/index` was added for a route that ended in `/index` we need to
|
||||
// strip the second one off before joining it with the entryDirectory.
|
||||
else if (addedIndexSuffix) {
|
||||
pathname = pathname.replace(/\/index$/, '');
|
||||
}
|
||||
|
||||
return path.posix.join(entryDirectory, pathname);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
3
packages/next/test/fixtures/00-app-dir-incremental-ppr/app/static/page.jsx
vendored
Normal file
3
packages/next/test/fixtures/00-app-dir-incremental-ppr/app/static/page.jsx
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function Page() {
|
||||
return <div id="sentinel:static">Static</div>;
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -56,6 +56,11 @@
|
||||
"status": 200,
|
||||
"mustContain": "sentinel:dynamic"
|
||||
},
|
||||
{
|
||||
"path": "/static",
|
||||
"status": 200,
|
||||
"mustContain": "sentinel:static"
|
||||
},
|
||||
{
|
||||
"path": "/disabled",
|
||||
"headers": {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
export const metadata = {
|
||||
metadataBase: new URL(process.env.VERCEL_PROJECT_PRODUCTION_URL ?? 'http://localhost:3000'),
|
||||
};
|
||||
|
||||
export default function Root({ children }) {
|
||||
return (
|
||||
<html className="this-is-the-document-html">
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "20.4.5",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430",
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522",
|
||||
"typescript": "4.9.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "next build website-preview"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
]
|
||||
},
|
||||
"overrides": {
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
]
|
||||
},
|
||||
"overrides": {
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
"chrome-aws-lambda": "8.0.0",
|
||||
"firebase": "8.3.0",
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"scripts": {
|
||||
"vercel-build": "next build"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
"@types/node": "^12.12.56",
|
||||
"@types/react": "^16.9.49",
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430",
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522",
|
||||
"typescript": "4.9.5"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "19.0.0-beta-4508873393-20240430",
|
||||
"react-dom": "19.0.0-beta-4508873393-20240430"
|
||||
"react": "19.0.0-rc-f994737d14-20240522",
|
||||
"react-dom": "19.0.0-rc-f994737d14-20240522"
|
||||
},
|
||||
"ignoreNextjsUpdates": true
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user