Skip to content

Commit 46274df

Browse files
alan-agius4Keen Yee Liau
authored andcommitted
refactor: workspace config migration to use helper methods
1 parent 23217fa commit 46274df

File tree

3 files changed

+49
-80
lines changed

3 files changed

+49
-80
lines changed

packages/schematics/angular/migrations/update-9/ivy-libraries.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
*/
88
import { JsonParseMode, parseJsonAst } from '@angular-devkit/core';
99
import { Rule, Tree } from '@angular-devkit/schematics';
10-
import { getWorkspace, getWorkspacePath } from '../../utility/config';
10+
import { getWorkspacePath } from '../../utility/config';
1111
import {
1212
appendPropertyInAstObject,
1313
findPropertyInAstObject,
1414
insertPropertyInAstObjectInOrder,
1515
} from '../../utility/json-utils';
1616
import { Builders } from '../../utility/workspace-models';
17-
import { getTargets } from './utils';
17+
import { getTargets, getWorkspace } from './utils';
1818

1919
/**
2020
* Updates a pre version 9 library to version 9 Ivy library.

packages/schematics/angular/migrations/update-9/update-workspace-config.ts

Lines changed: 15 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,17 @@
55
* Use of this source code is governed by an MIT-style license that can be
66
* found in the LICENSE file at https://angular.io/license
77
*/
8-
import {
9-
JsonAstObject,
10-
JsonParseMode,
11-
parseJsonAst,
12-
} from '@angular-devkit/core';
8+
import { JsonAstObject } from '@angular-devkit/core';
139
import { Rule, Tree, UpdateRecorder } from '@angular-devkit/schematics';
10+
import { getWorkspacePath } from '../../utility/config';
1411
import {
1512
appendValueInAstArray,
1613
findPropertyInAstObject,
1714
insertPropertyInAstObjectInOrder,
1815
removePropertyInAstObject,
1916
} from '../../utility/json-utils';
17+
import { Builders } from '../../utility/workspace-models';
18+
import { getAllOptions, getTargets, getWorkspace } from './utils';
2019

2120
export const ANY_COMPONENT_STYLE_BUDGET = {
2221
type: 'anyComponentStyle',
@@ -25,61 +24,19 @@ export const ANY_COMPONENT_STYLE_BUDGET = {
2524

2625
export function UpdateWorkspaceConfig(): Rule {
2726
return (tree: Tree) => {
28-
let workspaceConfigPath = 'angular.json';
29-
let angularConfigContent = tree.read(workspaceConfigPath);
30-
31-
if (!angularConfigContent) {
32-
workspaceConfigPath = '.angular.json';
33-
angularConfigContent = tree.read(workspaceConfigPath);
34-
35-
if (!angularConfigContent) {
36-
return;
37-
}
38-
}
39-
40-
const angularJson = parseJsonAst(angularConfigContent.toString(), JsonParseMode.Loose);
41-
if (angularJson.kind !== 'object') {
42-
return;
27+
const workspacePath = getWorkspacePath(tree);
28+
const workspace = getWorkspace(tree);
29+
const recorder = tree.beginUpdate(workspacePath);
30+
31+
for (const { target } of getTargets(workspace, 'build', Builders.Browser)) {
32+
updateStyleOrScriptOption('styles', recorder, target);
33+
updateStyleOrScriptOption('scripts', recorder, target);
34+
addAnyComponentStyleBudget(recorder, target);
4335
}
4436

45-
const projects = findPropertyInAstObject(angularJson, 'projects');
46-
if (!projects || projects.kind !== 'object') {
47-
return;
48-
}
49-
50-
// For all projects
51-
const recorder = tree.beginUpdate(workspaceConfigPath);
52-
for (const project of projects.properties) {
53-
const projectConfig = project.value;
54-
if (projectConfig.kind !== 'object') {
55-
break;
56-
}
57-
58-
const architect = findPropertyInAstObject(projectConfig, 'architect');
59-
if (!architect || architect.kind !== 'object') {
60-
break;
61-
}
62-
63-
const buildTarget = findPropertyInAstObject(architect, 'build');
64-
if (buildTarget && buildTarget.kind === 'object') {
65-
const builder = findPropertyInAstObject(buildTarget, 'builder');
66-
// Projects who's build builder is not build-angular:browser
67-
if (builder && builder.kind === 'string' && builder.value === '@angular-devkit/build-angular:browser') {
68-
updateStyleOrScriptOption('styles', recorder, buildTarget);
69-
updateStyleOrScriptOption('scripts', recorder, buildTarget);
70-
addAnyComponentStyleBudget(recorder, buildTarget);
71-
}
72-
}
73-
74-
const testTarget = findPropertyInAstObject(architect, 'test');
75-
if (testTarget && testTarget.kind === 'object') {
76-
const builder = findPropertyInAstObject(testTarget, 'builder');
77-
// Projects who's build builder is not build-angular:browser
78-
if (builder && builder.kind === 'string' && builder.value === '@angular-devkit/build-angular:karma') {
79-
updateStyleOrScriptOption('styles', recorder, testTarget);
80-
updateStyleOrScriptOption('scripts', recorder, testTarget);
81-
}
82-
}
37+
for (const { target } of getTargets(workspace, 'test', Builders.Karma)) {
38+
updateStyleOrScriptOption('styles', recorder, target);
39+
updateStyleOrScriptOption('scripts', recorder, target);
8340
}
8441

8542
tree.commitUpdate(recorder);
@@ -88,23 +45,6 @@ export function UpdateWorkspaceConfig(): Rule {
8845
};
8946
}
9047

91-
/**
92-
* Helper to retreive all the options in various configurations
93-
*/
94-
function getAllOptions(builderConfig: JsonAstObject, configurationsOnly = false): JsonAstObject[] {
95-
const options = [];
96-
const configurations = findPropertyInAstObject(builderConfig, 'configurations');
97-
if (configurations && configurations.kind === 'object') {
98-
options.push(...configurations.properties.map(x => x.value));
99-
}
100-
101-
if (!configurationsOnly) {
102-
options.push(findPropertyInAstObject(builderConfig, 'options'));
103-
}
104-
105-
return options.filter(o => o && o.kind === 'object') as JsonAstObject[];
106-
}
107-
10848
function updateStyleOrScriptOption(property: 'scripts' | 'styles', recorder: UpdateRecorder, builderConfig: JsonAstObject) {
10949
const options = getAllOptions(builderConfig);
11050

packages/schematics/angular/migrations/update-9/utils.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import { JsonAstObject, experimental } from '@angular-devkit/core';
9+
import { JsonAstObject, JsonParseMode, parseJsonAst } from '@angular-devkit/core';
10+
import { SchematicsException, Tree } from '@angular-devkit/schematics';
11+
import { getWorkspacePath } from '../../utility/config';
1012
import { findPropertyInAstObject } from '../../utility/json-utils';
1113
import { Builders, WorkspaceTargets } from '../../utility/workspace-models';
1214

1315
/** Get all workspace targets which builder and target names matches the provided. */
1416
export function getTargets(
15-
workspace: JsonAstObject | experimental.workspace.WorkspaceSchema,
17+
workspace: JsonAstObject,
1618
targetName: Exclude<keyof WorkspaceTargets, number>,
1719
builderName: Builders,
1820
): { target: JsonAstObject, project: JsonAstObject }[] {
1921
const projects = findPropertyInAstObject(workspace as JsonAstObject, 'projects');
20-
if (!projects || projects.kind !== 'object') {
22+
if (!projects || projects.kind !== 'object' || !projects.properties) {
2123
return [];
2224
}
2325

@@ -52,3 +54,30 @@ export function getTargets(
5254

5355
return targets;
5456
}
57+
58+
/** Helper to retreive all the options in various configurations. */
59+
export function getAllOptions(builderConfig: JsonAstObject, configurationsOnly = false): JsonAstObject[] {
60+
const options = [];
61+
const configurations = findPropertyInAstObject(builderConfig, 'configurations');
62+
if (configurations && configurations.kind === 'object') {
63+
options.push(...configurations.properties.map(x => x.value));
64+
}
65+
66+
if (!configurationsOnly) {
67+
options.push(findPropertyInAstObject(builderConfig, 'options'));
68+
}
69+
70+
return options.filter(o => o && o.kind === 'object') as JsonAstObject[];
71+
}
72+
73+
export function getWorkspace(host: Tree): JsonAstObject {
74+
const path = getWorkspacePath(host);
75+
const configBuffer = host.read(path);
76+
if (!configBuffer) {
77+
throw new SchematicsException(`Could not find (${path})`);
78+
}
79+
80+
const content = configBuffer.toString();
81+
82+
return parseJsonAst(content, JsonParseMode.Loose) as JsonAstObject;
83+
}

0 commit comments

Comments
 (0)