From d2e11244e6f0f3f2b7bf652c532c82a7b98eb470 Mon Sep 17 00:00:00 2001 From: Tim Griesser Date: Tue, 19 Apr 2022 20:19:54 -0400 Subject: [PATCH] wip on AST merging Cypress Config --- packages/config/package.json | 8 +- .../src/ast-utils/addToCypressConfig.ts | 156 ++++++++++++++ .../src/ast-utils/addToCypressConfigPlugin.ts | 190 ++++++++++++++++++ .../config/src/ast-utils/astConfigHelpers.ts | 40 ++++ .../src/ast-utils/readFromCypressConfig.ts | 14 ++ .../destructure-require-ts/code.ts | 4 + .../destructure-require-ts/output.ts | 7 + .../export-default-ts/code.ts | 3 + .../export-default-ts/output.ts | 3 + .../adding-component/export-equals-ts/code.ts | 3 + .../export-equals-ts/output.ts | 3 + .../adding-component/import-alias-ts/code.ts | 5 + .../import-alias-ts/output.ts | 5 + .../adding-component/import-equals-ts/code.ts | 3 + .../import-equals-ts/output.ts | 3 + .../module-exports-ts/code.ts | 3 + .../module-exports-ts/output.ts | 3 + .../addToCypressConfigPlugin.spec.ts | 44 ++++ packages/config/test/{unit => }/index.spec.ts | 2 +- .../config/test/{unit => }/validation.spec.ts | 2 +- packages/data-context/package.json | 2 +- .../src/sources/migration/codegen.ts | 28 ++- yarn.lock | 155 ++++++++------ 23 files changed, 607 insertions(+), 79 deletions(-) create mode 100644 packages/config/src/ast-utils/addToCypressConfig.ts create mode 100644 packages/config/src/ast-utils/addToCypressConfigPlugin.ts create mode 100644 packages/config/src/ast-utils/astConfigHelpers.ts create mode 100644 packages/config/src/ast-utils/readFromCypressConfig.ts create mode 100644 packages/config/test/__fixtures__/adding-component/destructure-require-ts/code.ts create mode 100644 packages/config/test/__fixtures__/adding-component/destructure-require-ts/output.ts create mode 100644 packages/config/test/__fixtures__/adding-component/export-default-ts/code.ts create mode 100644 packages/config/test/__fixtures__/adding-component/export-default-ts/output.ts create mode 100644 packages/config/test/__fixtures__/adding-component/export-equals-ts/code.ts create mode 100644 packages/config/test/__fixtures__/adding-component/export-equals-ts/output.ts create mode 100644 packages/config/test/__fixtures__/adding-component/import-alias-ts/code.ts create mode 100644 packages/config/test/__fixtures__/adding-component/import-alias-ts/output.ts create mode 100644 packages/config/test/__fixtures__/adding-component/import-equals-ts/code.ts create mode 100644 packages/config/test/__fixtures__/adding-component/import-equals-ts/output.ts create mode 100644 packages/config/test/__fixtures__/adding-component/module-exports-ts/code.ts create mode 100644 packages/config/test/__fixtures__/adding-component/module-exports-ts/output.ts create mode 100644 packages/config/test/ast-utils/addToCypressConfigPlugin.spec.ts rename packages/config/test/{unit => }/index.spec.ts (99%) rename packages/config/test/{unit => }/validation.spec.ts (99%) diff --git a/packages/config/package.json b/packages/config/package.json index 585cd329d97a..1b684ce2f20f 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -12,12 +12,17 @@ "clean": "rimraf --glob ./src/*.js ./src/**/*.js ./src/**/**/*.js ./test/**/*.js || echo 'cleaned'", "test": "yarn test-unit", "test-debug": "yarn test-unit --inspect-brk=5566", - "test-unit": "mocha --configFile=../../mocha-reporter-config.json -r @packages/ts/register test/unit/**/*.spec.ts --exit" + "test-unit": "mocha --configFile=../../mocha-reporter-config.json -r @packages/ts/register test/**/*.spec.ts --exit" }, "dependencies": { + "@babel/core": "^7", + "@babel/plugin-syntax-typescript": "^7", + "@babel/plugin-transform-typescript": "^7", + "@babel/types": "^7", "check-more-types": "2.24.0", "common-tags": "1.8.0", "debug": "^4.3.2", + "fs-extra": "^9.1.0", "lodash": "^4.17.21" }, "devDependencies": { @@ -25,6 +30,7 @@ "@packages/ts": "0.0.0-development", "@packages/types": "0.0.0-development", "@types/mocha": "9.1.0", + "babel-plugin-tester": "^10.1.0", "chai": "4.2.0", "mocha": "7.0.1", "rimraf": "3.0.2" diff --git a/packages/config/src/ast-utils/addToCypressConfig.ts b/packages/config/src/ast-utils/addToCypressConfig.ts new file mode 100644 index 000000000000..e87dec17865c --- /dev/null +++ b/packages/config/src/ast-utils/addToCypressConfig.ts @@ -0,0 +1,156 @@ +import * as t from '@babel/types' +import * as babel from '@babel/core' +import fs from 'fs-extra' +import dedent from 'dedent' +import path from 'path' + +import { addToCypressConfigPlugin } from './addToCypressConfigPlugin' +import { addComponentDefinition, addE2EDefinition, ASTComponentDefinitionConfig } from './astConfigHelpers' + +/** + * Adds to the Cypress config, using the Babel AST utils. + * + * Injects the at the top of the config definition, based on the common patterns of: + * + * export default { ... + * + * export default defineConfig({ ... + * + * module.exports = { ... + * + * module.exports = defineConfig({ ... + * + * export = { ... + * + * export = defineConfig({ ... + * + * If we don't match one of these, we'll use the rest-spread pattern on whatever + * the current default export of the file is: + * + * current: + * export default createConfigFn() + * + * becomes: + * export default { + * projectId: '...', + * ...createConfigFn() + * } + */ +export async function addToCypressConfig (code: string, toAdd: t.ObjectProperty) { + return babel.transformAsync(code, { + babelrc: false, + parserOpts: { + errorRecovery: true, + strictMode: false, + }, + plugins: [ + addToCypressConfigPlugin(toAdd), + ], + }) +} + +export interface AddProjectIdToCypressConfigOptions { + filePath: string + projectId: string +} + +export async function addProjectIdToCypressConfig (options: AddProjectIdToCypressConfigOptions) { + try { + let result = await fs.readFile(options.filePath, 'utf8') + const { code: toPrint } = await addToCypressConfig(result, t.objectProperty( + t.identifier('projectId'), + t.identifier(options.projectId), + )) + + await fs.writeFile(options.filePath, maybeFormatWithPrettier(toPrint, options.filePath)) + + return { + result: 'ADDED', + } + } catch (e) { + return { + result: 'NEEDS_MERGE', + error: e, + } + } +} + +export interface AddTestingTypeToCypressConfigFile { + result: 'ADDED' | 'NEEDS_MERGE' + error?: Error +} + +export interface AddTestingTypeToCypressConfigOptions extends AddProjectIdToCypressConfigOptions { + outputType: 'ts' | 'js' | 'esm' + info: ASTComponentDefinitionConfig | { + testingType: 'e2e' + } +} + +export async function addTestingTypeToCypressConfig (options: AddTestingTypeToCypressConfigOptions): Promise { + try { + let result: string + + try { + result = await fs.readFile(options.filePath, 'utf8') + } catch { + // + } + + // If for some reason they have deleted the contents of the file, we want to recover + // gracefully by adding some default code to use as the AST here, based on the outputType + if (!result || result.trim() === '') { + result = getEmptyCodeBlock(options.outputType) + } + + const toAdd = options.info.testingType === 'e2e' ? addE2EDefinition() : addComponentDefinition(options.info) + const { code: toPrint } = await addToCypressConfig(result, toAdd) + + await fs.writeFile(options.filePath, maybeFormatWithPrettier(toPrint, options.filePath)) + + return { + result: 'ADDED', + } + } catch (e) { + return { + result: 'NEEDS_MERGE', + error: e, + } + } +} + +// Necessary to handle the edge case of them deleting the contents of their Cypress +// config file, just before we merge in the testing type +function getEmptyCodeBlock (outputType: 'js' | 'ts' | 'esm') { + if (outputType === 'js') { + return dedent` + const { defineConfig } = require('cypress') + + module.exports = defineConfig({ + + }) + ` + } + + return dedent` + import { defineConfig } from 'cypress' + + export default defineConfig({ + + }) + ` +} + +function maybeFormatWithPrettier (code: string, filePath: string) { + try { + const prettierImportPath = require.resolve('prettier', { paths: [path.dirname(filePath)] }) + const prettier = require(prettierImportPath) as typeof import('prettier') + + return prettier.format(code, { + filepath: filePath, + }) + } catch { + // + return code + } +} diff --git a/packages/config/src/ast-utils/addToCypressConfigPlugin.ts b/packages/config/src/ast-utils/addToCypressConfigPlugin.ts new file mode 100644 index 000000000000..128eea384f2b --- /dev/null +++ b/packages/config/src/ast-utils/addToCypressConfigPlugin.ts @@ -0,0 +1,190 @@ +import type { ParserOptions, PluginItem, Visitor } from '@babel/core' +import * as t from '@babel/types' + +/** + * Standardizes our approach to writing values into the existing + * Cypress config file. Attempts to handle the pragmatic cases, + * finding the + * + * @param toAdd k/v Object Property to append to the current object + * @returns + */ +export function addToCypressConfigPlugin (toAdd: t.ObjectProperty): PluginItem { + /** + * Based on the import syntax, we look for the "defineConfig" identifier, and whether it + * has been reassigned + */ + const defineConfigIdentifiers: Array = [] + /** + * Checks whether we've seen the identifier + */ + let seenConfigIdentifierCall = false + + // Returns the ObjectExpression associated with the defineConfig call, + // so we can add in the "toAdd" object property + function getDefineConfigExpression (node: t.CallExpression): t.ObjectExpression | undefined { + for (const possibleIdentifier of defineConfigIdentifiers) { + if (typeof possibleIdentifier === 'string') { + if (t.isIdentifier(node.callee) && node.callee.name === possibleIdentifier && t.isObjectExpression(node.arguments[0])) { + return node.arguments[0] + } + } else if (Array.isArray(possibleIdentifier)) { + if (t.isMemberExpression(node.callee) && + t.isIdentifier(node.callee.object) && + t.isIdentifier(node.callee.property) && + node.callee.object.name === possibleIdentifier[0] && + node.callee.property.name === possibleIdentifier[1] && + t.isObjectExpression(node.arguments[0]) + ) { + return node.arguments[0] + } + } + } + + return undefined + } + + // Visits the program ahead-of-time, to know what transforms we need to do + // on the source when we output the addition + const nestedVisitor: Visitor = { + ImportDeclaration (path) { + // Skip "import type" for the purpose of finding the defineConfig identifier, + // and skip if we see a non "cypress" import, since that's the only one we care about finding + if (path.node.importKind === 'type' || path.node.source.value !== 'cypress') { + return + } + + for (const specifier of path.node.specifiers) { + if (specifier.type === 'ImportNamespaceSpecifier' || specifier.type === 'ImportDefaultSpecifier') { + defineConfigIdentifiers.push([specifier.local.name, 'defineConfig']) + } else { + defineConfigIdentifiers.push(specifier.local.name) + } + } + }, + VariableDeclaration (path) { + // We only care about the top-level variable declarations for requires + if (path.parent.type !== 'Program') { + return + } + + const cyImportDeclarations = path.node.declarations.filter((d) => { + return ( + t.isCallExpression(d.init) && + t.isIdentifier(d.init.callee) && + d.init.callee.name === 'require' && + t.isStringLiteral(d.init.arguments[0]) && + d.init.arguments[0].value === 'cypress' + ) + }) + + for (const variableDeclaration of cyImportDeclarations) { + if (t.isIdentifier(variableDeclaration.id)) { + defineConfigIdentifiers.push([variableDeclaration.id.name, 'defineConfig']) + } else if (t.isObjectPattern(variableDeclaration.id)) { + for (const prop of variableDeclaration.id.properties) { + if (t.isObjectProperty(prop) && t.isIdentifier(prop.key) && t.isIdentifier(prop.value)) { + if (prop.key.name === 'defineConfig') { + defineConfigIdentifiers.push(prop.value.name) + } + } + } + } + } + }, + CallExpression (path) { + if (getDefineConfigExpression(path.node)) { + seenConfigIdentifierCall = true + } + }, + } + + let didAdd = false + + return { + name: 'addToCypressConfigPlugin', + manipulateOptions (t, parserOpts: ParserOptions) { + parserOpts.errorRecovery = true + if ( + parserOpts.plugins.some( + (p: any) => (Array.isArray(p) ? p[0] : p) === 'typescript', + ) + ) { + return + } + + parserOpts.plugins.push('typescript') + }, + visitor: { + Program: { + enter (path) { + path.traverse(nestedVisitor) + }, + exit () { + if (!didAdd) { + throw new Error('Unable to add the properties to the file') + } + }, + }, + CallExpression (path) { + if (seenConfigIdentifierCall && !didAdd) { + const defineConfigExpression = getDefineConfigExpression(path.node) + + if (defineConfigExpression) { + defineConfigExpression.properties.push(toAdd) + didAdd = true + } + } + }, + ExportDefaultDeclaration (path) { + // Exit if we've seen the defineConfig({ ... called elsewhere, + // since this is where we'll be adding the object props + if (seenConfigIdentifierCall || didAdd) { + return + } + + // export default {} + if (t.isObjectExpression(path.node.declaration)) { + path.node.declaration.properties.push(toAdd) + didAdd = true + } else if (t.isExpression(path.node.declaration)) { + path.node.declaration = spreadResult(path.node.declaration, toAdd) + didAdd = true + } + }, + AssignmentExpression (path) { + // Exit if we've seen the defineConfig({ ... called elsewhere, + // since this is where we'll be adding the object props + if (seenConfigIdentifierCall || didAdd) { + return + } + + if (t.isMemberExpression(path.node.left) && isModuleExports(path.node.left)) { + if (t.isObjectExpression(path.node.right)) { + path.node.right.properties.push(toAdd) + didAdd = true + } else if (t.isExpression(path.node.right)) { + path.node.right = spreadResult(path.node.right, toAdd) + didAdd = true + } + } + }, + }, + } +} + +function spreadResult (expr: t.Expression, toAdd: t.ObjectProperty): t.ObjectExpression { + return t.objectExpression([ + t.spreadElement(expr), + toAdd, + ]) +} + +function isModuleExports (node: t.MemberExpression) { + return ( + t.isIdentifier(node.object) && + node.object.name === 'module' && + t.isIdentifier(node.property) && + node.property.name === 'exports' + ) +} diff --git a/packages/config/src/ast-utils/astConfigHelpers.ts b/packages/config/src/ast-utils/astConfigHelpers.ts new file mode 100644 index 000000000000..bc076ce68d3a --- /dev/null +++ b/packages/config/src/ast-utils/astConfigHelpers.ts @@ -0,0 +1,40 @@ +import * as t from '@babel/types' + +/** + * AST definition Node for: + * + * e2e: {} + */ +export function addE2EDefinition (): t.ObjectProperty { + return t.objectProperty(t.identifier('e2e'), t.objectExpression([])) +} + +export interface ASTComponentDefinitionConfig { + testingType: 'component' + bundler: 'vite' | 'webpack' + framework?: string +} + +/** + * AST definition Node for: + * + * component: { + * devServer: { + * bundler: 'bundler', + * framework: 'framework', + * } + * } + */ +export function addComponentDefinition (config: ASTComponentDefinitionConfig): t.ObjectProperty { + const properties: Parameters[0] = [ + t.objectProperty(t.identifier('bundler'), t.identifier(config.bundler)), + ] + + if (config.framework) { + properties.push(t.objectProperty(t.identifier('framework'), t.identifier(config.framework))) + } + + return t.objectProperty(t.identifier('component'), t.objectExpression([ + t.objectProperty(t.identifier('devServer'), t.objectExpression(properties)), + ])) +} diff --git a/packages/config/src/ast-utils/readFromCypressConfig.ts b/packages/config/src/ast-utils/readFromCypressConfig.ts new file mode 100644 index 000000000000..f01818fb9df1 --- /dev/null +++ b/packages/config/src/ast-utils/readFromCypressConfig.ts @@ -0,0 +1,14 @@ +export interface ReadPropertyFromCypressConfigAstOptions { + configFilePath: string +} + +/** + * If we want to read off a property from the Cypress config, + * without executing the file. The primary use case for this is + * for finding the `projectId` when it's defined in the config file. + */ +export function readPropertyFromCypressConfigAST ( + options: ReadPropertyFromCypressConfigAstOptions, +) { + // +} diff --git a/packages/config/test/__fixtures__/adding-component/destructure-require-ts/code.ts b/packages/config/test/__fixtures__/adding-component/destructure-require-ts/code.ts new file mode 100644 index 000000000000..82d3167636a4 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/destructure-require-ts/code.ts @@ -0,0 +1,4 @@ +const { defineConfig: cypressDefineConfig } = require('cypress') + +export default cypressDefineConfig({ +}) diff --git a/packages/config/test/__fixtures__/adding-component/destructure-require-ts/output.ts b/packages/config/test/__fixtures__/adding-component/destructure-require-ts/output.ts new file mode 100644 index 000000000000..12d1f8f8f0e9 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/destructure-require-ts/output.ts @@ -0,0 +1,7 @@ +const { defineConfig: cypressDefineConfig } = require('cypress') + +export default cypressDefineConfig({ + e2e: { + setupNodeEvents () {}, + }, +}) diff --git a/packages/config/test/__fixtures__/adding-component/export-default-ts/code.ts b/packages/config/test/__fixtures__/adding-component/export-default-ts/code.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/export-default-ts/code.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/__fixtures__/adding-component/export-default-ts/output.ts b/packages/config/test/__fixtures__/adding-component/export-default-ts/output.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/export-default-ts/output.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/__fixtures__/adding-component/export-equals-ts/code.ts b/packages/config/test/__fixtures__/adding-component/export-equals-ts/code.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/export-equals-ts/code.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/__fixtures__/adding-component/export-equals-ts/output.ts b/packages/config/test/__fixtures__/adding-component/export-equals-ts/output.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/export-equals-ts/output.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/__fixtures__/adding-component/import-alias-ts/code.ts b/packages/config/test/__fixtures__/adding-component/import-alias-ts/code.ts new file mode 100644 index 000000000000..50ce9a26c6b0 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/import-alias-ts/code.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'cypress' + +export default defineConfig({ + e2e: {}, +}) diff --git a/packages/config/test/__fixtures__/adding-component/import-alias-ts/output.ts b/packages/config/test/__fixtures__/adding-component/import-alias-ts/output.ts new file mode 100644 index 000000000000..50ce9a26c6b0 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/import-alias-ts/output.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'cypress' + +export default defineConfig({ + e2e: {}, +}) diff --git a/packages/config/test/__fixtures__/adding-component/import-equals-ts/code.ts b/packages/config/test/__fixtures__/adding-component/import-equals-ts/code.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/import-equals-ts/code.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/__fixtures__/adding-component/import-equals-ts/output.ts b/packages/config/test/__fixtures__/adding-component/import-equals-ts/output.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/import-equals-ts/output.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/__fixtures__/adding-component/module-exports-ts/code.ts b/packages/config/test/__fixtures__/adding-component/module-exports-ts/code.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/module-exports-ts/code.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/__fixtures__/adding-component/module-exports-ts/output.ts b/packages/config/test/__fixtures__/adding-component/module-exports-ts/output.ts new file mode 100644 index 000000000000..2fc45a20fc41 --- /dev/null +++ b/packages/config/test/__fixtures__/adding-component/module-exports-ts/output.ts @@ -0,0 +1,3 @@ +export default { + e2e: {}, +} diff --git a/packages/config/test/ast-utils/addToCypressConfigPlugin.spec.ts b/packages/config/test/ast-utils/addToCypressConfigPlugin.spec.ts new file mode 100644 index 000000000000..17dd204e9a93 --- /dev/null +++ b/packages/config/test/ast-utils/addToCypressConfigPlugin.spec.ts @@ -0,0 +1,44 @@ +import pluginTester from 'babel-plugin-tester' +import * as t from '@babel/types' +import path from 'path' + +import { addToCypressConfigPlugin } from '../../src/ast-utils/addToCypressConfigPlugin' + +function setupNodeEvents () { + return t.objectMethod( + 'method', + t.identifier('setupNodeEvents'), + [], + t.blockStatement([]), + ) +} + +pluginTester({ + plugin: addToCypressConfigPlugin( + t.objectProperty( + t.identifier('e2e'), + t.objectExpression([setupNodeEvents()]), + ), + ), + fixtures: path.join(__dirname, '..', '__fixtures__', 'adding-e2e'), +}) + +pluginTester({ + plugin: addToCypressConfigPlugin( + t.objectProperty( + t.identifier('e2e'), + t.objectExpression([setupNodeEvents()]), + ), + ), + fixtures: path.join(__dirname, '..', '__fixtures__', 'adding-component'), +}) + +pluginTester({ + plugin: addToCypressConfigPlugin( + t.objectProperty( + t.identifier('projectId'), + t.identifier('abc1234'), + ), + ), + fixtures: path.join(__dirname, '..', '__fixtures__', 'adding-projectId'), +}) diff --git a/packages/config/test/unit/index.spec.ts b/packages/config/test/index.spec.ts similarity index 99% rename from packages/config/test/unit/index.spec.ts rename to packages/config/test/index.spec.ts index a4ce4e46d732..8681d37520ac 100644 --- a/packages/config/test/unit/index.spec.ts +++ b/packages/config/test/index.spec.ts @@ -3,7 +3,7 @@ import snapshot from 'snap-shot-it' import sinon from 'sinon' import sinonChai from 'sinon-chai' -import * as configUtil from '../../src/index' +import * as configUtil from '../src/index' chai.use(sinonChai) const { expect } = chai diff --git a/packages/config/test/unit/validation.spec.ts b/packages/config/test/validation.spec.ts similarity index 99% rename from packages/config/test/unit/validation.spec.ts rename to packages/config/test/validation.spec.ts index ff8566e2ddfb..fec03a2a9a93 100644 --- a/packages/config/test/unit/validation.spec.ts +++ b/packages/config/test/validation.spec.ts @@ -1,7 +1,7 @@ import snapshot from 'snap-shot-it' import { expect } from 'chai' -import * as validation from '../../src/validation' +import * as validation from '../src/validation' describe('src/validation', () => { const mockKey = 'mockConfigKey' diff --git a/packages/data-context/package.json b/packages/data-context/package.json index 19d75af4faf3..7460fd5c3e5a 100644 --- a/packages/data-context/package.json +++ b/packages/data-context/package.json @@ -41,7 +41,6 @@ "node-machine-id": "1.1.12", "p-defer": "^3.0.0", "parse-glob": "3.0.4", - "prettier": "2.5.1", "randexp": "0.5.3", "randomstring": "1.1.5", "resolve-from": "^5.0.0", @@ -70,6 +69,7 @@ "@types/prettier": "2.4.3", "@types/stringify-object": "^3.0.0", "mocha": "7.0.1", + "prettier": "2.5.1", "rimraf": "3.0.2", "tslint": "^6.1.3" }, diff --git a/packages/data-context/src/sources/migration/codegen.ts b/packages/data-context/src/sources/migration/codegen.ts index 9306265e6d65..609caba9a3a4 100644 --- a/packages/data-context/src/sources/migration/codegen.ts +++ b/packages/data-context/src/sources/migration/codegen.ts @@ -2,7 +2,6 @@ import chokidar from 'chokidar' import fs from 'fs-extra' import path from 'path' import globby from 'globby' -import prettier from 'prettier' import type { TestingType } from '@packages/types' import { formatMigrationFile } from './format' import { substitute } from './autoRename' @@ -173,6 +172,7 @@ function createCypressConfig (config: ConfigOptions, pluginPath: string | undefi `import { defineConfig } from 'cypress' export default defineConfig({${globalString}${e2eString}${componentString}})`, + options.projectRoot, ) } @@ -180,14 +180,15 @@ function createCypressConfig (config: ConfigOptions, pluginPath: string | undefi `const { defineConfig } = require('cypress') module.exports = defineConfig({${globalString}${e2eString}${componentString}})`, + options.projectRoot, ) } if (options.hasTypescript) { - return formatConfig(`export default {${globalString}${e2eString}${componentString}}`) + return formatConfig(`export default {${globalString}${e2eString}${componentString}}`, options.projectRoot) } - return formatConfig(`module.exports = {${globalString}${e2eString}${componentString}}`) + return formatConfig(`module.exports = {${globalString}${e2eString}${componentString}}`, options.projectRoot) } function formatObjectForConfig (obj: Record) { @@ -448,11 +449,18 @@ export function getSpecPattern (cfg: LegacyCypressConfigJson, testType: TestingT return specPattern } -export function formatConfig (config: string) { - return prettier.format(config, { - semi: false, - singleQuote: true, - endOfLine: 'lf', - parser: 'babel', - }) +export function formatConfig (config: string, projectRoot: string): string { + try { + const prettierPath = require.resolve('prettier', { paths: [projectRoot] }) + const prettier = require(prettierPath) + + return prettier.format(config, { + semi: false, + singleQuote: true, + endOfLine: 'lf', + parser: 'babel', + }) + } catch (e) { + return config + } } diff --git a/yarn.lock b/yarn.lock index 972e274b44be..03db3ff88bb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1141,10 +1141,10 @@ dependencies: "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.12.7", "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.5", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.9.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" - integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== +"@babel/compat-data@^7.12.7", "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.5", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.9.0": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" + integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== "@babel/core@7.12.10": version "7.12.10" @@ -1272,25 +1272,25 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.0.0", "@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.11.0", "@babel/core@^7.11.1", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.17.2", "@babel/core@^7.4.5", "@babel/core@^7.5.4", "@babel/core@^7.7.5", "@babel/core@^7.8.6", "@babel/core@^7.9.6": - version "7.17.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" - integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== +"@babel/core@^7", "@babel/core@^7.0.0", "@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.11.0", "@babel/core@^7.11.1", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.17.2", "@babel/core@^7.4.5", "@babel/core@^7.5.4", "@babel/core@^7.7.5", "@babel/core@^7.8.6", "@babel/core@^7.9.6": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" + integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.3" + "@babel/generator" "^7.17.9" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.9" "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" + "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" + json5 "^2.2.1" semver "^6.3.0" "@babel/generator@7.12.11": @@ -1302,10 +1302,10 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.15.4", "@babel/generator@^7.17.3", "@babel/generator@^7.4.0", "@babel/generator@^7.4.4", "@babel/generator@^7.5.0", "@babel/generator@^7.6.0", "@babel/generator@^7.8.3", "@babel/generator@^7.9.0": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" - integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== +"@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.15.4", "@babel/generator@^7.17.9", "@babel/generator@^7.4.0", "@babel/generator@^7.4.4", "@babel/generator@^7.5.0", "@babel/generator@^7.6.0", "@babel/generator@^7.8.3", "@babel/generator@^7.9.0": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" + integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== dependencies: "@babel/types" "^7.17.0" jsesc "^2.5.1" @@ -1326,12 +1326,12 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.12.5", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.8.7", "@babel/helper-compilation-targets@^7.9.6": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== +"@babel/helper-compilation-targets@^7.12.5", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.8.7", "@babel/helper-compilation-targets@^7.9.6": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" + integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== dependencies: - "@babel/compat-data" "^7.16.4" + "@babel/compat-data" "^7.17.7" "@babel/helper-validator-option" "^7.16.7" browserslist "^4.17.5" semver "^6.3.0" @@ -1408,21 +1408,13 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.15.4", "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== +"@babel/helper-function-name@^7.15.4", "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9", "@babel/helper-function-name@^7.8.3": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== dependencies: - "@babel/helper-get-function-arity" "^7.16.7" "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.17.0" "@babel/helper-hoist-variables@^7.15.4", "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" @@ -1445,7 +1437,7 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.9.0": +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7", "@babel/helper-module-transforms@^7.9.0": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== @@ -1537,13 +1529,13 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.17.2", "@babel/helpers@^7.4.4", "@babel/helpers@^7.6.0", "@babel/helpers@^7.8.3", "@babel/helpers@^7.9.0": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" - integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.17.9", "@babel/helpers@^7.4.4", "@babel/helpers@^7.6.0", "@babel/helpers@^7.8.3", "@babel/helpers@^7.9.0": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== dependencies: "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" + "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" "@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7", "@babel/highlight@^7.8.3": @@ -1565,10 +1557,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.4.3", "@babel/parser@^7.4.5", "@babel/parser@^7.6.0", "@babel/parser@^7.7.0", "@babel/parser@^7.8.3", "@babel/parser@^7.9.0", "@babel/parser@^7.9.6": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" - integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9", "@babel/parser@^7.4.3", "@babel/parser@^7.4.5", "@babel/parser@^7.6.0", "@babel/parser@^7.7.0", "@babel/parser@^7.8.3", "@babel/parser@^7.9.0", "@babel/parser@^7.9.6": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" + integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" @@ -1955,7 +1947,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.16.7": +"@babel/plugin-syntax-typescript@^7", "@babel/plugin-syntax-typescript@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== @@ -2344,7 +2336,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-typescript@^7.10.1", "@babel/plugin-transform-typescript@^7.10.4", "@babel/plugin-transform-typescript@^7.16.7", "@babel/plugin-transform-typescript@^7.16.8", "@babel/plugin-transform-typescript@^7.2.0", "@babel/plugin-transform-typescript@^7.3.2", "@babel/plugin-transform-typescript@^7.9.0": +"@babel/plugin-transform-typescript@^7", "@babel/plugin-transform-typescript@^7.10.1", "@babel/plugin-transform-typescript@^7.10.4", "@babel/plugin-transform-typescript@^7.16.7", "@babel/plugin-transform-typescript@^7.16.8", "@babel/plugin-transform-typescript@^7.2.0", "@babel/plugin-transform-typescript@^7.3.2", "@babel/plugin-transform-typescript@^7.9.0": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== @@ -2971,18 +2963,18 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.6.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" - integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.6.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" + integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== dependencies: "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" + "@babel/generator" "^7.17.9" "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.3" + "@babel/parser" "^7.17.9" "@babel/types" "^7.17.0" debug "^4.1.0" globals "^11.1.0" @@ -2995,7 +2987,7 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@7.17.0", "@babel/types@^7.0.0", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.15.4", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0", "@babel/types@^7.6.0", "@babel/types@^7.6.1", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": +"@babel/types@7.17.0", "@babel/types@^7", "@babel/types@^7.0.0", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.15.4", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0", "@babel/types@^7.6.0", "@babel/types@^7.6.1", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== @@ -5661,9 +5653,9 @@ integrity sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg== "@jridgewell/trace-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.2.tgz#e051581782a770c30ba219634f2019241c5d3cde" - integrity sha512-9KzzH4kMjA2XmBRHfqG2/Vtl7s92l6uNDd0wW7frDE+EUvQFGqNXhWp0UGJjSkt3v2AYjzOZn1QO9XaTNJIt1Q== + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -9275,15 +9267,23 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b" integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg== +"@types/babel-plugin-tester@^9.0.0": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/babel-plugin-tester/-/babel-plugin-tester-9.0.4.tgz#f5f9274149c6c789984f69ae4edbc383e33f679c" + integrity sha512-s7SxUNtUWO/bWZZqJbFqY/tbqJFoYnW/M2zPkTHl406PAPoWVSaVyYElo/O3GcRAQ5CV/pLPTFV4tQYTpMDWEQ== + dependencies: + "@types/babel__core" "*" + "@types/prettier" "*" + "@types/babel__code-frame@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz#eda94e1b7c9326700a4b69c485ebbc9498a0b63f" integrity sha512-2TN6oiwtNjOezilFVl77zwdNPwQWaDBBCCWWxyo1ctiO3vAtd7H/aB/CBJdw9+kqq3+latD0SXoedIuHySSZWw== -"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.2", "@types/babel__core@^7.1.6": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== +"@types/babel__core@*", "@types/babel__core@^7.1.0", "@types/babel__core@^7.1.2", "@types/babel__core@^7.1.6": + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -10045,6 +10045,11 @@ dependencies: "@types/node" "*" +"@types/prettier@*": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" + integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== + "@types/prettier@2.4.3": version "2.4.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.3.tgz#a3c65525b91fca7da00ab1a3ac2b5a2a4afbffbf" @@ -13765,6 +13770,16 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-plugin-tester@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-tester/-/babel-plugin-tester-10.1.0.tgz#e099ee1d8dec538439c427a7d12aad132885757b" + integrity sha512-4P2tNaM/Mtg6ytA9YAqmgONnMYqWvdbGDuwRTpIIC9yFZGQrEHoyvDPCx+X1QALAufVb5DKieOPGj5dffiEiNg== + dependencies: + "@types/babel-plugin-tester" "^9.0.0" + lodash.mergewith "^4.6.2" + prettier "^2.0.1" + strip-indent "^3.0.0" + babel-plugin-transform-async-generator-functions@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" @@ -27809,7 +27824,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0, json5@^2.1.2, json5@^2.1.3, json5@^2.2.0: +json5@^2.1.0, json5@^2.1.2, json5@^2.1.3, json5@^2.2.0, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== @@ -29215,6 +29230,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + lodash.omit@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" @@ -35115,6 +35135,11 @@ prettier@^1.16.4, prettier@^1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.0.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + prettier@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"