mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-04-27 11:53:23 +01:00
Init Danger/Endanger with Backbone/package.json versions rules
This commit is contained in:
54
danger/rules/migrateBackboneToRedux.ts
Normal file
54
danger/rules/migrateBackboneToRedux.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
// Copyright 2022 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { Line, Rule } from 'endanger';
|
||||
|
||||
export default function migrateBackboneToRedux() {
|
||||
return new Rule({
|
||||
match: {
|
||||
files: ['**/*.{js,jsx,ts,tsx}'],
|
||||
},
|
||||
messages: {
|
||||
foundNewBackboneFile: `
|
||||
**Prefer Redux**
|
||||
Don't create new Backbone files, use Redux
|
||||
`,
|
||||
foundBackboneFileWithManyChanges: `
|
||||
**Prefer Redux**
|
||||
Migrate Backbone files to Redux when making major changes
|
||||
`,
|
||||
},
|
||||
async run({ files, context }) {
|
||||
for (let file of files.touched) {
|
||||
let lines = await file.lines();
|
||||
let matchedLine: Line | null = null;
|
||||
|
||||
for (let line of lines) {
|
||||
// Check for the most stable part of the backbone `import`
|
||||
if (
|
||||
(await line.contains("from 'backbone'")) ||
|
||||
(await line.contains('window.Backbone'))
|
||||
) {
|
||||
matchedLine = line;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!matchedLine) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (file.created) {
|
||||
context.warn('foundNewBackboneFile', { file, line: matchedLine });
|
||||
} else if (file.modifiedOnly) {
|
||||
if (await file.diff().changedBy({ added: 0.1 })) {
|
||||
context.warn('foundBackboneFileWithManyChanges', {
|
||||
file,
|
||||
line: matchedLine,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
77
danger/rules/packageJsonVersionsShouldBePinned.ts
Normal file
77
danger/rules/packageJsonVersionsShouldBePinned.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
// Copyright 2022 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { File, Rule } from 'endanger';
|
||||
import semver from 'semver';
|
||||
|
||||
function isPinnedVersion(version: string): boolean {
|
||||
if (version.startsWith('https:')) {
|
||||
return version.includes('#');
|
||||
}
|
||||
return semver.valid(version) !== null;
|
||||
}
|
||||
|
||||
async function getLineContaining(file: File, text: string) {
|
||||
let lines = await file.lines();
|
||||
for (let line of lines) {
|
||||
if (await line.contains(text)) {
|
||||
return line;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
let dependencyTypes = [
|
||||
'dependencies',
|
||||
'devDependencies',
|
||||
'peerDependencies',
|
||||
'optionalDependencies',
|
||||
];
|
||||
|
||||
export default function packageJsonVersionsShouldBePinned() {
|
||||
return new Rule({
|
||||
match: {
|
||||
files: ['**/package.json', '!**/node_modules/**'],
|
||||
},
|
||||
messages: {
|
||||
packageJsonVersionsShouldBePinned: `
|
||||
**Pin package.json versions**
|
||||
All package.json versions should be pinned to a specific version.
|
||||
See {depName}@{depVersion} in {filePath}#{dependencyType}.
|
||||
`,
|
||||
},
|
||||
async run({ files, context }) {
|
||||
for (let file of files.modifiedOrCreated) {
|
||||
let pkg = await file.json();
|
||||
for (let dependencyType of dependencyTypes) {
|
||||
let deps = pkg[dependencyType];
|
||||
if (deps == null) {
|
||||
continue;
|
||||
}
|
||||
for (let depName of Object.keys(deps)) {
|
||||
let depVersion = deps[depName];
|
||||
if (!isPinnedVersion(depVersion)) {
|
||||
let line = await getLineContaining(
|
||||
file,
|
||||
`"${depName}": "${depVersion}"`
|
||||
);
|
||||
context.warn(
|
||||
'packageJsonVersionsShouldBePinned',
|
||||
{
|
||||
file,
|
||||
line: line ?? undefined,
|
||||
},
|
||||
{
|
||||
depName,
|
||||
depVersion,
|
||||
filePath: file.path,
|
||||
dependencyType,
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user