Skip to content

Commit 4206c5b

Browse files
authored
refactor: use immutable data in a pure function (#6)
1 parent 2df6934 commit 4206c5b

File tree

6 files changed

+650
-623
lines changed

6 files changed

+650
-623
lines changed

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,21 @@
3232
"author": "Nacho Vazquez",
3333
"license": "MIT",
3434
"dependencies": {
35-
"@actions/core": "^1.2.6"
35+
"@actions/core": "^1.2.6",
36+
"lodash-es": "^4.17.15",
37+
"object.fromentries": "^2.0.2"
3638
},
3739
"devDependencies": {
3840
"@commitlint/cli": "11.0.0",
3941
"@commitlint/config-angular": "^11.0.0",
4042
"@commitlint/config-conventional": "^11.0.0",
41-
"all-contributors-cli": "^6.18.0",
4243
"@types/jest": "^26.0.14",
44+
"@types/lodash-es": "^4.17.3",
4345
"@types/node": "^14.11.7",
46+
"@types/object.fromentries": "^2.0.0",
4447
"@typescript-eslint/parser": "^4.4.0",
4548
"@vercel/ncc": "^0.24.1",
49+
"all-contributors-cli": "^6.18.0",
4650
"eslint": "^7.10.0",
4751
"eslint-plugin-github": "^4.1.1",
4852
"eslint-plugin-jest": "^24.1.0",

src/get-angular-versions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {versions} from './angular-versions';
22
import {PackageJsonVersion} from './types/package-json-version';
33

4-
export async function getAngularVersion(
4+
export async function getAngularVersions(
55
angularVersion: string
66
): Promise<PackageJsonVersion> {
77
if (versions.has(angularVersion)) {

src/main.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,41 @@
11
import * as core from '@actions/core';
2-
import {getAngularVersion} from './get-angular-versions';
2+
import * as fs from 'fs';
3+
4+
import {getAngularVersions} from './get-angular-versions';
35
import {overrideAngularVersions} from './override-angular-versions';
6+
import {PackageJsonVersion} from './types/package-json-version';
47

58
async function run(): Promise<void> {
69
try {
710
const angularVersion: string = core.getInput('angular_version');
8-
core.debug(`Finding dependencies for angular version ${angularVersion}`);
11+
core.debug(`Finding dependencies for Angular version ${angularVersion}`);
912

10-
const versions = await getAngularVersion(angularVersion);
11-
core.debug(`Depedencies found: \n ${JSON.stringify(versions, null, 2)}`);
13+
const angularVersions = await getAngularVersions(angularVersion);
14+
core.debug(
15+
`Depedencies found: \n ${JSON.stringify(angularVersions, null, 2)}`
16+
);
1217

1318
const filePath: string = core.getInput('file_path');
1419
core.debug(`merging found dependencies with file ${filePath}`);
1520

16-
const modified = overrideAngularVersions(versions, filePath);
21+
const projectVersions: PackageJsonVersion = JSON.parse(
22+
fs.readFileSync(filePath).toString()
23+
);
24+
const mergedVersions = overrideAngularVersions({
25+
angularVersions,
26+
projectVersions
27+
});
28+
fs.writeFileSync(filePath, JSON.stringify(mergedVersions, null, 2));
1729

1830
core.debug(
1931
`Depedencies merge in package.json: \n ${JSON.stringify(
20-
modified,
32+
mergedVersions,
2133
null,
2234
2
2335
)}`
2436
);
2537

26-
core.debug(new Date().toTimeString());
38+
core.debug(new Date().toISOString());
2739
} catch (error) {
2840
core.setFailed(error.message);
2941
}

src/override-angular-versions.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,39 @@
1-
import {PackageJsonVersion} from './types/package-json-version';
2-
import * as fs from 'fs';
1+
import {intersection} from 'lodash-es';
2+
import fromEntries from 'object.fromentries';
33

4-
export function overrideAngularVersions(
5-
angularVersions: PackageJsonVersion,
6-
path: string
7-
): PackageJsonVersion {
8-
const rawData = fs.readFileSync(path);
9-
const packageJson: PackageJsonVersion = JSON.parse(rawData.toString());
4+
import {PackageJsonVersion} from './types/package-json-version';
105

11-
for (const prop in angularVersions.dependencies) {
12-
if (packageJson.dependencies.hasOwnProperty(prop)) {
13-
packageJson.dependencies[prop] = angularVersions.dependencies[prop];
14-
}
15-
}
6+
export function overrideAngularVersions({
7+
angularVersions,
8+
projectVersions
9+
}: {
10+
angularVersions: PackageJsonVersion;
11+
projectVersions: PackageJsonVersion;
12+
}): PackageJsonVersion {
13+
const dependenciesReplacements = fromEntries<string>(
14+
intersection(
15+
Object.keys(projectVersions.dependencies),
16+
Object.keys(angularVersions.dependencies)
17+
).map(dependency => [dependency, angularVersions.dependencies[dependency]])
18+
);
19+
const devDependenciesReplacements = fromEntries<string>(
20+
intersection(
21+
Object.keys(projectVersions.devDependencies),
22+
Object.keys(angularVersions.devDependencies)
23+
).map(devDependency => [
24+
devDependency,
25+
angularVersions.devDependencies[devDependency]
26+
])
27+
);
1628

17-
for (const prop in angularVersions.devDependencies) {
18-
if (packageJson.devDependencies.hasOwnProperty(prop)) {
19-
packageJson.devDependencies[prop] = angularVersions.devDependencies[prop];
29+
return {
30+
dependencies: {
31+
...projectVersions.dependencies,
32+
...dependenciesReplacements
33+
},
34+
devDependencies: {
35+
...projectVersions.devDependencies,
36+
...devDependenciesReplacements
2037
}
21-
}
22-
23-
fs.writeFileSync(path, JSON.stringify(packageJson));
24-
25-
return packageJson;
38+
};
2639
}

tsconfig.json

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
{
22
"compilerOptions": {
3-
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
4-
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
5-
"outDir": "./lib", /* Redirect output structure to the directory. */
6-
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
7-
"strict": true, /* Enable all strict type-checking options. */
8-
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
9-
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
3+
"target": "es2017" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
4+
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
5+
"lib": ["es2017"] /* Supported by Node.js >=8.10.0 */,
6+
"outDir": "./lib" /* Redirect output structure to the directory. */,
7+
"rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
8+
"strict": true /* Enable all strict type-checking options. */,
9+
"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
10+
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
1011
},
1112
"exclude": ["node_modules", "**/*.test.ts"]
1213
}

0 commit comments

Comments
 (0)