mirror of
https://github.com/cypress-io/cypress.git
synced 2026-01-05 14:09:46 -06:00
Merge pull request #19285 from cypress-io/elevatebart/chore/merge-develop
This commit is contained in:
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
* text=auto
|
||||
|
||||
*.json text eol=lf
|
||||
@@ -649,7 +649,7 @@ Below are some guidelines Cypress uses when reviewing dependency updates.
|
||||
|
||||
## Deployment
|
||||
|
||||
We will try to review and merge pull requests quickly. If you want to know our build process or build your own Cypress binary, read [DEPLOY.md](./DEPLOY.md).
|
||||
We will try to review and merge pull requests quickly. If you want to know our build process or build your own Cypress binary, read [the "Release Process" guide](./guides/release-process.md).
|
||||
|
||||
Independent packages are deployed immediately upon being merged into master. You can read more [above](#independent-packages-ci-workflow).
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
exports['list of all projects'] = [
|
||||
{
|
||||
"repo": "cypress-io/cypress-test-tiny",
|
||||
"provider": "appVeyor",
|
||||
"provider": "circle",
|
||||
"platform": "win32"
|
||||
},
|
||||
{
|
||||
"repo": "cypress-io/cypress-test-example-repos",
|
||||
"provider": "appVeyor",
|
||||
"provider": "circle",
|
||||
"platform": "win32"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -27,7 +27,6 @@ exports['packages can copy files from package.json 1'] = {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
exports['transformRequires can find and replace symlink requires 1'] = {
|
||||
"[cwd]": {
|
||||
"build": {
|
||||
|
||||
105
appveyor.yml
105
appveyor.yml
@@ -1,105 +0,0 @@
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- windows-code-signing
|
||||
- 10.0-release
|
||||
- /win*/
|
||||
|
||||
# https://www.appveyor.com/docs/lang/nodejs-iojs/
|
||||
environment:
|
||||
# use matching version of Node.js
|
||||
nodejs_version: "16.5.0"
|
||||
# encode secure variables which will NOT be used
|
||||
# in pull requests
|
||||
# https://www.appveyor.com/docs/build-configuration/#secure-variables
|
||||
# the variables can be encrypted at
|
||||
# https://ci.appveyor.com/tools/encrypt
|
||||
ci_json:
|
||||
secure: uOM7Bj+6MfQA/wiUzA4MolZDlcdhIqrOWLN0LdR+Lg4olc1onF3IpWfRf+3B6Q5uT98OTnIU71OOqSRY7inGQg==
|
||||
# for uploading built binary to S3 bucket
|
||||
aws_credentials_json:
|
||||
secure: ttGzd2/rW+i8H+pozcFxzZKU07B5INL8+LjD4vCOKes+tI6EaKhrLvAQ9xT7r+e1p8My8f4LrqvT+i37kbRCUPY4DHmUgagj3aj0OghsT0eX/Vr/6T4v1yndB7SX7FnG07eVcGb63r9f5kT7xu7ElJ9WXh1Ok5K69W0zDPsa1RGCCYqsTi4tH2h5EAZwjY1b
|
||||
# CDN control
|
||||
CF_TOKEN:
|
||||
secure: nVGxcWxXGvrT621HmgMf9Mwm84dqo+cKHZj94OvyyWEGIZOJJkbWHsD/l2/r4a6Y
|
||||
CF_ZONEID:
|
||||
secure: SrZnd4BYW9PILEEi7y9VyXuC16C+qMEDT3QuV1PZZJa47TRkjcaYpAXhAHz0j0jT
|
||||
# authenticate as Cypress bot when posting commit status checks
|
||||
GH_APP_ID:
|
||||
secure: oR0RVDbv6GKej4wwjkz7Zw==
|
||||
GH_INSTALLATION_ID:
|
||||
secure: tAoqu4zIgZUxOfW0u9YQgw==
|
||||
GH_PRIVATE_KEY:
|
||||
secure: msLmlIBnkNovqrqTeCqa7ZPjETyS8Xn4JLuiRMWYK7gZBTO66pNnFaoeqwPFwH+ooO0cDFhAOPTToLisgTLXCo4hnw38zuBuKq+ywCh5mtk5uZn4x4F8G2XyRLD/ViZm+VuD2yZzaTWF11upDqC4xbXDe32yD6OSLKhA5ms5F5ke83zEuWSLTqVVCIpVH12rVTJHl3QHaWPwZbBBE3SFN8D6uiclvI06y3pEg2bVShU8YqlwearYTRuErsYXNCUmT0SrDd2kHznlYf08edQDHpydnQvvTViZMgomvYp5wDCXFD+/FxtTMuTptJFpspirXL8w/xjYy1/JaTd/K01oUUD2Xwl/v0cS28OpdcraETyrQxQhEgTCXfg9ONbZ5mRvQlkaRROaTqDSGMmEPs4N91zarpA7RLxu7PPvxXQcbDW4GiJvH5BhVWu8lY/QBZsr8It1dhLYSzTPNIh9ey8xNaUbZ3oQhPBoreRi36B+FSPBsrZpB8Q8aa97gd+lCa8br2RfaEpzx8gA0pSK44odqcGuJe7T8MHOqYo0cUEUb2UypPPG7mWyjGip+x3Z9P/vSrZzDV+YFFvEzQAMoyRMp/456V+YL8iduryMRIadkJcB4ZVZz2hsxY5Gv6Eeh9NhwzyM64Rz5NP5fJ9Kw8E5Vm+ddEmft8Ec6dajcURoVN0i+s8t7h/e3Hzrr62UjWr0FpUx5fPBC/Tldn3+h4Rr9/HFI2RCZAI5wHOrx/aQ/HknA9UCEdqdod8ix5yAdSpTxp3aCGEoS97STXU43CjLEiQFyLaReoHOOwFp5EqaAiAqiORJaKuShWoir+OqSk7rucU7kFvIlU9GDfLuKUpxcQoDq/8fKT3lcG3Pr4MVV79BJ6EcjcsEf4ukQ3IfwMY+2RbwYWEowsQP18k4HztZpMEOuYPlSCiAPL7Cz4dcE5oybSURr9QQbSqVMoiCKZBn344KxpvH59KW90wt8CYyoeLSlPpM9s73g9My4fwbB3W9lcbw/AteRGer01VYEHY+1MyQwhqgHoXQ//op4gztFbpSLcli88v1IOopcr0Dw5NrylcjCTKuVWmQs0uIAfOr7zxqCZ8DCXG6spdipjF1jx+bxp318ZgH56pmmTOTMbj5Cmdpr3KlCFbYB4JI7lexnZmti1NcHtOglDSq+XT4092myAiarSzQLA6smB+gk68M50W492+QNuc+6LAOfev+Da4geLiErqMpuIqfA3jw4h5+9Ns6mf3JnOLZd1c/X/xvnV3JjBzSJ6f9xGMLBcMTQm/wVfkHM9tO1oZrHswDiBlE1AkQrj6kqT9Kznu/rbAUGRnWL65FoCwdMbYVEhQQvLbLvVCRGBJfB01oD2xs80jyZ2YYZFRZCl/d0lGrVVVZsq6XM7CsxR5WlpJy5JLxCQ4kliG8cjexh0GkVYJoRYneJifw8yThMlyAnMQ88iNS2p2MnYk0WZgTJOIHliIhPRFY4z6BtrxmL8SR1no1vhaQCdbE5RI/rYbk8NpOmQunkjcDwp7nTKn1d8bMTfKGUH+DzhvmqwxA5PW37P84FFSK+3ePY9+oKXcInkAaxiXUpzcZJ4KzUGEZaZCB6irU+sxs6QLDzsq05PprwVz2DGtEn1TcY8qQ6ezeMGxJMRgDvEGq2J0nEgOEZ98CJ7XiPJRlnvUjGUzBlcjnbfFH8zzl/0p189YtENhE6Fyr5bD9MAI6NpVHjLLlg3yjmQ6X95fUtiNCmSpCUveEqIQCRtHCY2E/RrulGqTWE+vCvbM6IJV3WnatPOtWZfXEntWHmS08j6aUkUDM9TodBuzG8TRhW2Kgv8b4pfoejuMa4WkvwRAUU7V+clTWG26dT9UHdk+QuOIQDUiCewWk3PmpIJI4WdcxpBWwDvIgojob7uaGzhkabFKi77RJRc5/Ulxm6yM2MX79jgJxrQprWxxkjlsQnJk186nQZQqpuwziH/ZxV82n1bmI9zCqMXgE1Yr86gvyZpk2UbWhlFdtXEPapge9Cfo/fWUBCIbVcd77Bk98E88Y5Y372YWW+D8oHZed8l+0tCeyZmoHQNCYykcf6w77C+8C+bVdJplPns96vyLgbWIr0cpqZBK4qmkAxHuKZoG0AKRw4U379lnXOsI+02TaTzGOMlFTg4ME5miCbxo/2pUnjrydyTE5evdImLzKAK50Fhy1XASaPxgLrkjhGZebwf1UD2kYg6A1NCHchQId25vSEwGRkMPWvY3a5KOmgsMmRoOUJ17uo/r57p7nLgZV9c1+YEdZxu+GmgwQDLNGpgW1cpEN6GSVpx8xhaGKeYSuqd4lh6H9U5/P8masNckrsz+EHv+w5plzx8nJ/Fx/H50OdOm1KUjo66m26aITX7EjJB/U1qtqNfiK6dt8EttJ5iRXlCbfOkj2biRYeKbXQ2Ezr+61/Mu/W/nhLqmLFDtM6K3xf2bSJnEXQFZOOXTRkKXnRDP7Y47ZgG3563fJQjSfoU4Hsw5xnegTOKlJsoEm95Rnq0esdMTA450Ki2wBOeIsOycljoApACBYLAlSe+ewxEaOjrLtnIR0LfzcKXlCRYbM31YWOCtMhMRehJbX9qWGNPTQHmjabYz7/IhLKtJuaMIpj3pfYgS/oQQ36g6ItCo7vLQAq+rgU99IUyQROOGXMUgK/8umL71oijA9dht0LmH9E7EGwih0WuLO2SndovTJODDfK9YrRTEocbo3B9S05O4fpGoQ32TK99mXjoQdlyxd/dn9Q9uDD27u/fGgUoYdt9VzAIigbRIQuRx430n33V0ZyXv90QuD4ESOLxVI1vnLj6JKAS4PGRz66rouYG6U+1syDWpf5Y6DzC/2KOfdLPwmuwjMQxuhf+6+tGeJbeotNX/eJF0LkRfyieRwEGKxIo0PaxdmVwsF7vKR6ZnOpr5BuLm/+44Rg3bQdJ4bcRW6i6dIhOyHWniLvsAPLu1NZDVN6jA13KTChhcrNnSGddjRFLekawl80E3KhG1p+KvItIZX3kzG4QjJ
|
||||
CSC_KEY_PASSWORD:
|
||||
secure: GiXelhGGKXKUNW6T7ptKUw==
|
||||
CSC_LINK:
|
||||
secure: 9uSZwUYwcdZejLTpGpySd6t9JSL1Hw3iTvb4T2HZrx6iKd5DSR7AN6A7lS5ThTZ6g1JNSypSHRwDeC1Z5xkP8QEIjDqKjyNrqC19gCiSMrpdjjIR8Y8upIISrDBWjOiI
|
||||
|
||||
platform:
|
||||
- x64
|
||||
|
||||
# https://www.appveyor.com/docs/build-cache/
|
||||
# hmm, seems there is NPM on windows problem
|
||||
# with installing over cached folder
|
||||
# https://github.com/npm/npm/issues/17747
|
||||
# cache:
|
||||
# - node_modules -> yarn.lock
|
||||
# - '%LOCALAPPDATA%/Yarn -> yarn.lock'
|
||||
# # todo: cache node_modules in each package
|
||||
|
||||
# Install scripts. (runs after repo cloning)
|
||||
install:
|
||||
# it is not a given that AppVeyor has the exact version of Node we need predownloaded
|
||||
# see https://www.appveyor.com/docs/lang/nodejs-iojs/#installing-any-version-of-nodejs-or-iojs
|
||||
- ps: Update-NodeJsInstallation $env:nodejs_version $env:platform
|
||||
# - ps: Install-Product node $env:nodejs_version $env:platform
|
||||
# upgrade npm
|
||||
- yarn global add @bahmutov/print-env@1
|
||||
# Output useful info for debugging.
|
||||
- node --version
|
||||
- node --print process.arch
|
||||
- yarn --version
|
||||
# prints all public variables relevant to the build
|
||||
- print-env Platform
|
||||
- yarn check-node-version
|
||||
- print-env APPVEYOR
|
||||
# prints if we have sensitive variables that start with a prefix GH
|
||||
# which are used to trigger other projects
|
||||
# ignore errors - forked pull requests will NOT have these variables set
|
||||
- has-env GH || true
|
||||
# clean cache to prevent install permission issues
|
||||
- yarn cache clean
|
||||
- yarn --frozen-lockfile || yarn --frozen-lockfile || yarn --frozen-lockfile
|
||||
- yarn build-prod
|
||||
- .\node_modules\.bin\print-arch
|
||||
|
||||
# Post-install test scripts.
|
||||
test_script:
|
||||
# Output useful info for debugging.
|
||||
# beware of echo-ing environment variables that may have batch syntax (e.g. commit messages)
|
||||
- node --version
|
||||
- yarn --version
|
||||
- 7z
|
||||
- echo *** System info ***
|
||||
- node cli/bin/cypress info --dev
|
||||
|
||||
# make sure mocha runs
|
||||
- yarn test-mocha
|
||||
# make sure our snapshots are compared correctly
|
||||
# - npm run test-mocha-snapshot
|
||||
# the other larger tests
|
||||
- echo *** Building Windows NPM package ***
|
||||
- yarn get-next-version --npm
|
||||
- cd cli
|
||||
- yarn
|
||||
- yarn build
|
||||
- cd build
|
||||
- yarn pack
|
||||
- cd ../..
|
||||
|
||||
- node ./scripts/win-appveyor-build.js
|
||||
|
||||
# Don't actually build.
|
||||
build: off
|
||||
539
circle.yml
539
circle.yml
File diff suppressed because it is too large
Load Diff
13
cli/types/cypress.d.ts
vendored
13
cli/types/cypress.d.ts
vendored
@@ -2209,12 +2209,9 @@ declare namespace Cypress {
|
||||
* @see https://on.cypress.io/writefile
|
||||
```
|
||||
cy.writeFile('path/to/message.txt', 'Hello World')
|
||||
.then((text) => {
|
||||
expect(text).to.equal('Hello World') // true
|
||||
})
|
||||
```
|
||||
*/
|
||||
writeFile<C extends FileContents>(filePath: string, contents: C, encoding: Encodings): Chainable<C>
|
||||
writeFile(filePath: string, contents: FileContents, encoding: Encodings): Chainable<null>
|
||||
/**
|
||||
* Write to a file with the specified encoding and contents.
|
||||
*
|
||||
@@ -2223,12 +2220,10 @@ declare namespace Cypress {
|
||||
cy.writeFile('path/to/ascii.txt', 'Hello World', {
|
||||
flag: 'a+',
|
||||
encoding: 'ascii'
|
||||
}).then((text) => {
|
||||
expect(text).to.equal('Hello World') // true
|
||||
})
|
||||
```
|
||||
*/
|
||||
writeFile<C extends FileContents>(filePath: string, contents: C, options?: Partial<WriteFileOptions>): Chainable<C>
|
||||
writeFile(filePath: string, contents: FileContents, options?: Partial<WriteFileOptions & Timeoutable>): Chainable<null>
|
||||
/**
|
||||
* Write to a file with the specified encoding and contents.
|
||||
*
|
||||
@@ -2238,12 +2233,10 @@ declare namespace Cypress {
|
||||
```
|
||||
cy.writeFile('path/to/ascii.txt', 'Hello World', 'utf8', {
|
||||
flag: 'a+',
|
||||
}).then((text) => {
|
||||
expect(text).to.equal('Hello World') // true
|
||||
})
|
||||
```
|
||||
*/
|
||||
writeFile<C extends FileContents>(filePath: string, contents: C, encoding: Encodings, options?: Partial<WriteFileOptions>): Chainable<C>
|
||||
writeFile(filePath: string, contents: FileContents, encoding: Encodings, options?: Partial<WriteFileOptions & Timeoutable>): Chainable<null>
|
||||
|
||||
/**
|
||||
* jQuery library bound to the AUT
|
||||
|
||||
17
guides/README.md
Normal file
17
guides/README.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# Guides
|
||||
|
||||
The `guides` directory contains information about specific things encountered *when contributing to the Cypress project* that fall outside the scope of `CONTRIBUTING.md`, which is more geared towards everyday development in this repo.
|
||||
|
||||
For information about using Cypress for testing web applications, visit [`docs.cypress.io`](https://docs.cypress.io).
|
||||
|
||||
For information related to a specific package in the monorepo, see that package's respective `README.md`.
|
||||
|
||||
For general contributor information, check out [`CONTRIBUTING.md`](../CONTRIBUTING.md).
|
||||
|
||||
## Table of Contents
|
||||
|
||||
* [Building release artifacts](./building-release-artifacts.md)
|
||||
* [Code signing](./code-signing.md)
|
||||
* [Determining the next version of Cypress to be released](./next-version.md)
|
||||
* [Release process](./release-process.md)
|
||||
* [Testing other projects](./testing-other-projects.md)
|
||||
38
guides/building-release-artifacts.md
Normal file
38
guides/building-release-artifacts.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# Building Release Artifacts
|
||||
|
||||
The `cypress` NPM package consists of two main parts:
|
||||
|
||||
1. The `cypress` NPM package `.tgz` (built from [`cli`](../cli))
|
||||
* Contains the command line tool `cypress`, type definitions, and the [Module API](https://on.cypress.io/module-api).
|
||||
* End users install this via NPM to the project's `node_modules`.
|
||||
2. The "binary" `.zip` (built from [`packages/server`](../packages/server))
|
||||
* Contains the Electron app, `ffmpeg`, and built versions of the [`server`](../packages/server), [`desktop-gui`](../packages/desktop-gui), [`runner`](../packages/runner), [`example` project](../packages/example), and [`extension`](../packages/extension)
|
||||
* Also contains all the production dependencies of the above.
|
||||
* This is installed when the `cli` is installed or when `cypress install` is run, to a system cache.
|
||||
|
||||
This guide has instructions for building both.
|
||||
|
||||
## Building the npm package
|
||||
|
||||
> :warning: Note: The steps in this section are automated in CI, and you should not need to do them yourself when going through the [release process](./release-process.md).
|
||||
|
||||
Building a new npm package is two commands:
|
||||
|
||||
1. Increment the version in the root `package.json`
|
||||
2. `yarn build --scope cypress`
|
||||
|
||||
The steps above:
|
||||
|
||||
- Build the `cypress` npm package
|
||||
- Transpile the code into ES5 to be compatible with the common Node versions
|
||||
- Put the result into the [`cli/build`](../cli/build) folder.
|
||||
|
||||
## Building the binary
|
||||
|
||||
> :warning: Note: The steps in this section are automated in CI, and you should not need to do them yourself when going through the [release process](./release-process.md).
|
||||
|
||||
The npm package requires a corresponding binary of the same version. In production, it will try to retrieve the binary from the Cypress CDN if it is not cached locally.
|
||||
|
||||
You can build the Cypress binary locally by running `yarn binary-build`. You can use Linux to build the Cypress binary (just like it is in CI) by running `yarn binary-build` inside of `yarn docker`.
|
||||
|
||||
`yarn binary-zip` can be used to zip the built binary together.
|
||||
23
guides/code-signing.md
Normal file
23
guides/code-signing.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# Code Signing
|
||||
|
||||
Code signing is done for the Windows and Mac distributions of Cypress when they are built in CI.
|
||||
|
||||
`electron-builder` handles code signing during the `create-build-artifacts` jobs. This guide assumes that the reader is already familiar with [`electron-builder`'s Code Signing documentation](https://www.electron.build/code-signing).
|
||||
|
||||
## Installing a new Mac code signing key
|
||||
|
||||
Follow the directions supplied by `electron-builder`: https://www.electron.build/code-signing#travis-appveyor-and-other-ci-servers
|
||||
|
||||
Set the environment variables `CSC_LINK` and `CSC_KEY_PASSWORD` in the `test-runner:sign-mac-binary` CircleCI context.
|
||||
|
||||
## Installing a new Windows code signing key
|
||||
|
||||
1. Obtain the private key and full certificate chain in ASCII-armored PEM format and store each in a file (`-----BEGIN PRIVATE KEY-----`, `-----BEGIN CERTIFICATE-----`)
|
||||
2. Using `openssl`, convert the plaintext PEM public and private key to binary PKCS#12/PFX format and encrypt it with a real strong password.
|
||||
```shell
|
||||
➜ openssl pkcs12 -export -inkey key.pem -in cert.pem -out encrypted.pfx
|
||||
Enter Export Password: <password>
|
||||
Verifying - Enter Export Password: <password>
|
||||
```
|
||||
3. Upload the `encrypted.pfx` file to the Cypress App Google Drive and obtain a [direct download link](http://www.syncwithtech.org/p/direct-download-link-generator.html).
|
||||
4. Within the `test-runner:sign-windows-binary` CircleCI context, set `CSC_LINK` to that URL and `CSC_KEY_PASSWORD` to the password.
|
||||
18
guides/next-version.md
Normal file
18
guides/next-version.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Next Version
|
||||
|
||||
When the Cypress CLI and binary are built in CI, the version number they share is determined by the script in [`/scripts/get-next-version.js`](../scripts/get-next-version.js).
|
||||
|
||||
In most cases, the script will correctly determine the next version. If it needs to be overridden, the environment variable `NEXT_VERSION` can be set to the desired version (`NEXT_VERSION=1.2.3`). This is commonly desired on a release branch or when trying to force a specific major version.
|
||||
|
||||
The `get-next-version.js` script follows these steps:
|
||||
|
||||
1. If the environment variable `NEXT_VERSION` exists, print `NEXT_VERSION` and exit.
|
||||
2. Otherwise, analyze the commits to the current branch since the last release, using semantic commit messages. Print out the calculated version.
|
||||
* Only commits that touch files in `packages/*` or `cli/*` are considered.
|
||||
* This is done so that commits to the `npm/` packages do not necessarily bump the CLI and binary versions.
|
||||
* This project uses the [`angular` commit message style](https://gist.github.com/brianclements/841ea7bffdb01346392c/8e1f9b44d3fc7a4f2b448581071f9805f759c912).
|
||||
* The prefix `fix:` will trigger a patch version bump.
|
||||
* The prefix `feat:` will trigger a minor version bump.
|
||||
* A commit with the footer containing `BREAKING CHANGE:` should trigger a major version bump.
|
||||
|
||||
You can debug the script locally by running it using `node ./scripts/get-next-version.js`. It will analyze the commits on your current branch and print out the calculated version number.
|
||||
@@ -1,40 +1,10 @@
|
||||
# Deployment
|
||||
# Release Process
|
||||
|
||||
These deployment procedures mainly concern the Cypress binary and `cypress` npm module.
|
||||
These procedures concern the release process for the Cypress binary and `cypress` npm module.
|
||||
|
||||
Independent `@cypress/` packages that live inside the [`npm`](./npm) directory are automatically published to npm (with [`semantic-release`](https://semantic-release.gitbook.io/semantic-release/)) upon being merged into master. You can read more about this in [CONTRIBUTING.md](./CONTRIBUTING.md#committing-code)
|
||||
The `@cypress/`-namespaced NPM packages that live inside the [`/npm`](../npm) directory are automatically published to npm (with [`semantic-release`](https://semantic-release.gitbook.io/semantic-release/)) upon being merged into `master`. You can read more about this in [CONTRIBUTING.md](../CONTRIBUTING.md#independent-packages-ci-workflow).
|
||||
|
||||
Anyone can build the binary and npm package, but you can only deploy the Cypress application and publish the npm module `cypress` if you are a member of the `cypress` npm organization.
|
||||
|
||||
> :information_source: See the [publishing](#publishing) section for how to build, test and publish a
|
||||
new official version of the binary and `cypress` npm package.
|
||||
|
||||
## Building Locally
|
||||
|
||||
### Building the npm package
|
||||
|
||||
> :warning: Note: The steps in this section are automated in CI, and you should not need to do them yourself when publishing.
|
||||
|
||||
Building a new npm package is very quick.
|
||||
|
||||
- Increment the version in the root `package.json`
|
||||
- `yarn build --scope cypress`
|
||||
|
||||
The steps above:
|
||||
|
||||
- Build the `cypress` npm package
|
||||
- Transpile the code into ES5 to be compatible with the common Node versions
|
||||
- Put the result into the [`cli/build`](./cli/build) folder.
|
||||
|
||||
### Building the binary
|
||||
|
||||
> :warning: Note: The steps in this section are automated in CI, and you should not need to do them yourself when publishing.
|
||||
|
||||
The npm package requires a corresponding binary of the same version. In production, it will try to retrieve the binary from the Cypress CDN if it is not cached locally.
|
||||
|
||||
You can build the Cypress binary locally by running `yarn binary-build`. You can use Linux to build the Cypress binary (just like it is in CI) by running `yarn binary-build` inside of `yarn docker`.
|
||||
|
||||
`yarn binary-zip` can be used to zip the built binary together.
|
||||
[Anyone can build the binary and npm package locally](./building-release-artifacts.md), but you can only deploy the Cypress application and publish the npm module `cypress` if you are a member of the `cypress` npm organization.
|
||||
|
||||
## Publishing
|
||||
|
||||
@@ -50,10 +20,9 @@ You can build the Cypress binary locally by running `yarn binary-build`. You can
|
||||
```text
|
||||
aws_credentials_json={"bucket":"cdn.cypress.io","folder":"desktop","key":"...","secret":"..."}
|
||||
```
|
||||
- A [GitHub token](https://github.com/settings/tokens), a [CircleCI token](https://circleci.com/account/api),
|
||||
and a `cypress-io` account-specific [AppVeyor token](https://ci.appveyor.com/api-keys) in `ci_json`:
|
||||
- A [GitHub token](https://github.com/settings/tokens) and a [CircleCI token](https://circleci.com/account/api) in `ci_json`:
|
||||
```text
|
||||
ci_json={"githubToken":"...","circleToken":"...","appVeyorToken":"..."}
|
||||
ci_json={"githubToken":"...","circleToken":"..."}
|
||||
```
|
||||
- You'll also need to put the GitHub token under its own variable and get a [ZenHub API token](https://app.zenhub.com/dashboard/tokens) for the `release-automations` step.
|
||||
```text
|
||||
@@ -61,6 +30,11 @@ You can build the Cypress binary locally by running `yarn binary-build`. You can
|
||||
ZENHUB_API_TOKEN="..."
|
||||
```
|
||||
- The `cypress-bot` GitHub app credentials are also needed. Ask another team member who has done a deploy for those.
|
||||
```text
|
||||
GITHUB_APP_CYPRESS_INSTALLATION_ID=
|
||||
GITHUB_APP_ID=
|
||||
GITHUB_PRIVATE_KEY=
|
||||
```
|
||||
- For purging the Cloudflare cache (part of the `move-binaries` step), you'll need `CF_ZONEID` and `CF_TOKEN` set. These can be found in 1Password. If you don't have access, ask a team member who has done a deploy.
|
||||
```text
|
||||
CF_ZONEID="..."
|
||||
@@ -70,16 +44,12 @@ You can build the Cypress binary locally by running `yarn binary-build`. You can
|
||||
|
||||
### Before Publishing a New Version
|
||||
|
||||
In order to publish a new `cypress` package to the npm registry, we must build and test it across multiple platforms and test projects. This makes publishing *directly* into the npm registry impossible. Instead, we have CI set up to do the following on every commit to `develop`:
|
||||
In order to publish a new version of the `cypress` package to the npm registry, CI must build and test it across multiple platforms and test projects. CI is set up to do the following on every commit to `develop`:
|
||||
|
||||
1. Build the npm package with the new target version baked in.
|
||||
2. Build the Linux/Mac binaries on CircleCI and build Windows on AppVeyor.
|
||||
3. Upload the binaries and the new npm package to `cdn.cypress.io` under the "beta" folder.
|
||||
4. Launch the test projects like [cypress-test-node-versions](https://github.com/cypress-io/cypress-test-node-versions) and [cypress-test-example-repos](https://github.com/cypress-io/cypress-test-example-repos) using the newly-uploaded package & binary instead of installing from the npm registry. That installation looks like this:
|
||||
```shell
|
||||
export CYPRESS_INSTALL_BINARY=https://cdn.../binary/<new version>/<commit hash>/cypress.zip
|
||||
npm i https://cdn.../npm/<new version>/<commit hash>/cypress.tgz
|
||||
```
|
||||
1. Build the npm package with the [next target version](./next-version.md) baked in.
|
||||
2. Build the Linux, Mac & Windows binaries on CircleCI.
|
||||
3. Upload the binaries and the new npm package to the AWS S3 Bucket `cdn.cypress.io` under the "beta" folder.
|
||||
4. [Launch test projects](./testing-other-projects.md) using the newly-uploaded package & binary instead of installing from the npm registry.
|
||||
|
||||
Multiple test projects are launched for each target operating system and the results are reported
|
||||
back to GitHub using status checks so that you can see if a change has broken real-world usage
|
||||
@@ -91,11 +61,11 @@ Once the `develop` branch for all test projects are reliably passing with the ne
|
||||
|
||||
### Steps to Publish a New Version
|
||||
|
||||
In the following instructions, "X.Y.Z" is used to denote the version of Cypress being published.
|
||||
In the following instructions, "X.Y.Z" is used to denote the [next version of Cypress being published](./next-version.md).
|
||||
|
||||
1. `develop` should contain all of the changes made in `master`. However, this occasionally may not be the case. Ensure that `master` does not have any additional commits that are not on `develop` and all auto-generated pull requests designed to merge master into develop have been successfully merged.
|
||||
|
||||
2. If there is a new [`cypress-example-kitchensink`](https://github.com/cypress-io/cypress-example-kitchensink/releases) version, update the corresponding dependency in [`packages/example`](./packages/example) to that new version.
|
||||
2. If there is a new [`cypress-example-kitchensink`](https://github.com/cypress-io/cypress-example-kitchensink/releases) version, update the corresponding dependency in [`packages/example`](../packages/example) to that new version.
|
||||
|
||||
3. Use the `move-binaries` script to move the binaries for `<commit sha>` from `beta` to the `desktop` folder for `<new target version>`. This also purges the cloudflare cache for this version.
|
||||
```shell
|
||||
@@ -110,7 +80,7 @@ In the following instructions, "X.Y.Z" is used to denote the version of Cypress
|
||||

|
||||
- Publish to the npm registry straight from the URL:
|
||||
```shell
|
||||
npm publish https://cdn.../npm/X.Y.Z/<long sha>/cypress.tgz --tag dev
|
||||
npm publish https://cdn.cypress.io/beta/npm/X.Y.Z/<long sha>/cypress.tgz --tag dev
|
||||
```
|
||||
|
||||
5. Double-check that the new version has been published under the `dev` tag using `npm info cypress` or [available-versions](https://github.com/bahmutov/available-versions). `latest` should still point to the previous version. Example output:
|
||||
@@ -157,7 +127,7 @@ In the following instructions, "X.Y.Z" is used to denote the version of Cypress
|
||||
|
||||
11. If needed, push out any updated changes to the links manifest to [`on.cypress.io`](https://github.com/cypress-io/cypress-services/tree/develop/packages/on).
|
||||
|
||||
12. If needed, deploy the updated [`cypress-example-kitchensink`][cypress-example-kitchensink] to `example.cypress.io` by following [these instructions under "Deployment"](./packages/example/README.md).
|
||||
12. If needed, deploy the updated [`cypress-example-kitchensink`][cypress-example-kitchensink] to `example.cypress.io` by following [these instructions under "Deployment"](../packages/example/README.md).
|
||||
|
||||
13. Update the releases in [ZenHub](https://app.zenhub.com/workspaces/test-runner-5c3ea3baeb1e75374f7b0708/reports/release):
|
||||
- Close the current release in ZenHub.
|
||||
46
guides/testing-other-projects.md
Normal file
46
guides/testing-other-projects.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Testing other projects
|
||||
|
||||
In `develop`, `master`, and any other branch configured in [`circle.yml`](../circle.yml), the Cypress binary and npm package are built and uploaded to `cdn.cypress.io`. Then, tests are run, using a variety of real-world example repositories.
|
||||
|
||||
Two main strategies are used to spawn these test projects:
|
||||
|
||||
1. Local CI
|
||||
2. Remote CI
|
||||
|
||||
## Local CI
|
||||
|
||||
A number of CI jobs in `circle.yml` clone test projects and run tests as part of `cypress-io/cypress`'s CI pipeline.
|
||||
|
||||
You can find a list of test projects that do this by searching for usage of the `test-binary-against-repo` step.
|
||||
|
||||
Similarly to "Remote CI" test projects, Local CI test projects will attempt to check out a branch that is named after the [next version](./next-version.md) (`X.Y.Z`) if one exists in the test project git repo.
|
||||
|
||||
One advantage to local CI is that it does not require creating commits to another repo.
|
||||
|
||||
## Remote CI
|
||||
|
||||
After the production binary and NPM package are build and uploaded in CI, [`/scripts/test-other-projects.js`](../scripts/test-other-projects.js) is run as part of the `test-other-projects` `circle.yml` step.
|
||||
|
||||
This script creates commits inside of several test projects (hence "Remote CI") in order to trigger a realistic, continous-integration test of Cypress.
|
||||
|
||||
For a list of the projects, see the definition of `_PROVIDERS` in [`/scripts/binary/bump.js`](../scripts/binary/bump.js).
|
||||
|
||||
For each project and operating system combo in `_PROVIDERS`, the script:
|
||||
|
||||
1. Creates a commit to the test project's GitHub repo using the API. [An example of such a commit.](https://github.com/cypress-io/cypress-test-tiny/commit/5b39f3f43f6b7598f0d57cffcba71a7048d1d809)
|
||||
* Note the commit is specifically for `linux`, and only the `linux-tests` job runs to completion.
|
||||
* If a branch exists that is named after the [next version](./next-version.md) (`X.Y.Z`), the commit will be made to that branch.
|
||||
* This is useful to test a release's breaking changes or new features against an example project without having to have the project's main branch in a broken state.
|
||||
* Otherwise, the default branch is used for the commit.
|
||||
2. Creates a status check in this GitHub repo (`cypress-io/cypress`) and marks it `pending`.
|
||||
3. Waits for the test project's CI workflow to finish running.
|
||||
* Each test project is configured to use [`@cypress/commit-message-install`](https://github.com/cypress-io/commit-message-install) to configure the exact test required via the information in the commit message.
|
||||
* Each test project is configured to update the `pending` CI job in `cypress-io/cypress` to a `success` when the CI workflow successfully finishes.
|
||||
|
||||
These tests add coverage to the Cypress code base by:
|
||||
|
||||
* Providing a super-close-to-real-world usage of Cypress (i.e. installing fresh from an NPM package and running in a bare repo using the repo's CI setup)
|
||||
* Testing in a variety of environments
|
||||
* Different Node.js versions
|
||||
* Different operating systems
|
||||
* A multitude of CI providers
|
||||
@@ -28,6 +28,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/schematics-cli": "^12.2.10",
|
||||
"@angular/cli": "^12",
|
||||
"@types/chai-enzyme": "0.6.7",
|
||||
"@types/mocha": "8.0.3",
|
||||
"@types/node": "^12.11.1",
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
"rollup-plugin-copy": "^3.4.0",
|
||||
"rollup-plugin-peer-deps-external": "2.2.4",
|
||||
"rollup-plugin-postcss": "^4.0.0",
|
||||
"sass": "1.32.8",
|
||||
"sass": "1.44.0",
|
||||
"sass-loader": "10.1.1",
|
||||
"style-loader": "^2.0.0",
|
||||
"svg-url-loader": "3.0.3",
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
* @return {String} - Updated string
|
||||
*/
|
||||
// Taken from https://gist.github.com/PuddingNL/51866d4b9f1151963fbd973bf1d66116
|
||||
@use "sass:math";
|
||||
|
||||
@function str-replace($string, $search, $replace: '') {
|
||||
$index: str-index($string, $search);
|
||||
|
||||
@@ -18,5 +20,5 @@
|
||||
}
|
||||
|
||||
@function change-rem-unit-to-em($number) {
|
||||
@return ($number / 1rem) + 0em;
|
||||
@return math.div($number, 1rem) + 0em;
|
||||
}
|
||||
@@ -1,50 +1,50 @@
|
||||
/// <reference types="cypress" />
|
||||
import { ErrorBoundary } from './error-boundary.jsx'
|
||||
import React from 'react'
|
||||
import { mount } from '@cypress/react'
|
||||
|
||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||
return false
|
||||
})
|
||||
|
||||
/* eslint-env mocha */
|
||||
describe('Error Boundary', () => {
|
||||
const errorMessage = 'I crashed!'
|
||||
const ChildWithoutError = () => <h1>Normal Child</h1>
|
||||
const ChildWithError = () => {
|
||||
throw new Error(errorMessage)
|
||||
}
|
||||
|
||||
it('renders normal children', () => {
|
||||
mount(
|
||||
<ErrorBoundary>
|
||||
<ChildWithoutError />
|
||||
</ErrorBoundary>,
|
||||
)
|
||||
|
||||
cy.get('h1').should('have.text', 'Normal Child')
|
||||
cy.get(ErrorBoundary)
|
||||
.its('state.error')
|
||||
.should('not.exist')
|
||||
})
|
||||
|
||||
it('on error, display fallback UI', () => {
|
||||
// Error boundaries do not stop an uncaught error from propagating.
|
||||
// Cypress will fail on uncaught exceptions by default, so we need to suppress that behavior.
|
||||
cy.on('uncaught:exception', (err) => {
|
||||
// Assert that we are only suppressing the default behavior for the error we expect.
|
||||
expect(err.message.includes('I crashed!')).to.be.true
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
mount(
|
||||
<ErrorBoundary name="ChildWithError">
|
||||
<ChildWithError />
|
||||
</ErrorBoundary>,
|
||||
)
|
||||
|
||||
cy.get('header h1').should('contain', 'Something went wrong.')
|
||||
cy.get('header h3').should('contain', 'ChildWithError failed to load')
|
||||
})
|
||||
})
|
||||
/// <reference types="cypress" />
|
||||
import { ErrorBoundary } from './error-boundary.jsx'
|
||||
import React from 'react'
|
||||
import { mount } from '@cypress/react'
|
||||
|
||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||
return false
|
||||
})
|
||||
|
||||
/* eslint-env mocha */
|
||||
describe('Error Boundary', () => {
|
||||
const errorMessage = 'I crashed!'
|
||||
const ChildWithoutError = () => <h1>Normal Child</h1>
|
||||
const ChildWithError = () => {
|
||||
throw new Error(errorMessage)
|
||||
}
|
||||
|
||||
it('renders normal children', () => {
|
||||
mount(
|
||||
<ErrorBoundary>
|
||||
<ChildWithoutError />
|
||||
</ErrorBoundary>,
|
||||
)
|
||||
|
||||
cy.get('h1').should('have.text', 'Normal Child')
|
||||
cy.get(ErrorBoundary)
|
||||
.its('state.error')
|
||||
.should('not.exist')
|
||||
})
|
||||
|
||||
it('on error, display fallback UI', () => {
|
||||
// Error boundaries do not stop an uncaught error from propagating.
|
||||
// Cypress will fail on uncaught exceptions by default, so we need to suppress that behavior.
|
||||
cy.on('uncaught:exception', (err) => {
|
||||
// Assert that we are only suppressing the default behavior for the error we expect.
|
||||
expect(err.message.includes('I crashed!')).to.be.true
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
mount(
|
||||
<ErrorBoundary name="ChildWithError">
|
||||
<ChildWithError />
|
||||
</ErrorBoundary>,
|
||||
)
|
||||
|
||||
cy.get('header h1').should('contain', 'Something went wrong.')
|
||||
cy.get('header h3').should('contain', 'ChildWithError failed to load')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,46 +1,46 @@
|
||||
import React from 'react'
|
||||
|
||||
export class ErrorBoundary extends React.Component {
|
||||
constructor (props) {
|
||||
super(props)
|
||||
this.state = { error: null, info: '' }
|
||||
}
|
||||
|
||||
static getDerivedStateFromError (error) {
|
||||
import React from 'react'
|
||||
|
||||
export class ErrorBoundary extends React.Component {
|
||||
constructor (props) {
|
||||
super(props)
|
||||
this.state = { error: null, info: '' }
|
||||
}
|
||||
|
||||
static getDerivedStateFromError (error) {
|
||||
console.error(error)
|
||||
|
||||
return { error }
|
||||
}
|
||||
|
||||
componentDidCatch (error, errorInfo) {
|
||||
// Catch errors in any components below and re-render with error message
|
||||
this.setState({
|
||||
error,
|
||||
info: errorInfo,
|
||||
})
|
||||
// You can also log error messages to an error reporting service here
|
||||
}
|
||||
|
||||
render () {
|
||||
const { name } = this.props
|
||||
|
||||
return { error }
|
||||
}
|
||||
|
||||
componentDidCatch (error, errorInfo) {
|
||||
// Catch errors in any components below and re-render with error message
|
||||
this.setState({
|
||||
error,
|
||||
info: errorInfo,
|
||||
})
|
||||
// You can also log error messages to an error reporting service here
|
||||
}
|
||||
|
||||
render () {
|
||||
const { name } = this.props
|
||||
const { error } = this.state
|
||||
|
||||
if (error) {
|
||||
return (
|
||||
<React.Fragment>
|
||||
<header>
|
||||
<h1>Something went wrong.</h1>
|
||||
<h3>{`${name} failed to load`}</h3>
|
||||
</header>
|
||||
<section>
|
||||
<pre>
|
||||
<code>{JSON.stringify(error)}</code>
|
||||
</pre>
|
||||
</section>
|
||||
</React.Fragment>
|
||||
)
|
||||
|
||||
if (error) {
|
||||
return (
|
||||
<React.Fragment>
|
||||
<header>
|
||||
<h1>Something went wrong.</h1>
|
||||
<h3>{`${name} failed to load`}</h3>
|
||||
</header>
|
||||
<section>
|
||||
<pre>
|
||||
<code>{JSON.stringify(error)}</code>
|
||||
</pre>
|
||||
</section>
|
||||
</React.Fragment>
|
||||
)
|
||||
}
|
||||
|
||||
return this.props.children
|
||||
}
|
||||
}
|
||||
|
||||
return this.props.children
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
"@cypress/react": "file:../../dist",
|
||||
"mocha-junit-reporter": "^2.0.0",
|
||||
"mocha-multi-reporters": "^1.5.1",
|
||||
"sass": "1.32.0"
|
||||
"sass": "1.44.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
"mocha-junit-reporter": "^2.0.0",
|
||||
"mocha-multi-reporters": "^1.5.1",
|
||||
"nyc": "14.1.1",
|
||||
"sass": "1.32.11",
|
||||
"sass": "1.44.0",
|
||||
"sass-loader": "7.3.1",
|
||||
"vue": "3.2.6",
|
||||
"vue-loader": "16.2.0",
|
||||
|
||||
@@ -46,7 +46,7 @@ by calling an event `devServerEvents.emit('dev-server:compile:success')`
|
||||
|
||||
## Webpack
|
||||
|
||||
Webpack-dev-server fulfills his reponsibilities by
|
||||
Webpack-dev-server fulfills his responsibilities by
|
||||
|
||||
- Making a `webpack.config` from the users setup by changing the entrypoint to `browser.ts`
|
||||
- Launches the webpack dev server with `devServer.publicPath = "__cypress/src/"` and `devServer.hot = false`
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cypress",
|
||||
"version": "9.1.0",
|
||||
"version": "9.1.1",
|
||||
"description": "Cypress.io end to end testing tool",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
@@ -163,8 +163,6 @@
|
||||
"getenv": "^1.0.0",
|
||||
"gift": "0.10.2",
|
||||
"glob": "7.1.6",
|
||||
"globby": "10.0.1",
|
||||
"got": "11.5.1",
|
||||
"graphql": "^15.5.1",
|
||||
"gulp": "4.0.2",
|
||||
"gulp-awspublish": "4.0.0",
|
||||
|
||||
25
packages/driver/cypress/fixtures/shadow-dom-type.html
Normal file
25
packages/driver/cypress/fixtures/shadow-dom-type.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<html>
|
||||
<body>
|
||||
<test-element id="element"></test-element>
|
||||
<div id="result"></div>
|
||||
</body>
|
||||
<script>
|
||||
class TestElement extends HTMLElement {
|
||||
constructor() {
|
||||
super();
|
||||
this._shadow = this.attachShadow({mode: "open"});
|
||||
|
||||
const input = document.createElement("input");
|
||||
this._shadow.appendChild(input);
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("test-element", TestElement);
|
||||
|
||||
const el = document.getElementById("element");
|
||||
|
||||
el.addEventListener('keydown', () =>{
|
||||
document.getElementById('result').innerText = 'typed'
|
||||
})
|
||||
</script>
|
||||
</html>
|
||||
@@ -3592,5 +3592,16 @@ describe('src/cy/commands/actions/type - #type', () => {
|
||||
.find('input', { includeShadowDom: true })
|
||||
.type('foo')
|
||||
})
|
||||
|
||||
// https://github.com/cypress-io/cypress/issues/17531
|
||||
it('text events propagate out of shadow root', () => {
|
||||
cy.visit('fixtures/shadow-dom-type.html')
|
||||
|
||||
cy
|
||||
.get('test-element').shadow()
|
||||
.find('input').type('asdf')
|
||||
|
||||
cy.get('#result').should('have.text', 'typed')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -125,6 +125,14 @@ describe('src/cy/commands/clock', () => {
|
||||
})
|
||||
})
|
||||
|
||||
it('overwrites without crashing', () => {
|
||||
Cypress.Commands.overwrite('clock', (originalCommand, ...args) => {
|
||||
return originalCommand(...args)
|
||||
})
|
||||
|
||||
cy.clock()
|
||||
})
|
||||
|
||||
context('errors', () => {
|
||||
it('throws if now is not a number (or options object)', (done) => {
|
||||
cy.on('fail', (err) => {
|
||||
|
||||
@@ -145,6 +145,7 @@ describe('src/cy/commands/files', () => {
|
||||
if (attrs.name === 'readFile') {
|
||||
expect(log.get('state')).to.eq('pending')
|
||||
expect(log.get('message')).to.eq('foo.json')
|
||||
expect(log.get('timeout')).to.eq(Cypress.config('defaultCommandTimeout'))
|
||||
}
|
||||
})
|
||||
|
||||
@@ -321,6 +322,54 @@ describe('src/cy/commands/files', () => {
|
||||
|
||||
cy.readFile('foo.json').should('equal', 'contents')
|
||||
})
|
||||
|
||||
it('throws when the read timeout expires', function (done) {
|
||||
Cypress.backend.callsFake(() => {
|
||||
return new Cypress.Promise(() => { /* Broken promise for timeout */ })
|
||||
})
|
||||
|
||||
cy.on('fail', (err) => {
|
||||
const { lastLog } = this
|
||||
|
||||
assertLogLength(this.logs, 1)
|
||||
expect(lastLog.get('error')).to.eq(err)
|
||||
expect(lastLog.get('state')).to.eq('failed')
|
||||
expect(err.message).to.eq(stripIndent`\
|
||||
\`cy.readFile("foo")\` timed out after waiting \`10ms\`.
|
||||
`)
|
||||
|
||||
expect(err.docsUrl).to.eq('https://on.cypress.io/readfile')
|
||||
|
||||
done()
|
||||
})
|
||||
|
||||
cy.readFile('foo', { timeout: 10 })
|
||||
})
|
||||
|
||||
it('uses defaultCommandTimeout config value if option not provided', {
|
||||
defaultCommandTimeout: 42,
|
||||
}, function (done) {
|
||||
Cypress.backend.callsFake(() => {
|
||||
return new Cypress.Promise(() => { /* Broken promise for timeout */ })
|
||||
})
|
||||
|
||||
cy.on('fail', (err) => {
|
||||
const { lastLog } = this
|
||||
|
||||
assertLogLength(this.logs, 1)
|
||||
expect(lastLog.get('error')).to.eq(err)
|
||||
expect(lastLog.get('state')).to.eq('failed')
|
||||
expect(err.message).to.eq(stripIndent`\
|
||||
\`cy.readFile("foo")\` timed out after waiting \`42ms\`.
|
||||
`)
|
||||
|
||||
expect(err.docsUrl).to.eq('https://on.cypress.io/readfile')
|
||||
|
||||
done()
|
||||
})
|
||||
|
||||
cy.readFile('foo')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -394,7 +443,7 @@ describe('src/cy/commands/files', () => {
|
||||
Cypress.backend.resolves(okResponse)
|
||||
|
||||
cy.writeFile('foo.txt', 'contents').then((subject) => {
|
||||
expect(subject).to.not.exist
|
||||
expect(subject).to.eq(null)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -481,6 +530,7 @@ describe('src/cy/commands/files', () => {
|
||||
if (attrs.name === 'writeFile') {
|
||||
expect(log.get('state')).to.eq('pending')
|
||||
expect(log.get('message')).to.eq('foo.txt', 'contents')
|
||||
expect(log.get('timeout')).to.eq(Cypress.config('defaultCommandTimeout'))
|
||||
}
|
||||
})
|
||||
|
||||
@@ -601,6 +651,54 @@ describe('src/cy/commands/files', () => {
|
||||
|
||||
cy.writeFile('foo.txt', 'contents')
|
||||
})
|
||||
|
||||
it('throws when the write timeout expires', function (done) {
|
||||
Cypress.backend.callsFake(() => {
|
||||
return new Cypress.Promise(() => {})
|
||||
})
|
||||
|
||||
cy.on('fail', (err) => {
|
||||
const { lastLog } = this
|
||||
|
||||
assertLogLength(this.logs, 1)
|
||||
expect(lastLog.get('error')).to.eq(err)
|
||||
expect(lastLog.get('state')).to.eq('failed')
|
||||
expect(err.message).to.eq(stripIndent`
|
||||
\`cy.writeFile("foo.txt")\` timed out after waiting \`10ms\`.
|
||||
`)
|
||||
|
||||
expect(err.docsUrl).to.eq('https://on.cypress.io/writefile')
|
||||
|
||||
done()
|
||||
})
|
||||
|
||||
cy.writeFile('foo.txt', 'contents', { timeout: 10 })
|
||||
})
|
||||
|
||||
it('uses defaultCommandTimeout config value if option not provided', {
|
||||
defaultCommandTimeout: 42,
|
||||
}, function (done) {
|
||||
Cypress.backend.callsFake(() => {
|
||||
return new Cypress.Promise(() => { /* Broken promise for timeout */ })
|
||||
})
|
||||
|
||||
cy.on('fail', (err) => {
|
||||
const { lastLog } = this
|
||||
|
||||
assertLogLength(this.logs, 1)
|
||||
expect(lastLog.get('error')).to.eq(err)
|
||||
expect(lastLog.get('state')).to.eq('failed')
|
||||
expect(err.message).to.eq(stripIndent`
|
||||
\`cy.writeFile("foo.txt")\` timed out after waiting \`42ms\`.
|
||||
`)
|
||||
|
||||
expect(err.docsUrl).to.eq('https://on.cypress.io/writefile')
|
||||
|
||||
done()
|
||||
})
|
||||
|
||||
cy.writeFile('foo.txt', 'contents')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -3220,8 +3220,8 @@ describe('network stubbing', function () {
|
||||
$.get('/foo')
|
||||
$.get('/foo')
|
||||
})
|
||||
.wait('@foo.bar', { timeout: 100 })
|
||||
.wait('@foo.bar', { timeout: 100 })
|
||||
.wait('@foo.bar', { timeout: 500 })
|
||||
.wait('@foo.bar', { timeout: 500 })
|
||||
})
|
||||
|
||||
it('can incrementally wait on requests', function () {
|
||||
|
||||
@@ -105,7 +105,7 @@ describe('Proxy Logging', () => {
|
||||
// @see https://github.com/cypress-io/cypress/issues/17656
|
||||
it('xhr log has response body/status code', (done) => {
|
||||
cy.window()
|
||||
.then((win) => {
|
||||
.then({ timeout: 10000 }, (win) => {
|
||||
cy.on('log:changed', (log) => {
|
||||
try {
|
||||
expect(log.snapshots.map((v) => v.name)).to.deep.eq(['request', 'response'])
|
||||
|
||||
@@ -39,7 +39,7 @@ export default function (Commands, Cypress, cy, state) {
|
||||
return Commands.addAll({ type: 'utility' }, {
|
||||
clock (subject, now, methods, options = {}) {
|
||||
let userOptions = options
|
||||
const ctx = this
|
||||
const ctx = state('ctx')
|
||||
|
||||
if (clock) {
|
||||
return clock
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// @ts-nocheck
|
||||
import _ from 'lodash'
|
||||
import Promise from 'bluebird'
|
||||
|
||||
import $errUtils from '../../cypress/error_utils'
|
||||
|
||||
@@ -22,6 +21,7 @@ export default (Commands, Cypress, cy) => {
|
||||
// to restore the default node behavior.
|
||||
encoding: encoding === undefined ? 'utf8' : encoding,
|
||||
log: true,
|
||||
timeout: Cypress.config('defaultCommandTimeout'),
|
||||
})
|
||||
|
||||
const consoleProps = {}
|
||||
@@ -43,21 +43,33 @@ export default (Commands, Cypress, cy) => {
|
||||
})
|
||||
}
|
||||
|
||||
// We clear the default timeout so we can handle
|
||||
// the timeout ourselves
|
||||
cy.clearTimeout()
|
||||
|
||||
const verifyAssertions = () => {
|
||||
return Cypress.backend('read:file', file, _.pick(options, 'encoding'))
|
||||
return Cypress.backend('read:file', file, _.pick(options, 'encoding')).timeout(options.timeout)
|
||||
.catch((err) => {
|
||||
if (err.code === 'ENOENT') {
|
||||
return {
|
||||
contents: null,
|
||||
filePath: err.filePath,
|
||||
}
|
||||
if (err.name === 'TimeoutError') {
|
||||
return $errUtils.throwErrByPath('files.timed_out', {
|
||||
onFail: options._log,
|
||||
args: { cmd: 'readFile', file, timeout: options.timeout },
|
||||
})
|
||||
}
|
||||
|
||||
return $errUtils.throwErrByPath('files.unexpected_error', {
|
||||
onFail: options._log,
|
||||
args: { cmd: 'readFile', action: 'read', file, filePath: err.filePath, error: err.message },
|
||||
})
|
||||
}).then(({ contents, filePath }) => {
|
||||
// Non-ENOENT errors are not retried
|
||||
if (err.code !== 'ENOENT') {
|
||||
return $errUtils.throwErrByPath('files.unexpected_error', {
|
||||
onFail: options._log,
|
||||
args: { cmd: 'readFile', action: 'read', file, filePath: err.filePath, error: err.message },
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
contents: null,
|
||||
filePath: err.filePath,
|
||||
}
|
||||
}).then(({ filePath, contents }) => {
|
||||
// https://github.com/cypress-io/cypress/issues/1558
|
||||
// We invoke Buffer.from() in order to transform this from an ArrayBuffer -
|
||||
// which socket.io uses to transfer the file over the websocket - into a
|
||||
@@ -110,6 +122,7 @@ export default (Commands, Cypress, cy) => {
|
||||
encoding: encoding === undefined ? 'utf8' : encoding,
|
||||
flag: userOptions.flag ? userOptions.flag : 'w',
|
||||
log: true,
|
||||
timeout: Cypress.config('defaultCommandTimeout'),
|
||||
})
|
||||
|
||||
const consoleProps = {}
|
||||
@@ -117,7 +130,7 @@ export default (Commands, Cypress, cy) => {
|
||||
if (options.log) {
|
||||
options._log = Cypress.log({
|
||||
message: fileName,
|
||||
timeout: 0,
|
||||
timeout: options.timeout,
|
||||
consoleProps () {
|
||||
return consoleProps
|
||||
},
|
||||
@@ -142,19 +155,25 @@ export default (Commands, Cypress, cy) => {
|
||||
contents = JSON.stringify(contents, null, 2)
|
||||
}
|
||||
|
||||
return Cypress.backend('write:file', fileName, contents, _.pick(options, ['encoding', 'flag']))
|
||||
.then(({ contents, filePath }) => {
|
||||
// We clear the default timeout so we can handle
|
||||
// the timeout ourselves
|
||||
cy.clearTimeout()
|
||||
|
||||
return Cypress.backend('write:file', fileName, contents, _.pick(options, 'encoding', 'flag')).timeout(options.timeout)
|
||||
.then(({ filePath, contents }) => {
|
||||
consoleProps['File Path'] = filePath
|
||||
consoleProps['Contents'] = contents
|
||||
|
||||
return null
|
||||
}).catch(Promise.TimeoutError, () => {
|
||||
return $errUtils.throwErrByPath('files.timed_out', {
|
||||
onFail: options._log,
|
||||
args: { cmd: 'writeFile', file: fileName, timeout: options.timeout },
|
||||
})
|
||||
})
|
||||
.catch((err) => {
|
||||
if (err.name === 'TimeoutError') {
|
||||
return $errUtils.throwErrByPath('files.timed_out', {
|
||||
onFail: options._log,
|
||||
args: { cmd: 'writeFile', file: fileName, timeout: options.timeout },
|
||||
})
|
||||
}
|
||||
|
||||
return $errUtils.throwErrByPath('files.unexpected_error', {
|
||||
onFail: options._log,
|
||||
args: { cmd: 'writeFile', action: 'write', file: fileName, filePath: err.filePath, error: err.message },
|
||||
|
||||
@@ -960,6 +960,9 @@ export class Keyboard {
|
||||
..._.omitBy(
|
||||
{
|
||||
bubbles: true,
|
||||
// allow propagation out of root of shadow-dom
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/Event/composed
|
||||
composed: true,
|
||||
cancelable,
|
||||
key,
|
||||
code,
|
||||
|
||||
@@ -40,7 +40,6 @@ Upgrading `electron` involves more than just bumping this package's `package.jso
|
||||
- See [`cypress-docker-images`](https://github.com/cypress-io/cypress-docker-images/).
|
||||
- [ ] **Ensure that a matching Node.js version is enforced in the monorepo for local development and CI.** When Electron is upgraded, oftentimes, the bundled Node.js version that comes with Electron is updated as well. Because all unit and integration tests run in normal Node.js (not Electron's Node.js), it's important for this Node.js version to be synced with the monorepo. There are a few places where this needs to be done:
|
||||
- [ ] [`/.node-version`](../../.node-version) - used by `nvm` and other Node version managers
|
||||
- [ ] [`/appveyor.yml`](../../appveyor.yml) - update the `nodejs_version`
|
||||
- [ ] [`/package.json`](../../package.json) - update `engines`
|
||||
- [ ] [`/scripts/run-docker-local.sh`](../../scripts/run-docker-local.sh) - update Docker image to the new matching `browsers` image
|
||||
- [ ] [`/circle.yml`](../../circle.yml)
|
||||
|
||||
@@ -12,10 +12,11 @@
|
||||
"cypress:run:e2e": "echo 'no e2e in frontend-shared'",
|
||||
"cypress:run:ct": "cross-env TZ=America/New_York node ../../scripts/cypress run --component --project ${PWD}",
|
||||
"dev": "gulp dev --project ${PWD}",
|
||||
"generate-shiki-theme": "node ./script/generate-shiki-theme.js"
|
||||
"generate-shiki-theme": "node ./script/generate-shiki-theme.js",
|
||||
"postinstall": "patch-package"
|
||||
},
|
||||
"dependencies": {
|
||||
"@toycode/markdown-it-class": "1.2.4",
|
||||
"@toycode/markdown-it-class": "1.2.3",
|
||||
"markdown-it": "12.2.0",
|
||||
"shiki": "^0.9.12"
|
||||
},
|
||||
@@ -48,6 +49,7 @@
|
||||
"graphql-tag": "^2.12.5",
|
||||
"lodash": "^4.17.21",
|
||||
"modern-normalize": "1.1.0",
|
||||
"patch-package": "6.4.7",
|
||||
"rimraf": "3.0.2",
|
||||
"unplugin-icons": "^0.11.4",
|
||||
"unplugin-vue-components": "^0.15.4",
|
||||
@@ -65,6 +67,11 @@
|
||||
"wonka": "^4.0.15"
|
||||
},
|
||||
"module": "es2020",
|
||||
"workspaces": {
|
||||
"nohoist": [
|
||||
"@toycode/markdown-it-class"
|
||||
]
|
||||
},
|
||||
"vite": {
|
||||
"optimizeDeps": {
|
||||
"include": [
|
||||
|
||||
@@ -90,7 +90,7 @@ export const makeConfig = (config: Partial<UserConfig> = {}, plugins: PluginOpti
|
||||
css: {
|
||||
preprocessorOptions: {
|
||||
scss: {
|
||||
additionalData: `@use "${path.resolve(__dirname, '../reporter/src/lib/variables.scss')}" as *;`,
|
||||
additionalData: `@use "file:///${path.resolve(__dirname, '../reporter/src/lib/variables.scss').replaceAll('\\', '/')}" as *;\n`,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEADCCAuigAwIBAgIQxHqMbWiiVO/Qhhr4qxKQJjANBgkqhkiG9w0BAQsFADB0
|
||||
MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJuZXQxETAP
|
||||
BgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UEChMKQ3lw
|
||||
cmVzcy5pbzELMAkGA1UECxMCQ0EwHhcNMjAwMjE5MTk1MzM1WhcNMzAwMjE5MTk1
|
||||
MzM1WjB0MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJu
|
||||
ZXQxETAPBgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UE
|
||||
ChMKQ3lwcmVzcy5pbzELMAkGA1UECxMCQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQDI0XAGVItp0zBAbY1697fttxw9uMhaVAR7HCB7jEFaT0RKiYjQ
|
||||
xWHf042yPv0MRyjbofzCdkKwmkbDrwOWE1FxPUKhUabsJnIiuY7wmVlXvuEwrola
|
||||
HVYT5b3XkwaRbjD0f1obB2fas2qcCMXGZaeGZqxY67w/QhfoB0SWaE0UyKWkt1Ec
|
||||
7YgIRn+d12FrL5lDHCUkjifPd53M8B9+d3usVzc0t4XodeerVPx9mW+B/ULQ1Hiw
|
||||
QDzG7d6OpJrt3Wk7ibaJCBobhuDSMEXPPhxwDS+YEaH0D5Wh8pzmHpduMD1i3/jg
|
||||
xq6Si8jchIPZRE0jBX0Fe+NCjXZswQV2GFdlAgMBAAGjgY0wgYowDAYDVR0TBAUw
|
||||
AwEB/zALBgNVHQ8EBAMCAvQwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMC
|
||||
BggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMBEGCWCGSAGG+EIBAQQEAwIA
|
||||
9zAdBgNVHQ4EFgQUiw3dB0uxjFLp7MqHN1IHF+MHt6kwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAIRyfZZqjUTtUFKDgqD1MUn2UvsCAePFDw6aafkfo4Kk2V69XHPP3lxEhnpu
|
||||
ff0COh5p3D9SHMfAWFmj4PH0+R4H+zIfyA0F1KzO6B+cn4JSaQtF0HrWDOtz4KH5
|
||||
CwddoBTt6LSawAb1eaxn3Rk19KD7dS/3tjY2sAHMSJgbnsbxVnQhMVTBBy3Llgd3
|
||||
I6vomUuXp8rHLVz8KgfSVzU/iPJhPkxxqDdKoBvL7k+2GUcSFBkltZXDXnSP/q3F
|
||||
8N6NyRta0mg/xsi5lvx0s5XeCLQpxJAzijaqelGt7mYwctNaLyO1CCPr3j0fjG+y
|
||||
FsmO0zl5SGzyLe044FmFjcqnaW4=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEADCCAuigAwIBAgIQxHqMbWiiVO/Qhhr4qxKQJjANBgkqhkiG9w0BAQsFADB0
|
||||
MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJuZXQxETAP
|
||||
BgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UEChMKQ3lw
|
||||
cmVzcy5pbzELMAkGA1UECxMCQ0EwHhcNMjAwMjE5MTk1MzM1WhcNMzAwMjE5MTk1
|
||||
MzM1WjB0MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJu
|
||||
ZXQxETAPBgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UE
|
||||
ChMKQ3lwcmVzcy5pbzELMAkGA1UECxMCQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQDI0XAGVItp0zBAbY1697fttxw9uMhaVAR7HCB7jEFaT0RKiYjQ
|
||||
xWHf042yPv0MRyjbofzCdkKwmkbDrwOWE1FxPUKhUabsJnIiuY7wmVlXvuEwrola
|
||||
HVYT5b3XkwaRbjD0f1obB2fas2qcCMXGZaeGZqxY67w/QhfoB0SWaE0UyKWkt1Ec
|
||||
7YgIRn+d12FrL5lDHCUkjifPd53M8B9+d3usVzc0t4XodeerVPx9mW+B/ULQ1Hiw
|
||||
QDzG7d6OpJrt3Wk7ibaJCBobhuDSMEXPPhxwDS+YEaH0D5Wh8pzmHpduMD1i3/jg
|
||||
xq6Si8jchIPZRE0jBX0Fe+NCjXZswQV2GFdlAgMBAAGjgY0wgYowDAYDVR0TBAUw
|
||||
AwEB/zALBgNVHQ8EBAMCAvQwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMC
|
||||
BggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMBEGCWCGSAGG+EIBAQQEAwIA
|
||||
9zAdBgNVHQ4EFgQUiw3dB0uxjFLp7MqHN1IHF+MHt6kwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAIRyfZZqjUTtUFKDgqD1MUn2UvsCAePFDw6aafkfo4Kk2V69XHPP3lxEhnpu
|
||||
ff0COh5p3D9SHMfAWFmj4PH0+R4H+zIfyA0F1KzO6B+cn4JSaQtF0HrWDOtz4KH5
|
||||
CwddoBTt6LSawAb1eaxn3Rk19KD7dS/3tjY2sAHMSJgbnsbxVnQhMVTBBy3Llgd3
|
||||
I6vomUuXp8rHLVz8KgfSVzU/iPJhPkxxqDdKoBvL7k+2GUcSFBkltZXDXnSP/q3F
|
||||
8N6NyRta0mg/xsi5lvx0s5XeCLQpxJAzijaqelGt7mYwctNaLyO1CCPr3j0fjG+y
|
||||
FsmO0zl5SGzyLe044FmFjcqnaW4=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEAyNFwBlSLadMwQG2Neve37bccPbjIWlQEexwge4xBWk9ESomI
|
||||
0MVh39ONsj79DEco26H8wnZCsJpGw68DlhNRcT1CoVGm7CZyIrmO8JlZV77hMK6J
|
||||
Wh1WE+W915MGkW4w9H9aGwdn2rNqnAjFxmWnhmasWOu8P0IX6AdElmhNFMilpLdR
|
||||
HO2ICEZ/nddhay+ZQxwlJI4nz3edzPAffnd7rFc3NLeF6HXnq1T8fZlvgf1C0NR4
|
||||
sEA8xu3ejqSa7d1pO4m2iQgaG4bg0jBFzz4ccA0vmBGh9A+VofKc5h6XbjA9Yt/4
|
||||
4MaukovI3ISD2URNIwV9BXvjQo12bMEFdhhXZQIDAQABAoIBAFFBnYiSMQ8S6xVG
|
||||
vtag4YWIcB7xY/BYyq9dxC75o3/9Tu6yE/AVzfKZUV5sakvLh1bHhtTQsU9wPW30
|
||||
pQjWrD+bwBgyR86KB+jRGGt2QVZl4Ayost8Ju8i1T0mpLiEuaxSjazxAlN9DdcHJ
|
||||
Mu2COHUDmn0odbVK8w1p03Dgpz/e8NnyG/D/LIGuxetEFQATXpB+YbpxTpZ1q1G2
|
||||
r3ep5pOdaO13FchoJ3c5XfJBgz9zxZ0z5Lp51/+oYWLTLT16MPSC2xvV5B9BiB+y
|
||||
k81RSXd8A1z80mpEjklBG3dVCY71PXD83maVFpfjBPcwQGjrA1ntLSDQRbO9Tc2b
|
||||
56OMVEECgYEA4u97pvH+kl5g7+m003EQvAuPN+7AXHQgubxGUsrIDJ2SuE3X8mI1
|
||||
/O4VV6sAyzwjSWrV7CgO2B0KMseTNtM2QY3GrU+gXdzuDXKldDeLvWv4dNdkSrp0
|
||||
i/VbzS8WyTxaOnw6nNu5k+tp1C3gsMWjCaiK5jB6zk8YbIa7cGYDRt0CgYEA4oml
|
||||
fbEIle2YpL+kbzzdDrkdbD8ZpOXyTNqGTP9vbTpnKEeCCbsOgoq7Viq9qMMg/yl4
|
||||
OfMc9g4SscBX69ScPfP3XQgzH1btjbf72bjbVZsNbEvJcGk1eWjJWhG7oNJfDZhe
|
||||
qSi3oxwfEhri2Tl6fcJWOQQtt1QBRkPDYjY3FikCgYEAgQfnx7mKpJCTD3ZTgXGl
|
||||
MTZlXUkcCLVishix53szGbEybiacpU1gIwsACZPKZMQx0Bm1vovcPNbuKIc/Vgnr
|
||||
rIQ/NeWzagsnM3A/UQAQLUjJwS2C8dZoU/fTFawziYIOT3i5Htzz/H3681COlBQb
|
||||
qm8xYsan3MwuN+63fqYSMOUCgYEAz521JPe91aJ2de8JZcVTF25Cb/V4rC7uHM9d
|
||||
rG2iEmonJrw6im58AtngjT0IqwWCVTgNbpbH4R3OtkeAjKtDMmhIOWQNblh9yJdo
|
||||
4wZPRiqfZ7Qhfrt9fbKybrC309FZuhz+DGw7uOpJ847efpT2FRGpcgHJYC5GKL5r
|
||||
77OeUtkCgYB54h1MUcDE+KErG+N0IMjvaSEeXuZiWHW03tVsKXzSvpTGZpeQFYbn
|
||||
rVOukS8gvzamBvu+omtmjlfsgwN/lHEAoQVuZI69ow/67A2fiPuNuP1KWZW+UrSO
|
||||
OvJ1VmJKuVHarOzuLqXKnm6vCVd2FHlyzuUKG8C4ad8fTIRJk8LRlw==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEAyNFwBlSLadMwQG2Neve37bccPbjIWlQEexwge4xBWk9ESomI
|
||||
0MVh39ONsj79DEco26H8wnZCsJpGw68DlhNRcT1CoVGm7CZyIrmO8JlZV77hMK6J
|
||||
Wh1WE+W915MGkW4w9H9aGwdn2rNqnAjFxmWnhmasWOu8P0IX6AdElmhNFMilpLdR
|
||||
HO2ICEZ/nddhay+ZQxwlJI4nz3edzPAffnd7rFc3NLeF6HXnq1T8fZlvgf1C0NR4
|
||||
sEA8xu3ejqSa7d1pO4m2iQgaG4bg0jBFzz4ccA0vmBGh9A+VofKc5h6XbjA9Yt/4
|
||||
4MaukovI3ISD2URNIwV9BXvjQo12bMEFdhhXZQIDAQABAoIBAFFBnYiSMQ8S6xVG
|
||||
vtag4YWIcB7xY/BYyq9dxC75o3/9Tu6yE/AVzfKZUV5sakvLh1bHhtTQsU9wPW30
|
||||
pQjWrD+bwBgyR86KB+jRGGt2QVZl4Ayost8Ju8i1T0mpLiEuaxSjazxAlN9DdcHJ
|
||||
Mu2COHUDmn0odbVK8w1p03Dgpz/e8NnyG/D/LIGuxetEFQATXpB+YbpxTpZ1q1G2
|
||||
r3ep5pOdaO13FchoJ3c5XfJBgz9zxZ0z5Lp51/+oYWLTLT16MPSC2xvV5B9BiB+y
|
||||
k81RSXd8A1z80mpEjklBG3dVCY71PXD83maVFpfjBPcwQGjrA1ntLSDQRbO9Tc2b
|
||||
56OMVEECgYEA4u97pvH+kl5g7+m003EQvAuPN+7AXHQgubxGUsrIDJ2SuE3X8mI1
|
||||
/O4VV6sAyzwjSWrV7CgO2B0KMseTNtM2QY3GrU+gXdzuDXKldDeLvWv4dNdkSrp0
|
||||
i/VbzS8WyTxaOnw6nNu5k+tp1C3gsMWjCaiK5jB6zk8YbIa7cGYDRt0CgYEA4oml
|
||||
fbEIle2YpL+kbzzdDrkdbD8ZpOXyTNqGTP9vbTpnKEeCCbsOgoq7Viq9qMMg/yl4
|
||||
OfMc9g4SscBX69ScPfP3XQgzH1btjbf72bjbVZsNbEvJcGk1eWjJWhG7oNJfDZhe
|
||||
qSi3oxwfEhri2Tl6fcJWOQQtt1QBRkPDYjY3FikCgYEAgQfnx7mKpJCTD3ZTgXGl
|
||||
MTZlXUkcCLVishix53szGbEybiacpU1gIwsACZPKZMQx0Bm1vovcPNbuKIc/Vgnr
|
||||
rIQ/NeWzagsnM3A/UQAQLUjJwS2C8dZoU/fTFawziYIOT3i5Htzz/H3681COlBQb
|
||||
qm8xYsan3MwuN+63fqYSMOUCgYEAz521JPe91aJ2de8JZcVTF25Cb/V4rC7uHM9d
|
||||
rG2iEmonJrw6im58AtngjT0IqwWCVTgNbpbH4R3OtkeAjKtDMmhIOWQNblh9yJdo
|
||||
4wZPRiqfZ7Qhfrt9fbKybrC309FZuhz+DGw7uOpJ847efpT2FRGpcgHJYC5GKL5r
|
||||
77OeUtkCgYB54h1MUcDE+KErG+N0IMjvaSEeXuZiWHW03tVsKXzSvpTGZpeQFYbn
|
||||
rVOukS8gvzamBvu+omtmjlfsgwN/lHEAoQVuZI69ow/67A2fiPuNuP1KWZW+UrSO
|
||||
OvJ1VmJKuVHarOzuLqXKnm6vCVd2FHlyzuUKG8C4ad8fTIRJk8LRlw==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEADCCAuigAwIBAgIQxHqMbWiiVO/Qhhr4qxKQJjANBgkqhkiG9w0BAQsFADB0
|
||||
MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJuZXQxETAP
|
||||
BgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UEChMKQ3lw
|
||||
cmVzcy5pbzELMAkGA1UECxMCQ0EwHhcNMjAwMjE5MTk1MzM1WhcNMzAwMjE5MTk1
|
||||
MzM1WjB0MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJu
|
||||
ZXQxETAPBgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UE
|
||||
ChMKQ3lwcmVzcy5pbzELMAkGA1UECxMCQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQDI0XAGVItp0zBAbY1697fttxw9uMhaVAR7HCB7jEFaT0RKiYjQ
|
||||
xWHf042yPv0MRyjbofzCdkKwmkbDrwOWE1FxPUKhUabsJnIiuY7wmVlXvuEwrola
|
||||
HVYT5b3XkwaRbjD0f1obB2fas2qcCMXGZaeGZqxY67w/QhfoB0SWaE0UyKWkt1Ec
|
||||
7YgIRn+d12FrL5lDHCUkjifPd53M8B9+d3usVzc0t4XodeerVPx9mW+B/ULQ1Hiw
|
||||
QDzG7d6OpJrt3Wk7ibaJCBobhuDSMEXPPhxwDS+YEaH0D5Wh8pzmHpduMD1i3/jg
|
||||
xq6Si8jchIPZRE0jBX0Fe+NCjXZswQV2GFdlAgMBAAGjgY0wgYowDAYDVR0TBAUw
|
||||
AwEB/zALBgNVHQ8EBAMCAvQwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMC
|
||||
BggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMBEGCWCGSAGG+EIBAQQEAwIA
|
||||
9zAdBgNVHQ4EFgQUiw3dB0uxjFLp7MqHN1IHF+MHt6kwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAIRyfZZqjUTtUFKDgqD1MUn2UvsCAePFDw6aafkfo4Kk2V69XHPP3lxEhnpu
|
||||
ff0COh5p3D9SHMfAWFmj4PH0+R4H+zIfyA0F1KzO6B+cn4JSaQtF0HrWDOtz4KH5
|
||||
CwddoBTt6LSawAb1eaxn3Rk19KD7dS/3tjY2sAHMSJgbnsbxVnQhMVTBBy3Llgd3
|
||||
I6vomUuXp8rHLVz8KgfSVzU/iPJhPkxxqDdKoBvL7k+2GUcSFBkltZXDXnSP/q3F
|
||||
8N6NyRta0mg/xsi5lvx0s5XeCLQpxJAzijaqelGt7mYwctNaLyO1CCPr3j0fjG+y
|
||||
FsmO0zl5SGzyLe044FmFjcqnaW4=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEADCCAuigAwIBAgIQxHqMbWiiVO/Qhhr4qxKQJjANBgkqhkiG9w0BAQsFADB0
|
||||
MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJuZXQxETAP
|
||||
BgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UEChMKQ3lw
|
||||
cmVzcy5pbzELMAkGA1UECxMCQ0EwHhcNMjAwMjE5MTk1MzM1WhcNMzAwMjE5MTk1
|
||||
MzM1WjB0MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJu
|
||||
ZXQxETAPBgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UE
|
||||
ChMKQ3lwcmVzcy5pbzELMAkGA1UECxMCQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQDI0XAGVItp0zBAbY1697fttxw9uMhaVAR7HCB7jEFaT0RKiYjQ
|
||||
xWHf042yPv0MRyjbofzCdkKwmkbDrwOWE1FxPUKhUabsJnIiuY7wmVlXvuEwrola
|
||||
HVYT5b3XkwaRbjD0f1obB2fas2qcCMXGZaeGZqxY67w/QhfoB0SWaE0UyKWkt1Ec
|
||||
7YgIRn+d12FrL5lDHCUkjifPd53M8B9+d3usVzc0t4XodeerVPx9mW+B/ULQ1Hiw
|
||||
QDzG7d6OpJrt3Wk7ibaJCBobhuDSMEXPPhxwDS+YEaH0D5Wh8pzmHpduMD1i3/jg
|
||||
xq6Si8jchIPZRE0jBX0Fe+NCjXZswQV2GFdlAgMBAAGjgY0wgYowDAYDVR0TBAUw
|
||||
AwEB/zALBgNVHQ8EBAMCAvQwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMC
|
||||
BggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMBEGCWCGSAGG+EIBAQQEAwIA
|
||||
9zAdBgNVHQ4EFgQUiw3dB0uxjFLp7MqHN1IHF+MHt6kwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAIRyfZZqjUTtUFKDgqD1MUn2UvsCAePFDw6aafkfo4Kk2V69XHPP3lxEhnpu
|
||||
ff0COh5p3D9SHMfAWFmj4PH0+R4H+zIfyA0F1KzO6B+cn4JSaQtF0HrWDOtz4KH5
|
||||
CwddoBTt6LSawAb1eaxn3Rk19KD7dS/3tjY2sAHMSJgbnsbxVnQhMVTBBy3Llgd3
|
||||
I6vomUuXp8rHLVz8KgfSVzU/iPJhPkxxqDdKoBvL7k+2GUcSFBkltZXDXnSP/q3F
|
||||
8N6NyRta0mg/xsi5lvx0s5XeCLQpxJAzijaqelGt7mYwctNaLyO1CCPr3j0fjG+y
|
||||
FsmO0zl5SGzyLe044FmFjcqnaW4=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEADCCAuigAwIBAgIQxHqMbWiiVO/Qhhr4qxKQJjANBgkqhkiG9w0BAQsFADB0
|
||||
MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJuZXQxETAP
|
||||
BgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UEChMKQ3lw
|
||||
cmVzcy5pbzELMAkGA1UECxMCQ0EwHhcNMjAwMjE5MTk1MzM1WhcNMzAwMjE5MTk1
|
||||
MzM1WjB0MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJu
|
||||
ZXQxETAPBgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UE
|
||||
ChMKQ3lwcmVzcy5pbzELMAkGA1UECxMCQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQDI0XAGVItp0zBAbY1697fttxw9uMhaVAR7HCB7jEFaT0RKiYjQ
|
||||
xWHf042yPv0MRyjbofzCdkKwmkbDrwOWE1FxPUKhUabsJnIiuY7wmVlXvuEwrola
|
||||
HVYT5b3XkwaRbjD0f1obB2fas2qcCMXGZaeGZqxY67w/QhfoB0SWaE0UyKWkt1Ec
|
||||
7YgIRn+d12FrL5lDHCUkjifPd53M8B9+d3usVzc0t4XodeerVPx9mW+B/ULQ1Hiw
|
||||
QDzG7d6OpJrt3Wk7ibaJCBobhuDSMEXPPhxwDS+YEaH0D5Wh8pzmHpduMD1i3/jg
|
||||
xq6Si8jchIPZRE0jBX0Fe+NCjXZswQV2GFdlAgMBAAGjgY0wgYowDAYDVR0TBAUw
|
||||
AwEB/zALBgNVHQ8EBAMCAvQwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMC
|
||||
BggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMBEGCWCGSAGG+EIBAQQEAwIA
|
||||
9zAdBgNVHQ4EFgQUiw3dB0uxjFLp7MqHN1IHF+MHt6kwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAIRyfZZqjUTtUFKDgqD1MUn2UvsCAePFDw6aafkfo4Kk2V69XHPP3lxEhnpu
|
||||
ff0COh5p3D9SHMfAWFmj4PH0+R4H+zIfyA0F1KzO6B+cn4JSaQtF0HrWDOtz4KH5
|
||||
CwddoBTt6LSawAb1eaxn3Rk19KD7dS/3tjY2sAHMSJgbnsbxVnQhMVTBBy3Llgd3
|
||||
I6vomUuXp8rHLVz8KgfSVzU/iPJhPkxxqDdKoBvL7k+2GUcSFBkltZXDXnSP/q3F
|
||||
8N6NyRta0mg/xsi5lvx0s5XeCLQpxJAzijaqelGt7mYwctNaLyO1CCPr3j0fjG+y
|
||||
FsmO0zl5SGzyLe044FmFjcqnaW4=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEADCCAuigAwIBAgIQxHqMbWiiVO/Qhhr4qxKQJjANBgkqhkiG9w0BAQsFADB0
|
||||
MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJuZXQxETAP
|
||||
BgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UEChMKQ3lw
|
||||
cmVzcy5pbzELMAkGA1UECxMCQ0EwHhcNMjAwMjE5MTk1MzM1WhcNMzAwMjE5MTk1
|
||||
MzM1WjB0MRcwFQYDVQQDEw5DeXByZXNzUHJveHlDQTERMA8GA1UEBhMISW50ZXJu
|
||||
ZXQxETAPBgNVBAgTCEludGVybmV0MREwDwYDVQQHEwhJbnRlcm5ldDETMBEGA1UE
|
||||
ChMKQ3lwcmVzcy5pbzELMAkGA1UECxMCQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQDI0XAGVItp0zBAbY1697fttxw9uMhaVAR7HCB7jEFaT0RKiYjQ
|
||||
xWHf042yPv0MRyjbofzCdkKwmkbDrwOWE1FxPUKhUabsJnIiuY7wmVlXvuEwrola
|
||||
HVYT5b3XkwaRbjD0f1obB2fas2qcCMXGZaeGZqxY67w/QhfoB0SWaE0UyKWkt1Ec
|
||||
7YgIRn+d12FrL5lDHCUkjifPd53M8B9+d3usVzc0t4XodeerVPx9mW+B/ULQ1Hiw
|
||||
QDzG7d6OpJrt3Wk7ibaJCBobhuDSMEXPPhxwDS+YEaH0D5Wh8pzmHpduMD1i3/jg
|
||||
xq6Si8jchIPZRE0jBX0Fe+NCjXZswQV2GFdlAgMBAAGjgY0wgYowDAYDVR0TBAUw
|
||||
AwEB/zALBgNVHQ8EBAMCAvQwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMC
|
||||
BggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMBEGCWCGSAGG+EIBAQQEAwIA
|
||||
9zAdBgNVHQ4EFgQUiw3dB0uxjFLp7MqHN1IHF+MHt6kwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAIRyfZZqjUTtUFKDgqD1MUn2UvsCAePFDw6aafkfo4Kk2V69XHPP3lxEhnpu
|
||||
ff0COh5p3D9SHMfAWFmj4PH0+R4H+zIfyA0F1KzO6B+cn4JSaQtF0HrWDOtz4KH5
|
||||
CwddoBTt6LSawAb1eaxn3Rk19KD7dS/3tjY2sAHMSJgbnsbxVnQhMVTBBy3Llgd3
|
||||
I6vomUuXp8rHLVz8KgfSVzU/iPJhPkxxqDdKoBvL7k+2GUcSFBkltZXDXnSP/q3F
|
||||
8N6NyRta0mg/xsi5lvx0s5XeCLQpxJAzijaqelGt7mYwctNaLyO1CCPr3j0fjG+y
|
||||
FsmO0zl5SGzyLe044FmFjcqnaW4=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"scripts": {
|
||||
"check-ts": "vue-tsc --noEmit",
|
||||
"build-prod-ui": "cross-env NODE_ENV=production vite build",
|
||||
"postinstall": "patch-package",
|
||||
"clean": "rimraf dist && rimraf ./node_modules/.vite && rimraf dist-e2e && echo 'cleaned'",
|
||||
"clean-deps": "rimraf node_modules",
|
||||
"test": "yarn cypress:run:ct && yarn types",
|
||||
@@ -29,7 +28,6 @@
|
||||
"@packages/frontend-shared": "0.0.0-development",
|
||||
"@percy/cypress": "^3.1.0",
|
||||
"@testing-library/cypress": "8.0.0",
|
||||
"@toycode/markdown-it-class": "1.2.4",
|
||||
"@urql/core": "2.3.1",
|
||||
"@urql/devtools": "2.0.3",
|
||||
"@urql/vue": "0.4.3",
|
||||
@@ -74,11 +72,6 @@
|
||||
"script",
|
||||
"src"
|
||||
],
|
||||
"workspaces": {
|
||||
"nohoist": [
|
||||
"@toycode/markdown-it-class"
|
||||
]
|
||||
},
|
||||
"vite": {
|
||||
"optimizeDeps": {
|
||||
"include": [
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
diff --git a/node_modules/@toycode/markdown-it-class/index.js b/node_modules/@toycode/markdown-it-class/index.js
|
||||
index 8e8c8f4..5e2539d 100644
|
||||
--- a/node_modules/@toycode/markdown-it-class/index.js
|
||||
+++ b/node_modules/@toycode/markdown-it-class/index.js
|
||||
@@ -8,7 +8,7 @@ const toArray = a => (Array.isArray(a) ? a : [a])
|
||||
|
||||
function parseTokens(tokens) {
|
||||
tokens.forEach(token => {
|
||||
- if (/(_open$|image)/.test(token.type) && mapping[token.tag]) {
|
||||
+ if (/(_open$|image|code_inline)/.test(token.type) && mapping[token.tag]) {
|
||||
const orig = splitWithSpace(token.attrGet('class'))
|
||||
const addition = toArray(mapping[token.tag])
|
||||
token.attrSet('class', [...orig, ...addition].join(' '))
|
||||
@@ -34,13 +34,11 @@
|
||||
"classnames": "2.3.1",
|
||||
"clean-webpack-plugin": "^3.0.0",
|
||||
"cypress-real-events": "1.4.0",
|
||||
"dart-sass": "^1.25.0",
|
||||
"eslint-plugin-mocha": "^8.0.0",
|
||||
"eslint-plugin-react": "^7.22.0",
|
||||
"eslint-plugin-react-hooks": "^4.2.0",
|
||||
"express": "^4.17.1",
|
||||
"fuzzysort": "^1.1.4",
|
||||
"globby": "^11.0.1",
|
||||
"hotkeys-js": "3.8.2",
|
||||
"html-webpack-plugin": "^4.5.0",
|
||||
"koa": "^2.13.0",
|
||||
@@ -53,6 +51,7 @@
|
||||
"react-dom": "16.8.6",
|
||||
"react-split-pane": "^0.1.92",
|
||||
"rimraf": "3.0.2",
|
||||
"sass": "1.44.0",
|
||||
"sass-loader": "^10.0.3",
|
||||
"sockjs-client": "^1.5.0",
|
||||
"strip-ansi": "6.0.0",
|
||||
|
||||
@@ -69,7 +69,7 @@ $resizerLineSize: 4px;
|
||||
}
|
||||
|
||||
&.horizontal {
|
||||
margin: -($resize-thickness / 2) 0;
|
||||
margin: -($resize-thickness * 0.5) 0;
|
||||
height: $resize-thickness;
|
||||
width: 100%;
|
||||
cursor: row-resize;
|
||||
@@ -83,7 +83,7 @@ $resizerLineSize: 4px;
|
||||
}
|
||||
|
||||
&.vertical {
|
||||
margin: 0 -($resize-thickness / 2);
|
||||
margin: 0 -($resize-thickness * 0.5);
|
||||
width: $resize-thickness;
|
||||
height: 100%;
|
||||
cursor: col-resize;
|
||||
|
||||
@@ -9,7 +9,6 @@ let ctx
|
||||
describe('lib/plugins', () => {
|
||||
beforeEach(async () => {
|
||||
ctx = makeLegacyDataContext()
|
||||
Fixtures.scaffold()
|
||||
Fixtures.scaffoldProject('plugin-before-browser-launch-deprecation')
|
||||
await Fixtures.scaffoldCommonNodeModules()
|
||||
ctx.actions.project.setActiveProjectForTestSetup(Fixtures.projectPath('plugin-before-browser-launch-deprecation'))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
require('../../spec_helper')
|
||||
|
||||
const _ = require('lodash')
|
||||
const mockedEnv = require('mocked-env')
|
||||
const { omit } = require('lodash')
|
||||
const cp = require('child_process')
|
||||
const { makeLegacyDataContext } = require('../../../lib/makeDataContext')
|
||||
const FixturesHelper = require('@tooling/system-tests/lib/fixtures')
|
||||
@@ -116,7 +116,7 @@ describe.skip('lib/plugins/index', () => {
|
||||
execPath: systemNode,
|
||||
}
|
||||
|
||||
expect(_.omit(cp.fork.lastCall.args[2], 'env')).to.eql(options)
|
||||
expect(omit(cp.fork.lastCall.args[2], 'env')).to.eql(options)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -134,7 +134,7 @@ describe.skip('lib/plugins/index', () => {
|
||||
stdio: 'pipe',
|
||||
}
|
||||
|
||||
expect(_.omit(cp.fork.lastCall.args[2], 'env')).to.eql(options)
|
||||
expect(omit(cp.fork.lastCall.args[2], 'env')).to.eql(options)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import fs from 'fs'
|
||||
import buffer from 'buffer'
|
||||
import type http from 'http'
|
||||
import server, { Server as SocketIOBaseServer, ServerOptions, Socket } from 'socket.io'
|
||||
|
||||
export type { Socket }
|
||||
|
||||
const HUNDRED_MEGABYTES = 1e8 // 100000000
|
||||
|
||||
const { version } = require('socket.io-client/package.json')
|
||||
const clientSource = require.resolve('socket.io-client/dist/socket.io.js')
|
||||
|
||||
@@ -16,13 +15,14 @@ type PatchedServerOptions = ServerOptions & { cookie: { name: string | boolean }
|
||||
|
||||
class SocketIOServer extends SocketIOBaseServer {
|
||||
constructor (srv: http.Server, opts?: Partial<PatchedServerOptions>) {
|
||||
// in socket.io v3, they reduced down the max buffer size
|
||||
// from 100mb to 1mb, so we reset it back to the previous value
|
||||
//
|
||||
// previous commit for reference:
|
||||
// https://github.com/socketio/engine.io/blame/61b949259ed966ef6fc8bfd61f14d1a2ef06d319/lib/server.js#L29
|
||||
opts = opts ?? {}
|
||||
opts.maxHttpBufferSize = opts.maxHttpBufferSize ?? HUNDRED_MEGABYTES
|
||||
|
||||
// the maxHttpBufferSize is used to limit the message size sent over
|
||||
// the socket. Small values can be used to mitigate exposure to
|
||||
// denial of service attacks; the default as of v3.0 is 1MB.
|
||||
// because our server is local, we do not need to arbitrarily limit
|
||||
// the message size and can use the theoretical maximum value.
|
||||
opts.maxHttpBufferSize = opts.maxHttpBufferSize ?? buffer.constants.MAX_LENGTH
|
||||
|
||||
super(srv, opts)
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"circular-json": "0.5.9",
|
||||
"engine.io": "5.0.0",
|
||||
"engine.io-parser": "4.0.2",
|
||||
"socket.io": "4.0.1",
|
||||
"socket.io-client": "4.0.1"
|
||||
},
|
||||
@@ -34,6 +36,8 @@
|
||||
"types": "lib/socket.ts",
|
||||
"workspaces": {
|
||||
"nohoist": [
|
||||
"engine.io",
|
||||
"engine.io-parser",
|
||||
"socket.io",
|
||||
"socket.io/socket.io-parser",
|
||||
"socket.io-client",
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"node-sass-glob-importer": "5.3.2",
|
||||
"postcss-loader": "3.0.0",
|
||||
"resolve-url-loader": "3.1.0",
|
||||
"sass": "1.32.0",
|
||||
"sass": "1.44.0",
|
||||
"sass-loader": "10.1.0",
|
||||
"sinon-chai": "3.3.0",
|
||||
"webpack": "^4.44.2",
|
||||
|
||||
@@ -3,127 +3,127 @@ index 5e7f57e..5e764e9 100644
|
||||
--- a/node_modules/react-vtree/dist/es/Tree.d.ts
|
||||
+++ b/node_modules/react-vtree/dist/es/Tree.d.ts
|
||||
@@ -1,6 +1,9 @@
|
||||
import React, { Component, ComponentType, PropsWithChildren, PureComponent, ReactElement, ReactNode, Ref, RefCallback, RefObject } from 'react';
|
||||
import { Align, FixedSizeList, ListChildComponentProps, ListProps, VariableSizeList } from 'react-window';
|
||||
-import { DefaultTreeProps, DefaultTreeState } from './utils';
|
||||
+// import { DefaultTreeProps, DefaultTreeState } from './utils';
|
||||
+interface DefaultTreeProps {}
|
||||
+interface DefaultTreeState {}
|
||||
+
|
||||
export declare type NodeData = Readonly<{
|
||||
/**
|
||||
* Unique ID of the current node.
|
||||
import React, { Component, ComponentType, PropsWithChildren, PureComponent, ReactElement, ReactNode, Ref, RefCallback, RefObject } from 'react';
|
||||
import { Align, FixedSizeList, ListChildComponentProps, ListProps, VariableSizeList } from 'react-window';
|
||||
-import { DefaultTreeProps, DefaultTreeState } from './utils';
|
||||
+// import { DefaultTreeProps, DefaultTreeState } from './utils';
|
||||
+interface DefaultTreeProps {}
|
||||
+interface DefaultTreeState {}
|
||||
+
|
||||
export declare type NodeData = Readonly<{
|
||||
/**
|
||||
* Unique ID of the current node.
|
||||
diff --git a/node_modules/react-vtree/dist/es/utils.d.ts b/node_modules/react-vtree/dist/es/utils.d.ts
|
||||
index bb27d60..a4f244f 100644
|
||||
--- a/node_modules/react-vtree/dist/es/utils.d.ts
|
||||
+++ b/node_modules/react-vtree/dist/es/utils.d.ts
|
||||
@@ -1,41 +1,41 @@
|
||||
-/// <reference types="react" />
|
||||
-import { FixedSizeList } from 'react-window';
|
||||
-import type { NodeData, NodePublicState, NodeRecord, TreeCreatorOptions, TreeProps, TreeState, TypedListChildComponentData } from './Tree';
|
||||
-export declare type Mutable<T> = {
|
||||
- -readonly [P in keyof T]: T[P];
|
||||
-};
|
||||
-export declare type RequestIdleCallbackHandle = any;
|
||||
-export declare type RequestIdleCallbackOptions = Readonly<{
|
||||
- timeout: number;
|
||||
-}>;
|
||||
-export declare type RequestIdleCallbackDeadline = Readonly<{
|
||||
- didTimeout: boolean;
|
||||
- timeRemaining: () => number;
|
||||
-}>;
|
||||
-declare global {
|
||||
- const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
- const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
- interface Window {
|
||||
- requestIdleCallback: typeof requestIdleCallback;
|
||||
- cancelIdleCallback: typeof cancelIdleCallback;
|
||||
- }
|
||||
-}
|
||||
-export declare type DefaultTreeProps = TreeProps<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
-export declare type DefaultTreeState = TreeState<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
-export declare type DefaultTreeCreatorOptions = TreeCreatorOptions<NodeData, NodePublicState<NodeData>, DefaultTreeState>;
|
||||
-export declare const noop: () => void;
|
||||
-export declare const identity: <T>(value: T) => T;
|
||||
-export declare const createBasicRecord: <TData extends Readonly<{
|
||||
- id: string;
|
||||
- isOpenByDefault: boolean;
|
||||
-}>, TNodePublicState extends NodePublicState<TData>>(pub: TNodePublicState, parent?: NodeRecord<TNodePublicState> | null) => NodeRecord<TNodePublicState>;
|
||||
-export declare const getIdByIndex: <TData extends Readonly<{
|
||||
- id: string;
|
||||
- isOpenByDefault: boolean;
|
||||
-}>, TNodePublicState extends NodePublicState<TData>>(index: number, { getRecordData }: Readonly<{
|
||||
- component: import("react").ComponentType<Readonly<Pick<import("react-window").ListChildComponentProps, "style" | "isScrolling"> & TNodePublicState & {
|
||||
- treeData?: any;
|
||||
- }>>;
|
||||
- getRecordData: (index: number) => TNodePublicState;
|
||||
- treeData: any;
|
||||
-}>) => string;
|
||||
+// /// <reference types="react" />
|
||||
+// import { FixedSizeList } from 'react-window';
|
||||
+// import type { NodeData, NodePublicState, NodeRecord, TreeCreatorOptions, TreeProps, TreeState, TypedListChildComponentData } from './Tree';
|
||||
+// export declare type Mutable<T> = {
|
||||
+// -readonly [P in keyof T]: T[P];
|
||||
+// };
|
||||
+// export declare type RequestIdleCallbackHandle = any;
|
||||
+// export declare type RequestIdleCallbackOptions = Readonly<{
|
||||
+// timeout: number;
|
||||
+// }>;
|
||||
+// export declare type RequestIdleCallbackDeadline = Readonly<{
|
||||
+// didTimeout: boolean;
|
||||
+// timeRemaining: () => number;
|
||||
+// }>;
|
||||
+// declare global {
|
||||
+// const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
+// const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
+// interface Window {
|
||||
+// requestIdleCallback: typeof requestIdleCallback;
|
||||
+// cancelIdleCallback: typeof cancelIdleCallback;
|
||||
+// }
|
||||
+// }
|
||||
+// export declare type DefaultTreeProps = TreeProps<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
+// export declare type DefaultTreeState = TreeState<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
+// export declare type DefaultTreeCreatorOptions = TreeCreatorOptions<NodeData, NodePublicState<NodeData>, DefaultTreeState>;
|
||||
+// export declare const noop: () => void;
|
||||
+// export declare const identity: <T>(value: T) => T;
|
||||
+// export declare const createBasicRecord: <TData extends Readonly<{
|
||||
+// id: string;
|
||||
+// isOpenByDefault: boolean;
|
||||
+// }>, TNodePublicState extends NodePublicState<TData>>(pub: TNodePublicState, parent?: NodeRecord<TNodePublicState> | null) => NodeRecord<TNodePublicState>;
|
||||
+// export declare const getIdByIndex: <TData extends Readonly<{
|
||||
+// id: string;
|
||||
+// isOpenByDefault: boolean;
|
||||
+// }>, TNodePublicState extends NodePublicState<TData>>(index: number, { getRecordData }: Readonly<{
|
||||
+// component: import("react").ComponentType<Readonly<Pick<import("react-window").ListChildComponentProps, "style" | "isScrolling"> & TNodePublicState & {
|
||||
+// treeData?: any;
|
||||
+// }>>;
|
||||
+// getRecordData: (index: number) => TNodePublicState;
|
||||
+// treeData: any;
|
||||
+// }>) => string;
|
||||
-/// <reference types="react" />
|
||||
-import { FixedSizeList } from 'react-window';
|
||||
-import type { NodeData, NodePublicState, NodeRecord, TreeCreatorOptions, TreeProps, TreeState, TypedListChildComponentData } from './Tree';
|
||||
-export declare type Mutable<T> = {
|
||||
- -readonly [P in keyof T]: T[P];
|
||||
-};
|
||||
-export declare type RequestIdleCallbackHandle = any;
|
||||
-export declare type RequestIdleCallbackOptions = Readonly<{
|
||||
- timeout: number;
|
||||
-}>;
|
||||
-export declare type RequestIdleCallbackDeadline = Readonly<{
|
||||
- didTimeout: boolean;
|
||||
- timeRemaining: () => number;
|
||||
-}>;
|
||||
-declare global {
|
||||
- const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
- const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
- interface Window {
|
||||
- requestIdleCallback: typeof requestIdleCallback;
|
||||
- cancelIdleCallback: typeof cancelIdleCallback;
|
||||
- }
|
||||
-}
|
||||
-export declare type DefaultTreeProps = TreeProps<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
-export declare type DefaultTreeState = TreeState<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
-export declare type DefaultTreeCreatorOptions = TreeCreatorOptions<NodeData, NodePublicState<NodeData>, DefaultTreeState>;
|
||||
-export declare const noop: () => void;
|
||||
-export declare const identity: <T>(value: T) => T;
|
||||
-export declare const createBasicRecord: <TData extends Readonly<{
|
||||
- id: string;
|
||||
- isOpenByDefault: boolean;
|
||||
-}>, TNodePublicState extends NodePublicState<TData>>(pub: TNodePublicState, parent?: NodeRecord<TNodePublicState> | null) => NodeRecord<TNodePublicState>;
|
||||
-export declare const getIdByIndex: <TData extends Readonly<{
|
||||
- id: string;
|
||||
- isOpenByDefault: boolean;
|
||||
-}>, TNodePublicState extends NodePublicState<TData>>(index: number, { getRecordData }: Readonly<{
|
||||
- component: import("react").ComponentType<Readonly<Pick<import("react-window").ListChildComponentProps, "style" | "isScrolling"> & TNodePublicState & {
|
||||
- treeData?: any;
|
||||
- }>>;
|
||||
- getRecordData: (index: number) => TNodePublicState;
|
||||
- treeData: any;
|
||||
-}>) => string;
|
||||
+// /// <reference types="react" />
|
||||
+// import { FixedSizeList } from 'react-window';
|
||||
+// import type { NodeData, NodePublicState, NodeRecord, TreeCreatorOptions, TreeProps, TreeState, TypedListChildComponentData } from './Tree';
|
||||
+// export declare type Mutable<T> = {
|
||||
+// -readonly [P in keyof T]: T[P];
|
||||
+// };
|
||||
+// export declare type RequestIdleCallbackHandle = any;
|
||||
+// export declare type RequestIdleCallbackOptions = Readonly<{
|
||||
+// timeout: number;
|
||||
+// }>;
|
||||
+// export declare type RequestIdleCallbackDeadline = Readonly<{
|
||||
+// didTimeout: boolean;
|
||||
+// timeRemaining: () => number;
|
||||
+// }>;
|
||||
+// declare global {
|
||||
+// const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
+// const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
+// interface Window {
|
||||
+// requestIdleCallback: typeof requestIdleCallback;
|
||||
+// cancelIdleCallback: typeof cancelIdleCallback;
|
||||
+// }
|
||||
+// }
|
||||
+// export declare type DefaultTreeProps = TreeProps<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
+// export declare type DefaultTreeState = TreeState<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
+// export declare type DefaultTreeCreatorOptions = TreeCreatorOptions<NodeData, NodePublicState<NodeData>, DefaultTreeState>;
|
||||
+// export declare const noop: () => void;
|
||||
+// export declare const identity: <T>(value: T) => T;
|
||||
+// export declare const createBasicRecord: <TData extends Readonly<{
|
||||
+// id: string;
|
||||
+// isOpenByDefault: boolean;
|
||||
+// }>, TNodePublicState extends NodePublicState<TData>>(pub: TNodePublicState, parent?: NodeRecord<TNodePublicState> | null) => NodeRecord<TNodePublicState>;
|
||||
+// export declare const getIdByIndex: <TData extends Readonly<{
|
||||
+// id: string;
|
||||
+// isOpenByDefault: boolean;
|
||||
+// }>, TNodePublicState extends NodePublicState<TData>>(index: number, { getRecordData }: Readonly<{
|
||||
+// component: import("react").ComponentType<Readonly<Pick<import("react-window").ListChildComponentProps, "style" | "isScrolling"> & TNodePublicState & {
|
||||
+// treeData?: any;
|
||||
+// }>>;
|
||||
+// getRecordData: (index: number) => TNodePublicState;
|
||||
+// treeData: any;
|
||||
+// }>) => string;
|
||||
diff --git a/node_modules/react-vtree/dist/lib/utils.d.ts b/node_modules/react-vtree/dist/lib/utils.d.ts
|
||||
index bb27d60..d5ac63c 100644
|
||||
--- a/node_modules/react-vtree/dist/lib/utils.d.ts
|
||||
+++ b/node_modules/react-vtree/dist/lib/utils.d.ts
|
||||
@@ -12,14 +12,14 @@ export declare type RequestIdleCallbackDeadline = Readonly<{
|
||||
didTimeout: boolean;
|
||||
timeRemaining: () => number;
|
||||
}>;
|
||||
-declare global {
|
||||
- const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
- const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
- interface Window {
|
||||
- requestIdleCallback: typeof requestIdleCallback;
|
||||
- cancelIdleCallback: typeof cancelIdleCallback;
|
||||
- }
|
||||
-}
|
||||
+// declare global {
|
||||
+// const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
+// const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
+// interface Window {
|
||||
+// requestIdleCallback: typeof requestIdleCallback;
|
||||
+// cancelIdleCallback: typeof cancelIdleCallback;
|
||||
+// }
|
||||
+// }
|
||||
export declare type DefaultTreeProps = TreeProps<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
export declare type DefaultTreeState = TreeState<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
export declare type DefaultTreeCreatorOptions = TreeCreatorOptions<NodeData, NodePublicState<NodeData>, DefaultTreeState>;
|
||||
didTimeout: boolean;
|
||||
timeRemaining: () => number;
|
||||
}>;
|
||||
-declare global {
|
||||
- const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
- const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
- interface Window {
|
||||
- requestIdleCallback: typeof requestIdleCallback;
|
||||
- cancelIdleCallback: typeof cancelIdleCallback;
|
||||
- }
|
||||
-}
|
||||
+// declare global {
|
||||
+// const requestIdleCallback: (callback: (deadline: RequestIdleCallbackDeadline) => void, opts?: RequestIdleCallbackOptions) => RequestIdleCallbackHandle;
|
||||
+// const cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
|
||||
+// interface Window {
|
||||
+// requestIdleCallback: typeof requestIdleCallback;
|
||||
+// cancelIdleCallback: typeof cancelIdleCallback;
|
||||
+// }
|
||||
+// }
|
||||
export declare type DefaultTreeProps = TreeProps<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
export declare type DefaultTreeState = TreeState<NodeData, NodePublicState<NodeData>, FixedSizeList>;
|
||||
export declare type DefaultTreeCreatorOptions = TreeCreatorOptions<NodeData, NodePublicState<NodeData>, DefaultTreeState>;
|
||||
@@ -1,7 +1,7 @@
|
||||
/* eslint-disable no-console */
|
||||
const fs = require('fs-extra')
|
||||
const { join } = require('path')
|
||||
const globby = require('globby')
|
||||
const glob = require('glob')
|
||||
const os = require('os')
|
||||
const path = require('path')
|
||||
|
||||
@@ -13,9 +13,8 @@ module.exports = async function (params) {
|
||||
console.log(params.electronPlatformName)
|
||||
console.log('****************************')
|
||||
|
||||
const packages = await globby('packages/*/node_modules', {
|
||||
const packages = glob.sync('packages/*/node_modules', {
|
||||
cwd: params.packager.info._appDir,
|
||||
onlyFiles: false,
|
||||
})
|
||||
|
||||
const buildSubfoldersPerPlatform = {
|
||||
|
||||
@@ -68,25 +68,34 @@ export async function buildCypressApp (options: BuildCypressAppOpts) {
|
||||
// Copy Packages: We want to copy the package.json, files, and output
|
||||
log('#copyAllToDist')
|
||||
await packages.copyAllToDist(DIST_DIR)
|
||||
fs.copySync(path.join(CY_ROOT_DIR, 'patches'), path.join(DIST_DIR, 'patches'))
|
||||
|
||||
const jsonRoot = fs.readJSONSync(path.join(CY_ROOT_DIR, 'package.json'))
|
||||
|
||||
fs.writeJsonSync(meta.distDir('package.json'), _.omit(jsonRoot, [
|
||||
'scripts',
|
||||
const packageJsonContents = _.omit(jsonRoot, [
|
||||
'devDependencies',
|
||||
'lint-staged',
|
||||
'engines',
|
||||
]), { spaces: 2 })
|
||||
'scripts',
|
||||
])
|
||||
|
||||
fs.writeJsonSync(meta.distDir('package.json'), {
|
||||
...packageJsonContents,
|
||||
scripts: {
|
||||
postinstall: 'patch-package',
|
||||
},
|
||||
}, { spaces: 2 })
|
||||
|
||||
// Copy the yarn.lock file so we have a consistent install
|
||||
fs.copySync(path.join(CY_ROOT_DIR, 'yarn.lock'), meta.distDir('yarn.lock'))
|
||||
|
||||
// replaceLocalNpmVersions
|
||||
log('#replace local npm versions')
|
||||
const dirsSeen = await packages.replaceLocalNpmVersions(DIST_DIR)
|
||||
|
||||
// remove local npm dirs that aren't needed
|
||||
log('#remove local npm dirs that are not needed')
|
||||
await packages.removeLocalNpmDirs(DIST_DIR, dirsSeen)
|
||||
|
||||
log('#install production dependencies')
|
||||
execSync('yarn --production', {
|
||||
cwd: DIST_DIR,
|
||||
stdio: 'inherit',
|
||||
@@ -152,7 +161,7 @@ require('./packages/server')\
|
||||
log(`#testVersion ${meta.distDir()}`)
|
||||
await testVersion(meta.distDir(), version)
|
||||
|
||||
// testBuiltStaticAssets
|
||||
log('#testStaticAssets')
|
||||
await testStaticAssets(meta.distDir())
|
||||
|
||||
log('#removeCyAndBinFolders')
|
||||
|
||||
@@ -13,14 +13,6 @@ let car = null
|
||||
|
||||
// all the projects to trigger / run / change environment variables for
|
||||
const _PROVIDERS = {
|
||||
appVeyor: {
|
||||
main: 'cypress-io/cypress',
|
||||
win32: [
|
||||
'cypress-io/cypress-test-tiny',
|
||||
'cypress-io/cypress-test-example-repos',
|
||||
],
|
||||
},
|
||||
|
||||
circle: {
|
||||
main: 'cypress-io/cypress',
|
||||
linux: [
|
||||
@@ -35,6 +27,10 @@ const _PROVIDERS = {
|
||||
'cypress-io/cypress-test-tiny',
|
||||
'cypress-io/cypress-test-example-repos',
|
||||
],
|
||||
win32: [
|
||||
'cypress-io/cypress-test-tiny',
|
||||
'cypress-io/cypress-test-example-repos',
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
@@ -105,12 +101,6 @@ const awaitEachProjectAndProvider = function (projects, fn, filter = (val) => va
|
||||
}
|
||||
}
|
||||
|
||||
if (check.unemptyString(creds.appVeyorToken)) {
|
||||
providers.appVeyor = {
|
||||
appVeyorToken: creds.appVeyorToken,
|
||||
}
|
||||
}
|
||||
|
||||
const providerNames = Object.keys(providers)
|
||||
|
||||
console.log('configured providers', providerNames)
|
||||
@@ -133,7 +123,6 @@ const awaitEachProjectAndProvider = function (projects, fn, filter = (val) => va
|
||||
}
|
||||
|
||||
// do not trigger all projects if there is specific provider
|
||||
// for example appVeyor should be used for Windows testing
|
||||
const getFilterByProvider = function (providerName, platformName) {
|
||||
return (val) => {
|
||||
if (providerName && val.provider !== providerName) {
|
||||
@@ -226,14 +215,6 @@ Testing new Cypress version ${version}
|
||||
message += '\n'
|
||||
message += `Circle CI build url ${process.env.CIRCLE_BUILD_URL}`
|
||||
}
|
||||
|
||||
if (process.env.APPVEYOR) {
|
||||
const slug = process.env.APPVEYOR_PROJECT_SLUG
|
||||
const build = process.env.APPVEYOR_BUILD_ID
|
||||
|
||||
message += '\n'
|
||||
message += `AppVeyor CI ${slug} ${build}`
|
||||
}
|
||||
}
|
||||
|
||||
const defaultOptions = {
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
// but globby supports multiple wildcard search patterns 👏
|
||||
const globby = require('globby')
|
||||
|
||||
module.exports = {
|
||||
globby,
|
||||
}
|
||||
@@ -1,16 +1,17 @@
|
||||
import _ from 'lodash'
|
||||
import fs from 'fs-extra'
|
||||
import util from 'util'
|
||||
import path from 'path'
|
||||
// we wrap glob to handle EMFILE error
|
||||
import glob from 'glob'
|
||||
import la from 'lazy-ass'
|
||||
import check from 'check-more-types'
|
||||
import execa from 'execa'
|
||||
import debugLib from 'debug'
|
||||
|
||||
import externalUtils, { globby } from './3rd-party'
|
||||
|
||||
const debug = debugLib('cypress:binary')
|
||||
|
||||
const globAsync = util.promisify(glob)
|
||||
|
||||
const pathToPackageJson = function (packageFolder) {
|
||||
la(check.unemptyString(packageFolder), 'expected package path', packageFolder)
|
||||
|
||||
@@ -41,17 +42,13 @@ const createCLIExecutable = (command) => {
|
||||
|
||||
const yarn = createCLIExecutable('yarn')
|
||||
|
||||
export const runAllBuild = _.partial(yarn, ['lerna', 'run', 'build-prod', '--ignore', 'cli'])
|
||||
|
||||
export const runAllCleanJs = _.partial(yarn, ['lerna', 'run', 'clean-js', '--ignore', 'cli'])
|
||||
|
||||
export async function copyAllToDist (distDir: string) {
|
||||
await fs.ensureDir(distDir)
|
||||
|
||||
const started = new Date().valueOf()
|
||||
const globbed = await externalUtils.globby(['./packages/*', './npm/*'], {
|
||||
onlyFiles: false,
|
||||
})
|
||||
const globbed = await globAsync('./{packages,npm}/*')
|
||||
|
||||
for (const pkg of globbed) {
|
||||
// copies the package to dist
|
||||
@@ -74,11 +71,17 @@ export async function copyAllToDist (distDir: string) {
|
||||
const pkgFileMasks = [].concat(json.files || []).concat(json.main || [])
|
||||
|
||||
debug('for pkg %s have the following file masks %o', pkg, pkgFileMasks)
|
||||
const foundFileRelativeToPackageFolder = await externalUtils.globby(pkgFileMasks, {
|
||||
cwd: pkg, // search in the package folder
|
||||
absolute: false, // and return relative file paths
|
||||
followSymbolicLinks: false, // do not follow symlinks
|
||||
})
|
||||
let foundFileRelativeToPackageFolder = []
|
||||
|
||||
if (pkgFileMasks.length > 0) {
|
||||
const pattern = pkgFileMasks.length > 1 ? `{${pkgFileMasks.join(',')}}` : pkgFileMasks[0]
|
||||
|
||||
foundFileRelativeToPackageFolder = await globAsync(pattern, {
|
||||
cwd: pkg, // search in the package folder
|
||||
absolute: false, // and return relative file paths
|
||||
follow: false, // do not follow symlinks
|
||||
})
|
||||
}
|
||||
|
||||
console.log(`Copying ${pkg} to ${path.join(distDir, pkg)}`)
|
||||
|
||||
@@ -101,7 +104,6 @@ export async function copyAllToDist (distDir: string) {
|
||||
try {
|
||||
// Strip out dev-dependencies & scripts for everything in /packages so we can yarn install in there
|
||||
await fs.writeJson(path.join(distDir, pkg, 'package.json'), _.omit(json, [
|
||||
'scripts',
|
||||
'devDependencies',
|
||||
'lint-staged',
|
||||
'engines',
|
||||
@@ -123,12 +125,13 @@ export async function copyAllToDist (distDir: string) {
|
||||
export const replaceLocalNpmVersions = async function (basePath: string) {
|
||||
const visited = new Set<string>()
|
||||
|
||||
const pkgPaths = await globby('./packages/*/package.json', { cwd: basePath })
|
||||
const pkgPaths = await globAsync('./packages/*/', { cwd: basePath })
|
||||
|
||||
async function updatePackageJson (pkg: string) {
|
||||
const pkgJsonPath = path.join(basePath, pkg)
|
||||
const pkgPath = path.join(basePath, pkg)
|
||||
const pkgJsonPath = path.join(basePath, pkg, 'package.json')
|
||||
|
||||
visited.add(pkg)
|
||||
visited.add(pkgPath)
|
||||
const json = await fs.readJson(pkgJsonPath)
|
||||
|
||||
const { dependencies } = json
|
||||
@@ -145,15 +148,18 @@ export const replaceLocalNpmVersions = async function (basePath: string) {
|
||||
|
||||
const pkgName = depName.startsWith('@cypress/') ? depName.split('/')[1] : depName
|
||||
|
||||
json.dependencies[depName] = `file:${path.join(basePath, 'npm', pkgName)}`
|
||||
const localPkgPath = path.join(basePath, 'npm', pkgName)
|
||||
|
||||
json.dependencies[depName] = `file:${localPkgPath}`
|
||||
shouldWriteFile = true
|
||||
|
||||
if (!visited.has(depName)) {
|
||||
await updatePackageJson(`./npm/${pkgName}/package.json`)
|
||||
if (!visited.has(localPkgPath)) {
|
||||
await updatePackageJson(`./npm/${pkgName}`)
|
||||
}
|
||||
|
||||
shouldWriteFile = true
|
||||
}
|
||||
|
||||
if (shouldWriteFile) {
|
||||
await fs.writeJson(pkgJsonPath, json, { spaces: 2 })
|
||||
}
|
||||
@@ -166,9 +172,8 @@ export const replaceLocalNpmVersions = async function (basePath: string) {
|
||||
}
|
||||
|
||||
export async function removeLocalNpmDirs (distPath: string, except: string[]) {
|
||||
const toRemove = await globby(`${distPath}/npm/*`, {
|
||||
ignore: except.map((e) => path.join(distPath, e).replace('/package.json', '')),
|
||||
onlyDirectories: true,
|
||||
const toRemove = await globAsync(`${distPath}/npm/*/`, {
|
||||
ignore: except,
|
||||
})
|
||||
|
||||
for (const dir of toRemove) {
|
||||
|
||||
@@ -47,6 +47,34 @@ const testStaticAssets = async (buildResourcePath) => {
|
||||
['-ms-', 20],
|
||||
],
|
||||
}),
|
||||
testPackageStaticAssets({
|
||||
assetGlob: `${buildResourcePath}/packages/socket/node_modules/socket.io-parser/dist/binary.js`,
|
||||
badStrings: [
|
||||
'pack.data = _deconstructPacket(packetData, buffers);',
|
||||
],
|
||||
goodStrings: [
|
||||
'pack.data = _deconstructPacket(packetData, buffers, [], new WeakMap());',
|
||||
],
|
||||
}),
|
||||
testPackageStaticAssets({
|
||||
assetGlob: `${buildResourcePath}/packages/socket/node_modules/engine.io-parser/lib/encodePacket.browser.js`,
|
||||
badStrings: [
|
||||
'return callback(data instanceof ArrayBuffer ? data : data.buffer);',
|
||||
],
|
||||
goodStrings: [
|
||||
'This extra check is made because the "instanceof ArrayBuffer" check does not work',
|
||||
'return callback((data instanceof ArrayBuffer || isArrayBuffer(data)) ? data : data.buffer);',
|
||||
],
|
||||
}),
|
||||
testPackageStaticAssets({
|
||||
assetGlob: `${buildResourcePath}/node_modules/winston/lib/winston/common.js`,
|
||||
badStrings: [
|
||||
`if (target.padLevels) {`,
|
||||
],
|
||||
goodStrings: [
|
||||
`if (target.hasOwnProperty('padLevels') && target.padLevels) {`,
|
||||
],
|
||||
}),
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
@@ -29,10 +29,6 @@ const formHashFromEnvironment = function () {
|
||||
return `circle-${env.CIRCLE_BRANCH}-${env.CIRCLE_SHA1}`
|
||||
}
|
||||
|
||||
if (env.APPVEYOR) {
|
||||
return `appveyor-${env.APPVEYOR_REPO_BRANCH}-${env.APPVEYOR_REPO_COMMIT}`
|
||||
}
|
||||
|
||||
throw new Error('Do not know how to form unique build hash on this CI')
|
||||
}
|
||||
|
||||
|
||||
@@ -1,29 +1,3 @@
|
||||
const os = require('os')
|
||||
const assert = require('assert')
|
||||
|
||||
// TODO make this check a 3rd party little tool
|
||||
|
||||
const isWindows = () => {
|
||||
return os.platform() === 'win32'
|
||||
}
|
||||
|
||||
// if we're windows + in appveyor...
|
||||
if (isWindows() && process.env.APPVEYOR) {
|
||||
// check to ensure that the cpuArch + nodeArch are in sync
|
||||
const cpuArch = process.env.Platform
|
||||
const nodeArch = os.arch()
|
||||
|
||||
const getErrMsg = (expectedArch) => {
|
||||
return `Appveyor CPU arch is set to: '${cpuArch}' but the node version that is being used is running: '${nodeArch}'. Expected it to equal: '${expectedArch}'`
|
||||
}
|
||||
|
||||
assert.equal(
|
||||
os.arch(),
|
||||
'x64',
|
||||
getErrMsg('x64'),
|
||||
)
|
||||
}
|
||||
|
||||
// we want to ensure we are building using the same major version
|
||||
// as the one specified in ../.node-version file
|
||||
const read = require('fs').readFileSync
|
||||
@@ -45,3 +19,6 @@ if (nodeVersionNeeded[0] !== nodeVersion[0]) {
|
||||
/* eslint-enable no-console */
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('✅ current Node version of %s matches the version specified in the .node-version file', process.versions.node)
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
/* eslint-disable no-console */
|
||||
const globby = require('globby')
|
||||
const glob = require('glob')
|
||||
const path = require('path')
|
||||
const fsExtra = require('fs-extra')
|
||||
const minimist = require('minimist')
|
||||
const crypto = require('crypto')
|
||||
const fs = require('fs')
|
||||
const stringify = require('fast-json-stable-stringify')
|
||||
|
||||
const rootPackageJson = require('../package.json')
|
||||
|
||||
const opts = minimist(process.argv.slice(2))
|
||||
@@ -21,9 +22,11 @@ async function circleCache () {
|
||||
}
|
||||
}
|
||||
|
||||
const BASE_DIR = path.join(__dirname, '..')
|
||||
const CACHE_DIR = path.join(BASE_DIR, 'globbed_node_modules')
|
||||
const p = (str) => path.join(BASE_DIR, str)
|
||||
// On Windows, both the forward slash (/) and backward slash (\) are accepted as path segment separators
|
||||
// using forward slashes to match the returned globbed file path separators
|
||||
const BASE_DIR = path.join(__dirname, '..').replaceAll(/\\/g, '/')
|
||||
const CACHE_DIR = `${BASE_DIR}/globbed_node_modules`
|
||||
const p = (str) => `${BASE_DIR}/${str}`
|
||||
|
||||
const workspacePaths = rootPackageJson.workspaces.packages
|
||||
const packageGlobs = workspacePaths.filter((s) => s.endsWith('/*'))
|
||||
@@ -32,17 +35,12 @@ const packageGlobs = workspacePaths.filter((s) => s.endsWith('/*'))
|
||||
// Otherwise, adding/editing a patch will not invalidate the CI cache we have for the yarn install
|
||||
async function cacheKey () {
|
||||
const yarnLocks = [p('yarn.lock')]
|
||||
const patchFiles = await globby(p('**/*.patch'), {
|
||||
ignore: ['**/node_modules/**', '**/*_node_modules/**'],
|
||||
})
|
||||
// TODO: base on workspaces or lerna
|
||||
const packageJsons = await globby([
|
||||
p('package.json'),
|
||||
...workspacePaths.map((dir) => p(`${dir}/package.json`)),
|
||||
], {
|
||||
const patchFiles = glob.sync(p('**/*.patch'), {
|
||||
ignore: ['**/node_modules/**', '**/*_node_modules/**'],
|
||||
})
|
||||
|
||||
const packageJsons = glob.sync(`${BASE_DIR}/{.,${workspacePaths.join(',')}}/package.json`)
|
||||
|
||||
// Concat the stable stringify of all of the package.json dependencies that make up
|
||||
const hashedPackageDeps = packageJsons.sort().map((abs) => require(abs)).map(
|
||||
({ name, dependencies, devDependencies, peerDependencies }) => {
|
||||
@@ -64,10 +62,7 @@ async function cacheKey () {
|
||||
// Need to dynamically unpack and re-assemble all of the node_modules directories
|
||||
// https://discuss.circleci.com/t/dynamic-or-programmatic-caching-of-directories/1455
|
||||
async function prepareCircleCache () {
|
||||
const paths = await globby(
|
||||
packageGlobs.map((dir) => p(`${dir}/node_modules`)),
|
||||
{ onlyDirectories: true },
|
||||
)
|
||||
const paths = glob.sync(p(`{${packageGlobs.join(',')}}/node_modules/`))
|
||||
|
||||
await Promise.all(
|
||||
paths.map(async (src) => {
|
||||
@@ -84,10 +79,11 @@ async function prepareCircleCache () {
|
||||
}
|
||||
|
||||
async function unpackCircleCache () {
|
||||
const paths = await globby(
|
||||
p(`globbed_node_modules/*/*`),
|
||||
{ onlyDirectories: true },
|
||||
)
|
||||
const paths = glob.sync(p('globbed_node_modules/*/*/'))
|
||||
|
||||
if (paths.length === 0) {
|
||||
throw new Error('Should have found globbed node_modules to unpack')
|
||||
}
|
||||
|
||||
await Promise.all(
|
||||
paths.map(async (src) => {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
/* eslint-disable no-console */
|
||||
|
||||
// See ../guides/next-version.md for documentation.
|
||||
|
||||
const semver = require('semver')
|
||||
const Bluebird = require('bluebird')
|
||||
const bumpCb = require('conventional-recommended-bump')
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
# loads previously installed NVM
|
||||
# USE:
|
||||
# - run:
|
||||
# name: check Node version
|
||||
# command: |
|
||||
# . ./scripts/load-nvm.sh
|
||||
# yarn check-node-version
|
||||
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||
export NODE_VERSION=$(cat .node-version)
|
||||
@@ -9,6 +9,8 @@ const { getInstallJson } = require('@cypress/commit-message-install')
|
||||
|
||||
/* eslint-disable no-console */
|
||||
|
||||
// See ../guides/testing-other-projects.md for documentation.
|
||||
|
||||
const { npm, binary } = getNameAndBinary(process.argv)
|
||||
|
||||
la(is.unemptyString(npm), 'missing npm url')
|
||||
@@ -112,17 +114,6 @@ const getStatusAndMessage = (projectRepoName) => {
|
||||
`
|
||||
}
|
||||
|
||||
if (process.env.APPVEYOR) {
|
||||
const account = process.env.APPVEYOR_ACCOUNT_NAME
|
||||
const slug = process.env.APPVEYOR_PROJECT_SLUG
|
||||
const build = process.env.APPVEYOR_BUILD_NUMBER
|
||||
|
||||
message += '\n'
|
||||
message += stripIndent`
|
||||
AppVeyor: ${account}/${slug} ${build}
|
||||
`
|
||||
}
|
||||
|
||||
console.log('commit message:')
|
||||
console.log(message)
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ const { expect } = chai
|
||||
const packages = require('../../../binary/util/packages')
|
||||
const { transformRequires, rewritePackageNames } = require('../../../binary/util/transform-requires')
|
||||
const { testPackageStaticAssets } = require('../../../binary/util/testStaticAssets')
|
||||
const externalUtils = require('../../../binary/util/3rd-party')
|
||||
|
||||
global.beforeEach(() => {
|
||||
mockfs.restore()
|
||||
@@ -41,19 +40,6 @@ describe('packages', () => {
|
||||
},
|
||||
})
|
||||
|
||||
const globbyStub = sinon.stub(externalUtils, 'globby')
|
||||
|
||||
globbyStub
|
||||
.withArgs(['./packages/*', './npm/*'])
|
||||
.resolves(['./packages/coffee'])
|
||||
|
||||
globbyStub
|
||||
.withArgs(['lib', 'src/main.js'])
|
||||
.resolves([
|
||||
'lib/foo.js',
|
||||
'src/main.js',
|
||||
])
|
||||
|
||||
const destinationFolder = os.tmpdir()
|
||||
|
||||
debug('destination folder %s', destinationFolder)
|
||||
@@ -112,18 +98,6 @@ describe('transformRequires', () => {
|
||||
},
|
||||
})
|
||||
|
||||
sinon.stub(externalUtils, 'globby')
|
||||
.withArgs([
|
||||
'build/linux/Cypress/resources/app/packages/**/*.js',
|
||||
'build/linux/Cypress/resources/app/npm/**/*.js',
|
||||
])
|
||||
.resolves([
|
||||
'build/linux/Cypress/resources/app/packages/foo/src/main.js',
|
||||
'build/linux/Cypress/resources/app/packages/foo/lib/foo.js',
|
||||
'build/linux/Cypress/resources/app/packages/bar/src/main.js',
|
||||
'build/linux/Cypress/resources/app/packages/bar/lib/foo.js',
|
||||
])
|
||||
|
||||
// should return number of transformed requires
|
||||
await expect(transformRequires(buildRoot)).to.eventually.eq(2)
|
||||
|
||||
@@ -161,18 +135,6 @@ describe('transformRequires', () => {
|
||||
},
|
||||
})
|
||||
|
||||
sinon.stub(externalUtils, 'globby')
|
||||
.withArgs([
|
||||
'build/linux/Cypress/resources/app/packages/**/*.js',
|
||||
'build/linux/Cypress/resources/app/npm/**/*.js',
|
||||
])
|
||||
.resolves([
|
||||
'build/linux/Cypress/resources/app/packages/foo/src/main.js',
|
||||
'build/linux/Cypress/resources/app/packages/foo/lib/foo.js',
|
||||
'build/linux/Cypress/resources/app/packages/bar/src/main.js',
|
||||
'build/linux/Cypress/resources/app/packages/bar/lib/foo.js',
|
||||
])
|
||||
|
||||
await transformRequires(buildRoot)
|
||||
|
||||
snapshot(getFs())
|
||||
@@ -323,7 +285,7 @@ const getFs = () => {
|
||||
let nextDepth = null
|
||||
|
||||
if (d !== null) {
|
||||
if (d === -1) {
|
||||
if (d < 0) {
|
||||
nextDepth = d + 1
|
||||
} else if (!(d > cwd.length) && key === cwd[d]) {
|
||||
key = 'foo'
|
||||
@@ -345,5 +307,8 @@ const getFs = () => {
|
||||
}))
|
||||
}
|
||||
|
||||
return recurse({ root: mockfs.getMockRoot() }, -1).root
|
||||
// ignore C:// when on windows
|
||||
const depth = process.env.PLATFORM === 'windows' ? -2 : -1
|
||||
|
||||
return recurse({ root: mockfs.getMockRoot() }, depth).root
|
||||
}
|
||||
|
||||
@@ -68,9 +68,7 @@ const shorten = (s) => {
|
||||
* Grabs the full commit SHA and its short version from CI environment variables
|
||||
*/
|
||||
const getShortCommit = () => {
|
||||
const sha =
|
||||
process.env.APPVEYOR_REPO_COMMIT ||
|
||||
process.env.CIRCLE_SHA1
|
||||
const sha = process.env.CIRCLE_SHA1
|
||||
|
||||
if (sha) {
|
||||
return {
|
||||
@@ -87,10 +85,6 @@ const getCIName = () => {
|
||||
if (process.env.CIRCLECI) {
|
||||
return 'Circle'
|
||||
}
|
||||
|
||||
if (process.env.APPVEYOR) {
|
||||
return 'AppVeyor'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -101,17 +95,6 @@ const getCIBuildUrl = () => {
|
||||
// https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables
|
||||
return process.env.CIRCLE_BUILD_URL
|
||||
}
|
||||
|
||||
if (process.env.APPVEYOR) {
|
||||
// https://www.appveyor.com/docs/environment-variables/
|
||||
// there is no single url, but we can form one
|
||||
// looks like this
|
||||
// https://ci.appveyor.com/project/cypress-io/cypress/builds/25882716/job/7iv75s2vjt5w4usf
|
||||
return `${process.env.APPVEYOR_URL}/project/${
|
||||
process.env.APPVEYOR_ACCOUNT_NAME}/${process.env.APPVEYOR_PROJECT_SLUG
|
||||
}/builds/${process.env.APPVEYOR_BUILD_ID
|
||||
}/job/${process.env.APPVEYOR_JOB_ID}`
|
||||
}
|
||||
}
|
||||
|
||||
const seconds = (s) => s * 1000
|
||||
|
||||
@@ -1,215 +0,0 @@
|
||||
/* eslint-disable no-console */
|
||||
|
||||
const _ = require('lodash')
|
||||
const minimist = require('minimist')
|
||||
const Promise = require('bluebird')
|
||||
const retry = require('bluebird-retry')
|
||||
const got = require('got')
|
||||
// always print the debug logs
|
||||
const debug = require('debug')('*')
|
||||
|
||||
const { seconds, minutes } = require('./utils')
|
||||
|
||||
// we expect CircleCI to set the current polling job name
|
||||
const jobName = process.env.CIRCLE_JOB || 'wait-on-circle-jobs'
|
||||
|
||||
const workflowId = process.env.CIRCLE_WORKFLOW_ID
|
||||
|
||||
const getAuth = () => `${process.env.CIRCLE_TOKEN}:`
|
||||
|
||||
const verifyCI = () => {
|
||||
if (!process.env.CIRCLE_TOKEN) {
|
||||
console.error('Cannot find CIRCLE_TOKEN')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
if (!process.env.CIRCLE_WORKFLOW_ID) {
|
||||
console.error('Cannot find CIRCLE_WORKFLOW_ID')
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const getWorkflow = async (workflowId) => {
|
||||
const auth = getAuth()
|
||||
const url = `https://${auth}@circleci.com/api/v2/workflow/${workflowId}`
|
||||
const response = await got(url).json()
|
||||
|
||||
// returns something like
|
||||
// {
|
||||
// pipeline_id: '5b937e8b-6138-41ad-b8d0-1c1969c4dad1',
|
||||
// id: '566ffe9a-62d4-45cd-9a27-9882139e0121',
|
||||
// name: 'linux',
|
||||
// project_slug: 'gh/cypress-io/cypress',
|
||||
// status: 'failed',
|
||||
// started_by: '45ae8c6a-4686-4e71-a078-fb7a3b9d9e59',
|
||||
// pipeline_number: 12461,
|
||||
// created_at: '2020-07-20T19:45:41Z',
|
||||
// stopped_at: '2020-07-20T20:06:54Z'
|
||||
// }
|
||||
|
||||
return response
|
||||
}
|
||||
|
||||
/**
|
||||
* Job status
|
||||
* - blocked (has not run yet)
|
||||
* - running (currently running)
|
||||
* - failed | success
|
||||
*/
|
||||
const getJobStatus = async (workflowId) => {
|
||||
const auth = getAuth()
|
||||
// typo at https://circleci.com/docs/2.0/api-intro/
|
||||
// to retrieve all jobs, the url is "/workflow/:id/job"
|
||||
const url = `https://${auth}@circleci.com/api/v2/workflow/${workflowId}/job`
|
||||
const response = await got(url).json()
|
||||
|
||||
// returns something like
|
||||
// {
|
||||
// next_page_token: null,
|
||||
// items: [
|
||||
// {
|
||||
// dependencies: [],
|
||||
// job_number: 400959,
|
||||
// id: '7021bcc7-90c1-47d9-bf99-c0372a4f8f49',
|
||||
// started_at: '2020-07-20T19:45:46Z',
|
||||
// name: 'build',
|
||||
// project_slug: 'gh/cypress-io/cypress',
|
||||
// status: 'success',
|
||||
// type: 'build',
|
||||
// stopped_at: '2020-07-20T19:50:07Z'
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
return response
|
||||
}
|
||||
|
||||
const waitForAllJobs = async (jobNames, workflowId) => {
|
||||
let response
|
||||
|
||||
try {
|
||||
response = await getJobStatus(workflowId)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// if a job is pending, its status will be "blocked"
|
||||
const blockedJobs = _.filter(response.items, { status: 'blocked' })
|
||||
const failedJobs = _.filter(response.items, { status: 'failed' })
|
||||
const runningJobs = _.filter(response.items, { status: 'running' })
|
||||
|
||||
const blockedJobNames = _.map(blockedJobs, 'name')
|
||||
const runningJobNames = _.map(runningJobs, 'name')
|
||||
|
||||
debug('failed jobs %o', _.map(failedJobs, 'name'))
|
||||
debug('blocked jobs %o', blockedJobNames)
|
||||
debug('running jobs %o', runningJobNames)
|
||||
|
||||
if (!runningJobs.length || (runningJobs.length === 1 && runningJobs[0].name === jobName)) {
|
||||
// there are no more jobs to run, or this is the last running job
|
||||
console.log('all jobs are done, finishing this job')
|
||||
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
const futureOrRunning = _.union(blockedJobs, runningJobNames)
|
||||
const jobsToWaitFor = _.intersection(jobNames, futureOrRunning)
|
||||
|
||||
debug('jobs to wait for %o', jobsToWaitFor)
|
||||
|
||||
if (!jobsToWaitFor.length) {
|
||||
console.log('No more jobs to wait for!')
|
||||
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
return Promise.reject(new Error('Jobs have not finished'))
|
||||
}
|
||||
|
||||
const waitForJobToPass = Promise.method(async (jobName, workflow = workflowId) => {
|
||||
verifyCI()
|
||||
|
||||
let response
|
||||
|
||||
try {
|
||||
response = await getJobStatus(workflow)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const job = _.find(response.items, { name: jobName })
|
||||
|
||||
if (!job) {
|
||||
return Promise.reject(new Error('Job not found'))
|
||||
}
|
||||
|
||||
const { status } = job
|
||||
|
||||
if (status === 'success') {
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
if (status === 'failed') {
|
||||
return Promise.reject(new Error('Job failed'))
|
||||
}
|
||||
|
||||
await Promise.delay(seconds(30))
|
||||
|
||||
return waitForJobToPass(jobName, workflow)
|
||||
})
|
||||
|
||||
const main = () => {
|
||||
verifyCI()
|
||||
|
||||
const args = minimist(process.argv.slice(2), { boolean: false })
|
||||
|
||||
const jobNames = _
|
||||
.chain(args['job-names'])
|
||||
.split(',')
|
||||
.without('true')
|
||||
.map(_.trim)
|
||||
.compact()
|
||||
.value()
|
||||
|
||||
if (!jobNames.length) {
|
||||
console.error('Missing argument: --job-names')
|
||||
console.error('You must pass a comma separated list of Circle CI job names to wait for.')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
debug('received circle jobs: %o', jobNames)
|
||||
|
||||
// finished, has one failed job
|
||||
// const workflowId = '566ffe9a-62d4-45cd-9a27-9882139e0121'
|
||||
// pending workflow
|
||||
// jobs that have not run have "status: 'blocked'"
|
||||
|
||||
// getWorkflow(workflowId).then(console.log, console.error)
|
||||
// getWorkflowJobs(workflowId).then(console.log, console.error)
|
||||
|
||||
// https://github.com/demmer/bluebird-retry
|
||||
retry(waitForAllJobs.bind(null, jobNames, workflowId), {
|
||||
timeout: minutes(30), // max time for this job
|
||||
interval: seconds(30), // poll intervals
|
||||
max_interval: seconds(30),
|
||||
}).then(() => {
|
||||
console.log('all done')
|
||||
}, (err) => {
|
||||
console.error(err)
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
// getJobStatus(workflowId).then(console.log, console.error)
|
||||
}
|
||||
|
||||
// execute main function if called from command line
|
||||
if (require.main === module) {
|
||||
main()
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
minutes,
|
||||
waitForJobToPass,
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/* eslint-disable no-console */
|
||||
// @ts-check
|
||||
|
||||
// builds Windows binary on AppVeyor CI
|
||||
// but only on the right branch
|
||||
|
||||
const shell = require('shelljs')
|
||||
const os = require('os')
|
||||
const path = require('path')
|
||||
const fs = require('fs')
|
||||
|
||||
shell.set('-v') // verbose
|
||||
shell.set('-e') // any error is fatal
|
||||
|
||||
// see what variables AppVeyor provides
|
||||
// https://www.appveyor.com/docs/environment-variables/
|
||||
|
||||
const isRightBranch = () => {
|
||||
const branch =
|
||||
process.env.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH ||
|
||||
process.env.APPVEYOR_REPO_BRANCH
|
||||
const shouldForceBinaryBuild = (
|
||||
process.env.APPVEYOR_REPO_COMMIT_MESSAGE || ''
|
||||
).includes('[build binary]')
|
||||
|
||||
const branchesToBuildBinary = ['develop', 'remove-win-32-support', 'tgriesser/build/root-yarn-install']
|
||||
|
||||
return branchesToBuildBinary.includes(branch) || shouldForceBinaryBuild
|
||||
}
|
||||
|
||||
const isForkedPullRequest = () => {
|
||||
const repoName = process.env.APPVEYOR_PULL_REQUEST_HEAD_REPO_NAME
|
||||
|
||||
return repoName && repoName !== 'cypress-io/cypress'
|
||||
}
|
||||
|
||||
const shouldBuildBinary = () => {
|
||||
return isRightBranch() && !isForkedPullRequest()
|
||||
}
|
||||
|
||||
if (!shouldBuildBinary()) {
|
||||
console.log('should not build binary')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
console.log('building Windows binary')
|
||||
const pkgPath = path.join(__dirname, '../package.json')
|
||||
const pkg = JSON.parse(fs.readFileSync(pkgPath).toString())
|
||||
const { version } = pkg
|
||||
const filename = `cypress-v${version}.tgz`
|
||||
|
||||
console.log('building version', version)
|
||||
|
||||
shell.exec(
|
||||
`node scripts/binary.js upload-npm-package --file cli/build/${filename} --version ${version}`,
|
||||
)
|
||||
|
||||
const arch = os.arch()
|
||||
|
||||
shell.echo(`Building for win32 [${arch}]...`)
|
||||
|
||||
shell.cat('npm-package-url.json')
|
||||
shell.exec(`yarn binary-build --platform windows --version ${version}`)
|
||||
|
||||
// make sure we are not including dev dependencies accidentally
|
||||
// TODO how to get the server package folder?
|
||||
const serverPackageFolder = path.join(os.tmpdir(), 'cypress-build', os.platform(), 'dist')
|
||||
|
||||
shell.echo(`Checking prod and dev dependencies in ${serverPackageFolder}`)
|
||||
shell.exec('yarn list --prod --depth 0 || true')
|
||||
shell.exec('yarn list --prod --depth 0 || true', {
|
||||
cwd: serverPackageFolder,
|
||||
})
|
||||
|
||||
const result = shell.exec('yarn list --dev --depth 0 || true', {
|
||||
cwd: serverPackageFolder,
|
||||
})
|
||||
|
||||
if (result.stdout.includes('nodemon')) {
|
||||
console.error('Hmm, server package includes dev dependency "coveralls"')
|
||||
console.error(
|
||||
'which means somehow we are including dev dependencies in the output bundle',
|
||||
)
|
||||
|
||||
console.error('see https://github.com/cypress-io/cypress/issues/2896')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if we are building a pull request
|
||||
*/
|
||||
const isPullRequest = () => {
|
||||
return Boolean(process.env.APPVEYOR_PULL_REQUEST_NUMBER)
|
||||
}
|
||||
|
||||
if (isPullRequest()) {
|
||||
console.log('This is a pull request, skipping uploading binary')
|
||||
} else {
|
||||
console.log('Zipping and upload binary')
|
||||
|
||||
shell.exec('yarn binary-zip')
|
||||
shell.ls('-l', '*.zip')
|
||||
shell.exec(
|
||||
`node scripts/binary.js upload-unique-binary --file cypress.zip --version ${version}`,
|
||||
)
|
||||
|
||||
shell.cat('binary-url.json')
|
||||
shell.exec(
|
||||
'node scripts/add-install-comment.js --npm npm-package-url.json --binary binary-url.json',
|
||||
)
|
||||
|
||||
shell.exec(
|
||||
'node scripts/test-other-projects.js --npm npm-package-url.json --binary binary-url.json --provider appVeyor',
|
||||
)
|
||||
}
|
||||
@@ -273,14 +273,15 @@ export const STDOUT_DURATION_IN_TABLES_RE = /(\s+?)(\d+ms|\d+:\d+:?\d+)/g
|
||||
const diffRe = /Difference\n-{10}\n([\s\S]*)\n-{19}\nSaved snapshot text/m
|
||||
const expectedAddedVideoSnapshotLines = [
|
||||
'Warning: We failed processing this video.',
|
||||
'This error will not alter the exit code.', '',
|
||||
'This error will not alter the exit code.',
|
||||
'TimeoutError: operation timed out',
|
||||
'[stack trace lines]', '', '',
|
||||
'[stack trace lines]',
|
||||
]
|
||||
const expectedDeletedVideoSnapshotLines = [
|
||||
'(Video)', '',
|
||||
'(Video)',
|
||||
'- Started processing: Compressing to 32 CRF',
|
||||
]
|
||||
const sometimesAddedSpacingLine = ''
|
||||
const sometimesAddedVideoSnapshotLine = '│ Video: false │'
|
||||
const sometimesDeletedVideoSnapshotLine = '│ Video: true │'
|
||||
|
||||
@@ -303,8 +304,8 @@ const isVideoSnapshotError = (err: Error) => {
|
||||
if (line.charAt(0) === '-') deleted.push(line.slice(1).trim())
|
||||
}
|
||||
|
||||
_.pull(added, sometimesAddedVideoSnapshotLine)
|
||||
_.pull(deleted, sometimesDeletedVideoSnapshotLine)
|
||||
_.pull(added, sometimesAddedVideoSnapshotLine, sometimesAddedSpacingLine)
|
||||
_.pull(deleted, sometimesDeletedVideoSnapshotLine, sometimesAddedSpacingLine)
|
||||
|
||||
return _.isEqual(added, expectedAddedVideoSnapshotLines) && _.isEqual(deleted, expectedDeletedVideoSnapshotLines)
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ describe('websockets', () => {
|
||||
it('does not crash', () => {
|
||||
cy.visit('http://localhost:3038/foo')
|
||||
cy.log('should not crash on ECONNRESET websocket upgrade')
|
||||
cy.window().then((win) => {
|
||||
cy.window().then({ timeout: 10000 }, (win) => {
|
||||
// see https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent
|
||||
return Cypress.Promise.all([
|
||||
shouldCloseUrlWithCode(win, 'ws://localhost:3038/websocket', 1006),
|
||||
|
||||
382
yarn.lock
382
yarn.lock
@@ -15,12 +15,12 @@
|
||||
"@angular-devkit/core" "11.2.12"
|
||||
rxjs "6.6.3"
|
||||
|
||||
"@angular-devkit/architect@^0.1202.10":
|
||||
version "0.1202.10"
|
||||
resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.10.tgz#6aae8e97ea209949507443cd9c414be94d258813"
|
||||
integrity sha512-/sLgtXaFsNouxub5M/bQ2sBkiMIlPubuz6QMh+pA2jia82vJ3hcRMt4AnJTXuXpVY+aew4FiG0i9nt/8HETQsw==
|
||||
"@angular-devkit/architect@0.1202.13", "@angular-devkit/architect@^0.1202.10":
|
||||
version "0.1202.13"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1202.13.tgz#b9b883d62f628a6b31ce071da91e268f61da00ef"
|
||||
integrity sha512-LXgiidXwBgyWPqqWK4xR1/kCPQTMTzG5w+s7+LvENUZwbcdl6CKrOMjfgjo6WPr6yeq+WWQvPCD4pZ6nXRTm7A==
|
||||
dependencies:
|
||||
"@angular-devkit/core" "12.2.10"
|
||||
"@angular-devkit/core" "12.2.13"
|
||||
rxjs "6.6.7"
|
||||
|
||||
"@angular-devkit/build-angular@0.1102.12":
|
||||
@@ -133,7 +133,7 @@
|
||||
rxjs "6.6.3"
|
||||
source-map "0.7.3"
|
||||
|
||||
"@angular-devkit/core@12.2.10", "@angular-devkit/core@^12.2.10":
|
||||
"@angular-devkit/core@12.2.10":
|
||||
version "12.2.10"
|
||||
resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.10.tgz#3da62eceef3904f92cd3f860618b4ae513029ce2"
|
||||
integrity sha512-0qhmS7Qvl0hiRVTHxEC/ipFAfzYofPstw0ZITDpEMw+pgHlOZolOlnFrv8LyOXWNqlSIH5fS9D3WF7Hpm7ApYA==
|
||||
@@ -145,6 +145,18 @@
|
||||
rxjs "6.6.7"
|
||||
source-map "0.7.3"
|
||||
|
||||
"@angular-devkit/core@12.2.13", "@angular-devkit/core@^12.2.10":
|
||||
version "12.2.13"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.2.13.tgz#db3929d1bfce71010b37fb7c4e6c33ef80a4f35f"
|
||||
integrity sha512-9csMF0p+lTvlWnutxxTZ/+pDRMIbXk/TV4MGLbcqUPPfeG3dCRwErns73xLuMTwp9qO/KCLkFqNaM6cGOoqsDA==
|
||||
dependencies:
|
||||
ajv "8.6.2"
|
||||
ajv-formats "2.1.0"
|
||||
fast-json-stable-stringify "2.1.0"
|
||||
magic-string "0.25.7"
|
||||
rxjs "6.6.7"
|
||||
source-map "0.7.3"
|
||||
|
||||
"@angular-devkit/core@8.0.0":
|
||||
version "8.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.0.0.tgz#a0ca65d8d0f928db9288316b1f3346d21f722213"
|
||||
@@ -177,7 +189,7 @@
|
||||
ora "5.3.0"
|
||||
rxjs "6.6.3"
|
||||
|
||||
"@angular-devkit/schematics@12.2.10", "@angular-devkit/schematics@^12.2.10":
|
||||
"@angular-devkit/schematics@12.2.10":
|
||||
version "12.2.10"
|
||||
resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.10.tgz#b8d4031053fd76d93caa7f33aeeb67383e37f0ab"
|
||||
integrity sha512-oQ2EWdkEDE+eAttHeviXsvBi85PsntQT+IffjKUZdbQU+Leuk/pKUpTeea1YosU1p4Cz3PKYF+P/Nl5Jy3B7IQ==
|
||||
@@ -186,6 +198,15 @@
|
||||
ora "5.4.1"
|
||||
rxjs "6.6.7"
|
||||
|
||||
"@angular-devkit/schematics@12.2.13", "@angular-devkit/schematics@^12.2.10":
|
||||
version "12.2.13"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.2.13.tgz#6464d86fa3ccd0efb5ead46c793cef9ec45c7758"
|
||||
integrity sha512-LQTv72R5Ma1uowMEeii2wIoDWI4bYQyZvunqPy9jRveBTjli2yVwwcOziGCVyttwlYs46bSdxThgeEvVIako2w==
|
||||
dependencies:
|
||||
"@angular-devkit/core" "12.2.13"
|
||||
ora "5.4.1"
|
||||
rxjs "6.6.7"
|
||||
|
||||
"@angular-devkit/schematics@8.0.0":
|
||||
version "8.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.0.0.tgz#53d14646c6286b0397417990fc83e3e9a6ecf233"
|
||||
@@ -245,6 +266,31 @@
|
||||
universal-analytics "0.4.23"
|
||||
uuid "8.3.2"
|
||||
|
||||
"@angular/cli@^12":
|
||||
version "12.2.13"
|
||||
resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-12.2.13.tgz#ca586c14a6f83bb4390875be0a0fa709b9a2ae29"
|
||||
integrity sha512-Yz6MuwdxxP6U2i8iRuCSNZeJxlLDPshT/joymCsFdjwSMGEH9Kk9DdvAfFYfzdHGdHbGrDdASJ4G+uALyNSLxw==
|
||||
dependencies:
|
||||
"@angular-devkit/architect" "0.1202.13"
|
||||
"@angular-devkit/core" "12.2.13"
|
||||
"@angular-devkit/schematics" "12.2.13"
|
||||
"@schematics/angular" "12.2.13"
|
||||
"@yarnpkg/lockfile" "1.1.0"
|
||||
ansi-colors "4.1.1"
|
||||
debug "4.3.2"
|
||||
ini "2.0.0"
|
||||
inquirer "8.1.2"
|
||||
jsonc-parser "3.0.0"
|
||||
npm-package-arg "8.1.5"
|
||||
npm-pick-manifest "6.1.1"
|
||||
open "8.2.1"
|
||||
ora "5.4.1"
|
||||
pacote "11.3.5"
|
||||
resolve "1.20.0"
|
||||
semver "7.3.5"
|
||||
symbol-observable "4.0.0"
|
||||
uuid "8.3.2"
|
||||
|
||||
"@angular/common@11.2.13":
|
||||
version "11.2.13"
|
||||
resolved "https://registry.yarnpkg.com/@angular/common/-/common-11.2.13.tgz#fedd5eda9c2c5340d8d7310bdbd4606636eb7a41"
|
||||
@@ -2459,7 +2505,7 @@
|
||||
|
||||
"@cypress/request@2.88.10", "@cypress/request@^2.88.10":
|
||||
version "2.88.10"
|
||||
resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
|
||||
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
|
||||
integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==
|
||||
dependencies:
|
||||
aws-sign2 "~0.7.0"
|
||||
@@ -3074,6 +3120,11 @@
|
||||
dependencies:
|
||||
prop-types "^15.7.2"
|
||||
|
||||
"@gar/promisify@^1.0.1":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210"
|
||||
integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==
|
||||
|
||||
"@graphql-codegen/add@3.1.0":
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-3.1.0.tgz#cd02fd6d80a7f62839cb27160b62e48366a237c5"
|
||||
@@ -5711,10 +5762,18 @@
|
||||
resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz#6c1d2c625fb6ef1b9dea85ad0a5afcbef85ef22a"
|
||||
integrity sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==
|
||||
|
||||
"@npmcli/git@^2.0.1":
|
||||
version "2.0.9"
|
||||
resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.0.9.tgz#915bbfe66300e67b4da5ef765a4475ffb2ca5b6b"
|
||||
integrity sha512-hTMbMryvOqGLwnmMBKs5usbPsJtyEsMsgXwJbmNrsEuQQh1LAIMDU77IoOrwkCg+NgQWl+ySlarJASwM3SutCA==
|
||||
"@npmcli/fs@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f"
|
||||
integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==
|
||||
dependencies:
|
||||
"@gar/promisify" "^1.0.1"
|
||||
semver "^7.3.5"
|
||||
|
||||
"@npmcli/git@^2.0.1", "@npmcli/git@^2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6"
|
||||
integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==
|
||||
dependencies:
|
||||
"@npmcli/promise-spawn" "^1.3.2"
|
||||
lru-cache "^6.0.0"
|
||||
@@ -5725,7 +5784,7 @@
|
||||
semver "^7.3.5"
|
||||
which "^2.0.2"
|
||||
|
||||
"@npmcli/installed-package-contents@^1.0.5":
|
||||
"@npmcli/installed-package-contents@^1.0.5", "@npmcli/installed-package-contents@^1.0.6":
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa"
|
||||
integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==
|
||||
@@ -5753,14 +5812,13 @@
|
||||
dependencies:
|
||||
infer-owner "^1.0.4"
|
||||
|
||||
"@npmcli/run-script@^1.3.0":
|
||||
version "1.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.5.tgz#f250a0c5e1a08a792d775a315d0ff42fc3a51e1d"
|
||||
integrity sha512-NQspusBCpTjNwNRFMtz2C5MxoxyzlbuJ4YEhxAKrIonTiirKDtatsZictx9RgamQIx6+QuHMNmPl0wQdoESs9A==
|
||||
"@npmcli/run-script@^1.3.0", "@npmcli/run-script@^1.8.2":
|
||||
version "1.8.6"
|
||||
resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7"
|
||||
integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==
|
||||
dependencies:
|
||||
"@npmcli/node-gyp" "^1.0.2"
|
||||
"@npmcli/promise-spawn" "^1.3.2"
|
||||
infer-owner "^1.0.4"
|
||||
node-gyp "^7.1.0"
|
||||
read-package-json-fast "^2.0.1"
|
||||
|
||||
@@ -7009,6 +7067,15 @@
|
||||
"@angular-devkit/schematics" "11.2.12"
|
||||
jsonc-parser "3.0.0"
|
||||
|
||||
"@schematics/angular@12.2.13", "@schematics/angular@^12.2.10":
|
||||
version "12.2.13"
|
||||
resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.2.13.tgz#5bf3e7b699a42d7fd7f7aa12bbe4534e671e7201"
|
||||
integrity sha512-TrigQ9TCmAedf1J5PSSSfTC+sScYrITeAUN8a9rlkjZNvff8hHVyQaiZmhqL+egKQL828mhkqpnFUDd4QsPBIw==
|
||||
dependencies:
|
||||
"@angular-devkit/core" "12.2.13"
|
||||
"@angular-devkit/schematics" "12.2.13"
|
||||
jsonc-parser "3.0.0"
|
||||
|
||||
"@schematics/angular@8.0.0":
|
||||
version "8.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.0.0.tgz#47954888fb8acbc3600235db7a46229c47fe5d9c"
|
||||
@@ -7017,15 +7084,6 @@
|
||||
"@angular-devkit/core" "8.0.0"
|
||||
"@angular-devkit/schematics" "8.0.0"
|
||||
|
||||
"@schematics/angular@^12.2.10":
|
||||
version "12.2.10"
|
||||
resolved "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.10.tgz#c640be969ea7588da14ee5c4d58a6a2ce63b97e6"
|
||||
integrity sha512-hjOWrC/RlZ97oYWO92f5VRu6LDzPHnowDcyGDGvI9wCrfipL4Y7Is6LgFAiVZxCHdRz71MCnES1IXSj5w6UuBA==
|
||||
dependencies:
|
||||
"@angular-devkit/core" "12.2.10"
|
||||
"@angular-devkit/schematics" "12.2.10"
|
||||
jsonc-parser "3.0.0"
|
||||
|
||||
"@schematics/update@0.1102.12":
|
||||
version "0.1102.12"
|
||||
resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1102.12.tgz#e9221c3bd8077baf2a4f688bdeca3ded329c356b"
|
||||
@@ -7166,11 +7224,6 @@
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1"
|
||||
integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==
|
||||
|
||||
"@sindresorhus/is@^3.0.0":
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.2.tgz#548650de521b344e3781fbdb0ece4aa6f729afb8"
|
||||
integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==
|
||||
|
||||
"@sinonjs/commons@^1", "@sinonjs/commons@^1.2.0", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.7.2", "@sinonjs/commons@^1.8.1":
|
||||
version "1.8.2"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b"
|
||||
@@ -8257,7 +8310,7 @@
|
||||
dependencies:
|
||||
defer-to-connect "^1.0.1"
|
||||
|
||||
"@szmarczak/http-timer@^4.0.0", "@szmarczak/http-timer@^4.0.5":
|
||||
"@szmarczak/http-timer@^4.0.0":
|
||||
version "4.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152"
|
||||
integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==
|
||||
@@ -8313,10 +8366,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
|
||||
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
|
||||
|
||||
"@toycode/markdown-it-class@1.2.4":
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/@toycode/markdown-it-class/-/markdown-it-class-1.2.4.tgz#6d9bc162d0b980695a2e6b2622f49eb1c3f349c8"
|
||||
integrity sha512-hA4gHBK8moObkOYdWTjhy1wYcYy0MJeM3JjSKbsXHRpRMvIKhk6Jm+t3bXsSScTdz/byWqQbs8YIwVYjHp+SlQ==
|
||||
"@toycode/markdown-it-class@1.2.3":
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@toycode/markdown-it-class/-/markdown-it-class-1.2.3.tgz#272082b46d1242d2607a3aca281aae9d208fc182"
|
||||
integrity sha512-9N7iI5iGzjmYpeEFE93/76SkiSZkywkIiKUxahoU4h5WDUJyruXO+Ce4o/nFkFdKQnmsTmyxhdCtXVikl67XGw==
|
||||
|
||||
"@trysound/sax@0.1.1":
|
||||
version "0.1.1"
|
||||
@@ -10951,7 +11004,7 @@ agent-base@4, agent-base@^4.3.0:
|
||||
dependencies:
|
||||
es6-promisify "^5.0.0"
|
||||
|
||||
agent-base@6:
|
||||
agent-base@6, agent-base@^6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
|
||||
@@ -14247,11 +14300,12 @@ cacache@^13.0.1:
|
||||
ssri "^7.0.0"
|
||||
unique-filename "^1.1.1"
|
||||
|
||||
cacache@^15.0.5:
|
||||
version "15.0.6"
|
||||
resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.6.tgz#65a8c580fda15b59150fb76bf3f3a8e45d583099"
|
||||
integrity sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==
|
||||
cacache@^15.0.5, cacache@^15.2.0:
|
||||
version "15.3.0"
|
||||
resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
|
||||
integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
|
||||
dependencies:
|
||||
"@npmcli/fs" "^1.0.0"
|
||||
"@npmcli/move-file" "^1.0.1"
|
||||
chownr "^2.0.0"
|
||||
fs-minipass "^2.0.0"
|
||||
@@ -14310,11 +14364,6 @@ cacheable-lookup@^4.1.1:
|
||||
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-4.3.0.tgz#86ff1cb38f648cc6aba28feffe008f808b403550"
|
||||
integrity sha512-PTUoCeIjj2awloqyVRUL33SjquU1Qv5xuDalYY8WAzd9NnUMUivZnGsOzVsMfg2YuMsWXaXkd/hjnsVoWc/3YA==
|
||||
|
||||
cacheable-lookup@^5.0.3:
|
||||
version "5.0.4"
|
||||
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
|
||||
integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
|
||||
|
||||
cacheable-request@^2.1.1:
|
||||
version "2.1.4"
|
||||
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
|
||||
@@ -14956,7 +15005,7 @@ chokidar@3.5.1:
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.1"
|
||||
|
||||
"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.2.3, chokidar@^3.3.0, chokidar@^3.3.1, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.0, chokidar@^3.5.1, chokidar@^3.5.2:
|
||||
"chokidar@>=2.0.0 <4.0.0", "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.2.3, chokidar@^3.3.0, chokidar@^3.3.1, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.0, chokidar@^3.5.1, chokidar@^3.5.2:
|
||||
version "3.5.2"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
|
||||
integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
|
||||
@@ -17300,13 +17349,6 @@ dargs@^7.0.0:
|
||||
resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc"
|
||||
integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==
|
||||
|
||||
dart-sass@^1.25.0:
|
||||
version "1.25.0"
|
||||
resolved "https://registry.yarnpkg.com/dart-sass/-/dart-sass-1.25.0.tgz#e00c0348118916e9d81cb485297184c131af1dad"
|
||||
integrity sha512-syNOAstJXAmvD3RifcDk3fiPMyYE2fY8so6w9gf2/wNlKpG0zyH+oiXubEYVOy1WAWkzOc72pbAxwx+3OU4JJA==
|
||||
dependencies:
|
||||
chokidar ">=2.0.0 <4.0.0"
|
||||
|
||||
dash-ast@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37"
|
||||
@@ -17518,13 +17560,6 @@ decompress-response@^5.0.0:
|
||||
dependencies:
|
||||
mimic-response "^2.0.0"
|
||||
|
||||
decompress-response@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
|
||||
integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
|
||||
dependencies:
|
||||
mimic-response "^3.1.0"
|
||||
|
||||
dedent@^0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
|
||||
@@ -18848,6 +18883,13 @@ engine.io-client@~5.0.0:
|
||||
ws "~7.4.2"
|
||||
yeast "0.1.2"
|
||||
|
||||
engine.io-parser@4.0.2, engine.io-parser@~4.0.0, engine.io-parser@~4.0.1:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e"
|
||||
integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==
|
||||
dependencies:
|
||||
base64-arraybuffer "0.1.4"
|
||||
|
||||
engine.io-parser@~2.2.0:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7"
|
||||
@@ -18859,12 +18901,18 @@ engine.io-parser@~2.2.0:
|
||||
blob "0.0.5"
|
||||
has-binary2 "~1.0.2"
|
||||
|
||||
engine.io-parser@~4.0.0, engine.io-parser@~4.0.1:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e"
|
||||
integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==
|
||||
engine.io@5.0.0, engine.io@~5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/engine.io/-/engine.io-5.0.0.tgz#470dc94a8a4907fa4d2cd1fa6611426afcee61bf"
|
||||
integrity sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==
|
||||
dependencies:
|
||||
base64-arraybuffer "0.1.4"
|
||||
accepts "~1.3.4"
|
||||
base64id "2.0.0"
|
||||
cookie "~0.4.1"
|
||||
cors "~2.8.5"
|
||||
debug "~4.3.1"
|
||||
engine.io-parser "~4.0.0"
|
||||
ws "~7.4.2"
|
||||
|
||||
engine.io@~3.5.0:
|
||||
version "3.5.0"
|
||||
@@ -18878,19 +18926,6 @@ engine.io@~3.5.0:
|
||||
engine.io-parser "~2.2.0"
|
||||
ws "~7.4.2"
|
||||
|
||||
engine.io@~5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/engine.io/-/engine.io-5.0.0.tgz#470dc94a8a4907fa4d2cd1fa6611426afcee61bf"
|
||||
integrity sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==
|
||||
dependencies:
|
||||
accepts "~1.3.4"
|
||||
base64id "2.0.0"
|
||||
cookie "~0.4.1"
|
||||
cors "~2.8.5"
|
||||
debug "~4.3.1"
|
||||
engine.io-parser "~4.0.0"
|
||||
ws "~7.4.2"
|
||||
|
||||
enhanced-resolve@4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
|
||||
@@ -22397,23 +22432,6 @@ got@11.1.0:
|
||||
p-cancelable "^2.0.0"
|
||||
responselike "^2.0.0"
|
||||
|
||||
got@11.5.1:
|
||||
version "11.5.1"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-11.5.1.tgz#bf098a270fe80b3fb88ffd5a043a59ebb0a391db"
|
||||
integrity sha512-reQEZcEBMTGnujmQ+Wm97mJs/OK6INtO6HmLI+xt3+9CvnRwWjXutUvb2mqr+Ao4Lu05Rx6+udx9sOQAmExMxA==
|
||||
dependencies:
|
||||
"@sindresorhus/is" "^3.0.0"
|
||||
"@szmarczak/http-timer" "^4.0.5"
|
||||
"@types/cacheable-request" "^6.0.1"
|
||||
"@types/responselike" "^1.0.0"
|
||||
cacheable-lookup "^5.0.3"
|
||||
cacheable-request "^7.0.1"
|
||||
decompress-response "^6.0.0"
|
||||
http2-wrapper "^1.0.0-beta.5.0"
|
||||
lowercase-keys "^2.0.0"
|
||||
p-cancelable "^2.0.0"
|
||||
responselike "^2.0.0"
|
||||
|
||||
got@^6.7.1:
|
||||
version "6.7.1"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
|
||||
@@ -23553,7 +23571,7 @@ http-signature@~1.3.6:
|
||||
jsprim "^2.0.2"
|
||||
sshpk "^1.14.1"
|
||||
|
||||
http2-wrapper@^1.0.0-beta.4.4, http2-wrapper@^1.0.0-beta.5.0:
|
||||
http2-wrapper@^1.0.0-beta.4.4:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
|
||||
integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
|
||||
@@ -23766,6 +23784,11 @@ immutable@3.7.6, immutable@~3.7.6:
|
||||
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b"
|
||||
integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks=
|
||||
|
||||
immutable@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23"
|
||||
integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==
|
||||
|
||||
import-cwd@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
|
||||
@@ -28145,6 +28168,28 @@ make-fetch-happen@^8.0.9:
|
||||
socks-proxy-agent "^5.0.0"
|
||||
ssri "^8.0.0"
|
||||
|
||||
make-fetch-happen@^9.0.1:
|
||||
version "9.1.0"
|
||||
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
|
||||
integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
|
||||
dependencies:
|
||||
agentkeepalive "^4.1.3"
|
||||
cacache "^15.2.0"
|
||||
http-cache-semantics "^4.1.0"
|
||||
http-proxy-agent "^4.0.1"
|
||||
https-proxy-agent "^5.0.0"
|
||||
is-lambda "^1.0.1"
|
||||
lru-cache "^6.0.0"
|
||||
minipass "^3.1.3"
|
||||
minipass-collect "^1.0.2"
|
||||
minipass-fetch "^1.3.2"
|
||||
minipass-flush "^1.0.5"
|
||||
minipass-pipeline "^1.2.4"
|
||||
negotiator "^0.6.2"
|
||||
promise-retry "^2.0.1"
|
||||
socks-proxy-agent "^6.0.0"
|
||||
ssri "^8.0.0"
|
||||
|
||||
make-iterator@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
|
||||
@@ -28703,11 +28748,6 @@ mimic-response@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
|
||||
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
|
||||
|
||||
mimic-response@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
|
||||
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
||||
|
||||
min-document@^2.19.0:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
|
||||
@@ -29685,7 +29725,7 @@ needle@^2.5.2:
|
||||
iconv-lite "^0.4.4"
|
||||
sax "^1.2.4"
|
||||
|
||||
negotiator@0.6.2:
|
||||
negotiator@0.6.2, negotiator@^0.6.2:
|
||||
version "0.6.2"
|
||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
|
||||
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
|
||||
@@ -30306,6 +30346,15 @@ npm-package-arg@8.1.0:
|
||||
semver "^7.0.0"
|
||||
validate-npm-package-name "^3.0.0"
|
||||
|
||||
npm-package-arg@8.1.5, npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2:
|
||||
version "8.1.5"
|
||||
resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44"
|
||||
integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==
|
||||
dependencies:
|
||||
hosted-git-info "^4.0.1"
|
||||
semver "^7.3.4"
|
||||
validate-npm-package-name "^3.0.0"
|
||||
|
||||
"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0, npm-package-arg@^6.1.1:
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7"
|
||||
@@ -30316,15 +30365,6 @@ npm-package-arg@8.1.0:
|
||||
semver "^5.6.0"
|
||||
validate-npm-package-name "^3.0.0"
|
||||
|
||||
npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2:
|
||||
version "8.1.2"
|
||||
resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.2.tgz#b868016ae7de5619e729993fbd8d11dc3c52ab62"
|
||||
integrity sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA==
|
||||
dependencies:
|
||||
hosted-git-info "^4.0.1"
|
||||
semver "^7.3.4"
|
||||
validate-npm-package-name "^3.0.0"
|
||||
|
||||
npm-packlist@^1.1.12, npm-packlist@^1.4.4, npm-packlist@^1.4.8:
|
||||
version "1.4.8"
|
||||
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
|
||||
@@ -30353,16 +30393,7 @@ npm-pick-manifest@6.1.0:
|
||||
npm-package-arg "^8.0.0"
|
||||
semver "^7.0.0"
|
||||
|
||||
npm-pick-manifest@^3.0.0, npm-pick-manifest@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7"
|
||||
integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==
|
||||
dependencies:
|
||||
figgy-pudding "^3.5.1"
|
||||
npm-package-arg "^6.0.0"
|
||||
semver "^5.4.1"
|
||||
|
||||
npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1:
|
||||
npm-pick-manifest@6.1.1, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1:
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148"
|
||||
integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==
|
||||
@@ -30372,6 +30403,15 @@ npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1:
|
||||
npm-package-arg "^8.1.2"
|
||||
semver "^7.3.4"
|
||||
|
||||
npm-pick-manifest@^3.0.0, npm-pick-manifest@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7"
|
||||
integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==
|
||||
dependencies:
|
||||
figgy-pudding "^3.5.1"
|
||||
npm-package-arg "^6.0.0"
|
||||
semver "^5.4.1"
|
||||
|
||||
npm-profile@^4.0.2, npm-profile@^4.0.4:
|
||||
version "4.0.4"
|
||||
resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.4.tgz#28ee94390e936df6d084263ee2061336a6a1581b"
|
||||
@@ -30400,6 +30440,18 @@ npm-registry-client@^8.6.0:
|
||||
optionalDependencies:
|
||||
npmlog "2 || ^3.1.0 || ^4.0.0"
|
||||
|
||||
npm-registry-fetch@^11.0.0:
|
||||
version "11.0.0"
|
||||
resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76"
|
||||
integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==
|
||||
dependencies:
|
||||
make-fetch-happen "^9.0.1"
|
||||
minipass "^3.1.3"
|
||||
minipass-fetch "^1.3.0"
|
||||
minipass-json-stream "^1.0.1"
|
||||
minizlib "^2.0.0"
|
||||
npm-package-arg "^8.0.0"
|
||||
|
||||
npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.7:
|
||||
version "4.0.7"
|
||||
resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7"
|
||||
@@ -30926,6 +30978,15 @@ open@7.4.0:
|
||||
is-docker "^2.0.0"
|
||||
is-wsl "^2.1.1"
|
||||
|
||||
open@8.2.1, open@^8.0.9:
|
||||
version "8.2.1"
|
||||
resolved "https://registry.yarnpkg.com/open/-/open-8.2.1.tgz#82de42da0ccbf429bc12d099dad2e0975e14e8af"
|
||||
integrity sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==
|
||||
dependencies:
|
||||
define-lazy-prop "^2.0.0"
|
||||
is-docker "^2.1.1"
|
||||
is-wsl "^2.2.0"
|
||||
|
||||
open@^6.3.0:
|
||||
version "6.4.0"
|
||||
resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9"
|
||||
@@ -30941,15 +31002,6 @@ open@^7.0.2, open@^7.0.3, open@^7.4.2:
|
||||
is-docker "^2.0.0"
|
||||
is-wsl "^2.1.1"
|
||||
|
||||
open@^8.0.9:
|
||||
version "8.2.1"
|
||||
resolved "https://registry.yarnpkg.com/open/-/open-8.2.1.tgz#82de42da0ccbf429bc12d099dad2e0975e14e8af"
|
||||
integrity sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==
|
||||
dependencies:
|
||||
define-lazy-prop "^2.0.0"
|
||||
is-docker "^2.1.1"
|
||||
is-wsl "^2.2.0"
|
||||
|
||||
opener@^1.4.1, opener@^1.4.2, opener@^1.5.1, opener@^1.5.2:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
|
||||
@@ -31453,6 +31505,31 @@ pacote@11.2.4:
|
||||
ssri "^8.0.0"
|
||||
tar "^6.1.0"
|
||||
|
||||
pacote@11.3.5:
|
||||
version "11.3.5"
|
||||
resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2"
|
||||
integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==
|
||||
dependencies:
|
||||
"@npmcli/git" "^2.1.0"
|
||||
"@npmcli/installed-package-contents" "^1.0.6"
|
||||
"@npmcli/promise-spawn" "^1.2.0"
|
||||
"@npmcli/run-script" "^1.8.2"
|
||||
cacache "^15.0.5"
|
||||
chownr "^2.0.0"
|
||||
fs-minipass "^2.1.0"
|
||||
infer-owner "^1.0.4"
|
||||
minipass "^3.1.3"
|
||||
mkdirp "^1.0.3"
|
||||
npm-package-arg "^8.0.1"
|
||||
npm-packlist "^2.1.4"
|
||||
npm-pick-manifest "^6.0.0"
|
||||
npm-registry-fetch "^11.0.0"
|
||||
promise-retry "^2.0.1"
|
||||
read-package-json-fast "^2.0.1"
|
||||
rimraf "^3.0.2"
|
||||
ssri "^8.0.1"
|
||||
tar "^6.1.0"
|
||||
|
||||
pacote@^9.1.0, pacote@^9.5.12, pacote@^9.5.3:
|
||||
version "9.5.12"
|
||||
resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66"
|
||||
@@ -36022,12 +36099,7 @@ resolve@1.19.0:
|
||||
is-core-module "^2.1.0"
|
||||
path-parse "^1.0.6"
|
||||
|
||||
resolve@^0.6.3:
|
||||
version "0.6.3"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46"
|
||||
integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY=
|
||||
|
||||
resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1:
|
||||
resolve@1.20.0, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1:
|
||||
version "1.20.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
||||
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
|
||||
@@ -36035,6 +36107,11 @@ resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1
|
||||
is-core-module "^2.2.0"
|
||||
path-parse "^1.0.6"
|
||||
|
||||
resolve@^0.6.3:
|
||||
version "0.6.3"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46"
|
||||
integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY=
|
||||
|
||||
responselike@1.0.2, responselike@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
|
||||
@@ -36498,13 +36575,6 @@ sass-lookup@^3.0.0:
|
||||
dependencies:
|
||||
commander "^2.16.0"
|
||||
|
||||
sass@1.32.0:
|
||||
version "1.32.0"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.0.tgz#10101a026c13080b14e2b374d4e15ee24400a4d3"
|
||||
integrity sha512-fhyqEbMIycQA4blrz/C0pYhv2o4x2y6FYYAH0CshBw3DXh5D5wyERgxw0ptdau1orc/GhNrhF7DFN2etyOCEng==
|
||||
dependencies:
|
||||
chokidar ">=2.0.0 <4.0.0"
|
||||
|
||||
sass@1.32.6:
|
||||
version "1.32.6"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.6.tgz#e3646c8325cd97ff75a8a15226007f3ccd221393"
|
||||
@@ -36512,12 +36582,13 @@ sass@1.32.6:
|
||||
dependencies:
|
||||
chokidar ">=2.0.0 <4.0.0"
|
||||
|
||||
sass@1.32.8:
|
||||
version "1.32.8"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.8.tgz#f16a9abd8dc530add8834e506878a2808c037bdc"
|
||||
integrity sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==
|
||||
sass@1.44.0:
|
||||
version "1.44.0"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.44.0.tgz#619aa0a2275c097f9af5e6b8fe8a95e3056430fb"
|
||||
integrity sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==
|
||||
dependencies:
|
||||
chokidar ">=2.0.0 <4.0.0"
|
||||
chokidar ">=3.0.0 <4.0.0"
|
||||
immutable "^4.0.0"
|
||||
|
||||
sax@1.2.1:
|
||||
version "1.2.1"
|
||||
@@ -37767,7 +37838,16 @@ socks-proxy-agent@^5.0.0:
|
||||
debug "4"
|
||||
socks "^2.3.3"
|
||||
|
||||
socks@^2.3.3:
|
||||
socks-proxy-agent@^6.0.0:
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87"
|
||||
integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==
|
||||
dependencies:
|
||||
agent-base "^6.0.2"
|
||||
debug "^4.3.1"
|
||||
socks "^2.6.1"
|
||||
|
||||
socks@^2.3.3, socks@^2.6.1:
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e"
|
||||
integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==
|
||||
|
||||
Reference in New Issue
Block a user