refactor(core): static-query migration should always use template strategy (#30628)
We are removing the prompt for the `static-query` migration and make the template strategy the migration strategy for the migration. The usage strategy is good for best-practices, but for now we want to ensure that the migration is a seamless as possible and that is only achievable my re-using the same logic that View Engine uses for determining the timing of a query. PR Close #30628
This commit is contained in:
parent
faac51fd2e
commit
5640cedc82
@ -21,9 +21,14 @@ import {QueryTemplateStrategy} from './strategies/template_strategy/template_str
|
|||||||
import {QueryTestStrategy} from './strategies/test_strategy/test_strategy';
|
import {QueryTestStrategy} from './strategies/test_strategy/test_strategy';
|
||||||
import {TimingStrategy} from './strategies/timing-strategy';
|
import {TimingStrategy} from './strategies/timing-strategy';
|
||||||
import {QueryUsageStrategy} from './strategies/usage_strategy/usage_strategy';
|
import {QueryUsageStrategy} from './strategies/usage_strategy/usage_strategy';
|
||||||
import {SELECTED_STRATEGY, promptForMigrationStrategy} from './strategy_prompt';
|
|
||||||
import {getTransformedQueryCallExpr} from './transform';
|
import {getTransformedQueryCallExpr} from './transform';
|
||||||
|
|
||||||
|
enum SELECTED_STRATEGY {
|
||||||
|
TEMPLATE,
|
||||||
|
USAGE,
|
||||||
|
TESTS,
|
||||||
|
}
|
||||||
|
|
||||||
interface AnalyzedProject {
|
interface AnalyzedProject {
|
||||||
program: ts.Program;
|
program: ts.Program;
|
||||||
host: ts.CompilerHost;
|
host: ts.CompilerHost;
|
||||||
@ -50,8 +55,9 @@ async function runMigration(tree: Tree, context: SchematicContext) {
|
|||||||
const logger = context.logger;
|
const logger = context.logger;
|
||||||
|
|
||||||
logger.info('------ Static Query migration ------');
|
logger.info('------ Static Query migration ------');
|
||||||
logger.info('In preparation for Ivy, developers can now explicitly specify the');
|
logger.info('With Angular version 8, developers need to');
|
||||||
logger.info('timing of their queries. Read more about this here:');
|
logger.info('explicitly specify the timing of ViewChild or');
|
||||||
|
logger.info('ContentChild queries. Read more about this here:');
|
||||||
logger.info('https://github.com/angular/angular/pull/28810');
|
logger.info('https://github.com/angular/angular/pull/28810');
|
||||||
|
|
||||||
if (!buildPaths.length && !testPaths.length) {
|
if (!buildPaths.length && !testPaths.length) {
|
||||||
@ -63,6 +69,9 @@ async function runMigration(tree: Tree, context: SchematicContext) {
|
|||||||
const analyzedFiles = new Set<string>();
|
const analyzedFiles = new Set<string>();
|
||||||
const buildProjects = new Set<AnalyzedProject>();
|
const buildProjects = new Set<AnalyzedProject>();
|
||||||
const failures = [];
|
const failures = [];
|
||||||
|
const strategy = process.env['NG_STATIC_QUERY_USAGE_STRATEGY'] === 'true' ?
|
||||||
|
SELECTED_STRATEGY.USAGE :
|
||||||
|
SELECTED_STRATEGY.TEMPLATE;
|
||||||
|
|
||||||
for (const tsconfigPath of buildPaths) {
|
for (const tsconfigPath of buildPaths) {
|
||||||
const project = analyzeProject(tree, tsconfigPath, basePath, analyzedFiles);
|
const project = analyzeProject(tree, tsconfigPath, basePath, analyzedFiles);
|
||||||
@ -71,10 +80,7 @@ async function runMigration(tree: Tree, context: SchematicContext) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In case there are projects which contain queries that need to be migrated,
|
|
||||||
// we want to prompt for the migration strategy and run the migration.
|
|
||||||
if (buildProjects.size) {
|
if (buildProjects.size) {
|
||||||
const strategy = await promptForMigrationStrategy(logger);
|
|
||||||
for (let project of Array.from(buildProjects.values())) {
|
for (let project of Array.from(buildProjects.values())) {
|
||||||
failures.push(...await runStaticQueryMigration(tree, project, strategy, logger));
|
failures.push(...await runStaticQueryMigration(tree, project, strategy, logger));
|
||||||
}
|
}
|
||||||
|
@ -1,50 +0,0 @@
|
|||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright Google Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by an MIT-style license that can be
|
|
||||||
* found in the LICENSE file at https://angular.io/license
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
import {logging} from '@angular-devkit/core';
|
|
||||||
|
|
||||||
import {getInquirer, supportsPrompt} from '../../utils/schematics_prompt';
|
|
||||||
|
|
||||||
export enum SELECTED_STRATEGY {
|
|
||||||
TEMPLATE,
|
|
||||||
USAGE,
|
|
||||||
TESTS,
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prompts the user for the migration strategy that should be used. Defaults to the
|
|
||||||
* template strategy as it provides a migration with rare manual corrections.
|
|
||||||
* */
|
|
||||||
export async function promptForMigrationStrategy(logger: logging.LoggerApi) {
|
|
||||||
if (supportsPrompt()) {
|
|
||||||
logger.info('There are two available migration strategies that can be selected:');
|
|
||||||
logger.info(' • Template strategy - migration tool (short-term gains, rare corrections)');
|
|
||||||
logger.info(' • Usage strategy - best practices (long-term gains, manual corrections)');
|
|
||||||
logger.info('For an easy migration, the template strategy is recommended. The usage');
|
|
||||||
logger.info('strategy can be used for best practices and a code base that will be more');
|
|
||||||
logger.info('flexible to changes going forward.');
|
|
||||||
const {strategyName} = await getInquirer().prompt<{strategyName: string}>({
|
|
||||||
type: 'list',
|
|
||||||
name: 'strategyName',
|
|
||||||
message: 'What migration strategy do you want to use?',
|
|
||||||
choices: [
|
|
||||||
{name: 'Template strategy', value: 'template'}, {name: 'Usage strategy', value: 'usage'}
|
|
||||||
],
|
|
||||||
default: 'template',
|
|
||||||
});
|
|
||||||
logger.info('');
|
|
||||||
return strategyName === 'usage' ? SELECTED_STRATEGY.USAGE : SELECTED_STRATEGY.TEMPLATE;
|
|
||||||
} else {
|
|
||||||
// In case prompts are not supported, we still want to allow developers to opt
|
|
||||||
// into the usage strategy by specifying an environment variable. The tests also
|
|
||||||
// use the environment variable as there is no headless way to select via prompt.
|
|
||||||
return !!process.env['NG_STATIC_QUERY_USAGE_STRATEGY'] ? SELECTED_STRATEGY.USAGE :
|
|
||||||
SELECTED_STRATEGY.TEMPLATE;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1506,23 +1506,6 @@ describe('static-queries migration with usage strategy', () => {
|
|||||||
.toContain(`@${queryType}('test', { static: false }) query: any;`);
|
.toContain(`@${queryType}('test', { static: false }) query: any;`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should not prompt for migration strategy if no @${queryType} query is used`, async() => {
|
|
||||||
writeFile('/index.ts', `
|
|
||||||
import {Component, ${queryType}} from '@angular/core';
|
|
||||||
|
|
||||||
@Component({template: '<span #test></span>'})
|
|
||||||
export class NoQueriesDeclared {
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
|
|
||||||
const testModule = require('../migrations/static-queries/strategy_prompt');
|
|
||||||
spyOn(testModule, 'promptForMigrationStrategy').and.callThrough();
|
|
||||||
|
|
||||||
await runMigration();
|
|
||||||
|
|
||||||
expect(testModule.promptForMigrationStrategy).toHaveBeenCalledTimes(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should support function call with default parameter value', async() => {
|
it('should support function call with default parameter value', async() => {
|
||||||
writeFile('/index.ts', `
|
writeFile('/index.ts', `
|
||||||
import {Component, ${queryType}} from '@angular/core';
|
import {Component, ${queryType}} from '@angular/core';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user