mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-23 07:19:58 +08:00
76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
/**
|
|
* @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 { Rule } from '@angular-devkit/schematics';
|
|
import { appendValueInAstArray, findPropertyInAstObject } from '../../utility/json-utils';
|
|
import { Builders } from '../../utility/workspace-models';
|
|
import { getAllOptions, getTargets, getWorkspace, readJsonFileAsAstObject } from './utils';
|
|
|
|
|
|
/**
|
|
* Update ngsw-config.json to fix issue https://github.com/angular/angular-cli/pull/15277
|
|
*/
|
|
export function updateNGSWConfig(): Rule {
|
|
return (tree, context) => {
|
|
const workspace = getWorkspace(tree);
|
|
const logger = context.logger;
|
|
|
|
for (const { target } of getTargets(workspace, 'build', Builders.Browser)) {
|
|
for (const options of getAllOptions(target)) {
|
|
const ngswConfigPath = findPropertyInAstObject(options, 'ngswConfigPath');
|
|
if (!ngswConfigPath || ngswConfigPath.kind !== 'string') {
|
|
continue;
|
|
}
|
|
|
|
const path = ngswConfigPath.value;
|
|
const ngswConfigAst = readJsonFileAsAstObject(tree, path);
|
|
if (!ngswConfigAst || ngswConfigAst.kind !== 'object') {
|
|
logger.warn(`Cannot find file: ${ngswConfigPath}`);
|
|
continue;
|
|
}
|
|
|
|
const assetGroups = findPropertyInAstObject(ngswConfigAst, 'assetGroups');
|
|
if (!assetGroups || assetGroups.kind !== 'array') {
|
|
continue;
|
|
}
|
|
|
|
const prefetchElement = assetGroups.elements.find(element => {
|
|
const installMode = element.kind === 'object' && findPropertyInAstObject(element, 'installMode');
|
|
|
|
return installMode && installMode.value === 'prefetch';
|
|
});
|
|
|
|
if (!prefetchElement || prefetchElement.kind !== 'object') {
|
|
continue;
|
|
}
|
|
|
|
const resources = findPropertyInAstObject(prefetchElement, 'resources');
|
|
if (!resources || resources.kind !== 'object') {
|
|
continue;
|
|
}
|
|
|
|
const files = findPropertyInAstObject(resources, 'files');
|
|
if (!files || files.kind !== 'array') {
|
|
continue;
|
|
}
|
|
|
|
const hasManifest = files.elements
|
|
.some(({ value }) => typeof value === 'string' && value.endsWith('manifest.webmanifest'));
|
|
if (hasManifest) {
|
|
continue;
|
|
}
|
|
|
|
const recorder = tree.beginUpdate(path);
|
|
appendValueInAstArray(recorder, files, '/manifest.webmanifest', 10);
|
|
tree.commitUpdate(recorder);
|
|
}
|
|
}
|
|
|
|
return tree;
|
|
};
|
|
}
|