@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.
Files changed (77) hide show
  1. package/.turbo/turbo-clean.log +1 -1
  2. package/.turbo/turbo-compile-typescript.log +1 -1
  3. package/.turbo/turbo-lint.log +1 -1
  4. package/.turbo/turbo-test.log +160 -100
  5. package/.turbo/turbo-transpile-typescript.log +4 -4
  6. package/CHANGELOG.md +9 -0
  7. package/build/js/index.js +399 -246
  8. package/build/js/index.js.map +1 -1
  9. package/build/tsconfig.tsbuildinfo +1 -1
  10. package/build/types/__tests__/utils.d.ts +0 -1
  11. package/build/types/__tests__/utils.d.ts.map +1 -1
  12. package/build/types/bannedDependencies.d.ts.map +1 -1
  13. package/build/types/fileContents.d.ts.map +1 -1
  14. package/build/types/index.d.ts +3 -3
  15. package/build/types/index.d.ts.map +1 -1
  16. package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -1
  17. package/build/types/nestedWorkspaces.d.ts.map +1 -1
  18. package/build/types/packageEntry.d.ts.map +1 -1
  19. package/build/types/packageOrder.d.ts.map +1 -1
  20. package/build/types/packageScript.d.ts.map +1 -1
  21. package/build/types/requireDependency.d.ts +12 -12
  22. package/build/types/requireDependency.d.ts.map +1 -1
  23. package/build/types/util/checkAlpha.d.ts.map +1 -1
  24. package/build/types/util/createRuleFactory.d.ts.map +1 -1
  25. package/build/types/util/packageDependencyGraphService.d.ts.map +1 -1
  26. package/coverage/clover.xml +1159 -818
  27. package/coverage/coverage-final.json +18 -18
  28. package/coverage/index.html +20 -20
  29. package/coverage/src/alphabeticalDependencies.ts.html +8 -8
  30. package/coverage/src/alphabeticalScripts.ts.html +5 -5
  31. package/coverage/src/bannedDependencies.ts.html +77 -26
  32. package/coverage/src/consistentDependencies.ts.html +58 -19
  33. package/coverage/src/consistentVersions.ts.html +169 -58
  34. package/coverage/src/fileContents.ts.html +47 -23
  35. package/coverage/src/index.html +67 -67
  36. package/coverage/src/index.ts.html +32 -32
  37. package/coverage/src/mustSatisfyPeerDependencies.ts.html +373 -85
  38. package/coverage/src/nestedWorkspaces.ts.html +59 -20
  39. package/coverage/src/packageEntry.ts.html +40 -19
  40. package/coverage/src/packageOrder.ts.html +30 -12
  41. package/coverage/src/packageScript.ts.html +81 -27
  42. package/coverage/src/requireDependency.ts.html +83 -32
  43. package/coverage/src/standardTsconfig.ts.html +81 -18
  44. package/coverage/src/util/checkAlpha.ts.html +18 -9
  45. package/coverage/src/util/createRuleFactory.ts.html +16 -4
  46. package/coverage/src/util/index.html +17 -17
  47. package/coverage/src/util/makeDirectory.ts.html +5 -5
  48. package/coverage/src/util/packageDependencyGraphService.ts.html +101 -20
  49. package/package.json +4 -5
  50. package/src/__tests__/alphabeticalScripts.spec.ts +12 -4
  51. package/src/__tests__/bannedDependencies.spec.ts +45 -16
  52. package/src/__tests__/consistentDependencies.spec.ts +11 -5
  53. package/src/__tests__/consistentVersions.spec.ts +72 -18
  54. package/src/__tests__/fileContents.spec.ts +9 -5
  55. package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +191 -76
  56. package/src/__tests__/nestedWorkspaces.spec.ts +10 -6
  57. package/src/__tests__/packageEntry.spec.ts +54 -48
  58. package/src/__tests__/packageOrder.spec.ts +77 -71
  59. package/src/__tests__/packageScript.spec.ts +25 -11
  60. package/src/__tests__/requireDependency.spec.ts +12 -6
  61. package/src/__tests__/utils.ts +16 -7
  62. package/src/bannedDependencies.ts +32 -15
  63. package/src/consistentDependencies.ts +22 -9
  64. package/src/consistentVersions.ts +84 -47
  65. package/src/fileContents.ts +19 -11
  66. package/src/index.ts +3 -3
  67. package/src/mustSatisfyPeerDependencies.ts +162 -66
  68. package/src/nestedWorkspaces.ts +23 -10
  69. package/src/packageEntry.ts +18 -11
  70. package/src/packageOrder.ts +9 -3
  71. package/src/packageScript.ts +37 -19
  72. package/src/requireDependency.ts +28 -11
  73. package/src/standardTsconfig.ts +31 -10
  74. package/src/util/checkAlpha.ts +5 -2
  75. package/src/util/createRuleFactory.ts +6 -2
  76. package/src/util/packageDependencyGraphService.ts +41 -14
  77. 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(dependency, node.paths.rootDirectory);
116
+ const dependencyPackageJsonPath = resolvePackagePath(
117
+ dependency,
118
+ node.paths.rootDirectory
119
+ );
117
120
  if (dependencyPackageJsonPath == null) {
118
- throw new Error(`Could not resolve ${dependency} from ${node.paths.rootDirectory}`);
121
+ throw new Error(
122
+ `Could not resolve ${dependency} from ${node.paths.rootDirectory}`
123
+ );
119
124
  }
120
- node.dependencies.set(dependency, visit(dependencyPackageJsonPath, nextDepth));
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 { bannedDependencies: banned, bannedTransitiveDependencies: transitives } = opts;
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(path2.resolve(context.getPackageJsonPath()), context.host);
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 = [...importPathWithoutRoot.map(nameOrPackageJsonPath), dependency].join(" -> ");
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(([key]) => !keysToOmit.includes(key));
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(context, dependencyPackageName, expectedPackageDependencyValue);
353
+ ensurePackageMatchesSomeVersion(
354
+ context,
355
+ dependencyPackageName,
356
+ expectedPackageDependencyValue
357
+ );
335
358
  } else {
336
- ensurePackageIsCorrectVersion(context, dependencyPackageName, expectedPackageDependencyValue);
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(expectedPackageDependencyValue);
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(actualPackageDevDependencyValue);
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(acceptedPackageDependencyValue);
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(actualPackageDevDependencyValue);
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, { encoding: "utf-8" });
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 { dependencyBlacklist, dependencyWhitelist, enforceForDevDependencies, skipUnparseableRanges } = opts;
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(packagePeerDependencies)) {
653
- if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {
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 ? [...Object.keys(packageDependencies), ...Object.keys(packageDevDependencies)] : Object.keys(packageDependencies);
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(dependency, path4.dirname(packageJsonPath));
719
+ const dependencyPackageJsonPath = resolvePackagePath2(
720
+ dependency,
721
+ path4.dirname(packageJsonPath)
722
+ );
669
723
  if (dependencyPackageJsonPath == null) {
670
- throw new Error(`Could not resolve ${dependency} from ${path4.dirname(packageJsonPath)}`);
724
+ throw new Error(
725
+ `Could not resolve ${dependency} from ${path4.dirname(packageJsonPath)}`
726
+ );
671
727
  }
672
- const dependencyPackageJson = context.host.readJson(dependencyPackageJsonPath);
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(requiredPeerDependencies)) {
678
- if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {
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({ fromPackageName: dependencyPackageJson.name, range });
756
+ allRequiredPeerDependencies[peerDependencyName].push({
757
+ fromPackageName: dependencyPackageJson.name,
758
+ range
759
+ });
693
760
  }
694
761
  }
695
- for (const [peerDependencyName, peerDependencyRequirements] of Object.entries(allRequiredPeerDependencies)) {
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(peerRequirement.range, mostStrictPeerRequirement.range);
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(packagePeerDependencyRange, mostStrictPeerRequirement.range)) {
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((peerDependencyRequirement) => peerDependencyRequirement.fromPackageName).join(", ");
801
- const dependencyRequirements = mostStrictPeerRequirement.fromPeerDependencyRequirements.map((peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`).join(", ");
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((m) => coerce2(m).major === aSemVer.major);
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(aVersion, majorMatchingBVersion)) {
936
+ if (doesASatisfyB(
937
+ aVersion,
938
+ majorMatchingBVersion
939
+ )) {
856
940
  return aVersion;
857
- } else if (doesASatisfyB(majorMatchingBVersion, aVersion)) {
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((m) => coerce2(m).major === aSemVer.major);
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(majorMatchingBVersion);
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/packageOrder.ts
947
- import { diff as diff4 } from "jest-diff";
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.Record({
950
- order: r6.Union(r6.Array(r6.String), r6.Function)
951
- }).Or(r6.Undefined);
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: diff4(expectedOrder, actualOrder, { expand: true }),
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: Options6.check
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 r8 from "runtypes";
1112
- var Options8 = r8.Record({
1113
- scripts: r8.Dictionary(
1114
- r8.Union(
1115
- r8.String,
1116
- r8.Record({
1117
- options: r8.Array(r8.String.Or(r8.Undefined)),
1118
- fixValue: r8.Union(r8.String, r8.Undefined, r8.Literal(false)).optional()
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(context.getPackageJsonPath(), context.host, (input) => {
1135
- input.scripts = {};
1136
- return input;
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(context.getPackageJsonPath(), context.host, (input) => {
1167
- if (fixToEmpty && q === void 0) {
1168
- delete input.scripts[name];
1169
- } else {
1170
- input.scripts[name] = q;
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
- return input;
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(validOptionsString + "\n", (packageJson.scripts[name] || "") + "\n"),
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: Options8.check
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 diff7 } from "jest-diff";
1192
- import * as path5 from "path";
1193
- import * as r9 from "runtypes";
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 Options9 = r9.Partial({
1196
- file: r9.String,
1197
- generator: r9.Function,
1198
- tsconfigReferenceFile: r9.String,
1199
- template: r9.Record({}).Or(r9.String),
1200
- templateFile: r9.String,
1201
- excludedReferences: r9.Array(r9.String).Or(r9.Undefined),
1202
- additionalReferences: r9.Array(r9.String).Or(r9.Undefined)
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 = path5.resolve(context.packageDir, tsconfigFileName);
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: diff7(expectedContent, actualContent, { expand: true }),
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: Options9.check
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 = path5.resolve(workspacePackageDir, opts.templateFile);
1252
- const template = JSON.parse(context.host.readFile(fullPath, { encoding: "utf-8" }));
1253
- return makeGenerator(template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);
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(opts.template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);
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 = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {})];
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 ? path5.join(packageDir, tsconfigReferenceFile) : packageDir;
1517
+ const absoluteReferencePath = tsconfigReferenceFile !== void 0 ? path6.join(packageDir, tsconfigReferenceFile) : packageDir;
1273
1518
  template.references.push({
1274
- path: path5.relative(context.packageDir, absoluteReferencePath)
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,