Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,13 @@ The following packages are managed by this action:
- `typescript`
- `zone.js`

### Additional features

- Replace the `angular.json` library builder (ng-packagr) based on the angular version.
- Use `@angular-devkit/build-ng-packagr:build` for version prior (<) Angular 10.1
- Use `@angular-devkit/build-angular:ng-packagr` for version post (>=) Angular 10.1
- Remove `allowedCommonJsDependencies` options on Angular versions under 10

## Contributing

We would love you to contribute to `@ngworker/angular-versions-action`, pull requests are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) for more information.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import {AngularJson} from '../../src/types/angular-json';

export const lumberjackPreAngular10RemovedCommonJSDependencies: AngularJson = {
projects: {
'lumberjack-app': {
projectType: 'application',
architect: {
build: {
builder: '@angular-devkit/build-angular:browser',
options: {
vendorChunk: true,
extractLicenses: false,
buildOptimizer: false,
sourceMap: true,
optimization: false,
namedChunks: true
}
},
serve: {
builder: '@angular-devkit/build-angular:dev-server'
},
'extract-i18n': {
builder: '@angular-devkit/build-angular:extract-i18n'
}
}
},
'lumberjack-schematics-app': {
projectType: 'application',
architect: {
build: {
builder: '@angular-devkit/build-angular:browser',
options: {
vendorChunk: true,
extractLicenses: false,
buildOptimizer: false,
sourceMap: true,
optimization: false,
namedChunks: true
}
},
serve: {
builder: '@angular-devkit/build-angular:dev-server'
},
'extract-i18n': {
builder: '@angular-devkit/build-angular:extract-i18n'
}
}
},
'ngworker-lumberjack': {
projectType: 'library',
architect: {
build: {
builder: '@angular-devkit/build-ng-packagr:build',
options: {
tsConfig: 'libs/ngworker/lumberjack/tsconfig.lib.json',
project: 'libs/ngworker/lumberjack/ng-package.json'
}
},
test: {
builder: '@angular-builders/jest:run'
},
lint: {
builder: '@angular-devkit/build-angular:tslint'
}
}
},
'internal-test-util': {
projectType: 'library',
architect: {
build: {
builder: '@angular-devkit/build-angular:ng-packagr'
},
test: {
builder: '@angular-builders/jest:run'
},
lint: {
builder: '@angular-devkit/build-angular:tslint'
}
}
},
'internal-console-driver-test-util': {
projectType: 'library',
architect: {
test: {
builder: '@angular-builders/jest:run'
},
lint: {
builder: '@angular-devkit/build-angular:tslint'
}
}
}
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import {AngularJson} from '../../src/types/angular-json';

export const lumberjackWithMultipleAllowedCommonJSDependencies: AngularJson = {
projects: {
'lumberjack-app': {
projectType: 'application',
architect: {
build: {
builder: '@angular-devkit/build-angular:browser',
options: {
allowedCommonJsDependencies: ['zone.js'],
vendorChunk: true,
extractLicenses: false,
buildOptimizer: false,
sourceMap: true,
optimization: false,
namedChunks: true
}
},
serve: {
builder: '@angular-devkit/build-angular:dev-server'
},
'extract-i18n': {
builder: '@angular-devkit/build-angular:extract-i18n'
}
}
},
'lumberjack-schematics-app': {
projectType: 'application',
architect: {
build: {
builder: '@angular-devkit/build-angular:browser',
options: {
allowedCommonJsDependencies: ['zone.js'],
vendorChunk: true,
extractLicenses: false,
buildOptimizer: false,
sourceMap: true,
optimization: false,
namedChunks: true
}
},
serve: {
builder: '@angular-devkit/build-angular:dev-server'
},
'extract-i18n': {
builder: '@angular-devkit/build-angular:extract-i18n'
}
}
},
'ngworker-lumberjack': {
projectType: 'library',
architect: {
build: {
builder: '@angular-devkit/build-ng-packagr:build',
options: {
tsConfig: 'libs/ngworker/lumberjack/tsconfig.lib.json',
project: 'libs/ngworker/lumberjack/ng-package.json'
}
},
test: {
builder: '@angular-builders/jest:run'
},
lint: {
builder: '@angular-devkit/build-angular:tslint'
}
}
},
'internal-test-util': {
projectType: 'library',
architect: {
build: {
builder: '@angular-devkit/build-angular:ng-packagr'
},
test: {
builder: '@angular-builders/jest:run'
},
lint: {
builder: '@angular-devkit/build-angular:tslint'
}
}
},
'internal-console-driver-test-util': {
projectType: 'library',
architect: {
test: {
builder: '@angular-builders/jest:run'
},
lint: {
builder: '@angular-devkit/build-angular:tslint'
}
}
}
}
};
89 changes: 89 additions & 0 deletions __tests__/remove-commonjs-allow-list.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import {removeCommonJsAllowList} from '../src/remove-commonjs-allowed-dependencies';
import {lumberjackWithMultipleAllowedCommonJSDependencies} from './angular-json/lumberjack-with-multiple-allowed-commonjs-dependencies-options';
import {lumberjackPreAngular10RemovedCommonJSDependencies} from './angular-json/lumberjack-pre-angular10-removed-allowed-commonjs-dependencies';

import {AngularVersion} from '../src/types/angular-version';

const preAngular10Versions: AngularVersion[] = [
'6.0.x',
'6.1.x',
'7.0.x',
'7.1.x',
'7.2.x',
'8.0.x',
'8.1.x',
'8.2.x',
'9.0.x',
'9.1.x'
];

const postAngular10Versions: AngularVersion[] = [
'10.0.x',
'10.1.x',
'10.2.x',
'11.0.x',
'11.1.x',
'11.2.x',
'12.0.x'
];

describe(removeCommonJsAllowList.name, () => {
describe('when using angular versions older than 10.0', () => {
preAngular10Versions.forEach(version => {
describe(`using the version ${version}`, () => {
const actualLumberjackAngularJson = removeCommonJsAllowList(
version,
lumberjackWithMultipleAllowedCommonJSDependencies
);

describe('the lumberjack workspace angular.json', () => {
test('should exactly match the snapshot', () => {
expect(actualLumberjackAngularJson).toEqual(
lumberjackPreAngular10RemovedCommonJSDependencies
);
});

test('should delete the allowedCommonJsDependencies', () => {
expect(
actualLumberjackAngularJson.projects['lumberjack-app'].architect
.build.options?.allowedCommonJsDependencies
).toBeUndefined();
expect(
actualLumberjackAngularJson.projects['lumberjack-schematics-app']
.architect.build.options?.allowedCommonJsDependencies
).toBeUndefined();
});
});
});
});
});
describe('when using angular versions newer or equal than 10.0', () => {
postAngular10Versions.forEach(version => {
describe(`using the version ${version}`, () => {
const actualLumberjackAngularJson = removeCommonJsAllowList(
version,
lumberjackWithMultipleAllowedCommonJSDependencies
);

describe('the lumberjack workspace angular.json', () => {
test('should exactly match the snapshot', () => {
expect(actualLumberjackAngularJson).toEqual(
lumberjackWithMultipleAllowedCommonJSDependencies
);
});

test('should keep the allowedCommonJsDependencies', () => {
expect(
actualLumberjackAngularJson.projects['lumberjack-app'].architect
.build.options?.allowedCommonJsDependencies
).toBeDefined();
expect(
actualLumberjackAngularJson.projects['lumberjack-schematics-app']
.architect.build.options?.allowedCommonJsDependencies
).toBeDefined();
});
});
});
});
});
});
3 changes: 1 addition & 2 deletions dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

59 changes: 59 additions & 0 deletions src/remove-commonjs-allowed-dependencies.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import {cloneDeep} from 'lodash-es';

import {AngularVersion} from './types/angular-version';
import {AngularJson} from './types/angular-json';
import {angularVersionComparer} from './angular-version-comparer';
import {ProjectConfiguration} from './types/project-configuration';
import {ArchitectConfiguration} from './types/architect-configuration';

const exclusiveAngularVersion = '10.0.x';

export function removeCommonJsAllowList(
angularVersion: AngularVersion,
angularJson: AngularJson
): AngularJson {
const modifiedAngularJson = cloneDeep(angularJson);

const projectsAndTargetsWithAllowedCommonJSDependencies = getNameOfProjectsAndTargetsWithAllowedCommonJSDependencies(
angularJson
);

projectsAndTargetsWithAllowedCommonJSDependencies.forEach(
([projectName, targetName]) => {
if (isRemovable(angularVersion)) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
delete modifiedAngularJson.projects[projectName].architect[targetName]
.options!.allowedCommonJsDependencies;
}
}
);

return modifiedAngularJson;
}

function getNameOfProjectsAndTargetsWithAllowedCommonJSDependencies(
workspace: AngularJson
): [string, string][] {
return Object.entries(workspace.projects)
.filter(([, projectConfig]) => projectConfig.projectType === 'application')
.map(([projectName, application]) => {
return [
projectName,
findProjectTargetWithAllowedCommonJSDependencies(application)
] as [string, [string, ArchitectConfiguration]];
})
.filter(([, target]) => target !== undefined)
.map(([projectName, target]) => [projectName, target[0]]);
}

function findProjectTargetWithAllowedCommonJSDependencies(
application: ProjectConfiguration
): [string, ArchitectConfiguration] | undefined {
return Object.entries(application.architect).find(
([, targetConfig]) => !!targetConfig.options?.allowedCommonJsDependencies
);
}

function isRemovable(angularVersion: AngularVersion): boolean {
return angularVersionComparer(angularVersion, exclusiveAngularVersion) < 0;
}
10 changes: 6 additions & 4 deletions src/replace-libraries-ngpackagr-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,17 @@ export function replaceLibrariesNgPackagrBuilder(
): AngularJson {
const modifiedAngularJson = cloneDeep(angularJson);

const projectsAndTargetsWithNgPackagrBuilder =
getNameOfProjectsAndTargetsUsingNgpackagr(angularJson);
const projectsAndTargetsWithNgPackagrBuilder = getNameOfProjectsAndTargetsUsingNgpackagr(
angularJson
);

const correctBuilderForVersion = getCorrectNgPackgrBuilder(angularVersion);

projectsAndTargetsWithNgPackagrBuilder.forEach(
([projectName, targetName]) => {
modifiedAngularJson.projects[projectName].architect[targetName].builder =
correctBuilderForVersion;
modifiedAngularJson.projects[projectName].architect[
targetName
].builder = correctBuilderForVersion;
}
);

Expand Down
3 changes: 3 additions & 0 deletions src/types/architect-configuration.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
export interface ArchitectConfiguration {
builder: string;
options?: {
[prop: string]: unknown;
};
[prop: string]: unknown;
}