@monorepolint/rules 0.6.0-alpha.2 → 0.6.0-alpha.3
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-clean.log +1 -1
- package/.turbo/turbo-compile-typescript.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +160 -100
- package/.turbo/turbo-transpile-typescript.log +4 -4
- package/CHANGELOG.md +9 -0
- package/build/js/index.js +399 -246
- package/build/js/index.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/__tests__/utils.d.ts +0 -1
- package/build/types/__tests__/utils.d.ts.map +1 -1
- package/build/types/bannedDependencies.d.ts.map +1 -1
- package/build/types/fileContents.d.ts.map +1 -1
- package/build/types/index.d.ts +3 -3
- package/build/types/index.d.ts.map +1 -1
- package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -1
- package/build/types/nestedWorkspaces.d.ts.map +1 -1
- package/build/types/packageEntry.d.ts.map +1 -1
- package/build/types/packageOrder.d.ts.map +1 -1
- package/build/types/packageScript.d.ts.map +1 -1
- package/build/types/requireDependency.d.ts +12 -12
- package/build/types/requireDependency.d.ts.map +1 -1
- package/build/types/util/checkAlpha.d.ts.map +1 -1
- package/build/types/util/createRuleFactory.d.ts.map +1 -1
- package/build/types/util/packageDependencyGraphService.d.ts.map +1 -1
- package/coverage/clover.xml +1159 -818
- package/coverage/coverage-final.json +18 -18
- package/coverage/index.html +20 -20
- package/coverage/src/alphabeticalDependencies.ts.html +8 -8
- package/coverage/src/alphabeticalScripts.ts.html +5 -5
- package/coverage/src/bannedDependencies.ts.html +77 -26
- package/coverage/src/consistentDependencies.ts.html +58 -19
- package/coverage/src/consistentVersions.ts.html +169 -58
- package/coverage/src/fileContents.ts.html +47 -23
- package/coverage/src/index.html +67 -67
- package/coverage/src/index.ts.html +32 -32
- package/coverage/src/mustSatisfyPeerDependencies.ts.html +373 -85
- package/coverage/src/nestedWorkspaces.ts.html +59 -20
- package/coverage/src/packageEntry.ts.html +40 -19
- package/coverage/src/packageOrder.ts.html +30 -12
- package/coverage/src/packageScript.ts.html +81 -27
- package/coverage/src/requireDependency.ts.html +83 -32
- package/coverage/src/standardTsconfig.ts.html +81 -18
- package/coverage/src/util/checkAlpha.ts.html +18 -9
- package/coverage/src/util/createRuleFactory.ts.html +16 -4
- package/coverage/src/util/index.html +17 -17
- package/coverage/src/util/makeDirectory.ts.html +5 -5
- package/coverage/src/util/packageDependencyGraphService.ts.html +101 -20
- package/package.json +4 -5
- package/src/__tests__/alphabeticalScripts.spec.ts +12 -4
- package/src/__tests__/bannedDependencies.spec.ts +45 -16
- package/src/__tests__/consistentDependencies.spec.ts +11 -5
- package/src/__tests__/consistentVersions.spec.ts +72 -18
- package/src/__tests__/fileContents.spec.ts +9 -5
- package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +191 -76
- package/src/__tests__/nestedWorkspaces.spec.ts +10 -6
- package/src/__tests__/packageEntry.spec.ts +54 -48
- package/src/__tests__/packageOrder.spec.ts +77 -71
- package/src/__tests__/packageScript.spec.ts +25 -11
- package/src/__tests__/requireDependency.spec.ts +12 -6
- package/src/__tests__/utils.ts +16 -7
- package/src/bannedDependencies.ts +32 -15
- package/src/consistentDependencies.ts +22 -9
- package/src/consistentVersions.ts +84 -47
- package/src/fileContents.ts +19 -11
- package/src/index.ts +3 -3
- package/src/mustSatisfyPeerDependencies.ts +162 -66
- package/src/nestedWorkspaces.ts +23 -10
- package/src/packageEntry.ts +18 -11
- package/src/packageOrder.ts +9 -3
- package/src/packageScript.ts +37 -19
- package/src/requireDependency.ts +28 -11
- package/src/standardTsconfig.ts +31 -10
- package/src/util/checkAlpha.ts +5 -2
- package/src/util/createRuleFactory.ts +6 -2
- package/src/util/packageDependencyGraphService.ts +41 -14
- package/vitest.config.mjs +10 -7
package/build/js/index.js
CHANGED
|
@@ -113,11 +113,19 @@ var PackageDependencyGraphService = class {
|
|
|
113
113
|
if (maxDepth == null || nextDepth <= maxDepth) {
|
|
114
114
|
const dependencies = packageJson.dependencies != null ? Object.keys(packageJson.dependencies) : [];
|
|
115
115
|
for (const dependency of dependencies) {
|
|
116
|
-
const dependencyPackageJsonPath = resolvePackagePath(
|
|
116
|
+
const dependencyPackageJsonPath = resolvePackagePath(
|
|
117
|
+
dependency,
|
|
118
|
+
node.paths.rootDirectory
|
|
119
|
+
);
|
|
117
120
|
if (dependencyPackageJsonPath == null) {
|
|
118
|
-
throw new Error(
|
|
121
|
+
throw new Error(
|
|
122
|
+
`Could not resolve ${dependency} from ${node.paths.rootDirectory}`
|
|
123
|
+
);
|
|
119
124
|
}
|
|
120
|
-
node.dependencies.set(
|
|
125
|
+
node.dependencies.set(
|
|
126
|
+
dependency,
|
|
127
|
+
visit(dependencyPackageJsonPath, nextDepth)
|
|
128
|
+
);
|
|
121
129
|
}
|
|
122
130
|
}
|
|
123
131
|
return node;
|
|
@@ -178,7 +186,10 @@ var bannedDependencies = createRuleFactory({
|
|
|
178
186
|
const curDeps = packageJson.dependencies && Object.keys(packageJson.dependencies);
|
|
179
187
|
const curDevDeps = packageJson.devDependencies && Object.keys(packageJson.devDependencies);
|
|
180
188
|
const curPeerDeps = packageJson.peerDependencies && Object.keys(packageJson.peerDependencies);
|
|
181
|
-
const {
|
|
189
|
+
const {
|
|
190
|
+
bannedDependencies: banned,
|
|
191
|
+
bannedTransitiveDependencies: transitives
|
|
192
|
+
} = opts;
|
|
182
193
|
const globs = banned && (Array.isArray(banned) ? banned : banned.glob);
|
|
183
194
|
const exacts = banned && (Array.isArray(banned) ? void 0 : banned.exact);
|
|
184
195
|
const violations = /* @__PURE__ */ new Set();
|
|
@@ -235,12 +246,18 @@ function populateProblemsGlobs(bannedDependencyGlobs, dependencies, violations)
|
|
|
235
246
|
}
|
|
236
247
|
function checkTransitives(context, banned) {
|
|
237
248
|
const graphService = new PackageDependencyGraphService();
|
|
238
|
-
const root = graphService.buildDependencyGraph(
|
|
249
|
+
const root = graphService.buildDependencyGraph(
|
|
250
|
+
path2.resolve(context.getPackageJsonPath()),
|
|
251
|
+
context.host
|
|
252
|
+
);
|
|
239
253
|
for (const { dependencies, importPath } of graphService.traverse(root)) {
|
|
240
254
|
for (const [dependency] of dependencies) {
|
|
241
255
|
if (banned.has(dependency)) {
|
|
242
256
|
const [, ...importPathWithoutRoot] = importPath;
|
|
243
|
-
const pathing = [
|
|
257
|
+
const pathing = [
|
|
258
|
+
...importPathWithoutRoot.map(nameOrPackageJsonPath),
|
|
259
|
+
dependency
|
|
260
|
+
].join(" -> ");
|
|
244
261
|
context.addError({
|
|
245
262
|
file: root.paths.packageJsonPath,
|
|
246
263
|
message: `Banned transitive dependencies in repo: ${pathing}`
|
|
@@ -307,7 +324,9 @@ function filterKeys(ob, filterOb) {
|
|
|
307
324
|
}
|
|
308
325
|
function omit(obj, keysToOmit) {
|
|
309
326
|
const newObj = {};
|
|
310
|
-
const filtered = Object.entries(obj).filter(
|
|
327
|
+
const filtered = Object.entries(obj).filter(
|
|
328
|
+
([key]) => !keysToOmit.includes(key)
|
|
329
|
+
);
|
|
311
330
|
for (const [key, value] of filtered) {
|
|
312
331
|
newObj[key] = value;
|
|
313
332
|
}
|
|
@@ -331,16 +350,26 @@ function checkConsistentVersions(context, options) {
|
|
|
331
350
|
options.matchDependencyVersions
|
|
332
351
|
)) {
|
|
333
352
|
if (Array.isArray(expectedPackageDependencyValue)) {
|
|
334
|
-
ensurePackageMatchesSomeVersion(
|
|
353
|
+
ensurePackageMatchesSomeVersion(
|
|
354
|
+
context,
|
|
355
|
+
dependencyPackageName,
|
|
356
|
+
expectedPackageDependencyValue
|
|
357
|
+
);
|
|
335
358
|
} else {
|
|
336
|
-
ensurePackageIsCorrectVersion(
|
|
359
|
+
ensurePackageIsCorrectVersion(
|
|
360
|
+
context,
|
|
361
|
+
dependencyPackageName,
|
|
362
|
+
expectedPackageDependencyValue
|
|
363
|
+
);
|
|
337
364
|
}
|
|
338
365
|
}
|
|
339
366
|
}
|
|
340
367
|
var ensurePackageIsCorrectVersion = (context, dependencyPackageName, expectedPackageDependencyValue) => {
|
|
341
368
|
const packageJson = context.getPackageJson();
|
|
342
369
|
const packageJsonPath = context.getPackageJsonPath();
|
|
343
|
-
const expectedPackageDependencyVersion = coerce(
|
|
370
|
+
const expectedPackageDependencyVersion = coerce(
|
|
371
|
+
expectedPackageDependencyValue
|
|
372
|
+
);
|
|
344
373
|
if (expectedPackageDependencyVersion == null) {
|
|
345
374
|
throw new Error(
|
|
346
375
|
`Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'`
|
|
@@ -359,7 +388,9 @@ var ensurePackageIsCorrectVersion = (context, dependencyPackageName, expectedPac
|
|
|
359
388
|
});
|
|
360
389
|
}
|
|
361
390
|
const actualPackageDevDependencyValue = packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];
|
|
362
|
-
const actualPackageDevDependencyVersion = coerce(
|
|
391
|
+
const actualPackageDevDependencyVersion = coerce(
|
|
392
|
+
actualPackageDevDependencyValue
|
|
393
|
+
);
|
|
363
394
|
if (actualPackageDevDependencyVersion != null && actualPackageDevDependencyVersion.raw !== expectedPackageDependencyVersion.raw) {
|
|
364
395
|
context.addError({
|
|
365
396
|
file: packageJsonPath,
|
|
@@ -376,7 +407,9 @@ var ensurePackageMatchesSomeVersion = (context, dependencyPackageName, acceptedP
|
|
|
376
407
|
const packageJsonPath = context.getPackageJsonPath();
|
|
377
408
|
const acceptedPackageDependencyVersions = acceptedPackageDependencyValues.map(
|
|
378
409
|
(acceptedPackageDependencyValue) => {
|
|
379
|
-
const acceptedPackageDependencyVersion = coerce(
|
|
410
|
+
const acceptedPackageDependencyVersion = coerce(
|
|
411
|
+
acceptedPackageDependencyValue
|
|
412
|
+
);
|
|
380
413
|
if (acceptedPackageDependencyVersion == null) {
|
|
381
414
|
throw new Error(
|
|
382
415
|
`Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`
|
|
@@ -398,7 +431,9 @@ var ensurePackageMatchesSomeVersion = (context, dependencyPackageName, acceptedP
|
|
|
398
431
|
});
|
|
399
432
|
}
|
|
400
433
|
const actualPackageDevDependencyValue = packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];
|
|
401
|
-
const actualPackageDevDependencyVersion = coerce(
|
|
434
|
+
const actualPackageDevDependencyVersion = coerce(
|
|
435
|
+
actualPackageDevDependencyValue
|
|
436
|
+
);
|
|
402
437
|
if (actualPackageDevDependencyVersion != null && acceptedPackageDependencyVersions.every(
|
|
403
438
|
(acceptedPackageDependencyVersion) => actualPackageDevDependencyVersion.raw !== acceptedPackageDependencyVersion.raw
|
|
404
439
|
)) {
|
|
@@ -454,7 +489,9 @@ var fileContents = createRuleFactory({
|
|
|
454
489
|
if (pathExists) context.host.deleteFile(fullPath);
|
|
455
490
|
} else {
|
|
456
491
|
context.host.mkdir(path3.dirname(fullPath), { recursive: true });
|
|
457
|
-
context.host.writeFile(fullPath, expectedContent, {
|
|
492
|
+
context.host.writeFile(fullPath, expectedContent, {
|
|
493
|
+
encoding: "utf-8"
|
|
494
|
+
});
|
|
458
495
|
}
|
|
459
496
|
}
|
|
460
497
|
});
|
|
@@ -489,9 +526,9 @@ async function getExpectedContents(context, opts) {
|
|
|
489
526
|
// src/mustSatisfyPeerDependencies.ts
|
|
490
527
|
import { mutateJson as mutateJson2 } from "@monorepolint/utils";
|
|
491
528
|
import * as path4 from "node:path";
|
|
529
|
+
import resolvePackagePath2 from "resolve-package-path";
|
|
492
530
|
import * as r5 from "runtypes";
|
|
493
531
|
import { coerce as coerce2 } from "semver";
|
|
494
|
-
import resolvePackagePath2 from "resolve-package-path";
|
|
495
532
|
var Options5 = r5.Union(
|
|
496
533
|
r5.Partial({
|
|
497
534
|
skipUnparseableRanges: r5.Undefined,
|
|
@@ -642,15 +679,26 @@ var MATCH_GREATER_OR_EQUAL_VERSION_RANGE = /^>= ?\d+(?:\.\d+|\.\d+\.\d+(?:-((?:0
|
|
|
642
679
|
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-]+)*))?)$/;
|
|
643
680
|
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-]+)*))?)?)*)$/;
|
|
644
681
|
function checkSatisfyPeerDependencies(context, opts) {
|
|
645
|
-
const {
|
|
682
|
+
const {
|
|
683
|
+
dependencyBlacklist,
|
|
684
|
+
dependencyWhitelist,
|
|
685
|
+
enforceForDevDependencies,
|
|
686
|
+
skipUnparseableRanges
|
|
687
|
+
} = opts;
|
|
646
688
|
const packageJsonPath = path4.resolve(context.getPackageJsonPath());
|
|
647
689
|
const packageJson = context.host.readJson(packageJsonPath);
|
|
648
690
|
const packageDependencies = packageJson.dependencies || {};
|
|
649
691
|
const packageDevDependencies = packageJson.devDependencies || {};
|
|
650
692
|
const packagePeerDependencies = packageJson.peerDependencies || {};
|
|
651
693
|
const packageName = packageJson.name || packageJsonPath;
|
|
652
|
-
for (const [peerDependencyName, peerDependencyRange] of Object.entries(
|
|
653
|
-
|
|
694
|
+
for (const [peerDependencyName, peerDependencyRange] of Object.entries(
|
|
695
|
+
packagePeerDependencies
|
|
696
|
+
)) {
|
|
697
|
+
if (shouldSkipPackage({
|
|
698
|
+
dependencyBlacklist,
|
|
699
|
+
dependencyWhitelist,
|
|
700
|
+
packageName: peerDependencyName
|
|
701
|
+
})) {
|
|
654
702
|
continue;
|
|
655
703
|
}
|
|
656
704
|
const dependencyRange = packageDependencies[peerDependencyName];
|
|
@@ -663,19 +711,35 @@ function checkSatisfyPeerDependencies(context, opts) {
|
|
|
663
711
|
}
|
|
664
712
|
}
|
|
665
713
|
const allRequiredPeerDependencies = {};
|
|
666
|
-
const allDependencies = enforceForDevDependencies ? [
|
|
714
|
+
const allDependencies = enforceForDevDependencies ? [
|
|
715
|
+
...Object.keys(packageDependencies),
|
|
716
|
+
...Object.keys(packageDevDependencies)
|
|
717
|
+
] : Object.keys(packageDependencies);
|
|
667
718
|
for (const dependency of allDependencies) {
|
|
668
|
-
const dependencyPackageJsonPath = resolvePackagePath2(
|
|
719
|
+
const dependencyPackageJsonPath = resolvePackagePath2(
|
|
720
|
+
dependency,
|
|
721
|
+
path4.dirname(packageJsonPath)
|
|
722
|
+
);
|
|
669
723
|
if (dependencyPackageJsonPath == null) {
|
|
670
|
-
throw new Error(
|
|
724
|
+
throw new Error(
|
|
725
|
+
`Could not resolve ${dependency} from ${path4.dirname(packageJsonPath)}`
|
|
726
|
+
);
|
|
671
727
|
}
|
|
672
|
-
const dependencyPackageJson = context.host.readJson(
|
|
728
|
+
const dependencyPackageJson = context.host.readJson(
|
|
729
|
+
dependencyPackageJsonPath
|
|
730
|
+
);
|
|
673
731
|
const requiredPeerDependencies = dependencyPackageJson.peerDependencies;
|
|
674
732
|
if (requiredPeerDependencies == null) {
|
|
675
733
|
continue;
|
|
676
734
|
}
|
|
677
|
-
for (const [peerDependencyName, range] of Object.entries(
|
|
678
|
-
|
|
735
|
+
for (const [peerDependencyName, range] of Object.entries(
|
|
736
|
+
requiredPeerDependencies
|
|
737
|
+
)) {
|
|
738
|
+
if (shouldSkipPackage({
|
|
739
|
+
dependencyBlacklist,
|
|
740
|
+
dependencyWhitelist,
|
|
741
|
+
packageName: peerDependencyName
|
|
742
|
+
})) {
|
|
679
743
|
continue;
|
|
680
744
|
}
|
|
681
745
|
if (!isValidRange(range)) {
|
|
@@ -689,10 +753,15 @@ function checkSatisfyPeerDependencies(context, opts) {
|
|
|
689
753
|
if (allRequiredPeerDependencies[peerDependencyName] == null) {
|
|
690
754
|
allRequiredPeerDependencies[peerDependencyName] = [];
|
|
691
755
|
}
|
|
692
|
-
allRequiredPeerDependencies[peerDependencyName].push({
|
|
756
|
+
allRequiredPeerDependencies[peerDependencyName].push({
|
|
757
|
+
fromPackageName: dependencyPackageJson.name,
|
|
758
|
+
range
|
|
759
|
+
});
|
|
693
760
|
}
|
|
694
761
|
}
|
|
695
|
-
for (const [peerDependencyName, peerDependencyRequirements] of Object.entries(
|
|
762
|
+
for (const [peerDependencyName, peerDependencyRequirements] of Object.entries(
|
|
763
|
+
allRequiredPeerDependencies
|
|
764
|
+
)) {
|
|
696
765
|
let mostStrictPeerRequirement = {
|
|
697
766
|
fromPeerDependencyRequirements: [peerDependencyRequirements[0]],
|
|
698
767
|
range: peerDependencyRequirements[0].range
|
|
@@ -706,7 +775,10 @@ function checkSatisfyPeerDependencies(context, opts) {
|
|
|
706
775
|
range: peerRequirement.range
|
|
707
776
|
};
|
|
708
777
|
} else {
|
|
709
|
-
const maybeIntersection = findIntersection(
|
|
778
|
+
const maybeIntersection = findIntersection(
|
|
779
|
+
peerRequirement.range,
|
|
780
|
+
mostStrictPeerRequirement.range
|
|
781
|
+
);
|
|
710
782
|
if (maybeIntersection !== void 0) {
|
|
711
783
|
mostStrictPeerRequirement = {
|
|
712
784
|
fromPeerDependencyRequirements: [
|
|
@@ -765,7 +837,10 @@ function checkSatisfyPeerDependencies(context, opts) {
|
|
|
765
837
|
} else {
|
|
766
838
|
throw new Error(message);
|
|
767
839
|
}
|
|
768
|
-
} else if (!doesASatisfyB(
|
|
840
|
+
} else if (!doesASatisfyB(
|
|
841
|
+
packagePeerDependencyRange,
|
|
842
|
+
mostStrictPeerRequirement.range
|
|
843
|
+
)) {
|
|
769
844
|
context.addError({
|
|
770
845
|
file: packageJsonPath,
|
|
771
846
|
message: `[4] Package ${packageName} peer dependency on ${peerDependencyName} '${packagePeerDependencyRange}' is not strict enough.
|
|
@@ -797,8 +872,12 @@ function getMostStrictStatement(mostStrictPeerRequirement) {
|
|
|
797
872
|
const dependencyName = mostStrictPeerRequirement.fromPeerDependencyRequirements[0].fromPackageName;
|
|
798
873
|
return `Dependency ${dependencyName} requires '${mostStrictPeerRequirement.range}'.`;
|
|
799
874
|
} else {
|
|
800
|
-
const dependencyNames = mostStrictPeerRequirement.fromPeerDependencyRequirements.map(
|
|
801
|
-
|
|
875
|
+
const dependencyNames = mostStrictPeerRequirement.fromPeerDependencyRequirements.map(
|
|
876
|
+
(peerDependencyRequirement) => peerDependencyRequirement.fromPackageName
|
|
877
|
+
).join(", ");
|
|
878
|
+
const dependencyRequirements = mostStrictPeerRequirement.fromPeerDependencyRequirements.map(
|
|
879
|
+
(peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`
|
|
880
|
+
).join(", ");
|
|
802
881
|
return `Dependencies [${dependencyNames}] require [${dependencyRequirements}] respectively, resolving to '${mostStrictPeerRequirement.range}'.`;
|
|
803
882
|
}
|
|
804
883
|
}
|
|
@@ -848,13 +927,21 @@ function findIntersection(a, b) {
|
|
|
848
927
|
}
|
|
849
928
|
const compatibleVersions = aVersions.map((aVersion) => {
|
|
850
929
|
const aSemVer = coerce2(aVersion);
|
|
851
|
-
const majorMatchingBVersion = bVersions.find(
|
|
930
|
+
const majorMatchingBVersion = bVersions.find(
|
|
931
|
+
(m) => coerce2(m).major === aSemVer.major
|
|
932
|
+
);
|
|
852
933
|
if (majorMatchingBVersion === void 0) {
|
|
853
934
|
return void 0;
|
|
854
935
|
}
|
|
855
|
-
if (doesASatisfyB(
|
|
936
|
+
if (doesASatisfyB(
|
|
937
|
+
aVersion,
|
|
938
|
+
majorMatchingBVersion
|
|
939
|
+
)) {
|
|
856
940
|
return aVersion;
|
|
857
|
-
} else if (doesASatisfyB(
|
|
941
|
+
} else if (doesASatisfyB(
|
|
942
|
+
majorMatchingBVersion,
|
|
943
|
+
aVersion
|
|
944
|
+
)) {
|
|
858
945
|
return majorMatchingBVersion;
|
|
859
946
|
} else {
|
|
860
947
|
return void 0;
|
|
@@ -895,13 +982,17 @@ function doesASatisfyB(a, b) {
|
|
|
895
982
|
}
|
|
896
983
|
return aVersions.every((aVersion) => {
|
|
897
984
|
const aSemVer = coerce2(aVersion);
|
|
898
|
-
const majorMatchingBVersion = bVersions.find(
|
|
985
|
+
const majorMatchingBVersion = bVersions.find(
|
|
986
|
+
(m) => coerce2(m).major === aSemVer.major
|
|
987
|
+
);
|
|
899
988
|
if (majorMatchingBVersion === void 0) {
|
|
900
989
|
return false;
|
|
901
990
|
}
|
|
902
991
|
const aVersionIsRange = isMajorVersionRange(aVersion);
|
|
903
992
|
const majorMatchingBSemVer = coerce2(majorMatchingBVersion);
|
|
904
|
-
const majorMatchingBVersionIsRange = isMajorVersionRange(
|
|
993
|
+
const majorMatchingBVersionIsRange = isMajorVersionRange(
|
|
994
|
+
majorMatchingBVersion
|
|
995
|
+
);
|
|
905
996
|
if (majorMatchingBVersionIsRange) {
|
|
906
997
|
return aSemVer.compare(majorMatchingBSemVer) !== -1;
|
|
907
998
|
} else {
|
|
@@ -943,12 +1034,133 @@ function getAddDependencyTypeFixer({
|
|
|
943
1034
|
};
|
|
944
1035
|
}
|
|
945
1036
|
|
|
946
|
-
// src/
|
|
947
|
-
import
|
|
1037
|
+
// src/nestedWorkspaces.ts
|
|
1038
|
+
import * as globby from "globby";
|
|
1039
|
+
import * as path5 from "node:path";
|
|
948
1040
|
import * as r6 from "runtypes";
|
|
949
|
-
var Options6 = r6.
|
|
950
|
-
|
|
951
|
-
|
|
1041
|
+
var Options6 = r6.Undefined;
|
|
1042
|
+
var nestedWorkspaces = createRuleFactory({
|
|
1043
|
+
name: "nestedWorkspaces",
|
|
1044
|
+
check: (context) => {
|
|
1045
|
+
const rootPackageJson = context.getWorkspaceContext().getPackageJson();
|
|
1046
|
+
const packageJsonPaths = globby.globbySync([
|
|
1047
|
+
"*/**/package.json",
|
|
1048
|
+
"!**/node_modules/**"
|
|
1049
|
+
]);
|
|
1050
|
+
const workspaces = Array.isArray(rootPackageJson.workspaces) ? rootPackageJson.workspaces : rootPackageJson.workspaces !== void 0 ? rootPackageJson.workspaces.packages : void 0;
|
|
1051
|
+
if (workspaces === void 0 && packageJsonPaths.length > 0) {
|
|
1052
|
+
context.addError({
|
|
1053
|
+
file: context.getPackageJsonPath(),
|
|
1054
|
+
message: 'The "workspace" field is missing, even though there are workspaces in the repository.'
|
|
1055
|
+
});
|
|
1056
|
+
return;
|
|
1057
|
+
}
|
|
1058
|
+
const workspacePackageJsons = (workspaces || []).map(
|
|
1059
|
+
(item) => `${item}/package.json`
|
|
1060
|
+
);
|
|
1061
|
+
const expandedWorkspacesGlobs = globby.globbySync([
|
|
1062
|
+
...workspacePackageJsons,
|
|
1063
|
+
"!**/node_modules/**"
|
|
1064
|
+
]);
|
|
1065
|
+
const difference = packageJsonPaths.filter(
|
|
1066
|
+
(packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath)
|
|
1067
|
+
);
|
|
1068
|
+
if (difference.length !== 0) {
|
|
1069
|
+
const differencesList = difference.map(
|
|
1070
|
+
(packageJsonPath) => path5.dirname(packageJsonPath)
|
|
1071
|
+
).join(", ");
|
|
1072
|
+
context.addError({
|
|
1073
|
+
file: context.getPackageJsonPath(),
|
|
1074
|
+
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/*".`
|
|
1075
|
+
});
|
|
1076
|
+
}
|
|
1077
|
+
},
|
|
1078
|
+
validateOptions: Options6.check
|
|
1079
|
+
});
|
|
1080
|
+
|
|
1081
|
+
// src/packageEntry.ts
|
|
1082
|
+
import { mutateJson as mutateJson3 } from "@monorepolint/utils";
|
|
1083
|
+
import { diff as diff4 } from "jest-diff";
|
|
1084
|
+
import * as r7 from "runtypes";
|
|
1085
|
+
var Options7 = r7.Union(
|
|
1086
|
+
r7.Record({
|
|
1087
|
+
entries: r7.Dictionary(r7.Unknown)
|
|
1088
|
+
// string => unknown, enforces existence of keys and their values
|
|
1089
|
+
}).And(
|
|
1090
|
+
r7.Partial({
|
|
1091
|
+
entriesExist: r7.Undefined
|
|
1092
|
+
})
|
|
1093
|
+
),
|
|
1094
|
+
r7.Record({
|
|
1095
|
+
entriesExist: r7.Array(r7.String)
|
|
1096
|
+
// enforces existence of keys, but not values
|
|
1097
|
+
}).And(
|
|
1098
|
+
r7.Partial({
|
|
1099
|
+
entries: r7.Undefined
|
|
1100
|
+
})
|
|
1101
|
+
),
|
|
1102
|
+
r7.Record({
|
|
1103
|
+
entries: r7.Dictionary(r7.Unknown),
|
|
1104
|
+
// string => unknown, enforces existence of keys and their values
|
|
1105
|
+
entriesExist: r7.Array(r7.String)
|
|
1106
|
+
})
|
|
1107
|
+
);
|
|
1108
|
+
var packageEntry = createRuleFactory({
|
|
1109
|
+
name: "packageEntry",
|
|
1110
|
+
check: (context, options) => {
|
|
1111
|
+
const packageJson = context.getPackageJson();
|
|
1112
|
+
if (options.entries) {
|
|
1113
|
+
for (const key of Object.keys(options.entries)) {
|
|
1114
|
+
const value = options.entries[key];
|
|
1115
|
+
const entryDiff = diff4(
|
|
1116
|
+
JSON.stringify(value) + "\n",
|
|
1117
|
+
(JSON.stringify(packageJson[key]) || "") + "\n"
|
|
1118
|
+
);
|
|
1119
|
+
if (typeof value !== "object" && value !== packageJson[key] || entryDiff == null || !entryDiff.includes("Compared values have no visual difference")) {
|
|
1120
|
+
context.addError({
|
|
1121
|
+
file: context.getPackageJsonPath(),
|
|
1122
|
+
message: createStandardizedEntryErrorMessage(key),
|
|
1123
|
+
longMessage: entryDiff,
|
|
1124
|
+
fixer: () => {
|
|
1125
|
+
mutateJson3(
|
|
1126
|
+
context.getPackageJsonPath(),
|
|
1127
|
+
context.host,
|
|
1128
|
+
(input) => {
|
|
1129
|
+
input[key] = value;
|
|
1130
|
+
return input;
|
|
1131
|
+
}
|
|
1132
|
+
);
|
|
1133
|
+
}
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
if (options.entriesExist) {
|
|
1139
|
+
for (const key of options.entriesExist) {
|
|
1140
|
+
if (packageJson[key] === void 0) {
|
|
1141
|
+
context.addError({
|
|
1142
|
+
file: context.getPackageJsonPath(),
|
|
1143
|
+
message: createExpectedEntryErrorMessage(key)
|
|
1144
|
+
});
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
},
|
|
1149
|
+
validateOptions: Options7.check
|
|
1150
|
+
});
|
|
1151
|
+
function createStandardizedEntryErrorMessage(key) {
|
|
1152
|
+
return `Expected standardized entry for '${key}'`;
|
|
1153
|
+
}
|
|
1154
|
+
function createExpectedEntryErrorMessage(key) {
|
|
1155
|
+
return `Expected entry for '${key}' to exist`;
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
// src/packageOrder.ts
|
|
1159
|
+
import { diff as diff5 } from "jest-diff";
|
|
1160
|
+
import * as r8 from "runtypes";
|
|
1161
|
+
var Options8 = r8.Record({
|
|
1162
|
+
order: r8.Union(r8.Array(r8.String), r8.Function)
|
|
1163
|
+
}).Or(r8.Undefined);
|
|
952
1164
|
var defaultKeyOrder = [
|
|
953
1165
|
"name",
|
|
954
1166
|
"version",
|
|
@@ -993,7 +1205,7 @@ var packageOrder = createRuleFactory({
|
|
|
993
1205
|
context.addError({
|
|
994
1206
|
file: packagePath,
|
|
995
1207
|
message: "Incorrect order of fields in package.json",
|
|
996
|
-
longMessage:
|
|
1208
|
+
longMessage: diff5(expectedOrder, actualOrder, { expand: true }),
|
|
997
1209
|
fixer: () => {
|
|
998
1210
|
const expectedPackageJson = {};
|
|
999
1211
|
expectedOrder.forEach((key) => {
|
|
@@ -1004,7 +1216,7 @@ var packageOrder = createRuleFactory({
|
|
|
1004
1216
|
});
|
|
1005
1217
|
}
|
|
1006
1218
|
},
|
|
1007
|
-
validateOptions:
|
|
1219
|
+
validateOptions: Options8.check
|
|
1008
1220
|
});
|
|
1009
1221
|
function arrayOrderCompare2(a, b) {
|
|
1010
1222
|
for (let index = 0; index < a.length; index++) {
|
|
@@ -1035,87 +1247,17 @@ function isOrderFunction(order) {
|
|
|
1035
1247
|
return !Array.isArray(order);
|
|
1036
1248
|
}
|
|
1037
1249
|
|
|
1038
|
-
// src/packageEntry.ts
|
|
1039
|
-
import { mutateJson as mutateJson3 } from "@monorepolint/utils";
|
|
1040
|
-
import { diff as diff5 } from "jest-diff";
|
|
1041
|
-
import * as r7 from "runtypes";
|
|
1042
|
-
var Options7 = r7.Union(
|
|
1043
|
-
r7.Record({
|
|
1044
|
-
entries: r7.Dictionary(r7.Unknown)
|
|
1045
|
-
// string => unknown, enforces existence of keys and their values
|
|
1046
|
-
}).And(
|
|
1047
|
-
r7.Partial({
|
|
1048
|
-
entriesExist: r7.Undefined
|
|
1049
|
-
})
|
|
1050
|
-
),
|
|
1051
|
-
r7.Record({
|
|
1052
|
-
entriesExist: r7.Array(r7.String)
|
|
1053
|
-
// enforces existence of keys, but not values
|
|
1054
|
-
}).And(
|
|
1055
|
-
r7.Partial({
|
|
1056
|
-
entries: r7.Undefined
|
|
1057
|
-
})
|
|
1058
|
-
),
|
|
1059
|
-
r7.Record({
|
|
1060
|
-
entries: r7.Dictionary(r7.Unknown),
|
|
1061
|
-
// string => unknown, enforces existence of keys and their values
|
|
1062
|
-
entriesExist: r7.Array(r7.String)
|
|
1063
|
-
})
|
|
1064
|
-
);
|
|
1065
|
-
var packageEntry = createRuleFactory({
|
|
1066
|
-
name: "packageEntry",
|
|
1067
|
-
check: (context, options) => {
|
|
1068
|
-
const packageJson = context.getPackageJson();
|
|
1069
|
-
if (options.entries) {
|
|
1070
|
-
for (const key of Object.keys(options.entries)) {
|
|
1071
|
-
const value = options.entries[key];
|
|
1072
|
-
const entryDiff = diff5(JSON.stringify(value) + "\n", (JSON.stringify(packageJson[key]) || "") + "\n");
|
|
1073
|
-
if (typeof value !== "object" && value !== packageJson[key] || entryDiff == null || !entryDiff.includes("Compared values have no visual difference")) {
|
|
1074
|
-
context.addError({
|
|
1075
|
-
file: context.getPackageJsonPath(),
|
|
1076
|
-
message: createStandardizedEntryErrorMessage(key),
|
|
1077
|
-
longMessage: entryDiff,
|
|
1078
|
-
fixer: () => {
|
|
1079
|
-
mutateJson3(context.getPackageJsonPath(), context.host, (input) => {
|
|
1080
|
-
input[key] = value;
|
|
1081
|
-
return input;
|
|
1082
|
-
});
|
|
1083
|
-
}
|
|
1084
|
-
});
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
}
|
|
1088
|
-
if (options.entriesExist) {
|
|
1089
|
-
for (const key of options.entriesExist) {
|
|
1090
|
-
if (packageJson[key] === void 0) {
|
|
1091
|
-
context.addError({
|
|
1092
|
-
file: context.getPackageJsonPath(),
|
|
1093
|
-
message: createExpectedEntryErrorMessage(key)
|
|
1094
|
-
});
|
|
1095
|
-
}
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
},
|
|
1099
|
-
validateOptions: Options7.check
|
|
1100
|
-
});
|
|
1101
|
-
function createStandardizedEntryErrorMessage(key) {
|
|
1102
|
-
return `Expected standardized entry for '${key}'`;
|
|
1103
|
-
}
|
|
1104
|
-
function createExpectedEntryErrorMessage(key) {
|
|
1105
|
-
return `Expected entry for '${key}' to exist`;
|
|
1106
|
-
}
|
|
1107
|
-
|
|
1108
1250
|
// src/packageScript.ts
|
|
1109
1251
|
import { mutateJson as mutateJson4 } from "@monorepolint/utils";
|
|
1110
1252
|
import { diff as diff6 } from "jest-diff";
|
|
1111
|
-
import * as
|
|
1112
|
-
var
|
|
1113
|
-
scripts:
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
options:
|
|
1118
|
-
fixValue:
|
|
1253
|
+
import * as r9 from "runtypes";
|
|
1254
|
+
var Options9 = r9.Record({
|
|
1255
|
+
scripts: r9.Dictionary(
|
|
1256
|
+
r9.Union(
|
|
1257
|
+
r9.String,
|
|
1258
|
+
r9.Record({
|
|
1259
|
+
options: r9.Array(r9.String.Or(r9.Undefined)),
|
|
1260
|
+
fixValue: r9.Union(r9.String, r9.Undefined, r9.Literal(false)).optional()
|
|
1119
1261
|
})
|
|
1120
1262
|
)
|
|
1121
1263
|
)
|
|
@@ -1131,10 +1273,14 @@ var packageScript = createRuleFactory({
|
|
|
1131
1273
|
file: context.getPackageJsonPath(),
|
|
1132
1274
|
message: MSG_NO_SCRIPTS_BLOCK,
|
|
1133
1275
|
fixer: () => {
|
|
1134
|
-
mutateJson4(
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1276
|
+
mutateJson4(
|
|
1277
|
+
context.getPackageJsonPath(),
|
|
1278
|
+
context.host,
|
|
1279
|
+
(input) => {
|
|
1280
|
+
input.scripts = {};
|
|
1281
|
+
return input;
|
|
1282
|
+
}
|
|
1283
|
+
);
|
|
1138
1284
|
}
|
|
1139
1285
|
});
|
|
1140
1286
|
return;
|
|
@@ -1163,43 +1309,127 @@ var packageScript = createRuleFactory({
|
|
|
1163
1309
|
if (fixValue !== false && (fixValue !== void 0 || fixToEmpty === true)) {
|
|
1164
1310
|
const q = fixValue;
|
|
1165
1311
|
fixer = () => {
|
|
1166
|
-
mutateJson4(
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1312
|
+
mutateJson4(
|
|
1313
|
+
context.getPackageJsonPath(),
|
|
1314
|
+
context.host,
|
|
1315
|
+
(input) => {
|
|
1316
|
+
if (fixToEmpty && q === void 0) {
|
|
1317
|
+
delete input.scripts[name];
|
|
1318
|
+
} else {
|
|
1319
|
+
input.scripts[name] = q;
|
|
1320
|
+
}
|
|
1321
|
+
return input;
|
|
1171
1322
|
}
|
|
1172
|
-
|
|
1173
|
-
});
|
|
1323
|
+
);
|
|
1174
1324
|
};
|
|
1175
1325
|
}
|
|
1176
1326
|
const validOptionsString = Array.from(allowedValues.values()).map((a) => a === void 0 ? "(empty)" : `'${a}'`).join(", ");
|
|
1177
1327
|
context.addError({
|
|
1178
1328
|
file: context.getPackageJsonPath(),
|
|
1179
1329
|
message: `Expected standardized script entry for '${name}'. Valid options: ${validOptionsString}`,
|
|
1180
|
-
longMessage: diff6(
|
|
1330
|
+
longMessage: diff6(
|
|
1331
|
+
validOptionsString + "\n",
|
|
1332
|
+
(packageJson.scripts[name] || "") + "\n"
|
|
1333
|
+
),
|
|
1181
1334
|
fixer
|
|
1182
1335
|
});
|
|
1183
1336
|
}
|
|
1184
1337
|
}
|
|
1185
1338
|
},
|
|
1186
|
-
validateOptions:
|
|
1339
|
+
validateOptions: Options9.check
|
|
1340
|
+
});
|
|
1341
|
+
|
|
1342
|
+
// src/requireDependency.ts
|
|
1343
|
+
import { mutateJson as mutateJson5 } from "@monorepolint/utils";
|
|
1344
|
+
import { diff as diff7 } from "jest-diff";
|
|
1345
|
+
import * as r10 from "runtypes";
|
|
1346
|
+
var Options10 = r10.Partial({
|
|
1347
|
+
dependencies: r10.Dictionary(r10.String.optional()),
|
|
1348
|
+
devDependencies: r10.Dictionary(r10.String.optional()),
|
|
1349
|
+
peerDependencies: r10.Dictionary(r10.String.optional()),
|
|
1350
|
+
optionalDependencies: r10.Dictionary(r10.String.optional())
|
|
1351
|
+
});
|
|
1352
|
+
var requireDependency = createRuleFactory({
|
|
1353
|
+
name: "requireDependency",
|
|
1354
|
+
check: function expectPackageEntry(context, options) {
|
|
1355
|
+
const packageJson = context.getPackageJson();
|
|
1356
|
+
const packageJsonPath = context.getPackageJsonPath();
|
|
1357
|
+
[
|
|
1358
|
+
"dependencies",
|
|
1359
|
+
"devDependencies",
|
|
1360
|
+
"peerDependencies",
|
|
1361
|
+
"optionalDependencies"
|
|
1362
|
+
].forEach((type) => {
|
|
1363
|
+
var _a;
|
|
1364
|
+
const expectedEntries = options[type];
|
|
1365
|
+
if (!expectedEntries) {
|
|
1366
|
+
return;
|
|
1367
|
+
}
|
|
1368
|
+
if (packageJson[type] === void 0) {
|
|
1369
|
+
context.addError({
|
|
1370
|
+
file: packageJsonPath,
|
|
1371
|
+
message: `No ${type} block, cannot add required ${type}.`,
|
|
1372
|
+
fixer: () => {
|
|
1373
|
+
mutateJson5(packageJsonPath, context.host, (input) => {
|
|
1374
|
+
input[type] = Object.fromEntries(
|
|
1375
|
+
Object.entries(expectedEntries).filter(
|
|
1376
|
+
([, v]) => v !== void 0
|
|
1377
|
+
)
|
|
1378
|
+
);
|
|
1379
|
+
return input;
|
|
1380
|
+
});
|
|
1381
|
+
}
|
|
1382
|
+
});
|
|
1383
|
+
return;
|
|
1384
|
+
}
|
|
1385
|
+
for (const [dep, version] of Object.entries(options[type])) {
|
|
1386
|
+
if (((_a = packageJson[type]) == null ? void 0 : _a[dep]) !== version) {
|
|
1387
|
+
context.addError({
|
|
1388
|
+
file: packageJsonPath,
|
|
1389
|
+
message: `Expected dependency ${dep}@${version}`,
|
|
1390
|
+
longMessage: diff7(
|
|
1391
|
+
`${dep}@${version}
|
|
1392
|
+
`,
|
|
1393
|
+
`${dep}@${packageJson[type][dep] || "missing"}
|
|
1394
|
+
`
|
|
1395
|
+
),
|
|
1396
|
+
fixer: () => {
|
|
1397
|
+
mutateJson5(
|
|
1398
|
+
packageJsonPath,
|
|
1399
|
+
context.host,
|
|
1400
|
+
(input) => {
|
|
1401
|
+
if (version === void 0) {
|
|
1402
|
+
input[type] = { ...input[type] };
|
|
1403
|
+
delete input[type][dep];
|
|
1404
|
+
} else {
|
|
1405
|
+
input[type] = { ...input[type], [dep]: version };
|
|
1406
|
+
}
|
|
1407
|
+
return input;
|
|
1408
|
+
}
|
|
1409
|
+
);
|
|
1410
|
+
}
|
|
1411
|
+
});
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
});
|
|
1415
|
+
},
|
|
1416
|
+
validateOptions: Options10.check
|
|
1187
1417
|
});
|
|
1188
1418
|
|
|
1189
1419
|
// src/standardTsconfig.ts
|
|
1190
1420
|
import { matchesAnyGlob as matchesAnyGlob2 } from "@monorepolint/utils";
|
|
1191
|
-
import { diff as
|
|
1192
|
-
import * as
|
|
1193
|
-
import * as
|
|
1421
|
+
import { diff as diff8 } from "jest-diff";
|
|
1422
|
+
import * as path6 from "path";
|
|
1423
|
+
import * as r11 from "runtypes";
|
|
1194
1424
|
var DEFAULT_TSCONFIG_FILENAME = "tsconfig.json";
|
|
1195
|
-
var
|
|
1196
|
-
file:
|
|
1197
|
-
generator:
|
|
1198
|
-
tsconfigReferenceFile:
|
|
1199
|
-
template:
|
|
1200
|
-
templateFile:
|
|
1201
|
-
excludedReferences:
|
|
1202
|
-
additionalReferences:
|
|
1425
|
+
var Options11 = r11.Partial({
|
|
1426
|
+
file: r11.String,
|
|
1427
|
+
generator: r11.Function,
|
|
1428
|
+
tsconfigReferenceFile: r11.String,
|
|
1429
|
+
template: r11.Record({}).Or(r11.String),
|
|
1430
|
+
templateFile: r11.String,
|
|
1431
|
+
excludedReferences: r11.Array(r11.String).Or(r11.Undefined),
|
|
1432
|
+
additionalReferences: r11.Array(r11.String).Or(r11.Undefined)
|
|
1203
1433
|
}).withConstraint(({ generator, template, templateFile }) => {
|
|
1204
1434
|
let count = 0;
|
|
1205
1435
|
if (generator) {
|
|
@@ -1217,7 +1447,7 @@ var standardTsconfig = createRuleFactory({
|
|
|
1217
1447
|
name: "standardTsconfig",
|
|
1218
1448
|
check: async (context, opts) => {
|
|
1219
1449
|
const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;
|
|
1220
|
-
const fullPath =
|
|
1450
|
+
const fullPath = path6.resolve(context.packageDir, tsconfigFileName);
|
|
1221
1451
|
const generator = getGenerator(context, opts);
|
|
1222
1452
|
const expectedContent = await generator(context);
|
|
1223
1453
|
const actualContent = context.host.exists(fullPath) ? context.host.readFile(fullPath, { encoding: "utf-8" }) : void 0;
|
|
@@ -1232,7 +1462,7 @@ var standardTsconfig = createRuleFactory({
|
|
|
1232
1462
|
context.addError({
|
|
1233
1463
|
file: fullPath,
|
|
1234
1464
|
message: "Expect file contents to match",
|
|
1235
|
-
longMessage:
|
|
1465
|
+
longMessage: diff8(expectedContent, actualContent, { expand: true }),
|
|
1236
1466
|
fixer: () => {
|
|
1237
1467
|
context.host.writeFile(fullPath, expectedContent, {
|
|
1238
1468
|
encoding: "utf-8"
|
|
@@ -1241,18 +1471,30 @@ var standardTsconfig = createRuleFactory({
|
|
|
1241
1471
|
});
|
|
1242
1472
|
}
|
|
1243
1473
|
},
|
|
1244
|
-
validateOptions:
|
|
1474
|
+
validateOptions: Options11.check
|
|
1245
1475
|
});
|
|
1246
1476
|
function getGenerator(context, opts) {
|
|
1247
1477
|
if (opts.generator) {
|
|
1248
1478
|
return opts.generator;
|
|
1249
1479
|
} else if (opts.templateFile) {
|
|
1250
1480
|
const { packageDir: workspacePackageDir } = context.getWorkspaceContext();
|
|
1251
|
-
const fullPath =
|
|
1252
|
-
const template = JSON.parse(
|
|
1253
|
-
|
|
1481
|
+
const fullPath = path6.resolve(workspacePackageDir, opts.templateFile);
|
|
1482
|
+
const template = JSON.parse(
|
|
1483
|
+
context.host.readFile(fullPath, { encoding: "utf-8" })
|
|
1484
|
+
);
|
|
1485
|
+
return makeGenerator(
|
|
1486
|
+
template,
|
|
1487
|
+
opts.excludedReferences,
|
|
1488
|
+
opts.additionalReferences,
|
|
1489
|
+
opts.tsconfigReferenceFile
|
|
1490
|
+
);
|
|
1254
1491
|
} else if (opts.template) {
|
|
1255
|
-
return makeGenerator(
|
|
1492
|
+
return makeGenerator(
|
|
1493
|
+
opts.template,
|
|
1494
|
+
opts.excludedReferences,
|
|
1495
|
+
opts.additionalReferences,
|
|
1496
|
+
opts.tsconfigReferenceFile
|
|
1497
|
+
);
|
|
1256
1498
|
} else {
|
|
1257
1499
|
throw new Error("Unable to make generator");
|
|
1258
1500
|
}
|
|
@@ -1265,13 +1507,16 @@ function makeGenerator(template, excludedReferences, additionalReferences, tscon
|
|
|
1265
1507
|
};
|
|
1266
1508
|
const nameToDirectory = await context.getWorkspaceContext().getPackageNameToDir();
|
|
1267
1509
|
const packageJson = context.getPackageJson();
|
|
1268
|
-
const deps = [
|
|
1510
|
+
const deps = [
|
|
1511
|
+
...Object.keys(packageJson.dependencies || {}),
|
|
1512
|
+
...Object.keys(packageJson.devDependencies || {})
|
|
1513
|
+
];
|
|
1269
1514
|
for (const dep of deps) {
|
|
1270
1515
|
const packageDir = nameToDirectory.get(dep);
|
|
1271
1516
|
if (packageDir !== void 0 && (excludedReferences === void 0 || !matchesAnyGlob2(dep, excludedReferences))) {
|
|
1272
|
-
const absoluteReferencePath = tsconfigReferenceFile !== void 0 ?
|
|
1517
|
+
const absoluteReferencePath = tsconfigReferenceFile !== void 0 ? path6.join(packageDir, tsconfigReferenceFile) : packageDir;
|
|
1273
1518
|
template.references.push({
|
|
1274
|
-
path:
|
|
1519
|
+
path: path6.relative(context.packageDir, absoluteReferencePath)
|
|
1275
1520
|
});
|
|
1276
1521
|
}
|
|
1277
1522
|
}
|
|
@@ -1285,98 +1530,6 @@ function makeGenerator(template, excludedReferences, additionalReferences, tscon
|
|
|
1285
1530
|
return JSON.stringify(template, void 0, 2) + "\n";
|
|
1286
1531
|
};
|
|
1287
1532
|
}
|
|
1288
|
-
|
|
1289
|
-
// src/nestedWorkspaces.ts
|
|
1290
|
-
import * as globby from "globby";
|
|
1291
|
-
import * as path6 from "node:path";
|
|
1292
|
-
import * as r10 from "runtypes";
|
|
1293
|
-
var Options10 = r10.Undefined;
|
|
1294
|
-
var nestedWorkspaces = createRuleFactory({
|
|
1295
|
-
name: "nestedWorkspaces",
|
|
1296
|
-
check: (context) => {
|
|
1297
|
-
const rootPackageJson = context.getWorkspaceContext().getPackageJson();
|
|
1298
|
-
const packageJsonPaths = globby.globbySync(["*/**/package.json", "!**/node_modules/**"]);
|
|
1299
|
-
const workspaces = Array.isArray(rootPackageJson.workspaces) ? rootPackageJson.workspaces : rootPackageJson.workspaces !== void 0 ? rootPackageJson.workspaces.packages : void 0;
|
|
1300
|
-
if (workspaces === void 0 && packageJsonPaths.length > 0) {
|
|
1301
|
-
context.addError({
|
|
1302
|
-
file: context.getPackageJsonPath(),
|
|
1303
|
-
message: 'The "workspace" field is missing, even though there are workspaces in the repository.'
|
|
1304
|
-
});
|
|
1305
|
-
return;
|
|
1306
|
-
}
|
|
1307
|
-
const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);
|
|
1308
|
-
const expandedWorkspacesGlobs = globby.globbySync([...workspacePackageJsons, "!**/node_modules/**"]);
|
|
1309
|
-
const difference = packageJsonPaths.filter((packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath));
|
|
1310
|
-
if (difference.length !== 0) {
|
|
1311
|
-
const differencesList = difference.map((packageJsonPath) => path6.dirname(packageJsonPath)).join(", ");
|
|
1312
|
-
context.addError({
|
|
1313
|
-
file: context.getPackageJsonPath(),
|
|
1314
|
-
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/*".`
|
|
1315
|
-
});
|
|
1316
|
-
}
|
|
1317
|
-
},
|
|
1318
|
-
validateOptions: Options10.check
|
|
1319
|
-
});
|
|
1320
|
-
|
|
1321
|
-
// src/requireDependency.ts
|
|
1322
|
-
import { mutateJson as mutateJson5 } from "@monorepolint/utils";
|
|
1323
|
-
import { diff as diff8 } from "jest-diff";
|
|
1324
|
-
import * as r11 from "runtypes";
|
|
1325
|
-
var Options11 = r11.Partial({
|
|
1326
|
-
dependencies: r11.Dictionary(r11.String),
|
|
1327
|
-
devDependencies: r11.Dictionary(r11.String),
|
|
1328
|
-
peerDependencies: r11.Dictionary(r11.String),
|
|
1329
|
-
optionalDependencies: r11.Dictionary(r11.String)
|
|
1330
|
-
});
|
|
1331
|
-
var requireDependency = createRuleFactory({
|
|
1332
|
-
name: "requireDependency",
|
|
1333
|
-
check: function expectPackageEntry(context, options) {
|
|
1334
|
-
const packageJson = context.getPackageJson();
|
|
1335
|
-
const packageJsonPath = context.getPackageJsonPath();
|
|
1336
|
-
[
|
|
1337
|
-
"dependencies",
|
|
1338
|
-
"devDependencies",
|
|
1339
|
-
"peerDependencies",
|
|
1340
|
-
"optionalDependencies"
|
|
1341
|
-
].forEach((type) => {
|
|
1342
|
-
var _a;
|
|
1343
|
-
if (!options[type]) {
|
|
1344
|
-
return;
|
|
1345
|
-
}
|
|
1346
|
-
if (packageJson[type] === void 0) {
|
|
1347
|
-
context.addError({
|
|
1348
|
-
file: packageJsonPath,
|
|
1349
|
-
message: `No ${type} block, cannot add required ${type}.`,
|
|
1350
|
-
fixer: () => {
|
|
1351
|
-
mutateJson5(packageJsonPath, context.host, (input) => {
|
|
1352
|
-
input[type] = options[type];
|
|
1353
|
-
return input;
|
|
1354
|
-
});
|
|
1355
|
-
}
|
|
1356
|
-
});
|
|
1357
|
-
return;
|
|
1358
|
-
}
|
|
1359
|
-
for (const [dep, version] of Object.entries(options[type])) {
|
|
1360
|
-
if (((_a = packageJson[type]) == null ? void 0 : _a[dep]) !== version) {
|
|
1361
|
-
context.addError({
|
|
1362
|
-
file: packageJsonPath,
|
|
1363
|
-
message: `Expected dependency ${dep}@${version}`,
|
|
1364
|
-
longMessage: diff8(`${dep}@${version}
|
|
1365
|
-
`, `${dep}@${packageJson[type][dep] || "missing"}
|
|
1366
|
-
`),
|
|
1367
|
-
fixer: () => {
|
|
1368
|
-
mutateJson5(packageJsonPath, context.host, (input) => {
|
|
1369
|
-
input[type] = { ...input[type], [dep]: version };
|
|
1370
|
-
return input;
|
|
1371
|
-
});
|
|
1372
|
-
}
|
|
1373
|
-
});
|
|
1374
|
-
}
|
|
1375
|
-
}
|
|
1376
|
-
});
|
|
1377
|
-
},
|
|
1378
|
-
validateOptions: Options11.check
|
|
1379
|
-
});
|
|
1380
1533
|
export {
|
|
1381
1534
|
alphabeticalDependencies,
|
|
1382
1535
|
alphabeticalScripts,
|