@monorepolint/rules 0.5.0-alpha.103 → 0.5.0-alpha.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-lint.log +34 -31
- package/.turbo/turbo-test.log +173 -166
- package/.turbo/turbo-transpile-typescript.log +4 -8
- package/build/js/index.js +75 -91
- package/build/js/index.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/alphabeticalDependencies.d.ts +1 -15
- package/build/types/alphabeticalDependencies.d.ts.map +1 -1
- package/build/types/alphabeticalScripts.d.ts +1 -15
- package/build/types/alphabeticalScripts.d.ts.map +1 -1
- package/build/types/bannedDependencies.d.ts +36 -104
- package/build/types/bannedDependencies.d.ts.map +1 -1
- package/build/types/consistentDependencies.d.ts +3 -23
- package/build/types/consistentDependencies.d.ts.map +1 -1
- package/build/types/consistentVersions.d.ts +8 -34
- package/build/types/consistentVersions.d.ts.map +1 -1
- package/build/types/fileContents.d.ts +17 -89
- package/build/types/fileContents.d.ts.map +1 -1
- package/build/types/index.d.ts +13 -13
- package/build/types/index.d.ts.map +1 -1
- package/build/types/mustSatisfyPeerDependencies.d.ts +189 -483
- package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -1
- package/build/types/nestedWorkspaces.d.ts +1 -15
- package/build/types/nestedWorkspaces.d.ts.map +1 -1
- package/build/types/packageEntry.d.ts +30 -91
- package/build/types/packageEntry.d.ts.map +1 -1
- package/build/types/packageOrder.d.ts +3 -23
- package/build/types/packageOrder.d.ts.map +1 -1
- package/build/types/packageScript.d.ts +16 -68
- package/build/types/packageScript.d.ts.map +1 -1
- package/build/types/public/util.d.ts +2 -0
- package/build/types/public/util.d.ts.map +1 -0
- package/build/types/requireDependency.d.ts +22 -86
- package/build/types/requireDependency.d.ts.map +1 -1
- package/build/types/standardTsconfig.d.ts +9 -69
- package/build/types/standardTsconfig.d.ts.map +1 -1
- package/build/types/util/makeRule.d.ts +13 -0
- package/build/types/util/makeRule.d.ts.map +1 -0
- package/package.json +18 -12
- package/src/__tests__/alphabeticalScripts.spec.ts +2 -2
- package/src/__tests__/bannedDependencies.spec.ts +1 -3
- package/src/__tests__/consistentDependencies.spec.ts +2 -2
- package/src/__tests__/consistentVersions.spec.ts +1 -1
- package/src/__tests__/fileContents.spec.ts +16 -12
- package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +1 -1
- package/src/__tests__/nestedWorkspaces.spec.ts +1 -1
- package/src/__tests__/packageEntry.spec.ts +40 -30
- package/src/__tests__/packageOrder.spec.ts +20 -12
- package/src/__tests__/packageScript.spec.ts +55 -39
- package/src/__tests__/requireDependency.spec.ts +2 -2
- package/src/alphabeticalDependencies.ts +5 -7
- package/src/alphabeticalScripts.ts +5 -7
- package/src/bannedDependencies.ts +6 -8
- package/src/consistentDependencies.ts +6 -7
- package/src/consistentVersions.ts +5 -6
- package/src/fileContents.ts +7 -8
- package/src/index.ts +13 -13
- package/src/mustSatisfyPeerDependencies.ts +5 -9
- package/src/nestedWorkspaces.ts +6 -7
- package/src/packageEntry.ts +6 -7
- package/src/packageOrder.ts +6 -7
- package/src/packageScript.ts +5 -7
- package/src/public/util.ts +1 -0
- package/src/requireDependency.ts +6 -6
- package/src/standardTsconfig.ts +7 -9
- package/src/util/makeRule.ts +29 -0
- package/build/js/index.cjs +0 -1491
- package/build/js/index.cjs.map +0 -1
- package/build/types/util/createNewRuleConversion.d.ts +0 -30
- package/build/types/util/createNewRuleConversion.d.ts.map +0 -1
- package/src/util/createNewRuleConversion.ts +0 -38
package/build/js/index.cjs
DELETED
|
@@ -1,1491 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
-
mod
|
|
23
|
-
));
|
|
24
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
-
|
|
26
|
-
// src/index.ts
|
|
27
|
-
var src_exports = {};
|
|
28
|
-
__export(src_exports, {
|
|
29
|
-
AlphabeticalDependencies: () => AlphabeticalDependencies,
|
|
30
|
-
AlphabeticalScripts: () => AlphabeticalScripts,
|
|
31
|
-
BannedDependencies: () => BannedDependencies,
|
|
32
|
-
ConsistentDependencies: () => ConsistentDependencies,
|
|
33
|
-
ConsistentVersions: () => ConsistentVersions,
|
|
34
|
-
FileContents: () => FileContents,
|
|
35
|
-
MustSatisfyPeerDependencies: () => MustSatisfyPeerDependencies,
|
|
36
|
-
NestedWorkspaces: () => NestedWorkspaces,
|
|
37
|
-
PackageEntry: () => PackageEntry,
|
|
38
|
-
PackageOrder: () => PackageOrder,
|
|
39
|
-
PackageScript: () => PackageScript,
|
|
40
|
-
RequireDependency: () => RequireDependency,
|
|
41
|
-
StandardTsConfig: () => StandardTsConfig,
|
|
42
|
-
alphabeticalDependencies: () => alphabeticalDependencies,
|
|
43
|
-
alphabeticalScripts: () => alphabeticalScripts,
|
|
44
|
-
bannedDependencies: () => bannedDependencies,
|
|
45
|
-
consistentDependencies: () => consistentDependencies,
|
|
46
|
-
consistentVersions: () => consistentVersions,
|
|
47
|
-
fileContents: () => fileContents,
|
|
48
|
-
mustSatisfyPeerDependencies: () => mustSatisfyPeerDependencies,
|
|
49
|
-
nestedWorkspaces: () => nestedWorkspaces,
|
|
50
|
-
packageEntry: () => packageEntry,
|
|
51
|
-
packageOrder: () => packageOrder,
|
|
52
|
-
packageScript: () => packageScript,
|
|
53
|
-
requireDependency: () => requireDependency,
|
|
54
|
-
standardTsconfig: () => standardTsconfig
|
|
55
|
-
});
|
|
56
|
-
module.exports = __toCommonJS(src_exports);
|
|
57
|
-
|
|
58
|
-
// src/alphabeticalDependencies.ts
|
|
59
|
-
var r = __toESM(require("runtypes"), 1);
|
|
60
|
-
|
|
61
|
-
// src/util/checkAlpha.ts
|
|
62
|
-
var import_jest_diff = require("jest-diff");
|
|
63
|
-
function checkAlpha(context, block) {
|
|
64
|
-
const packageJson = context.getPackageJson();
|
|
65
|
-
const packagePath = context.getPackageJsonPath();
|
|
66
|
-
const blockToSort = packageJson[block];
|
|
67
|
-
if (blockToSort === void 0) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const actualOrder = Object.keys(blockToSort);
|
|
71
|
-
const expectedOrder = actualOrder.slice().sort();
|
|
72
|
-
if (!arrayOrderCompare(actualOrder, expectedOrder)) {
|
|
73
|
-
context.addError({
|
|
74
|
-
file: packagePath,
|
|
75
|
-
message: createIncorrectOrderErrorMessage(block, packageJson.name),
|
|
76
|
-
longMessage: (0, import_jest_diff.diff)(expectedOrder, actualOrder, { expand: true }),
|
|
77
|
-
fixer: () => {
|
|
78
|
-
const expectedDependencies = {};
|
|
79
|
-
expectedOrder.forEach((dep) => {
|
|
80
|
-
expectedDependencies[dep] = blockToSort[dep];
|
|
81
|
-
});
|
|
82
|
-
const newPackageJson = { ...packageJson };
|
|
83
|
-
newPackageJson[block] = expectedDependencies;
|
|
84
|
-
context.host.writeJson(packagePath, newPackageJson);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
function arrayOrderCompare(a, b) {
|
|
90
|
-
for (let index = 0; index < a.length; index++) {
|
|
91
|
-
if (a[index] !== b[index]) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
function createIncorrectOrderErrorMessage(block, packageName) {
|
|
98
|
-
return `Incorrect order of ${block} in ${packageName}'s package.json`;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// src/util/createNewRuleConversion.ts
|
|
102
|
-
var id = 0;
|
|
103
|
-
var NewRuleConverterBase = class {
|
|
104
|
-
constructor(name, checkFunc, optionsRuntype, ruleEntry) {
|
|
105
|
-
this.name = name;
|
|
106
|
-
this.checkFunc = checkFunc;
|
|
107
|
-
this.optionsRuntype = optionsRuntype;
|
|
108
|
-
this.ruleEntry = ruleEntry;
|
|
109
|
-
this.check = (context) => this.checkFunc(context, this.ruleEntry.options, { id: this.id });
|
|
110
|
-
this.options = ruleEntry.options;
|
|
111
|
-
this.id = `${this.name} :: ${id++}`;
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
function createNewRuleConversion(name, old) {
|
|
115
|
-
return class NewRule extends NewRuleConverterBase {
|
|
116
|
-
constructor(ruleEntry) {
|
|
117
|
-
super(name, old.check, old.optionsRuntype, ruleEntry);
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// src/alphabeticalDependencies.ts
|
|
123
|
-
var Options = r.Undefined;
|
|
124
|
-
var alphabeticalDependencies = {
|
|
125
|
-
check: function expectAlphabeticalDependencies(context) {
|
|
126
|
-
checkAlpha(context, "dependencies");
|
|
127
|
-
checkAlpha(context, "devDependencies");
|
|
128
|
-
checkAlpha(context, "peerDependencies");
|
|
129
|
-
},
|
|
130
|
-
optionsRuntype: Options
|
|
131
|
-
};
|
|
132
|
-
var AlphabeticalDependencies = createNewRuleConversion("AlphabetialDependencies", alphabeticalDependencies);
|
|
133
|
-
|
|
134
|
-
// src/alphabeticalScripts.ts
|
|
135
|
-
var r2 = __toESM(require("runtypes"), 1);
|
|
136
|
-
var Options2 = r2.Undefined;
|
|
137
|
-
var alphabeticalScripts = {
|
|
138
|
-
check: function expectAlphabeticalScripts(context) {
|
|
139
|
-
checkAlpha(context, "scripts");
|
|
140
|
-
},
|
|
141
|
-
optionsRuntype: Options2
|
|
142
|
-
};
|
|
143
|
-
var AlphabeticalScripts = createNewRuleConversion("AlphabeticalScripts", alphabeticalScripts);
|
|
144
|
-
|
|
145
|
-
// src/bannedDependencies.ts
|
|
146
|
-
var import_utils = require("@monorepolint/utils");
|
|
147
|
-
var import_utils2 = require("@monorepolint/utils");
|
|
148
|
-
var path2 = __toESM(require("path"), 1);
|
|
149
|
-
var r3 = __toESM(require("runtypes"), 1);
|
|
150
|
-
|
|
151
|
-
// src/util/packageDependencyGraphService.ts
|
|
152
|
-
var path = __toESM(require("path"), 1);
|
|
153
|
-
var import_resolve_package_path = __toESM(require("resolve-package-path"), 1);
|
|
154
|
-
var PackageDependencyGraphService = class {
|
|
155
|
-
buildDependencyGraph(startPackageJsonPath, host, maxDepth) {
|
|
156
|
-
const nodes = /* @__PURE__ */ new Map();
|
|
157
|
-
const visit = (packageJsonPath, currentDepth) => {
|
|
158
|
-
if (nodes.has(packageJsonPath)) {
|
|
159
|
-
return nodes.get(packageJsonPath);
|
|
160
|
-
}
|
|
161
|
-
const packageJson = host.readJson(packageJsonPath);
|
|
162
|
-
const node = {
|
|
163
|
-
packageJson,
|
|
164
|
-
dependencies: /* @__PURE__ */ new Map(),
|
|
165
|
-
paths: {
|
|
166
|
-
packageJsonPath,
|
|
167
|
-
rootDirectory: path.dirname(packageJsonPath)
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
nodes.set(packageJsonPath, node);
|
|
171
|
-
const nextDepth = currentDepth + 1;
|
|
172
|
-
if (maxDepth == null || nextDepth <= maxDepth) {
|
|
173
|
-
const dependencies = packageJson.dependencies != null ? Object.keys(packageJson.dependencies) : [];
|
|
174
|
-
for (const dependency of dependencies) {
|
|
175
|
-
const dependencyPackageJsonPath = (0, import_resolve_package_path.default)(dependency, node.paths.rootDirectory);
|
|
176
|
-
if (dependencyPackageJsonPath == null) {
|
|
177
|
-
throw new Error(`Could not resolve ${dependency} from ${node.paths.rootDirectory}`);
|
|
178
|
-
}
|
|
179
|
-
node.dependencies.set(dependency, visit(dependencyPackageJsonPath, nextDepth));
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return node;
|
|
183
|
-
};
|
|
184
|
-
return visit(startPackageJsonPath, 0);
|
|
185
|
-
}
|
|
186
|
-
*traverse(root, opts = { traverseAllPaths: false }) {
|
|
187
|
-
const visited = /* @__PURE__ */ new Set();
|
|
188
|
-
function* visit(node, importPath = []) {
|
|
189
|
-
if (!opts.traverseAllPaths && visited.has(node)) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
if (importPath.indexOf(node) !== -1) {
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
visited.add(node);
|
|
196
|
-
importPath = [...importPath, node];
|
|
197
|
-
yield { ...node, importPath };
|
|
198
|
-
for (const dependency of node.dependencies.values()) {
|
|
199
|
-
yield* visit(dependency, importPath);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
yield* visit(root);
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// src/bannedDependencies.ts
|
|
207
|
-
var bannedDepGlobsField = r3.Union(
|
|
208
|
-
r3.Array(r3.String),
|
|
209
|
-
r3.Record({
|
|
210
|
-
glob: r3.Array(r3.String).optional(),
|
|
211
|
-
exact: r3.Array(r3.String).optional()
|
|
212
|
-
})
|
|
213
|
-
);
|
|
214
|
-
var Options3 = r3.Union(
|
|
215
|
-
r3.Record({
|
|
216
|
-
bannedDependencies: bannedDepGlobsField,
|
|
217
|
-
bannedTransitiveDependencies: r3.Undefined.optional()
|
|
218
|
-
}),
|
|
219
|
-
r3.Record({
|
|
220
|
-
bannedDependencies: bannedDepGlobsField.optional(),
|
|
221
|
-
bannedTransitiveDependencies: r3.Array(r3.String)
|
|
222
|
-
}),
|
|
223
|
-
r3.Record({
|
|
224
|
-
bannedDependencies: bannedDepGlobsField.optional(),
|
|
225
|
-
bannedTransitiveDependencies: r3.Array(r3.String).optional()
|
|
226
|
-
})
|
|
227
|
-
);
|
|
228
|
-
var setCache = /* @__PURE__ */ new Map();
|
|
229
|
-
var aggregateTiming = new import_utils2.AggregateTiming(":bannedDependencies stats");
|
|
230
|
-
var bannedDependencies = {
|
|
231
|
-
check: function expectAllowedDependencies(context, opts, extra) {
|
|
232
|
-
aggregateTiming.start(extra?.id ?? "unknown id");
|
|
233
|
-
const packageJson = context.getPackageJson();
|
|
234
|
-
const packagePath = context.getPackageJsonPath();
|
|
235
|
-
const curDeps = packageJson.dependencies && Object.keys(packageJson.dependencies);
|
|
236
|
-
const curDevDeps = packageJson.devDependencies && Object.keys(packageJson.devDependencies);
|
|
237
|
-
const curPeerDeps = packageJson.peerDependencies && Object.keys(packageJson.peerDependencies);
|
|
238
|
-
const { bannedDependencies: banned, bannedTransitiveDependencies: transitives } = opts;
|
|
239
|
-
const globs = banned && (Array.isArray(banned) ? banned : banned.glob);
|
|
240
|
-
const exacts = banned && (Array.isArray(banned) ? void 0 : banned.exact);
|
|
241
|
-
const violations = /* @__PURE__ */ new Set();
|
|
242
|
-
if (globs) {
|
|
243
|
-
if (curDeps)
|
|
244
|
-
populateProblemsGlobs(globs, curDeps, violations);
|
|
245
|
-
if (curDevDeps)
|
|
246
|
-
populateProblemsGlobs(globs, curDevDeps, violations);
|
|
247
|
-
if (curPeerDeps)
|
|
248
|
-
populateProblemsGlobs(globs, curPeerDeps, violations);
|
|
249
|
-
}
|
|
250
|
-
if (exacts) {
|
|
251
|
-
let set = setCache.get(exacts);
|
|
252
|
-
if (set === void 0) {
|
|
253
|
-
set = new Set(exacts);
|
|
254
|
-
setCache.set(exacts, set);
|
|
255
|
-
}
|
|
256
|
-
if (curDeps)
|
|
257
|
-
populateProblemsExact(set, curDeps, violations);
|
|
258
|
-
if (curDevDeps)
|
|
259
|
-
populateProblemsExact(set, curDevDeps, violations);
|
|
260
|
-
if (curPeerDeps)
|
|
261
|
-
populateProblemsExact(set, curPeerDeps, violations);
|
|
262
|
-
}
|
|
263
|
-
if (violations.size > 0) {
|
|
264
|
-
context.addError({
|
|
265
|
-
file: packagePath,
|
|
266
|
-
message: `Found ${violations.size} banned dependencies of package.json:
|
|
267
|
-
` + Array.from(violations).map((v) => `'${v}'`).join(", ")
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
if (transitives) {
|
|
271
|
-
let set = setCache.get(transitives);
|
|
272
|
-
if (set === void 0) {
|
|
273
|
-
set = new Set(transitives);
|
|
274
|
-
setCache.set(transitives, set);
|
|
275
|
-
}
|
|
276
|
-
checkTransitives(context, set);
|
|
277
|
-
}
|
|
278
|
-
aggregateTiming.stop();
|
|
279
|
-
},
|
|
280
|
-
optionsRuntype: Options3,
|
|
281
|
-
printStats: () => {
|
|
282
|
-
aggregateTiming.printResults();
|
|
283
|
-
}
|
|
284
|
-
};
|
|
285
|
-
var BannedDependencies = createNewRuleConversion("BannedDependencies", bannedDependencies);
|
|
286
|
-
function populateProblemsExact(banned, dependencies, violations) {
|
|
287
|
-
for (const dependency of dependencies) {
|
|
288
|
-
if (banned.has(dependency)) {
|
|
289
|
-
violations.add(dependency);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
function populateProblemsGlobs(bannedDependencyGlobs, dependencies, violations) {
|
|
294
|
-
for (const dependency of dependencies) {
|
|
295
|
-
if ((0, import_utils.matchesAnyGlob)(dependency, bannedDependencyGlobs)) {
|
|
296
|
-
violations.add(dependency);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
function checkTransitives(context, banned) {
|
|
301
|
-
const graphService = new PackageDependencyGraphService();
|
|
302
|
-
const root = graphService.buildDependencyGraph(path2.resolve(context.getPackageJsonPath()), context.host);
|
|
303
|
-
for (const { dependencies, importPath } of graphService.traverse(root)) {
|
|
304
|
-
for (const [dependency] of dependencies) {
|
|
305
|
-
if (banned.has(dependency)) {
|
|
306
|
-
const [, ...importPathWithoutRoot] = importPath;
|
|
307
|
-
const pathing = [...importPathWithoutRoot.map(nameOrPackageJsonPath), dependency].join(" -> ");
|
|
308
|
-
context.addError({
|
|
309
|
-
file: root.paths.packageJsonPath,
|
|
310
|
-
message: `Banned transitive dependencies in repo: ${pathing}`
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
function nameOrPackageJsonPath(node) {
|
|
317
|
-
return node.packageJson.name ?? node.paths.packageJsonPath;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// src/consistentDependencies.ts
|
|
321
|
-
var import_jest_diff2 = require("jest-diff");
|
|
322
|
-
var r4 = __toESM(require("runtypes"), 1);
|
|
323
|
-
var Options4 = r4.Record({
|
|
324
|
-
ignoredDependencies: r4.Array(r4.String).Or(r4.Undefined)
|
|
325
|
-
}).Or(r4.Undefined);
|
|
326
|
-
var skippedVersions = ["*", "latest"];
|
|
327
|
-
var consistentDependencies = {
|
|
328
|
-
check: function expectConsistentDependencies(context, args) {
|
|
329
|
-
checkDeps(context, args, "dependencies");
|
|
330
|
-
checkDeps(context, args, "devDependencies");
|
|
331
|
-
},
|
|
332
|
-
optionsRuntype: Options4
|
|
333
|
-
};
|
|
334
|
-
var ConsistentDependencies = createNewRuleConversion("ConsistentDependencies", consistentDependencies);
|
|
335
|
-
function checkDeps(context, args, block) {
|
|
336
|
-
const packageJson = context.getPackageJson();
|
|
337
|
-
const packagePath = context.getPackageJsonPath();
|
|
338
|
-
const dependencies = packageJson[block];
|
|
339
|
-
const workspacePackageJson = context.getWorkspaceContext().getPackageJson();
|
|
340
|
-
const workspaceDependencies = workspacePackageJson[block];
|
|
341
|
-
const ignoredDeps = args?.ignoredDependencies ?? [];
|
|
342
|
-
const depsToCheck = workspaceDependencies == null || ignoredDeps.length === 0 ? workspaceDependencies : omit(workspaceDependencies, ignoredDeps);
|
|
343
|
-
if (dependencies === void 0 || depsToCheck === void 0) {
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
const expectedDependencies = {
|
|
347
|
-
...dependencies,
|
|
348
|
-
...filterKeys(depsToCheck, dependencies)
|
|
349
|
-
};
|
|
350
|
-
if (JSON.stringify(dependencies) !== JSON.stringify(expectedDependencies)) {
|
|
351
|
-
context.addError({
|
|
352
|
-
file: packagePath,
|
|
353
|
-
message: `Inconsistent ${block} with root in package.json`,
|
|
354
|
-
longMessage: (0, import_jest_diff2.diff)(expectedDependencies, dependencies, { expand: true }),
|
|
355
|
-
fixer: () => {
|
|
356
|
-
const newPackageJson = { ...packageJson };
|
|
357
|
-
newPackageJson[block] = expectedDependencies;
|
|
358
|
-
context.host.writeJson(packagePath, newPackageJson);
|
|
359
|
-
}
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
function filterKeys(ob, filterOb) {
|
|
364
|
-
const newOb = {};
|
|
365
|
-
for (const key of Object.keys(filterOb)) {
|
|
366
|
-
if (ob[key] !== void 0 && skippedVersions.indexOf(filterOb[key]) === -1) {
|
|
367
|
-
newOb[key] = ob[key];
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return newOb;
|
|
371
|
-
}
|
|
372
|
-
function omit(obj, keysToOmit) {
|
|
373
|
-
const newObj = {};
|
|
374
|
-
const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));
|
|
375
|
-
for (const [key, value] of filtered) {
|
|
376
|
-
newObj[key] = value;
|
|
377
|
-
}
|
|
378
|
-
return newObj;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// src/consistentVersions.ts
|
|
382
|
-
var import_utils3 = require("@monorepolint/utils");
|
|
383
|
-
var r5 = __toESM(require("runtypes"), 1);
|
|
384
|
-
var import_semver = require("semver");
|
|
385
|
-
var Options5 = r5.Record({
|
|
386
|
-
matchDependencyVersions: r5.Dictionary(r5.Union(r5.String, r5.Array(r5.String)))
|
|
387
|
-
});
|
|
388
|
-
var consistentVersions = {
|
|
389
|
-
check: checkConsistentVersions,
|
|
390
|
-
optionsRuntype: Options5
|
|
391
|
-
};
|
|
392
|
-
function checkConsistentVersions(context, options) {
|
|
393
|
-
for (const [dependencyPackageName, expectedPackageDependencyValue] of Object.entries(
|
|
394
|
-
options.matchDependencyVersions
|
|
395
|
-
)) {
|
|
396
|
-
if (Array.isArray(expectedPackageDependencyValue)) {
|
|
397
|
-
ensurePackageMatchesSomeVersion(context, dependencyPackageName, expectedPackageDependencyValue);
|
|
398
|
-
} else {
|
|
399
|
-
ensurePackageIsCorrectVersion(context, dependencyPackageName, expectedPackageDependencyValue);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
var ensurePackageIsCorrectVersion = (context, dependencyPackageName, expectedPackageDependencyValue) => {
|
|
404
|
-
const packageJson = context.getPackageJson();
|
|
405
|
-
const packageJsonPath = context.getPackageJsonPath();
|
|
406
|
-
const expectedPackageDependencyVersion = (0, import_semver.coerce)(expectedPackageDependencyValue);
|
|
407
|
-
if (expectedPackageDependencyVersion == null) {
|
|
408
|
-
throw new Error(
|
|
409
|
-
`Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'`
|
|
410
|
-
);
|
|
411
|
-
}
|
|
412
|
-
const actualPackageDependencyValue = packageJson.dependencies && packageJson.dependencies[dependencyPackageName];
|
|
413
|
-
const actualPackageDependencyVersion = (0, import_semver.coerce)(actualPackageDependencyValue);
|
|
414
|
-
if (actualPackageDependencyVersion != null && actualPackageDependencyVersion.raw !== expectedPackageDependencyVersion.raw) {
|
|
415
|
-
context.addError({
|
|
416
|
-
file: packageJsonPath,
|
|
417
|
-
message: `Expected dependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDependencyValue}' instead.`,
|
|
418
|
-
fixer: () => (0, import_utils3.mutateJson)(packageJsonPath, context.host, (input) => {
|
|
419
|
-
input.dependencies[dependencyPackageName] = expectedPackageDependencyValue;
|
|
420
|
-
return input;
|
|
421
|
-
})
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
const actualPackageDevDependencyValue = packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];
|
|
425
|
-
const actualPackageDevDependencyVersion = (0, import_semver.coerce)(actualPackageDevDependencyValue);
|
|
426
|
-
if (actualPackageDevDependencyVersion != null && actualPackageDevDependencyVersion.raw !== expectedPackageDependencyVersion.raw) {
|
|
427
|
-
context.addError({
|
|
428
|
-
file: packageJsonPath,
|
|
429
|
-
message: `Expected devDependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDevDependencyValue}' instead`,
|
|
430
|
-
fixer: () => (0, import_utils3.mutateJson)(packageJsonPath, context.host, (input) => {
|
|
431
|
-
input.devDependencies[dependencyPackageName] = expectedPackageDependencyValue;
|
|
432
|
-
return input;
|
|
433
|
-
})
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
};
|
|
437
|
-
var ensurePackageMatchesSomeVersion = (context, dependencyPackageName, acceptedPackageDependencyValues) => {
|
|
438
|
-
const packageJson = context.getPackageJson();
|
|
439
|
-
const packageJsonPath = context.getPackageJsonPath();
|
|
440
|
-
const acceptedPackageDependencyVersions = acceptedPackageDependencyValues.map(
|
|
441
|
-
(acceptedPackageDependencyValue) => {
|
|
442
|
-
const acceptedPackageDependencyVersion = (0, import_semver.coerce)(acceptedPackageDependencyValue);
|
|
443
|
-
if (acceptedPackageDependencyVersion == null) {
|
|
444
|
-
throw new Error(
|
|
445
|
-
`Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`
|
|
446
|
-
);
|
|
447
|
-
}
|
|
448
|
-
return acceptedPackageDependencyVersion;
|
|
449
|
-
}
|
|
450
|
-
);
|
|
451
|
-
const actualPackageDependencyValue = packageJson.dependencies && packageJson.dependencies[dependencyPackageName];
|
|
452
|
-
const actualPackageDependencyVersion = (0, import_semver.coerce)(actualPackageDependencyValue);
|
|
453
|
-
if (actualPackageDependencyVersion != null && acceptedPackageDependencyVersions.every(
|
|
454
|
-
(acceptedPackageDependencyVersion) => actualPackageDependencyVersion.raw !== acceptedPackageDependencyVersion.raw
|
|
455
|
-
)) {
|
|
456
|
-
context.addError({
|
|
457
|
-
file: packageJsonPath,
|
|
458
|
-
message: `Expected dependency on ${dependencyPackageName} to match one of '${JSON.stringify(
|
|
459
|
-
acceptedPackageDependencyValues
|
|
460
|
-
)}', got '${actualPackageDependencyValue}' instead.`
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
const actualPackageDevDependencyValue = packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];
|
|
464
|
-
const actualPackageDevDependencyVersion = (0, import_semver.coerce)(actualPackageDevDependencyValue);
|
|
465
|
-
if (actualPackageDevDependencyVersion != null && acceptedPackageDependencyVersions.every(
|
|
466
|
-
(acceptedPackageDependencyVersion) => actualPackageDevDependencyVersion.raw !== acceptedPackageDependencyVersion.raw
|
|
467
|
-
)) {
|
|
468
|
-
context.addError({
|
|
469
|
-
file: packageJsonPath,
|
|
470
|
-
message: `Expected devDependency on ${dependencyPackageName} to match one of '${JSON.stringify(
|
|
471
|
-
acceptedPackageDependencyValues
|
|
472
|
-
)}', got '${actualPackageDevDependencyValue}' instead.`
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
};
|
|
476
|
-
var ConsistentVersions = createNewRuleConversion("ConsistentVersions", consistentVersions);
|
|
477
|
-
|
|
478
|
-
// src/fileContents.ts
|
|
479
|
-
var import_jest_diff3 = require("jest-diff");
|
|
480
|
-
var path3 = __toESM(require("path"), 1);
|
|
481
|
-
var r6 = __toESM(require("runtypes"), 1);
|
|
482
|
-
var Options6 = r6.Union(
|
|
483
|
-
r6.Record({
|
|
484
|
-
file: r6.String,
|
|
485
|
-
generator: r6.Function,
|
|
486
|
-
template: r6.Undefined.optional(),
|
|
487
|
-
templateFile: r6.Undefined.optional()
|
|
488
|
-
}),
|
|
489
|
-
r6.Record({
|
|
490
|
-
file: r6.String,
|
|
491
|
-
generator: r6.Undefined.optional(),
|
|
492
|
-
template: r6.String,
|
|
493
|
-
templateFile: r6.Undefined.optional()
|
|
494
|
-
}),
|
|
495
|
-
r6.Record({
|
|
496
|
-
file: r6.String,
|
|
497
|
-
generator: r6.Undefined.optional(),
|
|
498
|
-
template: r6.Undefined.optional(),
|
|
499
|
-
templateFile: r6.String
|
|
500
|
-
})
|
|
501
|
-
);
|
|
502
|
-
var fileContents = {
|
|
503
|
-
check: function expectFileContents(context, opts) {
|
|
504
|
-
const fullPath = path3.join(context.packageDir, opts.file);
|
|
505
|
-
const expectedContent = getExpectedContents(context, opts);
|
|
506
|
-
const pathExists = context.host.exists(fullPath);
|
|
507
|
-
const actualContent = pathExists ? context.host.readFile(fullPath, { encoding: "utf-8" }) : void 0;
|
|
508
|
-
if (actualContent !== expectedContent) {
|
|
509
|
-
context.addError({
|
|
510
|
-
file: fullPath,
|
|
511
|
-
message: "Expect file contents to match",
|
|
512
|
-
longMessage: (0, import_jest_diff3.diff)(expectedContent, actualContent, { expand: true }),
|
|
513
|
-
fixer: () => {
|
|
514
|
-
if (expectedContent === void 0) {
|
|
515
|
-
if (pathExists)
|
|
516
|
-
context.host.deleteFile(fullPath);
|
|
517
|
-
} else {
|
|
518
|
-
context.host.mkdir(path3.dirname(fullPath), { recursive: true });
|
|
519
|
-
context.host.writeFile(fullPath, expectedContent, { encoding: "utf-8" });
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
});
|
|
523
|
-
}
|
|
524
|
-
},
|
|
525
|
-
optionsRuntype: Options6
|
|
526
|
-
};
|
|
527
|
-
var optionsCache = /* @__PURE__ */ new Map();
|
|
528
|
-
function getExpectedContents(context, opts) {
|
|
529
|
-
if (optionsCache.has(opts)) {
|
|
530
|
-
const cachedEntry = optionsCache.get(opts);
|
|
531
|
-
if (cachedEntry && typeof cachedEntry === "function") {
|
|
532
|
-
return cachedEntry(context);
|
|
533
|
-
}
|
|
534
|
-
return cachedEntry;
|
|
535
|
-
}
|
|
536
|
-
if (opts.generator) {
|
|
537
|
-
optionsCache.set(opts, opts.generator);
|
|
538
|
-
return opts.generator(context);
|
|
539
|
-
} else if (opts.templateFile) {
|
|
540
|
-
const { packageDir: workspacePackageDir } = context.getWorkspaceContext();
|
|
541
|
-
const fullPath = path3.resolve(workspacePackageDir, opts.templateFile);
|
|
542
|
-
const template = context.host.readFile(fullPath, { encoding: "utf-8" });
|
|
543
|
-
optionsCache.set(opts, template);
|
|
544
|
-
return template;
|
|
545
|
-
} else {
|
|
546
|
-
optionsCache.set(opts, opts.template);
|
|
547
|
-
return opts.template;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
var FileContents = createNewRuleConversion("FileContents", fileContents);
|
|
551
|
-
|
|
552
|
-
// src/mustSatisfyPeerDependencies.ts
|
|
553
|
-
var import_utils4 = require("@monorepolint/utils");
|
|
554
|
-
var path4 = __toESM(require("path"), 1);
|
|
555
|
-
var r7 = __toESM(require("runtypes"), 1);
|
|
556
|
-
var import_semver2 = require("semver");
|
|
557
|
-
var import_resolve_package_path2 = __toESM(require("resolve-package-path"), 1);
|
|
558
|
-
var Options7 = r7.Union(
|
|
559
|
-
r7.Partial({
|
|
560
|
-
skipUnparseableRanges: r7.Undefined,
|
|
561
|
-
dependencyWhitelist: r7.Undefined,
|
|
562
|
-
dependencyBlacklist: r7.Undefined,
|
|
563
|
-
enforceForDevDependencies: r7.Undefined
|
|
564
|
-
}),
|
|
565
|
-
r7.Record({
|
|
566
|
-
skipUnparseableRanges: r7.Boolean
|
|
567
|
-
}).And(
|
|
568
|
-
r7.Partial({
|
|
569
|
-
dependencyWhitelist: r7.Undefined,
|
|
570
|
-
dependencyBlacklist: r7.Undefined,
|
|
571
|
-
enforceForDevDependencies: r7.Undefined
|
|
572
|
-
})
|
|
573
|
-
),
|
|
574
|
-
r7.Record({
|
|
575
|
-
dependencyWhitelist: r7.Array(r7.String)
|
|
576
|
-
}).And(
|
|
577
|
-
r7.Partial({
|
|
578
|
-
skipUnparseableRanges: r7.Undefined,
|
|
579
|
-
dependencyBlacklist: r7.Undefined,
|
|
580
|
-
enforceForDevDependencies: r7.Undefined
|
|
581
|
-
})
|
|
582
|
-
),
|
|
583
|
-
r7.Record({
|
|
584
|
-
dependencyBlacklist: r7.Array(r7.String)
|
|
585
|
-
}).And(
|
|
586
|
-
r7.Partial({
|
|
587
|
-
skipUnparseableRanges: r7.Undefined,
|
|
588
|
-
dependencyWhitelist: r7.Undefined,
|
|
589
|
-
enforceForDevDependencies: r7.Undefined
|
|
590
|
-
})
|
|
591
|
-
),
|
|
592
|
-
r7.Record({
|
|
593
|
-
enforceForDevDependencies: r7.Boolean
|
|
594
|
-
}).And(
|
|
595
|
-
r7.Partial({
|
|
596
|
-
skipUnparseableRanges: r7.Undefined,
|
|
597
|
-
dependencyWhitelist: r7.Undefined,
|
|
598
|
-
dependencyBlacklist: r7.Undefined
|
|
599
|
-
})
|
|
600
|
-
),
|
|
601
|
-
r7.Record({
|
|
602
|
-
skipUnparseableRanges: r7.Boolean,
|
|
603
|
-
dependencyWhitelist: r7.Array(r7.String)
|
|
604
|
-
}).And(
|
|
605
|
-
r7.Partial({
|
|
606
|
-
dependencyBlacklist: r7.Undefined,
|
|
607
|
-
enforceForDevDependencies: r7.Undefined
|
|
608
|
-
})
|
|
609
|
-
),
|
|
610
|
-
r7.Record({
|
|
611
|
-
skipUnparseableRanges: r7.Boolean,
|
|
612
|
-
dependencyBlacklist: r7.Array(r7.String)
|
|
613
|
-
}).And(
|
|
614
|
-
r7.Partial({
|
|
615
|
-
dependencyWhitelist: r7.Undefined,
|
|
616
|
-
enforceForDevDependencies: r7.Undefined
|
|
617
|
-
})
|
|
618
|
-
),
|
|
619
|
-
r7.Record({
|
|
620
|
-
skipUnparseableRanges: r7.Boolean,
|
|
621
|
-
enforceForDevDependencies: r7.Boolean
|
|
622
|
-
}).And(
|
|
623
|
-
r7.Partial({
|
|
624
|
-
dependencyWhitelist: r7.Undefined,
|
|
625
|
-
dependencyBlacklist: r7.Undefined
|
|
626
|
-
})
|
|
627
|
-
),
|
|
628
|
-
r7.Record({
|
|
629
|
-
dependencyWhitelist: r7.Array(r7.String),
|
|
630
|
-
dependencyBlacklist: r7.Array(r7.String)
|
|
631
|
-
}).And(
|
|
632
|
-
r7.Partial({
|
|
633
|
-
skipUnparseableRanges: r7.Undefined,
|
|
634
|
-
enforceForDevDependencies: r7.Undefined
|
|
635
|
-
})
|
|
636
|
-
),
|
|
637
|
-
r7.Record({
|
|
638
|
-
dependencyWhitelist: r7.Array(r7.String),
|
|
639
|
-
enforceForDevDependencies: r7.Boolean
|
|
640
|
-
}).And(
|
|
641
|
-
r7.Partial({
|
|
642
|
-
skipUnparseableRanges: r7.Undefined,
|
|
643
|
-
dependencyBlacklist: r7.Undefined
|
|
644
|
-
})
|
|
645
|
-
),
|
|
646
|
-
r7.Record({
|
|
647
|
-
dependencyBlacklist: r7.Array(r7.String),
|
|
648
|
-
enforceForDevDependencies: r7.Boolean
|
|
649
|
-
}).And(
|
|
650
|
-
r7.Partial({
|
|
651
|
-
skipUnparseableRanges: r7.Undefined,
|
|
652
|
-
dependencyWhitelist: r7.Undefined
|
|
653
|
-
})
|
|
654
|
-
),
|
|
655
|
-
r7.Record({
|
|
656
|
-
skipUnparseableRanges: r7.Boolean,
|
|
657
|
-
dependencyWhitelist: r7.Array(r7.String),
|
|
658
|
-
dependencyBlacklist: r7.Array(r7.String)
|
|
659
|
-
}).And(
|
|
660
|
-
r7.Partial({
|
|
661
|
-
enforceForDevDependencies: r7.Undefined
|
|
662
|
-
})
|
|
663
|
-
),
|
|
664
|
-
r7.Record({
|
|
665
|
-
skipUnparseableRanges: r7.Boolean,
|
|
666
|
-
dependencyWhitelist: r7.Array(r7.String),
|
|
667
|
-
enforceForDevDependencies: r7.Boolean
|
|
668
|
-
}).And(
|
|
669
|
-
r7.Partial({
|
|
670
|
-
dependencyBlacklist: r7.Undefined
|
|
671
|
-
})
|
|
672
|
-
),
|
|
673
|
-
r7.Record({
|
|
674
|
-
skipUnparseableRanges: r7.Boolean,
|
|
675
|
-
dependencyBlacklist: r7.Array(r7.String),
|
|
676
|
-
enforceForDevDependencies: r7.Boolean
|
|
677
|
-
}).And(
|
|
678
|
-
r7.Partial({
|
|
679
|
-
dependencyWhitelist: r7.Undefined
|
|
680
|
-
})
|
|
681
|
-
),
|
|
682
|
-
r7.Record({
|
|
683
|
-
dependencyWhitelist: r7.Array(r7.String),
|
|
684
|
-
dependencyBlacklist: r7.Array(r7.String),
|
|
685
|
-
enforceForDevDependencies: r7.Boolean
|
|
686
|
-
}).And(
|
|
687
|
-
r7.Partial({
|
|
688
|
-
skipUnparseableRanges: r7.Undefined
|
|
689
|
-
})
|
|
690
|
-
),
|
|
691
|
-
r7.Record({
|
|
692
|
-
skipUnparseableRanges: r7.Boolean,
|
|
693
|
-
dependencyWhitelist: r7.Array(r7.String),
|
|
694
|
-
dependencyBlacklist: r7.Array(r7.String),
|
|
695
|
-
enforceForDevDependencies: r7.Boolean
|
|
696
|
-
})
|
|
697
|
-
);
|
|
698
|
-
var mustSatisfyPeerDependencies = {
|
|
699
|
-
check: checkSatisfyPeerDependencies,
|
|
700
|
-
optionsRuntype: Options7
|
|
701
|
-
};
|
|
702
|
-
var MustSatisfyPeerDependencies = createNewRuleConversion(
|
|
703
|
-
"MustSatisfyPeerDependencies",
|
|
704
|
-
mustSatisfyPeerDependencies
|
|
705
|
-
);
|
|
706
|
-
var MATCH_ANY_VERSION_RANGE = /^(\*|x)$/;
|
|
707
|
-
var MATCH_GREATER_OR_EQUAL_VERSION_RANGE = /^>= ?\d+(?:\.\d+|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?$/;
|
|
708
|
-
var MATCH_MAJOR_VERSION_RANGE = /^(?:\^?\d+|\^?\d+\.x|\^?\d+\.x\.x|\^\d+\.\d+|\^\d+\.\d+\.x|\^\d+\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$/;
|
|
709
|
-
var RANGE_REGEX = /^(\*|x|>= ?\d+(?:\.\d+|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?|\^?\d+(\.x|\.x\.x|\.\d+|\.\d+\.x|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?( \|\| \^?\d+(\.x|\.x\.x|\.\d+|\.\d+\.x|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?)*)$/;
|
|
710
|
-
function checkSatisfyPeerDependencies(context, opts) {
|
|
711
|
-
const { dependencyBlacklist, dependencyWhitelist, enforceForDevDependencies, skipUnparseableRanges } = opts;
|
|
712
|
-
const packageJsonPath = path4.resolve(context.getPackageJsonPath());
|
|
713
|
-
const packageJson = context.host.readJson(packageJsonPath);
|
|
714
|
-
const packageDependencies = packageJson.dependencies || {};
|
|
715
|
-
const packageDevDependencies = packageJson.devDependencies || {};
|
|
716
|
-
const packagePeerDependencies = packageJson.peerDependencies || {};
|
|
717
|
-
const packageName = packageJson.name || packageJsonPath;
|
|
718
|
-
for (const [peerDependencyName, peerDependencyRange] of Object.entries(packagePeerDependencies)) {
|
|
719
|
-
if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {
|
|
720
|
-
continue;
|
|
721
|
-
}
|
|
722
|
-
const dependencyRange = packageDependencies[peerDependencyName];
|
|
723
|
-
if (dependencyRange != null) {
|
|
724
|
-
context.addError({
|
|
725
|
-
file: packageJsonPath,
|
|
726
|
-
message: `[0] Package ${packageName} has overloaded ${peerDependencyName} dependencies.
|
|
727
|
-
Peer dependency '${peerDependencyRange}' and regular dependency '${dependencyRange}'.`
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
const allRequiredPeerDependencies = {};
|
|
732
|
-
const allDependencies = enforceForDevDependencies ? [...Object.keys(packageDependencies), ...Object.keys(packageDevDependencies)] : Object.keys(packageDependencies);
|
|
733
|
-
for (const dependency of allDependencies) {
|
|
734
|
-
const dependencyPackageJsonPath = (0, import_resolve_package_path2.default)(dependency, path4.dirname(packageJsonPath));
|
|
735
|
-
if (dependencyPackageJsonPath == null) {
|
|
736
|
-
throw new Error(`Could not resolve ${dependency} from ${path4.dirname(packageJsonPath)}`);
|
|
737
|
-
}
|
|
738
|
-
const dependencyPackageJson = context.host.readJson(dependencyPackageJsonPath);
|
|
739
|
-
const requiredPeerDependencies = dependencyPackageJson.peerDependencies;
|
|
740
|
-
if (requiredPeerDependencies == null) {
|
|
741
|
-
continue;
|
|
742
|
-
}
|
|
743
|
-
for (const [peerDependencyName, range] of Object.entries(requiredPeerDependencies)) {
|
|
744
|
-
if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {
|
|
745
|
-
continue;
|
|
746
|
-
}
|
|
747
|
-
if (!isValidRange(range)) {
|
|
748
|
-
const message = `Unable to parse ${dependencyPackageJson.name}'s ${peerDependencyName} peer dependency range '${range}'.`;
|
|
749
|
-
if (skipUnparseableRanges) {
|
|
750
|
-
context.addWarning({ file: dependencyPackageJsonPath, message });
|
|
751
|
-
continue;
|
|
752
|
-
}
|
|
753
|
-
throw new Error(message);
|
|
754
|
-
}
|
|
755
|
-
if (allRequiredPeerDependencies[peerDependencyName] == null) {
|
|
756
|
-
allRequiredPeerDependencies[peerDependencyName] = [];
|
|
757
|
-
}
|
|
758
|
-
allRequiredPeerDependencies[peerDependencyName].push({ fromPackageName: dependencyPackageJson.name, range });
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
for (const [peerDependencyName, peerDependencyRequirements] of Object.entries(allRequiredPeerDependencies)) {
|
|
762
|
-
let mostStrictPeerRequirement = {
|
|
763
|
-
fromPeerDependencyRequirements: [peerDependencyRequirements[0]],
|
|
764
|
-
range: peerDependencyRequirements[0].range
|
|
765
|
-
};
|
|
766
|
-
for (const peerRequirement of peerDependencyRequirements) {
|
|
767
|
-
if (doesASatisfyB(mostStrictPeerRequirement.range, peerRequirement.range)) {
|
|
768
|
-
continue;
|
|
769
|
-
} else if (doesASatisfyB(peerRequirement.range, mostStrictPeerRequirement.range)) {
|
|
770
|
-
mostStrictPeerRequirement = {
|
|
771
|
-
fromPeerDependencyRequirements: [peerRequirement],
|
|
772
|
-
range: peerRequirement.range
|
|
773
|
-
};
|
|
774
|
-
} else {
|
|
775
|
-
const maybeIntersection = findIntersection(peerRequirement.range, mostStrictPeerRequirement.range);
|
|
776
|
-
if (maybeIntersection !== void 0) {
|
|
777
|
-
mostStrictPeerRequirement = {
|
|
778
|
-
fromPeerDependencyRequirements: [
|
|
779
|
-
...mostStrictPeerRequirement.fromPeerDependencyRequirements,
|
|
780
|
-
peerRequirement
|
|
781
|
-
],
|
|
782
|
-
range: maybeIntersection
|
|
783
|
-
};
|
|
784
|
-
} else {
|
|
785
|
-
context.addError({
|
|
786
|
-
file: packageJsonPath,
|
|
787
|
-
message: `[1] Package ${packageName} has conflicting inherited ${peerDependencyName} peer dependencies.
|
|
788
|
-
Dependency ${peerRequirement.fromPackageName} requires '${peerRequirement.range}' but
|
|
789
|
-
` + getMostStrictStatement(mostStrictPeerRequirement)
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
const packageDependencyRange = packageDependencies[peerDependencyName];
|
|
795
|
-
if (packageDependencyRange != null) {
|
|
796
|
-
if (!isValidRange(packageDependencyRange)) {
|
|
797
|
-
const message = `Unable to parse ${packageName}'s ${peerDependencyName} dependency range '${packageDependencyRange}'.`;
|
|
798
|
-
if (skipUnparseableRanges) {
|
|
799
|
-
context.addWarning({ file: packageJsonPath, message });
|
|
800
|
-
} else {
|
|
801
|
-
throw new Error(message);
|
|
802
|
-
}
|
|
803
|
-
} else if (!doesASatisfyB(packageDependencyRange, mostStrictPeerRequirement.range)) {
|
|
804
|
-
context.addError({
|
|
805
|
-
file: packageJsonPath,
|
|
806
|
-
message: `[2] Package ${packageName} dependency on ${peerDependencyName} '${packageDependencyRange}' does not satisfy inherited peer dependencies.
|
|
807
|
-
` + getMostStrictStatement(mostStrictPeerRequirement)
|
|
808
|
-
});
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
const packagePeerDependencyRange = packagePeerDependencies[peerDependencyName];
|
|
812
|
-
if (packageDependencyRange == null && packagePeerDependencyRange == null) {
|
|
813
|
-
context.addError({
|
|
814
|
-
file: packageJsonPath,
|
|
815
|
-
message: `[3] Package ${packageName} is missing required ${peerDependencyName} dependency.
|
|
816
|
-
` + getMostStrictStatement(mostStrictPeerRequirement),
|
|
817
|
-
fixer: getAddDependencyTypeFixer({
|
|
818
|
-
packageJsonPath,
|
|
819
|
-
dependencyType: "peerDependencies",
|
|
820
|
-
dependencyName: peerDependencyName,
|
|
821
|
-
version: mostStrictPeerRequirement.range,
|
|
822
|
-
host: context.host
|
|
823
|
-
})
|
|
824
|
-
});
|
|
825
|
-
}
|
|
826
|
-
if (packagePeerDependencyRange != null) {
|
|
827
|
-
if (!isValidRange(packagePeerDependencyRange)) {
|
|
828
|
-
const message = `Unable to parse ${packageName}'s ${peerDependencyName} peer dependency range '${packagePeerDependencyRange}'.`;
|
|
829
|
-
if (skipUnparseableRanges) {
|
|
830
|
-
context.addWarning({ file: packageJsonPath, message });
|
|
831
|
-
} else {
|
|
832
|
-
throw new Error(message);
|
|
833
|
-
}
|
|
834
|
-
} else if (!doesASatisfyB(packagePeerDependencyRange, mostStrictPeerRequirement.range)) {
|
|
835
|
-
context.addError({
|
|
836
|
-
file: packageJsonPath,
|
|
837
|
-
message: `[4] Package ${packageName} peer dependency on ${peerDependencyName} '${packagePeerDependencyRange}' is not strict enough.
|
|
838
|
-
` + getMostStrictStatement(mostStrictPeerRequirement),
|
|
839
|
-
fixer: getAddDependencyTypeFixer({
|
|
840
|
-
packageJsonPath,
|
|
841
|
-
dependencyType: "peerDependencies",
|
|
842
|
-
dependencyName: peerDependencyName,
|
|
843
|
-
version: mostStrictPeerRequirement.range,
|
|
844
|
-
host: context.host
|
|
845
|
-
})
|
|
846
|
-
});
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
}
|
|
851
|
-
function shouldSkipPackage({
|
|
852
|
-
dependencyBlacklist,
|
|
853
|
-
dependencyWhitelist,
|
|
854
|
-
packageName
|
|
855
|
-
}) {
|
|
856
|
-
if (dependencyBlacklist != null && dependencyBlacklist.includes(packageName) || dependencyWhitelist != null && !dependencyWhitelist.includes(packageName)) {
|
|
857
|
-
return true;
|
|
858
|
-
}
|
|
859
|
-
return false;
|
|
860
|
-
}
|
|
861
|
-
function getMostStrictStatement(mostStrictPeerRequirement) {
|
|
862
|
-
if (mostStrictPeerRequirement.fromPeerDependencyRequirements.length === 1) {
|
|
863
|
-
const dependencyName = mostStrictPeerRequirement.fromPeerDependencyRequirements[0].fromPackageName;
|
|
864
|
-
return `Dependency ${dependencyName} requires '${mostStrictPeerRequirement.range}'.`;
|
|
865
|
-
} else {
|
|
866
|
-
const dependencyNames = mostStrictPeerRequirement.fromPeerDependencyRequirements.map((peerDependencyRequirement) => peerDependencyRequirement.fromPackageName).join(", ");
|
|
867
|
-
const dependencyRequirements = mostStrictPeerRequirement.fromPeerDependencyRequirements.map((peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`).join(", ");
|
|
868
|
-
return `Dependencies [${dependencyNames}] require [${dependencyRequirements}] respectively, resolving to '${mostStrictPeerRequirement.range}'.`;
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
function findIntersection(a, b) {
|
|
872
|
-
if (doesASatisfyB(a, b)) {
|
|
873
|
-
return a;
|
|
874
|
-
} else if (doesASatisfyB(b, a)) {
|
|
875
|
-
return b;
|
|
876
|
-
}
|
|
877
|
-
if (isAnyVersionRange(a) || isAnyVersionRange(b)) {
|
|
878
|
-
throw new Error();
|
|
879
|
-
}
|
|
880
|
-
const aVersions = a.includes("||") ? a.split("||").map((s) => s.trim()) : [a];
|
|
881
|
-
const bVersions = b.includes("||") ? b.split("||").map((s) => s.trim()) : [b];
|
|
882
|
-
const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);
|
|
883
|
-
const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);
|
|
884
|
-
if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {
|
|
885
|
-
throw new Error();
|
|
886
|
-
}
|
|
887
|
-
if (aIsGreaterOrEqualVersionRange) {
|
|
888
|
-
const aSemVer = (0, import_semver2.coerce)(a);
|
|
889
|
-
const compatibleBVersions = bVersions.map((bVersion) => {
|
|
890
|
-
const bSemVer = (0, import_semver2.coerce)(bVersion);
|
|
891
|
-
if (bVersion.startsWith("^") && bSemVer.major >= aSemVer.major) {
|
|
892
|
-
return `^${bSemVer.compare(aSemVer) >= 0 ? bSemVer.raw : aSemVer.raw}`;
|
|
893
|
-
}
|
|
894
|
-
return bSemVer.compare(aSemVer) !== -1 ? bVersion : void 0;
|
|
895
|
-
}).filter((bVersion) => bVersion != null);
|
|
896
|
-
if (compatibleBVersions.length === 0) {
|
|
897
|
-
return void 0;
|
|
898
|
-
}
|
|
899
|
-
return compatibleBVersions.join(" || ");
|
|
900
|
-
}
|
|
901
|
-
if (bIsGreaterOrEqualVersionRange) {
|
|
902
|
-
const bSemVer = (0, import_semver2.coerce)(b);
|
|
903
|
-
const compatibleAVersions = aVersions.map((aVersion) => {
|
|
904
|
-
const aSemVer = (0, import_semver2.coerce)(aVersion);
|
|
905
|
-
if (aVersion.startsWith("^") && aSemVer.major >= bSemVer.major) {
|
|
906
|
-
return `^${aSemVer.compare(bSemVer) >= 0 ? aSemVer.raw : bSemVer.raw}`;
|
|
907
|
-
}
|
|
908
|
-
return aSemVer.compare(bSemVer) !== -1 ? aVersion : void 0;
|
|
909
|
-
}).filter((aVersion) => aVersion != null);
|
|
910
|
-
if (compatibleAVersions.length === 0) {
|
|
911
|
-
return void 0;
|
|
912
|
-
}
|
|
913
|
-
return compatibleAVersions.join(" || ");
|
|
914
|
-
}
|
|
915
|
-
const compatibleVersions = aVersions.map((aVersion) => {
|
|
916
|
-
const aSemVer = (0, import_semver2.coerce)(aVersion);
|
|
917
|
-
const majorMatchingBVersion = bVersions.find((m) => (0, import_semver2.coerce)(m).major === aSemVer.major);
|
|
918
|
-
if (majorMatchingBVersion === void 0) {
|
|
919
|
-
return void 0;
|
|
920
|
-
}
|
|
921
|
-
if (doesASatisfyB(aVersion, majorMatchingBVersion)) {
|
|
922
|
-
return aVersion;
|
|
923
|
-
} else if (doesASatisfyB(majorMatchingBVersion, aVersion)) {
|
|
924
|
-
return majorMatchingBVersion;
|
|
925
|
-
} else {
|
|
926
|
-
return void 0;
|
|
927
|
-
}
|
|
928
|
-
}).filter((aVersion) => aVersion !== void 0);
|
|
929
|
-
if (compatibleVersions.length === 0) {
|
|
930
|
-
return void 0;
|
|
931
|
-
}
|
|
932
|
-
return compatibleVersions.join(" || ");
|
|
933
|
-
}
|
|
934
|
-
function doesASatisfyB(a, b) {
|
|
935
|
-
if (a === b) {
|
|
936
|
-
return true;
|
|
937
|
-
}
|
|
938
|
-
const aIsAnyVersionRange = isAnyVersionRange(a);
|
|
939
|
-
const bIsAnyVersionRange = isAnyVersionRange(b);
|
|
940
|
-
if (bIsAnyVersionRange) {
|
|
941
|
-
return true;
|
|
942
|
-
} else if (aIsAnyVersionRange) {
|
|
943
|
-
return false;
|
|
944
|
-
}
|
|
945
|
-
const aVersions = a.includes("||") ? a.split("||").map((s) => s.trim()) : [a];
|
|
946
|
-
const bVersions = b.includes("||") ? b.split("||").map((s) => s.trim()) : [b];
|
|
947
|
-
const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);
|
|
948
|
-
const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);
|
|
949
|
-
if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {
|
|
950
|
-
const aSemVer = (0, import_semver2.coerce)(a);
|
|
951
|
-
const bSemVer = (0, import_semver2.coerce)(b);
|
|
952
|
-
return aSemVer.compare(bSemVer) !== -1;
|
|
953
|
-
} else if (bIsGreaterOrEqualVersionRange) {
|
|
954
|
-
const bSemVer = (0, import_semver2.coerce)(b);
|
|
955
|
-
return aVersions.every((aVersion) => {
|
|
956
|
-
const aSemVer = (0, import_semver2.coerce)(aVersion);
|
|
957
|
-
return aSemVer.compare(bSemVer) !== -1;
|
|
958
|
-
});
|
|
959
|
-
} else if (aIsGreaterOrEqualVersionRange) {
|
|
960
|
-
return false;
|
|
961
|
-
}
|
|
962
|
-
return aVersions.every((aVersion) => {
|
|
963
|
-
const aSemVer = (0, import_semver2.coerce)(aVersion);
|
|
964
|
-
const majorMatchingBVersion = bVersions.find((m) => (0, import_semver2.coerce)(m).major === aSemVer.major);
|
|
965
|
-
if (majorMatchingBVersion === void 0) {
|
|
966
|
-
return false;
|
|
967
|
-
}
|
|
968
|
-
const aVersionIsRange = isMajorVersionRange(aVersion);
|
|
969
|
-
const majorMatchingBSemVer = (0, import_semver2.coerce)(majorMatchingBVersion);
|
|
970
|
-
const majorMatchingBVersionIsRange = isMajorVersionRange(majorMatchingBVersion);
|
|
971
|
-
if (majorMatchingBVersionIsRange) {
|
|
972
|
-
return aSemVer.compare(majorMatchingBSemVer) !== -1;
|
|
973
|
-
} else {
|
|
974
|
-
if (aVersionIsRange) {
|
|
975
|
-
return false;
|
|
976
|
-
} else {
|
|
977
|
-
return aSemVer.compare(majorMatchingBSemVer) === 0;
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
});
|
|
981
|
-
}
|
|
982
|
-
function isAnyVersionRange(version) {
|
|
983
|
-
return MATCH_ANY_VERSION_RANGE.test(version);
|
|
984
|
-
}
|
|
985
|
-
function isGreaterOrEqualVersionRange(version) {
|
|
986
|
-
return MATCH_GREATER_OR_EQUAL_VERSION_RANGE.test(version);
|
|
987
|
-
}
|
|
988
|
-
function isMajorVersionRange(version) {
|
|
989
|
-
return MATCH_MAJOR_VERSION_RANGE.test(version);
|
|
990
|
-
}
|
|
991
|
-
function isValidRange(version) {
|
|
992
|
-
return RANGE_REGEX.test(version);
|
|
993
|
-
}
|
|
994
|
-
function getAddDependencyTypeFixer({
|
|
995
|
-
packageJsonPath,
|
|
996
|
-
dependencyType,
|
|
997
|
-
dependencyName,
|
|
998
|
-
version,
|
|
999
|
-
host
|
|
1000
|
-
}) {
|
|
1001
|
-
return () => {
|
|
1002
|
-
(0, import_utils4.mutateJson)(packageJsonPath, host, (packageJson) => {
|
|
1003
|
-
if (packageJson[dependencyType] == null) {
|
|
1004
|
-
packageJson[dependencyType] = {};
|
|
1005
|
-
}
|
|
1006
|
-
packageJson[dependencyType][dependencyName] = version;
|
|
1007
|
-
return packageJson;
|
|
1008
|
-
});
|
|
1009
|
-
};
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
// src/packageOrder.ts
|
|
1013
|
-
var import_jest_diff4 = require("jest-diff");
|
|
1014
|
-
var r8 = __toESM(require("runtypes"), 1);
|
|
1015
|
-
var Options8 = r8.Record({
|
|
1016
|
-
order: r8.Union(r8.Array(r8.String), r8.Function)
|
|
1017
|
-
}).Or(r8.Undefined);
|
|
1018
|
-
var defaultKeyOrder = [
|
|
1019
|
-
"name",
|
|
1020
|
-
"version",
|
|
1021
|
-
"description",
|
|
1022
|
-
"author",
|
|
1023
|
-
"contributors",
|
|
1024
|
-
"url",
|
|
1025
|
-
"license",
|
|
1026
|
-
"type",
|
|
1027
|
-
"exports",
|
|
1028
|
-
"private",
|
|
1029
|
-
"engines",
|
|
1030
|
-
"bin",
|
|
1031
|
-
"types",
|
|
1032
|
-
"main",
|
|
1033
|
-
"module",
|
|
1034
|
-
"typings",
|
|
1035
|
-
"style",
|
|
1036
|
-
"sideEffects",
|
|
1037
|
-
"workspaces",
|
|
1038
|
-
"husky",
|
|
1039
|
-
"lint-staged",
|
|
1040
|
-
"files",
|
|
1041
|
-
"scripts",
|
|
1042
|
-
"resolutions",
|
|
1043
|
-
"dependencies",
|
|
1044
|
-
"peerDependencies",
|
|
1045
|
-
"devDependencies",
|
|
1046
|
-
"optionalDependencies",
|
|
1047
|
-
"publishConfig"
|
|
1048
|
-
];
|
|
1049
|
-
var packageOrder = {
|
|
1050
|
-
check: function expectPackageOrder(context, opts) {
|
|
1051
|
-
const packageJson = context.getPackageJson();
|
|
1052
|
-
const packagePath = context.getPackageJsonPath();
|
|
1053
|
-
const order = opts === void 0 ? defaultKeyOrder : opts.order;
|
|
1054
|
-
const comparator = isOrderFunction(order) ? order(context) : createComparator(order);
|
|
1055
|
-
const actualOrder = Object.keys(packageJson);
|
|
1056
|
-
const expectedOrder = actualOrder.slice().sort(comparator);
|
|
1057
|
-
if (!arrayOrderCompare2(actualOrder, expectedOrder)) {
|
|
1058
|
-
context.addError({
|
|
1059
|
-
file: packagePath,
|
|
1060
|
-
message: "Incorrect order of fields in package.json",
|
|
1061
|
-
longMessage: (0, import_jest_diff4.diff)(expectedOrder, actualOrder, { expand: true }),
|
|
1062
|
-
fixer: () => {
|
|
1063
|
-
const expectedPackageJson = {};
|
|
1064
|
-
expectedOrder.forEach((key) => {
|
|
1065
|
-
expectedPackageJson[key] = packageJson[key];
|
|
1066
|
-
});
|
|
1067
|
-
context.host.writeJson(packagePath, expectedPackageJson);
|
|
1068
|
-
}
|
|
1069
|
-
});
|
|
1070
|
-
}
|
|
1071
|
-
},
|
|
1072
|
-
optionsRuntype: Options8
|
|
1073
|
-
};
|
|
1074
|
-
var PackageOrder = createNewRuleConversion("PackageOrder", packageOrder);
|
|
1075
|
-
function arrayOrderCompare2(a, b) {
|
|
1076
|
-
for (let index = 0; index < a.length; index++) {
|
|
1077
|
-
if (a[index] !== b[index]) {
|
|
1078
|
-
return false;
|
|
1079
|
-
}
|
|
1080
|
-
}
|
|
1081
|
-
return true;
|
|
1082
|
-
}
|
|
1083
|
-
function createComparator(order) {
|
|
1084
|
-
return (a, b) => {
|
|
1085
|
-
const aIndex = order.indexOf(a);
|
|
1086
|
-
const bIndex = order.indexOf(b);
|
|
1087
|
-
if (aIndex >= 0 && bIndex < 0) {
|
|
1088
|
-
return -1;
|
|
1089
|
-
} else if (aIndex < 0 && bIndex >= 0) {
|
|
1090
|
-
return 1;
|
|
1091
|
-
}
|
|
1092
|
-
const compared = aIndex - bIndex;
|
|
1093
|
-
if (compared !== 0) {
|
|
1094
|
-
return compared;
|
|
1095
|
-
} else {
|
|
1096
|
-
return a.localeCompare(b);
|
|
1097
|
-
}
|
|
1098
|
-
};
|
|
1099
|
-
}
|
|
1100
|
-
function isOrderFunction(order) {
|
|
1101
|
-
return !Array.isArray(order);
|
|
1102
|
-
}
|
|
1103
|
-
|
|
1104
|
-
// src/packageEntry.ts
|
|
1105
|
-
var import_utils5 = require("@monorepolint/utils");
|
|
1106
|
-
var import_jest_diff5 = require("jest-diff");
|
|
1107
|
-
var r9 = __toESM(require("runtypes"), 1);
|
|
1108
|
-
var Options9 = r9.Union(
|
|
1109
|
-
r9.Record({
|
|
1110
|
-
entries: r9.Dictionary(r9.Unknown)
|
|
1111
|
-
}).And(
|
|
1112
|
-
r9.Partial({
|
|
1113
|
-
entriesExist: r9.Undefined
|
|
1114
|
-
})
|
|
1115
|
-
),
|
|
1116
|
-
r9.Record({
|
|
1117
|
-
entriesExist: r9.Array(r9.String)
|
|
1118
|
-
}).And(
|
|
1119
|
-
r9.Partial({
|
|
1120
|
-
entries: r9.Undefined
|
|
1121
|
-
})
|
|
1122
|
-
),
|
|
1123
|
-
r9.Record({
|
|
1124
|
-
entries: r9.Dictionary(r9.Unknown),
|
|
1125
|
-
entriesExist: r9.Array(r9.String)
|
|
1126
|
-
})
|
|
1127
|
-
);
|
|
1128
|
-
var packageEntry = {
|
|
1129
|
-
check: function expectPackageEntry(context, options) {
|
|
1130
|
-
const packageJson = context.getPackageJson();
|
|
1131
|
-
if (options.entries) {
|
|
1132
|
-
for (const key of Object.keys(options.entries)) {
|
|
1133
|
-
const value = options.entries[key];
|
|
1134
|
-
const entryDiff = (0, import_jest_diff5.diff)(JSON.stringify(value) + "\n", (JSON.stringify(packageJson[key]) || "") + "\n");
|
|
1135
|
-
if (typeof value !== "object" && value !== packageJson[key] || entryDiff == null || !entryDiff.includes("Compared values have no visual difference")) {
|
|
1136
|
-
context.addError({
|
|
1137
|
-
file: context.getPackageJsonPath(),
|
|
1138
|
-
message: createStandardizedEntryErrorMessage(key),
|
|
1139
|
-
longMessage: entryDiff,
|
|
1140
|
-
fixer: () => {
|
|
1141
|
-
(0, import_utils5.mutateJson)(context.getPackageJsonPath(), context.host, (input) => {
|
|
1142
|
-
input[key] = value;
|
|
1143
|
-
return input;
|
|
1144
|
-
});
|
|
1145
|
-
}
|
|
1146
|
-
});
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
if (options.entriesExist) {
|
|
1151
|
-
for (const key of options.entriesExist) {
|
|
1152
|
-
if (packageJson[key] === void 0) {
|
|
1153
|
-
context.addError({
|
|
1154
|
-
file: context.getPackageJsonPath(),
|
|
1155
|
-
message: createExpectedEntryErrorMessage(key)
|
|
1156
|
-
});
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
},
|
|
1161
|
-
optionsRuntype: Options9
|
|
1162
|
-
};
|
|
1163
|
-
var PackageEntry = createNewRuleConversion("PackageEntry", packageEntry);
|
|
1164
|
-
function createStandardizedEntryErrorMessage(key) {
|
|
1165
|
-
return `Expected standardized entry for '${key}'`;
|
|
1166
|
-
}
|
|
1167
|
-
function createExpectedEntryErrorMessage(key) {
|
|
1168
|
-
return `Expected entry for '${key}' to exist`;
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
// src/packageScript.ts
|
|
1172
|
-
var import_utils6 = require("@monorepolint/utils");
|
|
1173
|
-
var import_jest_diff6 = require("jest-diff");
|
|
1174
|
-
var r10 = __toESM(require("runtypes"), 1);
|
|
1175
|
-
var Options10 = r10.Record({
|
|
1176
|
-
scripts: r10.Dictionary(
|
|
1177
|
-
r10.Union(
|
|
1178
|
-
r10.String,
|
|
1179
|
-
r10.Record({
|
|
1180
|
-
options: r10.Array(r10.String.Or(r10.Undefined)),
|
|
1181
|
-
fixValue: r10.Union(r10.String, r10.Undefined, r10.Literal(false)).optional()
|
|
1182
|
-
})
|
|
1183
|
-
)
|
|
1184
|
-
)
|
|
1185
|
-
});
|
|
1186
|
-
var MSG_NO_SCRIPTS_BLOCK = "No scripts block in package.json";
|
|
1187
|
-
var packageScript = {
|
|
1188
|
-
check: function expectPackageScript(context, options) {
|
|
1189
|
-
const packageJson = context.getPackageJson();
|
|
1190
|
-
if (packageJson.scripts === void 0) {
|
|
1191
|
-
context.addError({
|
|
1192
|
-
file: context.getPackageJsonPath(),
|
|
1193
|
-
message: MSG_NO_SCRIPTS_BLOCK,
|
|
1194
|
-
fixer: () => {
|
|
1195
|
-
(0, import_utils6.mutateJson)(context.getPackageJsonPath(), context.host, (input) => {
|
|
1196
|
-
input.scripts = {};
|
|
1197
|
-
return input;
|
|
1198
|
-
});
|
|
1199
|
-
}
|
|
1200
|
-
});
|
|
1201
|
-
return;
|
|
1202
|
-
}
|
|
1203
|
-
for (const [name, value] of Object.entries(options.scripts)) {
|
|
1204
|
-
const allowedValues = /* @__PURE__ */ new Set();
|
|
1205
|
-
let fixValue;
|
|
1206
|
-
let allowEmpty = false;
|
|
1207
|
-
let fixToEmpty = false;
|
|
1208
|
-
if (typeof value === "string") {
|
|
1209
|
-
allowedValues.add(value);
|
|
1210
|
-
fixValue = value;
|
|
1211
|
-
} else {
|
|
1212
|
-
for (const q of value.options) {
|
|
1213
|
-
if (q === void 0) {
|
|
1214
|
-
allowEmpty = true;
|
|
1215
|
-
}
|
|
1216
|
-
allowedValues.add(q);
|
|
1217
|
-
}
|
|
1218
|
-
fixToEmpty = Object.prototype.hasOwnProperty.call(value, "fixValue") && value.fixValue === void 0;
|
|
1219
|
-
fixValue = value.fixValue;
|
|
1220
|
-
}
|
|
1221
|
-
const actualValue = packageJson.scripts[name];
|
|
1222
|
-
if (!allowedValues.has(actualValue) && !(allowEmpty === true && actualValue === void 0)) {
|
|
1223
|
-
let fixer;
|
|
1224
|
-
if (fixValue !== false && (fixValue !== void 0 || fixToEmpty === true)) {
|
|
1225
|
-
const q = fixValue;
|
|
1226
|
-
fixer = () => {
|
|
1227
|
-
(0, import_utils6.mutateJson)(context.getPackageJsonPath(), context.host, (input) => {
|
|
1228
|
-
if (fixToEmpty && q === void 0) {
|
|
1229
|
-
delete input.scripts[name];
|
|
1230
|
-
} else {
|
|
1231
|
-
input.scripts[name] = q;
|
|
1232
|
-
}
|
|
1233
|
-
return input;
|
|
1234
|
-
});
|
|
1235
|
-
};
|
|
1236
|
-
}
|
|
1237
|
-
const validOptionsString = Array.from(allowedValues.values()).map((a) => a === void 0 ? "(empty)" : `'${a}'`).join(", ");
|
|
1238
|
-
context.addError({
|
|
1239
|
-
file: context.getPackageJsonPath(),
|
|
1240
|
-
message: `Expected standardized script entry for '${name}'. Valid options: ${validOptionsString}`,
|
|
1241
|
-
longMessage: (0, import_jest_diff6.diff)(validOptionsString + "\n", (packageJson.scripts[name] || "") + "\n"),
|
|
1242
|
-
fixer
|
|
1243
|
-
});
|
|
1244
|
-
}
|
|
1245
|
-
}
|
|
1246
|
-
},
|
|
1247
|
-
optionsRuntype: Options10
|
|
1248
|
-
};
|
|
1249
|
-
var PackageScript = createNewRuleConversion("PackageScript", packageScript);
|
|
1250
|
-
|
|
1251
|
-
// src/standardTsconfig.ts
|
|
1252
|
-
var import_utils7 = require("@monorepolint/utils");
|
|
1253
|
-
var import_jest_diff7 = require("jest-diff");
|
|
1254
|
-
var path5 = __toESM(require("path"), 1);
|
|
1255
|
-
var r11 = __toESM(require("runtypes"), 1);
|
|
1256
|
-
var DEFAULT_TSCONFIG_FILENAME = "tsconfig.json";
|
|
1257
|
-
var Options11 = r11.Partial({
|
|
1258
|
-
file: r11.String,
|
|
1259
|
-
generator: r11.Function,
|
|
1260
|
-
tsconfigReferenceFile: r11.String,
|
|
1261
|
-
template: r11.Record({}).Or(r11.String),
|
|
1262
|
-
templateFile: r11.String,
|
|
1263
|
-
excludedReferences: r11.Array(r11.String).Or(r11.Undefined),
|
|
1264
|
-
additionalReferences: r11.Array(r11.String).Or(r11.Undefined)
|
|
1265
|
-
}).withConstraint(({ generator, template, templateFile }) => {
|
|
1266
|
-
let count = 0;
|
|
1267
|
-
if (generator) {
|
|
1268
|
-
count++;
|
|
1269
|
-
}
|
|
1270
|
-
if (template) {
|
|
1271
|
-
count++;
|
|
1272
|
-
}
|
|
1273
|
-
if (templateFile) {
|
|
1274
|
-
count++;
|
|
1275
|
-
}
|
|
1276
|
-
return count === 1 || "Expect one of { generator, template, templateFile }";
|
|
1277
|
-
});
|
|
1278
|
-
var standardTsconfig = {
|
|
1279
|
-
check: async function expectStandardTsconfig(context, opts) {
|
|
1280
|
-
const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;
|
|
1281
|
-
const fullPath = path5.resolve(context.packageDir, tsconfigFileName);
|
|
1282
|
-
const generator = getGenerator(context, opts);
|
|
1283
|
-
const expectedContent = await generator(context);
|
|
1284
|
-
const actualContent = context.host.exists(fullPath) ? context.host.readFile(fullPath, { encoding: "utf-8" }) : void 0;
|
|
1285
|
-
if (expectedContent === void 0) {
|
|
1286
|
-
context.addWarning({
|
|
1287
|
-
file: fullPath,
|
|
1288
|
-
message: "Excluding from expect-standard-tsconfig"
|
|
1289
|
-
});
|
|
1290
|
-
return;
|
|
1291
|
-
}
|
|
1292
|
-
if (actualContent !== expectedContent) {
|
|
1293
|
-
context.addError({
|
|
1294
|
-
file: fullPath,
|
|
1295
|
-
message: "Expect file contents to match",
|
|
1296
|
-
longMessage: (0, import_jest_diff7.diff)(expectedContent, actualContent, { expand: true }),
|
|
1297
|
-
fixer: () => {
|
|
1298
|
-
context.host.writeFile(fullPath, expectedContent, {
|
|
1299
|
-
encoding: "utf-8"
|
|
1300
|
-
});
|
|
1301
|
-
}
|
|
1302
|
-
});
|
|
1303
|
-
}
|
|
1304
|
-
},
|
|
1305
|
-
optionsRuntype: Options11
|
|
1306
|
-
};
|
|
1307
|
-
var StandardTsConfig = createNewRuleConversion("StandardTsconfig", standardTsconfig);
|
|
1308
|
-
function getGenerator(context, opts) {
|
|
1309
|
-
if (opts.generator) {
|
|
1310
|
-
return opts.generator;
|
|
1311
|
-
} else if (opts.templateFile) {
|
|
1312
|
-
const { packageDir: workspacePackageDir } = context.getWorkspaceContext();
|
|
1313
|
-
const fullPath = path5.resolve(workspacePackageDir, opts.templateFile);
|
|
1314
|
-
const template = JSON.parse(context.host.readFile(fullPath, { encoding: "utf-8" }));
|
|
1315
|
-
return makeGenerator(template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);
|
|
1316
|
-
} else if (opts.template) {
|
|
1317
|
-
return makeGenerator(opts.template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);
|
|
1318
|
-
} else {
|
|
1319
|
-
throw new Error("Unable to make generator");
|
|
1320
|
-
}
|
|
1321
|
-
}
|
|
1322
|
-
function makeGenerator(template, excludedReferences, additionalReferences, tsconfigReferenceFile) {
|
|
1323
|
-
return async function generator(context) {
|
|
1324
|
-
template = {
|
|
1325
|
-
...template,
|
|
1326
|
-
references: []
|
|
1327
|
-
};
|
|
1328
|
-
const nameToDirectory = await context.getWorkspaceContext().getPackageNameToDir();
|
|
1329
|
-
const packageJson = context.getPackageJson();
|
|
1330
|
-
const deps = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {})];
|
|
1331
|
-
for (const dep of deps) {
|
|
1332
|
-
const packageDir = nameToDirectory.get(dep);
|
|
1333
|
-
if (packageDir !== void 0 && (excludedReferences === void 0 || (0, import_utils7.matchesAnyGlob)(dep, excludedReferences))) {
|
|
1334
|
-
const absoluteReferencePath = tsconfigReferenceFile !== void 0 ? path5.join(packageDir, tsconfigReferenceFile) : packageDir;
|
|
1335
|
-
template.references.push({
|
|
1336
|
-
path: path5.relative(context.packageDir, absoluteReferencePath)
|
|
1337
|
-
});
|
|
1338
|
-
}
|
|
1339
|
-
}
|
|
1340
|
-
if (additionalReferences) {
|
|
1341
|
-
for (const additionalReference of additionalReferences) {
|
|
1342
|
-
template.references.push({
|
|
1343
|
-
path: additionalReference
|
|
1344
|
-
});
|
|
1345
|
-
}
|
|
1346
|
-
}
|
|
1347
|
-
return JSON.stringify(template, void 0, 2) + "\n";
|
|
1348
|
-
};
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
|
-
// src/nestedWorkspaces.ts
|
|
1352
|
-
var globby = __toESM(require("globby"), 1);
|
|
1353
|
-
var path6 = __toESM(require("path"), 1);
|
|
1354
|
-
var r12 = __toESM(require("runtypes"), 1);
|
|
1355
|
-
var Options12 = r12.Undefined;
|
|
1356
|
-
var nestedWorkspaces = {
|
|
1357
|
-
check: (context) => {
|
|
1358
|
-
const rootPackageJson = context.getWorkspaceContext().getPackageJson();
|
|
1359
|
-
const packageJsonPaths = globby.globbySync(["*/**/package.json", "!**/node_modules/**"]);
|
|
1360
|
-
const workspaces = Array.isArray(rootPackageJson.workspaces) ? rootPackageJson.workspaces : rootPackageJson.workspaces !== void 0 ? rootPackageJson.workspaces.packages : void 0;
|
|
1361
|
-
if (workspaces === void 0 && packageJsonPaths.length > 0) {
|
|
1362
|
-
context.addError({
|
|
1363
|
-
file: context.getPackageJsonPath(),
|
|
1364
|
-
message: 'The "workspace" field is missing, even though there are workspaces in the repository.'
|
|
1365
|
-
});
|
|
1366
|
-
return;
|
|
1367
|
-
}
|
|
1368
|
-
const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);
|
|
1369
|
-
const expandedWorkspacesGlobs = globby.globbySync([...workspacePackageJsons, "!**/node_modules/**"]);
|
|
1370
|
-
const difference = packageJsonPaths.filter((packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath));
|
|
1371
|
-
if (difference.length !== 0) {
|
|
1372
|
-
const differencesList = difference.map((packageJsonPath) => path6.dirname(packageJsonPath)).join(", ");
|
|
1373
|
-
context.addError({
|
|
1374
|
-
file: context.getPackageJsonPath(),
|
|
1375
|
-
message: `The "workspace" field is missing one or more values: ${differencesList}. You may be able to use a glob to avoid listing each workspace individually, e.g. "packages/nested-workspace/*".`
|
|
1376
|
-
});
|
|
1377
|
-
}
|
|
1378
|
-
},
|
|
1379
|
-
optionsRuntype: Options12
|
|
1380
|
-
};
|
|
1381
|
-
var NestedWorkspaces = createNewRuleConversion("NestedWorkspaces", nestedWorkspaces);
|
|
1382
|
-
|
|
1383
|
-
// src/requireDependency.ts
|
|
1384
|
-
var import_utils8 = require("@monorepolint/utils");
|
|
1385
|
-
var import_jest_diff8 = require("jest-diff");
|
|
1386
|
-
var r13 = __toESM(require("runtypes"), 1);
|
|
1387
|
-
var Options13 = r13.Partial({
|
|
1388
|
-
dependencies: r13.Dictionary(r13.String),
|
|
1389
|
-
devDependencies: r13.Dictionary(r13.String),
|
|
1390
|
-
peerDependencies: r13.Dictionary(r13.String),
|
|
1391
|
-
optionalDependencies: r13.Dictionary(r13.String)
|
|
1392
|
-
});
|
|
1393
|
-
var requireDependency = {
|
|
1394
|
-
check: function expectPackageEntry2(context, options) {
|
|
1395
|
-
const packageJson = context.getPackageJson();
|
|
1396
|
-
const packageJsonPath = context.getPackageJsonPath();
|
|
1397
|
-
[
|
|
1398
|
-
"dependencies",
|
|
1399
|
-
"devDependencies",
|
|
1400
|
-
"peerDependencies",
|
|
1401
|
-
"optionalDependencies"
|
|
1402
|
-
].forEach((type) => {
|
|
1403
|
-
if (!options[type]) {
|
|
1404
|
-
return;
|
|
1405
|
-
}
|
|
1406
|
-
if (packageJson[type] === void 0) {
|
|
1407
|
-
context.addError({
|
|
1408
|
-
file: packageJsonPath,
|
|
1409
|
-
message: `No ${type} block, cannot add required ${type}.`,
|
|
1410
|
-
fixer: () => {
|
|
1411
|
-
(0, import_utils8.mutateJson)(packageJsonPath, context.host, (input) => {
|
|
1412
|
-
input[type] = options[type];
|
|
1413
|
-
return input;
|
|
1414
|
-
});
|
|
1415
|
-
}
|
|
1416
|
-
});
|
|
1417
|
-
return;
|
|
1418
|
-
}
|
|
1419
|
-
for (const [dep, version] of Object.entries(options[type])) {
|
|
1420
|
-
if (packageJson[type][dep] !== version) {
|
|
1421
|
-
context.addError({
|
|
1422
|
-
file: packageJsonPath,
|
|
1423
|
-
message: `Expected dependency ${dep}@${version}`,
|
|
1424
|
-
longMessage: (0, import_jest_diff8.diff)(`${dep}@${version}
|
|
1425
|
-
`, `${dep}@${packageJson[type][dep] || "missing"}
|
|
1426
|
-
`),
|
|
1427
|
-
fixer: () => {
|
|
1428
|
-
(0, import_utils8.mutateJson)(packageJsonPath, context.host, (input) => {
|
|
1429
|
-
input[type] = { ...input[type], [dep]: version };
|
|
1430
|
-
return input;
|
|
1431
|
-
});
|
|
1432
|
-
}
|
|
1433
|
-
});
|
|
1434
|
-
}
|
|
1435
|
-
}
|
|
1436
|
-
});
|
|
1437
|
-
},
|
|
1438
|
-
optionsRuntype: Options13
|
|
1439
|
-
};
|
|
1440
|
-
var RequireDependency = createNewRuleConversion("RequireDependency", requireDependency);
|
|
1441
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
1442
|
-
0 && (module.exports = {
|
|
1443
|
-
AlphabeticalDependencies,
|
|
1444
|
-
AlphabeticalScripts,
|
|
1445
|
-
BannedDependencies,
|
|
1446
|
-
ConsistentDependencies,
|
|
1447
|
-
ConsistentVersions,
|
|
1448
|
-
FileContents,
|
|
1449
|
-
MustSatisfyPeerDependencies,
|
|
1450
|
-
NestedWorkspaces,
|
|
1451
|
-
PackageEntry,
|
|
1452
|
-
PackageOrder,
|
|
1453
|
-
PackageScript,
|
|
1454
|
-
RequireDependency,
|
|
1455
|
-
StandardTsConfig,
|
|
1456
|
-
alphabeticalDependencies,
|
|
1457
|
-
alphabeticalScripts,
|
|
1458
|
-
bannedDependencies,
|
|
1459
|
-
consistentDependencies,
|
|
1460
|
-
consistentVersions,
|
|
1461
|
-
fileContents,
|
|
1462
|
-
mustSatisfyPeerDependencies,
|
|
1463
|
-
nestedWorkspaces,
|
|
1464
|
-
packageEntry,
|
|
1465
|
-
packageOrder,
|
|
1466
|
-
packageScript,
|
|
1467
|
-
requireDependency,
|
|
1468
|
-
standardTsconfig
|
|
1469
|
-
});
|
|
1470
|
-
/*!
|
|
1471
|
-
* Copyright 2019 Palantir Technologies, Inc.
|
|
1472
|
-
*
|
|
1473
|
-
* Licensed under the MIT license. See LICENSE file in the project root for details.
|
|
1474
|
-
*
|
|
1475
|
-
*/
|
|
1476
|
-
/*!
|
|
1477
|
-
* Copyright 2020 Palantir Technologies, Inc.
|
|
1478
|
-
*
|
|
1479
|
-
* Licensed under the MIT license. See LICENSE file in the project root for details.
|
|
1480
|
-
*
|
|
1481
|
-
*/
|
|
1482
|
-
/*!
|
|
1483
|
-
* Copyright 2022 Palantir Technologies, Inc.
|
|
1484
|
-
*
|
|
1485
|
-
* Licensed under the MIT license. See LICENSE file in the project root for details.
|
|
1486
|
-
*
|
|
1487
|
-
*/
|
|
1488
|
-
/**
|
|
1489
|
-
* @license Copyright 2019 Palantir Technologies, Inc. All rights reserved.
|
|
1490
|
-
*/
|
|
1491
|
-
//# sourceMappingURL=index.cjs.map
|