From 87108a8dae2563ee41446a991cbb298c6e5f5e60 Mon Sep 17 00:00:00 2001 From: Jessica Sachs Date: Sun, 31 Jan 2021 21:21:38 -0500 Subject: [PATCH 1/5] feat: adding support for vite-dev-server --- npm/vite-dev-server/.eslintrc | 52 +++++++++++++++++++ npm/vite-dev-server/README.md | 3 ++ npm/vite-dev-server/cypress.json | 7 +++ .../large-third-party-dep-shaken.spec.ts | 7 +++ .../components/large-third-party-dep.spec.ts | 7 +++ .../cypress/components/smoke.spec.ts | 5 ++ .../cypress/components/support.spec.ts | 14 +++++ npm/vite-dev-server/cypress/plugins.js | 9 ++++ .../cypress/support/support.js | 3 ++ npm/vite-dev-server/index-template.html | 49 +++++++++++++++++ npm/vite-dev-server/index.d.ts | 2 + npm/vite-dev-server/index.html | 12 +++++ npm/vite-dev-server/index.js | 1 + npm/vite-dev-server/package.json | 30 +++++++++++ npm/vite-dev-server/src/index.ts | 31 +++++++++++ npm/vite-dev-server/src/makeHtmlPlugin.ts | 27 ++++++++++ npm/vite-dev-server/src/startServer.ts | 52 +++++++++++++++++++ npm/vite-dev-server/tsconfig.json | 52 +++++++++++++++++++ packages/server-ct/src/routes-ct.ts | 4 ++ yarn.lock | 47 ++++++++++++++++- 20 files changed, 412 insertions(+), 2 deletions(-) create mode 100644 npm/vite-dev-server/.eslintrc create mode 100644 npm/vite-dev-server/README.md create mode 100644 npm/vite-dev-server/cypress.json create mode 100644 npm/vite-dev-server/cypress/components/large-third-party-dep-shaken.spec.ts create mode 100644 npm/vite-dev-server/cypress/components/large-third-party-dep.spec.ts create mode 100644 npm/vite-dev-server/cypress/components/smoke.spec.ts create mode 100644 npm/vite-dev-server/cypress/components/support.spec.ts create mode 100644 npm/vite-dev-server/cypress/plugins.js create mode 100644 npm/vite-dev-server/cypress/support/support.js create mode 100644 npm/vite-dev-server/index-template.html create mode 100644 npm/vite-dev-server/index.d.ts create mode 100644 npm/vite-dev-server/index.html create mode 100644 npm/vite-dev-server/index.js create mode 100644 npm/vite-dev-server/package.json create mode 100644 npm/vite-dev-server/src/index.ts create mode 100644 npm/vite-dev-server/src/makeHtmlPlugin.ts create mode 100644 npm/vite-dev-server/src/startServer.ts create mode 100644 npm/vite-dev-server/tsconfig.json diff --git a/npm/vite-dev-server/.eslintrc b/npm/vite-dev-server/.eslintrc new file mode 100644 index 000000000000..fef43b39a07a --- /dev/null +++ b/npm/vite-dev-server/.eslintrc @@ -0,0 +1,52 @@ +{ + "plugins": [ + "cypress", + "@cypress/dev" + ], + "extends": [ + "plugin:@cypress/dev/general", + "plugin:@cypress/dev/tests", + "plugin:@cypress/dev/react" + ], + "parser": "@typescript-eslint/parser", + "env": { + "cypress/globals": true + }, + "globals": { + "jest": "readonly" + }, + "rules": { + "no-console": "off", + "mocha/no-global-tests": "off", + "@typescript-eslint/no-unused-vars": "off", + "react/jsx-filename-extension": [ + "warn", + { + "extensions": [ + ".js", + ".jsx", + ".tsx" + ] + } + ] + }, + "overrides": [ + { + "files": [ + "lib/*" + ], + "rules": { + "no-console": 1 + } + }, + { + "files": [ + "**/*.json" + ], + "rules": { + "quotes": "off", + "comma-dangle": "off" + } + } + ] +} diff --git a/npm/vite-dev-server/README.md b/npm/vite-dev-server/README.md new file mode 100644 index 000000000000..91e2bf5da29c --- /dev/null +++ b/npm/vite-dev-server/README.md @@ -0,0 +1,3 @@ +# ⚡️ + 🌲 Cypress Component Testing w/ Vite + +> **Note** this package is not meant to be used outside of cypress component testing. diff --git a/npm/vite-dev-server/cypress.json b/npm/vite-dev-server/cypress.json new file mode 100644 index 000000000000..bf6f5c552c5b --- /dev/null +++ b/npm/vite-dev-server/cypress.json @@ -0,0 +1,7 @@ +{ + "experimentalComponentTesting": true, + "pluginsFile": "cypress/plugins.js", + "testFiles": "**/*.spec.*", + "componentFolder": "cypress/components", + "supportFile": "cypress/support/support.js" +} diff --git a/npm/vite-dev-server/cypress/components/large-third-party-dep-shaken.spec.ts b/npm/vite-dev-server/cypress/components/large-third-party-dep-shaken.spec.ts new file mode 100644 index 000000000000..546ed3dadfc5 --- /dev/null +++ b/npm/vite-dev-server/cypress/components/large-third-party-dep-shaken.spec.ts @@ -0,0 +1,7 @@ +import { isBoolean } from 'lodash' + +describe('Large 3rd party library with tree-shaking', () => { + it('successfully imports isBoolean from lodash', () => { + expect(isBoolean(true)).to.be.true + }) +}) diff --git a/npm/vite-dev-server/cypress/components/large-third-party-dep.spec.ts b/npm/vite-dev-server/cypress/components/large-third-party-dep.spec.ts new file mode 100644 index 000000000000..1c577b720145 --- /dev/null +++ b/npm/vite-dev-server/cypress/components/large-third-party-dep.spec.ts @@ -0,0 +1,7 @@ +import _ from 'lodash' + +describe('Large 3rd party library without tree-shaking', () => { + it('successfully imports lodash', () => { + expect(_.isBoolean(true)).to.be.true + }) +}) diff --git a/npm/vite-dev-server/cypress/components/smoke.spec.ts b/npm/vite-dev-server/cypress/components/smoke.spec.ts new file mode 100644 index 000000000000..3a5aaeb6ee9b --- /dev/null +++ b/npm/vite-dev-server/cypress/components/smoke.spec.ts @@ -0,0 +1,5 @@ +describe('With no imports', () => { + it('should be able to run this', () => { + expect(true).to.be.true + }) +}) diff --git a/npm/vite-dev-server/cypress/components/support.spec.ts b/npm/vite-dev-server/cypress/components/support.spec.ts new file mode 100644 index 000000000000..a164718c3c25 --- /dev/null +++ b/npm/vite-dev-server/cypress/components/support.spec.ts @@ -0,0 +1,14 @@ +describe('Support files', () => { + it('can load a support file', () => { + const $body = Cypress.$('body') + + // Visual cue to help debug + const $supportNode = Cypress.$(`

Support file hasn't been loaded 😿

`) + + $body.append($supportNode) + + // @ts-ignore + expect(window.supportFileWasLoaded).to.be.true + $supportNode.text('Support file was loaded! ⚡️') + }) +}) diff --git a/npm/vite-dev-server/cypress/plugins.js b/npm/vite-dev-server/cypress/plugins.js new file mode 100644 index 000000000000..9764b3ffaf61 --- /dev/null +++ b/npm/vite-dev-server/cypress/plugins.js @@ -0,0 +1,9 @@ +import { startDevServer } from '@cypress/vite-dev-server' + +module.exports = (on, config) => { + on('dev-server:start', async (options) => { + return startDevServer({ options }) + }) + + return config +} diff --git a/npm/vite-dev-server/cypress/support/support.js b/npm/vite-dev-server/cypress/support/support.js new file mode 100644 index 000000000000..667b35a2c456 --- /dev/null +++ b/npm/vite-dev-server/cypress/support/support.js @@ -0,0 +1,3 @@ +before(() => { + window.supportFileWasLoaded = true +}) diff --git a/npm/vite-dev-server/index-template.html b/npm/vite-dev-server/index-template.html new file mode 100644 index 000000000000..0140f725593e --- /dev/null +++ b/npm/vite-dev-server/index-template.html @@ -0,0 +1,49 @@ + + + + + + + Components App + + +
+ + + diff --git a/npm/vite-dev-server/index.d.ts b/npm/vite-dev-server/index.d.ts new file mode 100644 index 000000000000..bb6bb6c83a78 --- /dev/null +++ b/npm/vite-dev-server/index.d.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/triple-slash-reference +/// diff --git a/npm/vite-dev-server/index.html b/npm/vite-dev-server/index.html new file mode 100644 index 000000000000..f7f2aaf01858 --- /dev/null +++ b/npm/vite-dev-server/index.html @@ -0,0 +1,12 @@ + + + + + + Document + + + Root HTML for my cool app -- in the real world, this would be the user's. + This is necessary to allow Vite to start up with
yarn vite
+ + diff --git a/npm/vite-dev-server/index.js b/npm/vite-dev-server/index.js new file mode 100644 index 000000000000..2d2f3c0bcb52 --- /dev/null +++ b/npm/vite-dev-server/index.js @@ -0,0 +1 @@ +module.exports = require('./dist') diff --git a/npm/vite-dev-server/package.json b/npm/vite-dev-server/package.json new file mode 100644 index 000000000000..e538a42c9bce --- /dev/null +++ b/npm/vite-dev-server/package.json @@ -0,0 +1,30 @@ +{ + "name": "@cypress/vite-dev-server", + "version": "0.0.0-development", + "description": "Launches Vite Dev Server for Component Testing", + "private": true, + "main": "index.js", + "scripts": { + "build": "tsc", + "build-prod": "tsc", + "cy:open": "node ../../scripts/start.js --component-testing --project ${PWD}", + "cy:run": "node ../../scripts/cypress.js open-ct --run-project ${PWD}", + "test": "yarn cy:run", + "watch": "tsc -w" + }, + "dependencies": { + "debug": "4.3.2", + "mustache": "4.1.0" + }, + "devDependencies": { + "@types/mustache": "4.1.1", + "vite": "2.0.0-beta.59" + }, + "peerDependencies": { + "vite": ">= 2" + }, + "files": [ + "dist" + ], + "license": "MIT" +} diff --git a/npm/vite-dev-server/src/index.ts b/npm/vite-dev-server/src/index.ts new file mode 100644 index 000000000000..9487d43d65b9 --- /dev/null +++ b/npm/vite-dev-server/src/index.ts @@ -0,0 +1,31 @@ +import { EventEmitter } from 'events' +import { debug as debugFn } from 'debug' +import { start as createDevServer } from './startServer' +import { UserConfig } from 'vite' +const debug = debugFn('cypress:vite-dev-server:vite') + +interface Options { + specs: any[] // Cypress.Cypress['spec'][] // Why isn't this working? It works for webpack-dev-server + config: Record + devServerEvents: EventEmitter + [key: string]: unknown +} + +export interface StartDevServer { + /* this is the Cypress options object */ + options: Options + /* support passing a path to the user's webpack config */ + viteConfig?: UserConfig // TODO: implement taking in the user's vite configuration. Right now we don't +} + +export async function startDevServer (startDevServerArgs: StartDevServer): Promise { + const viteDevServer = await createDevServer(startDevServerArgs) + + return new Promise(async (resolve) => { + const app = await viteDevServer.listen() + const port = app.config.server.port + + debug('Component testing vite server started on port', port) + resolve(port) + }) +} diff --git a/npm/vite-dev-server/src/makeHtmlPlugin.ts b/npm/vite-dev-server/src/makeHtmlPlugin.ts new file mode 100644 index 000000000000..2370a53c0988 --- /dev/null +++ b/npm/vite-dev-server/src/makeHtmlPlugin.ts @@ -0,0 +1,27 @@ +import { relative, resolve } from 'path' +import { readFileSync } from 'fs' +import { Plugin, ViteDevServer } from 'vite' +import { render } from 'mustache' + +const pluginName = 'cypress-transform-html' +const indexHtmlPath = resolve(__dirname, '../index-template.html') +const readIndexHtml = () => readFileSync(indexHtmlPath).toString() + +function handleIndex (indexHtml, projectRoot, supportFilePath, req, res) { + const specPath = `/${req.headers.__cypress_spec_path}` + const supportPath = supportFilePath ? `/${relative(projectRoot, supportFilePath)}` : null + + res.end(render(indexHtml, { supportPath, specPath })) +} + +export const makeHtmlPlugin = (projectRoot: string, supportFilePath: string): Plugin => { + return { + name: pluginName, + enforce: 'pre', + configureServer: (server: ViteDevServer) => { + const indexHtml = readIndexHtml() + + server.middlewares.use('/index.html', (req, res) => handleIndex(indexHtml, projectRoot, supportFilePath, req, res)) + }, + } +} diff --git a/npm/vite-dev-server/src/startServer.ts b/npm/vite-dev-server/src/startServer.ts new file mode 100644 index 000000000000..989f58430071 --- /dev/null +++ b/npm/vite-dev-server/src/startServer.ts @@ -0,0 +1,52 @@ +import Debug from 'debug' +import { StartDevServer } from '.' +import { createServer, ViteDevServer, InlineConfig } from 'vite' +import { resolve } from 'path' +import { makeHtmlPlugin } from './makeHtmlPlugin' + +const debug = Debug('cypress:vite-dev-server:start') + +// TODO: Pull in types for Options so we can infer these +const serverConfig = (projectRoot: string, supportFilePath: string): InlineConfig => { + return { + root: resolve(__dirname, projectRoot), + base: '/__cypress/src/', + plugins: [makeHtmlPlugin(projectRoot, supportFilePath)], + server: { + port: 0, + }, + } +} + +const resolveServerConfig = ({ viteConfig, options }: StartDevServer) => { + const defaultServerConfig = serverConfig( + options.config.projectRoot, + options.config.supportFile, + ) + + const requiredOptions = { + base: defaultServerConfig.base, + root: defaultServerConfig.root, + } + + const finalConfig = { ...defaultServerConfig, ...viteConfig, ...requiredOptions } + + finalConfig.plugins = [...(viteConfig.plugins || []), defaultServerConfig.plugins[0]] + finalConfig.server.port = defaultServerConfig.server.port + + debug(`the resolved server config is ${JSON.stringify(finalConfig, null, 2)}`) + + return finalConfig +} + +export async function start (devServerOptions: StartDevServer): Promise { + if (!devServerOptions.viteConfig) { + debug('User did not pass in any Vite dev server configuration') + devServerOptions.viteConfig = {} + } + + debug('starting vite dev server') + const resolvedConfig = resolveServerConfig(devServerOptions) + + return createServer(resolvedConfig) +} diff --git a/npm/vite-dev-server/tsconfig.json b/npm/vite-dev-server/tsconfig.json new file mode 100644 index 000000000000..1e3fa42190bd --- /dev/null +++ b/npm/vite-dev-server/tsconfig.json @@ -0,0 +1,52 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es2015" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + "skipLibCheck": true, + "lib": [ + "es2015", + "dom" + ] /* Specify library files to be included in the compilation: */, + "allowJs": true /* Allow javascript files to be compiled. */, + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "dist" /* Redirect output structure to the directory. */, + // "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "removeComments": true, /* Do not emit comments to output. */ +// "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": false /* Enable all strict type-checking options. */, + "noImplicitAny": false, + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "types": ["cypress"] /* Type declaration files to be included in compilation. */, + "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "esModuleInterop": true + }, + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/packages/server-ct/src/routes-ct.ts b/packages/server-ct/src/routes-ct.ts index f380438e3804..0e4e4c80734c 100644 --- a/packages/server-ct/src/routes-ct.ts +++ b/packages/server-ct/src/routes-ct.ts @@ -40,6 +40,10 @@ export const createRoutes = ({ app.get('/__cypress/iframes/*', (req, res) => { // always proxy to the index.html file + // attach header data for webservers + // to properly intercept and serve assets from the correct src root + // TODO: define a contract for dev-server plugins to configure this behavior + req.headers.__cypress_spec_path = req.params[0] req.url = '/index.html' // user the node proxy here instead of the network proxy diff --git a/yarn.lock b/yarn.lock index 181a5a8b80d1..a37ef3a65d9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5661,6 +5661,11 @@ dependencies: "@types/node" "*" +"@types/mustache@4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.1.1.tgz#fcfa2db0cee6261e66f2437dc2fe71e26c7856b4" + integrity sha512-Sm0NWeLhS2QL7NNGsXvO+Fgp7e3JLHCO6RS3RCnfjAnkw6Y1bsji/AGfISdQZDIR/AeOyzkrxRk9jBkl55zdJw== + "@types/node@*", "@types/node@>= 8", "@types/node@^14.14.7": version "14.14.20" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.20.tgz#f7974863edd21d1f8a494a73e8e2b3658615c340" @@ -14509,6 +14514,11 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" +esbuild@^0.8.34: + version "0.8.38" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.8.38.tgz#04dc395e15c77bbc9d6798e9b31275546bcf7b9a" + integrity sha512-wSunJl8ujgBs9eVGubc8Y6fn/DkDjNyfQBVOFTY1E7sRxr8KTjmqyLIiE0M3Z4CjMnCu/rttCugwnOzY+HiwIw== + escalade@^3.0.1, escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -23822,6 +23832,11 @@ multiparty@4.2.1: safe-buffer "5.1.2" uid-safe "2.1.5" +mustache@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.1.0.tgz#8c1b042238a982d2eb2d30efc6c14296ae3f699d" + integrity sha512-0FsgP/WVq4mKyjolIyX+Z9Bd+3WS8GOwoUTyKXT5cTYMGeauNTi2HPCwERqseC1IHAy0Z7MDZnJBfjabd4O8GQ== + mute-stdout@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" @@ -23856,7 +23871,7 @@ nanoid@3.1.12: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== -nanoid@3.1.20: +nanoid@3.1.20, nanoid@^3.1.20: version "3.1.20" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== @@ -27003,6 +27018,15 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.14, po source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.2.1: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.4.tgz#20a98a39cf303d15129c2865a9ec37eda0031d04" + integrity sha512-kRFftRoExRVXZlwUuay9iC824qmXPcQQVzAjbCCgjpXnkdMCJYBu2gTwAaFBzv8ewND6O8xFb3aELmEkh9zTzg== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + postinstall-postinstall@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.0.0.tgz#7ba6711b4420575c4f561638836a81faad47f43f" @@ -29266,7 +29290,7 @@ resolve@^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.3.2, resolve@^1.4.0, resolve@^1.8.1: +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.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -29456,6 +29480,13 @@ rollup@2.28.1: optionalDependencies: fsevents "~2.1.2" +rollup@^2.35.1: + version "2.38.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.38.2.tgz#ac5feef9e3b5f1c4386a0578f3add52b8b66759f" + integrity sha512-3Sg65zfgqsnI2LUFsOmhJDvTWXwio+taySq/dsyvel8+GW+AxeW9V6YZG8BpVGQk/TS4uvGLARRH5T3ygDyyNQ== + optionalDependencies: + fsevents "~2.1.2" + rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -34110,6 +34141,18 @@ vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +vite@2.0.0-beta.59: + version "2.0.0-beta.59" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.0.0-beta.59.tgz#e01a795aebedc0cb44d653c33b72ab7b831057ae" + integrity sha512-tlxEPFpVI1wV+vk+t/ypwBZfNmxKcorok8YF82MrQIqCDeRXnHvp33oWPIsRrO0V7UdnnlkKQOJJiIi3AIUFOA== + dependencies: + esbuild "^0.8.34" + postcss "^8.2.1" + resolve "^1.19.0" + rollup "^2.35.1" + optionalDependencies: + fsevents "~2.1.2" + vm-browserify@1.1.2, vm-browserify@^1.0.0, vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" From 27994713e43b04aca9ae04272b568861c48378fc Mon Sep 17 00:00:00 2001 From: Dmitriy Kovalenko Date: Tue, 2 Feb 2021 13:42:19 +0200 Subject: [PATCH 2/5] Impement hmr support --- .../{makeHtmlPlugin.ts => makeCypressPlugin.ts} | 16 +++++++++++++++- npm/vite-dev-server/src/startServer.ts | 8 +++++--- 2 files changed, 20 insertions(+), 4 deletions(-) rename npm/vite-dev-server/src/{makeHtmlPlugin.ts => makeCypressPlugin.ts} (63%) diff --git a/npm/vite-dev-server/src/makeHtmlPlugin.ts b/npm/vite-dev-server/src/makeCypressPlugin.ts similarity index 63% rename from npm/vite-dev-server/src/makeHtmlPlugin.ts rename to npm/vite-dev-server/src/makeCypressPlugin.ts index 2370a53c0988..cb089183f064 100644 --- a/npm/vite-dev-server/src/makeHtmlPlugin.ts +++ b/npm/vite-dev-server/src/makeCypressPlugin.ts @@ -1,3 +1,4 @@ +import { EventEmitter } from 'events' import { relative, resolve } from 'path' import { readFileSync } from 'fs' import { Plugin, ViteDevServer } from 'vite' @@ -14,7 +15,11 @@ function handleIndex (indexHtml, projectRoot, supportFilePath, req, res) { res.end(render(indexHtml, { supportPath, specPath })) } -export const makeHtmlPlugin = (projectRoot: string, supportFilePath: string): Plugin => { +export const makeCypressPlugin = ( + projectRoot: string, + supportFilePath: string, + devServerEvents: EventEmitter, +): Plugin => { return { name: pluginName, enforce: 'pre', @@ -23,5 +28,14 @@ export const makeHtmlPlugin = (projectRoot: string, supportFilePath: string): Pl server.middlewares.use('/index.html', (req, res) => handleIndex(indexHtml, projectRoot, supportFilePath, req, res)) }, + handleHotUpdate: () => { + console.log('HOT UPDATE') + devServerEvents.emit('dev-server:compile:success') + + return [] + }, + // TODO subscribe on the compile error hook and call the + // devServerEvents.emit('dev-server:compile:error', err) + // it looks like for now (02.02.2021) there is no way to subscribe to an error } } diff --git a/npm/vite-dev-server/src/startServer.ts b/npm/vite-dev-server/src/startServer.ts index 989f58430071..08737ff8349d 100644 --- a/npm/vite-dev-server/src/startServer.ts +++ b/npm/vite-dev-server/src/startServer.ts @@ -2,16 +2,17 @@ import Debug from 'debug' import { StartDevServer } from '.' import { createServer, ViteDevServer, InlineConfig } from 'vite' import { resolve } from 'path' -import { makeHtmlPlugin } from './makeHtmlPlugin' +import { makeCypressPlugin } from './makeCypressPlugin' +import { EventEmitter } from 'events' const debug = Debug('cypress:vite-dev-server:start') // TODO: Pull in types for Options so we can infer these -const serverConfig = (projectRoot: string, supportFilePath: string): InlineConfig => { +const serverConfig = (projectRoot: string, supportFilePath: string, devServerEvents: EventEmitter): InlineConfig => { return { root: resolve(__dirname, projectRoot), base: '/__cypress/src/', - plugins: [makeHtmlPlugin(projectRoot, supportFilePath)], + plugins: [makeCypressPlugin(projectRoot, supportFilePath, devServerEvents)], server: { port: 0, }, @@ -22,6 +23,7 @@ const resolveServerConfig = ({ viteConfig, options }: StartDevServer) => { const defaultServerConfig = serverConfig( options.config.projectRoot, options.config.supportFile, + options.devServerEvents, ) const requiredOptions = { From 762da9e3d427512054ac8c1c36d85caab57207a9 Mon Sep 17 00:00:00 2001 From: Jessica Sachs Date: Sun, 31 Jan 2021 21:21:38 -0500 Subject: [PATCH 3/5] feat: adding support for vite-dev-server --- npm/vite-dev-server/src/makeHtmlPlugin.ts | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 npm/vite-dev-server/src/makeHtmlPlugin.ts diff --git a/npm/vite-dev-server/src/makeHtmlPlugin.ts b/npm/vite-dev-server/src/makeHtmlPlugin.ts new file mode 100644 index 000000000000..2370a53c0988 --- /dev/null +++ b/npm/vite-dev-server/src/makeHtmlPlugin.ts @@ -0,0 +1,27 @@ +import { relative, resolve } from 'path' +import { readFileSync } from 'fs' +import { Plugin, ViteDevServer } from 'vite' +import { render } from 'mustache' + +const pluginName = 'cypress-transform-html' +const indexHtmlPath = resolve(__dirname, '../index-template.html') +const readIndexHtml = () => readFileSync(indexHtmlPath).toString() + +function handleIndex (indexHtml, projectRoot, supportFilePath, req, res) { + const specPath = `/${req.headers.__cypress_spec_path}` + const supportPath = supportFilePath ? `/${relative(projectRoot, supportFilePath)}` : null + + res.end(render(indexHtml, { supportPath, specPath })) +} + +export const makeHtmlPlugin = (projectRoot: string, supportFilePath: string): Plugin => { + return { + name: pluginName, + enforce: 'pre', + configureServer: (server: ViteDevServer) => { + const indexHtml = readIndexHtml() + + server.middlewares.use('/index.html', (req, res) => handleIndex(indexHtml, projectRoot, supportFilePath, req, res)) + }, + } +} From 75376d12cfa4894e3820d1af79851efbb187d24f Mon Sep 17 00:00:00 2001 From: Jessica Sachs Date: Tue, 2 Feb 2021 20:11:00 -0500 Subject: [PATCH 4/5] fix: adding httpServer to the dev-server events --- npm/vite-dev-server/src/index.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/npm/vite-dev-server/src/index.ts b/npm/vite-dev-server/src/index.ts index 9487d43d65b9..b6da01691041 100644 --- a/npm/vite-dev-server/src/index.ts +++ b/npm/vite-dev-server/src/index.ts @@ -2,6 +2,7 @@ import { EventEmitter } from 'events' import { debug as debugFn } from 'debug' import { start as createDevServer } from './startServer' import { UserConfig } from 'vite' +import { Server } from 'http' const debug = debugFn('cypress:vite-dev-server:vite') interface Options { @@ -18,7 +19,12 @@ export interface StartDevServer { viteConfig?: UserConfig // TODO: implement taking in the user's vite configuration. Right now we don't } -export async function startDevServer (startDevServerArgs: StartDevServer): Promise { +export interface ResolvedDevServerConfig { + port: number + server: Server +} + +export async function startDevServer (startDevServerArgs: StartDevServer): Promise { const viteDevServer = await createDevServer(startDevServerArgs) return new Promise(async (resolve) => { @@ -26,6 +32,6 @@ export async function startDevServer (startDevServerArgs: StartDevServer): Promi const port = app.config.server.port debug('Component testing vite server started on port', port) - resolve(port) + resolve({ port, server: app.httpServer }) }) } From 1ef720c0056ed8fbde83561b1798a1c19e82b13d Mon Sep 17 00:00:00 2001 From: Jessica Sachs Date: Wed, 10 Feb 2021 15:06:13 -0500 Subject: [PATCH 5/5] updating yarn.lock --- yarn.lock | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 268 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index a37ef3a65d9a..34c6033b40f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,6 +107,13 @@ dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + "@babel/compat-data@^7.11.0", "@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7", "@babel/compat-data@^7.9.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" @@ -237,6 +244,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.12.10": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.13.tgz#b73a87a3a3e7d142a66248bf6ad88b9ceb093425" + integrity sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helpers" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.11.5", "@babel/generator@^7.4.0", "@babel/generator@^7.4.4", "@babel/generator@^7.6.0", "@babel/generator@^7.9.0": version "7.11.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" @@ -255,6 +283,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.12.13": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f" + integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== + dependencies: + "@babel/types" "^7.12.13" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" @@ -324,6 +361,15 @@ "@babel/template" "^7.12.7" "@babel/types" "^7.12.11" +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" @@ -331,6 +377,13 @@ dependencies: "@babel/types" "^7.12.10" +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-hoist-variables@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" @@ -345,6 +398,13 @@ dependencies: "@babel/types" "^7.12.7" +"@babel/helper-member-expression-to-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz#c5715695b4f8bab32660dbdcdc2341dec7e3df40" + integrity sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5", "@babel/helper-module-imports@^7.8.3": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" @@ -352,6 +412,13 @@ dependencies: "@babel/types" "^7.12.5" +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.11.0", "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.9.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -367,6 +434,21 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea" + integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + lodash "^4.17.19" + "@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" @@ -374,11 +456,23 @@ dependencies: "@babel/types" "^7.12.10" +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + "@babel/helper-remap-async-to-generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" @@ -398,6 +492,16 @@ "@babel/traverse" "^7.12.10" "@babel/types" "^7.12.11" +"@babel/helper-replace-supers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" + integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-simple-access@^7.10.1", "@babel/helper-simple-access@^7.10.4", "@babel/helper-simple-access@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" @@ -405,6 +509,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -419,6 +530,13 @@ dependencies: "@babel/types" "^7.12.11" +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" @@ -448,6 +566,15 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" +"@babel/helpers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47" + integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" @@ -457,6 +584,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@7.12.11", "@babel/parser@^7.11.5", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.7.7": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" @@ -467,6 +603,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== +"@babel/parser@^7.12.13": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.15.tgz#2b20de7f0b4b332d9b119dd9c33409c538b8aacf" + integrity sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA== + "@babel/plugin-proposal-async-generator-functions@^7.10.4", "@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.2.0", "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" @@ -738,6 +879,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -1070,6 +1218,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-jsx-self@^7.12.10": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60" + integrity sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.10.4", "@babel/plugin-transform-react-jsx-source@^7.9.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz#d07de6863f468da0809edcf79a1aa8ce2a82a26b" @@ -1077,6 +1232,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-jsx-source@^7.12.10": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb" + integrity sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.10.4", "@babel/plugin-transform-react-jsx@^7.12.10", "@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.3.0", "@babel/plugin-transform-react-jsx@^7.9.1", "@babel/plugin-transform-react-jsx@^7.9.4": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.12.tgz#b0da51ffe5f34b9a900e9f1f5fb814f9e512d25e" @@ -1711,6 +1873,15 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.6.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" @@ -1756,6 +1927,21 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.4": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.7.tgz#572a722408681cef17d6b0bef69ef2e728ca69f1" @@ -1798,6 +1984,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@bahmutov/all-paths@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@bahmutov/all-paths/-/all-paths-1.0.2.tgz#9ae0dcdf9022dd6e5e14d7fda3479e6a330d035b" @@ -5758,6 +5953,13 @@ dependencies: "@types/react" "*" +"@types/react-dom@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.0.tgz#b3b691eb956c4b3401777ee67b900cb28415d95a" + integrity sha512-lUqY7OlkF/RbNtD5nIq7ot8NquXrdFrjSOR6+w9a9RFQevGi1oZO1dcJbXMeONAPKtZ2UrZOEJ5UOCVsxbLk/g== + dependencies: + "@types/react" "*" + "@types/react-transition-group@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d" @@ -5765,7 +5967,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@16.9.50", "@types/react@^16.9.11", "@types/react@^16.9.23": +"@types/react@*", "@types/react@16.9.50", "@types/react@^16.9.11", "@types/react@^16.9.23", "@types/react@^17.0.0": version "16.9.50" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.50.tgz#cb5f2c22d42de33ca1f5efc6a0959feb784a3a2d" integrity sha512-kPx5YsNnKDJejTk1P+lqThwxN2PczrocwsvqXnjvVvKpFescoY62ZiM3TV7dH1T8lFhlHZF+PE5xUyimUwqEGA== @@ -6165,6 +6367,17 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@vitejs/plugin-react-refresh@^1.1.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-refresh/-/plugin-react-refresh-1.3.0.tgz#d12fd79cb33f48ea9891c6eee8d6921cbe2caa26" + integrity sha512-6N4CqjzGFcbSTeiC90BPDm2QVo5qkIdqSJQNvuASB3U48+GTJTvUwBGaru46FgEni4eYKM9xBdqYoBhCAfkPLA== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-transform-react-jsx-self" "^7.12.10" + "@babel/plugin-transform-react-jsx-source" "^7.12.10" + react-refresh "^0.9.0" + "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" @@ -27969,6 +28182,15 @@ react-dom@^16.0.0: prop-types "^15.6.2" scheduler "^0.19.1" +react-dom@^17.0.0: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6" + integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.1" + react-error-overlay@^6.0.3, react-error-overlay@^6.0.7: version "6.0.8" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz#474ed11d04fc6bda3af643447d85e9127ed6b5de" @@ -28094,6 +28316,11 @@ react-refresh@0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-refresh@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf" + integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ== + react-remove-scroll-bar@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.1.1.tgz#5876428dfd546f2f63a4d277aea2197925505c1e" @@ -28366,6 +28593,14 @@ react@^16.0.0, react@^16.13.1: object-assign "^4.1.1" prop-types "^15.6.2" +react@^17.0.0: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" + integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + read-all-stream@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" @@ -29487,6 +29722,13 @@ rollup@^2.35.1: optionalDependencies: fsevents "~2.1.2" +rollup@^2.38.5: + version "2.38.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.38.5.tgz#be41ad4fe0c103a8794377afceb5f22b8f603d6a" + integrity sha512-VoWt8DysFGDVRGWuHTqZzT02J0ASgjVq/hPs9QcBOGMd7B+jfTr/iqMVEyOi901rE3xq+Deq66GzIT1yt7sGwQ== + optionalDependencies: + fsevents "~2.3.1" + rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -29733,6 +29975,14 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@^0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c" + integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@2.7.1, schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.2.0, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0, schema-utils@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" @@ -33050,6 +33300,11 @@ typescript@^3.0.3, typescript@^3.8.3, typescript@^3.9.7: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typescript@^4.1.2: + version "4.1.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.4.tgz#f058636e2f4f83f94ddaae07b20fd5e14598432f" + integrity sha512-+Uru0t8qIRgjuCpiSPpfGuhHecMllk5Zsazj5LZvVsEStEjmIRRBZe+jHjGQvsgS7M1wONy2PQXd67EMyV6acg== + typescript@next: version "4.2.0-dev.20210111" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.0-dev.20210111.tgz#99ca27c711ea2e5901f0b2f8dc1c8c1cd322fe12" @@ -34153,6 +34408,18 @@ vite@2.0.0-beta.59: optionalDependencies: fsevents "~2.1.2" +vite@^2.0.0-beta.65: + version "2.0.0-beta.67" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.0.0-beta.67.tgz#2d4e7a62a925539448bd18154008afb2b4484a07" + integrity sha512-QNxIRajidVG3ejikBUb17NgCV1bJ9UyKHBdItgw1O/ljQ1hBoph5I2/DrviqV4G9H3WP7teXk5vwQWuCVS9fqQ== + dependencies: + esbuild "^0.8.34" + postcss "^8.2.1" + resolve "^1.19.0" + rollup "^2.38.5" + optionalDependencies: + fsevents "~2.3.1" + vm-browserify@1.1.2, vm-browserify@^1.0.0, vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"