From 7dbb92bff91c65882dd6b5cba50927c89a2fb3b8 Mon Sep 17 00:00:00 2001 From: astone123 Date: Wed, 20 Jul 2022 10:37:14 -0400 Subject: [PATCH] Revert "chore: remove unused codeGenGlobs (#21438)" This reverts commit df3ca1524d0b2f2d7cd48b0140d2022b64133aa3. --- packages/app/src/specs/CreateSpecModal.cy.tsx | 10 +++++++ packages/app/src/specs/CreateSpecModal.vue | 13 +++++++++ packages/data-context/package.json | 1 + .../src/sources/ProjectDataSource.ts | 27 +++++++++++++++++++ .../test/unit/codegen/code-generator.spec.ts | 8 ++++++ .../support/mock-graphql/stubgql-Project.ts | 5 ++++ packages/graphql/schemas/schema.graphql | 9 +++++++ .../objectTypes/gql-CodeGenGlobs.ts | 10 +++++++ .../objectTypes/gql-CurrentProject.ts | 6 +++++ .../src/schemaTypes/objectTypes/index.ts | 1 + packages/scaffold-config/src/frameworks.ts | 8 ++++++ 11 files changed, 98 insertions(+) create mode 100644 packages/graphql/src/schemaTypes/objectTypes/gql-CodeGenGlobs.ts diff --git a/packages/app/src/specs/CreateSpecModal.cy.tsx b/packages/app/src/specs/CreateSpecModal.cy.tsx index 2b79f7108c3f..dc04f74eb80b 100644 --- a/packages/app/src/specs/CreateSpecModal.cy.tsx +++ b/packages/app/src/specs/CreateSpecModal.cy.tsx @@ -15,6 +15,11 @@ describe('', () => { gql={{ currentProject: { id: 'id', + codeGenGlobs: { + id: 'super-unique-id', + __typename: 'CodeGenGlobs', + component: '**.vue', + }, currentTestingType: 'component', configFile: 'cypress.config.js', configFileAbsolutePath: '/path/to/cypress.config.js', @@ -163,6 +168,11 @@ describe('playground', () => { gql={{ currentProject: { id: 'id', + codeGenGlobs: { + id: 'super-unique-id', + __typename: 'CodeGenGlobs', + component: '**.vue', + }, currentTestingType: 'component', configFile: 'cypress.config.js', configFileAbsolutePath: '/path/to/cypress.config.js', diff --git a/packages/app/src/specs/CreateSpecModal.vue b/packages/app/src/specs/CreateSpecModal.vue index ad5fbc7bef3b..2281347e75b8 100644 --- a/packages/app/src/specs/CreateSpecModal.vue +++ b/packages/app/src/specs/CreateSpecModal.vue @@ -20,6 +20,7 @@ v-if="generator" :key="`${generator.id}-${iteration}`" v-model:title="title" + :code-gen-glob="codeGenGlob" :gql="props.gql.currentProject" :type="props.gql.currentProject?.currentTestingType" :spec-file-name="specFileName" @@ -77,6 +78,10 @@ fragment CreateSpecModal on Query { id fileExtensionToUse defaultSpecFileName + codeGenGlobs { + id + component + } ...EmptyGenerator } } @@ -105,6 +110,14 @@ const specFileName = computed(() => { return getPathForPlatform(props.gql.currentProject?.defaultSpecFileName || '') }) +const codeGenGlob = computed(() => { + if (!generator.value) { + return null + } + + return props.gql.currentProject?.codeGenGlobs[generator.value.id] +}) + const filteredGenerators = getFilteredGeneratorList(props.gql.currentProject?.currentTestingType) const singleGenerator = computed(() => filteredGenerators.value.length === 1 ? filteredGenerators.value[0] : null) diff --git a/packages/data-context/package.json b/packages/data-context/package.json index 51c396b6ee0f..2b4cf1fc0d45 100644 --- a/packages/data-context/package.json +++ b/packages/data-context/package.json @@ -23,6 +23,7 @@ "@urql/exchange-graphcache": "4.3.6", "chokidar": "3.5.1", "common-path-prefix": "3.0.0", + "create-cypress-tests": "0.0.0-development", "cross-fetch": "^3.1.4", "dataloader": "^2.0.0", "dayjs": "^1.9.3", diff --git a/packages/data-context/src/sources/ProjectDataSource.ts b/packages/data-context/src/sources/ProjectDataSource.ts index 7ed4e79bb229..98e1457383ee 100644 --- a/packages/data-context/src/sources/ProjectDataSource.ts +++ b/packages/data-context/src/sources/ProjectDataSource.ts @@ -1,6 +1,8 @@ import os from 'os' import chokidar from 'chokidar' import type { ResolvedFromConfig, RESOLVED_FROM, FoundSpec, TestingType } from '@packages/types' +import { WIZARD_FRAMEWORKS } from '@packages/scaffold-config' +import { scanFSForAvailableDependency } from 'create-cypress-tests' import minimatch from 'minimatch' import _ from 'lodash' import path from 'path' @@ -478,6 +480,31 @@ export class ProjectDataSource { return preferences[projectTitle] ?? null } + private guessFramework (projectRoot: string) { + const guess = WIZARD_FRAMEWORKS.find((framework) => { + const lookingForDeps = framework.detectors.map((x) => x.package).reduce( + (acc, dep) => ({ ...acc, [dep]: '*' }), + {}, + ) + + return scanFSForAvailableDependency(projectRoot, lookingForDeps) + }) + + return guess ?? null + } + + async getCodeGenGlobs () { + assert(this.ctx.currentProject, `Cannot find glob without currentProject.`) + + const looseComponentGlob = '*.{js,jsx,ts,tsx,.vue}' + + const framework = this.guessFramework(this.ctx.currentProject) + + return { + component: framework?.glob ?? looseComponentGlob, + } + } + async getResolvedConfigFields (): Promise { const config = this.ctx.lifecycleManager.loadedFullConfig?.resolved ?? {} diff --git a/packages/data-context/test/unit/codegen/code-generator.spec.ts b/packages/data-context/test/unit/codegen/code-generator.spec.ts index 50ce32cfdee7..445ff33e20aa 100644 --- a/packages/data-context/test/unit/codegen/code-generator.spec.ts +++ b/packages/data-context/test/unit/codegen/code-generator.spec.ts @@ -1,8 +1,10 @@ import { parse } from '@babel/parser' +import { WIZARD_FRAMEWORKS } from '@packages/scaffold-config' import { expect } from 'chai' import dedent from 'dedent' import fs from 'fs-extra' import path from 'path' +import sinon from 'sinon' import { DataContext } from '../../../src' import { Action, codeGenerator, CodeGenResult, CodeGenResults, @@ -219,6 +221,9 @@ describe('code-generator', () => { target, } + // @ts-ignore + sinon.stub(ctx.project, 'guessFramework').returns(WIZARD_FRAMEWORKS[0]) + const newSpecCodeGenOptions = new SpecOptions(ctx, { codeGenPath: path.join(__dirname, 'files', 'react', 'Button.jsx'), codeGenType: 'component', @@ -239,6 +244,9 @@ describe('code-generator', () => { target, } + // @ts-ignore + sinon.stub(ctx.project, 'guessFramework').returns(WIZARD_FRAMEWORKS[1]) + const newSpecCodeGenOptions = new SpecOptions(ctx, { codeGenPath: path.join(__dirname, 'files', 'vue', 'Button.vue'), codeGenType: 'component', diff --git a/packages/frontend-shared/cypress/support/mock-graphql/stubgql-Project.ts b/packages/frontend-shared/cypress/support/mock-graphql/stubgql-Project.ts index 826741e24e89..06b3435c5d31 100644 --- a/packages/frontend-shared/cypress/support/mock-graphql/stubgql-Project.ts +++ b/packages/frontend-shared/cypress/support/mock-graphql/stubgql-Project.ts @@ -45,6 +45,11 @@ export const createTestCurrentProject = (title: string, currentProject: Partial< ], config, cloudProject: CloudProjectStubs.componentProject, + codeGenGlobs: { + id: 'super-unique-id', + __typename: 'CodeGenGlobs', + component: '**/*.vue', + }, activeBrowser: stubBrowsers[0], browsers: stubBrowsers, isDefaultSpecPattern: true, diff --git a/packages/graphql/schemas/schema.graphql b/packages/graphql/schemas/schema.graphql index 219444950c20..ad575337925d 100644 --- a/packages/graphql/schemas/schema.graphql +++ b/packages/graphql/schemas/schema.graphql @@ -502,6 +502,14 @@ type CodeFrame { line: Int } +"""Glob patterns for detecting files for code gen.""" +type CodeGenGlobs implements Node { + component: String! + + """Relay style Node ID field for the CodeGenGlobs field""" + id: ID! +} + enum CodeGenType { component e2e @@ -543,6 +551,7 @@ type CurrentProject implements Node & ProjectLike { """List of all code generation candidates stories""" codeGenCandidates(glob: String!): [FileParts] + codeGenGlobs: CodeGenGlobs! """Project configuration""" config: JSON! diff --git a/packages/graphql/src/schemaTypes/objectTypes/gql-CodeGenGlobs.ts b/packages/graphql/src/schemaTypes/objectTypes/gql-CodeGenGlobs.ts new file mode 100644 index 000000000000..135e21d8c66d --- /dev/null +++ b/packages/graphql/src/schemaTypes/objectTypes/gql-CodeGenGlobs.ts @@ -0,0 +1,10 @@ +import { objectType } from 'nexus' + +export const CodeGenGlobs = objectType({ + name: 'CodeGenGlobs', + description: 'Glob patterns for detecting files for code gen.', + node: 'component', + definition (t) { + t.nonNull.string('component') + }, +}) diff --git a/packages/graphql/src/schemaTypes/objectTypes/gql-CurrentProject.ts b/packages/graphql/src/schemaTypes/objectTypes/gql-CurrentProject.ts index ae03ad91a6f2..02b91fea93a6 100644 --- a/packages/graphql/src/schemaTypes/objectTypes/gql-CurrentProject.ts +++ b/packages/graphql/src/schemaTypes/objectTypes/gql-CurrentProject.ts @@ -4,6 +4,7 @@ import path from 'path' import { BrowserStatusEnum, FileExtensionEnum } from '..' import { TestingTypeEnum } from '../enumTypes/gql-WizardEnums' import { Browser } from './gql-Browser' +import { CodeGenGlobs } from './gql-CodeGenGlobs' import { FileParts } from './gql-FileParts' import { ProjectPreferences } from './gql-ProjectPreferences' import { Spec } from './gql-Spec' @@ -193,6 +194,11 @@ export const CurrentProject = objectType({ }, }) + t.nonNull.field('codeGenGlobs', { + type: CodeGenGlobs, + resolve: (src, args, ctx) => ctx.project.getCodeGenGlobs(), + }) + t.list.field('codeGenCandidates', { type: FileParts, description: 'List of all code generation candidates stories', diff --git a/packages/graphql/src/schemaTypes/objectTypes/index.ts b/packages/graphql/src/schemaTypes/objectTypes/index.ts index 2333c7664d58..9e71622a9eb2 100644 --- a/packages/graphql/src/schemaTypes/objectTypes/index.ts +++ b/packages/graphql/src/schemaTypes/objectTypes/index.ts @@ -5,6 +5,7 @@ export * from './gql-AuthState' export * from './gql-Browser' export * from './gql-CachedUser' export * from './gql-CodeFrame' +export * from './gql-CodeGenGlobs' export * from './gql-CurrentProject' export * from './gql-DevState' export * from './gql-Editor' diff --git a/packages/scaffold-config/src/frameworks.ts b/packages/scaffold-config/src/frameworks.ts index 54aa5a15eb22..5c4fce1c2d47 100644 --- a/packages/scaffold-config/src/frameworks.ts +++ b/packages/scaffold-config/src/frameworks.ts @@ -76,6 +76,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'react', + glob: '*.{js,jsx,tsx}', mountModule: 'cypress/react', supportStatus: 'full', componentIndexHtml: componentIndexHtmlGenerator(), @@ -95,6 +96,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'vue', + glob: '*.vue', mountModule: 'cypress/vue2', supportStatus: 'full', componentIndexHtml: componentIndexHtmlGenerator(), @@ -114,6 +116,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'vue', + glob: '*.vue', mountModule: 'cypress/vue', supportStatus: 'full', componentIndexHtml: componentIndexHtmlGenerator(), @@ -133,6 +136,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'react', + glob: '*.{js,jsx,tsx}', mountModule: 'cypress/react', supportStatus: 'alpha', /** @@ -158,6 +162,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'vue', + glob: '*.vue', mountModule: 'cypress/vue2', supportStatus: 'alpha', componentIndexHtml: componentIndexHtmlGenerator(), @@ -176,6 +181,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'vue', + glob: '*.vue', mountModule: 'cypress/vue2', supportStatus: 'full', componentIndexHtml: componentIndexHtmlGenerator(), @@ -194,6 +200,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'vue', + glob: '*.vue', mountModule: 'cypress/vue', supportStatus: 'full', componentIndexHtml: componentIndexHtmlGenerator(), @@ -213,6 +220,7 @@ export const WIZARD_FRAMEWORKS = [ ] }, codeGenFramework: 'react', + glob: '*.{js,jsx,tsx}', mountModule: 'cypress/react', supportStatus: 'full', componentIndexHtml: componentIndexHtmlGenerator(),