Compare commits

...

13 Commits

Author SHA1 Message Date
chloetedder
ada9a48d57 Publish Stable
- @vercel/build-utils@6.0.1
 - vercel@28.14.1
 - @vercel/client@12.3.4
 - @vercel/fs-detectors@3.7.7
 - @vercel/gatsby-plugin-vercel-builder@1.0.3
 - @vercel/go@2.3.0
 - @vercel/hydrogen@0.0.46
 - @vercel/next@3.3.20
 - @vercel/node@2.8.17
 - @vercel/python@3.1.42
 - @vercel/redwood@1.0.53
 - @vercel/remix@1.2.9
 - @vercel/ruby@1.3.58
 - @vercel/static-build@1.3.1
2023-01-30 15:19:54 -07:00
chloetedder
31f3daa5b4 [fs-detectors] getMonorepoDefaultSettings: Fix settings (#9315)
1. `commandForIgnoringBuildStep` should be run at the project directory level not the monorepo root level
2. Simplifying the `installCommand` because doesn't need the relative root unless it is `npm`
2023-01-30 18:35:42 +00:00
Steven
fdf7fd6784 [go] Add support for Go 1.19 (#9343)
![image](https://user-images.githubusercontent.com/229881/215526900-fef3e4e0-d1a6-4327-b68f-d8bb9068e2a0.png)
2023-01-30 17:08:10 +00:00
Bryan Eaton
db216f903f [tests] Fix github action restore cache timeout (#9342)
Github Action for actions/cache has an issue that could cause it to take
1 hour and then timeout while trying to restore the cache.

Since `actions/setup-node` is no longer used to restore the pnpm cache,
the `timeout-minutes: 5` doesn't do anything for this action.

Instead we need to put an env variable on the `actions/cache` Github
Action to actually set the restore cache timeout.

```
env:
  SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5 # See https://github.com/actions/cache/issues/810
```

- See discussion here https://github.com/vercel/vercel/discussions/9340
- Related to actions/cache#810
- Follow up to #8639
2023-01-30 10:42:00 -05:00
Nathan Rajlich
40a55b11d5 [gatsby-plugin-vercel-builder] Downgrade esbuild to v0.14.47 (#9329)
So that there will only be one copy in the dependency tree between `@vercel/node` and `@vercel/gatsby-plugin-vercel-builder`
2023-01-28 17:03:27 +00:00
Nathan Rajlich
5da537124c [static-build] Add integration test for Gatsby Function (#9330) 2023-01-27 14:00:29 -08:00
JJ Kasper
54aaab83aa [docs] Replace references to @now/next in error docs (#9331)
It's been long enough I think we can change these to refer to
`@vercel/next` instead.

x-ref: [slack
thread](https://vercel.slack.com/archives/C03DQ3QFV7C/p1674849801196389)
2023-01-27 16:59:42 -05:00
Chris Barber
7110cb449b [go] Improved 'go build' error handling (#9320)
The `go` builder doesn't properly handle when `go build` fails. There are 2 failure scenarios:

1. The `go` binary is not found in the `PATH`. There is no message that the `go` executable was not found. Worse, the builder continues and fails trying to run the compiled executable:

![image](https://user-images.githubusercontent.com/97262/214765157-f5244467-7bc8-48e8-8fcf-385efc32b283.png)

The solution is to switch from `spawnSync()` to `execFileSync()` so that if `go` is not found, it will throw like this:

<img width="507" alt="image" src="https://user-images.githubusercontent.com/97262/214765388-792ce59a-79f5-4bc8-8088-472969729558.png">
Note: I temporarily changed the code to spawn `gooooo` to simulate `go` not being found. Either way, `execFileSync()` will throw and we get a helpful message.

2. The `go build` fails due to some actual build error. This should never happen, but better safe than sorry.

The solution here is to allow `go build` to inherit stdout/stderr and if `go build` should fail, we can see the output:

<img width="574" alt="image" src="https://user-images.githubusercontent.com/97262/214765614-c414f160-ad8e-4bd2-a628-b5a91dcc88d8.png">
2023-01-27 20:07:03 +00:00
Chris Barber
89a15681d5 [build-utils] Rewrite rename() to be more efficient (#9322)
Around 6 months ago, @styfle brought to my attention how `rename()` in build-utils used `reduce()` and could be written better. So, I rewrote it.

Before, the code would create a new `Files` object and copy the contents of the previous `Files` object. This caused heavy garbage collection and memory thrashing.

Instead, I created a single `Files` object, then add the files to it.

Results:

| # Files | Before | After |
|---|---|---|
| 1,000 | 75 ms | 1 ms |
| 10,000 | 10.6 s | 7 ms |
| 20,000 | 44.6 s | 16 ms |
| 30,000 | 105.5 s | 22 ms |
| 100,000 | Too long | 73 ms |
2023-01-27 18:21:59 +00:00
Ethan Arrowood
9317543c48 Publish Stable
- vercel@28.14.0
 - @vercel/gatsby-plugin-vercel-builder@1.0.2
 - @vercel/static-build@1.3.0
2023-01-27 10:12:32 -07:00
Nathan Rajlich
e3f326f714 [gatsby-plugin-vercel-builder] Don't delete .vercel/output (#9327)
`.vercel/output` is already made fresh when running `vc build`, so the
plugin should not be doing this. In fact, it makes the `builds.json`
file be wiped away, which we don't want to happen.
2023-01-27 09:08:22 -08:00
Ethan Arrowood
eed6a377f1 [static-build] Cleanup gatsby file changes after static-build completes (#9312)
Adds a new function that restores the user's `gatsby-config.(j|t|mj)s` and `gatsby-node.(j|t|mj)s` files
2023-01-27 16:23:02 +00:00
Nathan Rajlich
c16d9e6784 [static-build] Include Gatsby plugins as regular dependencies (#9313)
Right now, static-build will add the necessary Gatsby plugins to the project's `package.json` at build-time, which has been bothersome for package managers when using a frozen lockfile.

Another issue with it is that we install `latest` version of the plugin, so the version used becomes disjointed from the CLI version itself, which leads to unpredictability when trying to debug issues or help users roll back to a previous behavior if something breaks.

So instead of patching `package.json` directly, include the plugins as deps of static-build itself, and create symlinks to those paths into the project's `node_modules` directory.
2023-01-26 20:15:58 +00:00
46 changed files with 494 additions and 618 deletions

View File

@@ -39,7 +39,6 @@ jobs:
- name: Setup Node
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with:
node-version: 14
- name: Cache
@@ -49,6 +48,8 @@ jobs:
path: '**/node_modules'
key: pnpm-${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: pnpm-${{ matrix.os }}-${{ matrix.node }}
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5 # See https://github.com/actions/cache/issues/810
- name: install pnpm@7.24.2
run: npm i -g pnpm@7.24.2
- name: Install

View File

@@ -35,7 +35,6 @@ jobs:
with:
go-version: '1.18'
- uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with:
node-version: ${{ matrix.node }}
- uses: actions/cache@v3
@@ -43,6 +42,8 @@ jobs:
path: '**/node_modules'
key: pnpm-${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: pnpm-${{ matrix.os }}-${{ matrix.node }}
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5 # See https://github.com/actions/cache/issues/810
- name: install pnpm@7.24.2
run: npm i -g pnpm@7.24.2
- run: pnpm install

View File

@@ -35,7 +35,6 @@ jobs:
with:
fetch-depth: 2
- uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with:
node-version: ${{ matrix.node }}
- uses: actions/cache@v3
@@ -43,6 +42,8 @@ jobs:
path: '**/node_modules'
key: pnpm-${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: pnpm-${{ matrix.os }}-${{ matrix.node }}
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5 # See https://github.com/actions/cache/issues/810
- name: install pnpm@7.24.2
run: npm i -g pnpm@7.24.2
- run: pnpm install

View File

@@ -33,7 +33,6 @@ jobs:
with:
go-version: '1.13.15'
- uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with:
node-version: ${{ env.NODE_VERSION }}
- uses: actions/cache@v3
@@ -41,6 +40,8 @@ jobs:
path: '**/node_modules'
key: pnpm-${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: pnpm-${{ matrix.os }}-${{ matrix.node }}
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5 # See https://github.com/actions/cache/issues/810
- name: install pnpm@7.24.2
run: npm i -g pnpm@7.24.2
- run: pnpm install
@@ -76,7 +77,6 @@ jobs:
with:
go-version: '1.13.15'
- uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with:
node-version: ${{ env.NODE_VERSION }}
- uses: actions/cache@v3
@@ -84,6 +84,8 @@ jobs:
path: '**/node_modules'
key: pnpm-${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: pnpm-${{ matrix.os }}-${{ matrix.node }}
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5 # See https://github.com/actions/cache/issues/810
- name: Install Hugo
if: matrix.runner == 'macos-latest'

View File

@@ -1,8 +1,8 @@
# `@now/next` Legacy Mode
# `@vercel/next` Legacy Mode
#### Why This Warning Occurred
`@now/next` has two modes: `legacy` and `serverless`. You will always want to use the `serverless` mode. `legacy` is to provide backwards compatibility with previous `@now/next` versions.
`@vercel/next` has two modes: `legacy` and `serverless`. You will always want to use the `serverless` mode. `legacy` is to provide backwards compatibility with previous `@vercel/next` versions.
The differences:
@@ -63,7 +63,7 @@ module.exports = {
```js
{
"version": 2,
"builds": [{ "src": "package.json", "use": "@now/next" }]
"builds": [{ "src": "package.json", "use": "@vercel/next" }]
}
```

View File

@@ -1,4 +1,4 @@
# `@now/next` No Serverless Pages Built
# `@vercel/next` No Serverless Pages Built
#### Why This Error Occurred
@@ -33,13 +33,13 @@ module.exports = {
};
```
4. Remove `distDir` from `next.config.js` as `@now/next` can't parse this file and expects your build output at `/.next`
4. Remove `distDir` from `next.config.js` as `@vercel/next` can't parse this file and expects your build output at `/.next`
5. Optionally make sure the `"src"` in `"builds"` points to your application `package.json`
```js
{
"version": 2,
"builds": [{ "src": "package.json", "use": "@now/next" }]
"builds": [{ "src": "package.json", "use": "@vercel/next" }]
}
```

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/build-utils",
"version": "6.0.0",
"version": "6.0.1",
"license": "MIT",
"main": "./dist/index.js",
"types": "./dist/index.d.js",

View File

@@ -1,12 +1,17 @@
import { Files } from '../types';
type Delegate = (name: string) => string;
/**
* Renames the keys of a `Files` map.
*
* @param files A map of filenames to `File` instances
* @param delegate A function that returns the new filename
* @returns A new file map with the renamed filenames
*/
export default function rename(files: Files, delegate: Delegate): Files {
return Object.keys(files).reduce(
(newFiles, name) => ({
...newFiles,
[delegate(name)]: files[name],
}),
{}
);
const result: Files = {};
for (const [name, file] of Object.entries(files)) {
result[delegate(name)] = file;
}
return result;
}

View File

@@ -4,14 +4,17 @@ import fs from 'fs-extra';
import { strict as assert } from 'assert';
import { getSupportedNodeVersion } from '../src/fs/node-version';
import {
FileBlob,
getNodeVersion,
getLatestNodeVersion,
getDiscontinuedNodeVersions,
rename,
runNpmInstall,
runPackageJsonScript,
scanParentDirs,
Prerender,
} from '../src';
import type { Files } from '../src';
jest.setTimeout(10 * 1000);
@@ -451,3 +454,18 @@ it('should retry npm install when peer deps invalid and npm@8 on node@16', async
'Warning: Retrying "Install Command" with `--legacy-peer-deps` which may accept a potentially broken dependency and slow install time.',
]);
});
describe('rename', () => {
it('should rename keys of files map', () => {
const before: Files = {};
const toUpper = (s: string) => s.toUpperCase();
for (let i = 97; i <= 122; i++) {
const key = String.fromCharCode(i);
before[key] = new FileBlob({ contentType: 'text/plain', data: key });
}
const after = rename(before, toUpper);
expect(Object.keys(after)).toEqual('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''));
});
});

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "28.13.2",
"version": "28.14.1",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -41,16 +41,16 @@
"node": ">= 14"
},
"dependencies": {
"@vercel/build-utils": "6.0.0",
"@vercel/go": "2.2.31",
"@vercel/hydrogen": "0.0.45",
"@vercel/next": "3.3.19",
"@vercel/node": "2.8.16",
"@vercel/python": "3.1.41",
"@vercel/redwood": "1.0.52",
"@vercel/remix": "1.2.8",
"@vercel/ruby": "1.3.57",
"@vercel/static-build": "1.2.1"
"@vercel/build-utils": "6.0.1",
"@vercel/go": "2.3.0",
"@vercel/hydrogen": "0.0.46",
"@vercel/next": "3.3.20",
"@vercel/node": "2.8.17",
"@vercel/python": "3.1.42",
"@vercel/redwood": "1.0.53",
"@vercel/remix": "1.2.9",
"@vercel/ruby": "1.3.58",
"@vercel/static-build": "1.3.1"
},
"devDependencies": {
"@alex_neo/jest-expect-message": "1.0.5",
@@ -93,10 +93,10 @@
"@types/which": "1.3.2",
"@types/write-json-file": "2.2.1",
"@types/yauzl-promise": "2.1.0",
"@vercel/client": "12.3.3",
"@vercel/client": "12.3.4",
"@vercel/error-utils": "1.0.8",
"@vercel/frameworks": "1.3.0",
"@vercel/fs-detectors": "3.7.6",
"@vercel/fs-detectors": "3.7.7",
"@vercel/fun": "1.0.4",
"@vercel/ncc": "0.24.0",
"@vercel/routing-utils": "2.1.8",

View File

@@ -1229,13 +1229,13 @@ describe('build', () => {
turbo: {
name: 'Turbo',
buildCommand: 'cd ../.. && npx turbo run build --filter=app-1...',
installCommand: 'cd ../.. && yarn install',
ignoreCommand: 'cd ../.. && npx turbo-ignore',
installCommand: 'yarn install',
ignoreCommand: 'npx turbo-ignore',
},
nx: {
name: 'Nx',
buildCommand: 'cd ../.. && npx nx build app-1',
installCommand: 'cd ../.. && yarn install',
installCommand: 'yarn install',
},
// rush: {
// name: 'Rush',

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/client",
"version": "12.3.3",
"version": "12.3.4",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"homepage": "https://vercel.com",
@@ -43,7 +43,7 @@
]
},
"dependencies": {
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/routing-utils": "2.1.8",
"@zeit/fetch": "5.2.0",
"async-retry": "1.2.3",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/fs-detectors",
"version": "3.7.6",
"version": "3.7.7",
"description": "Vercel filesystem detectors",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -35,7 +35,7 @@
"@types/minimatch": "3.0.5",
"@types/node": "14.18.33",
"@types/semver": "7.3.10",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"typescript": "4.3.4"
}
}

View File

@@ -67,8 +67,11 @@ export async function getMonorepoDefaultSettings(
return {
monorepoManager: 'turbo',
buildCommand: `cd ${relativeToRoot} && npx turbo run build --filter={${projectPath}}...`,
installCommand: `cd ${relativeToRoot} && ${packageManager} install`,
commandForIgnoringBuildStep: `cd ${relativeToRoot} && npx turbo-ignore`,
installCommand:
packageManager === 'npm'
? `${packageManager} install --prefix=${relativeToRoot}`
: `${packageManager} install`,
commandForIgnoringBuildStep: `npx turbo-ignore`,
};
} else if (monorepoManager === 'nx') {
// No ENOENT handling required here since conditional wouldn't be `true` unless `nx.json` was found.
@@ -111,7 +114,10 @@ export async function getMonorepoDefaultSettings(
return {
monorepoManager: 'nx',
buildCommand: `cd ${relativeToRoot} && npx nx build ${projectName}`,
installCommand: `cd ${relativeToRoot} && ${packageManager} install`,
installCommand:
packageManager === 'npm'
? `${packageManager} install --prefix=${relativeToRoot}`
: `${packageManager} install`,
};
}
// TODO (@Ethan-Arrowood) - Revisit rush support when we can test it better

View File

@@ -1,5 +1,5 @@
{
"name": "app-1",
"name": "app-11",
"version": "0.0.1",
"nx": {
"targets": {

View File

@@ -1,5 +1,5 @@
{
"name": "app-1",
"name": "app-10",
"version": "0.0.1",
"nx": {
"targets": {}

View File

@@ -1,5 +1,5 @@
{
"name": "app-1",
"name": "app-9",
"version": "0.0.1",
"nx": {
"targets": {

View File

@@ -1,4 +1,4 @@
{
"name": "app-1",
"name": "app-8",
"version": "0.0.1"
}

View File

@@ -1,4 +1,4 @@
{
"name": "app-1",
"name": "app-12",
"version": "0.0.1"
}

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1,9 @@
{
"private": true,
"workspaces": [
"packages/*"
],
"devDependencies": {
"turbo": "1.6.3"
}
}

View File

@@ -0,0 +1,4 @@
{
"name": "app-15",
"version": "0.0.1"
}

View File

@@ -0,0 +1 @@
{ "pipeline": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] } } }

View File

@@ -1,4 +1,4 @@
{
"name": "app-1",
"name": "app-13",
"version": "0.0.1"
}

View File

@@ -1,4 +1,4 @@
{
"name": "app-1",
"name": "app-14",
"version": "0.0.1"
}

View File

@@ -26,26 +26,27 @@ describe('getMonorepoDefaultSettings', () => {
});
test.each([
['turbo', 'turbo'],
['turbo-package-config', 'turbo'],
['nx', 'nx'],
['nx-package-config', 'nx'],
['nx-project-and-package-config-1', 'nx'],
['nx-project-and-package-config-2', 'nx'],
['nx-project-config', 'nx'],
])('fixture %s', async (fixture, expectedResultKey) => {
['turbo', 'turbo', false, 'app-14'],
['turbo-package-config', 'turbo', false, 'app-13'],
['turbo-npm', 'turbo', true, 'app-15'],
['nx', 'nx', false, 'app-12'],
['nx-package-config', 'nx', false, 'app-11'],
['nx-project-and-package-config-1', 'nx', false, 'app-10'],
['nx-project-and-package-config-2', 'nx', false, 'app-9'],
['nx-project-config', 'nx', false, 'app-8'],
])('fixture %s', async (fixture, expectedResultKey, isNpm, packageName) => {
const expectedResultMap: Record<string, Record<string, string>> = {
turbo: {
monorepoManager: 'turbo',
buildCommand:
'cd ../.. && npx turbo run build --filter={packages/app-1}...',
installCommand: 'cd ../.. && yarn install',
commandForIgnoringBuildStep: 'cd ../.. && npx turbo-ignore',
installCommand: isNpm ? 'npm install --prefix=../..' : 'yarn install',
commandForIgnoringBuildStep: 'npx turbo-ignore',
},
nx: {
monorepoManager: 'nx',
buildCommand: 'cd ../.. && npx nx build app-1',
installCommand: 'cd ../.. && yarn install',
buildCommand: `cd ../.. && npx nx build ${packageName}`,
installCommand: 'yarn install',
},
};
@@ -53,7 +54,7 @@ describe('getMonorepoDefaultSettings', () => {
path.join(__dirname, 'fixtures', 'get-monorepo-default-settings', fixture)
);
const result = await getMonorepoDefaultSettings(
'app-1',
packageName,
'packages/app-1',
'../..',
ffs

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/gatsby-plugin-vercel-builder",
"version": "1.0.1",
"version": "1.0.3",
"main": "dist/index.js",
"files": [
"dist",
@@ -14,11 +14,11 @@
"build:src": "tsc -p tsconfig.src.json"
},
"dependencies": {
"@vercel/build-utils": "6.0.0",
"@vercel/node": "2.8.16",
"@vercel/build-utils": "6.0.1",
"@vercel/node": "2.8.17",
"@vercel/routing-utils": "2.1.8",
"ajv": "8.12.0",
"esbuild": "0.16.17",
"esbuild": "0.14.47",
"etag": "1.8.1",
"fs-extra": "11.1.0"
},

View File

@@ -1,6 +1,5 @@
import { join } from 'path';
import { getTransformedRoutes } from '@vercel/routing-utils';
import { writeJson, remove } from 'fs-extra';
import { writeJson } from 'fs-extra';
import { validateGatsbyState } from './schemas';
import {
createServerlessFunctions,
@@ -32,7 +31,6 @@ export async function generateVercelBuildOutputAPI3Output({
if (validateGatsbyState(state)) {
console.log('▲ Creating Vercel build output');
await remove(join('.vercel', 'output'));
const { pages, redirects, functions, config: gatsbyConfig } = state;

View File

@@ -6,6 +6,7 @@ import { join, delimiter } from 'path';
import stringArgv from 'string-argv';
import { debug } from '@vercel/build-utils';
const versionMap = new Map([
['1.19', '1.19.5'],
['1.18', '1.18.1'],
['1.17', '1.17.3'],
['1.16', '1.16.10'],

View File

@@ -1,7 +1,7 @@
import execa from 'execa';
import retry from 'async-retry';
import { homedir, tmpdir } from 'os';
import { spawn, spawnSync } from 'child_process';
import { execFileSync, spawn } from 'child_process';
import { Readable } from 'stream';
import once from '@tootallnate/once';
import { join, dirname, basename, normalize, sep } from 'path';
@@ -694,9 +694,10 @@ Learn more: https://vercel.com/docs/runtimes#official-runtimes/go`
}`;
debug(`SPAWNING go build -o ${executable} ./... CWD=${tmp}`);
spawnSync('go', ['build', '-o', executable, './...'], {
execFileSync('go', ['build', '-o', executable, './...'], {
cwd: tmp,
env,
stdio: 'inherit',
});
debug(`SPAWNING ${executable} CWD=${tmp}`);

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/go",
"version": "2.2.31",
"version": "2.3.0",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
@@ -36,7 +36,7 @@
"@types/node": "14.18.33",
"@types/node-fetch": "^2.3.0",
"@types/tar": "^4.0.0",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/ncc": "0.24.0",
"async-retry": "1.3.1",
"execa": "^1.0.0",

View File

@@ -5,10 +5,10 @@
{ "src": "subdirectory/index.go", "use": "@vercel/go" }
],
"probes": [
{ "path": "/", "mustContain": "cow:go1.18.1:RANDOMNESS_PLACEHOLDER" },
{ "path": "/", "mustContain": "cow:go1.19.5:RANDOMNESS_PLACEHOLDER" },
{
"path": "/subdirectory",
"mustContain": "subcow:go1.18.1:RANDOMNESS_PLACEHOLDER"
"mustContain": "subcow:go1.19.5:RANDOMNESS_PLACEHOLDER"
}
]
}

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/hydrogen",
"version": "0.0.45",
"version": "0.0.46",
"license": "MIT",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -21,7 +21,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "14.18.33",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/static-config": "2.0.11",
"execa": "3.2.0",
"fs-extra": "11.1.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/next",
"version": "3.3.19",
"version": "3.3.20",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -45,7 +45,7 @@
"@types/semver": "6.0.0",
"@types/text-table": "0.2.1",
"@types/webpack-sources": "3.2.0",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/nft": "0.22.5",
"@vercel/routing-utils": "2.1.8",
"async-sema": "3.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/node",
"version": "2.8.16",
"version": "2.8.17",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
@@ -31,7 +31,7 @@
"dependencies": {
"@edge-runtime/vm": "2.0.0",
"@types/node": "14.18.33",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/node-bridge": "3.1.10",
"@vercel/static-config": "2.0.11",
"edge-runtime": "2.0.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/python",
"version": "3.1.41",
"version": "3.1.42",
"main": "./dist/index.js",
"license": "MIT",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/python",
@@ -23,7 +23,7 @@
"@types/execa": "^0.9.0",
"@types/jest": "27.4.1",
"@types/node": "14.18.33",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/ncc": "0.24.0",
"execa": "^1.0.0",
"typescript": "4.3.4"

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/redwood",
"version": "1.0.52",
"version": "1.0.53",
"main": "./dist/index.js",
"license": "MIT",
"homepage": "https://vercel.com/docs",
@@ -27,7 +27,7 @@
"@types/aws-lambda": "8.10.19",
"@types/node": "14.18.33",
"@types/semver": "6.0.0",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"execa": "3.2.0",
"fs-extra": "11.1.0",
"typescript": "4.3.4"

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/remix",
"version": "1.2.8",
"version": "1.2.9",
"license": "MIT",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -24,7 +24,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "14.18.33",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"typescript": "4.9.4"
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "@vercel/ruby",
"author": "Nathan Cahill <nathan@nathancahill.com>",
"version": "1.3.57",
"version": "1.3.58",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/ruby",
@@ -22,7 +22,7 @@
"devDependencies": {
"@types/fs-extra": "8.0.0",
"@types/semver": "6.0.0",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/ncc": "0.24.0",
"execa": "2.0.4",
"fs-extra": "^7.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/static-build",
"version": "1.2.1",
"version": "1.3.1",
"license": "MIT",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/build-step",
@@ -15,7 +15,7 @@
"scripts": {
"build": "node build",
"test": "jest --env node --verbose --bail --runInBand",
"test-unit": "pnpm test test/build.test.ts test/gatsby.test.js test/prepare-cache.test.ts",
"test-unit": "pnpm test test/build.test.ts test/gatsby.test.ts test/prepare-cache.test.ts",
"test-integration-once": "pnpm test test/integration-*.test.js"
},
"jest": {
@@ -28,6 +28,10 @@
}
}
},
"dependencies": {
"@vercel/gatsby-plugin-vercel-analytics": "1.0.7",
"@vercel/gatsby-plugin-vercel-builder": "1.0.3"
},
"devDependencies": {
"@types/aws-lambda": "8.10.64",
"@types/cross-spawn": "6.0.0",
@@ -38,11 +42,9 @@
"@types/node-fetch": "2.5.4",
"@types/promise-timeout": "1.3.0",
"@types/semver": "7.3.13",
"@vercel/build-utils": "6.0.0",
"@vercel/build-utils": "6.0.1",
"@vercel/frameworks": "1.3.0",
"@vercel/fs-detectors": "3.7.6",
"@vercel/gatsby-plugin-vercel-analytics": "1.0.7",
"@vercel/gatsby-plugin-vercel-builder": "1.0.1",
"@vercel/fs-detectors": "3.7.7",
"@vercel/ncc": "0.24.0",
"@vercel/routing-utils": "2.1.8",
"@vercel/static-config": "2.0.11",

View File

@@ -43,9 +43,7 @@ import type { ImagesConfig, BuildConfig } from './utils/_shared';
import treeKill from 'tree-kill';
import {
detectFrameworkRecord,
detectFramework,
LocalFileSystemDetector,
packageManagers,
} from '@vercel/fs-detectors';
const sleep = (n: number) => new Promise(resolve => setTimeout(resolve, n));
@@ -391,20 +389,7 @@ export const build: BuildV2 = async ({
}
if (framework.slug === 'gatsby') {
const injectedPlugins = await GatsbyUtils.injectPlugins(
detectedVersion,
entrypointDir
);
if (injectedPlugins) {
const packageManager = await detectFramework({
fs: localFileSystemDetector,
frameworkList: packageManagers,
});
if (packageManager === 'pnpm') {
await execCommand('pnpm install --lockfile-only');
}
}
await GatsbyUtils.injectPlugins(detectedVersion, entrypointDir);
}
if (process.env.VERCEL_ANALYTICS_ID) {
@@ -526,6 +511,10 @@ export const build: BuildV2 = async ({
}
}
if (framework?.slug === 'gatsby') {
await GatsbyUtils.createPluginSymlinks(entrypointDir);
}
let gemHome: string | undefined = undefined;
const pathList = [];
@@ -636,32 +625,38 @@ export const build: BuildV2 = async ({
debug(`Executing "${buildCommand}"`);
}
const found =
typeof buildCommand === 'string'
? await execCommand(buildCommand, {
...spawnOpts,
try {
const found =
typeof buildCommand === 'string'
? await execCommand(buildCommand, {
...spawnOpts,
// Yarn v2 PnP mode may be activated, so force
// "node-modules" linker style
env: {
YARN_NODE_LINKER: 'node-modules',
...spawnOpts.env,
},
// Yarn v2 PnP mode may be activated, so force
// "node-modules" linker style
env: {
YARN_NODE_LINKER: 'node-modules',
...spawnOpts.env,
},
cwd: entrypointDir,
})
: await runPackageJsonScript(
entrypointDir,
['vercel-build', 'now-build', 'build'],
spawnOpts
);
cwd: entrypointDir,
})
: await runPackageJsonScript(
entrypointDir,
['vercel-build', 'now-build', 'build'],
spawnOpts
);
if (!found) {
throw new Error(
`Missing required "${
buildCommand || 'vercel-build'
}" script in "${entrypoint}"`
);
if (!found) {
throw new Error(
`Missing required "${
buildCommand || 'vercel-build'
}" script in "${entrypoint}"`
);
}
} finally {
if (framework?.slug === 'gatsby') {
await GatsbyUtils.cleanupGatsbyFiles(entrypointDir);
}
}
const outputDirPrefix = path.join(workPath, path.dirname(entrypoint));

View File

@@ -1,16 +1,7 @@
import { PackageJson } from '@vercel/build-utils';
import { promises as fs } from 'fs';
import fs from 'fs-extra';
import * as path from 'path';
import semver from 'semver';
import { URL } from 'url';
import {
fileExists,
readPackageJson,
DeepWriteable,
writePackageJson,
} from './_shared';
const { VERCEL_CLI_VERSION } = process.env;
import { fileExists } from './_shared';
const PLUGINS = [
'@vercel/gatsby-plugin-vercel-analytics',
@@ -21,13 +12,24 @@ type PluginName = typeof PLUGINS[number];
const GATSBY_CONFIG_FILE = 'gatsby-config';
const GATSBY_NODE_FILE = 'gatsby-node';
const PLUGIN_PATHS: Record<PluginName, string> = {
'@vercel/gatsby-plugin-vercel-analytics': path.dirname(
eval('require').resolve(
`@vercel/gatsby-plugin-vercel-analytics/package.json`
)
),
'@vercel/gatsby-plugin-vercel-builder': path.dirname(
eval('require').resolve(`@vercel/gatsby-plugin-vercel-builder/package.json`)
),
};
export async function injectPlugins(
detectedVersion: string | null,
dir: string
) {
const plugins = new Set<PluginName>();
if (process.env.VERCEL_GATSBY_BUILDER_PLUGIN && detectedVersion) {
if (process.env.VERCEL_GATSBY_BUILDER_PLUGIN === '1' && detectedVersion) {
const version = semver.coerce(detectedVersion);
if (version && semver.satisfies(version, '>=4.0.0')) {
plugins.add('@vercel/gatsby-plugin-vercel-builder');
@@ -43,7 +45,17 @@ export async function injectPlugins(
return false;
}
const ops = [addGatsbyPackage(dir, plugins)];
let pluginsStr = 'plugin';
if (plugins.size > 1) {
pluginsStr += 's';
}
console.log(
`Injecting Gatsby.js ${pluginsStr} ${Array.from(plugins)
.map(p => `"${p}"`)
.join(', ')}`
);
const ops = [];
if (plugins.has('@vercel/gatsby-plugin-vercel-analytics')) {
ops.push(
@@ -60,76 +72,31 @@ export async function injectPlugins(
return true;
}
function printInjectingPlugins(
plugins: Iterable<PluginName>,
configPath: string
) {
const pluginsArray = Array.from(plugins);
let pluginsStr = 'plugin';
if (pluginsArray.length > 1) {
pluginsStr += 's';
}
console.log(
`Injecting Gatsby.js ${pluginsStr} ${pluginsArray
.map(p => `"${p}"`)
.join(', ')} to \`${configPath}\``
);
}
async function addGatsbyPackage(
dir: string,
plugins: Iterable<PluginName>
): Promise<void> {
const pkgJson = (await readPackageJson(dir)) as DeepWriteable<PackageJson>;
if (!pkgJson.dependencies) {
pkgJson.dependencies = {};
}
for (const plugin of plugins) {
if (!pkgJson.dependencies[plugin]) {
console.log(`Adding "${plugin}" to \`package.json\` "dependencies"`);
let version = 'latest';
// Use the tarball URL for E2E tests
if (VERCEL_CLI_VERSION?.startsWith('https://')) {
version = new URL(`./${plugin}.tgz`, VERCEL_CLI_VERSION).href;
}
pkgJson.dependencies[plugin] = version;
}
}
await writePackageJson(dir, pkgJson);
}
async function updateGatsbyConfig(dir: string, plugins: Iterable<PluginName>) {
async function updateGatsbyConfig(dir: string, plugins: string[]) {
const gatsbyConfigPathTs = path.join(dir, `${GATSBY_CONFIG_FILE}.ts`);
const gatsbyConfigPathMjs = path.join(dir, `${GATSBY_CONFIG_FILE}.mjs`);
const gatsbyConfigPathJs = path.join(dir, `${GATSBY_CONFIG_FILE}.js`);
if (await fileExists(gatsbyConfigPathTs)) {
printInjectingPlugins(plugins, gatsbyConfigPathTs);
await updateGatsbyConfigTs(gatsbyConfigPathTs, plugins);
} else if (await fileExists(gatsbyConfigPathMjs)) {
printInjectingPlugins(plugins, gatsbyConfigPathMjs);
await updateGatsbyConfigMjs(gatsbyConfigPathMjs, plugins);
} else if (await fileExists(gatsbyConfigPathJs)) {
await updateGatsbyConfigJs(gatsbyConfigPathJs, plugins);
} else {
printInjectingPlugins(plugins, gatsbyConfigPathJs);
if (await fileExists(gatsbyConfigPathJs)) {
await updateGatsbyConfigJs(gatsbyConfigPathJs, plugins);
} else {
await fs.writeFile(
gatsbyConfigPathJs,
`module.exports = ${JSON.stringify({
plugins: Array.from(plugins),
})}`
);
}
await fs.writeFile(
gatsbyConfigPathJs,
`module.exports = ${JSON.stringify({
plugins,
})}`
);
}
}
const GENERATED_FILE_COMMENT = `// This file was generated by @vercel/static-build`;
async function updateGatsbyConfigTs(
configPath: string,
plugins: Iterable<PluginName>
plugins: string[]
): Promise<void> {
const renamedPath = `${configPath}.__vercel_builder_backup__.ts`;
if (!(await fileExists(renamedPath))) {
@@ -138,7 +105,8 @@ async function updateGatsbyConfigTs(
await fs.writeFile(
configPath,
`import userConfig from "./gatsby-config.ts.__vercel_builder_backup__.ts";
`${GENERATED_FILE_COMMENT}
import userConfig from "./gatsby-config.ts.__vercel_builder_backup__.ts";
import type { PluginRef } from "gatsby";
const preferDefault = (m: any) => (m && m.default) || m;
@@ -152,7 +120,7 @@ if (!vercelConfig.plugins) {
vercelConfig.plugins = [];
}
for (const plugin of ${JSON.stringify(Array.from(plugins))}) {
for (const plugin of ${JSON.stringify(plugins)}) {
const hasPlugin = vercelConfig.plugins.find(
(p: PluginRef) =>
p && (p === plugin || p.resolve === plugin)
@@ -171,7 +139,7 @@ export default vercelConfig;
async function updateGatsbyConfigMjs(
configPath: string,
plugins: Iterable<PluginName>
plugins: string[]
): Promise<void> {
const renamedPath = `${configPath}.__vercel_builder_backup__.mjs`;
if (!(await fileExists(renamedPath))) {
@@ -180,7 +148,8 @@ async function updateGatsbyConfigMjs(
await fs.writeFile(
configPath,
`import userConfig from "./gatsby-config.mjs.__vercel_builder_backup__.mjs";
`${GENERATED_FILE_COMMENT}
import userConfig from "./gatsby-config.mjs.__vercel_builder_backup__.mjs";
const preferDefault = (m) => (m && m.default) || m;
@@ -188,11 +157,12 @@ const vercelConfig = Object.assign(
{},
preferDefault(userConfig)
);
if (!vercelConfig.plugins) {
vercelConfig.plugins = [];
}
for (const plugin of ${JSON.stringify(Array.from(plugins))}) {
for (const plugin of ${JSON.stringify(plugins)}) {
const hasPlugin = vercelConfig.plugins.find(
(p) => p && (p === plugin || p.resolve === plugin)
);
@@ -210,7 +180,7 @@ export default vercelConfig;
async function updateGatsbyConfigJs(
configPath: string,
plugins: Iterable<PluginName>
plugins: string[]
): Promise<void> {
const renamedPath = `${configPath}.__vercel_builder_backup__.js`;
if (!(await fileExists(renamedPath))) {
@@ -219,7 +189,8 @@ async function updateGatsbyConfigJs(
await fs.writeFile(
configPath,
`const userConfig = require("./gatsby-config.js.__vercel_builder_backup__.js");
`${GENERATED_FILE_COMMENT}
const userConfig = require("./gatsby-config.js.__vercel_builder_backup__.js");
const preferDefault = m => (m && m.default) || m;
@@ -227,11 +198,12 @@ const vercelConfig = Object.assign(
{},
preferDefault(userConfig)
);
if (!vercelConfig.plugins) {
vercelConfig.plugins = [];
}
for (const plugin of ${JSON.stringify(Array.from(plugins))}) {
for (const plugin of ${JSON.stringify(plugins)}) {
const hasPlugin = vercelConfig.plugins.find(
(p) => p && (p === plugin || p.resolve === plugin)
);
@@ -272,7 +244,8 @@ async function updateGatsbyNodeTs(configPath: string) {
await fs.writeFile(
configPath,
`import type { GatsbyNode } from 'gatsby';
`${GENERATED_FILE_COMMENT}
import type { GatsbyNode } from 'gatsby';
import * as vercelBuilder from '@vercel/gatsby-plugin-vercel-builder/gatsby-node.js';
import * as gatsbyNode from './gatsby-node.ts.__vercel_builder_backup__.ts';
@@ -296,7 +269,8 @@ async function updateGatsbyNodeMjs(configPath: string) {
await fs.writeFile(
configPath,
`import * as vercelBuilder from '@vercel/gatsby-plugin-vercel-builder/gatsby-node.js';
`${GENERATED_FILE_COMMENT}
import * as vercelBuilder from '@vercel/gatsby-plugin-vercel-builder/gatsby-node.js';
import * as gatsbyNode from './gatsby-node.mjs.__vercel_builder_backup__.mjs';
export * from './gatsby-node.mjs.__vercel_builder_backup__.mjs';
@@ -319,7 +293,8 @@ async function updateGatsbyNodeJs(configPath: string) {
await fs.writeFile(
configPath,
`const vercelBuilder = require('@vercel/gatsby-plugin-vercel-builder/gatsby-node.js');
`${GENERATED_FILE_COMMENT}
const vercelBuilder = require('@vercel/gatsby-plugin-vercel-builder/gatsby-node.js');
const gatsbyNode = require('./gatsby-node.js.__vercel_builder_backup__.js');
const origOnPostBuild = gatsbyNode.onPostBuild;
@@ -335,3 +310,46 @@ module.exports = gatsbyNode;
`
);
}
export async function cleanupGatsbyFiles(dir: string) {
const backup = '.__vercel_builder_backup__';
const fileEndings = ['.js', '.ts', '.mjs'];
for (const fileName of [GATSBY_CONFIG_FILE, GATSBY_NODE_FILE]) {
for (const fileEnding of fileEndings) {
const baseFile = `${fileName}${fileEnding}`;
const baseFilePath = path.join(dir, baseFile);
const backupFile = `${baseFile}${backup}${fileEnding}`;
const backupFilePath = path.join(dir, backupFile);
const [baseFileContent, backupFileContent] = await Promise.all([
fs.readFile(baseFilePath, 'utf-8').catch(() => null),
fs.readFile(backupFilePath, 'utf-8').catch(() => null),
]);
if (
baseFileContent &&
baseFileContent.startsWith(GENERATED_FILE_COMMENT)
) {
await fs.rm(baseFilePath);
}
if (backupFileContent) {
await fs.rename(backupFilePath, baseFilePath);
}
}
}
}
export async function createPluginSymlinks(dir: string) {
const nodeModulesDir = path.join(dir, 'node_modules');
await fs.ensureDir(path.join(nodeModulesDir, '@vercel'));
await Promise.all(
PLUGINS.map(name => fs.remove(path.join(nodeModulesDir, name)))
);
await Promise.all(
PLUGINS.map(name =>
fs.symlink(PLUGIN_PATHS[name], path.join(nodeModulesDir, name))
)
);
}

View File

@@ -25,6 +25,10 @@
{
"path": "/asset.txt",
"mustContain": "asset that was added in `onPostBuild`"
},
{
"path": "/api/hello",
"mustContain": "{\"message\":\"A ok!\"}"
}
]
}

View File

@@ -0,0 +1,4 @@
export default function handler(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.status(200).json({ message: 'A ok!' });
}

View File

@@ -1,4 +1,8 @@
import { injectPlugins } from '../src/utils/gatsby';
import {
injectPlugins,
createPluginSymlinks,
cleanupGatsbyFiles,
} from '../src/utils/gatsby';
import path from 'path';
import {
detectFrameworkRecord,
@@ -58,19 +62,9 @@ describe('gatsby utilities', () => {
const fixture = await prepareFixture(path.join(fixturesPath, 'gatsby-v3'));
const version = await detectVersion(fixture);
await injectPlugins(version, fixture);
const [packageJSON, gatsbyConfig] = await Promise.all([
fs.readFile(path.join(fixture, 'package.json'), 'utf-8'),
const [gatsbyConfig] = await Promise.all([
fs.readFile(path.join(fixture, 'gatsby-config.js'), 'utf-8'),
]);
expect(packageJSON).toMatchInlineSnapshot(`
"{
\\"dependencies\\": {
\\"gatsby\\": \\"3.0.0\\",
\\"@vercel/gatsby-plugin-vercel-analytics\\": \\"latest\\"
}
}
"
`);
expect(gatsbyConfig).toMatchInlineSnapshot(
`"module.exports = {\\"plugins\\":[\\"@vercel/gatsby-plugin-vercel-analytics\\"]}"`
);
@@ -82,21 +76,10 @@ describe('gatsby utilities', () => {
const fixture = await prepareFixture(path.join(fixturesPath, 'gatsby-v4'));
const version = await detectVersion(fixture);
await injectPlugins(version, fixture);
const [packageJSON, gatsbyNode, gatsbyConfig] = await Promise.all([
fs.readFile(path.join(fixture, 'package.json'), 'utf-8'),
const [gatsbyNode, gatsbyConfig] = await Promise.all([
fs.readFile(path.join(fixture, 'gatsby-node.js'), 'utf-8'),
fs.readFile(path.join(fixture, 'gatsby-config.js'), 'utf-8'),
]);
expect(packageJSON).toMatchInlineSnapshot(`
"{
\\"dependencies\\": {
\\"gatsby\\": \\"4.25.2\\",
\\"@vercel/gatsby-plugin-vercel-builder\\": \\"latest\\",
\\"@vercel/gatsby-plugin-vercel-analytics\\": \\"latest\\"
}
}
"
`);
expect(gatsbyNode).toMatchInlineSnapshot(
`"module.exports = require('@vercel/gatsby-plugin-vercel-builder/gatsby-node.js');"`
);
@@ -113,37 +96,22 @@ describe('gatsby utilities', () => {
);
const version = await detectVersion(fixture);
await injectPlugins(version, fixture);
const [
packageJSON,
gatsbyNode,
gatsbyNodeBackup,
gatsbyConfig,
gatsbyConfigBackup,
] = await Promise.all([
fs.readFile(path.join(fixture, 'package.json'), 'utf-8'),
fs.readFile(path.join(fixture, 'gatsby-node.js'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-node.js.__vercel_builder_backup__.js'),
'utf-8'
),
fs.readFile(path.join(fixture, 'gatsby-config.js'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-config.js.__vercel_builder_backup__.js'),
'utf-8'
),
]);
expect(packageJSON).toMatchInlineSnapshot(`
"{
\\"dependencies\\": {
\\"gatsby\\": \\"4.25.2\\",
\\"@vercel/gatsby-plugin-vercel-builder\\": \\"latest\\",
\\"@vercel/gatsby-plugin-vercel-analytics\\": \\"latest\\"
}
}
"
`);
const [gatsbyNode, gatsbyNodeBackup, gatsbyConfig, gatsbyConfigBackup] =
await Promise.all([
fs.readFile(path.join(fixture, 'gatsby-node.js'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-node.js.__vercel_builder_backup__.js'),
'utf-8'
),
fs.readFile(path.join(fixture, 'gatsby-config.js'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-config.js.__vercel_builder_backup__.js'),
'utf-8'
),
]);
expect(gatsbyNode).toMatchInlineSnapshot(`
"const vercelBuilder = require('@vercel/gatsby-plugin-vercel-builder/gatsby-node.js');
"// This file was generated by @vercel/static-build
const vercelBuilder = require('@vercel/gatsby-plugin-vercel-builder/gatsby-node.js');
const gatsbyNode = require('./gatsby-node.js.__vercel_builder_backup__.js');
const origOnPostBuild = gatsbyNode.onPostBuild;
@@ -163,7 +131,8 @@ describe('gatsby utilities', () => {
"
`);
expect(gatsbyConfig).toMatchInlineSnapshot(`
"const userConfig = require(\\"./gatsby-config.js.__vercel_builder_backup__.js\\");
"// This file was generated by @vercel/static-build
const userConfig = require(\\"./gatsby-config.js.__vercel_builder_backup__.js\\");
const preferDefault = m => (m && m.default) || m;
@@ -171,6 +140,7 @@ describe('gatsby utilities', () => {
{},
preferDefault(userConfig)
);
if (!vercelConfig.plugins) {
vercelConfig.plugins = [];
}
@@ -202,37 +172,22 @@ describe('gatsby utilities', () => {
);
const version = await detectVersion(fixture);
await injectPlugins(version, fixture);
const [
packageJSON,
gatsbyNode,
gatsbyNodeBackup,
gatsbyConfig,
gatsbyConfigBackup,
] = await Promise.all([
fs.readFile(path.join(fixture, 'package.json'), 'utf-8'),
fs.readFile(path.join(fixture, 'gatsby-node.ts'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-node.ts.__vercel_builder_backup__.ts'),
'utf-8'
),
fs.readFile(path.join(fixture, 'gatsby-config.ts'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-config.ts.__vercel_builder_backup__.ts'),
'utf-8'
),
]);
expect(packageJSON).toMatchInlineSnapshot(`
"{
\\"dependencies\\": {
\\"gatsby\\": \\"4.25.2\\",
\\"@vercel/gatsby-plugin-vercel-builder\\": \\"latest\\",
\\"@vercel/gatsby-plugin-vercel-analytics\\": \\"latest\\"
}
}
"
`);
const [gatsbyNode, gatsbyNodeBackup, gatsbyConfig, gatsbyConfigBackup] =
await Promise.all([
fs.readFile(path.join(fixture, 'gatsby-node.ts'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-node.ts.__vercel_builder_backup__.ts'),
'utf-8'
),
fs.readFile(path.join(fixture, 'gatsby-config.ts'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-config.ts.__vercel_builder_backup__.ts'),
'utf-8'
),
]);
expect(gatsbyNode).toMatchInlineSnapshot(`
"import type { GatsbyNode } from 'gatsby';
"// This file was generated by @vercel/static-build
import type { GatsbyNode } from 'gatsby';
import * as vercelBuilder from '@vercel/gatsby-plugin-vercel-builder/gatsby-node.js';
import * as gatsbyNode from './gatsby-node.ts.__vercel_builder_backup__.ts';
@@ -251,7 +206,8 @@ describe('gatsby utilities', () => {
"
`);
expect(gatsbyConfig).toMatchInlineSnapshot(`
"import userConfig from \\"./gatsby-config.ts.__vercel_builder_backup__.ts\\";
"// This file was generated by @vercel/static-build
import userConfig from \\"./gatsby-config.ts.__vercel_builder_backup__.ts\\";
import type { PluginRef } from \\"gatsby\\";
const preferDefault = (m: any) => (m && m.default) || m;
@@ -294,37 +250,22 @@ describe('gatsby utilities', () => {
);
const version = await detectVersion(fixture);
await injectPlugins(version, fixture);
const [
packageJSON,
gatsbyNode,
gatsbyNodeBackup,
gatsbyConfig,
gatsbyConfigBackup,
] = await Promise.all([
fs.readFile(path.join(fixture, 'package.json'), 'utf-8'),
fs.readFile(path.join(fixture, 'gatsby-node.mjs'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-node.mjs.__vercel_builder_backup__.mjs'),
'utf-8'
),
fs.readFile(path.join(fixture, 'gatsby-config.mjs'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-config.mjs.__vercel_builder_backup__.mjs'),
'utf-8'
),
]);
expect(packageJSON).toMatchInlineSnapshot(`
"{
\\"dependencies\\": {
\\"gatsby\\": \\"4.25.2\\",
\\"@vercel/gatsby-plugin-vercel-builder\\": \\"latest\\",
\\"@vercel/gatsby-plugin-vercel-analytics\\": \\"latest\\"
}
}
"
`);
const [gatsbyNode, gatsbyNodeBackup, gatsbyConfig, gatsbyConfigBackup] =
await Promise.all([
fs.readFile(path.join(fixture, 'gatsby-node.mjs'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-node.mjs.__vercel_builder_backup__.mjs'),
'utf-8'
),
fs.readFile(path.join(fixture, 'gatsby-config.mjs'), 'utf-8'),
fs.readFile(
path.join(fixture, 'gatsby-config.mjs.__vercel_builder_backup__.mjs'),
'utf-8'
),
]);
expect(gatsbyNode).toMatchInlineSnapshot(`
"import * as vercelBuilder from '@vercel/gatsby-plugin-vercel-builder/gatsby-node.js';
"// This file was generated by @vercel/static-build
import * as vercelBuilder from '@vercel/gatsby-plugin-vercel-builder/gatsby-node.js';
import * as gatsbyNode from './gatsby-node.mjs.__vercel_builder_backup__.mjs';
export * from './gatsby-node.mjs.__vercel_builder_backup__.mjs';
@@ -342,7 +283,8 @@ describe('gatsby utilities', () => {
"
`);
expect(gatsbyConfig).toMatchInlineSnapshot(`
"import userConfig from \\"./gatsby-config.mjs.__vercel_builder_backup__.mjs\\";
"// This file was generated by @vercel/static-build
import userConfig from \\"./gatsby-config.mjs.__vercel_builder_backup__.mjs\\";
const preferDefault = (m) => (m && m.default) || m;
@@ -350,6 +292,7 @@ describe('gatsby utilities', () => {
{},
preferDefault(userConfig)
);
if (!vercelConfig.plugins) {
vercelConfig.plugins = [];
}
@@ -373,4 +316,89 @@ describe('gatsby utilities', () => {
"
`);
});
describe(`createPluginSymlinks()`, () => {
it('should add symlinks for Gatsby plugins', async () => {
const fixture = await prepareFixture(
path.join(fixturesPath, 'gatsby-v4-existing-files-mjs')
);
await createPluginSymlinks(fixture);
const analytics = require(path.join(
fixture,
'node_modules/@vercel/gatsby-plugin-vercel-analytics'
));
expect(typeof analytics).toEqual('object');
const builder = require(path.join(
fixture,
'node_modules/@vercel/gatsby-plugin-vercel-builder/gatsby-node.js'
));
expect(typeof builder.onPostBuild).toEqual('function');
});
});
describe('cleanupGatsbyFiles()', () => {
it('should delete base files starting with the generated comment', async () => {
const files = [
'gatsby-node.js',
'gatsby-config.js',
'gatsby-node.mjs',
'gatsby-config.mjs',
'gatsby-node.ts',
'gatsby-config.ts',
];
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'cleanup-test'));
await Promise.all(
files.map(file =>
fs.writeFile(
path.join(dir, file),
`// This file was generated by @vercel/static-build\nconsole.log('Hello, World!');`
)
)
);
expect((await fs.readdir(dir)).length).toBe(6);
await cleanupGatsbyFiles(dir);
expect((await fs.readdir(dir)).length).toBe(0);
});
});
it('should restore backups', async () => {
const files = [
'gatsby-node.js',
'gatsby-config.js',
'gatsby-node.mjs',
'gatsby-config.mjs',
'gatsby-node.ts',
'gatsby-config.ts',
];
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'cleanup-test'));
await Promise.all(
files.flatMap(file => [
fs.writeFile(
path.join(dir, file),
`// This file was generated by @vercel/static-build\nconsole.log('Hello, World!');`
),
fs.writeFile(
path.join(
dir,
`${file}.__vercel_builder_backup__${path.extname(file)}`
),
`console.log('Hello, World!');`
),
])
);
expect((await fs.readdir(dir)).length).toBe(12);
await cleanupGatsbyFiles(dir);
const afterDelete = await fs.readdir(dir);
expect(afterDelete.length).toBe(6);
expect(afterDelete.sort()).toEqual(files.sort());
});
});

347
pnpm-lock.yaml generated
View File

@@ -196,23 +196,23 @@ importers:
'@types/which': 1.3.2
'@types/write-json-file': 2.2.1
'@types/yauzl-promise': 2.1.0
'@vercel/build-utils': 6.0.0
'@vercel/client': 12.3.3
'@vercel/build-utils': 6.0.1
'@vercel/client': 12.3.4
'@vercel/error-utils': 1.0.8
'@vercel/frameworks': 1.3.0
'@vercel/fs-detectors': 3.7.6
'@vercel/fs-detectors': 3.7.7
'@vercel/fun': 1.0.4
'@vercel/go': 2.2.31
'@vercel/hydrogen': 0.0.45
'@vercel/go': 2.3.0
'@vercel/hydrogen': 0.0.46
'@vercel/ncc': 0.24.0
'@vercel/next': 3.3.19
'@vercel/node': 2.8.16
'@vercel/python': 3.1.41
'@vercel/redwood': 1.0.52
'@vercel/remix': 1.2.8
'@vercel/next': 3.3.20
'@vercel/node': 2.8.17
'@vercel/python': 3.1.42
'@vercel/redwood': 1.0.53
'@vercel/remix': 1.2.9
'@vercel/routing-utils': 2.1.8
'@vercel/ruby': 1.3.57
'@vercel/static-build': 1.2.1
'@vercel/ruby': 1.3.58
'@vercel/static-build': 1.3.1
'@zeit/source-map-support': 0.6.2
ajv: 6.12.2
alpha-sort: 2.0.1
@@ -438,7 +438,7 @@ importers:
'@types/node-fetch': 2.5.4
'@types/recursive-readdir': 2.2.0
'@types/tar-fs': 1.16.1
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/routing-utils': 2.1.8
'@zeit/fetch': 5.2.0
async-retry: 1.2.3
@@ -543,7 +543,7 @@ importers:
'@types/minimatch': 3.0.5
'@types/node': 14.18.33
'@types/semver': 7.3.10
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/error-utils': 1.0.8
'@vercel/frameworks': 1.3.0
'@vercel/routing-utils': 2.1.8
@@ -591,11 +591,11 @@ importers:
'@types/fs-extra': 11.0.1
'@types/node': 14.18.33
'@types/react': 18.0.26
'@vercel/build-utils': 6.0.0
'@vercel/node': 2.8.16
'@vercel/build-utils': 6.0.1
'@vercel/node': 2.8.17
'@vercel/routing-utils': 2.1.8
ajv: 8.12.0
esbuild: 0.16.17
esbuild: 0.14.47
etag: 1.8.1
fs-extra: 11.1.0
gatsby: 4.25.2
@@ -605,7 +605,7 @@ importers:
'@vercel/node': link:../node
'@vercel/routing-utils': link:../routing-utils
ajv: 8.12.0
esbuild: 0.16.17
esbuild: 0.14.47
etag: 1.8.1
fs-extra: 11.1.0
devDependencies:
@@ -613,7 +613,7 @@ importers:
'@types/fs-extra': 11.0.1
'@types/node': 14.18.33
'@types/react': 18.0.26
gatsby: 4.25.2_uedf7sjk6z4nxpzvzlgskw3hrm
gatsby: 4.25.2_xgpgzxixuucjtqogekb5j2tv5m
typescript: 4.3.4
packages/go:
@@ -626,7 +626,7 @@ importers:
'@types/node': 14.18.33
'@types/node-fetch': ^2.3.0
'@types/tar': ^4.0.0
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/ncc': 0.24.0
async-retry: 1.3.1
execa: ^1.0.0
@@ -658,7 +658,7 @@ importers:
specifiers:
'@types/jest': 27.5.1
'@types/node': 14.18.33
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/static-config': 2.0.11
execa: 3.2.0
fs-extra: 11.1.0
@@ -689,7 +689,7 @@ importers:
'@types/semver': 6.0.0
'@types/text-table': 0.2.1
'@types/webpack-sources': 3.2.0
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/nft': 0.22.5
'@vercel/routing-utils': 2.1.8
async-sema: 3.0.1
@@ -768,7 +768,7 @@ importers:
'@types/node': 14.18.33
'@types/node-fetch': ^2.6.1
'@types/test-listen': 1.1.0
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/ncc': 0.24.0
'@vercel/nft': 0.22.5
'@vercel/node-bridge': 3.1.10
@@ -852,7 +852,7 @@ importers:
'@types/execa': ^0.9.0
'@types/jest': 27.4.1
'@types/node': 14.18.33
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/ncc': 0.24.0
execa: ^1.0.0
typescript: 4.3.4
@@ -870,7 +870,7 @@ importers:
'@types/aws-lambda': 8.10.19
'@types/node': 14.18.33
'@types/semver': 6.0.0
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/nft': 0.22.5
'@vercel/routing-utils': 2.1.8
execa: 3.2.0
@@ -894,7 +894,7 @@ importers:
specifiers:
'@types/jest': 27.5.1
'@types/node': 14.18.33
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/nft': 0.22.5
typescript: 4.9.4
dependencies:
@@ -925,7 +925,7 @@ importers:
specifiers:
'@types/fs-extra': 8.0.0
'@types/semver': 6.0.0
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/ncc': 0.24.0
execa: 2.0.4
fs-extra: ^7.0.1
@@ -952,11 +952,11 @@ importers:
'@types/node-fetch': 2.5.4
'@types/promise-timeout': 1.3.0
'@types/semver': 7.3.13
'@vercel/build-utils': 6.0.0
'@vercel/build-utils': 6.0.1
'@vercel/frameworks': 1.3.0
'@vercel/fs-detectors': 3.7.6
'@vercel/fs-detectors': 3.7.7
'@vercel/gatsby-plugin-vercel-analytics': 1.0.7
'@vercel/gatsby-plugin-vercel-builder': 1.0.1
'@vercel/gatsby-plugin-vercel-builder': 1.0.3
'@vercel/ncc': 0.24.0
'@vercel/routing-utils': 2.1.8
'@vercel/static-config': 2.0.11
@@ -971,6 +971,9 @@ importers:
tree-kill: 1.2.2
ts-morph: 12.0.0
typescript: 4.3.4
dependencies:
'@vercel/gatsby-plugin-vercel-analytics': link:../gatsby-plugin-vercel-analytics
'@vercel/gatsby-plugin-vercel-builder': link:../gatsby-plugin-vercel-builder
devDependencies:
'@types/aws-lambda': 8.10.64
'@types/cross-spawn': 6.0.0
@@ -984,8 +987,6 @@ importers:
'@vercel/build-utils': link:../build-utils
'@vercel/frameworks': link:../frameworks
'@vercel/fs-detectors': link:../fs-detectors
'@vercel/gatsby-plugin-vercel-analytics': link:../gatsby-plugin-vercel-analytics
'@vercel/gatsby-plugin-vercel-builder': link:../gatsby-plugin-vercel-builder
'@vercel/ncc': 0.24.0
'@vercel/routing-utils': link:../routing-utils
'@vercel/static-config': link:../static-config
@@ -2642,86 +2643,6 @@ packages:
dependencies:
'@edge-runtime/primitives': 2.0.0
/@esbuild/android-arm/0.16.17:
resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
optional: true
/@esbuild/android-arm64/0.16.17:
resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
optional: true
/@esbuild/android-x64/0.16.17:
resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
optional: true
/@esbuild/darwin-arm64/0.16.17:
resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
optional: true
/@esbuild/darwin-x64/0.16.17:
resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
optional: true
/@esbuild/freebsd-arm64/0.16.17:
resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
optional: true
/@esbuild/freebsd-x64/0.16.17:
resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
optional: true
/@esbuild/linux-arm/0.16.17:
resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-arm64/0.16.17:
resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-ia32/0.16.17:
resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-loong64/0.14.54:
resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
engines: {node: '>=12'}
@@ -2731,102 +2652,6 @@ packages:
dev: true
optional: true
/@esbuild/linux-loong64/0.16.17:
resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-mips64el/0.16.17:
resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-ppc64/0.16.17:
resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-riscv64/0.16.17:
resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-s390x/0.16.17:
resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/linux-x64/0.16.17:
resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
optional: true
/@esbuild/netbsd-x64/0.16.17:
resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
optional: true
/@esbuild/openbsd-x64/0.16.17:
resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
optional: true
/@esbuild/sunos-x64/0.16.17:
resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
optional: true
/@esbuild/win32-arm64/0.16.17:
resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
optional: true
/@esbuild/win32-ia32/0.16.17:
resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
optional: true
/@esbuild/win32-x64/0.16.17:
resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
optional: true
/@eslint/eslintrc/0.4.3:
resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -5304,7 +5129,7 @@ packages:
react-refresh: 0.14.0
schema-utils: 3.1.1
source-map: 0.7.4
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/@rollup/pluginutils/4.2.1:
@@ -7943,7 +7768,7 @@ packages:
loader-utils: 2.0.4
make-dir: 3.1.0
schema-utils: 2.7.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/babel-plugin-add-module-exports/1.0.4:
@@ -8066,7 +7891,7 @@ packages:
'@babel/core': 7.20.12
'@babel/runtime': 7.20.7
'@babel/types': 7.20.7
gatsby: 4.25.2_uedf7sjk6z4nxpzvzlgskw3hrm
gatsby: 4.25.2_xgpgzxixuucjtqogekb5j2tv5m
gatsby-core-utils: 3.25.0
dev: true
@@ -9671,7 +9496,7 @@ packages:
postcss-value-parser: 4.2.0
schema-utils: 3.1.1
semver: 7.3.8
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/css-minimizer-webpack-plugin/2.0.0_webpack@5.75.0:
@@ -9694,7 +9519,7 @@ packages:
schema-utils: 3.1.1
serialize-javascript: 5.0.1
source-map: 0.6.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/css-select/4.3.0:
@@ -10724,7 +10549,6 @@ packages:
cpu: [x64]
os: [android]
requiresBuild: true
dev: false
optional: true
/esbuild-android-64/0.14.54:
@@ -10742,7 +10566,6 @@ packages:
cpu: [arm64]
os: [android]
requiresBuild: true
dev: false
optional: true
/esbuild-android-arm64/0.14.54:
@@ -10760,7 +10583,6 @@ packages:
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
/esbuild-darwin-64/0.14.54:
@@ -10778,7 +10600,6 @@ packages:
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
/esbuild-darwin-arm64/0.14.54:
@@ -10796,7 +10617,6 @@ packages:
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: false
optional: true
/esbuild-freebsd-64/0.14.54:
@@ -10814,7 +10634,6 @@ packages:
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: false
optional: true
/esbuild-freebsd-arm64/0.14.54:
@@ -10832,7 +10651,6 @@ packages:
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-32/0.14.54:
@@ -10850,7 +10668,6 @@ packages:
cpu: [x64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-64/0.14.54:
@@ -10868,7 +10685,6 @@ packages:
cpu: [arm]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-arm/0.14.54:
@@ -10886,7 +10702,6 @@ packages:
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-arm64/0.14.54:
@@ -10904,7 +10719,6 @@ packages:
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-mips64le/0.14.54:
@@ -10922,7 +10736,6 @@ packages:
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-ppc64le/0.14.54:
@@ -10940,7 +10753,6 @@ packages:
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-riscv64/0.14.54:
@@ -10958,7 +10770,6 @@ packages:
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: false
optional: true
/esbuild-linux-s390x/0.14.54:
@@ -10976,7 +10787,6 @@ packages:
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: false
optional: true
/esbuild-netbsd-64/0.14.54:
@@ -10994,7 +10804,6 @@ packages:
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: false
optional: true
/esbuild-openbsd-64/0.14.54:
@@ -11012,7 +10821,6 @@ packages:
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: false
optional: true
/esbuild-sunos-64/0.14.54:
@@ -11030,7 +10838,6 @@ packages:
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: false
optional: true
/esbuild-windows-32/0.14.54:
@@ -11048,7 +10855,6 @@ packages:
cpu: [x64]
os: [win32]
requiresBuild: true
dev: false
optional: true
/esbuild-windows-64/0.14.54:
@@ -11066,7 +10872,6 @@ packages:
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: false
optional: true
/esbuild-windows-arm64/0.14.54:
@@ -11116,7 +10921,6 @@ packages:
esbuild-windows-32: 0.14.47
esbuild-windows-64: 0.14.47
esbuild-windows-arm64: 0.14.47
dev: false
/esbuild/0.14.54:
resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
@@ -11147,35 +10951,6 @@ packages:
esbuild-windows-arm64: 0.14.54
dev: true
/esbuild/0.16.17:
resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.16.17
'@esbuild/android-arm64': 0.16.17
'@esbuild/android-x64': 0.16.17
'@esbuild/darwin-arm64': 0.16.17
'@esbuild/darwin-x64': 0.16.17
'@esbuild/freebsd-arm64': 0.16.17
'@esbuild/freebsd-x64': 0.16.17
'@esbuild/linux-arm': 0.16.17
'@esbuild/linux-arm64': 0.16.17
'@esbuild/linux-ia32': 0.16.17
'@esbuild/linux-loong64': 0.16.17
'@esbuild/linux-mips64el': 0.16.17
'@esbuild/linux-ppc64': 0.16.17
'@esbuild/linux-riscv64': 0.16.17
'@esbuild/linux-s390x': 0.16.17
'@esbuild/linux-x64': 0.16.17
'@esbuild/netbsd-x64': 0.16.17
'@esbuild/openbsd-x64': 0.16.17
'@esbuild/sunos-x64': 0.16.17
'@esbuild/win32-arm64': 0.16.17
'@esbuild/win32-ia32': 0.16.17
'@esbuild/win32-x64': 0.16.17
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@@ -11483,7 +11258,7 @@ packages:
micromatch: 4.0.5
normalize-path: 3.0.0
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/eslint/7.32.0:
@@ -12125,7 +11900,7 @@ packages:
dependencies:
loader-utils: 2.0.4
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/file-type/16.5.4:
@@ -12321,7 +12096,7 @@ packages:
semver: 7.3.8
tapable: 1.1.3
typescript: 4.3.4
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/form-data/2.3.3:
@@ -12667,7 +12442,7 @@ packages:
chokidar: 3.5.3
fs-exists-cached: 1.0.0
fs-extra: 10.1.0
gatsby: 4.25.2_uedf7sjk6z4nxpzvzlgskw3hrm
gatsby: 4.25.2_xgpgzxixuucjtqogekb5j2tv5m
gatsby-core-utils: 3.25.0
gatsby-page-utils: 2.25.0
gatsby-plugin-utils: 3.19.0_5nijmeqlgjulq3py6h447sls2a
@@ -12693,7 +12468,7 @@ packages:
'@babel/preset-typescript': 7.18.6_@babel+core@7.20.12
'@babel/runtime': 7.20.7
babel-plugin-remove-graphql-queries: 4.25.0_b3vlds4jyvbln6bwxmbjhxwmje
gatsby: 4.25.2_uedf7sjk6z4nxpzvzlgskw3hrm
gatsby: 4.25.2_xgpgzxixuucjtqogekb5j2tv5m
transitivePeerDependencies:
- supports-color
dev: true
@@ -12708,7 +12483,7 @@ packages:
'@babel/runtime': 7.20.7
fastq: 1.15.0
fs-extra: 10.1.0
gatsby: 4.25.2_uedf7sjk6z4nxpzvzlgskw3hrm
gatsby: 4.25.2_xgpgzxixuucjtqogekb5j2tv5m
gatsby-core-utils: 3.25.0
gatsby-sharp: 0.19.0
graphql: 15.8.0
@@ -12781,7 +12556,7 @@ packages:
- supports-color
dev: true
/gatsby/4.25.2_uedf7sjk6z4nxpzvzlgskw3hrm:
/gatsby/4.25.2_xgpgzxixuucjtqogekb5j2tv5m:
resolution: {integrity: sha512-HKSWRdTOK5IBFDDgCKiPXiyszfdTTGZ+pple6My6dQ5a5U+Gn1PpjBIiYj4Me9WJAveQzC7tChsqBVVt7r6few==}
engines: {node: '>=14.15.0'}
hasBin: true
@@ -12942,13 +12717,13 @@ packages:
string-similarity: 1.2.2
strip-ansi: 6.0.1
style-loader: 2.0.0_webpack@5.75.0
terser-webpack-plugin: 5.3.6_htvmhiqynazf46fjrszipnqp7a
terser-webpack-plugin: 5.3.6_ywvob5sqkbjac5dglubf6z7yli
tmp: 0.2.1
true-case-path: 2.2.1
type-of: 2.0.1
url-loader: 4.1.1_p5dl6emkcwslbw72e37w4ug7em
uuid: 8.3.2
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
webpack-dev-middleware: 4.3.0_webpack@5.75.0
webpack-merge: 5.8.0
webpack-stats-plugin: 1.1.1
@@ -16713,7 +16488,7 @@ packages:
dependencies:
loader-utils: 2.0.4
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
webpack-sources: 1.4.3
dev: true
@@ -17351,7 +17126,7 @@ packages:
dependencies:
loader-utils: 2.0.4
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/nullthrows/1.1.1:
@@ -18261,7 +18036,7 @@ packages:
klona: 2.0.5
postcss: 8.4.21
semver: 7.3.8
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/postcss-merge-longhand/5.1.7_postcss@8.4.21:
@@ -18878,7 +18653,7 @@ packages:
dependencies:
loader-utils: 2.0.4
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/rc/1.2.8:
@@ -18934,7 +18709,7 @@ packages:
strip-ansi: 6.0.1
text-table: 0.2.0
typescript: 4.3.4
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
transitivePeerDependencies:
- eslint
- supports-color
@@ -18976,7 +18751,7 @@ packages:
acorn: 6.4.2
loose-envify: 1.4.0
neo-async: 2.6.2
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/read-cmd-shim/3.0.1:
@@ -20426,7 +20201,7 @@ packages:
dependencies:
loader-utils: 2.0.4
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/stylehacks/5.1.1_postcss@8.4.21:
@@ -20689,7 +20464,7 @@ packages:
supports-hyperlinks: 2.3.0
dev: true
/terser-webpack-plugin/5.3.6_htvmhiqynazf46fjrszipnqp7a:
/terser-webpack-plugin/5.3.6_ywvob5sqkbjac5dglubf6z7yli:
resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==}
engines: {node: '>= 10.13.0'}
peerDependencies:
@@ -20706,12 +20481,12 @@ packages:
optional: true
dependencies:
'@jridgewell/trace-mapping': 0.3.17
esbuild: 0.16.17
esbuild: 0.14.47
jest-worker: 27.5.1
schema-utils: 3.1.1
serialize-javascript: 6.0.0
terser: 5.16.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/terser/5.16.1:
@@ -21662,7 +21437,7 @@ packages:
loader-utils: 2.0.4
mime-types: 2.1.35
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/url-parse-lax/3.0.0:
@@ -21829,7 +21604,7 @@ packages:
mime-types: 2.1.35
range-parser: 1.2.1
schema-utils: 3.1.1
webpack: 5.75.0_esbuild@0.16.17
webpack: 5.75.0_esbuild@0.14.47
dev: true
/webpack-merge/5.8.0:
@@ -21864,7 +21639,7 @@ packages:
- supports-color
dev: true
/webpack/5.75.0_esbuild@0.16.17:
/webpack/5.75.0_esbuild@0.14.47:
resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==}
engines: {node: '>=10.13.0'}
hasBin: true
@@ -21895,7 +21670,7 @@ packages:
neo-async: 2.6.2
schema-utils: 3.1.1
tapable: 2.2.1
terser-webpack-plugin: 5.3.6_htvmhiqynazf46fjrszipnqp7a
terser-webpack-plugin: 5.3.6_ywvob5sqkbjac5dglubf6z7yli
watchpack: 2.4.0
webpack-sources: 3.2.3
transitivePeerDependencies: