@monorepolint/rules 0.5.0-alpha.98 → 0.5.0-beta.0

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 (156) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/package.json +47 -26
  3. package/src/__tests__/alphabeticalScripts.spec.ts +6 -5
  4. package/src/__tests__/bannedDependencies.spec.ts +5 -7
  5. package/src/__tests__/consistentDependencies.spec.ts +6 -5
  6. package/src/__tests__/consistentVersions.spec.ts +5 -4
  7. package/src/__tests__/fileContents.spec.ts +44 -17
  8. package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +39 -38
  9. package/src/__tests__/nestedWorkspaces.spec.ts +5 -4
  10. package/src/__tests__/packageEntry.spec.ts +43 -32
  11. package/src/__tests__/packageOrder.spec.ts +23 -14
  12. package/src/__tests__/packageScript.spec.ts +61 -43
  13. package/src/__tests__/requireDependency.spec.ts +8 -7
  14. package/src/__tests__/utils.ts +8 -4
  15. package/src/alphabeticalDependencies.ts +7 -12
  16. package/src/alphabeticalScripts.ts +7 -12
  17. package/src/bannedDependencies.ts +9 -12
  18. package/src/consistentDependencies.ts +9 -10
  19. package/src/consistentVersions.ts +6 -8
  20. package/src/fileContents.ts +17 -16
  21. package/src/index.ts +13 -13
  22. package/src/mustSatisfyPeerDependencies.ts +16 -17
  23. package/src/nestedWorkspaces.ts +10 -12
  24. package/src/packageEntry.ts +7 -9
  25. package/src/packageOrder.ts +12 -10
  26. package/src/packageScript.ts +12 -19
  27. package/src/public/util.ts +1 -0
  28. package/src/requireDependency.ts +9 -10
  29. package/src/standardTsconfig.ts +10 -11
  30. package/src/util/checkAlpha.ts +1 -1
  31. package/src/util/makeRule.ts +29 -0
  32. package/src/util/packageDependencyGraphService.ts +2 -2
  33. package/tsconfig.json +7 -2
  34. package/lib/__tests__/alphabeticalScripts.spec.d.ts +0 -8
  35. package/lib/__tests__/alphabeticalScripts.spec.d.ts.map +0 -1
  36. package/lib/__tests__/alphabeticalScripts.spec.js +0 -61
  37. package/lib/__tests__/alphabeticalScripts.spec.js.map +0 -1
  38. package/lib/__tests__/bannedDependencies.spec.d.ts +0 -2
  39. package/lib/__tests__/bannedDependencies.spec.d.ts.map +0 -1
  40. package/lib/__tests__/bannedDependencies.spec.js +0 -161
  41. package/lib/__tests__/bannedDependencies.spec.js.map +0 -1
  42. package/lib/__tests__/consistentDependencies.spec.d.ts +0 -2
  43. package/lib/__tests__/consistentDependencies.spec.d.ts.map +0 -1
  44. package/lib/__tests__/consistentDependencies.spec.js +0 -115
  45. package/lib/__tests__/consistentDependencies.spec.js.map +0 -1
  46. package/lib/__tests__/consistentVersions.spec.d.ts +0 -8
  47. package/lib/__tests__/consistentVersions.spec.d.ts.map +0 -1
  48. package/lib/__tests__/consistentVersions.spec.js +0 -183
  49. package/lib/__tests__/consistentVersions.spec.js.map +0 -1
  50. package/lib/__tests__/fileContents.spec.d.ts +0 -8
  51. package/lib/__tests__/fileContents.spec.d.ts.map +0 -1
  52. package/lib/__tests__/fileContents.spec.js +0 -59
  53. package/lib/__tests__/fileContents.spec.js.map +0 -1
  54. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts +0 -8
  55. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts.map +0 -1
  56. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js +0 -1063
  57. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js.map +0 -1
  58. package/lib/__tests__/nestedWorkspaces.spec.d.ts +0 -2
  59. package/lib/__tests__/nestedWorkspaces.spec.d.ts.map +0 -1
  60. package/lib/__tests__/nestedWorkspaces.spec.js +0 -124
  61. package/lib/__tests__/nestedWorkspaces.spec.js.map +0 -1
  62. package/lib/__tests__/packageEntry.spec.d.ts +0 -8
  63. package/lib/__tests__/packageEntry.spec.d.ts.map +0 -1
  64. package/lib/__tests__/packageEntry.spec.js +0 -144
  65. package/lib/__tests__/packageEntry.spec.js.map +0 -1
  66. package/lib/__tests__/packageOrder.spec.d.ts +0 -8
  67. package/lib/__tests__/packageOrder.spec.d.ts.map +0 -1
  68. package/lib/__tests__/packageOrder.spec.js +0 -116
  69. package/lib/__tests__/packageOrder.spec.js.map +0 -1
  70. package/lib/__tests__/packageScript.spec.d.ts +0 -8
  71. package/lib/__tests__/packageScript.spec.d.ts.map +0 -1
  72. package/lib/__tests__/packageScript.spec.js +0 -171
  73. package/lib/__tests__/packageScript.spec.js.map +0 -1
  74. package/lib/__tests__/requireDependency.spec.d.ts +0 -2
  75. package/lib/__tests__/requireDependency.spec.d.ts.map +0 -1
  76. package/lib/__tests__/requireDependency.spec.js +0 -123
  77. package/lib/__tests__/requireDependency.spec.js.map +0 -1
  78. package/lib/__tests__/utils.d.ts +0 -76
  79. package/lib/__tests__/utils.d.ts.map +0 -1
  80. package/lib/__tests__/utils.js +0 -83
  81. package/lib/__tests__/utils.js.map +0 -1
  82. package/lib/alphabeticalDependencies.d.ts +0 -23
  83. package/lib/alphabeticalDependencies.d.ts.map +0 -1
  84. package/lib/alphabeticalDependencies.js +0 -24
  85. package/lib/alphabeticalDependencies.js.map +0 -1
  86. package/lib/alphabeticalScripts.d.ts +0 -23
  87. package/lib/alphabeticalScripts.d.ts.map +0 -1
  88. package/lib/alphabeticalScripts.js +0 -22
  89. package/lib/alphabeticalScripts.js.map +0 -1
  90. package/lib/bannedDependencies.d.ts +0 -134
  91. package/lib/bannedDependencies.d.ts.map +0 -1
  92. package/lib/bannedDependencies.js +0 -133
  93. package/lib/bannedDependencies.js.map +0 -1
  94. package/lib/consistentDependencies.d.ts +0 -38
  95. package/lib/consistentDependencies.d.ts.map +0 -1
  96. package/lib/consistentDependencies.js +0 -77
  97. package/lib/consistentDependencies.js.map +0 -1
  98. package/lib/consistentVersions.d.ts +0 -47
  99. package/lib/consistentVersions.d.ts.map +0 -1
  100. package/lib/consistentVersions.js +0 -96
  101. package/lib/consistentVersions.js.map +0 -1
  102. package/lib/fileContents.d.ts +0 -111
  103. package/lib/fileContents.d.ts.map +0 -1
  104. package/lib/fileContents.js +0 -84
  105. package/lib/fileContents.js.map +0 -1
  106. package/lib/index.d.ts +0 -20
  107. package/lib/index.d.ts.map +0 -1
  108. package/lib/index.js +0 -49
  109. package/lib/index.js.map +0 -1
  110. package/lib/mustSatisfyPeerDependencies.d.ts +0 -721
  111. package/lib/mustSatisfyPeerDependencies.d.ts.map +0 -1
  112. package/lib/mustSatisfyPeerDependencies.js +0 -638
  113. package/lib/mustSatisfyPeerDependencies.js.map +0 -1
  114. package/lib/nestedWorkspaces.d.ts +0 -24
  115. package/lib/nestedWorkspaces.d.ts.map +0 -1
  116. package/lib/nestedWorkspaces.js +0 -52
  117. package/lib/nestedWorkspaces.js.map +0 -1
  118. package/lib/packageEntry.d.ts +0 -115
  119. package/lib/packageEntry.d.ts.map +0 -1
  120. package/lib/packageEntry.js +0 -77
  121. package/lib/packageEntry.js.map +0 -1
  122. package/lib/packageOrder.d.ts +0 -33
  123. package/lib/packageOrder.d.ts.map +0 -1
  124. package/lib/packageOrder.js +0 -105
  125. package/lib/packageOrder.js.map +0 -1
  126. package/lib/packageScript.d.ts +0 -102
  127. package/lib/packageScript.d.ts.map +0 -1
  128. package/lib/packageScript.js +0 -92
  129. package/lib/packageScript.js.map +0 -1
  130. package/lib/requireDependency.d.ts +0 -99
  131. package/lib/requireDependency.d.ts.map +0 -1
  132. package/lib/requireDependency.js +0 -67
  133. package/lib/requireDependency.js.map +0 -1
  134. package/lib/standardTsconfig.d.ts +0 -113
  135. package/lib/standardTsconfig.d.ts.map +0 -1
  136. package/lib/standardTsconfig.js +0 -118
  137. package/lib/standardTsconfig.js.map +0 -1
  138. package/lib/util/checkAlpha.d.ts +0 -10
  139. package/lib/util/checkAlpha.d.ts.map +0 -1
  140. package/lib/util/checkAlpha.js +0 -51
  141. package/lib/util/checkAlpha.js.map +0 -1
  142. package/lib/util/createNewRuleConversion.d.ts +0 -30
  143. package/lib/util/createNewRuleConversion.d.ts.map +0 -1
  144. package/lib/util/createNewRuleConversion.js +0 -33
  145. package/lib/util/createNewRuleConversion.js.map +0 -1
  146. package/lib/util/makeDirectory.d.ts +0 -8
  147. package/lib/util/makeDirectory.d.ts.map +0 -1
  148. package/lib/util/makeDirectory.js +0 -28
  149. package/lib/util/makeDirectory.js.map +0 -1
  150. package/lib/util/packageDependencyGraphService.d.ts +0 -37
  151. package/lib/util/packageDependencyGraphService.d.ts.map +0 -1
  152. package/lib/util/packageDependencyGraphService.js +0 -70
  153. package/lib/util/packageDependencyGraphService.js.map +0 -1
  154. package/src/util/createNewRuleConversion.ts +0 -38
  155. package/tsconfig.tsbuildinfo +0 -1
  156. /package/{jest.config.js → jest.config.cjs} +0 -0
@@ -1,20 +1,19 @@
1
1
  /*!
2
- * Copyright 2019 Palantir Technologies, Inc.
2
+ * Copyright 2023 Palantir Technologies, Inc.
3
3
  *
4
4
  * Licensed under the MIT license. See LICENSE file in the project root for details.
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
9
- import diff from "jest-diff";
8
+ import { Context } from "@monorepolint/config";
9
+ import { diff } from "jest-diff";
10
10
  import * as path from "path";
11
11
  import * as r from "runtypes";
12
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
13
-
12
+ import { makeRule } from "./util/makeRule.js";
14
13
  const Options = r.Union(
15
14
  r.Record({
16
15
  file: r.String,
17
- generator: r.Function,
16
+ generator: r.Function.withGuard((x): x is (context: Context) => string | Promise<string> => x != undefined),
18
17
  template: r.Undefined.optional(),
19
18
  templateFile: r.Undefined.optional(),
20
19
  }),
@@ -36,10 +35,11 @@ const Options = r.Union(
36
35
 
37
36
  type Options = r.Static<typeof Options>;
38
37
 
39
- export const fileContents = {
40
- check: function expectFileContents(context: Context, opts: Options) {
38
+ export const fileContents = makeRule<Options>({
39
+ name: "fileContents",
40
+ check: async (context, opts) => {
41
41
  const fullPath = path.join(context.packageDir, opts.file);
42
- const expectedContent = getExpectedContents(context, opts);
42
+ const expectedContent = await getExpectedContents(context, opts);
43
43
 
44
44
  const pathExists = context.host.exists(fullPath);
45
45
  const actualContent = pathExists ? context.host.readFile(fullPath, { encoding: "utf-8" }) : undefined;
@@ -59,12 +59,15 @@ export const fileContents = {
59
59
  });
60
60
  }
61
61
  },
62
- optionsRuntype: Options,
63
- } as RuleModule<typeof Options>;
62
+ validateOptions: Options.check,
63
+ });
64
64
 
65
- const optionsCache = new Map<Options, ((context: Context) => string | undefined) | string | undefined>();
65
+ const optionsCache = new Map<
66
+ Options,
67
+ ((context: Context) => Promise<string> | string | undefined) | string | undefined
68
+ >();
66
69
 
67
- function getExpectedContents(context: Context, opts: Options) {
70
+ async function getExpectedContents(context: Context, opts: Options) {
68
71
  // we need to use has because undefined is a valid value in the cache
69
72
  if (optionsCache.has(opts)) {
70
73
  const cachedEntry = optionsCache.get(opts);
@@ -76,7 +79,7 @@ function getExpectedContents(context: Context, opts: Options) {
76
79
 
77
80
  if (opts.generator) {
78
81
  optionsCache.set(opts, opts.generator);
79
- return opts.generator(context) as string | undefined; // we have no guarentee its the right kind of function
82
+ return opts.generator(context);
80
83
  } else if (opts.templateFile) {
81
84
  const { packageDir: workspacePackageDir } = context.getWorkspaceContext();
82
85
  const fullPath = path.resolve(workspacePackageDir, opts.templateFile);
@@ -89,5 +92,3 @@ function getExpectedContents(context: Context, opts: Options) {
89
92
  return opts.template;
90
93
  }
91
94
  }
92
-
93
- export const FileContents = createNewRuleConversion("FileContents", fileContents);
package/src/index.ts CHANGED
@@ -5,16 +5,16 @@
5
5
  *
6
6
  */
7
7
 
8
- export { alphabeticalDependencies, AlphabeticalDependencies } from "./alphabeticalDependencies";
9
- export { alphabeticalScripts, AlphabeticalScripts } from "./alphabeticalScripts";
10
- export { bannedDependencies, BannedDependencies } from "./bannedDependencies";
11
- export { consistentDependencies, ConsistentDependencies } from "./consistentDependencies";
12
- export { consistentVersions, ConsistentVersions } from "./consistentVersions";
13
- export { fileContents, FileContents } from "./fileContents";
14
- export { mustSatisfyPeerDependencies, MustSatisfyPeerDependencies } from "./mustSatisfyPeerDependencies";
15
- export { packageOrder, PackageOrder } from "./packageOrder";
16
- export { packageEntry, PackageEntry } from "./packageEntry";
17
- export { packageScript, PackageScript } from "./packageScript";
18
- export { standardTsconfig, StandardTsConfig } from "./standardTsconfig";
19
- export { nestedWorkspaces, NestedWorkspaces } from "./nestedWorkspaces";
20
- export { requireDependency, RequireDependency } from "./requireDependency";
8
+ export { alphabeticalDependencies } from "./alphabeticalDependencies.js";
9
+ export { alphabeticalScripts } from "./alphabeticalScripts.js";
10
+ export { bannedDependencies } from "./bannedDependencies.js";
11
+ export { consistentDependencies } from "./consistentDependencies.js";
12
+ export { consistentVersions } from "./consistentVersions.js";
13
+ export { fileContents } from "./fileContents.js";
14
+ export { mustSatisfyPeerDependencies } from "./mustSatisfyPeerDependencies.js";
15
+ export { packageOrder } from "./packageOrder.js";
16
+ export { packageEntry } from "./packageEntry.js";
17
+ export { packageScript } from "./packageScript.js";
18
+ export { standardTsconfig } from "./standardTsconfig.js";
19
+ export { nestedWorkspaces } from "./nestedWorkspaces.js";
20
+ export { requireDependency } from "./requireDependency.js";
@@ -5,13 +5,13 @@
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
8
+ import { Context } from "@monorepolint/config";
9
9
  import { Host, mutateJson, PackageJson } from "@monorepolint/utils";
10
- import path from "path";
11
- import resolvePackagePath from "resolve-package-path";
10
+ import * as path from "node:path";
12
11
  import * as r from "runtypes";
13
12
  import { coerce } from "semver";
14
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
13
+ import resolvePackagePath from "resolve-package-path";
14
+ import { makeRule } from "./util/makeRule.js";
15
15
 
16
16
  const Options = r.Union(
17
17
  r.Partial({
@@ -184,15 +184,11 @@ const Options = r.Union(
184
184
 
185
185
  export type Options = r.Static<typeof Options>;
186
186
 
187
- export const mustSatisfyPeerDependencies: RuleModule<typeof Options> = {
187
+ export const mustSatisfyPeerDependencies = makeRule({
188
+ name: "mustSatisfyPeerDependencies",
188
189
  check: checkSatisfyPeerDependencies,
189
- optionsRuntype: Options,
190
- };
191
-
192
- export const MustSatisfyPeerDependencies = createNewRuleConversion(
193
- "MustSatisfyPeerDependencies",
194
- mustSatisfyPeerDependencies
195
- );
190
+ validateOptions: Options.check,
191
+ });
196
192
 
197
193
  /**
198
194
  * separating on `|`, this regex allows any of the following formats:
@@ -219,7 +215,8 @@ export const MATCH_ANY_VERSION_RANGE = /^(\*|x)$/;
219
215
  *
220
216
  * More info: https://docs.npmjs.com/about-semantic-versioning
221
217
  */
222
- export const MATCH_GREATER_OR_EQUAL_VERSION_RANGE = /^>= ?\d+(?:\.\d+|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?$/;
218
+ export const MATCH_GREATER_OR_EQUAL_VERSION_RANGE =
219
+ /^>= ?\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-]+)*))?)?$/;
223
220
 
224
221
  /**
225
222
  * This regex allows any of the following formats:
@@ -243,7 +240,8 @@ export const MATCH_GREATER_OR_EQUAL_VERSION_RANGE = /^>= ?\d+(?:\.\d+|\.\d+\.\d+
243
240
  *
244
241
  * More info: https://docs.npmjs.com/about-semantic-versioning
245
242
  */
246
- export const 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-]+)*))?)$/;
243
+ export const MATCH_MAJOR_VERSION_RANGE =
244
+ /^(?:\^?\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-]+)*))?)$/;
247
245
 
248
246
  /**
249
247
  * Does not currently accept `<`, `<=`, `>`, `=` or `-` for ranges (e.g. `> 2.5.1 < 3` or `1.0.0 - 1.2.0`),
@@ -258,7 +256,8 @@ export const MATCH_MAJOR_VERSION_RANGE = /^(?:\^?\d+|\^?\d+\.x|\^?\d+\.x\.x|\^\d
258
256
  *
259
257
  * TODO: accept minor pins `~4.2.1`
260
258
  */
261
- export const 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-]+)*))?)?)*)$/;
259
+ export const RANGE_REGEX =
260
+ /^(\*|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-]+)*))?)?)*)$/;
262
261
 
263
262
  interface IPeerDependencyRequirement {
264
263
  fromPackageName: string;
@@ -273,7 +272,7 @@ interface IResolvedPeerDependencyRequirement {
273
272
  function checkSatisfyPeerDependencies(context: Context, opts: Options) {
274
273
  const { dependencyBlacklist, dependencyWhitelist, enforceForDevDependencies, skipUnparseableRanges } = opts;
275
274
  const packageJsonPath = path.resolve(context.getPackageJsonPath());
276
- const packageJson: PackageJson = require(packageJsonPath);
275
+ const packageJson = context.host.readJson(packageJsonPath) as PackageJson;
277
276
  const packageDependencies = packageJson.dependencies || {};
278
277
  const packageDevDependencies = packageJson.devDependencies || {};
279
278
  const packagePeerDependencies = packageJson.peerDependencies || {};
@@ -308,7 +307,7 @@ function checkSatisfyPeerDependencies(context: Context, opts: Options) {
308
307
  if (dependencyPackageJsonPath == null) {
309
308
  throw new Error(`Could not resolve ${dependency} from ${path.dirname(packageJsonPath)}`);
310
309
  }
311
- const dependencyPackageJson: PackageJson = require(dependencyPackageJsonPath);
310
+ const dependencyPackageJson = context.host.readJson(dependencyPackageJsonPath) as PackageJson;
312
311
  const requiredPeerDependencies = dependencyPackageJson.peerDependencies;
313
312
  if (requiredPeerDependencies == null) {
314
313
  continue;
@@ -5,23 +5,23 @@
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
9
- import globby from "globby";
10
- import path from "path";
8
+ import * as globby from "globby";
9
+ import * as path from "node:path";
11
10
  import * as r from "runtypes";
12
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
11
+ import { makeRule } from "./util/makeRule.js";
13
12
 
14
13
  export const Options = r.Undefined;
15
14
 
16
15
  type Options = r.Static<typeof Options>;
17
16
 
18
17
  // Enforce that the root package.json contains all of the workspaces in the repo (including nested packages)
19
- export const nestedWorkspaces: RuleModule<typeof Options> = {
20
- check: (context: Context) => {
18
+ export const nestedWorkspaces = makeRule({
19
+ name: "nestedWorkspaces",
20
+ check: (context) => {
21
21
  const rootPackageJson = context.getWorkspaceContext().getPackageJson();
22
22
 
23
23
  // Expand a set of globs covering all package.json files in the entire repo (except the root)
24
- const packageJsonPaths = globby.sync(["*/**/package.json", "!**/node_modules/**"]);
24
+ const packageJsonPaths = globby.globbySync(["*/**/package.json", "!**/node_modules/**"]);
25
25
 
26
26
  const workspaces = Array.isArray(rootPackageJson.workspaces)
27
27
  ? rootPackageJson.workspaces
@@ -41,7 +41,7 @@ export const nestedWorkspaces: RuleModule<typeof Options> = {
41
41
  const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);
42
42
 
43
43
  // Expand the globs to get an array of all package.json files that are in packages specified by a workspace.
44
- const expandedWorkspacesGlobs = globby.sync([...workspacePackageJsons, "!**/node_modules/**"]);
44
+ const expandedWorkspacesGlobs = globby.globbySync([...workspacePackageJsons, "!**/node_modules/**"]);
45
45
 
46
46
  // Ensure there are no package.jsons which are not included in the globbed workspaces set
47
47
  const difference = packageJsonPaths.filter((packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath));
@@ -56,7 +56,5 @@ export const nestedWorkspaces: RuleModule<typeof Options> = {
56
56
  });
57
57
  }
58
58
  },
59
- optionsRuntype: Options,
60
- };
61
-
62
- export const NestedWorkspaces = createNewRuleConversion("NestedWorkspaces", nestedWorkspaces);
59
+ validateOptions: Options.check,
60
+ });
@@ -5,11 +5,10 @@
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
9
8
  import { mutateJson, PackageJson } from "@monorepolint/utils";
10
- import diff from "jest-diff";
9
+ import { diff } from "jest-diff";
11
10
  import * as r from "runtypes";
12
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
11
+ import { makeRule } from "./util/makeRule.js";
13
12
 
14
13
  export const Options = r.Union(
15
14
  r
@@ -38,8 +37,9 @@ export const Options = r.Union(
38
37
 
39
38
  export type Options = r.Static<typeof Options>;
40
39
 
41
- export const packageEntry: RuleModule<typeof Options> = {
42
- check: function expectPackageEntry(context: Context, options: Options) {
40
+ export const packageEntry = makeRule<Options>({
41
+ name: "packageEntry",
42
+ check: (context, options) => {
43
43
  const packageJson = context.getPackageJson();
44
44
 
45
45
  if (options.entries) {
@@ -78,10 +78,8 @@ export const packageEntry: RuleModule<typeof Options> = {
78
78
  }
79
79
  }
80
80
  },
81
- optionsRuntype: Options,
82
- };
83
-
84
- export const PackageEntry = createNewRuleConversion("PackageEntry", packageEntry);
81
+ validateOptions: Options.check,
82
+ });
85
83
 
86
84
  export function createStandardizedEntryErrorMessage(key: string) {
87
85
  return `Expected standardized entry for '${key}'`;
@@ -5,11 +5,10 @@
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
9
- import diff from "jest-diff";
8
+ import { Context } from "@monorepolint/config";
9
+ import { diff } from "jest-diff";
10
10
  import * as r from "runtypes";
11
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
12
-
11
+ import { makeRule } from "./util/makeRule.js";
13
12
  type OrderFunction = (context: Context) => (a: string, b: string) => number;
14
13
 
15
14
  const Options = r
@@ -28,9 +27,12 @@ const defaultKeyOrder = [
28
27
  "contributors",
29
28
  "url",
30
29
  "license",
30
+ "type",
31
+ "exports",
31
32
  "private",
32
33
  "engines",
33
34
  "bin",
35
+ "types",
34
36
  "main",
35
37
  "module",
36
38
  "typings",
@@ -49,8 +51,9 @@ const defaultKeyOrder = [
49
51
  "publishConfig",
50
52
  ];
51
53
 
52
- export const packageOrder = {
53
- check: function expectPackageOrder(context: Context, opts: Options) {
54
+ export const packageOrder = makeRule<Options>({
55
+ name: "packageOrder",
56
+ check: (context, opts) => {
54
57
  const packageJson = context.getPackageJson();
55
58
  const packagePath = context.getPackageJsonPath();
56
59
 
@@ -67,6 +70,7 @@ export const packageOrder = {
67
70
  message: "Incorrect order of fields in package.json",
68
71
  longMessage: diff(expectedOrder, actualOrder, { expand: true }),
69
72
  fixer: () => {
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
74
  const expectedPackageJson: Record<string, any> = {};
71
75
 
72
76
  expectedOrder.forEach((key) => {
@@ -78,10 +82,8 @@ export const packageOrder = {
78
82
  });
79
83
  }
80
84
  },
81
- optionsRuntype: Options,
82
- } as RuleModule<typeof Options>;
83
-
84
- export const PackageOrder = createNewRuleConversion("PackageOrder", packageOrder);
85
+ validateOptions: Options.check,
86
+ });
85
87
 
86
88
  function arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {
87
89
  for (let index = 0; index < a.length; index++) {
@@ -5,25 +5,19 @@
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
9
8
  import { mutateJson, PackageJson } from "@monorepolint/utils";
10
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
11
- import diff from "jest-diff";
9
+ import { diff } from "jest-diff";
12
10
  import * as r from "runtypes";
11
+ import { makeRule } from "./util/makeRule.js";
13
12
 
14
13
  export const Options = r.Record({
15
14
  scripts: r.Dictionary(
16
15
  r.Union(
17
16
  r.String,
18
- r
19
- .Record({
20
- options: r.Array(r.String.Or(r.Undefined)),
21
- })
22
- .And(
23
- r.Partial({
24
- fixValue: r.Union(r.String, r.Undefined, r.Literal(false)),
25
- })
26
- )
17
+ r.Record({
18
+ options: r.Array(r.String.Or(r.Undefined)),
19
+ fixValue: r.Union(r.String, r.Undefined, r.Literal(false)).optional(),
20
+ })
27
21
  )
28
22
  ), // string => string
29
23
  });
@@ -32,8 +26,9 @@ export type Options = r.Static<typeof Options>;
32
26
 
33
27
  export const MSG_NO_SCRIPTS_BLOCK = "No scripts block in package.json";
34
28
 
35
- export const packageScript = {
36
- check: function expectPackageScript(context: Context, options: Options) {
29
+ export const packageScript = makeRule<Options>({
30
+ name: "packageScript",
31
+ check: (context, options) => {
37
32
  const packageJson = context.getPackageJson();
38
33
  if (packageJson.scripts === undefined) {
39
34
  context.addError({
@@ -64,7 +59,7 @@ export const packageScript = {
64
59
  }
65
60
  allowedValues.add(q);
66
61
  }
67
- fixToEmpty = value.hasOwnProperty("fixValue") && value.fixValue === undefined;
62
+ fixToEmpty = Object.prototype.hasOwnProperty.call(value, "fixValue") && value.fixValue === undefined;
68
63
  fixValue = value.fixValue;
69
64
  }
70
65
 
@@ -100,7 +95,5 @@ export const packageScript = {
100
95
  }
101
96
  }
102
97
  },
103
- optionsRuntype: Options,
104
- } as RuleModule<typeof Options>;
105
-
106
- export const PackageScript = createNewRuleConversion("PackageScript", packageScript);
98
+ validateOptions: Options.check,
99
+ });
@@ -0,0 +1 @@
1
+ export { makeRule } from "../util/makeRule.js";
@@ -5,11 +5,11 @@
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
8
+ import { Context } from "@monorepolint/config";
9
9
  import { mutateJson, PackageJson } from "@monorepolint/utils";
10
- import diff from "jest-diff";
10
+ import { diff } from "jest-diff";
11
11
  import * as r from "runtypes";
12
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
12
+ import { makeRule } from "./util/makeRule.js";
13
13
 
14
14
  const Options = r.Partial({
15
15
  dependencies: r.Dictionary(r.String),
@@ -20,7 +20,8 @@ const Options = r.Partial({
20
20
 
21
21
  type Options = r.Static<typeof Options>;
22
22
 
23
- export const requireDependency = {
23
+ export const requireDependency = makeRule({
24
+ name: "requireDependency",
24
25
  check: function expectPackageEntry(context: Context, options: Options) {
25
26
  const packageJson = context.getPackageJson();
26
27
  const packageJsonPath = context.getPackageJsonPath();
@@ -50,11 +51,11 @@ export const requireDependency = {
50
51
  }
51
52
 
52
53
  for (const [dep, version] of Object.entries(options[type]!)) {
53
- if (packageJson[type][dep] !== version) {
54
+ if (packageJson[type]?.[dep] !== version) {
54
55
  context.addError({
55
56
  file: packageJsonPath,
56
57
  message: `Expected dependency ${dep}@${version}`,
57
- longMessage: diff(`${dep}@${version}\n`, `${dep}@${packageJson[type][dep] || "missing"}\n`)!,
58
+ longMessage: diff(`${dep}@${version}\n`, `${dep}@${packageJson[type]![dep] || "missing"}\n`)!,
58
59
  fixer: () => {
59
60
  mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {
60
61
  input[type] = { ...input[type], [dep]: version };
@@ -66,7 +67,5 @@ export const requireDependency = {
66
67
  }
67
68
  });
68
69
  },
69
- optionsRuntype: Options,
70
- } as RuleModule<typeof Options>;
71
-
72
- export const RequireDependency = createNewRuleConversion("RequireDependency", requireDependency);
70
+ validateOptions: Options.check,
71
+ });
@@ -5,12 +5,12 @@
5
5
  *
6
6
  */
7
7
 
8
- import { Context, RuleModule } from "@monorepolint/config";
8
+ import { Context } from "@monorepolint/config";
9
9
  import { matchesAnyGlob } from "@monorepolint/utils";
10
- import diff from "jest-diff";
11
- import { createNewRuleConversion } from "./util/createNewRuleConversion";
10
+ import { diff } from "jest-diff";
12
11
  import * as path from "path";
13
12
  import * as r from "runtypes";
13
+ import { makeRule } from "./util/makeRule.js";
14
14
 
15
15
  const DEFAULT_TSCONFIG_FILENAME = "tsconfig.json";
16
16
 
@@ -41,8 +41,9 @@ const Options = r
41
41
 
42
42
  export interface Options extends r.Static<typeof Options> {}
43
43
 
44
- export const standardTsconfig = {
45
- check: async function expectStandardTsconfig(context: Context, opts: Options) {
44
+ export const standardTsconfig = makeRule<Options>({
45
+ name: "standardTsconfig",
46
+ check: async (context, opts) => {
46
47
  const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;
47
48
  const fullPath = path.resolve(context.packageDir, tsconfigFileName);
48
49
  const generator = getGenerator(context, opts);
@@ -73,10 +74,8 @@ export const standardTsconfig = {
73
74
  });
74
75
  }
75
76
  },
76
- optionsRuntype: Options,
77
- } as RuleModule<typeof Options>;
78
-
79
- export const StandardTsConfig = createNewRuleConversion("StandardTsconfig", standardTsconfig);
77
+ validateOptions: Options.check,
78
+ });
80
79
 
81
80
  function getGenerator(context: Context, opts: Options) {
82
81
  if (opts.generator) {
@@ -95,6 +94,7 @@ function getGenerator(context: Context, opts: Options) {
95
94
  }
96
95
 
97
96
  function makeGenerator(
97
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
98
98
  template: any,
99
99
  excludedReferences: ReadonlyArray<string> | undefined,
100
100
  additionalReferences: ReadonlyArray<string> | undefined,
@@ -110,10 +110,9 @@ function makeGenerator(
110
110
 
111
111
  const packageJson = context.getPackageJson();
112
112
  const deps = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {})];
113
-
114
113
  for (const dep of deps) {
115
114
  const packageDir = nameToDirectory.get(dep);
116
- if (packageDir !== undefined && (excludedReferences === undefined || matchesAnyGlob(dep, excludedReferences))) {
115
+ if (packageDir !== undefined && (excludedReferences === undefined || !matchesAnyGlob(dep, excludedReferences))) {
117
116
  const absoluteReferencePath =
118
117
  tsconfigReferenceFile !== undefined ? path.join(packageDir, tsconfigReferenceFile) : packageDir;
119
118
  template.references.push({
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { Context } from "@monorepolint/config";
9
- import diff from "jest-diff";
9
+ import { diff } from "jest-diff";
10
10
 
11
11
  export function checkAlpha(
12
12
  context: Context,
@@ -0,0 +1,29 @@
1
+ import { Context, RuleEntry, RuleModule } from "@monorepolint/config";
2
+
3
+ let globalId = 0;
4
+ export function makeRule<X>({
5
+ name,
6
+ check,
7
+ validateOptions,
8
+ printStats,
9
+ }: {
10
+ name: string;
11
+ check: (context: Context, options: X, extra: { id: string }) => Promise<unknown> | unknown;
12
+ printStats?: () => void;
13
+ validateOptions: (options: unknown) => asserts options is X;
14
+ }): RuleFunction<X> {
15
+ return function (ruleEntry) {
16
+ const id = `${name} :: ${globalId++}`;
17
+ return {
18
+ id,
19
+ // eslint-disable-next-line @typescript-eslint/no-extra-non-null-assertion
20
+ check: (context) => check(context, ruleEntry.options!!, { id }),
21
+ name,
22
+ validateOptions,
23
+ ruleEntry,
24
+ printStats,
25
+ };
26
+ };
27
+ }
28
+
29
+ type RuleFunction<T> = (ruleEntry: RuleEntry<T>) => RuleModule<T>;
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { Host, PackageJson } from "@monorepolint/utils";
6
- import path from "path";
6
+ import * as path from "node:path";
7
7
  import resolvePackagePath from "resolve-package-path";
8
8
 
9
9
  /** Interface for a node in a package dependency graph. */
@@ -45,7 +45,7 @@ export class PackageDependencyGraphService implements IPackageDependencyGraphSer
45
45
  return nodes.get(packageJsonPath)!;
46
46
  }
47
47
 
48
- const packageJson: PackageJson = host.readJson(packageJsonPath);
48
+ const packageJson = host.readJson(packageJsonPath) as PackageJson;
49
49
  const node: IPackageDependencyGraphNode = {
50
50
  packageJson,
51
51
  dependencies: new Map<string, IPackageDependencyGraphNode>(),
package/tsconfig.json CHANGED
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "extends": "../../tsconfig.base.json",
3
3
  "compilerOptions": {
4
- "outDir": "./lib",
5
- "rootDir": "./src"
4
+ "outDir": "./build/js",
5
+ "rootDir": "./src",
6
+ "declarationDir": "./build/types",
7
+ "tsBuildInfoFile": "./build/tsconfig.tsbuildinfo"
6
8
  },
9
+ "include": [
10
+ "src"
11
+ ],
7
12
  "references": [
8
13
  {
9
14
  "path": "../config"
@@ -1,8 +0,0 @@
1
- /*!
2
- * Copyright 2019 Palantir Technologies, Inc.
3
- *
4
- * Licensed under the MIT license. See LICENSE file in the project root for details.
5
- *
6
- */
7
- export {};
8
- //# sourceMappingURL=alphabeticalScripts.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"alphabeticalScripts.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/alphabeticalScripts.spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}