@monorepolint/rules 0.5.0-alpha.7 → 0.5.0-alpha.73

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 (131) hide show
  1. package/lib/__tests__/alphabeticalScripts.spec.d.ts +8 -0
  2. package/lib/__tests__/alphabeticalScripts.spec.d.ts.map +1 -0
  3. package/lib/__tests__/alphabeticalScripts.spec.js +63 -0
  4. package/lib/__tests__/alphabeticalScripts.spec.js.map +1 -0
  5. package/lib/__tests__/bannedDependencies.spec.d.ts +2 -0
  6. package/lib/__tests__/bannedDependencies.spec.d.ts.map +1 -0
  7. package/lib/__tests__/bannedDependencies.spec.js +103 -0
  8. package/lib/__tests__/bannedDependencies.spec.js.map +1 -0
  9. package/lib/__tests__/consistentDependencies.spec.js +26 -11
  10. package/lib/__tests__/consistentDependencies.spec.js.map +1 -1
  11. package/lib/__tests__/consistentVersions.spec.d.ts +8 -0
  12. package/lib/__tests__/consistentVersions.spec.d.ts.map +1 -0
  13. package/lib/__tests__/consistentVersions.spec.js +182 -0
  14. package/lib/__tests__/consistentVersions.spec.js.map +1 -0
  15. package/lib/__tests__/fileContents.spec.d.ts +8 -0
  16. package/lib/__tests__/fileContents.spec.d.ts.map +1 -0
  17. package/lib/__tests__/fileContents.spec.js +66 -0
  18. package/lib/__tests__/fileContents.spec.js.map +1 -0
  19. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts +8 -0
  20. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts.map +1 -0
  21. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js +1062 -0
  22. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js.map +1 -0
  23. package/lib/__tests__/nestedWorkspaces.spec.d.ts +2 -0
  24. package/lib/__tests__/nestedWorkspaces.spec.d.ts.map +1 -0
  25. package/lib/__tests__/nestedWorkspaces.spec.js +122 -0
  26. package/lib/__tests__/nestedWorkspaces.spec.js.map +1 -0
  27. package/lib/__tests__/packageEntry.spec.d.ts +8 -0
  28. package/lib/__tests__/packageEntry.spec.d.ts.map +1 -0
  29. package/lib/__tests__/packageEntry.spec.js +137 -0
  30. package/lib/__tests__/packageEntry.spec.js.map +1 -0
  31. package/lib/__tests__/requireDependency.spec.d.ts +2 -0
  32. package/lib/__tests__/requireDependency.spec.d.ts.map +1 -0
  33. package/lib/__tests__/requireDependency.spec.js +122 -0
  34. package/lib/__tests__/requireDependency.spec.js.map +1 -0
  35. package/lib/__tests__/utils.d.ts +1 -0
  36. package/lib/__tests__/utils.d.ts.map +1 -1
  37. package/lib/__tests__/utils.js +11 -0
  38. package/lib/__tests__/utils.js.map +1 -1
  39. package/lib/alphabeticalDependencies.d.ts +3 -1
  40. package/lib/alphabeticalDependencies.d.ts.map +1 -1
  41. package/lib/alphabeticalDependencies.js +5 -39
  42. package/lib/alphabeticalDependencies.js.map +1 -1
  43. package/lib/alphabeticalScripts.d.ts +12 -0
  44. package/lib/alphabeticalScripts.d.ts.map +1 -0
  45. package/lib/alphabeticalScripts.js +20 -0
  46. package/lib/alphabeticalScripts.js.map +1 -0
  47. package/lib/bannedDependencies.d.ts +12 -3
  48. package/lib/bannedDependencies.d.ts.map +1 -1
  49. package/lib/bannedDependencies.js +59 -14
  50. package/lib/bannedDependencies.js.map +1 -1
  51. package/lib/consistentDependencies.d.ts +8 -1
  52. package/lib/consistentDependencies.d.ts.map +1 -1
  53. package/lib/consistentDependencies.js +28 -9
  54. package/lib/consistentDependencies.js.map +1 -1
  55. package/lib/consistentVersions.d.ts +14 -0
  56. package/lib/consistentVersions.d.ts.map +1 -0
  57. package/lib/consistentVersions.js +94 -0
  58. package/lib/consistentVersions.js.map +1 -0
  59. package/lib/fileContents.d.ts.map +1 -1
  60. package/lib/fileContents.js +6 -2
  61. package/lib/fileContents.js.map +1 -1
  62. package/lib/index.d.ts +5 -0
  63. package/lib/index.d.ts.map +1 -1
  64. package/lib/index.js +18 -8
  65. package/lib/index.js.map +1 -1
  66. package/lib/mustSatisfyPeerDependencies.d.ts +240 -0
  67. package/lib/mustSatisfyPeerDependencies.d.ts.map +1 -0
  68. package/lib/mustSatisfyPeerDependencies.js +634 -0
  69. package/lib/mustSatisfyPeerDependencies.js.map +1 -0
  70. package/lib/nestedWorkspaces.d.ts +13 -0
  71. package/lib/nestedWorkspaces.d.ts.map +1 -0
  72. package/lib/nestedWorkspaces.js +50 -0
  73. package/lib/nestedWorkspaces.js.map +1 -0
  74. package/lib/packageEntry.d.ts +22 -4
  75. package/lib/packageEntry.d.ts.map +1 -1
  76. package/lib/packageEntry.js +45 -16
  77. package/lib/packageEntry.js.map +1 -1
  78. package/lib/packageOrder.d.ts.map +1 -1
  79. package/lib/packageOrder.js +6 -4
  80. package/lib/packageOrder.js.map +1 -1
  81. package/lib/packageScript.js +4 -3
  82. package/lib/packageScript.js.map +1 -1
  83. package/lib/requireDependency.d.ts +15 -0
  84. package/lib/requireDependency.d.ts.map +1 -0
  85. package/lib/requireDependency.js +65 -0
  86. package/lib/requireDependency.js.map +1 -0
  87. package/lib/standardTsconfig.d.ts +12 -0
  88. package/lib/standardTsconfig.d.ts.map +1 -1
  89. package/lib/standardTsconfig.js +17 -7
  90. package/lib/standardTsconfig.js.map +1 -1
  91. package/lib/util/checkAlpha.d.ts +9 -0
  92. package/lib/util/checkAlpha.d.ts.map +1 -0
  93. package/lib/util/checkAlpha.js +48 -0
  94. package/lib/util/checkAlpha.js.map +1 -0
  95. package/lib/util/makeDirectory.d.ts +8 -0
  96. package/lib/util/makeDirectory.d.ts.map +1 -0
  97. package/lib/util/makeDirectory.js +28 -0
  98. package/lib/util/makeDirectory.js.map +1 -0
  99. package/lib/util/packageDependencyGraphService.d.ts +37 -0
  100. package/lib/util/packageDependencyGraphService.d.ts.map +1 -0
  101. package/lib/util/packageDependencyGraphService.js +70 -0
  102. package/lib/util/packageDependencyGraphService.js.map +1 -0
  103. package/package.json +17 -13
  104. package/src/__tests__/alphabeticalScripts.spec.ts +76 -0
  105. package/src/__tests__/bannedDependencies.spec.ts +117 -0
  106. package/src/__tests__/consistentDependencies.spec.ts +29 -10
  107. package/src/__tests__/consistentVersions.spec.ts +218 -0
  108. package/src/__tests__/fileContents.spec.ts +82 -0
  109. package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +1183 -0
  110. package/src/__tests__/nestedWorkspaces.spec.ts +146 -0
  111. package/src/__tests__/packageEntry.spec.ts +181 -0
  112. package/src/__tests__/requireDependency.spec.ts +146 -0
  113. package/src/__tests__/utils.ts +12 -0
  114. package/src/alphabeticalDependencies.ts +3 -47
  115. package/src/alphabeticalScripts.ts +19 -0
  116. package/src/bannedDependencies.ts +74 -16
  117. package/src/consistentDependencies.ts +33 -10
  118. package/src/consistentVersions.ts +140 -0
  119. package/src/fileContents.ts +5 -3
  120. package/src/index.ts +5 -0
  121. package/src/mustSatisfyPeerDependencies.ts +735 -0
  122. package/src/nestedWorkspaces.ts +59 -0
  123. package/src/packageEntry.ts +56 -17
  124. package/src/packageOrder.ts +5 -4
  125. package/src/packageScript.ts +3 -3
  126. package/src/requireDependency.ts +69 -0
  127. package/src/standardTsconfig.ts +19 -7
  128. package/src/util/checkAlpha.ts +56 -0
  129. package/src/util/makeDirectory.ts +24 -0
  130. package/src/util/packageDependencyGraphService.ts +111 -0
  131. package/tsconfig.tsbuildinfo +5399 -1591
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright 2019 Palantir Technologies, Inc.
4
+ *
5
+ * Licensed under the MIT license. See LICENSE file in the project root for details.
6
+ *
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.makeDirectoryRecursively = void 0;
10
+ const tslib_1 = require("tslib");
11
+ const fs_1 = require("fs");
12
+ const path = tslib_1.__importStar(require("path"));
13
+ function makeDirectoryRecursively(directoryPath) {
14
+ // node < 10 doesn't support mkdirSync w/ recursive: true
15
+ // so we manually do it instead
16
+ const dirSegments = directoryPath.split(path.sep);
17
+ for (let i = 0; i < dirSegments.length; i++) {
18
+ if (dirSegments[i].length > 0) {
19
+ // we skip the empty segment
20
+ const curDirPath = dirSegments.slice(0, i + 1).join(path.sep);
21
+ if (!fs_1.existsSync(curDirPath)) {
22
+ fs_1.mkdirSync(curDirPath);
23
+ }
24
+ }
25
+ }
26
+ }
27
+ exports.makeDirectoryRecursively = makeDirectoryRecursively;
28
+ //# sourceMappingURL=makeDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeDirectory.js","sourceRoot":"","sources":["../../src/util/makeDirectory.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;AAEH,2BAA2C;AAC3C,mDAA6B;AAE7B,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,yDAAyD;IACzD,+BAA+B;IAC/B,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,4BAA4B;YAC5B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,IAAI,CAAC,eAAU,CAAC,UAAU,CAAC,EAAE;gBAC3B,cAAS,CAAC,UAAU,CAAC,CAAC;aACvB;SACF;KACF;AACH,CAAC;AAbD,4DAaC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @license Copyright 2019 Palantir Technologies, Inc. All rights reserved.
3
+ */
4
+ import { PackageJson } from "@monorepolint/utils";
5
+ /** Interface for a node in a package dependency graph. */
6
+ export interface IPackageDependencyGraphNode {
7
+ packageJson: PackageJson;
8
+ dependencies: Map<string, IPackageDependencyGraphNode>;
9
+ paths: {
10
+ packageJsonPath: string;
11
+ rootDirectory: string;
12
+ };
13
+ }
14
+ /** Service abstraction for constructing and traversing package dependency graphs. */
15
+ export interface IPackageDependencyGraphService {
16
+ /** Construct a graph of package dependencies. */
17
+ buildDependencyGraph(packageJsonPath: string, maxDepth?: number): IPackageDependencyGraphNode;
18
+ /** Traverse a package dependency graph. */
19
+ traverse(root: IPackageDependencyGraphNode, opts?: {
20
+ /** Traverse each unique path to a given package (potentially slow). */
21
+ traverseAllPaths?: boolean;
22
+ }): IterableIterator<IPackageDependencyGraphNode & {
23
+ importPath: IPackageDependencyGraphNode[];
24
+ }>;
25
+ }
26
+ /** Default implementation of the package dependency graph service. */
27
+ export declare class PackageDependencyGraphService implements IPackageDependencyGraphService {
28
+ /** Construct a graph of package dependencies and return the root node. */
29
+ buildDependencyGraph(startPackageJsonPath: string, maxDepth?: number): IPackageDependencyGraphNode;
30
+ /** Traverse a package dependency graph with an iterator. */
31
+ traverse(root: IPackageDependencyGraphNode, opts?: {
32
+ traverseAllPaths: boolean;
33
+ }): IterableIterator<IPackageDependencyGraphNode & {
34
+ importPath: IPackageDependencyGraphNode[];
35
+ }>;
36
+ }
37
+ //# sourceMappingURL=packageDependencyGraphService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageDependencyGraphService.d.ts","sourceRoot":"","sources":["../../src/util/packageDependencyGraphService.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIlD,0DAA0D;AAC1D,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACvD,KAAK,EAAE;QACL,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,qFAAqF;AACrF,MAAM,WAAW,8BAA8B;IAC7C,iDAAiD;IACjD,oBAAoB,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,2BAA2B,CAAC;IAE9F,2CAA2C;IAC3C,QAAQ,CACN,IAAI,EAAE,2BAA2B,EACjC,IAAI,CAAC,EAAE;QACL,uEAAuE;QACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,GACA,gBAAgB,CAAC,2BAA2B,GAAG;QAAE,UAAU,EAAE,2BAA2B,EAAE,CAAA;KAAE,CAAC,CAAC;CAClG;AAED,sEAAsE;AACtE,qBAAa,6BAA8B,YAAW,8BAA8B;IAClF,0EAA0E;IACnE,oBAAoB,CAAC,oBAAoB,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,2BAA2B;IAwCzG,4DAA4D;IACpD,QAAQ,CACd,IAAI,EAAE,2BAA2B,EACjC,IAAI;;KAA8B,GACjC,gBAAgB,CAAC,2BAA2B,GAAG;QAAE,UAAU,EAAE,2BAA2B,EAAE,CAAA;KAAE,CAAC;CA8BjG"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /**
3
+ * @license Copyright 2019 Palantir Technologies, Inc. All rights reserved.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PackageDependencyGraphService = void 0;
7
+ const tslib_1 = require("tslib");
8
+ const path_1 = tslib_1.__importDefault(require("path"));
9
+ const resolve_package_path_1 = tslib_1.__importDefault(require("resolve-package-path"));
10
+ /** Default implementation of the package dependency graph service. */
11
+ class PackageDependencyGraphService {
12
+ /** Construct a graph of package dependencies and return the root node. */
13
+ buildDependencyGraph(startPackageJsonPath, maxDepth) {
14
+ const nodes = new Map();
15
+ const visit = (packageJsonPath, currentDepth) => {
16
+ if (nodes.has(packageJsonPath)) {
17
+ return nodes.get(packageJsonPath);
18
+ }
19
+ const packageJson = require(packageJsonPath);
20
+ const node = {
21
+ packageJson,
22
+ dependencies: new Map(),
23
+ paths: {
24
+ packageJsonPath,
25
+ rootDirectory: path_1.default.dirname(packageJsonPath),
26
+ },
27
+ };
28
+ // It's important that we register the node before visiting its dependencies to avoid cycles
29
+ nodes.set(packageJsonPath, node);
30
+ const nextDepth = currentDepth + 1;
31
+ if (maxDepth == null || nextDepth <= maxDepth) {
32
+ const dependencies = packageJson.dependencies != null ? Object.keys(packageJson.dependencies) : [];
33
+ for (const dependency of dependencies) {
34
+ const dependencyPackageJsonPath = resolve_package_path_1.default(dependency, node.paths.rootDirectory);
35
+ if (dependencyPackageJsonPath == null) {
36
+ throw new Error(`Could not resolve ${dependency} from ${node.paths.rootDirectory}`);
37
+ }
38
+ node.dependencies.set(dependency, visit(dependencyPackageJsonPath, nextDepth));
39
+ }
40
+ }
41
+ return node;
42
+ };
43
+ return visit(startPackageJsonPath, 0);
44
+ }
45
+ /** Traverse a package dependency graph with an iterator. */
46
+ *traverse(root, opts = { traverseAllPaths: false }) {
47
+ const visited = new Set();
48
+ function* visit(node, importPath = []) {
49
+ // Don't visit a package more than once unless explicitly asked to traverse all paths
50
+ if (!opts.traverseAllPaths && visited.has(node)) {
51
+ return;
52
+ }
53
+ // Break cycles when traversing all paths
54
+ if (importPath.indexOf(node) !== -1) {
55
+ return;
56
+ }
57
+ // Visit the node
58
+ visited.add(node);
59
+ importPath = [...importPath, node];
60
+ yield { ...node, importPath };
61
+ // Recursively visit the node's dependencies
62
+ for (const dependency of node.dependencies.values()) {
63
+ yield* visit(dependency, importPath);
64
+ }
65
+ }
66
+ yield* visit(root);
67
+ }
68
+ }
69
+ exports.PackageDependencyGraphService = PackageDependencyGraphService;
70
+ //# sourceMappingURL=packageDependencyGraphService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageDependencyGraphService.js","sourceRoot":"","sources":["../../src/util/packageDependencyGraphService.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;AAGH,wDAAwB;AACxB,wFAAsD;AA2BtD,sEAAsE;AACtE,MAAa,6BAA6B;IACxC,0EAA0E;IACnE,oBAAoB,CAAC,oBAA4B,EAAE,QAAiB;QACzE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuC,CAAC;QAE7D,MAAM,KAAK,GAAG,CAAC,eAAuB,EAAE,YAAoB,EAA+B,EAAE;YAC3F,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;gBAC9B,OAAO,KAAK,CAAC,GAAG,CAAC,eAAe,CAAE,CAAC;aACpC;YAED,MAAM,WAAW,GAAgB,OAAO,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAgC;gBACxC,WAAW;gBACX,YAAY,EAAE,IAAI,GAAG,EAAuC;gBAC5D,KAAK,EAAE;oBACL,eAAe;oBACf,aAAa,EAAE,cAAI,CAAC,OAAO,CAAC,eAAe,CAAC;iBAC7C;aACF,CAAC;YAEF,4FAA4F;YAC5F,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAEjC,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC;YACnC,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,QAAQ,EAAE;gBAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnG,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE;oBACrC,MAAM,yBAAyB,GAAG,8BAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBAC3F,IAAI,yBAAyB,IAAI,IAAI,EAAE;wBACrC,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,SAAS,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;qBACrF;oBAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC,CAAC;iBAChF;aACF;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,OAAO,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,4DAA4D;IACrD,CAAC,QAAQ,CACd,IAAiC,EACjC,IAAI,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE;QAElC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;QAEvD,QAAQ,CAAC,CAAC,KAAK,CACb,IAAiC,EACjC,aAA4C,EAAE;YAE9C,qFAAqF;YACrF,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAC/C,OAAO;aACR;YAED,yCAAyC;YACzC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;gBACnC,OAAO;aACR;YAED,iBAAiB;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,UAAU,GAAG,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC;YAE9B,4CAA4C;YAC5C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE;gBACnD,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;aACtC;QACH,CAAC;QAED,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;CACF;AA5ED,sEA4EC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monorepolint/rules",
3
- "version": "0.5.0-alpha.7+e67adbd",
3
+ "version": "0.5.0-alpha.73+1a78d3c",
4
4
  "author": "Eric L Anderson (https://github.com/ericanderson)",
5
5
  "contributors": [
6
6
  "Mac Lockard (https://github.com/maclockard)"
@@ -10,29 +10,33 @@
10
10
  "main": "lib/index.js",
11
11
  "typings": "lib/index.d.ts",
12
12
  "scripts": {
13
- "clean": "rm -rf build lib node_modules *.tgz",
13
+ "clean": "rm -rf build lib node_modules *.tgz tsconfig.tsbuildinfo",
14
14
  "compile:typescript": "../../node_modules/.bin/tsc",
15
- "jest:watch": "../../node_modules/.bin/jest --config ../../jest.config.js --watch",
16
15
  "jest": "../../node_modules/.bin/jest --config ../../jest.config.js",
16
+ "jest:watch": "../../node_modules/.bin/jest --config ../../jest.config.js --watch",
17
17
  "lint:typescript": "../../node_modules/.bin/tslint --config ../../tslint.json --project .",
18
- "test:watch": "../../node_modules/.bin/jest --colors --passWithNoTests --watch",
19
- "test": "../../node_modules/.bin/jest --colors --passWithNoTests"
18
+ "test": "../../node_modules/.bin/jest --colors --passWithNoTests",
19
+ "test:watch": "../../node_modules/.bin/jest --colors --passWithNoTests --watch"
20
20
  },
21
21
  "dependencies": {
22
- "@monorepolint/core": "^0.5.0-alpha.7+e67adbd",
23
- "@monorepolint/utils": "^0.5.0-alpha.7+e67adbd",
24
- "jest-diff": "^24.9.0",
22
+ "@monorepolint/core": "^0.5.0-alpha.73+1a78d3c",
23
+ "@monorepolint/utils": "^0.5.0-alpha.73+1a78d3c",
24
+ "globby": "^11.0.1",
25
+ "jest-diff": "^26.0.1",
25
26
  "minimatch": "^3.0.4",
26
- "runtypes": "^4.0.0"
27
+ "resolve-package-path": "^3.1.0",
28
+ "runtypes": "^4.0.0",
29
+ "semver": "^7.3.2"
27
30
  },
28
31
  "devDependencies": {
29
- "@types/jest-diff": "^20.0.0",
32
+ "@types/jest-diff": "^24.3.0",
30
33
  "@types/minimatch": "^3.0.3",
31
- "@types/tmp": "^0.1.0",
32
- "tmp": "^0.1.0"
34
+ "@types/semver": "^7.2.0",
35
+ "@types/tmp": "^0.2.0",
36
+ "tmp": "^0.2.1"
33
37
  },
34
38
  "publishConfig": {
35
39
  "access": "public"
36
40
  },
37
- "gitHead": "e67adbda77a0b2e8ab4ff14a807b677018a32a26"
41
+ "gitHead": "1a78d3c44f9ed73aedb73bd49d297b243a707893"
38
42
  }
@@ -0,0 +1,76 @@
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
+
8
+ // tslint:disable:no-console
9
+ import { createMockFiles, jsonToString } from "./utils";
10
+
11
+ // done first since this also mocks 'fs'
12
+ const mockFiles: Map<string, string> = createMockFiles();
13
+
14
+ import { Failure, PackageContext } from "@monorepolint/core";
15
+ import { alphabeticalScripts } from "../alphabeticalScripts";
16
+
17
+ const PACKAGE_SCRIPTS_SORTED = jsonToString({
18
+ name: "foo-lib",
19
+ scripts: {
20
+ a: "a-",
21
+ b: "b-",
22
+ c: "c-",
23
+ },
24
+ });
25
+
26
+ const PACKAGE_SCRIPTS_UNSORTED = jsonToString({
27
+ name: "foo-lib",
28
+ scripts: {
29
+ c: "c-",
30
+ a: "a-",
31
+ b: "b-",
32
+ },
33
+ });
34
+
35
+ describe("alphabeticalScripts", () => {
36
+ afterEach(() => {
37
+ mockFiles.clear();
38
+ });
39
+
40
+ describe("fix: true", () => {
41
+ const context = new PackageContext(".", {
42
+ rules: [],
43
+ fix: true,
44
+ verbose: false,
45
+ silent: true,
46
+ });
47
+ const spy = jest.spyOn(context, "addError");
48
+
49
+ afterEach(() => {
50
+ spy.mockClear();
51
+ });
52
+
53
+ it("fixes unsorted scripts", () => {
54
+ mockFiles.set("package.json", PACKAGE_SCRIPTS_UNSORTED);
55
+
56
+ alphabeticalScripts.check(context, undefined);
57
+
58
+ expect(spy).toHaveBeenCalledTimes(1);
59
+
60
+ const failure: Failure = spy.mock.calls[0][0];
61
+ expect(failure.file).toBe("package.json");
62
+ expect(failure.fixer).not.toBeUndefined();
63
+ expect(failure.message).toBe("Incorrect order of scripts in foo-lib's package.json");
64
+
65
+ expect(mockFiles.get("package.json")).toEqual(PACKAGE_SCRIPTS_SORTED);
66
+ });
67
+
68
+ it("does nothing if already sorted", () => {
69
+ mockFiles.set("package.json", PACKAGE_SCRIPTS_SORTED);
70
+
71
+ alphabeticalScripts.check(context, undefined);
72
+
73
+ expect(spy).toHaveBeenCalledTimes(0);
74
+ });
75
+ });
76
+ });
@@ -0,0 +1,117 @@
1
+ /*!
2
+ * Copyright 2020 Palantir Technologies, Inc.
3
+ *
4
+ * Licensed under the MIT license. See LICENSE file in the project root for details.
5
+ *
6
+ */
7
+ import { WorkspaceContext } from "@monorepolint/core";
8
+ import { writeFileSync } from "fs";
9
+ import * as path from "path";
10
+ import * as tmp from "tmp";
11
+ import { bannedDependencies, Options } from "../bannedDependencies";
12
+ import { makeDirectoryRecursively } from "../util/makeDirectory";
13
+ import { jsonToString } from "./utils";
14
+
15
+ const EMPTY_PACKAGE = jsonToString({});
16
+
17
+ describe("bannedDependencies", () => {
18
+ tmp.setGracefulCleanup();
19
+
20
+ let cleanupJobs: Array<() => void> = [];
21
+ let cwd: string | undefined;
22
+
23
+ beforeEach(() => {
24
+ const dir = tmp.dirSync({ unsafeCleanup: true });
25
+ cleanupJobs.push(() => dir.removeCallback());
26
+ cwd = dir.name;
27
+
28
+ const spy = jest.spyOn(process, "cwd");
29
+ spy.mockReturnValue(cwd);
30
+ });
31
+
32
+ afterEach(() => {
33
+ for (const cleanupJob of cleanupJobs) {
34
+ cleanupJob();
35
+ }
36
+ cleanupJobs = [];
37
+ });
38
+
39
+ function makeWorkspace() {
40
+ const workspaceContext = new WorkspaceContext(cwd!, {
41
+ rules: [],
42
+ fix: false,
43
+ verbose: false,
44
+ silent: true,
45
+ });
46
+
47
+ function checkAndSpy(options: Options) {
48
+ const addErrorSpy = jest.spyOn(workspaceContext, "addError");
49
+ bannedDependencies.check(workspaceContext, {
50
+ ...options,
51
+ });
52
+ return { addErrorSpy };
53
+ }
54
+
55
+ function addFile(filePath: string, content: string) {
56
+ const dirPath = path.resolve(cwd!, path.dirname(filePath));
57
+ const resolvedFilePath = path.resolve(cwd!, filePath);
58
+
59
+ makeDirectoryRecursively(dirPath);
60
+ writeFileSync(resolvedFilePath, content);
61
+ return resolvedFilePath;
62
+ }
63
+
64
+ return { addFile, workspaceContext, checkAndSpy };
65
+ }
66
+
67
+ it("Flags banned dependencies correctly", async () => {
68
+ const { addFile, checkAndSpy } = makeWorkspace();
69
+ const rootPackageJson = jsonToString({
70
+ dependencies: {
71
+ aaa: "0.0.1",
72
+ ccc: "0.0.1",
73
+ },
74
+ });
75
+ addFile("./package.json", rootPackageJson);
76
+
77
+ const { addErrorSpy: addErrorSpy1 } = checkAndSpy({ bannedDependencies: ["ccc"] });
78
+ expect(addErrorSpy1).toHaveBeenCalledTimes(1);
79
+ addErrorSpy1.mockReset();
80
+
81
+ const { addErrorSpy: addErrorSpy2 } = checkAndSpy({ bannedDependencies: ["ddd"] });
82
+ expect(addErrorSpy2).toHaveBeenCalledTimes(0);
83
+ addErrorSpy2.mockReset();
84
+
85
+ const { addErrorSpy: addErrorSpy3 } = checkAndSpy({ bannedDependencies: ["ccc", "ddd"] });
86
+ expect(addErrorSpy3).toHaveBeenCalledTimes(1);
87
+ addErrorSpy3.mockReset();
88
+ });
89
+
90
+ it("Flags banned transitives correctly", async () => {
91
+ const { addFile, checkAndSpy } = makeWorkspace();
92
+ const rootPackageJson = jsonToString({
93
+ dependencies: {
94
+ aaa: "0.0.1",
95
+ },
96
+ });
97
+ addFile("./package.json", rootPackageJson);
98
+
99
+ const aaaPackageJson = jsonToString({
100
+ dependencies: {
101
+ bbb: "0.0.1",
102
+ ccc: "0.0.1",
103
+ },
104
+ });
105
+ addFile("./node_modules/aaa/package.json", aaaPackageJson);
106
+ const bbbPackageJson = jsonToString({
107
+ dependencies: {
108
+ ddd: "0.0.1",
109
+ },
110
+ });
111
+ addFile("./node_modules/aaa/node_modules/bbb/package.json", bbbPackageJson);
112
+ addFile("./node_modules/aaa/node_modules/bbb/node_modules/ddd/package.json", EMPTY_PACKAGE);
113
+ addFile("./node_modules/aaa/node_modules/ccc/package.json", EMPTY_PACKAGE);
114
+
115
+ expect(checkAndSpy({ bannedTransitiveDependencies: ["ccc", "ddd"] }).addErrorSpy).toHaveBeenCalledTimes(2);
116
+ });
117
+ });
@@ -5,14 +5,12 @@
5
5
  *
6
6
  */
7
7
  import { WorkspaceContext } from "@monorepolint/core";
8
- import { mkdirSync, readFileSync, writeFileSync } from "fs";
8
+ import { readFileSync, writeFileSync } from "fs";
9
9
  import * as path from "path";
10
10
  import * as tmp from "tmp";
11
- import { consistentDependencies } from "../consistentDependencies";
12
-
13
- function jsonToString(obj: {}) {
14
- return JSON.stringify(obj, undefined, 2) + "\n";
15
- }
11
+ import { consistentDependencies, Options } from "../consistentDependencies";
12
+ import { makeDirectoryRecursively } from "../util/makeDirectory";
13
+ import { jsonToString } from "./utils";
16
14
 
17
15
  const PACKAGE_ROOT = jsonToString({
18
16
  workspaces: {
@@ -29,6 +27,12 @@ const PACKAGE_CHILD_WITH_STAR = jsonToString({
29
27
  },
30
28
  });
31
29
 
30
+ const PACKAGE_CHILD_WITH_LATEST = jsonToString({
31
+ dependencies: {
32
+ foo: "latest",
33
+ },
34
+ });
35
+
32
36
  const PACKAGE_CHILD_WITH_RIGHT_VERSION = jsonToString({
33
37
  dependencies: {
34
38
  foo: "5",
@@ -54,26 +58,28 @@ describe("consistentDependencies", () => {
54
58
  });
55
59
 
56
60
  function makeWorkspace({ fix }: { fix: boolean }) {
57
- const dir: tmp.DirResult = tmp.dirSync();
61
+ const dir: tmp.DirResult = tmp.dirSync({ unsafeCleanup: true });
58
62
  cleanupJobs.push(() => dir.removeCallback());
59
63
 
60
64
  const workspaceContext = new WorkspaceContext(dir.name, {
61
65
  rules: [],
62
66
  fix,
63
67
  verbose: false,
68
+ silent: true,
64
69
  });
65
70
 
66
- function checkAndSpy(q: string) {
71
+ function checkAndSpy(q: string, opts?: Options) {
67
72
  const context = workspaceContext.createChildContext(path.resolve(dir.name, q));
68
73
  const addErrorSpy = jest.spyOn(context, "addError");
69
- consistentDependencies.check(context, undefined);
74
+ consistentDependencies.check(context, opts);
70
75
  return { context, addErrorSpy };
71
76
  }
72
77
 
73
78
  function addFile(filePath: string, content: string) {
74
79
  const dirPath = path.resolve(dir.name, path.dirname(filePath));
75
80
  const resolvedFilePath = path.resolve(dir.name, filePath);
76
- mkdirSync(dirPath, { recursive: true });
81
+
82
+ makeDirectoryRecursively(dirPath);
77
83
  writeFileSync(resolvedFilePath, content);
78
84
  }
79
85
 
@@ -88,6 +94,7 @@ describe("consistentDependencies", () => {
88
94
  const { addFile, workspaceContext, checkAndSpy } = makeWorkspace({ fix: false });
89
95
  addFile("./package.json", PACKAGE_ROOT);
90
96
  addFile("./packages/star/package.json", PACKAGE_CHILD_WITH_STAR);
97
+ addFile("./packages/latest/package.json", PACKAGE_CHILD_WITH_LATEST);
91
98
  addFile("./packages/right/package.json", PACKAGE_CHILD_WITH_RIGHT_VERSION);
92
99
  addFile("./packages/wrong/package.json", PACKAGE_CHILD_WITH_WRONG_VERSION);
93
100
 
@@ -96,6 +103,9 @@ describe("consistentDependencies", () => {
96
103
  const star = checkAndSpy("./packages/star");
97
104
  expect(star.addErrorSpy).toHaveBeenCalledTimes(0);
98
105
 
106
+ const latest = checkAndSpy("./packages/latest");
107
+ expect(latest.addErrorSpy).toHaveBeenCalledTimes(0);
108
+
99
109
  const right = checkAndSpy("./packages/right");
100
110
  expect(right.addErrorSpy).toHaveBeenCalledTimes(0);
101
111
 
@@ -114,4 +124,13 @@ describe("consistentDependencies", () => {
114
124
  const contents = readFile("./packages/wrong/package.json");
115
125
  expect(contents).toEqual(PACKAGE_CHILD_WITH_RIGHT_VERSION);
116
126
  });
127
+
128
+ it("ignores ignored dependencies", () => {
129
+ const { addFile, checkAndSpy } = makeWorkspace({ fix: false });
130
+ addFile("./package.json", PACKAGE_ROOT);
131
+ addFile("./packages/wrong/package.json", PACKAGE_CHILD_WITH_WRONG_VERSION);
132
+
133
+ const ignored = checkAndSpy("./packages/wrong", { ignoredDependencies: ["foo"] });
134
+ expect(ignored.addErrorSpy).toHaveBeenCalledTimes(0);
135
+ });
117
136
  });