Compare commits

..

23 Commits

Author SHA1 Message Date
Chris Barber
a63b9d960b Publish Stable
- vercel@28.19.0
 - @vercel/client@12.4.10
 - @vercel/edge@0.3.3
 - @vercel/error-utils@1.0.10
 - @vercel/fs-detectors@3.8.11
 - @vercel/gatsby-plugin-vercel-builder@1.2.9
 - @vercel/go@2.5.0
 - @vercel/hydrogen@0.0.63
 - @vercel/next@3.7.5
 - @vercel/node@2.11.0
 - @vercel/python@3.1.59
 - @vercel/remix-builder@1.8.5
 - @vercel/static-build@1.3.24
 - @vercel/static-config@2.0.16
2023-04-19 10:14:58 -05:00
Sean Massa
3cefbb19fe [tests] split next-local tests into chunks (#9774)
The next-local e2e tests where split between middleware (fast) and all other (slow) tests. This meant there was not a good balance of amount of time spent across these test files, making overall test run times as slow as "all other tests" running.

This PR rebalances the split of tests across 2 files. The new run time is ~9-10m.
2023-04-18 20:27:01 +00:00
Sean Massa
f43894ef4e [cli] refactor to use create deployment param type (#9805)
Small refactor to provide type safety to this invocation of `createDeploy`.
2023-04-18 19:29:42 +00:00
Chris Barber
2081f10b22 [node] Move path-to-regexp and ts-morph from dev deps to deps (#9823)
`@vercel/node` uses `ncc` to bundle the `index.js` spawns the dev server entrypoint which does not bundle the required dependencies, thus `path-to-regexp` and `ts-morph` must be moved from dev dependencies to dependencies.

Fixes #9735.
2023-04-18 16:37:09 +00:00
Chris Barber
b52df7a533 [cli] Add vc deploy --no-wait and vc inspect --wait (#9802)
There's a need to allow `vc deploy` to not block and not wait for the deployment to finish, yet return the URL.

```
$ vc deploy --no-wait
Vercel CLI 28.18.5
🔍  Inspect: https://vercel.com/chrisbarber/next13fun/L8X4oxp5LGcmy51yVptXwMK7n4wt [1s]
📝  Note: Deployment is still processing...
  Production: https://next13fun-kecpx6za2-chrisbarber.vercel.app [1s]
```

Normally this deployment takes around 30 seconds, but the `--no-wait` flag causes the command to exit in less than 2 seconds.

The next step is to add the ability for `vc inspect` to wait as well as specify the maximum time to wait (defaults to 3 minutes, same as `vc rollback`).

```
$ vc inspect --wait --timeout 1m https://next13fun-kecpx6za2-chrisbarber.vercel.app
Vercel CLI 28.18.5
> Fetched deployment "next13fun-ov2r4pvdz-chrisbarber.vercel.app" in chrisbarber [23s]

  General

    id		dpl_9VUuV23EGeoqWf7akEeL8rP1c8cb
    name	next13fun
    status	● Ready
    url		https://next13fun-ov2r4pvdz-chrisbarber.vercel.app
    created	Thu Apr 13 2023 12:25:07 GMT-0500 (Central Daylight Time) [24s ago]
<snip>
```

Also added the ability to pipe the URL into `vc inspect`:

```
echo https://next13fun-ov2r4pvdz-chrisbarber.vercel.app | vc inspect
```

Combined, it allows us to support cool things like:

```
$ vc inspect $(vc deploy --prod --no-wait) --wait
```
2023-04-17 15:43:05 +00:00
Vercel Release Bot
ec89436417 [tests] Upgrade Turbo to version 1.9.1 (#9819)
This auto-generated PR updates Turbo to version 1.9.1
2023-04-16 07:18:36 +00:00
Nathan Rajlich
993a404311 [cli] Support pnpm in getUpdateCommand() (#9813)
We're currently showing bad instructions when CLI was installed via pnpm:

![image](https://user-images.githubusercontent.com/71256/232131890-ecc1c2c1-ace6-48b3-bd6f-8631cf7be087.png)

This adds support for it by leveraging our existing `scanParentDirs()` logic from build-utils.
2023-04-14 21:45:35 +00:00
Nathan Rajlich
3e7bcb2073 [cli] Remove a bunch of isCanary checks (#9806)
We no longer publish versions that include `-canary` in the package.json `version` field, so these are dead code. Just doing a little bit of cleanup.
2023-04-14 20:35:56 +00:00
Ethan Arrowood
ed119d6a33 [internals] Refactor @vercel-internals/types enums into constants (#9789)
- Creates new internals package, `@vercel-internals/constants`
- Refactors the `enum`s from `@vercel-internals/types` into `as const` objects, and moves them to `@vercel-intenrals/constants`
- Updates all relevant code within `packages/cli`, including `@vercel-internals/types` imports to be `import type`
2023-04-14 18:08:12 +00:00
Sean Massa
2aeddde7d5 [tests] split python e2e tests into chunks (#9771)
Split python tests into two chunks. They take <10m each.
2023-04-13 22:19:14 +00:00
Dan Stowell
a8eab6beb7 [tests] fetch vercel.com cert before builds and after tests (#9803)
To debug intermittent connection errors when the tests make requests to [api.vercel.com], fetch the SSL certificate before builds and after tests.
2023-04-13 20:47:13 +00:00
Nathan Rajlich
031c182896 [examples] Update Remix template to use v1.15.0 (#9788) 2023-04-13 11:36:59 -07:00
Chris Barber
38eb0bca04 [go] Support 'go.work' file and resolve shared deps relative to work path (#9708)
This PR fixes a few issues related to `vc dev`.

1. Create a default `go.work` file in the cache dir when building the `vercel-dev-server-go` executable
2. Copy the existing `go.mod` file into the cache dir and update any "replace" relative paths
3. Split the "build" logic into separate functions for the legacy "main" package build and the `go.mod` build

Additionally, it fixes:

1. `vc build`: pass in `build.env` from `vercel.json`
2. Fix several tests to work with `vc dev` and `vc build`

Linear: https://linear.app/vercel/issue/VCCLI-638/vc-dev-go-builder-cant-resolve-workspace-dependencies

The user that reported the issue has tested this build and seems to fix their use case: https://github.com/vercel/vercel/issues/9393#issuecomment-1490726785.
2023-04-13 17:59:47 +00:00
Chris Barber
732ac2072c [tests] Update Typescript, Jest, and ts-jest (#9782)
Co-authored-by: Nathan Rajlich <n@n8.io>
Co-authored-by: Swarnava Sengupta <swarnavasengupta@gmail.com>
2023-04-12 08:38:03 -05:00
Nathan Rajlich
64d9cef963 [publish] Trigger update workflow on "api" repo after Publish (#9791)
So that we don't need to trigger it manually and/or wait for the cronjob.
2023-04-12 06:53:46 +00:00
Nathan Rajlich
6b9e274bc7 [cli] Simplify parseRepoUrl() and fix edge case (#9796)
Fixes an edge case in `parseRepoUrl()` when there is a `.com` in the repo name. The code was hard to refactor in its previous form so I refactored it to be simpler as well.
2023-04-12 04:29:29 +00:00
Sean Massa
a2da071755 [tests] re-chunk example tests (#9792)
It turns out that these do take a long time to run when not cached. We do want these chunks.
2023-04-12 00:57:07 +00:00
Dan Stowell
14ece4111a Publish Stable
- vercel@28.18.5
 - @vercel/fs-detectors@3.8.10
 - @vercel/gatsby-plugin-vercel-builder@1.2.8
 - @vercel/static-build@1.3.23
2023-04-11 16:25:20 -05:00
Sean Massa
e302631ded [fs-detectors] check turbo versions to allow for tags like "latest" (#9790)
When a project depends on `turbo` at version `latest`, this code was breaking because `latest` is not a valid range for `semver.intersects`.
2023-04-11 21:22:41 +00:00
Nathan Rajlich
43a57a3a60 [gatsby-plugin-vercel-builder] Ignore assetPrefix completely (#9787)
Before, we were stripping off only the hostname portion of `assetPrefix`, so any pathname was still being "handled" by the plugin.

Instead, we should be ignoring the `assetPrefix` entirely, so that these two configurations are treated differently:

 * `{ assetPrefix: 'http://example.com', pathPrefix: '/foo' }` - Gatsby project is served from `/foo`
 * `{ assetPrefix: 'http://example.com/foo', pathPrefix: undefined }` - Gatsby project is served from the root `/`

Currently, both configuration behave as the first version listed above. This change makes it so they can behave differently, specifically for some proxy configurations.

In both cases, the generated HTML contains the full URL `http://example.com/foo/*` for JS/CSS/etc. assets
2023-04-11 19:52:38 +00:00
Ethan Arrowood
136077ab6f [scripts] Create internal-dependency-trace script package (#9783)
Adds a new package under `scripts/internal-dependency-trace` that can be used to generate a rendering of any internal file dependency graph.

Default configured to generate the directed dependency graph of `packages/cli/src/index.ts`
2023-04-10 21:01:17 +00:00
Lee Robinson
8634f9cd7e [examples] Update Astro example. (#9778)
This demo now showcases:

- `/` - A static page (pre-rendered)
- `/ssr` - A page that uses server-side rendering (through Vercel Edge Functions)
- `/ssr-with-swr-caching` - Similar to the previous page, but also caches the response on the Vercel Edge Network using `cache-control` headers
- `/edge.json` - An Astro API Endpoint that returns JSON data using Vercel Edge Functions

The new example has been deployed to https://astro.vercel.app.
2023-04-10 08:35:00 +00:00
Sean Massa
dc8523998c [tests] combine examples e2e into one chunk (#9772)
We don't need 5 chunks of the very fast examples tests. We spend more time in setup for each one. We are also more likely to hit the [usage limit](https://docs.github.com/en/actions/learn-github-actions/usage-limits-billing-and-administration#usage-limits) with these.

This PR combines them into one test suite.
2023-04-07 23:47:27 +00:00
195 changed files with 4447 additions and 6211 deletions

View File

@@ -65,3 +65,11 @@ jobs:
NPM_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }}
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
- name: Trigger Update
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
script: |
const script = require('./utils/trigger-update-workflow.js')
await script({ github, context })

View File

@@ -76,6 +76,10 @@ jobs:
- run: pnpm install
- name: fetch ssl certificate before build (linux, os x)
if: matrix.runner != 'windows-latest'
run: echo | openssl s_client -showcerts -servername 'api.vercel.com' -connect 76.76.21.21:443
- name: Build ${{matrix.packageName}} and all its dependencies
run: node utils/gen.js && node_modules/.bin/turbo run build --cache-dir=".turbo" --scope=${{matrix.packageName}} --include-dependencies --no-deps
env:
@@ -89,6 +93,10 @@ jobs:
VERCEL_TEST_REGISTRATION_URL: ${{ secrets.VERCEL_TEST_REGISTRATION_URL }}
FORCE_COLOR: '1'
- name: fetch ssl certificate after tests (linux, os x)
if: matrix.runner != 'windows-latest'
run: echo | openssl s_client -showcerts -servername 'api.vercel.com' -connect 76.76.21.21:443
conclusion:
needs:
- test

View File

@@ -1,6 +1,13 @@
# Astro
This directory is a brief example of an [Astro](https://astro.build/) site that can be deployed to Vercel with zero configuration.
This directory is a brief example of an [Astro](https://astro.build/) site that can be deployed to Vercel with zero configuration. This demo showcases:
- `/` - A static page (pre-rendered)
- `/ssr` - A page that uses server-side rendering (through Vercel Edge Functions)
- `/ssr-with-swr-caching` - Similar to the previous page, but also caches the response on the Vercel Edge Network using `cache-control` headers
- `/edge.json` - An Astro API Endpoint that returns JSON data using Vercel Edge Functions
Learn more about [Astro on Vercel](https://vercel.com/docs/frameworks/astro).
## Deploy Your Own
@@ -12,21 +19,7 @@ _Live Example: https://astro-template.vercel.app_
## Project Structure
Inside of your Astro project, you'll see the following folders and files:
```
/
├── public/
│ └── favicon.ico
├── src/
│ ├── components/
│ │ └── Layout.astro
│ └── pages/
│ └── index.astro
└── package.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
Astro looks for `.astro`, `.md`, or `.js` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components or layouts.
@@ -42,5 +35,6 @@ All commands are run from the root of the project, from a terminal:
| `pnpm run dev` | Starts local dev server at `localhost:3000` |
| `pnpm run build` | Build your production site to `./dist/` |
| `pnpm run preview` | Preview your build locally, before deploying |
| `pnpm run start` | Starts a production dev server at `localhost:3000` |
| `pnpm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
| `pnpm run astro --help` | Get help using the Astro CLI |

View File

@@ -1,4 +1,7 @@
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/edge';
// https://astro.build/config
export default defineConfig({});
export default defineConfig({
output: 'server',
adapter: vercel(),
});

View File

@@ -7,8 +7,10 @@
"preview": "astro preview",
"astro": "astro"
},
"devDependencies": {
"astro": "^2.0.6",
"web-vitals": "^3.1.1"
"dependencies": {
"@astrojs/vercel": "3.2.2",
"astro": "^2.2.1",
"react": "18.2.0",
"web-vitals": "^3.3.1"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
export async function get() {
return new Response(JSON.stringify({ time: new Date() }), {
status: 200,
headers: {
'Content-Type': 'application/json',
'Cache-Control': 's-maxage=10, stale-while-revalidate',
},
});
}

View File

@@ -1,6 +1,8 @@
---
import Layout from '../layouts/Layout.astro';
import Card from '../components/Card.astro';
export const prerender = true;
---
<Layout title="Welcome to Astro.">

View File

@@ -0,0 +1,7 @@
---
Astro.response.headers.set('Cache-Control', 's-maxage=10, stale-while-revalidate');
const time = new Date().toLocaleTimeString();
---
<h1>{time}</h1>

View File

@@ -0,0 +1,5 @@
---
const time = new Date().toLocaleTimeString();
---
<h1>{time}</h1>

View File

@@ -6,17 +6,17 @@
"dev": "remix dev"
},
"dependencies": {
"@remix-run/node": "^1.14.3",
"@remix-run/react": "^1.14.3",
"@remix-run/serve": "^1.14.3",
"@remix-run/node": "^1.15.0",
"@remix-run/react": "^1.15.0",
"@remix-run/serve": "^1.15.0",
"@vercel/analytics": "^0.1.11",
"@vercel/remix": "1.14.3-patch.1",
"@vercel/remix": "^1.15.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@remix-run/dev": "^1.14.3",
"@remix-run/eslint-config": "^1.14.3",
"@remix-run/dev": "^1.15.0",
"@remix-run/eslint-config": "^1.15.0",
"@types/react": "^18.0.25",
"@types/react-dom": "^18.0.11",
"eslint": "^8.28.0",

View File

@@ -4,30 +4,30 @@ importers:
.:
specifiers:
'@remix-run/dev': ^1.14.3
'@remix-run/eslint-config': ^1.14.3
'@remix-run/node': ^1.14.3
'@remix-run/react': ^1.14.3
'@remix-run/serve': ^1.14.3
'@remix-run/dev': ^1.15.0
'@remix-run/eslint-config': ^1.15.0
'@remix-run/node': ^1.15.0
'@remix-run/react': ^1.15.0
'@remix-run/serve': ^1.15.0
'@types/react': ^18.0.25
'@types/react-dom': ^18.0.11
'@vercel/analytics': ^0.1.11
'@vercel/remix': 1.14.3-patch.1
'@vercel/remix': ^1.15.0
eslint: ^8.28.0
react: ^18.2.0
react-dom: ^18.2.0
typescript: ^4.9.3
dependencies:
'@remix-run/node': 1.14.3
'@remix-run/react': 1.14.3_biqbaboplfbrettd7655fr4n2y
'@remix-run/serve': 1.14.3
'@remix-run/node': 1.15.0
'@remix-run/react': 1.15.0_biqbaboplfbrettd7655fr4n2y
'@remix-run/serve': 1.15.0
'@vercel/analytics': 0.1.11_react@18.2.0
'@vercel/remix': 1.14.3-patch.1_biqbaboplfbrettd7655fr4n2y
'@vercel/remix': 1.15.0_biqbaboplfbrettd7655fr4n2y
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
devDependencies:
'@remix-run/dev': 1.14.3_@remix-run+serve@1.14.3
'@remix-run/eslint-config': 1.14.3_km5ddj7uwb23cqeymeyvzjsfb4
'@remix-run/dev': 1.15.0_@remix-run+serve@1.15.0
'@remix-run/eslint-config': 1.15.0_km5ddj7uwb23cqeymeyvzjsfb4
'@types/react': 18.0.28
'@types/react-dom': 18.0.11
eslint: 8.34.0
@@ -1333,6 +1333,15 @@ packages:
dev: true
optional: true
/@esbuild/android-arm/0.17.6:
resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm64/0.16.3:
resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==}
engines: {node: '>=12'}
@@ -1342,6 +1351,15 @@ packages:
dev: true
optional: true
/@esbuild/android-arm64/0.17.6:
resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-x64/0.16.3:
resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==}
engines: {node: '>=12'}
@@ -1351,6 +1369,15 @@ packages:
dev: true
optional: true
/@esbuild/android-x64/0.17.6:
resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-arm64/0.16.3:
resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==}
engines: {node: '>=12'}
@@ -1360,6 +1387,15 @@ packages:
dev: true
optional: true
/@esbuild/darwin-arm64/0.17.6:
resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-x64/0.16.3:
resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==}
engines: {node: '>=12'}
@@ -1369,6 +1405,15 @@ packages:
dev: true
optional: true
/@esbuild/darwin-x64/0.17.6:
resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-arm64/0.16.3:
resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==}
engines: {node: '>=12'}
@@ -1378,6 +1423,15 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-arm64/0.17.6:
resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-x64/0.16.3:
resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==}
engines: {node: '>=12'}
@@ -1387,6 +1441,15 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-x64/0.17.6:
resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm/0.16.3:
resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==}
engines: {node: '>=12'}
@@ -1396,6 +1459,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm/0.17.6:
resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm64/0.16.3:
resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==}
engines: {node: '>=12'}
@@ -1405,6 +1477,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm64/0.17.6:
resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ia32/0.16.3:
resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==}
engines: {node: '>=12'}
@@ -1414,6 +1495,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-ia32/0.17.6:
resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-loong64/0.16.3:
resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==}
engines: {node: '>=12'}
@@ -1423,6 +1513,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-loong64/0.17.6:
resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-mips64el/0.16.3:
resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==}
engines: {node: '>=12'}
@@ -1432,6 +1531,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-mips64el/0.17.6:
resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ppc64/0.16.3:
resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==}
engines: {node: '>=12'}
@@ -1441,6 +1549,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-ppc64/0.17.6:
resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-riscv64/0.16.3:
resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==}
engines: {node: '>=12'}
@@ -1450,6 +1567,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-riscv64/0.17.6:
resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-s390x/0.16.3:
resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==}
engines: {node: '>=12'}
@@ -1459,6 +1585,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-s390x/0.17.6:
resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-x64/0.16.3:
resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==}
engines: {node: '>=12'}
@@ -1468,6 +1603,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-x64/0.17.6:
resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/netbsd-x64/0.16.3:
resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==}
engines: {node: '>=12'}
@@ -1477,6 +1621,15 @@ packages:
dev: true
optional: true
/@esbuild/netbsd-x64/0.17.6:
resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/openbsd-x64/0.16.3:
resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==}
engines: {node: '>=12'}
@@ -1486,6 +1639,15 @@ packages:
dev: true
optional: true
/@esbuild/openbsd-x64/0.17.6:
resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/sunos-x64/0.16.3:
resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==}
engines: {node: '>=12'}
@@ -1495,6 +1657,15 @@ packages:
dev: true
optional: true
/@esbuild/sunos-x64/0.17.6:
resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-arm64/0.16.3:
resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==}
engines: {node: '>=12'}
@@ -1504,6 +1675,15 @@ packages:
dev: true
optional: true
/@esbuild/win32-arm64/0.17.6:
resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-ia32/0.16.3:
resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==}
engines: {node: '>=12'}
@@ -1513,6 +1693,15 @@ packages:
dev: true
optional: true
/@esbuild/win32-ia32/0.17.6:
resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-x64/0.16.3:
resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==}
engines: {node: '>=12'}
@@ -1522,6 +1711,15 @@ packages:
dev: true
optional: true
/@esbuild/win32-x64/0.17.6:
resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@eslint/eslintrc/1.4.1:
resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1663,12 +1861,12 @@ packages:
tslib: 2.5.0
dev: true
/@remix-run/dev/1.14.3_@remix-run+serve@1.14.3:
resolution: {integrity: sha512-46mmwiA/k9YDkg0UrP90UB3azVVWRXw16NLHRSbZiaaYe8XgUkddEtBnH/nBp/IrVCtzUL3LObplUe5sFk5Z9Q==}
/@remix-run/dev/1.15.0_@remix-run+serve@1.15.0:
resolution: {integrity: sha512-BsE1GN6WM9PhN+agZi4TqUIuYzoHYZrufEdXLg3ZEYxWXqvtRKUNfhsYSDlEhrW+D5fyVQhJrs61wQ83sEXHLQ==}
engines: {node: '>=14'}
hasBin: true
peerDependencies:
'@remix-run/serve': ^1.14.3
'@remix-run/serve': ^1.15.0
peerDependenciesMeta:
'@remix-run/serve':
optional: true
@@ -1684,9 +1882,9 @@ packages:
'@babel/types': 7.20.7
'@esbuild-plugins/node-modules-polyfill': 0.1.4_esbuild@0.16.3
'@npmcli/package-json': 2.0.0
'@remix-run/serve': 1.14.3
'@remix-run/server-runtime': 1.14.3
'@vanilla-extract/integration': 6.1.0
'@remix-run/serve': 1.15.0
'@remix-run/server-runtime': 1.15.0
'@vanilla-extract/integration': 6.2.1
arg: 5.0.2
cacache: 15.3.0
chalk: 4.1.2
@@ -1699,6 +1897,7 @@ packages:
fast-glob: 3.2.11
fs-extra: 10.1.0
get-port: 5.1.1
glob-to-regexp: 0.4.1
gunzip-maybe: 1.4.2
inquirer: 8.2.5
jsesc: 3.0.2
@@ -1727,21 +1926,27 @@ packages:
ws: 7.5.9
xdm: 2.1.0
transitivePeerDependencies:
- '@types/node'
- bluebird
- bufferutil
- encoding
- less
- sass
- stylus
- sugarss
- supports-color
- terser
- ts-node
- utf-8-validate
dev: true
/@remix-run/eslint-config/1.14.3_km5ddj7uwb23cqeymeyvzjsfb4:
resolution: {integrity: sha512-Yy4PYSvAehj31LmkDA+lS5yCPL1lR9O04gMIo0xwHT2o59pF4QU54lEAvJJH+9MI0byZUI/v9DoGz1oGIb44IA==}
/@remix-run/eslint-config/1.15.0_km5ddj7uwb23cqeymeyvzjsfb4:
resolution: {integrity: sha512-nwCPK/4anLMDWJnBsrWL9Wfcy2eRDlKjGWZeYeozDpJnH9iG1vA5aow0OmcpblwgvAwcgSC8Gdb7P5uK4Xy5/Q==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^8.0.0
react: ^17.0.0 || ^18.0.0
typescript: ^4.0.0
typescript: ^4.0.0 || ^5.0.0
peerDependenciesMeta:
typescript:
optional: true
@@ -1771,20 +1976,20 @@ packages:
- supports-color
dev: true
/@remix-run/express/1.14.3_express@4.18.2:
resolution: {integrity: sha512-v3TT+zBFSnOiVTHNiLp5A783UVYyZYbePxmPhvoe9JwHCmzVDA9mfyxYgDl/8NPDtYS+dAPU7mQ+aE1M5MXc7g==}
/@remix-run/express/1.15.0_express@4.18.2:
resolution: {integrity: sha512-mvDZB03W6NqbtyVpeiJfmGQY1L7CX+KEfSIV/kNgyK+gAMAWhsioC/Vjlo4IFY3NvOD0rh9mxuC+/IPT6Al3uw==}
engines: {node: '>=14'}
peerDependencies:
express: ^4.17.1
dependencies:
'@remix-run/node': 1.14.3
'@remix-run/node': 1.15.0
express: 4.18.2
/@remix-run/node/1.14.3:
resolution: {integrity: sha512-Mq0wUtgJtGwMQEBr/8p9XpdPBm7N+lby5CEbW6IKV59UC9N3VMGY3snfrsphBCq3sNZfbhIpaDdu2W+8EoqfnQ==}
/@remix-run/node/1.15.0:
resolution: {integrity: sha512-CS0p8T6A2KvMoAW5zzLA/BtNNCsv34A5RJoouJvXK9/o6MriAQ/YSugg6ldS5mec49neSep+CGeL1RS6tL+3NQ==}
engines: {node: '>=14'}
dependencies:
'@remix-run/server-runtime': 1.14.3
'@remix-run/server-runtime': 1.15.0
'@remix-run/web-fetch': 4.3.2
'@remix-run/web-file': 3.0.2
'@remix-run/web-stream': 1.0.3
@@ -1794,41 +1999,41 @@ packages:
source-map-support: 0.5.21
stream-slice: 0.1.2
/@remix-run/react/1.14.3_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-dvwIx+9ZdE/9LHe8Rjos9gEOdQFLvC0dojCnKlsUIwfGhyjKE4wOHfqS9mZcmKFCvOFDakcZDallLNGaj0mEYg==}
/@remix-run/react/1.15.0_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-S0RuIeHvQTqryCZ3KVl8EsIWCqL6/ky1/kmDpN2n5Pdjew2BLC6DX7OdrY1ZQjbzOMHAROsZlyaSSVXCItunag==}
engines: {node: '>=14'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
dependencies:
'@remix-run/router': 1.3.3
'@remix-run/router': 1.5.0
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
react-router-dom: 6.8.2_biqbaboplfbrettd7655fr4n2y
react-router-dom: 6.10.0_biqbaboplfbrettd7655fr4n2y
use-sync-external-store: 1.2.0_react@18.2.0
dev: false
/@remix-run/router/1.3.3:
resolution: {integrity: sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==}
/@remix-run/router/1.5.0:
resolution: {integrity: sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==}
engines: {node: '>=14'}
/@remix-run/serve/1.14.3:
resolution: {integrity: sha512-5So5+PtAaYZq3hc45snkCKIOh51Z45WvhHpRgB0ZsOuhUf6p9UAY9LQk7GRNvkcqL9LChE3LQ9O4gPqnUiZgpA==}
/@remix-run/serve/1.15.0:
resolution: {integrity: sha512-j06vKhxtLSR3JpkcoBMPb1EeM6QrbbuTdDh4m0eY/D4QgUzba4ws6r3OzEGc5FMe5xSULO0YVd2QWlyqBlMIWQ==}
engines: {node: '>=14'}
hasBin: true
dependencies:
'@remix-run/express': 1.14.3_express@4.18.2
'@remix-run/express': 1.15.0_express@4.18.2
compression: 1.7.4
express: 4.18.2
morgan: 1.10.0
transitivePeerDependencies:
- supports-color
/@remix-run/server-runtime/1.14.3:
resolution: {integrity: sha512-qh8sxfLj/XW1u6rluN7yIgbvMCoKrVacYGUiPM7g0VHk8h8MlZGAIUfsWM45Poxo3X0uLhNuqqxMaPWldKawIQ==}
/@remix-run/server-runtime/1.15.0:
resolution: {integrity: sha512-DL9xjHfYYrEcOq5VbhYtrjJUWo/nFQAT7Y+Np/oC55HokyU6cb2jGhl52nx96aAxKwaFCse5N90GeodFsRzX7w==}
engines: {node: '>=14'}
dependencies:
'@remix-run/router': 1.3.3
'@remix-run/router': 1.5.0
'@types/cookie': 0.4.1
'@types/react': 18.0.28
'@web3-storage/multipart-parser': 1.0.0
@@ -2172,16 +2377,16 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
/@vanilla-extract/babel-plugin-debug-ids/1.0.1:
resolution: {integrity: sha512-ynyKqsJiMzM1/yiIJ6QdqpWKlK4IMJJWREpPtaemZrE1xG1B4E/Nfa6YazuDWjDkCJC1tRIpEGnVs+pMIjUxyw==}
/@vanilla-extract/babel-plugin-debug-ids/1.0.2:
resolution: {integrity: sha512-LjnbQWGeMwaydmovx8jWUR8BxLtLiPyq0xz5C8G5OvFhsuJxvavLdrBHNNizvr1dq7/3qZGlPv0znsvU4P44YA==}
dependencies:
'@babel/core': 7.20.12
transitivePeerDependencies:
- supports-color
dev: true
/@vanilla-extract/css/1.9.5:
resolution: {integrity: sha512-aVSv6q24zelKRtWx/l9yshU3gD1uCDMZ2ZGcIiYnAcPfyLryrG/1X5DxtyiPKcyI/hZWoteHofsN//2q9MvzOA==}
/@vanilla-extract/css/1.11.0:
resolution: {integrity: sha512-uohj+8cGWbnrVzTfrjlJeXqdGjH3d3TcscdQxKe3h5bb5QQXTpPSq+c+SeWADIGiZybzcW0CBvZV8jsy1ywY9w==}
dependencies:
'@emotion/hash': 0.9.0
'@vanilla-extract/private': 1.0.3
@@ -2196,22 +2401,30 @@ packages:
outdent: 0.8.0
dev: true
/@vanilla-extract/integration/6.1.0:
resolution: {integrity: sha512-7gDkOibk/DraG35ZpiAYqWd33wLA6YRnieC5vw7ItoFEzCv9bUaS9c+ZyktyWW3nRnL+e7Pc6FS6l7MKgEsX1w==}
/@vanilla-extract/integration/6.2.1:
resolution: {integrity: sha512-+xYJz07G7TFAMZGrOqArOsURG+xcYvqctujEkANjw2McCBvGEK505RxQqOuNiA9Mi9hgGdNp2JedSa94f3eoLg==}
dependencies:
'@babel/core': 7.20.12
'@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.12
'@vanilla-extract/babel-plugin-debug-ids': 1.0.1
'@vanilla-extract/css': 1.9.5
esbuild: 0.16.3
'@vanilla-extract/babel-plugin-debug-ids': 1.0.2
'@vanilla-extract/css': 1.11.0
esbuild: 0.17.6
eval: 0.1.6
find-up: 5.0.0
javascript-stringify: 2.1.0
lodash: 4.17.21
mlly: 1.1.0
outdent: 0.8.0
vite: 4.2.1
vite-node: 0.28.5
transitivePeerDependencies:
- '@types/node'
- less
- sass
- stylus
- sugarss
- supports-color
- terser
dev: true
/@vanilla-extract/private/1.0.3:
@@ -2226,16 +2439,16 @@ packages:
react: 18.2.0
dev: false
/@vercel/remix/1.14.3-patch.1_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-TBI/FS77HYZqjbgeABi7Rbg7RVQ1YLHcXm4/zroV4zl0nVbcXM2jVR3SXm0EuQKze+NZ0p3VBUz4I/xocTvq0w==}
/@vercel/remix/1.15.0_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-IS4K9u6M8oCc9VKxnS308+B0l+PHWxmBS6/o0aI2yBRQiG+yxxXn/UfPPvNDNJsfGsdcTmW/VR9dbN5EskY32g==}
engines: {node: '>=14'}
peerDependencies:
react: '*'
react-dom: '*'
dependencies:
'@remix-run/node': 1.14.3
'@remix-run/server-runtime': 1.14.3
isbot: 3.6.6
'@remix-run/node': 1.15.0
'@remix-run/server-runtime': 1.15.0
isbot: 3.6.7
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
dev: false
@@ -2596,6 +2809,11 @@ packages:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
engines: {node: '>= 0.8'}
/cac/6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
dev: true
/cacache/15.3.0:
resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==}
engines: {node: '>= 10'}
@@ -3205,6 +3423,36 @@ packages:
'@esbuild/win32-x64': 0.16.3
dev: true
/esbuild/0.17.6:
resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.17.6
'@esbuild/android-arm64': 0.17.6
'@esbuild/android-x64': 0.17.6
'@esbuild/darwin-arm64': 0.17.6
'@esbuild/darwin-x64': 0.17.6
'@esbuild/freebsd-arm64': 0.17.6
'@esbuild/freebsd-x64': 0.17.6
'@esbuild/linux-arm': 0.17.6
'@esbuild/linux-arm64': 0.17.6
'@esbuild/linux-ia32': 0.17.6
'@esbuild/linux-loong64': 0.17.6
'@esbuild/linux-mips64el': 0.17.6
'@esbuild/linux-ppc64': 0.17.6
'@esbuild/linux-riscv64': 0.17.6
'@esbuild/linux-s390x': 0.17.6
'@esbuild/linux-x64': 0.17.6
'@esbuild/netbsd-x64': 0.17.6
'@esbuild/openbsd-x64': 0.17.6
'@esbuild/sunos-x64': 0.17.6
'@esbuild/win32-arm64': 0.17.6
'@esbuild/win32-ia32': 0.17.6
'@esbuild/win32-x64': 0.17.6
dev: true
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@@ -4018,6 +4266,10 @@ packages:
is-glob: 4.0.3
dev: true
/glob-to-regexp/0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
dev: true
/glob/7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
dependencies:
@@ -4607,8 +4859,8 @@ packages:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: true
/isbot/3.6.6:
resolution: {integrity: sha512-98aGl1Spbx1led422YFrusDJ4ZutSNOymb2avZ2V4BCCjF3MqAF2k+J2zoaLYahubaFkb+3UyvbVDVlk/Ngrew==}
/isbot/3.6.7:
resolution: {integrity: sha512-SXNUQaNZlj/+9jdrGnAp6WW0YoHe3MIwwc6oRIYuhhERBUt7/L6I7JkMiA2sX9fcvS7gZ2C7GWgmDZfOOU4I5g==}
engines: {node: '>=12'}
dev: false
@@ -6031,26 +6283,26 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/react-router-dom/6.8.2_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg==}
/react-router-dom/6.10.0_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==}
engines: {node: '>=14'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
dependencies:
'@remix-run/router': 1.3.3
'@remix-run/router': 1.5.0
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
react-router: 6.8.2_react@18.2.0
react-router: 6.10.0_react@18.2.0
dev: false
/react-router/6.8.2_react@18.2.0:
resolution: {integrity: sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw==}
/react-router/6.10.0_react@18.2.0:
resolution: {integrity: sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==}
engines: {node: '>=14'}
peerDependencies:
react: '>=16.8'
dependencies:
'@remix-run/router': 1.3.3
'@remix-run/router': 1.5.0
react: 18.2.0
dev: false
@@ -6282,6 +6534,14 @@ packages:
estree-walker: 0.6.1
dev: true
/rollup/3.20.2:
resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
fsevents: 2.3.2
dev: true
/run-async/2.4.1:
resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
engines: {node: '>=0.12.0'}
@@ -7008,6 +7268,62 @@ packages:
vfile-message: 3.1.4
dev: true
/vite-node/0.28.5:
resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==}
engines: {node: '>=v14.16.0'}
hasBin: true
dependencies:
cac: 6.7.14
debug: 4.3.4
mlly: 1.1.0
pathe: 1.1.0
picocolors: 1.0.0
source-map: 0.6.1
source-map-support: 0.5.21
vite: 4.2.1
transitivePeerDependencies:
- '@types/node'
- less
- sass
- stylus
- sugarss
- supports-color
- terser
dev: true
/vite/4.2.1:
resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
'@types/node': '>= 14'
less: '*'
sass: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
dependencies:
esbuild: 0.17.6
postcss: 8.4.21
resolve: 1.22.1
rollup: 3.20.2
optionalDependencies:
fsevents: 2.3.2
dev: true
/vm2/3.9.14:
resolution: {integrity: sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==}
engines: {node: '>=6.0'}

View File

@@ -0,0 +1,18 @@
{
"private": true,
"name": "@vercel-internals/constants",
"types": "dist/index.d.ts",
"main": "dist/index.js",
"scripts": {
"build": "tsc -p tsconfig.json"
},
"dependencies": {
"@vercel/build-utils": "6.3.2",
"@vercel/routing-utils": "2.1.10"
},
"devDependencies": {
"@vercel-internals/tsconfig": "*",
"@vercel/style-guide": "4.0.2",
"typescript": "4.9.4"
}
}

View File

@@ -0,0 +1,5 @@
export const PROJECT_ENV_TARGET = [
'production',
'preview',
'development',
] as const;

View File

@@ -0,0 +1,7 @@
{
"extends": "@vercel-internals/tsconfig",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["src/**/*.ts"]
}

View File

@@ -1,6 +1,10 @@
import type { BuilderFunctions } from '@vercel/build-utils';
import type { Readable, Writable } from 'stream';
import type { Route } from '@vercel/routing-utils';
import { PROJECT_ENV_TARGET } from '@vercel-internals/constants';
export type ProjectEnvTarget = typeof PROJECT_ENV_TARGET[number];
export type ProjectEnvType = 'plain' | 'secret' | 'encrypted' | 'system';
export type ProjectSettings = import('@vercel/build-utils').ProjectSettings;
@@ -300,20 +304,6 @@ export interface Secret {
createdAt: number;
}
// TODO (Ethan-Arrowood) - Replace enums
export enum ProjectEnvTarget {
Production = 'production',
Preview = 'preview',
Development = 'development',
}
export enum ProjectEnvType {
Plaintext = 'plain',
Secret = 'secret',
Encrypted = 'encrypted',
System = 'system',
}
export interface ProjectEnvVariable {
id: string;
key: string;

View File

@@ -1,15 +1,11 @@
{
"private": true,
"name": "@vercel-internals/types",
"types": "dist/index.d.ts",
"main": "dist/index.js",
"files": [
"dist"
],
"scripts": {
"build": "tsc -p tsconfig.json"
},
"types": "index.d.ts",
"main": "index.d.ts",
"dependencies": {
"@types/node": "14.14.31",
"@vercel-internals/constants": "*",
"@vercel/build-utils": "6.3.2",
"@vercel/routing-utils": "2.1.10"
},

View File

@@ -1,7 +1,7 @@
{
"extends": "@vercel-internals/tsconfig",
"compilerOptions": {
"outDir": "./dist"
"noEmit": true
},
"include": ["index.ts"]
"include": ["index.d.ts"]
}

View File

@@ -23,7 +23,7 @@
"execa": "3.2.0",
"fs-extra": "11.1.0",
"husky": "7.0.4",
"jest": "28.0.2",
"jest": "29.5.0",
"json5": "2.1.1",
"lint-staged": "9.2.5",
"node-fetch": "2.6.7",
@@ -31,15 +31,14 @@
"prettier": "2.6.2",
"source-map-support": "0.5.12",
"ts-eager": "2.0.2",
"ts-jest": "28.0.5",
"turbo": "1.8.5"
"ts-jest": "29.1.0",
"turbo": "1.9.1"
},
"scripts": {
"lerna": "lerna",
"version": "pnpm install && git add pnpm-lock.yaml",
"bootstrap": "lerna bootstrap",
"publish-stable": "echo 'Run `pnpm changelog` for instructions'",
"publish-canary": "git checkout main && git pull && lerna version prerelease --preid canary --message \"Publish Canary\" --exact",
"publish-from-github": "./utils/publish.sh",
"changelog": "node utils/changelog.js",
"build": "node utils/gen.js && turbo --no-update-notifier run build",

View File

@@ -0,0 +1,14 @@
/** @type {import('@ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
preset: 'ts-jest',
globals: {
'ts-jest': {
diagnostics: false,
isolatedModules: true,
},
},
setupFilesAfterEnv: ['@alex_neo/jest-expect-message'],
verbose: false,
testEnvironment: 'node',
testMatch: ['<rootDir>/test/**/*.test.ts'],
};

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "28.18.4",
"version": "28.19.0",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -33,15 +33,15 @@
},
"dependencies": {
"@vercel/build-utils": "6.7.1",
"@vercel/go": "2.4.4",
"@vercel/hydrogen": "0.0.62",
"@vercel/next": "3.7.4",
"@vercel/node": "2.10.3",
"@vercel/python": "3.1.58",
"@vercel/go": "2.5.0",
"@vercel/hydrogen": "0.0.63",
"@vercel/next": "3.7.5",
"@vercel/node": "2.11.0",
"@vercel/python": "3.1.59",
"@vercel/redwood": "1.1.14",
"@vercel/remix-builder": "1.8.4",
"@vercel/remix-builder": "1.8.5",
"@vercel/ruby": "1.3.75",
"@vercel/static-build": "1.3.22"
"@vercel/static-build": "1.3.24"
},
"devDependencies": {
"@alex_neo/jest-expect-message": "1.0.5",
@@ -84,12 +84,13 @@
"@types/which": "1.3.2",
"@types/write-json-file": "2.2.1",
"@types/yauzl-promise": "2.1.0",
"@vercel-internals/constants": "*",
"@vercel-internals/get-package-json": "*",
"@vercel-internals/types": "*",
"@vercel/client": "12.4.9",
"@vercel/error-utils": "1.0.9",
"@vercel/client": "12.4.10",
"@vercel/error-utils": "1.0.10",
"@vercel/frameworks": "1.3.4",
"@vercel/fs-detectors": "3.8.9",
"@vercel/fs-detectors": "3.8.11",
"@vercel/fun": "1.0.4",
"@vercel/ncc": "0.24.0",
"@vercel/routing-utils": "2.2.0",
@@ -168,22 +169,5 @@
"write-json-file": "2.2.0",
"xdg-app-paths": "5.1.0",
"yauzl-promise": "2.1.3"
},
"jest": {
"preset": "ts-jest",
"globals": {
"ts-jest": {
"diagnostics": false,
"isolatedModules": true
}
},
"setupFilesAfterEnv": [
"@alex_neo/jest-expect-message"
],
"verbose": false,
"testEnvironment": "node",
"testMatch": [
"<rootDir>/test/**/*.test.ts"
]
}
}

View File

@@ -12,7 +12,7 @@ import stamp from '../../util/output/stamp';
import strlen from '../../util/strlen';
import getCommandFlags from '../../util/get-command-flags';
import { getCommandName } from '../../util/pkg-name';
import { Alias } from '@vercel-internals/types';
import type { Alias } from '@vercel-internals/types';
export default async function ls(
client: Client,

View File

@@ -9,7 +9,7 @@ import strlen from '../../util/strlen';
import confirm from '../../util/input/confirm';
import findAliasByAliasOrId from '../../util/alias/find-alias-by-alias-or-id';
import { Alias } from '@vercel-internals/types';
import type { Alias } from '@vercel-internals/types';
import { isValidName } from '../../util/is-valid-name';
import { getCommandName } from '../../util/pkg-name';

View File

@@ -1,7 +1,7 @@
import chalk from 'chalk';
import { SetDifference } from 'utility-types';
import { AliasRecord } from '../../util/alias/create-alias';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
import { Output } from '../../util/output';
import * as ERRORS from '../../util/errors-ts';
import assignAlias from '../../util/alias/assign-alias';

View File

@@ -5,7 +5,7 @@ import stamp from '../../util/output/stamp';
import createCertFromFile from '../../util/certs/create-cert-from-file';
import createCertForCns from '../../util/certs/create-cert-for-cns';
import { getCommandName } from '../../util/pkg-name';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
interface Options {
'--overwrite'?: boolean;

View File

@@ -10,7 +10,7 @@ import {
import stamp from '../../util/output/stamp';
import getCerts from '../../util/certs/get-certs';
import strlen from '../../util/strlen';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import getCommandFlags from '../../util/get-command-flags';
import { getCommandName } from '../../util/pkg-name';

View File

@@ -2,7 +2,7 @@ import chalk from 'chalk';
import ms from 'ms';
import plural from 'pluralize';
import table from 'text-table';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import * as ERRORS from '../../util/errors-ts';
import { Output } from '../../util/output';
import deleteCertById from '../../util/certs/delete-cert-by-id';

View File

@@ -71,6 +71,7 @@ export const help = () => `
-m, --meta Add metadata for the deployment (e.g.: ${chalk.dim(
'`-m KEY=value`'
)}). Can appear many times.
--no-wait Don't wait for the deployment to finish
-S, --scope Set a custom scope
--regions Set default regions to enable the deployment on
--prod Create a production deployment

View File

@@ -16,7 +16,7 @@ import { handleError } from '../../util/error';
import Client from '../../util/client';
import { getPrettyError } from '@vercel/build-utils';
import toHumanPath from '../../util/humanize-path';
import Now from '../../util';
import Now, { CreateOptions } from '../../util';
import stamp from '../../util/output/stamp';
import createDeploy from '../../util/deploy/create-deploy';
import getDeployment from '../../util/get-deployment';
@@ -70,6 +70,8 @@ import { isValidArchive } from '../../util/deploy/validate-archive-format';
import { parseEnv } from '../../util/parse-env';
import { errorToString, isErrnoException, isError } from '@vercel/error-utils';
import { pickOverrides } from '../../util/projects/project-settings';
import { isDeploying } from '../../util/deploy/is-deploying';
import type { Deployment } from '@vercel-internals/types';
export default async (client: Client): Promise<number> => {
const { output } = client;
@@ -90,6 +92,7 @@ export default async (client: Client): Promise<number> => {
'--prebuilt': Boolean,
'--prod': Boolean,
'--archive': String,
'--no-wait': Boolean,
'--yes': Boolean,
'-f': '--force',
'-p': '--public',
@@ -505,12 +508,20 @@ export default async (client: Client): Promise<number> => {
});
let deployStamp = stamp();
let deployment = null;
const noWait = !!argv['--no-wait'];
const localConfigurationOverrides = pickOverrides(localConfig);
const name = project ? project.name : newProjectName;
if (!name) {
throw new Error(
'`name` not found on project or provided by existing project'
);
}
try {
const createArgs: any = {
name: project ? project.name : newProjectName,
const createArgs: CreateOptions = {
name,
env: deploymentEnv,
build: { env: deploymentBuildEnv },
forceNew: argv['--force'],
@@ -518,8 +529,7 @@ export default async (client: Client): Promise<number> => {
prebuilt: argv['--prebuilt'],
rootDirectory,
quiet,
wantsPublic: argv['--public'] || localConfig.public,
type: null,
wantsPublic: Boolean(argv['--public'] || localConfig.public),
nowConfig: {
...localConfig,
// `images` is allowed in "vercel.json" and processed
@@ -532,6 +542,7 @@ export default async (client: Client): Promise<number> => {
deployStamp,
target,
skipAutoDetectionConfirmation: autoConfirm,
noWait,
};
if (!localConfig.builds || localConfig.builds.length === 0) {
@@ -627,8 +638,10 @@ export default async (client: Client): Promise<number> => {
return 1;
}
// get the deployment just to double check that it actually deployed
await getDeployment(client, contextName, deployment.id);
if (!noWait) {
// get the deployment just to double check that it actually deployed
await getDeployment(client, contextName, deployment.id);
}
if (deployment === null) {
error('Uploading failed. Please try again.');
@@ -715,7 +728,7 @@ export default async (client: Client): Promise<number> => {
return 1;
}
return printDeploymentStatus(output, client, deployment, deployStamp);
return printDeploymentStatus(output, client, deployment, deployStamp, noWait);
};
function handleCreateDeployError(
@@ -835,7 +848,7 @@ const printDeploymentStatus = async (
url: deploymentUrl,
aliasWarning,
}: {
readyState: string;
readyState: Deployment['readyState'];
alias: string[];
aliasError: Error;
target: string;
@@ -848,12 +861,26 @@ const printDeploymentStatus = async (
action?: string;
};
},
deployStamp: () => string
deployStamp: () => string,
noWait: boolean
) => {
indications = indications || [];
const isProdDeployment = target === 'production';
if (readyState !== 'READY') {
let isStillBuilding = false;
if (noWait) {
if (isDeploying(readyState)) {
isStillBuilding = true;
output.print(
prependEmoji(
'Note: Deployment is still processing...',
emoji('notice')
) + '\n'
);
}
}
if (!isStillBuilding && readyState !== 'READY') {
output.error(
`Your deployment failed. Please retry later. More: https://err.sh/vercel/deployment-error`
);
@@ -869,7 +896,8 @@ const printDeploymentStatus = async (
} else {
// print preview/production url
let previewUrl: string;
if (Array.isArray(aliasList) && aliasList.length > 0) {
// if `noWait` is true, then use the deployment url, not an alias
if (!noWait && Array.isArray(aliasList) && aliasList.length > 0) {
const previewUrlInfo = await getPreferredPreviewURL(client, aliasList);
if (previewUrlInfo) {
previewUrl = previewUrlInfo.previewUrl;

View File

@@ -5,7 +5,7 @@ import DevServer from '../../util/dev/server';
import { parseListen } from '../../util/dev/parse-listen';
import Client from '../../util/client';
import { getLinkedProject } from '../../util/projects/link';
import { ProjectSettings } from '@vercel-internals/types';
import type { ProjectSettings } from '@vercel-internals/types';
import setupAndLink from '../../util/link/setup-and-link';
import { getCommandName } from '../../util/pkg-name';
import param from '../../util/output/param';

View File

@@ -1,7 +1,7 @@
import chalk from 'chalk';
import ms from 'ms';
import { DomainNotFound } from '../../util/errors-ts';
import { DNSRecord } from '@vercel-internals/types';
import type { DNSRecord } from '@vercel-internals/types';
import Client from '../../util/client';
import formatTable from '../../util/format-table';
import getDNSRecords, {

View File

@@ -1,7 +1,7 @@
import chalk from 'chalk';
import ms from 'ms';
import table from 'text-table';
import { DNSRecord } from '@vercel-internals/types';
import type { DNSRecord } from '@vercel-internals/types';
import { Output } from '../../util/output';
import Client from '../../util/client';
import deleteDNSRecordById from '../../util/dns/delete-dns-record-by-id';

View File

@@ -8,7 +8,7 @@ import getScope from '../../util/get-scope';
import stamp from '../../util/output/stamp';
import formatTable from '../../util/format-table';
import { formatDateWithoutTime } from '../../util/format-date';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
import getCommandFlags from '../../util/get-command-flags';
import {
PaginationOptions,

View File

@@ -2,7 +2,7 @@ import chalk from 'chalk';
import plural from 'pluralize';
import { DomainNotFound, DomainPermissionDenied } from '../../util/errors-ts';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
import { Output } from '../../util/output';
import Client from '../../util/client';
import deleteCertById from '../../util/certs/delete-cert-by-id';

View File

@@ -1,9 +1,5 @@
import chalk from 'chalk';
import {
ProjectEnvTarget,
Project,
ProjectEnvType,
} from '@vercel-internals/types';
import type { Project, ProjectEnvTarget } from '@vercel-internals/types';
import { Output } from '../../util/output';
import Client from '../../util/client';
import stamp from '../../util/output/stamp';
@@ -12,7 +8,7 @@ import getEnvRecords from '../../util/env/get-env-records';
import {
isValidEnvTarget,
getEnvTargetPlaceholder,
getEnvTargetChoices,
envTargetChoices,
} from '../../util/env/env-target';
import readStandardInput from '../../util/input/read-standard-input';
import param from '../../util/output/param';
@@ -92,7 +88,7 @@ export default async function add(
const existing = new Set(
envs.filter(r => r.key === envName).map(r => r.target)
);
const choices = getEnvTargetChoices().filter(c => !existing.has(c.value));
const choices = envTargetChoices.filter(c => !existing.has(c.value));
if (choices.length === 0) {
output.error(
@@ -138,7 +134,7 @@ export default async function add(
!stdInput &&
!envGitBranch &&
envTargets.length === 1 &&
envTargets[0] === ProjectEnvTarget.Preview
envTargets[0] === 'preview'
) {
const { inputValue } = await client.prompt({
type: 'input',
@@ -155,7 +151,7 @@ export default async function add(
output,
client,
project.id,
ProjectEnvType.Encrypted,
'encrypted',
envName,
envValue,
envTargets,

View File

@@ -1,11 +1,7 @@
import chalk from 'chalk';
import ms from 'ms';
import { Output } from '../../util/output';
import {
Project,
ProjectEnvVariable,
ProjectEnvType,
} from '@vercel-internals/types';
import type { Project, ProjectEnvVariable } from '@vercel-internals/types';
import Client from '../../util/client';
import formatTable from '../../util/format-table';
import getEnvRecords from '../../util/env/get-env-records';
@@ -99,13 +95,13 @@ function getTable(records: ProjectEnvVariable[]) {
function getRow(env: ProjectEnvVariable) {
let value: string;
if (env.type === ProjectEnvType.Plaintext) {
if (env.type === 'plain') {
// replace space characters (line-break, etc.) with simple spaces
// to make sure the displayed value is a single line
const singleLineValue = env.value.replace(/\s/g, ' ');
value = chalk.gray(ellipsis(singleLineValue, 19));
} else if (env.type === ProjectEnvType.System) {
} else if (env.type === 'system') {
value = chalk.gray.italic(env.value);
} else {
value = chalk.gray.italic('Encrypted');

View File

@@ -2,7 +2,7 @@ import chalk from 'chalk';
import { outputFile } from 'fs-extra';
import { closeSync, openSync, readSync } from 'fs';
import { resolve } from 'path';
import { Project, ProjectEnvTarget } from '@vercel-internals/types';
import type { Project, ProjectEnvTarget } from '@vercel-internals/types';
import Client from '../../util/client';
import { emoji, prependEmoji } from '../../util/emoji';
import confirm from '../../util/input/confirm';
@@ -101,7 +101,7 @@ export default async function pull(
const records = (
await pullEnvRecords(output, client, project.id, source, {
target: environment || ProjectEnvTarget.Development,
target: environment || 'development',
gitBranch,
})
).env;

View File

@@ -1,5 +1,5 @@
import chalk from 'chalk';
import { Project } from '@vercel-internals/types';
import type { Project } from '@vercel-internals/types';
import { Output } from '../../util/output';
import confirm from '../../util/input/confirm';
import removeEnvRecord from '../../util/env/remove-env-record';

View File

@@ -178,6 +178,7 @@ export default async function connect(
gitOrg,
repo,
});
if (typeof checkAndConnect === 'number') {
return checkAndConnect;
}

View File

@@ -10,10 +10,14 @@ import getScope from '../util/get-scope';
import { getPkgName, getCommandName } from '../util/pkg-name';
import Client from '../util/client';
import getDeployment from '../util/get-deployment';
import { Build, Deployment } from '@vercel-internals/types';
import type { Build, Deployment } from '@vercel-internals/types';
import title from 'title';
import { isErrnoException } from '@vercel/error-utils';
import { URL } from 'url';
import readStandardInput from '../util/input/read-standard-input';
import sleep from '../util/sleep';
import ms from 'ms';
import { isDeploying } from '../util/deploy/is-deploying';
const help = () => {
console.log(`
@@ -34,6 +38,10 @@ const help = () => {
-d, --debug Debug mode [off]
--no-color No color mode [off]
-S, --scope Set a custom scope
--timeout=${chalk.bold.underline(
'TIME'
)} Time to wait for deployment completion [3m]
--wait Blocks until deployment completes
${chalk.dim('Examples:')}
@@ -44,6 +52,16 @@ const help = () => {
${chalk.gray('-')} Get information about the deployment an alias points to
${chalk.cyan(`$ ${getPkgName()} inspect my-deployment.vercel.app`)}
${chalk.gray('-')} Get information about a deployment by piping in the URL
${chalk.cyan(`$ echo my-deployment.vercel.app | ${getPkgName()} inspect`)}
${chalk.gray('-')} Wait up to 90 seconds for deployment to complete
${chalk.cyan(
`$ ${getPkgName()} inspect my-deployment.vercel.app --wait --timeout 90s`
)}
`);
};
@@ -51,7 +69,10 @@ export default async function main(client: Client) {
let argv;
try {
argv = getArgs(client.argv.slice(2));
argv = getArgs(client.argv.slice(2), {
'--timeout': String,
'--wait': Boolean,
});
} catch (err) {
handleError(err);
return 1;
@@ -67,12 +88,28 @@ export default async function main(client: Client) {
// extract the first parameter
let [, deploymentIdOrHost] = argv._;
if (argv._.length !== 2) {
if (!deploymentIdOrHost) {
// if the URL is not passed in, check stdin
// allows cool stuff like `echo my-deployment.vercel.app | vc inspect --wait`
const stdInput = await readStandardInput(client.stdin);
if (stdInput) {
deploymentIdOrHost = stdInput;
}
}
if (!deploymentIdOrHost) {
error(`${getCommandName('inspect <url>')} expects exactly one argument`);
help();
return 1;
}
// validate the timeout
const timeout = ms(argv['--timeout'] ?? '3m');
if (timeout === undefined) {
error(`Invalid timeout "${argv['--timeout']}"`);
return 1;
}
let contextName: string | null = null;
try {
@@ -98,12 +135,22 @@ export default async function main(client: Client) {
`Fetching deployment "${deploymentIdOrHost}" in ${chalk.bold(contextName)}`
);
const until = Date.now() + timeout;
const wait = argv['--wait'];
// resolve the deployment, since we might have been given an alias
const deployment = await getDeployment(
client,
contextName,
deploymentIdOrHost
);
let deployment = await getDeployment(client, contextName, deploymentIdOrHost);
while (Date.now() < until) {
if (!wait || !isDeploying(deployment.readyState)) {
break;
}
await sleep(250);
// check the deployment state again
deployment = await getDeployment(client, contextName, deploymentIdOrHost);
}
const {
id,

View File

@@ -1,7 +1,7 @@
import chalk from 'chalk';
import ms from 'ms';
import table from 'text-table';
import { Project } from '@vercel-internals/types';
import type { Project } from '@vercel-internals/types';
import Client from '../../util/client';
import getCommandFlags from '../../util/get-command-flags';
import { getCommandName } from '../../util/pkg-name';

View File

@@ -50,12 +50,10 @@ import getUpdateCommand from './util/get-update-command';
import { metrics, shouldCollectMetrics } from './util/metrics';
import { getCommandName, getTitleName } from './util/pkg-name';
import doLoginPrompt from './util/login/prompt';
import { AuthConfig, GlobalConfig } from '@vercel-internals/types';
import type { AuthConfig, GlobalConfig } from '@vercel-internals/types';
import { VercelConfig } from '@vercel/client';
import box from './util/output/box';
const isCanary = pkg.version.includes('canary');
const VERCEL_DIR = getGlobalPathConfig();
const VERCEL_CONFIG_PATH = configFiles.getConfigFilePath();
const VERCEL_AUTH_CONFIG_PATH = configFiles.getAuthConfigFilePath();
@@ -70,7 +68,7 @@ sourceMap.install();
Sentry.init({
dsn: SENTRY_DSN,
release: `vercel-cli@${pkg.version}`,
environment: isCanary ? 'canary' : 'stable',
environment: 'stable',
});
let client: Client;
@@ -165,13 +163,7 @@ const main = async () => {
)}`
);
} else {
output.print(
`${chalk.grey(
`${getTitleName()} CLI ${pkg.version}${
isCanary ? ' — https://vercel.com/feedback' : ''
}`
)}\n`
);
output.print(`${chalk.grey(`${getTitleName()} CLI ${pkg.version}`)}\n`);
}
// Handle `--version` directly
@@ -707,7 +699,6 @@ main()
// Check if an update is available. If so, `latest` will contain a string
// of the latest version, otherwise `undefined`.
const latest = getLatestVersion({
distTag: isCanary ? 'canary' : 'latest',
output,
pkg,
});

View File

@@ -1,5 +1,5 @@
import { Output } from '../output';
import { Alias } from '@vercel-internals/types';
import type { Alias } from '@vercel-internals/types';
import Client from '../client';

View File

@@ -2,7 +2,7 @@ import path from 'path';
import chalk from 'chalk';
import Client from '../client';
import { Output } from '../output';
import { User } from '@vercel-internals/types';
import type { User } from '@vercel-internals/types';
import { VercelConfig } from '../dev/types';
import getDeploymentsByAppName from '../deploy/get-deployments-by-appname';
import getDeployment from '../get-deployment';

View File

@@ -1,6 +1,6 @@
import Client from '../client';
import getAliases from './get-aliases';
import { Alias } from '@vercel-internals/types';
import type { Alias } from '@vercel-internals/types';
export default async function getDomainAliases(client: Client, domain: string) {
const { aliases } = await getAliases(client);

View File

@@ -1,4 +1,4 @@
import { Build } from '@vercel-internals/types';
import type { Build } from '@vercel-internals/types';
export const isReady = ({ readyState }: Pick<Build, 'readyState'>) =>
readyState === 'READY';

View File

@@ -1,7 +1,7 @@
import { readFileSync } from 'fs';
import { resolve } from 'path';
import Client from '../client';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import { isErrnoException } from '@vercel/error-utils';
import { isAPIError } from '../errors-ts';

View File

@@ -1,6 +1,6 @@
import chalk from 'chalk';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import * as ERRORS from '../errors-ts';
import Client from '../client';
import mapCertError from './map-cert-error';

View File

@@ -1,4 +1,4 @@
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import Client from '../client';
import * as ERRORS from '../errors-ts';

View File

@@ -1,5 +1,5 @@
import { stringify } from 'querystring';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import Client from '../client';
/**

View File

@@ -1,5 +1,5 @@
import { stringify } from 'querystring';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import * as ERRORS from '../errors-ts';
import Client from '../client';

View File

@@ -1,5 +1,5 @@
import retry from 'async-retry';
import { Cert } from '@vercel-internals/types';
import type { Cert } from '@vercel-internals/types';
import Client from '../client';
import { isAPIError } from '../errors-ts';
import { isError } from '@vercel/error-utils';

View File

@@ -3,7 +3,7 @@ import * as ERRORS_TS from '../errors-ts';
import * as ERRORS from '../errors';
import { NowError } from '../now-error';
import mapCertError from '../certs/map-cert-error';
import { Org } from '@vercel-internals/types';
import type { Org } from '@vercel-internals/types';
import Now, { CreateOptions } from '..';
import Client from '../client';
import { ArchiveFormat, DeploymentError } from '@vercel/client';

View File

@@ -1,5 +1,5 @@
import { URLSearchParams } from 'url';
import { Deployment } from '@vercel-internals/types';
import type { Deployment } from '@vercel-internals/types';
import Client from '../client';
type LegacyDeployment = {

View File

@@ -0,0 +1,23 @@
import { Deployment } from '@vercel-internals/types';
export const deploymentInProgressStates: Deployment['readyState'][] = [
'QUEUED',
'BUILDING',
'INITIALIZING',
];
export const deploymentCompletedStates: Deployment['readyState'][] = [
'READY',
'CANCELED',
'ERROR',
];
/**
* Checks if the deployments readyState is considered to be in progress.
* @param readyState The deployment's readyState
* @returns `true` if in a pending deployment state, otherwise `false` if it's
* ready/canceled/errored
*/
export function isDeploying(readyState: Deployment['readyState']): Boolean {
return deploymentInProgressStates.includes(readyState);
}

View File

@@ -9,7 +9,7 @@ import {
import { Output } from '../output';
import { progress } from '../output/progress';
import Now from '../../util';
import { Org } from '@vercel-internals/types';
import type { Org } from '@vercel-internals/types';
import ua from '../ua';
import { linkFolderToProject } from '../projects/link';
import { prependEmoji, emoji } from '../emoji';
@@ -34,6 +34,7 @@ export default async function processDeployment({
isSettingUpProject,
archive,
skipAutoDetectionConfirmation,
noWait,
...args
}: {
now: Now;
@@ -52,7 +53,8 @@ export default async function processDeployment({
archive?: ArchiveFormat;
skipAutoDetectionConfirmation?: boolean;
cwd?: string;
rootDirectory?: string;
rootDirectory?: string | null;
noWait?: boolean;
}) {
let {
now,
@@ -180,6 +182,10 @@ export default async function processDeployment({
process.stdout.write(`https://${event.payload.url}`);
}
if (noWait) {
return event.payload;
}
output.spinner(
event.payload.readyState === 'QUEUED' ? 'Queued' : 'Building',
0

View File

@@ -51,10 +51,8 @@ import link from '../output/link';
import sleep from '../sleep';
import { Output } from '../output';
import { relative } from '../path-helpers';
import { getDistTag } from '../get-dist-tag';
import getVercelConfigPath from '../config/local-path';
import { MissingDotenvVarsError } from '../errors-ts';
import cliPkg from '../pkg';
import { getVercelDirectory } from '../projects/link';
import { staticFiles as getFiles } from '../get-files';
import { validateConfig } from '../validate-config';
@@ -85,7 +83,7 @@ import {
HttpHeadersConfig,
EnvConfigs,
} from './types';
import { ProjectSettings } from '@vercel-internals/types';
import type { ProjectSettings } from '@vercel-internals/types';
import { treeKill } from '../tree-kill';
import { applyOverriddenHeaders, nodeHeadersToFetchHeaders } from './headers';
import { formatQueryString, parseQueryString } from './parse-query-string';
@@ -593,7 +591,7 @@ export default class DevServer {
rewriteRoutes,
errorRoutes,
} = await detectBuilders(files, pkg, {
tag: getDistTag(cliPkg.version) === 'canary' ? 'canary' : 'latest',
tag: 'latest',
functions: vercelConfig.functions,
projectSettings: projectSettings || this.projectSettings,
featHandleMiss,

View File

@@ -16,7 +16,7 @@ import {
import { VercelConfig } from '@vercel/client';
import { HandleValue, Route } from '@vercel/routing-utils';
import { Output } from '../output';
import { ProjectSettings } from '@vercel-internals/types';
import type { ProjectSettings } from '@vercel-internals/types';
import { BuilderWithPkg } from '../build/import-builders';
export { VercelConfig };

View File

@@ -7,7 +7,7 @@ import {
DNSConflictingRecord,
isAPIError,
} from '../errors-ts';
import { DNSRecordData } from '@vercel-internals/types';
import type { DNSRecordData } from '@vercel-internals/types';
type Response = {
uid: string;

View File

@@ -1,5 +1,5 @@
import chalk from 'chalk';
import { DNSRecordData } from '@vercel-internals/types';
import type { DNSRecordData } from '@vercel-internals/types';
import textInput from '../input/text';
import promptBool from '../input/prompt-bool';
import Client from '../client';

View File

@@ -1,4 +1,4 @@
import { DNSRecord } from '@vercel-internals/types';
import type { DNSRecord } from '@vercel-internals/types';
import Client from '../client';
export default async function getDNSRecordById(

View File

@@ -1,4 +1,4 @@
import { DNSRecord } from '@vercel-internals/types';
import type { DNSRecord } from '@vercel-internals/types';
import { DomainNotFound } from '../errors-ts';
import { Output } from '../output';
import Client from '../client';

View File

@@ -1,4 +1,4 @@
import { DNSRecordData } from '@vercel-internals/types';
import type { DNSRecordData } from '@vercel-internals/types';
export default function parseAddArgs(
args: string[]

View File

@@ -1,7 +1,7 @@
import chalk from 'chalk';
import retry from 'async-retry';
import { DomainAlreadyExists, InvalidDomain, isAPIError } from '../errors-ts';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
import Client from '../client';
type Response = {

View File

@@ -1,6 +1,6 @@
import chalk from 'chalk';
import Client from '../client';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
import {
DomainPermissionDenied,
DomainNotFound,

View File

@@ -1,5 +1,5 @@
import Client from '../client';
import { DomainConfig } from '@vercel-internals/types';
import type { DomainConfig } from '@vercel-internals/types';
import { isAPIError } from '../errors-ts';
export async function getDomainConfig(client: Client, domainName: string) {

View File

@@ -1,4 +1,4 @@
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
export type DomainRegistrar = 'Vercel' | 'Purchase in Process' | 'Third Party';

View File

@@ -1,6 +1,6 @@
import chalk from 'chalk';
import Client from '../client';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
import { isAPIError } from '../errors-ts';
type Response = {

View File

@@ -1,4 +1,4 @@
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
export default function isDomainExternal(domain: Domain) {
return domain.serviceType !== 'zeit.world';

View File

@@ -1,6 +1,6 @@
import psl from 'psl';
import { NowError } from '../now-error';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
import { Output } from '../output';
import * as ERRORS from '../errors-ts';
import addDomain from './add-domain';

View File

@@ -1,6 +1,6 @@
import * as ERRORS from '../errors-ts';
import Client from '../client';
import { Domain } from '@vercel-internals/types';
import type { Domain } from '@vercel-internals/types';
type Response = {
domain: Domain;

View File

@@ -1,6 +1,6 @@
import { Output } from '../output';
import Client from '../client';
import {
import type {
ProjectEnvTarget,
ProjectEnvVariable,
ProjectEnvType,

View File

@@ -1,22 +1,22 @@
import { ProjectEnvTarget } from '@vercel-internals/types';
import type { ProjectEnvTarget } from '@vercel-internals/types';
import { PROJECT_ENV_TARGET } from '@vercel-internals/constants';
import title from 'title';
function envTargets(): string[] {
return Object.values(ProjectEnvTarget);
}
export function getEnvTargetChoices() {
return Object.entries(ProjectEnvTarget).map(([key, value]) => ({
name: key,
value: value,
}));
}
export const envTargetChoices = PROJECT_ENV_TARGET.map(t => ({
name: title(t),
value: t,
}));
export function isValidEnvTarget(
target?: string
): target is ProjectEnvTarget | undefined {
return typeof target === 'undefined' || envTargets().includes(target);
// Specify `map` returns strings, instead of string constants so `.includes` works
return (
typeof target === 'undefined' ||
envTargetChoices.map<string>(c => c.value).includes(target)
);
}
export function getEnvTargetPlaceholder() {
return `<${envTargets().join(' | ')}>`;
return `<${envTargetChoices.map(c => c.value).join(' | ')}>`;
}

View File

@@ -1,5 +1,5 @@
import title from 'title';
import { ProjectEnvVariable } from '@vercel-internals/types';
import type { ProjectEnvVariable } from '@vercel-internals/types';
export default function formatEnvTarget(env: ProjectEnvVariable): string {
const target = (Array.isArray(env.target) ? env.target : [env.target || ''])

View File

@@ -1,6 +1,9 @@
import { Output } from '../output';
import Client from '../client';
import { ProjectEnvVariable, ProjectEnvTarget } from '@vercel-internals/types';
import type {
ProjectEnvVariable,
ProjectEnvTarget,
} from '@vercel-internals/types';
import { URLSearchParams } from 'url';
/** The CLI command that was used that needs the environment variables. */

View File

@@ -1,6 +1,6 @@
import { Output } from '../output';
import Client from '../client';
import { ProjectEnvVariable } from '@vercel-internals/types';
import type { ProjectEnvVariable } from '@vercel-internals/types';
export default async function removeEnvRecord(
output: Output,

View File

@@ -1,9 +0,0 @@
import semver from 'semver';
export function getDistTag(version: string): string {
const parsed = semver.parse(version);
if (parsed && typeof parsed.prerelease[0] === 'string') {
return parsed.prerelease[0] as string;
}
return 'latest';
}

View File

@@ -2,7 +2,7 @@ import Client from './client';
import getUser from './get-user';
import getTeamById from './teams/get-team-by-id';
import { TeamDeleted } from './errors-ts';
import { Team } from '@vercel-internals/types';
import type { Team } from '@vercel-internals/types';
interface GetScopeOptions {
getTeam?: boolean;

View File

@@ -1,31 +1,8 @@
import { Stats } from 'fs';
import { readFile, realpath } from 'fs-extra';
import { sep, dirname, join, resolve } from 'path';
import { lstat, readlink, readFile, realpath } from 'fs-extra';
import { isCanary } from './is-canary';
import { scanParentDirs } from '@vercel/build-utils';
import { getPkgName } from './pkg-name';
async function isYarn(): Promise<boolean> {
let s: Stats;
let binPath = process.argv[1];
// eslint-disable-next-line no-constant-condition
while (true) {
s = await lstat(binPath);
if (s.isSymbolicLink()) {
binPath = resolve(dirname(binPath), await readlink(binPath));
} else {
break;
}
}
const pkgPath = join(dirname(binPath), '..', 'package.json');
/*
* Generally, pkgPath looks like:
* "/Users/username/.config/yarn/global/node_modules/vercel/package.json"
* "/usr/local/share/.config/yarn/global/node_modules/vercel/package.json"
*/
return pkgPath.includes(join('yarn', 'global'));
}
async function getConfigPrefix() {
const paths = [
process.env.npm_config_userconfig || process.env.NPM_CONFIG_USERCONFIG,
@@ -76,6 +53,10 @@ async function isGlobal() {
return true;
}
if (installPath.includes(['', 'pnpm', 'global', ''].join(sep))) {
return true;
}
if (installPath.includes(['', 'fnm', 'node-versions', ''].join(sep))) {
return true;
}
@@ -99,16 +80,26 @@ async function isGlobal() {
}
export default async function getUpdateCommand(): Promise<string> {
const tag = isCanary() ? 'canary' : 'latest';
const pkgAndVersion = `${getPkgName()}@${tag}`;
const pkgAndVersion = `${getPkgName()}@latest`;
const entrypoint = await realpath(process.argv[1]);
let { cliType, lockfilePath } = await scanParentDirs(
dirname(dirname(entrypoint))
);
if (!lockfilePath) {
// Global installs for npm do not have a lockfile
cliType = 'npm';
}
const yarn = cliType === 'yarn';
let install = yarn ? 'add' : 'i';
if (await isGlobal()) {
return (await isYarn())
? `yarn global add ${pkgAndVersion}`
: `npm i -g ${pkgAndVersion}`;
if (yarn) {
install = 'global add';
} else {
install = 'i -g';
}
}
return (await isYarn())
? `yarn add ${pkgAndVersion}`
: `npm i ${pkgAndVersion}`;
return `${cliType} ${install} ${pkgAndVersion}`;
}

View File

@@ -1,5 +1,5 @@
import Client from './client';
import { User } from '@vercel-internals/types';
import type { User } from '@vercel-internals/types';
import { APIError, InvalidToken, MissingUser } from './errors-ts';
export default async function getUser(client: Client) {

View File

@@ -1,10 +1,11 @@
import { URL } from 'url';
import Client from '../client';
import { Org } from '@vercel-internals/types';
import chalk from 'chalk';
import link from '../output/link';
import { isAPIError } from '../errors-ts';
import { Output } from '../output';
import { Dictionary } from '@vercel/client';
import type { Org } from '@vercel-internals/types';
export interface RepoInfo {
url: string;
@@ -86,40 +87,39 @@ export function formatProvider(type: string): string {
}
}
export function parseRepoUrl(originUrl: string): RepoInfo | null {
const isSSH = originUrl.startsWith('git@');
// Matches all characters between (// or @) and (.com or .org)
// eslint-disable-next-line prefer-named-capture-group
const provider =
/(?<=(\/\/|@)).*(?=(\.com|\.org))/.exec(originUrl)?.[0] ||
originUrl.replace('www.', '').split('.')[0];
if (!provider) {
return null;
function getURL(input: string) {
let url: URL | null = null;
try {
url = new URL(input);
} catch {}
if (!url) {
// Probably an SSH url, so mangle it into a
// format that the URL constructor works with.
try {
url = new URL(`ssh://${input.replace(':', '/')}`);
} catch {}
}
let org;
let repo;
if (isSSH) {
org = originUrl.split(':')[1].split('/')[0];
repo = originUrl.split('/')[1]?.replace('.git', '');
} else {
// Assume https:// or git://
org = originUrl.replace('//', '').split('/')[1];
repo = originUrl.replace('//', '').split('/')[2]?.replace('.git', '');
}
if (!org || !repo) {
return null;
}
return {
url: originUrl,
provider,
org,
repo,
};
return url;
}
export function parseRepoUrl(originUrl: string): RepoInfo | null {
const url = getURL(originUrl);
if (!url) return null;
const hostParts = url.hostname.split('.');
if (hostParts.length < 2) return null;
const provider = hostParts[hostParts.length - 2];
const pathParts = url.pathname.split('/').filter(Boolean);
if (pathParts.length !== 2) return null;
const org = pathParts[0];
const repo = pathParts[1].replace(/\.git$/, '');
return { url: originUrl, provider, org, repo };
}
export function printRemoteUrls(
output: Output,
remoteUrls: Dictionary<string>

View File

@@ -36,7 +36,7 @@ export interface CreateOptions {
project?: string;
wantsPublic: boolean;
prebuilt?: boolean;
rootDirectory?: string;
rootDirectory?: string | null;
meta: Dictionary<string>;
gitMetadata?: GitMetadata;
regions?: string[];
@@ -49,6 +49,7 @@ export interface CreateOptions {
deployStamp: () => string;
projectSettings?: any;
skipAutoDetectionConfirmation?: boolean;
noWait?: boolean;
}
export interface RemoveOptions {
@@ -128,6 +129,7 @@ export default class Now extends EventEmitter {
deployStamp,
projectSettings,
skipAutoDetectionConfirmation,
noWait,
}: CreateOptions,
org: Org,
isSettingUpProject: boolean,
@@ -174,6 +176,7 @@ export default class Now extends EventEmitter {
cwd,
prebuilt,
rootDirectory,
noWait,
});
if (deployment && deployment.warnings) {

View File

@@ -4,7 +4,7 @@ import chalk from 'chalk';
import frameworkList, { Framework } from '@vercel/frameworks';
import Client from '../client';
import { isSettingValue } from '../is-setting-value';
import { ProjectSettings } from '@vercel-internals/types';
import type { ProjectSettings } from '@vercel-internals/types';
const settingMap = {
buildCommand: 'Build Command',

View File

@@ -1,5 +0,0 @@
import pkg from '../../package.json';
export function isCanary() {
return pkg.version.includes('canary');
}

View File

@@ -12,9 +12,10 @@ export const parseEnv = (env?: string | string[] | Dictionary<string>) => {
}
if (Array.isArray(env)) {
const startingDict: Dictionary<string> = {};
return env.reduce((o, e) => {
let key;
let value;
let key: string | undefined;
let value: string | undefined;
const equalsSign = e.indexOf('=');
if (equalsSign === -1) {
@@ -24,9 +25,12 @@ export const parseEnv = (env?: string | string[] | Dictionary<string>) => {
value = e.slice(equalsSign + 1);
}
o[key] = value;
if (typeof value !== 'undefined') {
o[key] = value;
}
return o;
}, {} as Dictionary<string | undefined>);
}, startingDict);
}
// assume it's already an Object

View File

@@ -1,6 +1,6 @@
import chalk from 'chalk';
import Client from '../client';
import { ProjectAliasTarget } from '@vercel-internals/types';
import type { ProjectAliasTarget } from '@vercel-internals/types';
import { isAPIError } from '../errors-ts';
export async function addDomainToProject(

View File

@@ -1,5 +1,5 @@
import Client from '../client';
import { Project } from '@vercel-internals/types';
import type { Project } from '@vercel-internals/types';
export default async function createProject(
client: Client,

View File

@@ -1,5 +1,5 @@
import Client from '../client';
import { Project } from '@vercel-internals/types';
import type { Project } from '@vercel-internals/types';
import { URLSearchParams } from 'url';
import { isAPIError } from '../errors-ts';

View File

@@ -1,5 +1,5 @@
import Client from '../client';
import { Project } from '@vercel-internals/types';
import type { Project } from '@vercel-internals/types';
import { isAPIError, ProjectNotFound } from '../errors-ts';
export default async function getProjectByNameOrId(

View File

@@ -12,7 +12,7 @@ import { InvalidToken, isAPIError, ProjectNotFound } from '../errors-ts';
import getUser from '../get-user';
import getTeamById from '../teams/get-team-by-id';
import { Output } from '../output';
import {
import type {
Project,
ProjectLinkResult,
Org,

View File

@@ -1,6 +1,6 @@
import chalk from 'chalk';
import Client from '../client';
import { ProjectAliasTarget } from '@vercel-internals/types';
import type { ProjectAliasTarget } from '@vercel-internals/types';
import { isAPIError } from '../errors-ts';
export async function removeDomainFromProject(

View File

@@ -1,4 +1,4 @@
import { Team } from '@vercel-internals/types';
import type { Team } from '@vercel-internals/types';
import Client from '../client';
export default async function createTeam(

View File

@@ -1,5 +1,5 @@
import Client from '../client';
import { Team } from '@vercel-internals/types';
import type { Team } from '@vercel-internals/types';
const teamCache = new Map<string, Team>();

View File

@@ -1,6 +1,6 @@
import { URLSearchParams } from 'url';
import Client from '../client';
import { Team } from '@vercel-internals/types';
import type { Team } from '@vercel-internals/types';
import { APIError, InvalidToken } from '../errors-ts';
export interface GetTeamsV1Options {

View File

@@ -1,4 +1,4 @@
import { Team } from '@vercel-internals/types';
import type { Team } from '@vercel-internals/types';
import Client from '../client';
export default async function patchTeam(

View File

@@ -1,7 +1,7 @@
{
"version": 2,
"builds": [
{ "src": "entrypoint**", "use": "@vercel/node@canary" },
{ "src": "type-module-package-json/**/*.js", "use": "@vercel/node@canary" }
{ "src": "entrypoint**", "use": "@vercel/node" },
{ "src": "type-module-package-json/**/*.js", "use": "@vercel/node" }
]
}

View File

@@ -0,0 +1,3 @@
module go-work-with-shared/api
go 1.20

View File

@@ -0,0 +1,12 @@
package handler
import (
"fmt"
"net/http"
"go-work-with-shared/mylib"
)
// Handler function
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, mylib.Say("hello"))
}

View File

@@ -0,0 +1,6 @@
go 1.20
use (
./api/
./mylib/
)

View File

@@ -0,0 +1,3 @@
module go-work-with-shared/mylib
go 1.20

Some files were not shown because too many files have changed in this diff Show More