@monorepolint/rules 0.6.0-alpha.3 → 0.6.0-alpha.4

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 (62) 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 +73 -74
  5. package/.turbo/turbo-transpile-typescript.log +4 -4
  6. package/CHANGELOG.md +10 -0
  7. package/build/js/index.js +104 -69
  8. package/build/js/index.js.map +1 -1
  9. package/build/tsconfig.tsbuildinfo +1 -1
  10. package/build/types/bannedDependencies.d.ts.map +1 -1
  11. package/build/types/forceError.d.ts +4 -0
  12. package/build/types/forceError.d.ts.map +1 -0
  13. package/build/types/index.d.ts +2 -0
  14. package/build/types/index.d.ts.map +1 -1
  15. package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -1
  16. package/build/types/nestedWorkspaces.d.ts.map +1 -1
  17. package/build/types/oncePerPackage.d.ts +11 -0
  18. package/build/types/oncePerPackage.d.ts.map +1 -0
  19. package/build/types/requireDependency.d.ts.map +1 -1
  20. package/build/types/util/packageDependencyGraphService.d.ts.map +1 -1
  21. package/coverage/clover.xml +516 -469
  22. package/coverage/coverage-final.json +12 -10
  23. package/coverage/index.html +15 -15
  24. package/coverage/src/alphabeticalDependencies.ts.html +6 -6
  25. package/coverage/src/alphabeticalScripts.ts.html +1 -1
  26. package/coverage/src/bannedDependencies.ts.html +7 -10
  27. package/coverage/src/consistentDependencies.ts.html +7 -13
  28. package/coverage/src/consistentVersions.ts.html +31 -46
  29. package/coverage/src/fileContents.ts.html +1 -1
  30. package/coverage/src/forceError.ts.html +184 -0
  31. package/coverage/src/index.html +73 -43
  32. package/coverage/src/index.ts.html +10 -4
  33. package/coverage/src/mustSatisfyPeerDependencies.ts.html +16 -61
  34. package/coverage/src/nestedWorkspaces.ts.html +10 -22
  35. package/coverage/src/oncePerPackage.ts.html +181 -0
  36. package/coverage/src/packageEntry.ts.html +1 -1
  37. package/coverage/src/packageOrder.ts.html +1 -1
  38. package/coverage/src/packageScript.ts.html +1 -1
  39. package/coverage/src/requireDependency.ts.html +7 -13
  40. package/coverage/src/standardTsconfig.ts.html +6 -6
  41. package/coverage/src/util/checkAlpha.ts.html +1 -1
  42. package/coverage/src/util/createRuleFactory.ts.html +1 -1
  43. package/coverage/src/util/index.html +10 -10
  44. package/coverage/src/util/makeDirectory.ts.html +1 -1
  45. package/coverage/src/util/packageDependencyGraphService.ts.html +7 -13
  46. package/package.json +4 -4
  47. package/src/__tests__/fileContents.spec.ts +1 -5
  48. package/src/__tests__/nestedWorkspaces.spec.ts +1 -2
  49. package/src/__tests__/packageEntry.spec.ts +1 -6
  50. package/src/__tests__/packageOrder.spec.ts +1 -6
  51. package/src/__tests__/packageScript.spec.ts +1 -6
  52. package/src/bannedDependencies.ts +1 -2
  53. package/src/consistentDependencies.ts +1 -3
  54. package/src/consistentVersions.ts +24 -29
  55. package/src/forceError.ts +33 -0
  56. package/src/index.ts +2 -0
  57. package/src/mustSatisfyPeerDependencies.ts +10 -25
  58. package/src/nestedWorkspaces.ts +4 -8
  59. package/src/oncePerPackage.ts +32 -0
  60. package/src/requireDependency.ts +1 -3
  61. package/src/util/packageDependencyGraphService.ts +1 -3
  62. package/vitest.config.mjs +1 -5
package/build/js/index.js CHANGED
@@ -324,9 +324,7 @@ function filterKeys(ob, filterOb) {
324
324
  }
325
325
  function omit(obj, keysToOmit) {
326
326
  const newObj = {};
327
- const filtered = Object.entries(obj).filter(
328
- ([key]) => !keysToOmit.includes(key)
329
- );
327
+ const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));
330
328
  for (const [key, value] of filtered) {
331
329
  newObj[key] = value;
332
330
  }
@@ -523,6 +521,31 @@ async function getExpectedContents(context, opts) {
523
521
  }
524
522
  }
525
523
 
524
+ // src/forceError.ts
525
+ var forceError = createRuleFactory({
526
+ name: "forceError",
527
+ check: async (context, opts) => {
528
+ context.addError({
529
+ message: (opts == null ? void 0 : opts.customMessage) ?? "Forced error (often used to debug package selection)",
530
+ file: context.getPackageJsonPath()
531
+ });
532
+ },
533
+ validateOptions: (opts) => {
534
+ if (opts == null) return;
535
+ if (typeof opts !== "object") {
536
+ throw new Error("options must be an object if provided");
537
+ }
538
+ const numKeys = Object.keys(opts).length;
539
+ if (numKeys === 0) return;
540
+ if (Object.keys(opts).length > 1 || !("customMessage" in opts)) {
541
+ throw new Error("options must only have `customMessage` property");
542
+ }
543
+ if (typeof opts.customMessage !== "string") {
544
+ throw new Error("customMessage must be a string");
545
+ }
546
+ }
547
+ });
548
+
526
549
  // src/mustSatisfyPeerDependencies.ts
527
550
  import { mutateJson as mutateJson2 } from "@monorepolint/utils";
528
551
  import * as path4 from "node:path";
@@ -872,12 +895,8 @@ function getMostStrictStatement(mostStrictPeerRequirement) {
872
895
  const dependencyName = mostStrictPeerRequirement.fromPeerDependencyRequirements[0].fromPackageName;
873
896
  return `Dependency ${dependencyName} requires '${mostStrictPeerRequirement.range}'.`;
874
897
  } else {
875
- const dependencyNames = mostStrictPeerRequirement.fromPeerDependencyRequirements.map(
876
- (peerDependencyRequirement) => peerDependencyRequirement.fromPackageName
877
- ).join(", ");
878
- const dependencyRequirements = mostStrictPeerRequirement.fromPeerDependencyRequirements.map(
879
- (peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`
880
- ).join(", ");
898
+ const dependencyNames = mostStrictPeerRequirement.fromPeerDependencyRequirements.map((peerDependencyRequirement) => peerDependencyRequirement.fromPackageName).join(", ");
899
+ const dependencyRequirements = mostStrictPeerRequirement.fromPeerDependencyRequirements.map((peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`).join(", ");
881
900
  return `Dependencies [${dependencyNames}] require [${dependencyRequirements}] respectively, resolving to '${mostStrictPeerRequirement.range}'.`;
882
901
  }
883
902
  }
@@ -927,9 +946,7 @@ function findIntersection(a, b) {
927
946
  }
928
947
  const compatibleVersions = aVersions.map((aVersion) => {
929
948
  const aSemVer = coerce2(aVersion);
930
- const majorMatchingBVersion = bVersions.find(
931
- (m) => coerce2(m).major === aSemVer.major
932
- );
949
+ const majorMatchingBVersion = bVersions.find((m) => coerce2(m).major === aSemVer.major);
933
950
  if (majorMatchingBVersion === void 0) {
934
951
  return void 0;
935
952
  }
@@ -982,9 +999,7 @@ function doesASatisfyB(a, b) {
982
999
  }
983
1000
  return aVersions.every((aVersion) => {
984
1001
  const aSemVer = coerce2(aVersion);
985
- const majorMatchingBVersion = bVersions.find(
986
- (m) => coerce2(m).major === aSemVer.major
987
- );
1002
+ const majorMatchingBVersion = bVersions.find((m) => coerce2(m).major === aSemVer.major);
988
1003
  if (majorMatchingBVersion === void 0) {
989
1004
  return false;
990
1005
  }
@@ -1055,9 +1070,7 @@ var nestedWorkspaces = createRuleFactory({
1055
1070
  });
1056
1071
  return;
1057
1072
  }
1058
- const workspacePackageJsons = (workspaces || []).map(
1059
- (item) => `${item}/package.json`
1060
- );
1073
+ const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);
1061
1074
  const expandedWorkspacesGlobs = globby.globbySync([
1062
1075
  ...workspacePackageJsons,
1063
1076
  "!**/node_modules/**"
@@ -1066,9 +1079,7 @@ var nestedWorkspaces = createRuleFactory({
1066
1079
  (packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath)
1067
1080
  );
1068
1081
  if (difference.length !== 0) {
1069
- const differencesList = difference.map(
1070
- (packageJsonPath) => path5.dirname(packageJsonPath)
1071
- ).join(", ");
1082
+ const differencesList = difference.map((packageJsonPath) => path5.dirname(packageJsonPath)).join(", ");
1072
1083
  context.addError({
1073
1084
  file: context.getPackageJsonPath(),
1074
1085
  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/*".`
@@ -1078,31 +1089,55 @@ var nestedWorkspaces = createRuleFactory({
1078
1089
  validateOptions: Options6.check
1079
1090
  });
1080
1091
 
1092
+ // src/oncePerPackage.ts
1093
+ import * as r7 from "runtypes";
1094
+ var Options7 = r7.Record({
1095
+ singletonKey: r7.String.Or(r7.Symbol),
1096
+ customMessage: r7.String.optional()
1097
+ });
1098
+ var visitedMap = /* @__PURE__ */ new Map();
1099
+ var oncePerPackage = createRuleFactory({
1100
+ name: "oncePerPackage",
1101
+ check: async (context, options) => {
1102
+ const visited = visitedMap.get(options.singletonKey) ?? /* @__PURE__ */ new Set();
1103
+ visitedMap.set(options.singletonKey, visited);
1104
+ if (visited.has(context.getName())) {
1105
+ context.addError({
1106
+ message: "This package has already been visited for this key: " + options.singletonKey.toString(),
1107
+ file: context.getPackageJsonPath()
1108
+ });
1109
+ } else {
1110
+ visited.add(context.getName());
1111
+ }
1112
+ },
1113
+ validateOptions: Options7.assert
1114
+ });
1115
+
1081
1116
  // src/packageEntry.ts
1082
1117
  import { mutateJson as mutateJson3 } from "@monorepolint/utils";
1083
1118
  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)
1119
+ import * as r8 from "runtypes";
1120
+ var Options8 = r8.Union(
1121
+ r8.Record({
1122
+ entries: r8.Dictionary(r8.Unknown)
1088
1123
  // string => unknown, enforces existence of keys and their values
1089
1124
  }).And(
1090
- r7.Partial({
1091
- entriesExist: r7.Undefined
1125
+ r8.Partial({
1126
+ entriesExist: r8.Undefined
1092
1127
  })
1093
1128
  ),
1094
- r7.Record({
1095
- entriesExist: r7.Array(r7.String)
1129
+ r8.Record({
1130
+ entriesExist: r8.Array(r8.String)
1096
1131
  // enforces existence of keys, but not values
1097
1132
  }).And(
1098
- r7.Partial({
1099
- entries: r7.Undefined
1133
+ r8.Partial({
1134
+ entries: r8.Undefined
1100
1135
  })
1101
1136
  ),
1102
- r7.Record({
1103
- entries: r7.Dictionary(r7.Unknown),
1137
+ r8.Record({
1138
+ entries: r8.Dictionary(r8.Unknown),
1104
1139
  // string => unknown, enforces existence of keys and their values
1105
- entriesExist: r7.Array(r7.String)
1140
+ entriesExist: r8.Array(r8.String)
1106
1141
  })
1107
1142
  );
1108
1143
  var packageEntry = createRuleFactory({
@@ -1146,7 +1181,7 @@ var packageEntry = createRuleFactory({
1146
1181
  }
1147
1182
  }
1148
1183
  },
1149
- validateOptions: Options7.check
1184
+ validateOptions: Options8.check
1150
1185
  });
1151
1186
  function createStandardizedEntryErrorMessage(key) {
1152
1187
  return `Expected standardized entry for '${key}'`;
@@ -1157,10 +1192,10 @@ function createExpectedEntryErrorMessage(key) {
1157
1192
 
1158
1193
  // src/packageOrder.ts
1159
1194
  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);
1195
+ import * as r9 from "runtypes";
1196
+ var Options9 = r9.Record({
1197
+ order: r9.Union(r9.Array(r9.String), r9.Function)
1198
+ }).Or(r9.Undefined);
1164
1199
  var defaultKeyOrder = [
1165
1200
  "name",
1166
1201
  "version",
@@ -1216,7 +1251,7 @@ var packageOrder = createRuleFactory({
1216
1251
  });
1217
1252
  }
1218
1253
  },
1219
- validateOptions: Options8.check
1254
+ validateOptions: Options9.check
1220
1255
  });
1221
1256
  function arrayOrderCompare2(a, b) {
1222
1257
  for (let index = 0; index < a.length; index++) {
@@ -1250,14 +1285,14 @@ function isOrderFunction(order) {
1250
1285
  // src/packageScript.ts
1251
1286
  import { mutateJson as mutateJson4 } from "@monorepolint/utils";
1252
1287
  import { diff as diff6 } from "jest-diff";
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()
1288
+ import * as r10 from "runtypes";
1289
+ var Options10 = r10.Record({
1290
+ scripts: r10.Dictionary(
1291
+ r10.Union(
1292
+ r10.String,
1293
+ r10.Record({
1294
+ options: r10.Array(r10.String.Or(r10.Undefined)),
1295
+ fixValue: r10.Union(r10.String, r10.Undefined, r10.Literal(false)).optional()
1261
1296
  })
1262
1297
  )
1263
1298
  )
@@ -1336,18 +1371,18 @@ var packageScript = createRuleFactory({
1336
1371
  }
1337
1372
  }
1338
1373
  },
1339
- validateOptions: Options9.check
1374
+ validateOptions: Options10.check
1340
1375
  });
1341
1376
 
1342
1377
  // src/requireDependency.ts
1343
1378
  import { mutateJson as mutateJson5 } from "@monorepolint/utils";
1344
1379
  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())
1380
+ import * as r11 from "runtypes";
1381
+ var Options11 = r11.Partial({
1382
+ dependencies: r11.Dictionary(r11.String.optional()),
1383
+ devDependencies: r11.Dictionary(r11.String.optional()),
1384
+ peerDependencies: r11.Dictionary(r11.String.optional()),
1385
+ optionalDependencies: r11.Dictionary(r11.String.optional())
1351
1386
  });
1352
1387
  var requireDependency = createRuleFactory({
1353
1388
  name: "requireDependency",
@@ -1372,9 +1407,7 @@ var requireDependency = createRuleFactory({
1372
1407
  fixer: () => {
1373
1408
  mutateJson5(packageJsonPath, context.host, (input) => {
1374
1409
  input[type] = Object.fromEntries(
1375
- Object.entries(expectedEntries).filter(
1376
- ([, v]) => v !== void 0
1377
- )
1410
+ Object.entries(expectedEntries).filter(([, v]) => v !== void 0)
1378
1411
  );
1379
1412
  return input;
1380
1413
  });
@@ -1413,23 +1446,23 @@ var requireDependency = createRuleFactory({
1413
1446
  }
1414
1447
  });
1415
1448
  },
1416
- validateOptions: Options10.check
1449
+ validateOptions: Options11.check
1417
1450
  });
1418
1451
 
1419
1452
  // src/standardTsconfig.ts
1420
1453
  import { matchesAnyGlob as matchesAnyGlob2 } from "@monorepolint/utils";
1421
1454
  import { diff as diff8 } from "jest-diff";
1422
1455
  import * as path6 from "path";
1423
- import * as r11 from "runtypes";
1456
+ import * as r12 from "runtypes";
1424
1457
  var DEFAULT_TSCONFIG_FILENAME = "tsconfig.json";
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)
1458
+ var Options12 = r12.Partial({
1459
+ file: r12.String,
1460
+ generator: r12.Function,
1461
+ tsconfigReferenceFile: r12.String,
1462
+ template: r12.Record({}).Or(r12.String),
1463
+ templateFile: r12.String,
1464
+ excludedReferences: r12.Array(r12.String).Or(r12.Undefined),
1465
+ additionalReferences: r12.Array(r12.String).Or(r12.Undefined)
1433
1466
  }).withConstraint(({ generator, template, templateFile }) => {
1434
1467
  let count = 0;
1435
1468
  if (generator) {
@@ -1471,7 +1504,7 @@ var standardTsconfig = createRuleFactory({
1471
1504
  });
1472
1505
  }
1473
1506
  },
1474
- validateOptions: Options11.check
1507
+ validateOptions: Options12.check
1475
1508
  });
1476
1509
  function getGenerator(context, opts) {
1477
1510
  if (opts.generator) {
@@ -1538,8 +1571,10 @@ export {
1538
1571
  consistentVersions,
1539
1572
  createRuleFactory,
1540
1573
  fileContents,
1574
+ forceError,
1541
1575
  mustSatisfyPeerDependencies,
1542
1576
  nestedWorkspaces,
1577
+ oncePerPackage,
1543
1578
  packageEntry,
1544
1579
  packageOrder,
1545
1580
  packageScript,