Skip to content

Commit 5495169

Browse files
authored
feat: add scripts validation to keys rule (#253)
1 parent 2b35c40 commit 5495169

File tree

5 files changed

+46
-16
lines changed

5 files changed

+46
-16
lines changed

dist/index.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25796,7 +25796,7 @@ const validateKeys = (packageJson, packageJsonPath) => {
2579625796
const dependencies = (0, get_dependencies_1.getDependencies)(packageJson);
2579725797
const dependencyTypes = (0, get_dependencies_1.getDependencyTypes)();
2579825798
const stringifiedPackageJson = (0, fs_1.readFileSync)(packageJsonPath).toString();
25799-
const stringifiedDependencyObjects = dependencyTypes.map(dependencyType => getStringifiedDependencyObject(stringifiedPackageJson, dependencyType));
25799+
const stringifiedDependencyObjects = dependencyTypes.map(dependencyType => getStringifiedPackageJsonObject(dependencyType, stringifiedPackageJson));
2580025800
Object.keys(dependencies).forEach(dependency => {
2580125801
stringifiedDependencyObjects.forEach(stringifiedDependencyObject => {
2580225802
const regexMatches = stringifiedDependencyObject.match(new RegExp(`"${dependency}"`, 'g'));
@@ -25805,12 +25805,20 @@ const validateKeys = (packageJson, packageJsonPath) => {
2580525805
}
2580625806
});
2580725807
});
25808+
if (packageJson.scripts) {
25809+
Object.keys(packageJson.scripts).forEach(script => {
25810+
const regexMatches = getStringifiedPackageJsonObject('scripts', stringifiedPackageJson).match(new RegExp(`"${script}"`, 'g'));
25811+
if (regexMatches && regexMatches.length > 1) {
25812+
core.setFailed(`Duplicate keys found in package.json: ${regexMatches}`);
25813+
}
25814+
});
25815+
}
2580825816
};
2580925817
exports.validateKeys = validateKeys;
25810-
const getStringifiedDependencyObject = (stringifiedPackageJson, dependencyType) => {
25811-
const dependenciesStartIndex = stringifiedPackageJson.indexOf(`"${dependencyType}"`);
25812-
const dependenciesEndIndex = stringifiedPackageJson.indexOf('}', dependenciesStartIndex);
25813-
return stringifiedPackageJson.substring(dependenciesStartIndex, dependenciesEndIndex + 1);
25818+
const getStringifiedPackageJsonObject = (field, stringifiedPackageJson) => {
25819+
const startIndex = stringifiedPackageJson.indexOf(`"${field}"`);
25820+
const endIndex = stringifiedPackageJson.indexOf('}', startIndex);
25821+
return stringifiedPackageJson.substring(startIndex, endIndex + 1);
2581425822
};
2581525823

2581625824

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: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ limitations under the License.
1414
import * as core from '@actions/core';
1515
import { readFileSync } from 'fs';
1616
import { PackageJson } from 'type-fest';
17-
import { DependencyType, getDependencies, getDependencyTypes } from '../utils/get-dependencies';
17+
import { getDependencies, getDependencyTypes } from '../utils/get-dependencies';
1818

1919
export const validateKeys = (packageJson: PackageJson, packageJsonPath: string) => {
2020
const dependencies = getDependencies(packageJson);
2121
const dependencyTypes = getDependencyTypes();
2222
const stringifiedPackageJson = readFileSync(packageJsonPath).toString();
2323
const stringifiedDependencyObjects = dependencyTypes.map(dependencyType =>
24-
getStringifiedDependencyObject(stringifiedPackageJson, dependencyType)
24+
getStringifiedPackageJsonObject(dependencyType, stringifiedPackageJson)
2525
);
2626
Object.keys(dependencies).forEach(dependency => {
2727
stringifiedDependencyObjects.forEach(stringifiedDependencyObject => {
@@ -31,13 +31,20 @@ export const validateKeys = (packageJson: PackageJson, packageJsonPath: string)
3131
}
3232
});
3333
});
34+
if (packageJson.scripts) {
35+
Object.keys(packageJson.scripts).forEach(script => {
36+
const regexMatches = getStringifiedPackageJsonObject('scripts', stringifiedPackageJson).match(
37+
new RegExp(`"${script}"`, 'g')
38+
);
39+
if (regexMatches && regexMatches.length > 1) {
40+
core.setFailed(`Duplicate keys found in package.json: ${regexMatches}`);
41+
}
42+
});
43+
}
3444
};
3545

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);
46+
const getStringifiedPackageJsonObject = (field: string, stringifiedPackageJson: string) => {
47+
const startIndex = stringifiedPackageJson.indexOf(`"${field}"`);
48+
const endIndex = stringifiedPackageJson.indexOf('}', startIndex);
49+
return stringifiedPackageJson.substring(startIndex, endIndex + 1);
4350
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"dependencies": {
3+
"some-dependency": "1.0.0"
4+
},
5+
"scripts": {
6+
"some-script": "echo Hey",
7+
"some-script": "echo Ho"
8+
}
9+
}

test/rules/keys.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ 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 dupedScriptsPackageJson from '../fixtures/duped-scripts-package.json';
56
import dedupedPackageJson from '../fixtures/deduped-package.json';
67

78
jest.mock('@actions/core');
@@ -13,7 +14,12 @@ describe('keys', () => {
1314
expect(core.setFailed).toHaveBeenCalled();
1415
});
1516

16-
it('should not fail when package.json contains no duplicate keys', () => {
17+
it('should fail when package.json contains duplicate keys in scripts', () => {
18+
validateKeys(dupedScriptsPackageJson, 'test/fixtures/duped-scripts-package.json');
19+
expect(core.setFailed).toHaveBeenCalled();
20+
});
21+
22+
it('should not fail when package.json contains no duplicate keys or scripts', () => {
1723
validateKeys(dedupedPackageJson, 'test/fixtures/deduped-package.json');
1824
expect(core.setFailed).not.toHaveBeenCalled();
1925
});

0 commit comments

Comments
 (0)