Skip to content

Commit c8c5b51

Browse files
ryanthemanuelsnyk-botcypress-bot[bot]
authored
dependency: packages/data-context/package.json to reduce vulnerabilities (#28063)
Co-authored-by: snyk-bot <[email protected]> Co-authored-by: cypress-bot[bot] <+cypress-bot[bot]@users.noreply.github.com>
1 parent 861474f commit c8c5b51

File tree

12 files changed

+551
-473
lines changed

12 files changed

+551
-473
lines changed

cli/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
<!-- See the ../guides/writing-the-cypress-changelog.md for details on writing the changelog. -->
2+
## 13.3.2
3+
4+
_Released 10/25/2023 (PENDING)_
5+
6+
**Dependency Updates:**
7+
8+
- Upgraded [`@babel/core`](https://www.npmjs.com/package/@babel/core) from `7.22.9` to `7.23.2` to address the [SNYK-JS-SEMVER-3247795](https://snyk.io/vuln/SNYK-JS-SEMVER-3247795) security vulnerability. Upgraded [`@babel/traverse`](https://www.npmjs.com/package/@babel/traverse) from `7.22.8` to `7.23.2` to address the [SNYK-JS-BABELTRAVERSE-5962462](https://snyk.io/vuln/SNYK-JS-BABELTRAVERSE-5962462) security vulnerability. Upgraded [`react-docgen`](https://www.npmjs.com/package/react-docgen) from `6.0.0-alpha.3` to `6.0.4` to address the [SNYK-JS-BABELTRAVERSE-5962462](https://snyk.io/vuln/SNYK-JS-BABELTRAVERSE-5962462) security vulnerability. Addressed in [#28063](https://github.com/cypress-io/cypress/pull/28063).
9+
210
## 13.3.1
311

412
_Released 10/11/2023_

npm/create-cypress-tests/src/component-testing/babel/babelTransform.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ export function createTransformPluginsFileBabelPlugin (ast: PluginsConfigAst): b
9898
babelTypes.blockStatement(statementToInject as babelTypes.Statement[] | babelTypes.Statement[]),
9999
)
100100

101-
path.get('body').pushContainer('body' as never, ifComponentMode as babel.Node)
101+
path.get('body').pushContainer('body' as never, ifComponentMode as never)
102102

103103
if (ast.requiresReturnConfig) {
104-
path.get('body').pushContainer('body' as never, returnConfigAst)
104+
path.get('body').pushContainer('body' as never, returnConfigAst as never)
105105
}
106106
}
107107
},

packages/data-context/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"prettier": "2.5.1",
5050
"randexp": "0.5.3",
5151
"randomstring": "1.1.5",
52-
"react-docgen": "6.0.0-alpha.3",
52+
"react-docgen": "6.0.4",
5353
"semver": "7.3.2",
5454
"simple-git": "3.16.0",
5555
"stringify-object": "^3.0.0",

packages/data-context/src/actions/CodegenActions.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type { DataContext } from '..'
55
import { SpecOptions, codeGenerator } from '../codegen'
66
import templates from '../codegen/templates'
77
import type { CodeGenType } from '../gen/graphcache-config.gen'
8-
import { parse as parseReactComponent, resolver as reactDocgenResolvers } from 'react-docgen'
98
import { visit } from 'ast-types'
109

1110
export interface ReactComponentDescriptor {
@@ -16,12 +15,29 @@ export interface ReactComponentDescriptor {
1615
export class CodegenActions {
1716
constructor (private ctx: DataContext) {}
1817

19-
async getReactComponentsFromFile (filePath: string): Promise<{components: ReactComponentDescriptor[], errored?: boolean }> {
18+
async getReactComponentsFromFile (filePath: string, reactDocgen?: typeof import('react-docgen')): Promise<{components: ReactComponentDescriptor[], errored?: boolean }> {
2019
try {
20+
// this dance to get react-docgen is for now because react-docgen is a module and our typescript settings are set up to transpile to commonjs
21+
// which will require the module, which will fail because it's an es module. This is a temporary workaround.
22+
let actualReactDocgen = reactDocgen
23+
24+
if (!actualReactDocgen) {
25+
actualReactDocgen = await import('react-docgen')
26+
}
27+
28+
const { parse: parseReactComponent, builtinResolvers: reactDocgenResolvers } = actualReactDocgen
29+
2130
const src = await this.ctx.fs.readFile(filePath, 'utf8')
2231

2332
const exportResolver: ExportResolver = new Map()
24-
let result = parseReactComponent(src, findAllWithLink(exportResolver), undefined, { parserOptions: { plugins: ['typescript', 'jsx'] } })
33+
let result = parseReactComponent(src, {
34+
resolver: findAllWithLink(exportResolver, reactDocgenResolvers),
35+
babelOptions: {
36+
parserOpts: {
37+
plugins: ['typescript', 'jsx'],
38+
},
39+
},
40+
})
2541

2642
// types appear to be incorrect in [email protected]
2743
// TODO: update when 6.0.0 stable is out for fixed types.
@@ -166,9 +182,9 @@ export class CodegenActions {
166182

167183
type ExportResolver = Map<string, ReactComponentDescriptor>
168184

169-
function findAllWithLink (exportResolver: ExportResolver) {
170-
return (ast: any, parser: any, importer: any) => {
171-
visit(ast, {
185+
function findAllWithLink (exportResolver: ExportResolver, reactDocgenResolvers: typeof import('react-docgen').builtinResolvers) {
186+
return (fileState: any) => {
187+
visit(fileState.ast, {
172188
// export const Foo, export { Foo, Bar }, export function FooBar () { ... }
173189
visitExportNamedDeclaration: (path) => {
174190
const declaration = path.node.declaration as any
@@ -228,6 +244,8 @@ function findAllWithLink (exportResolver: ExportResolver) {
228244
},
229245
})
230246

231-
return reactDocgenResolvers.findAllExportedComponentDefinitions(ast, parser, importer)
247+
const exportedDefinitionsResolver = new reactDocgenResolvers.FindExportedDefinitionsResolver()
248+
249+
return exportedDefinitionsResolver.resolve(fileState)
232250
}
233251
}

packages/data-context/test/unit/actions/CodegenActions.spec.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,39 @@ import path from 'path'
88
describe('CodegenActions', () => {
99
let ctx: DataContext
1010
let actions: CodegenActions
11+
let reactDocgen: typeof import('react-docgen')
1112

12-
beforeEach(() => {
13+
beforeEach(async () => {
1314
sinon.restore()
1415

1516
ctx = createTestDataContext('open')
1617

18+
reactDocgen = await eval('import("react-docgen")')
19+
1720
actions = new CodegenActions(ctx)
1821
})
1922

2023
context('getReactComponentsFromFile', () => {
2124
const absolutePathPrefix = path.resolve('./test/unit/actions/project')
2225

2326
it('returns React components from file with class component', async () => {
24-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-class.jsx`)
27+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-class.jsx`, reactDocgen)
2528

2629
expect(components).to.have.length(1)
2730
expect(components[0].exportName).to.equal('Counter')
2831
expect(components[0].isDefault).to.equal(false)
2932
})
3033

3134
it('returns React components from file with functional component', async () => {
32-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-functional.jsx`)
35+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-functional.jsx`, reactDocgen)
3336

3437
expect(components).to.have.length(1)
3538
expect(components[0].exportName).to.equal('Counter')
3639
expect(components[0].isDefault).to.equal(false)
3740
})
3841

3942
it('returns only exported React components from file with functional components', async () => {
40-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-multiple-components.jsx`)
43+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-multiple-components.jsx`, reactDocgen)
4144

4245
expect(components).to.have.length(2)
4346
expect(components[0].exportName).to.equal('CounterContainer')
@@ -48,51 +51,51 @@ describe('CodegenActions', () => {
4851
})
4952

5053
it('returns React components from a tsx file', async () => {
51-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter.tsx`)
54+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter.tsx`, reactDocgen)
5255

5356
expect(components).to.have.length(1)
5457
expect(components[0].exportName).to.equal('Counter')
5558
expect(components[0].isDefault).to.equal(false)
5659
})
5760

5861
it('returns React components that are exported by default', async () => {
59-
let reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-default.tsx`)).components
62+
let reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-default.tsx`, reactDocgen)).components
6063

6164
expect(reactComponents).to.have.length(1)
6265
expect(reactComponents[0].exportName).to.equal('CounterDefault')
6366
expect(reactComponents[0].isDefault).to.equal(true)
6467

65-
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-anonymous.jsx`)).components
68+
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-anonymous.jsx`, reactDocgen)).components
6669
expect(reactComponents).to.have.length(1)
6770
expect(reactComponents[0].exportName).to.equal('Component')
6871
expect(reactComponents[0].isDefault).to.equal(true)
6972

70-
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-function.jsx`)).components
73+
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-function.jsx`, reactDocgen)).components
7174
expect(reactComponents).to.have.length(1)
7275
expect(reactComponents[0].exportName).to.equal('HelloWorld')
7376
expect(reactComponents[0].isDefault).to.equal(true)
7477

75-
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-class.jsx`)).components
78+
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-class.jsx`, reactDocgen)).components
7679
expect(reactComponents).to.have.length(1)
7780
expect(reactComponents[0].exportName).to.equal('HelloWorld')
7881
expect(reactComponents[0].isDefault).to.equal(true)
7982

80-
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-specifier.jsx`)).components
83+
reactComponents = await (await actions.getReactComponentsFromFile(`${absolutePathPrefix}/default-specifier.jsx`, reactDocgen)).components
8184
expect(reactComponents).to.have.length(1)
8285
expect(reactComponents[0].exportName).to.equal('HelloWorld')
8386
expect(reactComponents[0].isDefault).to.equal(true)
8487
})
8588

8689
it('returns React components defined with arrow functions', async () => {
87-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-arrow-function.jsx`)
90+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-arrow-function.jsx`, reactDocgen)
8891

8992
expect(components).to.have.length(1)
9093
expect(components[0].exportName).to.equal('Counter')
9194
expect(components[0].isDefault).to.equal(false)
9295
})
9396

9497
it('returns React components from a file with multiple separate export statements', async () => {
95-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-separate-exports.jsx`)
98+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-separate-exports.jsx`, reactDocgen)
9699

97100
expect(components).to.have.length(2)
98101
expect(components[0].exportName).to.equal('CounterView')
@@ -102,7 +105,7 @@ describe('CodegenActions', () => {
102105
})
103106

104107
it('returns React components that are exported and aliased', async () => {
105-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/export-alias.jsx`)
108+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/export-alias.jsx`, reactDocgen)
106109

107110
expect(components).to.have.length(1)
108111
expect(components[0].exportName).to.equal('HelloWorld')
@@ -111,23 +114,23 @@ describe('CodegenActions', () => {
111114

112115
// TODO: "react-docgen" will resolve HOCs but our export detection does not. Can fall back to displayName here
113116
it.skip('handles higher-order-components', async () => {
114-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-hoc.jsx`)
117+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/counter-hoc.jsx`, reactDocgen)
115118

116119
expect(components).to.have.length(1)
117120
expect(components[0].exportName).to.equal('Counter')
118121
expect(components[0].isDefault).to.equal(true)
119122
})
120123

121124
it('correctly parses typescript files', async () => {
122-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/LoginForm.tsx`)
125+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/LoginForm.tsx`, reactDocgen)
123126

124127
expect(components).to.have.length(1)
125128
expect(components[0].exportName).to.equal('LoginForm')
126129
expect(components[0].isDefault).to.equal(true)
127130
})
128131

129132
it('does not throw while parsing empty file', async () => {
130-
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/empty.jsx`)
133+
const { components } = await actions.getReactComponentsFromFile(`${absolutePathPrefix}/empty.jsx`, reactDocgen)
131134

132135
expect(components).to.have.length(0)
133136
})

packages/server/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"lint": "eslint --ext .js,.jsx,.ts,.tsx,.json, ."
2424
},
2525
"dependencies": {
26-
"@babel/parser": "7.22.7",
26+
"@babel/parser": "7.23.0",
2727
"@benmalka/foxdriver": "0.4.1",
2828
"@cypress/commit-info": "2.2.0",
2929
"@cypress/get-windows-proxy": "1.6.2",
@@ -134,7 +134,7 @@
134134
"widest-line": "3.1.0"
135135
},
136136
"devDependencies": {
137-
"@babel/core": "7.22.9",
137+
"@babel/core": "7.23.2",
138138
"@babel/preset-env": "7.22.9",
139139
"@cypress/debugging-proxy": "2.0.1",
140140
"@cypress/sinon-chai": "2.9.1",

packages/web-config/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@packages/web-config",
33
"version": "0.0.0-development",
44
"devDependencies": {
5-
"@babel/core": "7.22.9",
5+
"@babel/core": "7.23.2",
66
"@babel/helper-define-map": "7.18.6",
77
"@babel/plugin-proposal-decorators": "7.22.7",
88
"@babel/plugin-transform-class-properties": "7.22.5",

system-tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"update:snapshots": "SNAPSHOT_UPDATE=1 npm run test"
2020
},
2121
"devDependencies": {
22-
"@babel/core": "7.22.9",
22+
"@babel/core": "7.23.2",
2323
"@babel/preset-env": "7.22.9",
2424
"@cypress/commit-info": "2.2.0",
2525
"@cypress/debugging-proxy": "2.0.1",

0 commit comments

Comments
 (0)