Skip to content

Commit 14a81a9

Browse files
authored
fix(keys): scope regex match to within a dependency object (#181)
* fix(keys): scope regex match to within a dependency object * refactor
1 parent 4356c36 commit 14a81a9

7 files changed

Lines changed: 48 additions & 31 deletions

File tree

dist/index.js

Lines changed: 18 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/rules/keys.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,30 @@ limitations under the License.
1414
import * as core from '@actions/core';
1515
import { readFileSync } from 'fs';
1616
import { PackageJson } from 'type-fest';
17-
import { getDependencies } from '../utils/get-dependencies';
17+
import { DependencyType, getDependencies, getDependencyTypes } from '../utils/get-dependencies';
1818

1919
export const validateKeys = (packageJson: PackageJson, packageJsonPath: string) => {
2020
const dependencies = getDependencies(packageJson);
21+
const dependencyTypes = getDependencyTypes();
22+
const stringifiedPackageJson = readFileSync(packageJsonPath).toString();
23+
const stringifiedDependencyObjects = dependencyTypes.map(dependencyType =>
24+
getStringifiedDependencyObject(stringifiedPackageJson, dependencyType)
25+
);
2126
Object.keys(dependencies).forEach(dependency => {
22-
const stringifiedPackageJson = readFileSync(packageJsonPath).toString();
23-
const regexMatches = stringifiedPackageJson.match(new RegExp(`"${dependency}"`, 'g'));
24-
if (regexMatches && regexMatches.length > 1) {
25-
core.setFailed(`Duplicate keys found in package.json: ${regexMatches}`);
26-
}
27+
stringifiedDependencyObjects.forEach(stringifiedDependencyObject => {
28+
const regexMatches = stringifiedDependencyObject.match(new RegExp(`"${dependency}"`, 'g'));
29+
if (regexMatches && regexMatches.length > 1) {
30+
core.setFailed(`Duplicate keys found in package.json: ${regexMatches}`);
31+
}
32+
});
2733
});
2834
};
35+
36+
const getStringifiedDependencyObject = (
37+
stringifiedPackageJson: string,
38+
dependencyType: DependencyType
39+
) => {
40+
const dependenciesStartIndex = stringifiedPackageJson.indexOf(`"${dependencyType}"`);
41+
const dependenciesEndIndex = stringifiedPackageJson.indexOf('}', dependenciesStartIndex);
42+
return stringifiedPackageJson.substring(dependenciesStartIndex, dependenciesEndIndex + 1);
43+
};

src/utils/get-dependencies.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ limitations under the License.
1414
import * as core from '@actions/core';
1515
import { PackageJson } from 'type-fest';
1616

17-
type Dependencies = keyof Pick<
17+
export type DependencyType = keyof Pick<
1818
PackageJson,
1919
'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies'
2020
>;
2121

2222
export const getDependencies = (packageJson: PackageJson): PackageJson.Dependency => {
23-
const dependencyTypes = core.getMultilineInput('dependency-types') as Dependencies[];
23+
const dependencyTypes = getDependencyTypes();
2424
const packagesToIgnore = core.getMultilineInput('ignore-packages');
2525
const dependencies: Record<string, string> = dependencyTypes.reduce(
2626
(acc, dependencyType) => ({ ...acc, ...packageJson[dependencyType] }),
@@ -38,3 +38,6 @@ export const getDependencies = (packageJson: PackageJson): PackageJson.Dependenc
3838
}
3939
return filteredDependencies;
4040
};
41+
42+
export const getDependencyTypes = () =>
43+
core.getMultilineInput('dependency-types') as DependencyType[];

test/fixtures/deduped-package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,8 @@
55
},
66
"devDependencies": {
77
"some-dependency-3": "2.0.0"
8+
},
9+
"scripts": {
10+
"some-dependency": "some script"
811
}
912
}

test/fixtures/duped-package2.json

Lines changed: 0 additions & 9 deletions
This file was deleted.

test/rules/keys.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {validateKeys} from '../../src/rules/keys';
22
import * as core from '@actions/core';
33
import { getMultilineInput } from '@actions/core';
44
import dupedPackageJson from '../fixtures/duped-package.json';
5-
import dupedPackageJson2 from '../fixtures/duped-package2.json';
65
import dedupedPackageJson from '../fixtures/deduped-package.json';
76

87
jest.mock('@actions/core');
@@ -14,11 +13,6 @@ describe('keys', () => {
1413
expect(core.setFailed).toHaveBeenCalled();
1514
});
1615

17-
it('should fail when package.json contains duplicate keys across dependencies and devDependencies', () => {
18-
validateKeys(dupedPackageJson2, 'test/fixtures/duped-package2.json');
19-
expect(core.setFailed).toHaveBeenCalled();
20-
});
21-
2216
it('should not fail when package.json contains no duplicate keys', () => {
2317
validateKeys(dedupedPackageJson, 'test/fixtures/deduped-package.json');
2418
expect(core.setFailed).not.toHaveBeenCalled();

0 commit comments

Comments
 (0)