diff --git a/packages/data-context/src/DataContext.ts b/packages/data-context/src/DataContext.ts index c568c1bf62..0dd472aa19 100644 --- a/packages/data-context/src/DataContext.ts +++ b/packages/data-context/src/DataContext.ts @@ -435,6 +435,7 @@ export class DataContext { await this.initializeOpenMode() if (this.coreData.currentTestingType && await this.lifecycleManager.waitForInitializeSuccess()) { this.lifecycleManager.setCurrentTestingType(this.coreData.currentTestingType) + this.lifecycleManager.scaffoldFilesIfNecessary() } } else { throw new Error(`Missing DataContext config "mode" setting, expected run | open`) diff --git a/packages/data-context/src/data/ProjectConfigManager.ts b/packages/data-context/src/data/ProjectConfigManager.ts index 70b16ef26f..485248047b 100644 --- a/packages/data-context/src/data/ProjectConfigManager.ts +++ b/packages/data-context/src/data/ProjectConfigManager.ts @@ -12,6 +12,7 @@ import chokidar from 'chokidar' import { validate as validateConfig, validateNoBreakingConfigLaunchpad, validateNoBreakingConfigRoot, validateNoBreakingTestingTypeConfig } from '@packages/config' import type { SetupFullConfigOptions } from './ProjectLifecycleManager' import { CypressEnv } from './CypressEnv' +import { autoBindDebug } from '../util/autoBindDebug' const debug = debugLib(`cypress:lifecycle:ProjectConfigManager`) @@ -63,12 +64,11 @@ export class ProjectConfigManager { private _state: ConfigManagerState = 'pending' private _loadConfigPromise: Promise | undefined private _cachedLoadConfig: LoadConfigReply | undefined - - #cypressEnv: CypressEnv + private _cypressEnv: CypressEnv constructor (private options: ProjectConfigManagerOptions) { - this.#cypressEnv = new CypressEnv({ - envFilePath: this.#envFilePath, + this._cypressEnv = new CypressEnv({ + envFilePath: this.envFilePath, validateConfigFile: (filePath, config) => { this.validateConfigFile(filePath, config) }, @@ -76,6 +76,8 @@ export class ProjectConfigManager { this.options.toLaunchpad(...args) }, }) + + return autoBindDebug(this) } get isLoadingNodeEvents () { @@ -104,11 +106,11 @@ export class ProjectConfigManager { this._testingType = testingType } - get #envFilePath () { + private get envFilePath () { return path.join(this.options.projectRoot, 'cypress.env.json') } - get #loadedConfigFile (): Partial | null { + private get loadedConfigFile (): Partial | null { return this._cachedLoadConfig?.initialConfig ?? null } @@ -670,12 +672,12 @@ export class ProjectConfigManager { } async loadCypressEnvFile () { - return this.#cypressEnv.loadCypressEnvFile() + return this._cypressEnv.loadCypressEnvFile() } async reloadCypressEnvFile () { - this.#cypressEnv = new CypressEnv({ - envFilePath: this.#envFilePath, + this._cypressEnv = new CypressEnv({ + envFilePath: this.envFilePath, validateConfigFile: (filePath, config) => { this.validateConfigFile(filePath, config) }, @@ -684,11 +686,11 @@ export class ProjectConfigManager { }, }) - return this.#cypressEnv.loadCypressEnvFile() + return this._cypressEnv.loadCypressEnvFile() } isTestingTypeConfigured (testingType: TestingType): boolean { - const config = this.#loadedConfigFile + const config = this.loadedConfigFile if (!config) { return false @@ -729,7 +731,7 @@ export class ProjectConfigManager { this.options.onWarning(getError('UNEXPECTED_INTERNAL_ERROR', err)) }) - const cypressEnvFileWatcher = this.addWatcher(this.#envFilePath) + const cypressEnvFileWatcher = this.addWatcher(this.envFilePath) cypressEnvFileWatcher.on('all', () => { this.reloadConfig().catch(this.onLoadError) diff --git a/packages/data-context/src/data/ProjectLifecycleManager.ts b/packages/data-context/src/data/ProjectLifecycleManager.ts index 0e135cec1f..a2f02bfd9a 100644 --- a/packages/data-context/src/data/ProjectLifecycleManager.ts +++ b/packages/data-context/src/data/ProjectLifecycleManager.ts @@ -79,9 +79,8 @@ export class ProjectLifecycleManager { private _configManager: ProjectConfigManager | undefined private _projectMetaState: ProjectMetaState = { ...PROJECT_META_STATE } private _pendingInitialize?: pDefer.DeferredPromise - - #cachedInitialConfig: Cypress.ConfigOptions | undefined - #cachedFullConfig: FullConfig | undefined + private _cachedInitialConfig: Cypress.ConfigOptions | undefined + private _cachedFullConfig: FullConfig | undefined constructor (private ctx: DataContext) { if (ctx.coreData.currentProject) { @@ -166,11 +165,11 @@ export class ProjectLifecycleManager { } get loadedConfigFile (): Partial | null { - return this.#cachedInitialConfig ?? null + return this._cachedInitialConfig ?? null } get loadedFullConfig (): FullConfig | null { - return this.#cachedFullConfig ?? null + return this._cachedFullConfig ?? null } get projectRoot () { @@ -214,7 +213,7 @@ export class ProjectLifecycleManager { return 'npm' } - #createConfigManager () { + private createConfigManager () { return new ProjectConfigManager({ configFile: this.configFile, projectRoot: this.projectRoot, @@ -238,26 +237,19 @@ export class ProjectLifecycleManager { this.ctx.emitter.toLaunchpad(...args) }, onInitialConfigLoaded: (initialConfig: Cypress.ConfigOptions) => { - this.#cachedInitialConfig = initialConfig - if (this._currentTestingType) { - if (!this.isTestingTypeConfigured(this._currentTestingType) && !this.ctx.isRunMode) { - this.ctx.actions.wizard.scaffoldTestingType().catch(this.onLoadError) + this._cachedInitialConfig = initialConfig - return - } - - if (this.ctx.coreData.scaffoldedFiles) { - this.ctx.coreData.scaffoldedFiles.filter((f) => { - if (f.file.absolute === this.configFilePath && f.status !== 'valid') { - f.status = 'valid' - this.ctx.emitter.toLaunchpad() - } - }) - } + if (this.ctx.coreData.scaffoldedFiles) { + this.ctx.coreData.scaffoldedFiles.filter((f) => { + if (f.file.absolute === this.configFilePath && f.status !== 'valid') { + f.status = 'valid' + this.ctx.emitter.toLaunchpad() + } + }) } }, onFinalConfigLoaded: async (finalConfig: FullConfig) => { - this.#cachedFullConfig = finalConfig + this._cachedFullConfig = finalConfig if (this.ctx.coreData.cliBrowser) { await this.setActiveBrowser(this.ctx.coreData.cliBrowser) @@ -343,14 +335,14 @@ export class ProjectLifecycleManager { this.resetInternalState() - this._configManager = this.#createConfigManager() + this._configManager = this.createConfigManager() const { needsCypressJsonMigration } = this.refreshMetaState() const legacyConfigPath = path.join(projectRoot, this.legacyConfigFile) if (needsCypressJsonMigration && !this.ctx.isRunMode && this.ctx.fs.existsSync(legacyConfigPath)) { - this.#legacyMigration(legacyConfigPath).catch(this.onLoadError) + this.legacyMigration(legacyConfigPath).catch(this.onLoadError) return } @@ -374,7 +366,7 @@ export class ProjectLifecycleManager { this.loadCypressEnvFile().catch(this.onLoadError) } - async #legacyMigration (legacyConfigPath: string) { + async legacyMigration (legacyConfigPath: string) { try { // we run the legacy plugins/index.js in a child process // and mutate the config based on the return value for migration @@ -426,6 +418,12 @@ export class ProjectLifecycleManager { } } + scaffoldFilesIfNecessary () { + if (this._currentTestingType && !this.isTestingTypeConfigured(this._currentTestingType) && !this.ctx.isRunMode) { + this.ctx.actions.wizard.scaffoldTestingType().catch(this.onLoadError) + } + } + private resetInternalState () { if (this._configManager) { this._configManager.destroy() @@ -434,7 +432,8 @@ export class ProjectLifecycleManager { this.ctx.project.destroy() this._currentTestingType = null - this.#cachedInitialConfig = undefined + this._cachedInitialConfig = undefined + this._cachedFullConfig = undefined } /** diff --git a/packages/graphql/src/schemaTypes/objectTypes/gql-Mutation.ts b/packages/graphql/src/schemaTypes/objectTypes/gql-Mutation.ts index e5248e6da4..5df02c59fc 100644 --- a/packages/graphql/src/schemaTypes/objectTypes/gql-Mutation.ts +++ b/packages/graphql/src/schemaTypes/objectTypes/gql-Mutation.ts @@ -173,6 +173,10 @@ export const mutation = mutationType({ if (ctx.coreData.currentTestingType && !ctx.lifecycleManager.isTestingTypeConfigured(ctx.coreData.currentTestingType)) { await ctx.actions.wizard.initialize() + + if (ctx.wizardData.chosenLanguage === 'ts') { + ctx.lifecycleManager.scaffoldFilesIfNecessary() + } } return {} @@ -615,6 +619,8 @@ export const mutation = mutationType({ ctx.actions.project.setCurrentTestingType(args.testingType) await ctx.actions.project.reconfigureProject() + // TODO: do i need to scaffold here too? + return true }, }) @@ -634,6 +640,8 @@ export const mutation = mutationType({ await ctx.actions.project.reconfigureProject() } + // TODO: do i need to scaffold here too? + return true }, })