Skip to content

Commit 04dbefc

Browse files
Merge branch 'feature/refactor-angular-json'
2 parents 36b05e6 + d2bdc72 commit 04dbefc

2 files changed

Lines changed: 51 additions & 41 deletions

File tree

src/application/index.spec.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,16 @@ describe('Application Schematic', () => {
8989
const configurations = prj.architect.build.configurations;
9090
expect(configurations.production).not.toBeDefined();
9191
expect(Object.getOwnPropertyNames(configurations).length).toEqual(1);
92-
expect(configurations.serve).toBeDefined();
93-
expect(configurations.serve.aot).toBeUndefined();
94-
expect(configurations.serve.buildOptimizer).toBeFalse();
95-
expect(configurations.serve.optimization).toBeFalse();
96-
expect(configurations.serve.extractLicenses).toBeFalse();
97-
expect(configurations.serve.statsJson).toBeFalse();
98-
expect(configurations.serve.sourceMap).toBeTrue();
99-
expect(configurations.serve.vendorChunk).toBeTrue();
100-
expect(configurations.serve.namedChunks).toBeTrue();
101-
expect(configurations.serve.fileReplacements).toBeUndefined();
92+
expect(configurations.development).toBeDefined();
93+
expect(configurations.development.aot).toBeUndefined();
94+
expect(configurations.development.buildOptimizer).toBeFalse();
95+
expect(configurations.development.optimization).toBeFalse();
96+
expect(configurations.development.extractLicenses).toBeFalse();
97+
expect(configurations.development.statsJson).toBeFalse();
98+
expect(configurations.development.sourceMap).toBeUndefined();
99+
expect(configurations.development.vendorChunk).toBeUndefined();
100+
expect(configurations.development.namedChunks).toBeUndefined();
101+
expect(configurations.development.fileReplacements).toBeUndefined();
102102
});
103103

104104
it('should configure test options', async () => {
@@ -113,18 +113,17 @@ describe('Application Schematic', () => {
113113
expect(testOptions.codeCoverage).toBeTrue();
114114
});
115115

116-
it('should configure serve options', async () => {
116+
it('should remove the serve production configuration', async () => {
117117
const options = { ...defaultOptions };
118118

119119
const tree = await schematicRunner.runSchematicAsync('application', options, workspaceTree)
120120
.toPromise();
121121
const config = JSON.parse(tree.readContent('/angular.json'));
122122
const prj = config.projects.foo;
123-
const serveOptions = prj.architect.serve.options;
124-
expect(serveOptions).toBeDefined();
125-
expect(serveOptions.browserTarget).toEqual("foo:build:serve");
126123
const serveConfigurations = prj.architect.serve.configurations;
127-
expect(serveConfigurations).toBeUndefined();
124+
expect(serveConfigurations).toBeDefined();
125+
expect(serveConfigurations.production).toBeUndefined();
126+
expect(serveConfigurations.development).toBeDefined();
128127
});
129128

130129
it('should should set the prefix in angular.json and in app.component.ts', async () => {

src/application/index.ts

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,37 @@ function modifyWorkspace(options: ApplicationOptions) {
7575
configureBuildConfigurations(project);
7676
configureTsLint(project);
7777
addTestOptions(project);
78-
updateServeOptions(project, options.name);
78+
removeProductionConfiguration(project);
7979
});
8080
}
8181

82+
/**
83+
* The default configuration is our production configuration.
84+
* The only configuration that needs to override this is the development configuration used in the serve option.
85+
*/
86+
function removeProductionConfiguration(project: ProjectDefinition) {
87+
const buildTarget = project.targets.get('build');
88+
const serveTarget = project.targets.get('serve');
89+
if (buildTarget === undefined) {
90+
throw new SchematicsException("Build target missing (build)");
91+
}
92+
if (buildTarget.configurations === undefined) {
93+
throw new SchematicsException("Expected build options to be defined");
94+
}
95+
if (buildTarget.configurations.production === undefined) {
96+
throw new SchematicsException("Expected build options to be defined");
97+
}
98+
if (serveTarget === undefined) {
99+
throw new SchematicsException("Build target missing (serve)");
100+
}
101+
if (serveTarget.configurations === undefined) {
102+
throw new SchematicsException("Build target configurations missing (serve)");
103+
}
104+
105+
delete serveTarget.configurations.production;
106+
delete buildTarget.configurations.production;
107+
}
108+
82109
function removeDuplicateStyle(project: ProjectDefinition) {
83110
const extensions = project.extensions;
84111
const schematics = cloneDeep(extensions.schematics) as JsonObject;
@@ -107,18 +134,6 @@ function addBuildOptions(project: ProjectDefinition) {
107134
buildTarget.options['outputPath'] = 'dist';
108135
}
109136

110-
function updateServeOptions(project: ProjectDefinition, projectName: string) {
111-
const targets = project.targets;
112-
const serveTarget = targets.get('serve');
113-
if (serveTarget === undefined) {
114-
throw new SchematicsException("Build target missing (serve)");
115-
}
116-
serveTarget.options = {};
117-
serveTarget.options['browserTarget'] = projectName + ':build:serve';
118-
delete serveTarget["configurations"];
119-
delete serveTarget["defaultConfiguration"];
120-
}
121-
122137
function addTestOptions(project: ProjectDefinition) {
123138
const testTarget = project.targets.get('test');
124139
if (testTarget === undefined) {
@@ -147,6 +162,7 @@ function moveBudgets(project: ProjectDefinition) {
147162
}
148163
const budgets = buildTarget.configurations.production.budgets;
149164
buildTarget.options['budgets'] = cloneDeep(budgets);
165+
delete buildTarget.configurations.production.budgets;
150166
}
151167

152168
function configureBuildConfigurations(project: ProjectDefinition) {
@@ -160,19 +176,14 @@ function configureBuildConfigurations(project: ProjectDefinition) {
160176
if (buildTarget.configurations === undefined) {
161177
throw new SchematicsException("Expected build configurations to be defined");
162178
}
163-
164-
buildTarget.configurations = {
165-
serve: {
166-
buildOptimizer: false,
167-
optimization: false,
168-
extractLicenses: false,
169-
statsJson: false,
170-
sourceMap: true,
171-
vendorChunk: true,
172-
namedChunks: true
173-
}
174-
};
175-
delete buildTarget['defaultConfiguration'];
179+
if (buildTarget.configurations.development === undefined) {
180+
throw new SchematicsException("Expected build configurations development to be defined");
181+
}
182+
buildTarget.configurations.development['statsJson'] = false;
183+
delete buildTarget.configurations.development.vendorChunk; // Already defaulted correctly in build options
184+
delete buildTarget.configurations.development.sourceMap; // Already defaulted correctly in build options
185+
delete buildTarget.configurations.development.namedChunks; // Already defaulted correctly in build options
186+
delete buildTarget.defaultConfiguration; // There is no production configuration (the default is no configuration, only overrideable by the development configuration)
176187
}
177188

178189
function configureTsLint(project: ProjectDefinition) {

0 commit comments

Comments
 (0)