@monorepolint/rules 0.6.0-alpha.4 → 0.6.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-clean.log +1 -1
- package/.turbo/turbo-compile-typescript.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +443 -92
- package/.turbo/turbo-transpile-typescript.log +5 -5
- package/CHANGELOG.md +112 -0
- package/build/js/index.js +413 -368
- package/build/js/index.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/REMOVE.d.ts +2 -0
- package/build/types/REMOVE.d.ts.map +1 -0
- package/build/types/__tests__/alphabeticalDependencies.spec.d.ts +8 -0
- package/build/types/__tests__/alphabeticalDependencies.spec.d.ts.map +1 -0
- package/build/types/__tests__/forceError.spec.d.ts +8 -0
- package/build/types/__tests__/forceError.spec.d.ts.map +1 -0
- package/build/types/__tests__/oncePerPackage.spec.d.ts +8 -0
- package/build/types/__tests__/oncePerPackage.spec.d.ts.map +1 -0
- package/build/types/__tests__/standardTsconfig.spec.d.ts +8 -0
- package/build/types/__tests__/standardTsconfig.spec.d.ts.map +1 -0
- package/build/types/bannedDependencies.d.ts +9 -33
- package/build/types/bannedDependencies.d.ts.map +1 -1
- package/build/types/consistentDependencies.d.ts +6 -6
- package/build/types/consistentDependencies.d.ts.map +1 -1
- package/build/types/consistentVersions.d.ts +6 -10
- package/build/types/consistentVersions.d.ts.map +1 -1
- package/build/types/fileContents.d.ts +3 -2
- package/build/types/fileContents.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/mustSatisfyPeerDependencies.d.ts +12 -190
- package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -1
- package/build/types/nestedWorkspaces.d.ts +2 -2
- package/build/types/nestedWorkspaces.d.ts.map +1 -1
- package/build/types/oncePerPackage.d.ts +6 -6
- package/build/types/oncePerPackage.d.ts.map +1 -1
- package/build/types/packageEntry.d.ts +11 -33
- package/build/types/packageEntry.d.ts.map +1 -1
- package/build/types/packageOrder.d.ts +2 -1
- package/build/types/packageOrder.d.ts.map +1 -1
- package/build/types/packageScript.d.ts +13 -22
- package/build/types/packageScript.d.ts.map +1 -1
- package/build/types/requireDependency.d.ts +5 -20
- package/build/types/requireDependency.d.ts.map +1 -1
- package/build/types/standardTsconfig.d.ts +12 -19
- package/build/types/standardTsconfig.d.ts.map +1 -1
- package/build/types/util/zodSchemas.d.ts +14 -0
- package/build/types/util/zodSchemas.d.ts.map +1 -0
- package/coverage/block-navigation.js +1 -1
- package/coverage/clover.xml +1420 -1452
- package/coverage/coverage-final.json +21 -19
- package/coverage/index.html +27 -27
- package/coverage/sorter.js +21 -7
- package/coverage/src/REMOVE.ts.html +88 -0
- package/coverage/src/alphabeticalDependencies.ts.html +15 -15
- package/coverage/src/alphabeticalScripts.ts.html +5 -5
- package/coverage/src/bannedDependencies.ts.html +20 -53
- package/coverage/src/consistentDependencies.ts.html +20 -14
- package/coverage/src/consistentVersions.ts.html +330 -183
- package/coverage/src/fileContents.ts.html +223 -88
- package/coverage/src/forceError.ts.html +31 -31
- package/coverage/src/index.html +104 -89
- package/coverage/src/index.ts.html +11 -5
- package/coverage/src/mustSatisfyPeerDependencies.ts.html +15 -501
- package/coverage/src/nestedWorkspaces.ts.html +5 -5
- package/coverage/src/oncePerPackage.ts.html +31 -31
- package/coverage/src/packageEntry.ts.html +121 -91
- package/coverage/src/packageOrder.ts.html +44 -14
- package/coverage/src/packageScript.ts.html +235 -88
- package/coverage/src/requireDependency.ts.html +241 -82
- package/coverage/src/standardTsconfig.ts.html +212 -212
- package/coverage/src/util/checkAlpha.ts.html +40 -40
- package/coverage/src/util/createRuleFactory.ts.html +19 -19
- package/coverage/src/util/index.html +30 -15
- package/coverage/src/util/makeDirectory.ts.html +11 -11
- package/coverage/src/util/packageDependencyGraphService.ts.html +1 -1
- package/coverage/src/util/zodSchemas.ts.html +130 -0
- package/package.json +15 -15
- package/src/REMOVE.ts +1 -0
- package/src/__tests__/alphabeticalDependencies.spec.ts +102 -0
- package/src/__tests__/alphabeticalScripts.spec.ts +18 -0
- package/src/__tests__/bannedDependencies.spec.ts +49 -0
- package/src/__tests__/consistentDependencies.spec.ts +23 -0
- package/src/__tests__/consistentVersions.spec.ts +142 -0
- package/src/__tests__/fileContents.spec.ts +348 -0
- package/src/__tests__/forceError.spec.ts +70 -0
- package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +44 -0
- package/src/__tests__/nestedWorkspaces.spec.ts +14 -0
- package/src/__tests__/oncePerPackage.spec.ts +75 -0
- package/src/__tests__/packageEntry.spec.ts +177 -0
- package/src/__tests__/packageOrder.spec.ts +22 -0
- package/src/__tests__/packageScript.spec.ts +549 -0
- package/src/__tests__/requireDependency.spec.ts +259 -2
- package/src/__tests__/standardTsconfig.spec.ts +91 -0
- package/src/bannedDependencies.ts +14 -25
- package/src/consistentDependencies.ts +10 -8
- package/src/consistentVersions.ts +132 -83
- package/src/fileContents.ts +80 -35
- package/src/index.ts +2 -0
- package/src/mustSatisfyPeerDependencies.ts +10 -172
- package/src/nestedWorkspaces.ts +4 -4
- package/src/oncePerPackage.ts +6 -6
- package/src/packageEntry.ts +60 -50
- package/src/packageOrder.ts +19 -9
- package/src/packageScript.ts +67 -18
- package/src/requireDependency.ts +84 -31
- package/src/standardTsconfig.ts +26 -26
- package/src/util/zodSchemas.ts +15 -0
package/build/js/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/checkAlpha.ts","../../src/util/createRuleFactory.ts","../../src/alphabeticalDependencies.ts","../../src/alphabeticalScripts.ts","../../src/bannedDependencies.ts","../../src/util/packageDependencyGraphService.ts","../../src/consistentDependencies.ts","../../src/consistentVersions.ts","../../src/fileContents.ts","../../src/forceError.ts","../../src/mustSatisfyPeerDependencies.ts","../../src/nestedWorkspaces.ts","../../src/oncePerPackage.ts","../../src/packageEntry.ts","../../src/packageOrder.ts","../../src/packageScript.ts","../../src/requireDependency.ts","../../src/standardTsconfig.ts"],"sourcesContent":["/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\n\nexport function checkAlpha(\n context: Context,\n block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\" | \"scripts\",\n) {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const blockToSort = packageJson[block];\n\n if (blockToSort === undefined) {\n return;\n }\n\n const actualOrder = Object.keys(blockToSort);\n const expectedOrder = actualOrder.slice().sort(); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: createIncorrectOrderErrorMessage(block, packageJson.name!),\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n const expectedDependencies: Record<string, string> = {};\n\n expectedOrder.forEach((dep) => {\n expectedDependencies[dep] = blockToSort[dep];\n });\n\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function createIncorrectOrderErrorMessage(\n block: string,\n packageName: string,\n) {\n return `Incorrect order of ${block} in ${packageName}'s package.json`;\n}\n","import { Context, RuleEntry, RuleModule } from \"@monorepolint/config\";\n\nexport type ValidateOptionsFn<X> = (options: unknown) => asserts options is X;\nexport type RuleFactoryFn<T> = (ruleEntry: RuleEntry<T>) => RuleModule<T>;\nexport type RuleCheckFn<O> = (\n context: Context,\n options: O,\n extra: { id: string },\n) => Promise<unknown> | unknown;\n\nexport interface RuleFactoryOptions<X> {\n name: string;\n check: RuleCheckFn<X>;\n printStats?: () => void;\n validateOptions: ValidateOptionsFn<X>;\n}\n\nlet globalId = 0;\nexport function createRuleFactory<X>({\n name,\n check,\n validateOptions,\n printStats,\n}: RuleFactoryOptions<X>): RuleFactoryFn<X> {\n return function(ruleEntry) {\n const id = ruleEntry.id ?? `${name} :: ${globalId++}`;\n return {\n id,\n // eslint-disable-next-line @typescript-eslint/no-extra-non-null-assertion\n check: (context) => check(context, ruleEntry.options!!, { id }),\n name,\n validateOptions,\n ruleEntry,\n printStats,\n };\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const alphabeticalDependencies = createRuleFactory<undefined>({\n name: \"alphabeticalDependencies\",\n check: (context) => {\n checkAlpha(context, \"dependencies\");\n checkAlpha(context, \"devDependencies\");\n checkAlpha(context, \"peerDependencies\");\n },\n validateOptions: () => {},\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const alphabeticalScripts = createRuleFactory<undefined>({\n name: \"alphabeticalScripts\",\n check: (context) => {\n checkAlpha(context, \"scripts\");\n },\n validateOptions: () => {},\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { matchesAnyGlob } from \"@monorepolint/utils\";\nimport { AggregateTiming } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nimport {\n IPackageDependencyGraphNode,\n PackageDependencyGraphService,\n} from \"./util/packageDependencyGraphService.js\";\n// FIXME: This rule is messed. bannedTransitiveDependencies doesnt glob\n\nconst bannedDepGlobsField = r.Union(\n r.Array(r.String),\n r.Record({\n glob: r.Array(r.String).optional(),\n exact: r.Array(r.String).optional(),\n }),\n);\n\nconst Options = r.Union(\n r.Record({\n bannedDependencies: bannedDepGlobsField,\n bannedTransitiveDependencies: r.Undefined.optional(),\n }),\n r.Record({\n bannedDependencies: bannedDepGlobsField.optional(),\n bannedTransitiveDependencies: r.Array(r.String),\n }),\n r.Record({\n bannedDependencies: bannedDepGlobsField.optional(),\n bannedTransitiveDependencies: r.Array(r.String).optional(),\n }),\n);\n\nexport type Options = r.Static<typeof Options>;\n\n/**\n * We use this locally to avoid making a billion sets. Because check is called once per package\n * (with the exact same config object reference) we can save quite a bit of time by reusing this cache.\n */\nconst setCache = new Map<ReadonlyArray<string>, Set<string>>();\n\nconst aggregateTiming = new AggregateTiming(\":bannedDependencies stats\");\n\nexport const bannedDependencies = createRuleFactory<Options>({\n name: \"bannedDependencies\",\n check: (context, opts, extra) => {\n aggregateTiming.start(extra?.id ?? \"unknown id\");\n\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const curDeps = packageJson.dependencies\n && Object.keys(packageJson.dependencies);\n const curDevDeps = packageJson.devDependencies\n && Object.keys(packageJson.devDependencies);\n const curPeerDeps = packageJson.peerDependencies\n && Object.keys(packageJson.peerDependencies);\n\n const {\n bannedDependencies: banned,\n bannedTransitiveDependencies: transitives,\n } = opts;\n\n const globs = banned && (Array.isArray(banned) ? banned : banned.glob);\n const exacts = banned && (Array.isArray(banned) ? undefined : banned.exact);\n\n const violations = new Set<string>();\n\n if (globs) {\n if (curDeps) populateProblemsGlobs(globs, curDeps, violations);\n if (curDevDeps) populateProblemsGlobs(globs, curDevDeps, violations);\n if (curPeerDeps) populateProblemsGlobs(globs, curPeerDeps, violations);\n }\n\n if (exacts) {\n let set = setCache.get(exacts);\n if (set === undefined) {\n set = new Set(exacts);\n setCache.set(exacts, set);\n }\n if (curDeps) populateProblemsExact(set, curDeps, violations);\n if (curDevDeps) populateProblemsExact(set, curDevDeps, violations);\n if (curPeerDeps) populateProblemsExact(set, curPeerDeps, violations);\n }\n\n if (violations.size > 0) {\n context.addError({\n file: packagePath,\n message: `Found ${violations.size} banned dependencies of package.json:\\n\\t`\n + Array.from(violations)\n .map((v) => `'${v}'`)\n .join(\", \"),\n });\n }\n\n if (transitives) {\n let set = setCache.get(transitives);\n if (set === undefined) {\n set = new Set(transitives);\n setCache.set(transitives, set);\n }\n checkTransitives(context, set);\n }\n\n aggregateTiming.stop();\n },\n validateOptions: Options.check,\n printStats: () => {\n aggregateTiming.printResults();\n },\n});\n\nfunction populateProblemsExact(\n banned: Set<string>,\n dependencies: ReadonlyArray<string>,\n violations: Set<string>,\n) {\n for (const dependency of dependencies) {\n if (banned.has(dependency)) {\n violations.add(dependency);\n }\n }\n}\n\nfunction populateProblemsGlobs(\n bannedDependencyGlobs: ReadonlyArray<string>,\n dependencies: ReadonlyArray<string>,\n violations: Set<string>,\n) {\n for (const dependency of dependencies) {\n if (matchesAnyGlob(dependency, bannedDependencyGlobs)) {\n violations.add(dependency);\n }\n }\n}\n\n// This function is slow. God help you if you use this on a big repo\nfunction checkTransitives(context: Context, banned: Set<string>) {\n const graphService = new PackageDependencyGraphService();\n const root = graphService.buildDependencyGraph(\n path.resolve(context.getPackageJsonPath()),\n context.host,\n );\n for (const { dependencies, importPath } of graphService.traverse(root)) {\n for (const [dependency] of dependencies) {\n if (banned.has(dependency)) {\n // Remove the starting package since it's obvious in CLI output.\n const [, ...importPathWithoutRoot] = importPath;\n const pathing = [\n ...importPathWithoutRoot.map(nameOrPackageJsonPath),\n dependency,\n ].join(\" -> \");\n\n context.addError({\n file: root.paths.packageJsonPath,\n message: `Banned transitive dependencies in repo: ${pathing}`,\n });\n }\n }\n }\n}\n\nfunction nameOrPackageJsonPath(node: IPackageDependencyGraphNode): string {\n return node.packageJson.name ?? node.paths.packageJsonPath;\n}\n","/**\n * @license Copyright 2019 Palantir Technologies, Inc. All rights reserved.\n */\n\nimport { Host, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport resolvePackagePath from \"resolve-package-path\";\n\n/** Interface for a node in a package dependency graph. */\nexport interface IPackageDependencyGraphNode {\n packageJson: PackageJson;\n dependencies: Map<string, IPackageDependencyGraphNode>;\n paths: {\n packageJsonPath: string;\n rootDirectory: string;\n };\n}\n\n/** Service abstraction for constructing and traversing package dependency graphs. */\nexport interface IPackageDependencyGraphService {\n /** Construct a graph of package dependencies. */\n buildDependencyGraph(\n packageJsonPath: string,\n host: Host,\n maxDepth?: number,\n ): IPackageDependencyGraphNode;\n\n /** Traverse a package dependency graph. */\n traverse(\n root: IPackageDependencyGraphNode,\n opts?: {\n /** Traverse each unique path to a given package (potentially slow). */\n traverseAllPaths?: boolean;\n },\n ): IterableIterator<\n IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }\n >;\n}\n\n/** Default implementation of the package dependency graph service. */\nexport class PackageDependencyGraphService implements IPackageDependencyGraphService {\n /** Construct a graph of package dependencies and return the root node. */\n public buildDependencyGraph(\n startPackageJsonPath: string,\n host: Host,\n maxDepth?: number,\n ): IPackageDependencyGraphNode {\n const nodes = new Map<string, IPackageDependencyGraphNode>();\n const visit = (\n packageJsonPath: string,\n currentDepth: number,\n ): IPackageDependencyGraphNode => {\n if (nodes.has(packageJsonPath)) {\n return nodes.get(packageJsonPath)!;\n }\n\n const packageJson = host.readJson(packageJsonPath) as PackageJson;\n const node: IPackageDependencyGraphNode = {\n packageJson,\n dependencies: new Map<string, IPackageDependencyGraphNode>(),\n paths: {\n packageJsonPath,\n rootDirectory: path.dirname(packageJsonPath),\n },\n };\n\n // It's important that we register the node before visiting its dependencies to avoid cycles\n nodes.set(packageJsonPath, node);\n\n const nextDepth = currentDepth + 1;\n if (maxDepth == null || nextDepth <= maxDepth) {\n const dependencies = packageJson.dependencies != null\n ? Object.keys(packageJson.dependencies)\n : [];\n for (const dependency of dependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(\n dependency,\n node.paths.rootDirectory,\n );\n if (dependencyPackageJsonPath == null) {\n throw new Error(\n `Could not resolve ${dependency} from ${node.paths.rootDirectory}`,\n );\n }\n\n node.dependencies.set(\n dependency,\n visit(dependencyPackageJsonPath, nextDepth),\n );\n }\n }\n\n return node;\n };\n\n return visit(startPackageJsonPath, 0);\n }\n\n /** Traverse a package dependency graph with an iterator. */\n public *traverse(\n root: IPackageDependencyGraphNode,\n opts = { traverseAllPaths: false },\n ): IterableIterator<\n IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }\n > {\n const visited = new Set<IPackageDependencyGraphNode>();\n\n function* visit(\n node: IPackageDependencyGraphNode,\n importPath: IPackageDependencyGraphNode[] = [],\n ): IterableIterator<\n IPackageDependencyGraphNode & {\n importPath: IPackageDependencyGraphNode[];\n }\n > {\n // Don't visit a package more than once unless explicitly asked to traverse all paths\n if (!opts.traverseAllPaths && visited.has(node)) {\n return;\n }\n\n // Break cycles when traversing all paths\n if (importPath.indexOf(node) !== -1) {\n return;\n }\n\n // Visit the node\n visited.add(node);\n importPath = [...importPath, node];\n yield { ...node, importPath };\n\n // Recursively visit the node's dependencies\n for (const dependency of node.dependencies.values()) {\n yield* visit(dependency, importPath);\n }\n }\n\n yield* visit(root);\n }\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nconst Options = r\n .Record({\n ignoredDependencies: r.Array(r.String).Or(r.Undefined),\n })\n .Or(r.Undefined);\nexport type Options = r.Static<typeof Options>;\n\nconst skippedVersions = [\"*\", \"latest\"];\n\nexport const consistentDependencies = createRuleFactory<Options>({\n name: \"consistentDependencies\",\n check: (context, args) => {\n checkDeps(context, args, \"dependencies\");\n checkDeps(context, args, \"devDependencies\");\n // we don't check peer deps since they can be more lenient\n },\n validateOptions: Options.check,\n});\n\nfunction checkDeps(\n context: Context,\n args: Options,\n block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\",\n) {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n const dependencies = packageJson[block];\n\n const workspacePackageJson = context.getWorkspaceContext().getPackageJson();\n const workspaceDependencies = workspacePackageJson[block];\n\n const ignoredDeps = args?.ignoredDependencies ?? [];\n const depsToCheck = workspaceDependencies == null || ignoredDeps.length === 0\n ? workspaceDependencies\n : omit(workspaceDependencies, ignoredDeps);\n\n if (dependencies === undefined || depsToCheck === undefined) {\n return;\n }\n\n const expectedDependencies = {\n ...dependencies,\n ...filterKeys(depsToCheck, dependencies),\n };\n\n if (JSON.stringify(dependencies) !== JSON.stringify(expectedDependencies)) {\n context.addError({\n file: packagePath,\n message: `Inconsistent ${block} with root in package.json`,\n longMessage: diff(expectedDependencies, dependencies, { expand: true }),\n fixer: () => {\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction filterKeys(\n ob: Record<string, string>,\n filterOb: Record<string, string>,\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const newOb: Record<string, any> = {};\n\n for (const key of Object.keys(filterOb)) {\n if (\n ob[key] !== undefined && skippedVersions.indexOf(filterOb[key]) === -1\n ) {\n newOb[key] = ob[key];\n }\n }\n\n return newOb;\n}\n\nfunction omit<T>(\n obj: Record<string, T>,\n keysToOmit: readonly string[],\n): Record<string, T> {\n const newObj: Record<string, T> = {};\n\n const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));\n for (const [key, value] of filtered) {\n newObj[key] = value;\n }\n\n return newObj;\n}\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport * as r from \"runtypes\";\nimport { coerce, SemVer } from \"semver\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nexport const Options = r.Record({\n matchDependencyVersions: r.Dictionary(r.Union(r.String, r.Array(r.String))),\n});\n\nexport type Options = r.Static<typeof Options>;\n\nexport const consistentVersions = createRuleFactory({\n name: \"consistentVersions\",\n check: checkConsistentVersions,\n validateOptions: Options.check,\n});\n\nfunction checkConsistentVersions(context: Context, options: Options) {\n for (\n const [dependencyPackageName, expectedPackageDependencyValue] of Object\n .entries(\n options.matchDependencyVersions,\n )\n ) {\n if (Array.isArray(expectedPackageDependencyValue)) {\n ensurePackageMatchesSomeVersion(\n context,\n dependencyPackageName,\n expectedPackageDependencyValue,\n );\n } else {\n ensurePackageIsCorrectVersion(\n context,\n dependencyPackageName,\n expectedPackageDependencyValue,\n );\n }\n }\n}\n\nconst ensurePackageIsCorrectVersion = (\n context: Context,\n dependencyPackageName: string,\n expectedPackageDependencyValue: string,\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n const expectedPackageDependencyVersion = coerce(\n expectedPackageDependencyValue,\n );\n if (expectedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'`,\n );\n }\n\n const actualPackageDependencyValue = packageJson.dependencies\n && packageJson.dependencies[dependencyPackageName];\n const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);\n if (\n actualPackageDependencyVersion != null\n && actualPackageDependencyVersion.raw\n !== expectedPackageDependencyVersion.raw\n ) {\n context.addError({\n file: packageJsonPath,\n message:\n `Expected dependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDependencyValue}' instead.`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.dependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n\n const actualPackageDevDependencyValue = packageJson.devDependencies\n && packageJson.devDependencies[dependencyPackageName];\n const actualPackageDevDependencyVersion = coerce(\n actualPackageDevDependencyValue,\n );\n if (\n actualPackageDevDependencyVersion != null\n && actualPackageDevDependencyVersion.raw\n !== expectedPackageDependencyVersion.raw\n ) {\n context.addError({\n file: packageJsonPath,\n message:\n `Expected devDependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDevDependencyValue}' instead`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.devDependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n};\n\nconst ensurePackageMatchesSomeVersion = (\n context: Context,\n dependencyPackageName: string,\n acceptedPackageDependencyValues: string[],\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n const acceptedPackageDependencyVersions: SemVer[] = acceptedPackageDependencyValues.map(\n (acceptedPackageDependencyValue) => {\n const acceptedPackageDependencyVersion = coerce(\n acceptedPackageDependencyValue,\n );\n if (acceptedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`,\n );\n }\n return acceptedPackageDependencyVersion;\n },\n );\n\n const actualPackageDependencyValue = packageJson.dependencies\n && packageJson.dependencies[dependencyPackageName];\n const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);\n if (\n actualPackageDependencyVersion != null\n && acceptedPackageDependencyVersions.every(\n (acceptedPackageDependencyVersion) =>\n actualPackageDependencyVersion.raw\n !== acceptedPackageDependencyVersion.raw,\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency on ${dependencyPackageName} to match one of '${\n JSON.stringify(\n acceptedPackageDependencyValues,\n )\n }', got '${actualPackageDependencyValue}' instead.`,\n });\n }\n\n const actualPackageDevDependencyValue = packageJson.devDependencies\n && packageJson.devDependencies[dependencyPackageName];\n const actualPackageDevDependencyVersion = coerce(\n actualPackageDevDependencyValue,\n );\n if (\n actualPackageDevDependencyVersion != null\n && acceptedPackageDependencyVersions.every(\n (acceptedPackageDependencyVersion) =>\n actualPackageDevDependencyVersion.raw\n !== acceptedPackageDependencyVersion.raw,\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected devDependency on ${dependencyPackageName} to match one of '${\n JSON.stringify(\n acceptedPackageDependencyValues,\n )\n }', got '${actualPackageDevDependencyValue}' instead.`,\n });\n }\n};\n","/*!\n * Copyright 2023 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nconst Options = r.Union(\n r.Record({\n file: r.String,\n generator: r.Function.withGuard((\n x,\n ): x is (context: Context) => string | Promise<string> => x != undefined),\n template: r.Undefined.optional(),\n templateFile: r.Undefined.optional(),\n }),\n r.Record({\n file: r.String,\n generator: r.Undefined.optional(),\n template: r.String.Or(r.Undefined),\n templateFile: r.Undefined.optional(),\n }),\n r.Record({\n file: r.String,\n generator: r.Undefined.optional(),\n template: r.Undefined.optional(),\n templateFile: r.String,\n }),\n);\n\ntype Options = r.Static<typeof Options>;\n\nexport const fileContents = createRuleFactory<Options>({\n name: \"fileContents\",\n check: async (context, opts) => {\n const fullPath = path.join(context.packageDir, opts.file);\n const expectedContent = await getExpectedContents(context, opts);\n\n const pathExists = context.host.exists(fullPath);\n const actualContent = pathExists\n ? context.host.readFile(fullPath, { encoding: \"utf-8\" })\n : undefined;\n if (actualContent !== expectedContent) {\n const longMessage = pathExists && expectedContent == undefined\n ? undefined\n : diff(expectedContent, actualContent, { expand: true });\n\n const message = pathExists && expectedContent == undefined\n ? \"File should not exist\"\n : \"Expect file contents to match\";\n\n context.addError({\n file: fullPath,\n message,\n longMessage,\n fixer: () => {\n if (expectedContent === undefined) {\n if (pathExists) context.host.deleteFile(fullPath);\n } else {\n context.host.mkdir(path.dirname(fullPath), { recursive: true });\n context.host.writeFile(fullPath, expectedContent, {\n encoding: \"utf-8\",\n });\n }\n },\n });\n }\n },\n validateOptions: Options.check,\n});\n\nconst optionsCache = new Map<\n Options,\n | ((context: Context) => Promise<string> | string | undefined)\n | string\n | undefined\n>();\n\nasync function getExpectedContents(context: Context, opts: Options) {\n // we need to use has because undefined is a valid value in the cache\n if (optionsCache.has(opts)) {\n const cachedEntry = optionsCache.get(opts);\n if (cachedEntry && typeof cachedEntry === \"function\") {\n return cachedEntry(context);\n }\n return cachedEntry;\n }\n\n if (opts.generator) {\n optionsCache.set(opts, opts.generator);\n return opts.generator(context);\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = context.host.readFile(fullPath, { encoding: \"utf-8\" });\n\n optionsCache.set(opts, template);\n return template;\n } else {\n optionsCache.set(opts, opts.template);\n return opts.template;\n }\n}\n","import { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const forceError = createRuleFactory<{ customMessage?: string }>({\n name: \"forceError\",\n\n check: async (context, opts) => {\n context.addError({\n message: opts?.customMessage\n ?? \"Forced error (often used to debug package selection)\",\n file: context.getPackageJsonPath(),\n });\n },\n\n validateOptions: (opts): asserts opts is null | { customMessage: string } => {\n if (opts == null) return;\n\n if (typeof opts !== \"object\") {\n throw new Error(\"options must be an object if provided\");\n }\n\n const numKeys = Object.keys(opts).length;\n\n if (numKeys === 0) return;\n\n if (Object.keys(opts).length > 1 || !(\"customMessage\" in opts)) {\n throw new Error(\"options must only have `customMessage` property\");\n }\n\n if (typeof opts.customMessage !== \"string\") {\n throw new Error(\"customMessage must be a string\");\n }\n },\n});\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { Host, mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport resolvePackagePath from \"resolve-package-path\";\nimport * as r from \"runtypes\";\nimport { coerce } from \"semver\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nconst Options = r.Union(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n ),\n r\n .Record({\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n ),\n r\n .Record({\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n }),\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n })\n .And(\n r.Partial({\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n }),\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyBlacklist: r.Undefined,\n }),\n ),\n r\n .Record({\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n }),\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n enforceForDevDependencies: r.Undefined,\n }),\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyBlacklist: r.Undefined,\n }),\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n }),\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n }),\n ),\n r.Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n }),\n);\n\nexport type Options = r.Static<typeof Options>;\n\nexport const mustSatisfyPeerDependencies = createRuleFactory({\n name: \"mustSatisfyPeerDependencies\",\n check: checkSatisfyPeerDependencies,\n validateOptions: Options.check,\n});\n\n/**\n * separating on `|`, this regex allows any of the following formats:\n * - `*`\n * - `x`\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_ANY_VERSION_RANGE = /^(\\*|x)$/;\n\n/**\n * This regex allows any of the following formats:\n * - `>=15`\n * - `>=15.2`\n * - `>=15.2.1`\n * - `>=15.2.1-rc.0`\n * - `>=15.2.1+sha`\n * - `>=15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_GREATER_OR_EQUAL_VERSION_RANGE =\n /^>= ?\\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-]+)*))?)?$/;\n\n/**\n * This regex allows any of the following formats:\n * - `15`\n * - `^15`\n * - `15.x`\n * - `^15.x`\n * - `15.x.x`\n * - `^15.x.x`\n * - `^15.2`\n * - `^15.2.x`\n * - `^15.2.1`\n * - `^15.2.1-rc.0`\n * - `^15.2.1+sha`\n * - `^15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_MAJOR_VERSION_RANGE =\n /^(?:\\^?\\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-]+)*))?)$/;\n\n/**\n * Does not currently accept `<`, `<=`, `>`, `=` or `-` for ranges (e.g. `> 2.5.1 < 3` or `1.0.0 - 1.2.0`),\n * though it will accept isolated `>=` ranges (e.g. `>=2.5.1`, but not `^1 || >=2.5.1`)\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n *\n * TODO: accept minor pins `~4.2.1`\n */\nexport const RANGE_REGEX =\n /^(\\*|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-]+)*))?)?)*)$/;\n\ninterface IPeerDependencyRequirement {\n fromPackageName: string;\n range: ValidRange;\n}\n\ninterface IResolvedPeerDependencyRequirement {\n fromPeerDependencyRequirements: IPeerDependencyRequirement[];\n range: ValidRange;\n}\n\nfunction checkSatisfyPeerDependencies(context: Context, opts: Options) {\n const {\n dependencyBlacklist,\n dependencyWhitelist,\n enforceForDevDependencies,\n skipUnparseableRanges,\n } = opts;\n const packageJsonPath = path.resolve(context.getPackageJsonPath());\n const packageJson = context.host.readJson(packageJsonPath) as PackageJson;\n const packageDependencies = packageJson.dependencies || {};\n const packageDevDependencies = packageJson.devDependencies || {};\n const packagePeerDependencies = packageJson.peerDependencies || {};\n const packageName = packageJson.name || packageJsonPath;\n\n // check that no peer dependencies are also declared as regular dependencies\n for (\n const [peerDependencyName, peerDependencyRange] of Object.entries(\n packagePeerDependencies,\n )\n ) {\n if (\n shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName: peerDependencyName,\n })\n ) {\n continue;\n }\n\n const dependencyRange = packageDependencies[peerDependencyName];\n if (dependencyRange != null) {\n context.addError({\n file: packageJsonPath,\n message: `[0] Package ${packageName} has overloaded ${peerDependencyName} dependencies.\\n\\t`\n + `Peer dependency '${peerDependencyRange}' and regular dependency '${dependencyRange}'.`,\n });\n }\n }\n\n // map of all inherited peer dependency requirements\n const allRequiredPeerDependencies: {\n [peerDependencyName: string]: IPeerDependencyRequirement[];\n } = {};\n\n // for each of this package's dependencies, add the dependency's peer requirements into `allRequiredPeerDependencies`\n const allDependencies = enforceForDevDependencies\n ? [\n ...Object.keys(packageDependencies),\n ...Object.keys(packageDevDependencies),\n ]\n : Object.keys(packageDependencies);\n for (const dependency of allDependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(\n dependency,\n path.dirname(packageJsonPath),\n );\n if (dependencyPackageJsonPath == null) {\n throw new Error(\n `Could not resolve ${dependency} from ${path.dirname(packageJsonPath)}`,\n );\n }\n const dependencyPackageJson = context.host.readJson(\n dependencyPackageJsonPath,\n ) as PackageJson;\n const requiredPeerDependencies = dependencyPackageJson.peerDependencies;\n if (requiredPeerDependencies == null) {\n continue;\n }\n for (\n const [peerDependencyName, range] of Object.entries(\n requiredPeerDependencies,\n )\n ) {\n if (\n shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName: peerDependencyName,\n })\n ) {\n continue;\n }\n\n if (!isValidRange(range)) {\n const message =\n `Unable to parse ${dependencyPackageJson.name}'s ${peerDependencyName} peer dependency range '${range}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: dependencyPackageJsonPath, message });\n continue;\n }\n throw new Error(message);\n }\n if (allRequiredPeerDependencies[peerDependencyName] == null) {\n allRequiredPeerDependencies[peerDependencyName] = [];\n }\n allRequiredPeerDependencies[peerDependencyName].push({\n fromPackageName: dependencyPackageJson.name!,\n range,\n });\n }\n }\n\n for (\n const [peerDependencyName, peerDependencyRequirements] of Object.entries(\n allRequiredPeerDependencies,\n )\n ) {\n // for each inherited peer dependency, determine the strictest range\n let mostStrictPeerRequirement: IResolvedPeerDependencyRequirement = {\n fromPeerDependencyRequirements: [peerDependencyRequirements[0]],\n range: peerDependencyRequirements[0].range,\n };\n for (const peerRequirement of peerDependencyRequirements) {\n if (\n doesASatisfyB(mostStrictPeerRequirement.range, peerRequirement.range)\n ) {\n continue;\n } else if (\n doesASatisfyB(peerRequirement.range, mostStrictPeerRequirement.range)\n ) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [peerRequirement],\n range: peerRequirement.range,\n };\n } else {\n const maybeIntersection = findIntersection(\n peerRequirement.range,\n mostStrictPeerRequirement.range,\n );\n if (maybeIntersection !== undefined) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [\n ...mostStrictPeerRequirement.fromPeerDependencyRequirements,\n peerRequirement,\n ],\n range: maybeIntersection,\n };\n } else {\n context.addError({\n file: packageJsonPath,\n message:\n `[1] Package ${packageName} has conflicting inherited ${peerDependencyName} peer dependencies.\\n\\t`\n + `Dependency ${peerRequirement.fromPackageName} requires '${peerRequirement.range}' but\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n }\n\n // if this package has a dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n const packageDependencyRange = packageDependencies[peerDependencyName];\n if (packageDependencyRange != null) {\n if (!isValidRange(packageDependencyRange)) {\n const message =\n `Unable to parse ${packageName}'s ${peerDependencyName} dependency range '${packageDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (\n !doesASatisfyB(packageDependencyRange, mostStrictPeerRequirement.range)\n ) {\n context.addError({\n file: packageJsonPath,\n message:\n `[2] Package ${packageName} dependency on ${peerDependencyName} '${packageDependencyRange}' does not satisfy inherited peer dependencies.\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n\n // for every inherited peer dependency, this package must declare a dependency or peer dependency\n // equal to or stricter than `mostStrictPeerRequirement`\n const packagePeerDependencyRange = packagePeerDependencies[peerDependencyName];\n if (packageDependencyRange == null && packagePeerDependencyRange == null) {\n context.addError({\n file: packageJsonPath,\n message:\n `[3] Package ${packageName} is missing required ${peerDependencyName} dependency.\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n\n // if this package has a peer dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n if (packagePeerDependencyRange != null) {\n if (!isValidRange(packagePeerDependencyRange)) {\n const message =\n `Unable to parse ${packageName}'s ${peerDependencyName} peer dependency range '${packagePeerDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (\n !doesASatisfyB(\n packagePeerDependencyRange,\n mostStrictPeerRequirement.range,\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message:\n `[4] Package ${packageName} peer dependency on ${peerDependencyName} '${packagePeerDependencyRange}' is not strict enough.\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n }\n }\n}\n\nfunction shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName,\n}: {\n dependencyBlacklist?: string[];\n dependencyWhitelist?: string[];\n packageName: string;\n}) {\n // blacklist should take precedance\n if (\n (dependencyBlacklist != null && dependencyBlacklist.includes(packageName))\n || (dependencyWhitelist != null\n && !dependencyWhitelist.includes(packageName))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getMostStrictStatement(\n mostStrictPeerRequirement: IResolvedPeerDependencyRequirement,\n) {\n if (mostStrictPeerRequirement.fromPeerDependencyRequirements.length === 1) {\n const dependencyName = mostStrictPeerRequirement.fromPeerDependencyRequirements[0]\n .fromPackageName;\n return `Dependency ${dependencyName} requires '${mostStrictPeerRequirement.range}'.`;\n } else {\n const dependencyNames = mostStrictPeerRequirement\n .fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => peerDependencyRequirement.fromPackageName)\n .join(\", \");\n const dependencyRequirements = mostStrictPeerRequirement\n .fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`)\n .join(\", \");\n return (\n `Dependencies [${dependencyNames}] require [${dependencyRequirements}] respectively, `\n + `resolving to '${mostStrictPeerRequirement.range}'.`\n );\n }\n}\n\n/**\n * Given two version ranges, find the maximum intersecting range\n * of `a` and `b`. `findIntersection(a,b)` should return the same\n * result as `findIntersection(b,a)`.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * EXAMPLES:\n * findIntersection(\"15.1.0\", \"*\") => \"15.1.0\"\n * findIntersection(\"^15\", \"*\") => \"^15\"\n * findIntersection(\">=15\", \"*\") => \">=15\"\n * findIntersection(\"*\", \"*\") => \"*\"\n * findIntersection(\"15.1.0\", \">=1\") => \"15.1.0\"\n * findIntersection(\"^15\", \">=1\") => \"^15\"\n * findIntersection(\">=15\", \">=1\") => \">=15\"\n * findIntersection(\"15.1.0\", \"^15\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15\") => \"^15.2\"\n * findIntersection(\"14\", \"^15\") => undefined\n * findIntersection(\"15.1.0\", \"^15 || ^16\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15 || ^16\") => \"^15.2\"\n * findIntersection(\"14\", \"^15 || ^16\") => undefined\n * findIntersection(\"^15.2 || ^16\", \"^15 || ^16.4\") => \"^15.2 || ^16.4\"\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns the maximum intersecting `ValidRange`, or `undefined` if there is no intersection\n */\nexport function findIntersection(\n a: ValidRange,\n b: ValidRange,\n): ValidRange | undefined {\n if (doesASatisfyB(a, b)) {\n return a;\n } else if (doesASatisfyB(b, a)) {\n return b;\n }\n\n // It's safe to assume that `isAnyVersionRange(a)` and `isAnyVersionRange(b)` are false,\n // since a `MATCH_ANY_VERSION_RANGE` would have been satisfied by anything.\n if (isAnyVersionRange(a) || isAnyVersionRange(b)) {\n throw new Error();\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n // If the ranges were equal, they'd both satisfy each other.\n // Otherwise, the higher range should have satisfied the lower range.\n throw new Error();\n }\n\n if (aIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n // keep every version where `bSemVer` is >= `aSemVer`\n // where bVersion has an operator, we need to adjust the version to take into\n // account aVersion, e.g. if a is >=15.2.3 and b is ^15, then the intersection is actually ^15.2.3\n const compatibleBVersions = bVersions\n .map((bVersion) => {\n const bSemVer = coerce(bVersion)!;\n if (bVersion.startsWith(\"^\") && bSemVer.major >= aSemVer.major) {\n return `^${bSemVer.compare(aSemVer) >= 0 ? bSemVer.raw : aSemVer.raw}`;\n }\n return bSemVer.compare(aSemVer) !== -1 ? bVersion : undefined;\n })\n .filter((bVersion): bVersion is string => bVersion != null);\n if (compatibleBVersions.length === 0) {\n return undefined;\n }\n return compatibleBVersions.join(\" || \") as ValidRange;\n }\n if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n // keep every version where `aSemVer` is >= `bSemVer`\n // where aVersion has an operator, we need to adjust the version to take into\n // account bVersion, e.g. if b is >=15.2.3 and a is ^15, then the intersection is actually ^15.2.3\n const compatibleAVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n if (aVersion.startsWith(\"^\") && aSemVer.major >= bSemVer.major) {\n return `^${aSemVer.compare(bSemVer) >= 0 ? aSemVer.raw : bSemVer.raw}`;\n }\n return aSemVer.compare(bSemVer) !== -1 ? aVersion : undefined;\n })\n .filter((aVersion): aVersion is string => aVersion != null);\n if (compatibleAVersions.length === 0) {\n return undefined;\n }\n return compatibleAVersions.join(\" || \") as ValidRange;\n }\n\n const compatibleVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // there is no intersecting `b` major version for this `a` major version\n return undefined;\n }\n if (\n doesASatisfyB(\n aVersion as ValidRange,\n majorMatchingBVersion as ValidRange,\n )\n ) {\n return aVersion;\n } else if (\n doesASatisfyB(\n majorMatchingBVersion as ValidRange,\n aVersion as ValidRange,\n )\n ) {\n return majorMatchingBVersion;\n } else {\n return undefined;\n }\n })\n .filter((aVersion) => aVersion !== undefined);\n if (compatibleVersions.length === 0) {\n return undefined;\n }\n return compatibleVersions.join(\" || \") as ValidRange;\n}\n\n/**\n * Given two version ranges, determine whether `a` satisfies `b`.\n * `a` satisfies `b` iff `a` is a \"more strict than or equal to\" subset of `b`.\n * For example, both `^15` and `^15.2.0` satisfy `^15`, but `^15 || ^16` does not.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * To determine that `a` is \"more strict than or equal to\" `b`, we first\n * split the set of all versions or ranges that are potentially unioned in `a` and `b`.\n * For example, if `a` is `15.0.5`, we produce the set `[ \"15.0.5\" ]`,\n * and if `b` is `^15 || ^16`, we produce the set `[ \"^15\", \"^16\" ]`.\n * `a` is \"more strict than or equal to\" `b` iff each entry in `a`'s set\n * satisfies (equal to or greater than) some entry in `b`.\n *\n * The following version ranges satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.5 || ^16.0.0`\n * - `^15.0.5 || ^16.x.x`\n * - `15.0.5 || 16.0.0`\n * - `^15.0.999 || ^16.0.0`\n * - `^15.0.5 || ^16.0.999`\n * - `^15.0.999`\n * - `^16.0.0`\n * - `16.0.0`\n * The following version ranges do not satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.0 || ^16.0.0`\n * - `^15.0.5 || ^17.0.0`\n * - `^14.0.0 || ^15.0.5 || ^16.0.0`\n * - `^17.0.0`\n * - `17.0.0`\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns `true` if `a` is more strict than or equal to `b`, `false` otherwise\n */\nexport function doesASatisfyB(a: ValidRange, b: ValidRange): boolean {\n if (a === b) {\n return true;\n }\n\n const aIsAnyVersionRange = isAnyVersionRange(a);\n const bIsAnyVersionRange = isAnyVersionRange(b);\n if (bIsAnyVersionRange) {\n return true;\n } else if (aIsAnyVersionRange) {\n // `bIsAnyVersionRange` is `false`\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n const bSemVer = coerce(b)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n } else if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n });\n } else if (aIsGreaterOrEqualVersionRange) {\n // `bIsGreaterOrEqualVersionRange` is `false` (and `bIsAnyVersionRange` is `false`)\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // `a` permits a major version that is not permitted by `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersionIsRange = isMajorVersionRange(aVersion);\n const majorMatchingBSemVer = coerce(majorMatchingBVersion)!;\n const majorMatchingBVersionIsRange = isMajorVersionRange(\n majorMatchingBVersion,\n );\n\n if (majorMatchingBVersionIsRange) {\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `majorMatchingBSemVer`\n // this is true whether or not `aVersionIsRange`\n return aSemVer.compare(majorMatchingBSemVer) !== -1;\n } else {\n // `majorMatchingBVersionIsRange` is `false`\n if (aVersionIsRange) {\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n // e.g if `b` is `15.5.5`, this is true whether `a` is `^15.0.0`, `^15.5.5`, or `^15.9.9`\n return false;\n } else {\n // `aVersionIsRange` is `false`\n // `a` satisfies `b` if and only if `aSemVer` is equal to `majorMatchingBSemVer`\n return aSemVer.compare(majorMatchingBSemVer) === 0;\n }\n }\n });\n}\n\n/**\n * Returns true if the version evaluates to 'any', e.g. * or x\n */\nfunction isAnyVersionRange(version: string): boolean {\n return MATCH_ANY_VERSION_RANGE.test(version);\n}\n\n/**\n * Retruns true if the version begins with '>='\n */\nfunction isGreaterOrEqualVersionRange(version: string): boolean {\n return MATCH_GREATER_OR_EQUAL_VERSION_RANGE.test(version);\n}\n\nfunction isMajorVersionRange(version: string): boolean {\n return MATCH_MAJOR_VERSION_RANGE.test(version);\n}\n\nexport type ValidRange = string & { _type: \"valid range\" };\nexport function isValidRange(version: string): version is ValidRange {\n return RANGE_REGEX.test(version);\n}\n\ntype IDependencyType = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\nfunction getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType,\n dependencyName,\n version,\n host,\n}: {\n packageJsonPath: string;\n dependencyType: IDependencyType;\n dependencyName: string;\n version: string;\n host: Host;\n}) {\n return () => {\n mutateJson<PackageJson>(packageJsonPath, host, (packageJson) => {\n if (packageJson[dependencyType] == null) {\n packageJson[dependencyType] = {};\n }\n packageJson[dependencyType]![dependencyName] = version;\n return packageJson;\n });\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as globby from \"globby\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const Options = r.Undefined;\n\ntype Options = r.Static<typeof Options>;\n\n// Enforce that the root package.json contains all of the workspaces in the repo (including nested packages)\nexport const nestedWorkspaces = createRuleFactory({\n name: \"nestedWorkspaces\",\n check: (context) => {\n const rootPackageJson = context.getWorkspaceContext().getPackageJson();\n\n // Expand a set of globs covering all package.json files in the entire repo (except the root)\n const packageJsonPaths = globby.globbySync([\n \"*/**/package.json\",\n \"!**/node_modules/**\",\n ]);\n\n const workspaces = Array.isArray(rootPackageJson.workspaces)\n ? rootPackageJson.workspaces\n : rootPackageJson.workspaces !== undefined\n ? rootPackageJson.workspaces.packages\n : undefined;\n\n if (workspaces === undefined && packageJsonPaths.length > 0) {\n context.addError({\n file: context.getPackageJsonPath(),\n message:\n \"The \\\"workspace\\\" field is missing, even though there are workspaces in the repository.\",\n });\n return;\n }\n\n // Build a set of globs for each package.json that exists in packages specified by a workspace.\n const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);\n\n // Expand the globs to get an array of all package.json files that are in packages specified by a workspace.\n const expandedWorkspacesGlobs = globby.globbySync([\n ...workspacePackageJsons,\n \"!**/node_modules/**\",\n ]);\n\n // Ensure there are no package.jsons which are not included in the globbed workspaces set\n const difference = packageJsonPaths.filter((packageJsonPath) =>\n !expandedWorkspacesGlobs.includes(packageJsonPath)\n );\n\n if (difference.length !== 0) {\n const differencesList = difference.map((packageJsonPath) => path.dirname(packageJsonPath))\n .join(\", \");\n context.addError({\n file: context.getPackageJsonPath(),\n message: `The \"workspace\" field is missing one or more values: ${differencesList}. `\n + \"You may be able to use a glob to avoid listing each workspace individually, e.g. \\\"packages/nested-workspace/*\\\".\",\n });\n }\n },\n validateOptions: Options.check,\n});\n","import * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const Options = r.Record({\n singletonKey: r.String.Or(r.Symbol),\n customMessage: r.String.optional(),\n});\n\nexport type Options = r.Static<typeof Options>;\n\nconst visitedMap = new Map<string | symbol, Set<string>>();\n\nexport const oncePerPackage = createRuleFactory<Options>({\n name: \"oncePerPackage\",\n\n check: async (context, options) => {\n const visited = visitedMap.get(options.singletonKey) ?? new Set<string>();\n visitedMap.set(options.singletonKey, visited);\n\n if (visited.has(context.getName())) {\n context.addError({\n message: \"This package has already been visited for this key: \"\n + options.singletonKey.toString(),\n file: context.getPackageJsonPath(),\n });\n } else {\n visited.add(context.getName());\n }\n },\n\n validateOptions: Options.assert,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const Options = r.Union(\n r\n .Record({\n entries: r.Dictionary(r.Unknown), // string => unknown, enforces existence of keys and their values\n })\n .And(\n r.Partial({\n entriesExist: r.Undefined,\n }),\n ),\n r\n .Record({\n entriesExist: r.Array(r.String), // enforces existence of keys, but not values\n })\n .And(\n r.Partial({\n entries: r.Undefined,\n }),\n ),\n r.Record({\n entries: r.Dictionary(r.Unknown), // string => unknown, enforces existence of keys and their values\n entriesExist: r.Array(r.String),\n }),\n);\n\nexport type Options = r.Static<typeof Options>;\n\nexport const packageEntry = createRuleFactory<Options>({\n name: \"packageEntry\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n\n if (options.entries) {\n for (const key of Object.keys(options.entries)) {\n const value = options.entries[key];\n\n const entryDiff = diff(\n JSON.stringify(value) + \"\\n\",\n (JSON.stringify(packageJson[key]) || \"\") + \"\\n\",\n );\n if (\n (typeof value !== \"object\" && value !== packageJson[key])\n || entryDiff == null\n || !entryDiff.includes(\"Compared values have no visual difference\")\n ) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createStandardizedEntryErrorMessage(key),\n longMessage: entryDiff,\n fixer: () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n input[key] = value;\n return input;\n },\n );\n },\n });\n }\n }\n }\n\n if (options.entriesExist) {\n for (const key of options.entriesExist) {\n if (packageJson[key] === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createExpectedEntryErrorMessage(key),\n });\n }\n }\n }\n },\n validateOptions: Options.check,\n});\n\nexport function createStandardizedEntryErrorMessage(key: string) {\n return `Expected standardized entry for '${key}'`;\n}\n\nexport function createExpectedEntryErrorMessage(key: string) {\n return `Expected entry for '${key}' to exist`;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\ntype OrderFunction = (context: Context) => (a: string, b: string) => number;\n\nconst Options = r\n .Record({\n order: r.Union(r.Array(r.String), r.Function),\n })\n .Or(r.Undefined);\n\ntype Options = r.Static<typeof Options>;\n\nconst defaultKeyOrder = [\n \"name\",\n \"version\",\n \"description\",\n \"author\",\n \"contributors\",\n \"url\",\n \"license\",\n \"type\",\n \"exports\",\n \"private\",\n \"engines\",\n \"bin\",\n \"types\",\n \"main\",\n \"module\",\n \"typings\",\n \"style\",\n \"sideEffects\",\n \"workspaces\",\n \"husky\",\n \"lint-staged\",\n \"files\",\n \"scripts\",\n \"resolutions\",\n \"dependencies\",\n \"peerDependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"publishConfig\",\n];\n\nexport const packageOrder = createRuleFactory<Options>({\n name: \"packageOrder\",\n check: (context, opts) => {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const order: string[] | OrderFunction = opts === undefined\n ? defaultKeyOrder\n : opts.order;\n\n const comparator = isOrderFunction(order)\n ? order(context)\n : createComparator(order);\n\n const actualOrder = Object.keys(packageJson);\n const expectedOrder = actualOrder.slice().sort(comparator); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: \"Incorrect order of fields in package.json\",\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const expectedPackageJson: Record<string, any> = {};\n\n expectedOrder.forEach((key) => {\n expectedPackageJson[key] = packageJson[key];\n });\n\n context.host.writeJson(packagePath, expectedPackageJson);\n },\n });\n }\n },\n validateOptions: Options.check,\n});\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction createComparator(order: ReadonlyArray<string>) {\n return (a: string, b: string) => {\n const aIndex = order.indexOf(a);\n const bIndex = order.indexOf(b);\n\n // if one of the two is missing from the order array, push it further down\n if (aIndex >= 0 && bIndex < 0) {\n return -1;\n } else if (aIndex < 0 && bIndex >= 0) {\n return 1;\n }\n\n // otherwise compare the indexes and use alphabetical as a tie breaker\n const compared = aIndex - bIndex;\n\n if (compared !== 0) {\n return compared;\n } else {\n return a.localeCompare(b);\n }\n };\n}\n\nfunction isOrderFunction(\n order: ReadonlyArray<string> | OrderFunction,\n): order is OrderFunction {\n return !Array.isArray(order);\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const Options = r.Record({\n scripts: r.Dictionary(\n r.Union(\n r.String,\n r.Record({\n options: r.Array(r.String.Or(r.Undefined)),\n fixValue: r.Union(r.String, r.Undefined, r.Literal(false)).optional(),\n }),\n ),\n ), // string => string\n});\n\nexport type Options = r.Static<typeof Options>;\n\nexport const MSG_NO_SCRIPTS_BLOCK = \"No scripts block in package.json\";\n\nexport const packageScript = createRuleFactory<Options>({\n name: \"packageScript\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n if (packageJson.scripts === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: MSG_NO_SCRIPTS_BLOCK,\n fixer: () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n input.scripts = {};\n return input;\n },\n );\n },\n });\n return;\n }\n for (const [name, value] of Object.entries(options.scripts)) {\n const allowedValues = new Set<string | undefined>();\n let fixValue: string | undefined | false;\n let allowEmpty = false;\n let fixToEmpty = false;\n\n if (typeof value === \"string\") {\n allowedValues.add(value);\n fixValue = value;\n } else {\n for (const q of value.options) {\n if (q === undefined) {\n allowEmpty = true;\n }\n allowedValues.add(q);\n }\n fixToEmpty = Object.prototype.hasOwnProperty.call(value, \"fixValue\")\n && value.fixValue === undefined;\n fixValue = value.fixValue;\n }\n\n const actualValue = packageJson.scripts[name];\n\n if (\n !allowedValues.has(actualValue)\n && !(allowEmpty === true && actualValue === undefined)\n ) {\n let fixer;\n\n if (\n fixValue !== false && (fixValue !== undefined || fixToEmpty === true)\n ) {\n const q = fixValue;\n fixer = () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n if (fixToEmpty && q === undefined) {\n delete input.scripts![name];\n } else {\n input.scripts![name] = q!;\n }\n return input;\n },\n );\n };\n }\n\n const validOptionsString = Array.from(allowedValues.values())\n .map((a) => (a === undefined ? \"(empty)\" : `'${a}'`))\n .join(\", \");\n\n context.addError({\n file: context.getPackageJsonPath(),\n message:\n `Expected standardized script entry for '${name}'. Valid options: ${validOptionsString}`,\n longMessage: diff(\n validOptionsString + \"\\n\",\n (packageJson.scripts[name] || \"\") + \"\\n\",\n ),\n fixer,\n });\n }\n }\n },\n validateOptions: Options.check,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nconst Options = r.Partial({\n dependencies: r.Dictionary(r.String.optional()),\n devDependencies: r.Dictionary(r.String.optional()),\n peerDependencies: r.Dictionary(r.String.optional()),\n optionalDependencies: r.Dictionary(r.String.optional()),\n});\n\ntype Options = r.Static<typeof Options>;\n\nexport const requireDependency = createRuleFactory({\n name: \"requireDependency\",\n check: function expectPackageEntry(context: Context, options: Options) {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n [\n \"dependencies\" as const,\n \"devDependencies\" as const,\n \"peerDependencies\" as const,\n \"optionalDependencies\" as const,\n ].forEach((type) => {\n const expectedEntries = options[type];\n if (!expectedEntries) {\n return;\n }\n\n if (packageJson[type] === undefined) {\n context.addError({\n file: packageJsonPath,\n message: `No ${type} block, cannot add required ${type}.`,\n fixer: () => {\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input[type] = Object.fromEntries(\n Object.entries(expectedEntries).filter(([, v]) => v !== undefined),\n ) as Record<string, string>;\n return input;\n });\n },\n });\n return;\n }\n\n for (const [dep, version] of Object.entries(options[type]!)) {\n if (packageJson[type]?.[dep] !== version) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency ${dep}@${version}`,\n longMessage: diff(\n `${dep}@${version}\\n`,\n `${dep}@${packageJson[type]![dep] || \"missing\"}\\n`,\n )!,\n fixer: () => {\n mutateJson<PackageJson>(\n packageJsonPath,\n context.host,\n (input) => {\n if (version === undefined) {\n input[type] = { ...input[type] };\n delete input[type][dep];\n } else {\n input[type] = { ...input[type], [dep]: version };\n }\n return input;\n },\n );\n },\n });\n }\n }\n });\n },\n validateOptions: Options.check,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { matchesAnyGlob } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport * as r from \"runtypes\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nconst DEFAULT_TSCONFIG_FILENAME = \"tsconfig.json\";\n\nconst Options = r\n .Partial({\n file: r.String,\n generator: r.Function,\n tsconfigReferenceFile: r.String,\n template: r.Record({}).Or(r.String),\n templateFile: r.String,\n excludedReferences: r.Array(r.String).Or(r.Undefined),\n additionalReferences: r.Array(r.String).Or(r.Undefined),\n })\n .withConstraint(({ generator, template, templateFile }) => {\n let count = 0;\n if (generator) {\n count++;\n }\n if (template) {\n count++;\n }\n if (templateFile) {\n count++;\n }\n\n return count === 1 || \"Expect one of { generator, template, templateFile }\";\n });\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface Options extends r.Static<typeof Options> {}\n\nexport const standardTsconfig = createRuleFactory<Options>({\n name: \"standardTsconfig\",\n check: async (context, opts) => {\n const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;\n const fullPath = path.resolve(context.packageDir, tsconfigFileName);\n const generator = getGenerator(context, opts);\n const expectedContent = await generator(context);\n\n const actualContent = context.host.exists(fullPath)\n ? context.host.readFile(fullPath, { encoding: \"utf-8\" })\n : undefined;\n\n if (expectedContent === undefined) {\n context.addWarning({\n file: fullPath,\n message: \"Excluding from expect-standard-tsconfig\",\n });\n return;\n }\n\n if (actualContent !== expectedContent) {\n context.addError({\n file: fullPath,\n message: \"Expect file contents to match\",\n longMessage: diff(expectedContent, actualContent, { expand: true }),\n fixer: () => {\n context.host.writeFile(fullPath, expectedContent, {\n encoding: \"utf-8\",\n });\n },\n });\n }\n },\n validateOptions: Options.check,\n});\n\nfunction getGenerator(context: Context, opts: Options) {\n if (opts.generator) {\n return opts.generator;\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = JSON.parse(\n context.host.readFile(fullPath, { encoding: \"utf-8\" }),\n );\n\n return makeGenerator(\n template,\n opts.excludedReferences,\n opts.additionalReferences,\n opts.tsconfigReferenceFile,\n );\n } else if (opts.template) {\n return makeGenerator(\n opts.template,\n opts.excludedReferences,\n opts.additionalReferences,\n opts.tsconfigReferenceFile,\n );\n } else {\n throw new Error(\"Unable to make generator\");\n }\n}\n\nfunction makeGenerator(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n template: any,\n excludedReferences: ReadonlyArray<string> | undefined,\n additionalReferences: ReadonlyArray<string> | undefined,\n tsconfigReferenceFile?: string,\n) {\n return async function generator(context: Context) {\n template = {\n ...template,\n references: [],\n }; // make a copy and ensure we have a references array\n\n const nameToDirectory = await context.getWorkspaceContext()\n .getPackageNameToDir();\n\n const packageJson = context.getPackageJson();\n const deps = [\n ...Object.keys(packageJson.dependencies || {}),\n ...Object.keys(packageJson.devDependencies || {}),\n ];\n for (const dep of deps) {\n const packageDir = nameToDirectory.get(dep);\n if (\n packageDir !== undefined\n && (excludedReferences === undefined\n || !matchesAnyGlob(dep, excludedReferences))\n ) {\n const absoluteReferencePath = tsconfigReferenceFile !== undefined\n ? path.join(packageDir, tsconfigReferenceFile)\n : packageDir;\n template.references.push({\n path: path.relative(context.packageDir, absoluteReferencePath),\n });\n }\n }\n\n if (additionalReferences) {\n for (const additionalReference of additionalReferences) {\n template.references.push({\n path: additionalReference,\n });\n }\n }\n\n return JSON.stringify(template, undefined, 2) + \"\\n\";\n };\n}\n"],"mappings":"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","names":["path","diff","r","Options","diff","r","Options","diff","path","r","Options","diff","mutateJson","path","resolvePackagePath","r","coerce","Options","resolvePackagePath","coerce","mutateJson","path","r","Options","r","Options","mutateJson","diff","r","Options","diff","mutateJson","diff","r","Options","arrayOrderCompare","diff","mutateJson","diff","r","Options","mutateJson","diff","mutateJson","diff","r","Options","mutateJson","diff","matchesAnyGlob","diff","path","r","Options","diff","matchesAnyGlob"]}
|
|
1
|
+
{"version":3,"sources":["../../src/util/checkAlpha.ts","../../src/util/createRuleFactory.ts","../../src/alphabeticalDependencies.ts","../../src/alphabeticalScripts.ts","../../src/bannedDependencies.ts","../../src/util/packageDependencyGraphService.ts","../../src/consistentDependencies.ts","../../src/consistentVersions.ts","../../src/fileContents.ts","../../src/REMOVE.ts","../../src/util/zodSchemas.ts","../../src/forceError.ts","../../src/mustSatisfyPeerDependencies.ts","../../src/nestedWorkspaces.ts","../../src/oncePerPackage.ts","../../src/packageEntry.ts","../../src/packageOrder.ts","../../src/packageScript.ts","../../src/requireDependency.ts","../../src/standardTsconfig.ts"],"sourcesContent":["/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\n\nexport function checkAlpha(\n context: Context,\n block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\" | \"scripts\",\n) {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const blockToSort = packageJson[block];\n\n if (blockToSort === undefined) {\n return;\n }\n\n const actualOrder = Object.keys(blockToSort);\n const expectedOrder = actualOrder.slice().sort(); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: createIncorrectOrderErrorMessage(block, packageJson.name!),\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n const expectedDependencies: Record<string, string> = {};\n\n expectedOrder.forEach((dep) => {\n expectedDependencies[dep] = blockToSort[dep];\n });\n\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function createIncorrectOrderErrorMessage(\n block: string,\n packageName: string,\n) {\n return `Incorrect order of ${block} in ${packageName}'s package.json`;\n}\n","import { Context, RuleEntry, RuleModule } from \"@monorepolint/config\";\n\nexport type ValidateOptionsFn<X> = (options: unknown) => asserts options is X;\nexport type RuleFactoryFn<T> = (ruleEntry: RuleEntry<T>) => RuleModule<T>;\nexport type RuleCheckFn<O> = (\n context: Context,\n options: O,\n extra: { id: string },\n) => Promise<unknown> | unknown;\n\nexport interface RuleFactoryOptions<X> {\n name: string;\n check: RuleCheckFn<X>;\n printStats?: () => void;\n validateOptions: ValidateOptionsFn<X>;\n}\n\nlet globalId = 0;\nexport function createRuleFactory<X>({\n name,\n check,\n validateOptions,\n printStats,\n}: RuleFactoryOptions<X>): RuleFactoryFn<X> {\n return function(ruleEntry) {\n const id = ruleEntry.id ?? `${name} :: ${globalId++}`;\n return {\n id,\n // eslint-disable-next-line @typescript-eslint/no-extra-non-null-assertion\n check: (context) => check(context, ruleEntry.options!!, { id }),\n name,\n validateOptions,\n ruleEntry,\n printStats,\n };\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const alphabeticalDependencies = createRuleFactory<undefined>({\n name: \"alphabeticalDependencies\",\n check: (context) => {\n checkAlpha(context, \"dependencies\");\n checkAlpha(context, \"devDependencies\");\n checkAlpha(context, \"peerDependencies\");\n },\n validateOptions: () => {},\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const alphabeticalScripts = createRuleFactory<undefined>({\n name: \"alphabeticalScripts\",\n check: (context) => {\n checkAlpha(context, \"scripts\");\n },\n validateOptions: () => {},\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { AggregateTiming, matchesAnyGlob } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nimport {\n IPackageDependencyGraphNode,\n PackageDependencyGraphService,\n} from \"./util/packageDependencyGraphService.js\";\n// FIXME: This rule is messed. bannedTransitiveDependencies doesnt glob\n\nconst bannedDepGlobsField = z.union([\n z.array(z.string()),\n z.object({\n glob: z.array(z.string()).optional(),\n exact: z.array(z.string()).optional(),\n }),\n]);\n\nconst Options = z.object({\n bannedDependencies: bannedDepGlobsField.optional(),\n bannedTransitiveDependencies: z.array(z.string()).optional(),\n});\n\nexport type Options = z.infer<typeof Options>;\n\n/**\n * We use this locally to avoid making a billion sets. Because check is called once per package\n * (with the exact same config object reference) we can save quite a bit of time by reusing this cache.\n */\nconst setCache = new Map<ReadonlyArray<string>, Set<string>>();\n\nconst aggregateTiming = new AggregateTiming(\":bannedDependencies stats\");\n\nexport const bannedDependencies = createRuleFactory<Options>({\n name: \"bannedDependencies\",\n check: (context, opts, extra) => {\n aggregateTiming.start(extra?.id ?? \"unknown id\");\n\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const curDeps = packageJson.dependencies\n && Object.keys(packageJson.dependencies);\n const curDevDeps = packageJson.devDependencies\n && Object.keys(packageJson.devDependencies);\n const curPeerDeps = packageJson.peerDependencies\n && Object.keys(packageJson.peerDependencies);\n\n const {\n bannedDependencies: banned,\n bannedTransitiveDependencies: transitives,\n } = opts;\n\n const globs = banned && (Array.isArray(banned) ? banned : banned.glob);\n const exacts = banned && (Array.isArray(banned) ? undefined : banned.exact);\n\n const violations = new Set<string>();\n\n if (globs) {\n if (curDeps) populateProblemsGlobs(globs, curDeps, violations);\n if (curDevDeps) populateProblemsGlobs(globs, curDevDeps, violations);\n if (curPeerDeps) populateProblemsGlobs(globs, curPeerDeps, violations);\n }\n\n if (exacts) {\n let set = setCache.get(exacts);\n if (set === undefined) {\n set = new Set(exacts);\n setCache.set(exacts, set);\n }\n if (curDeps) populateProblemsExact(set, curDeps, violations);\n if (curDevDeps) populateProblemsExact(set, curDevDeps, violations);\n if (curPeerDeps) populateProblemsExact(set, curPeerDeps, violations);\n }\n\n if (violations.size > 0) {\n context.addError({\n file: packagePath,\n message: `Found ${violations.size} banned dependencies of package.json:\\n\\t`\n + Array.from(violations)\n .map((v) => `'${v}'`)\n .join(\", \"),\n });\n }\n\n if (transitives) {\n let set = setCache.get(transitives);\n if (set === undefined) {\n set = new Set(transitives);\n setCache.set(transitives, set);\n }\n checkTransitives(context, set);\n }\n\n aggregateTiming.stop();\n },\n validateOptions: Options.parse,\n printStats: () => {\n aggregateTiming.printResults();\n },\n});\n\nfunction populateProblemsExact(\n banned: Set<string>,\n dependencies: ReadonlyArray<string>,\n violations: Set<string>,\n) {\n for (const dependency of dependencies) {\n if (banned.has(dependency)) {\n violations.add(dependency);\n }\n }\n}\n\nfunction populateProblemsGlobs(\n bannedDependencyGlobs: ReadonlyArray<string>,\n dependencies: ReadonlyArray<string>,\n violations: Set<string>,\n) {\n for (const dependency of dependencies) {\n if (matchesAnyGlob(dependency, bannedDependencyGlobs)) {\n violations.add(dependency);\n }\n }\n}\n\n// This function is slow. God help you if you use this on a big repo\nfunction checkTransitives(context: Context, banned: Set<string>) {\n const graphService = new PackageDependencyGraphService();\n const root = graphService.buildDependencyGraph(\n path.resolve(context.getPackageJsonPath()),\n context.host,\n );\n for (const { dependencies, importPath } of graphService.traverse(root)) {\n for (const [dependency] of dependencies) {\n if (banned.has(dependency)) {\n // Remove the starting package since it's obvious in CLI output.\n const [, ...importPathWithoutRoot] = importPath;\n const pathing = [\n ...importPathWithoutRoot.map(nameOrPackageJsonPath),\n dependency,\n ].join(\" -> \");\n\n context.addError({\n file: root.paths.packageJsonPath,\n message: `Banned transitive dependencies in repo: ${pathing}`,\n });\n }\n }\n }\n}\n\nfunction nameOrPackageJsonPath(node: IPackageDependencyGraphNode): string {\n return node.packageJson.name ?? node.paths.packageJsonPath;\n}\n","/**\n * @license Copyright 2019 Palantir Technologies, Inc. All rights reserved.\n */\n\nimport { Host, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport resolvePackagePath from \"resolve-package-path\";\n\n/** Interface for a node in a package dependency graph. */\nexport interface IPackageDependencyGraphNode {\n packageJson: PackageJson;\n dependencies: Map<string, IPackageDependencyGraphNode>;\n paths: {\n packageJsonPath: string;\n rootDirectory: string;\n };\n}\n\n/** Service abstraction for constructing and traversing package dependency graphs. */\nexport interface IPackageDependencyGraphService {\n /** Construct a graph of package dependencies. */\n buildDependencyGraph(\n packageJsonPath: string,\n host: Host,\n maxDepth?: number,\n ): IPackageDependencyGraphNode;\n\n /** Traverse a package dependency graph. */\n traverse(\n root: IPackageDependencyGraphNode,\n opts?: {\n /** Traverse each unique path to a given package (potentially slow). */\n traverseAllPaths?: boolean;\n },\n ): IterableIterator<\n IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }\n >;\n}\n\n/** Default implementation of the package dependency graph service. */\nexport class PackageDependencyGraphService implements IPackageDependencyGraphService {\n /** Construct a graph of package dependencies and return the root node. */\n public buildDependencyGraph(\n startPackageJsonPath: string,\n host: Host,\n maxDepth?: number,\n ): IPackageDependencyGraphNode {\n const nodes = new Map<string, IPackageDependencyGraphNode>();\n const visit = (\n packageJsonPath: string,\n currentDepth: number,\n ): IPackageDependencyGraphNode => {\n if (nodes.has(packageJsonPath)) {\n return nodes.get(packageJsonPath)!;\n }\n\n const packageJson = host.readJson(packageJsonPath) as PackageJson;\n const node: IPackageDependencyGraphNode = {\n packageJson,\n dependencies: new Map<string, IPackageDependencyGraphNode>(),\n paths: {\n packageJsonPath,\n rootDirectory: path.dirname(packageJsonPath),\n },\n };\n\n // It's important that we register the node before visiting its dependencies to avoid cycles\n nodes.set(packageJsonPath, node);\n\n const nextDepth = currentDepth + 1;\n if (maxDepth == null || nextDepth <= maxDepth) {\n const dependencies = packageJson.dependencies != null\n ? Object.keys(packageJson.dependencies)\n : [];\n for (const dependency of dependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(\n dependency,\n node.paths.rootDirectory,\n );\n if (dependencyPackageJsonPath == null) {\n throw new Error(\n `Could not resolve ${dependency} from ${node.paths.rootDirectory}`,\n );\n }\n\n node.dependencies.set(\n dependency,\n visit(dependencyPackageJsonPath, nextDepth),\n );\n }\n }\n\n return node;\n };\n\n return visit(startPackageJsonPath, 0);\n }\n\n /** Traverse a package dependency graph with an iterator. */\n public *traverse(\n root: IPackageDependencyGraphNode,\n opts = { traverseAllPaths: false },\n ): IterableIterator<\n IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }\n > {\n const visited = new Set<IPackageDependencyGraphNode>();\n\n function* visit(\n node: IPackageDependencyGraphNode,\n importPath: IPackageDependencyGraphNode[] = [],\n ): IterableIterator<\n IPackageDependencyGraphNode & {\n importPath: IPackageDependencyGraphNode[];\n }\n > {\n // Don't visit a package more than once unless explicitly asked to traverse all paths\n if (!opts.traverseAllPaths && visited.has(node)) {\n return;\n }\n\n // Break cycles when traversing all paths\n if (importPath.indexOf(node) !== -1) {\n return;\n }\n\n // Visit the node\n visited.add(node);\n importPath = [...importPath, node];\n yield { ...node, importPath };\n\n // Recursively visit the node's dependencies\n for (const dependency of node.dependencies.values()) {\n yield* visit(dependency, importPath);\n }\n }\n\n yield* visit(root);\n }\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nconst Options = z.union([\n z.undefined(),\n z.object({\n ignoredDependencies: z.array(z.string()),\n }),\n]);\nexport type Options = z.infer<typeof Options>;\n\nconst skippedVersions = [\"*\", \"latest\"];\n\nexport const consistentDependencies = createRuleFactory<Options>({\n name: \"consistentDependencies\",\n check: (context, args) => {\n checkDeps(context, args, \"dependencies\");\n checkDeps(context, args, \"devDependencies\");\n // we don't check peer deps since they can be more lenient\n },\n validateOptions: Options.parse,\n});\n\nfunction checkDeps(\n context: Context,\n args: Options,\n block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\",\n) {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n const dependencies = packageJson[block];\n\n const workspacePackageJson = context.getWorkspaceContext().getPackageJson();\n const workspaceDependencies = workspacePackageJson[block];\n\n const ignoredDeps = args?.ignoredDependencies ?? [];\n const depsToCheck = workspaceDependencies == null || ignoredDeps.length === 0\n ? workspaceDependencies\n : omit(workspaceDependencies, ignoredDeps);\n\n if (dependencies === undefined || depsToCheck === undefined) {\n return;\n }\n\n const expectedDependencies = {\n ...dependencies,\n ...filterKeys(depsToCheck, dependencies),\n };\n\n if (JSON.stringify(dependencies) !== JSON.stringify(expectedDependencies)) {\n context.addError({\n file: packagePath,\n message: `Inconsistent ${block} with root in package.json`,\n longMessage: diff(expectedDependencies, dependencies, { expand: true }),\n fixer: () => {\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction filterKeys(\n ob: Record<string, string>,\n filterOb: Record<string, string>,\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const newOb: Record<string, any> = {};\n\n for (const key of Object.keys(filterOb)) {\n if (\n ob[key] !== undefined && skippedVersions.indexOf(filterOb[key]) === -1\n ) {\n newOb[key] = ob[key];\n }\n }\n\n return newOb;\n}\n\nfunction omit<T>(\n obj: Record<string, T>,\n keysToOmit: readonly string[],\n): Record<string, T> {\n const newObj: Record<string, T> = {};\n\n const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));\n for (const [key, value] of filtered) {\n newObj[key] = value;\n }\n\n return newObj;\n}\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { coerce, SemVer } from \"semver\";\nimport { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nexport const Options = z.object({\n matchDependencyVersions: z.record(z.string(), z.union([z.string(), z.array(z.string())])),\n});\n\nexport type Options = z.infer<typeof Options>;\n\nexport const consistentVersions = createRuleFactory({\n name: \"consistentVersions\",\n check: checkConsistentVersions,\n validateOptions: Options.parse,\n});\n\nfunction checkConsistentVersions(context: Context, options: Options) {\n for (\n const [dependencyPackageName, expectedPackageDependencyValue] of Object\n .entries(\n options.matchDependencyVersions,\n )\n ) {\n if (Array.isArray(expectedPackageDependencyValue)) {\n ensurePackageMatchesSomeVersion(\n context,\n dependencyPackageName,\n expectedPackageDependencyValue,\n );\n } else {\n ensurePackageIsCorrectVersion(\n context,\n dependencyPackageName,\n expectedPackageDependencyValue,\n );\n }\n }\n}\n\nconst shouldUpdateVersion = (\n actualValue: string,\n expectedValue: string,\n isProtocolVersionString: boolean,\n expectedSemVer: SemVer | null,\n): boolean => {\n if (isProtocolVersionString) {\n return actualValue !== expectedValue;\n }\n\n const actualSemVer = coerce(actualValue);\n return actualSemVer != null && actualSemVer.raw !== expectedSemVer!.raw;\n};\n\nconst matchesAnyVersion = (\n actualValue: string,\n protocolVersions: string[],\n acceptedSemVerVersions: SemVer[],\n): boolean => {\n if (protocolVersions.includes(actualValue)) {\n return true;\n }\n\n const actualSemVer = coerce(actualValue);\n if (actualSemVer == null) {\n return false;\n }\n\n return acceptedSemVerVersions.some(\n (acceptedSemVer) => actualSemVer.raw === acceptedSemVer.raw,\n );\n};\n\nconst ensurePackageIsCorrectVersion = (\n context: Context,\n dependencyPackageName: string,\n expectedPackageDependencyValue: string,\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n // Allow protocol version strings like \"catalog:\", \"workspace:\", etc.\n const isProtocolVersion = expectedPackageDependencyValue.endsWith(\":\");\n let expectedPackageDependencyVersion: SemVer | null = null;\n\n if (!isProtocolVersion) {\n expectedPackageDependencyVersion = coerce(expectedPackageDependencyValue);\n if (expectedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'`,\n );\n }\n }\n\n const actualPackageDependencyValue = packageJson.dependencies\n && packageJson.dependencies[dependencyPackageName];\n\n if (actualPackageDependencyValue != null) {\n const shouldUpdate = shouldUpdateVersion(\n actualPackageDependencyValue,\n expectedPackageDependencyValue,\n isProtocolVersion,\n expectedPackageDependencyVersion,\n );\n\n if (shouldUpdate) {\n context.addError({\n file: packageJsonPath,\n message:\n `Expected dependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDependencyValue}' instead.`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.dependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n }\n\n const actualPackageDevDependencyValue = packageJson.devDependencies\n && packageJson.devDependencies[dependencyPackageName];\n\n if (actualPackageDevDependencyValue != null) {\n const shouldUpdateDev = shouldUpdateVersion(\n actualPackageDevDependencyValue,\n expectedPackageDependencyValue,\n isProtocolVersion,\n expectedPackageDependencyVersion,\n );\n\n if (shouldUpdateDev) {\n context.addError({\n file: packageJsonPath,\n message:\n `Expected devDependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDevDependencyValue}' instead`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.devDependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n }\n};\n\nconst ensurePackageMatchesSomeVersion = (\n context: Context,\n dependencyPackageName: string,\n acceptedPackageDependencyValues: string[],\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n // Separate protocol versions from regular semver versions\n const protocolVersions = acceptedPackageDependencyValues.filter(val => val.endsWith(\":\"));\n const regularVersions = acceptedPackageDependencyValues.filter(val => !val.endsWith(\":\"));\n\n const acceptedPackageDependencyVersions: SemVer[] = regularVersions.map(\n (acceptedPackageDependencyValue) => {\n const acceptedPackageDependencyVersion = coerce(\n acceptedPackageDependencyValue,\n );\n if (acceptedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`,\n );\n }\n return acceptedPackageDependencyVersion;\n },\n );\n\n const actualPackageDependencyValue = packageJson.dependencies\n && packageJson.dependencies[dependencyPackageName];\n\n if (actualPackageDependencyValue != null) {\n const matches = matchesAnyVersion(\n actualPackageDependencyValue,\n protocolVersions,\n acceptedPackageDependencyVersions,\n );\n\n if (!matches) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency on ${dependencyPackageName} to match one of '${\n JSON.stringify(\n acceptedPackageDependencyValues,\n )\n }', got '${actualPackageDependencyValue}' instead.`,\n });\n }\n }\n\n const actualPackageDevDependencyValue = packageJson.devDependencies\n && packageJson.devDependencies[dependencyPackageName];\n\n if (actualPackageDevDependencyValue != null) {\n const matches = matchesAnyVersion(\n actualPackageDevDependencyValue,\n protocolVersions,\n acceptedPackageDependencyVersions,\n );\n\n if (!matches) {\n context.addError({\n file: packageJsonPath,\n message: `Expected devDependency on ${dependencyPackageName} to match one of '${\n JSON.stringify(\n acceptedPackageDependencyValues,\n )\n }', got '${actualPackageDevDependencyValue}' instead.`,\n });\n }\n }\n};\n","/*!\n * Copyright 2023 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport { z } from \"zod\";\nimport { REMOVE } from \"./REMOVE.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nimport { ZodRemove } from \"./util/zodSchemas.js\";\n\nconst Options = z.union([\n z.object({\n file: z.string(),\n generator: z.custom<\n (context: Context) => string | typeof REMOVE | Promise<string | typeof REMOVE>\n >((val) => {\n return typeof val === \"function\";\n }),\n template: z.undefined().optional(),\n templateFile: z.undefined().optional(),\n }),\n z.object({\n file: z.string(),\n generator: z.undefined().optional(),\n template: z.union([\n z.string(),\n ZodRemove,\n ]),\n templateFile: z.undefined().optional(),\n }),\n z.object({\n file: z.string(),\n generator: z.undefined().optional(),\n template: z.undefined().optional(),\n templateFile: z.string(),\n }),\n]);\n\ntype Options = z.infer<typeof Options>;\n\nexport const fileContents = createRuleFactory<Options>({\n name: \"fileContents\",\n check: async (context, opts) => {\n const fullPath = path.join(context.packageDir, opts.file);\n\n // Validate that the file path doesn't contain null bytes or other invalid characters\n if (fullPath.includes(\"\\0\")) {\n throw new Error(`Invalid file path: path contains null bytes`);\n }\n\n const expectedContent = await getExpectedContents(context, opts);\n\n // If the generator function failed, an unfixable error was already added, so we should return early\n if (expectedContent === Symbol.for(\"GENERATOR_ERROR\")) {\n return;\n }\n\n const pathExists = context.host.exists(fullPath);\n const actualContent = pathExists\n ? context.host.readFile(fullPath, { encoding: \"utf-8\" })\n : REMOVE;\n if (actualContent !== expectedContent) {\n const longMessage =\n pathExists && (expectedContent === undefined || expectedContent === REMOVE)\n ? undefined\n : diff(expectedContent, actualContent, { expand: true });\n\n const message = pathExists && (expectedContent === undefined || expectedContent === REMOVE)\n ? \"File should not exist\"\n : \"Expect file contents to match\";\n\n context.addError({\n file: fullPath,\n message,\n longMessage,\n fixer: () => {\n if (expectedContent === REMOVE) {\n if (pathExists) context.host.deleteFile(fullPath);\n } else if (expectedContent !== undefined && typeof expectedContent === \"string\") {\n context.host.mkdir(path.dirname(fullPath), { recursive: true });\n context.host.writeFile(fullPath, expectedContent, {\n encoding: \"utf-8\",\n });\n }\n },\n });\n }\n },\n validateOptions: Options.parse,\n});\n\nconst optionsCache = new Map<\n Options,\n | ((context: Context) => Promise<string | typeof REMOVE> | string | typeof REMOVE)\n | string\n | typeof REMOVE\n>();\n\nasync function getExpectedContents(\n context: Context,\n opts: Options,\n): Promise<string | typeof REMOVE | symbol> {\n // we need to use has because undefined is a valid value in the cache\n if (optionsCache.has(opts)) {\n const cachedEntry = optionsCache.get(opts);\n if (cachedEntry && typeof cachedEntry === \"function\") {\n return cachedEntry(context);\n }\n return cachedEntry as string | typeof REMOVE;\n }\n\n if (opts.generator) {\n optionsCache.set(opts, opts.generator);\n try {\n const result = await opts.generator(context);\n if (typeof result !== \"string\" && result !== REMOVE) {\n throw new Error(`Generator function must return a string or REMOVE, got ${typeof result}`);\n }\n return result;\n } catch (error) {\n // Instead of throwing, create an unfixable error and return a special marker\n const errorMessage = error instanceof Error ? error.message : String(error);\n const fullPath = path.join(context.packageDir, opts.file);\n\n context.addError({\n file: fullPath,\n message: `Generator function failed: ${errorMessage}`,\n longMessage:\n `The generator function for file \"${opts.file}\" threw an error:\\n\\n${errorMessage}`,\n });\n\n // Return a special marker that will prevent the file comparison from proceeding\n return Symbol.for(\"GENERATOR_ERROR\");\n }\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = context.host.readFile(fullPath, { encoding: \"utf-8\" });\n\n optionsCache.set(opts, template);\n return template;\n } else if (opts.template !== undefined) {\n optionsCache.set(opts, opts.template);\n return opts.template;\n } else {\n throw new Error(\"Unable to get expected contents\");\n }\n}\n","export const REMOVE = Symbol.for(\"monorepolint/REMOVE\");\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { z } from \"zod\";\nimport { REMOVE } from \"../REMOVE.js\";\n\n/**\n * Reusable Zod schema for the REMOVE symbol.\n * This schema validates that a value is exactly the REMOVE symbol.\n */\nexport const ZodRemove = z.custom<typeof REMOVE>((x) => x === REMOVE);\n","import { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const forceError = createRuleFactory<{ customMessage?: string }>({\n name: \"forceError\",\n\n check: async (context, opts) => {\n context.addError({\n message: opts?.customMessage\n ?? \"Forced error (often used to debug package selection)\",\n file: context.getPackageJsonPath(),\n });\n },\n\n validateOptions: (opts): asserts opts is null | { customMessage: string } => {\n if (opts == null) return;\n\n if (typeof opts !== \"object\") {\n throw new Error(\"options must be an object if provided\");\n }\n\n const numKeys = Object.keys(opts).length;\n\n if (numKeys === 0) return;\n\n if (Object.keys(opts).length > 1 || !(\"customMessage\" in opts)) {\n throw new Error(\"options must only have `customMessage` property\");\n }\n\n if (typeof opts.customMessage !== \"string\") {\n throw new Error(\"customMessage must be a string\");\n }\n },\n});\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { Host, mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport resolvePackagePath from \"resolve-package-path\";\nimport { coerce } from \"semver\";\nimport { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nconst Options = z.object({\n skipUnparseableRanges: z.boolean().optional(),\n dependencyWhitelist: z.array(z.string()).optional(),\n dependencyBlacklist: z.array(z.string()).optional(),\n enforceForDevDependencies: z.boolean().optional(),\n});\n\nexport type Options = z.infer<typeof Options>;\n\nexport const mustSatisfyPeerDependencies = createRuleFactory({\n name: \"mustSatisfyPeerDependencies\",\n check: checkSatisfyPeerDependencies,\n validateOptions: Options.parse,\n});\n\n/**\n * separating on `|`, this regex allows any of the following formats:\n * - `*`\n * - `x`\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_ANY_VERSION_RANGE = /^(\\*|x)$/;\n\n/**\n * This regex allows any of the following formats:\n * - `>=15`\n * - `>=15.2`\n * - `>=15.2.1`\n * - `>=15.2.1-rc.0`\n * - `>=15.2.1+sha`\n * - `>=15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_GREATER_OR_EQUAL_VERSION_RANGE =\n /^>= ?\\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-]+)*))?)?$/;\n\n/**\n * This regex allows any of the following formats:\n * - `15`\n * - `^15`\n * - `15.x`\n * - `^15.x`\n * - `15.x.x`\n * - `^15.x.x`\n * - `^15.2`\n * - `^15.2.x`\n * - `^15.2.1`\n * - `^15.2.1-rc.0`\n * - `^15.2.1+sha`\n * - `^15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_MAJOR_VERSION_RANGE =\n /^(?:\\^?\\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-]+)*))?)$/;\n\n/**\n * Does not currently accept `<`, `<=`, `>`, `=` or `-` for ranges (e.g. `> 2.5.1 < 3` or `1.0.0 - 1.2.0`),\n * though it will accept isolated `>=` ranges (e.g. `>=2.5.1`, but not `^1 || >=2.5.1`)\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n *\n * TODO: accept minor pins `~4.2.1`\n */\nexport const RANGE_REGEX =\n /^(\\*|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-]+)*))?)?)*)$/;\n\ninterface IPeerDependencyRequirement {\n fromPackageName: string;\n range: ValidRange;\n}\n\ninterface IResolvedPeerDependencyRequirement {\n fromPeerDependencyRequirements: IPeerDependencyRequirement[];\n range: ValidRange;\n}\n\nfunction checkSatisfyPeerDependencies(context: Context, opts: Options) {\n const {\n dependencyBlacklist,\n dependencyWhitelist,\n enforceForDevDependencies,\n skipUnparseableRanges,\n } = opts;\n const packageJsonPath = path.resolve(context.getPackageJsonPath());\n const packageJson = context.host.readJson(packageJsonPath) as PackageJson;\n const packageDependencies = packageJson.dependencies || {};\n const packageDevDependencies = packageJson.devDependencies || {};\n const packagePeerDependencies = packageJson.peerDependencies || {};\n const packageName = packageJson.name || packageJsonPath;\n\n // check that no peer dependencies are also declared as regular dependencies\n for (\n const [peerDependencyName, peerDependencyRange] of Object.entries(\n packagePeerDependencies,\n )\n ) {\n if (\n shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName: peerDependencyName,\n })\n ) {\n continue;\n }\n\n const dependencyRange = packageDependencies[peerDependencyName];\n if (dependencyRange != null) {\n context.addError({\n file: packageJsonPath,\n message: `[0] Package ${packageName} has overloaded ${peerDependencyName} dependencies.\\n\\t`\n + `Peer dependency '${peerDependencyRange}' and regular dependency '${dependencyRange}'.`,\n });\n }\n }\n\n // map of all inherited peer dependency requirements\n const allRequiredPeerDependencies: {\n [peerDependencyName: string]: IPeerDependencyRequirement[];\n } = {};\n\n // for each of this package's dependencies, add the dependency's peer requirements into `allRequiredPeerDependencies`\n const allDependencies = enforceForDevDependencies\n ? [\n ...Object.keys(packageDependencies),\n ...Object.keys(packageDevDependencies),\n ]\n : Object.keys(packageDependencies);\n for (const dependency of allDependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(\n dependency,\n path.dirname(packageJsonPath),\n );\n if (dependencyPackageJsonPath == null) {\n throw new Error(\n `Could not resolve ${dependency} from ${path.dirname(packageJsonPath)}`,\n );\n }\n const dependencyPackageJson = context.host.readJson(\n dependencyPackageJsonPath,\n ) as PackageJson;\n const requiredPeerDependencies = dependencyPackageJson.peerDependencies;\n if (requiredPeerDependencies == null) {\n continue;\n }\n for (\n const [peerDependencyName, range] of Object.entries(\n requiredPeerDependencies,\n )\n ) {\n if (\n shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName: peerDependencyName,\n })\n ) {\n continue;\n }\n\n if (!isValidRange(range)) {\n const message =\n `Unable to parse ${dependencyPackageJson.name}'s ${peerDependencyName} peer dependency range '${range}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: dependencyPackageJsonPath, message });\n continue;\n }\n throw new Error(message);\n }\n if (allRequiredPeerDependencies[peerDependencyName] == null) {\n allRequiredPeerDependencies[peerDependencyName] = [];\n }\n allRequiredPeerDependencies[peerDependencyName].push({\n fromPackageName: dependencyPackageJson.name!,\n range,\n });\n }\n }\n\n for (\n const [peerDependencyName, peerDependencyRequirements] of Object.entries(\n allRequiredPeerDependencies,\n )\n ) {\n // for each inherited peer dependency, determine the strictest range\n let mostStrictPeerRequirement: IResolvedPeerDependencyRequirement = {\n fromPeerDependencyRequirements: [peerDependencyRequirements[0]],\n range: peerDependencyRequirements[0].range,\n };\n for (const peerRequirement of peerDependencyRequirements) {\n if (\n doesASatisfyB(mostStrictPeerRequirement.range, peerRequirement.range)\n ) {\n continue;\n } else if (\n doesASatisfyB(peerRequirement.range, mostStrictPeerRequirement.range)\n ) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [peerRequirement],\n range: peerRequirement.range,\n };\n } else {\n const maybeIntersection = findIntersection(\n peerRequirement.range,\n mostStrictPeerRequirement.range,\n );\n if (maybeIntersection !== undefined) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [\n ...mostStrictPeerRequirement.fromPeerDependencyRequirements,\n peerRequirement,\n ],\n range: maybeIntersection,\n };\n } else {\n context.addError({\n file: packageJsonPath,\n message:\n `[1] Package ${packageName} has conflicting inherited ${peerDependencyName} peer dependencies.\\n\\t`\n + `Dependency ${peerRequirement.fromPackageName} requires '${peerRequirement.range}' but\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n }\n\n // if this package has a dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n const packageDependencyRange = packageDependencies[peerDependencyName];\n if (packageDependencyRange != null) {\n if (!isValidRange(packageDependencyRange)) {\n const message =\n `Unable to parse ${packageName}'s ${peerDependencyName} dependency range '${packageDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (\n !doesASatisfyB(packageDependencyRange, mostStrictPeerRequirement.range)\n ) {\n context.addError({\n file: packageJsonPath,\n message:\n `[2] Package ${packageName} dependency on ${peerDependencyName} '${packageDependencyRange}' does not satisfy inherited peer dependencies.\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n\n // for every inherited peer dependency, this package must declare a dependency or peer dependency\n // equal to or stricter than `mostStrictPeerRequirement`\n const packagePeerDependencyRange = packagePeerDependencies[peerDependencyName];\n if (packageDependencyRange == null && packagePeerDependencyRange == null) {\n context.addError({\n file: packageJsonPath,\n message:\n `[3] Package ${packageName} is missing required ${peerDependencyName} dependency.\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n\n // if this package has a peer dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n if (packagePeerDependencyRange != null) {\n if (!isValidRange(packagePeerDependencyRange)) {\n const message =\n `Unable to parse ${packageName}'s ${peerDependencyName} peer dependency range '${packagePeerDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (\n !doesASatisfyB(\n packagePeerDependencyRange,\n mostStrictPeerRequirement.range,\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message:\n `[4] Package ${packageName} peer dependency on ${peerDependencyName} '${packagePeerDependencyRange}' is not strict enough.\\n\\t`\n + getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n }\n }\n}\n\nfunction shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName,\n}: {\n dependencyBlacklist?: string[];\n dependencyWhitelist?: string[];\n packageName: string;\n}) {\n // blacklist should take precedance\n if (\n (dependencyBlacklist != null && dependencyBlacklist.includes(packageName))\n || (dependencyWhitelist != null\n && !dependencyWhitelist.includes(packageName))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getMostStrictStatement(\n mostStrictPeerRequirement: IResolvedPeerDependencyRequirement,\n) {\n if (mostStrictPeerRequirement.fromPeerDependencyRequirements.length === 1) {\n const dependencyName = mostStrictPeerRequirement.fromPeerDependencyRequirements[0]\n .fromPackageName;\n return `Dependency ${dependencyName} requires '${mostStrictPeerRequirement.range}'.`;\n } else {\n const dependencyNames = mostStrictPeerRequirement\n .fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => peerDependencyRequirement.fromPackageName)\n .join(\", \");\n const dependencyRequirements = mostStrictPeerRequirement\n .fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`)\n .join(\", \");\n return (\n `Dependencies [${dependencyNames}] require [${dependencyRequirements}] respectively, `\n + `resolving to '${mostStrictPeerRequirement.range}'.`\n );\n }\n}\n\n/**\n * Given two version ranges, find the maximum intersecting range\n * of `a` and `b`. `findIntersection(a,b)` should return the same\n * result as `findIntersection(b,a)`.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * EXAMPLES:\n * findIntersection(\"15.1.0\", \"*\") => \"15.1.0\"\n * findIntersection(\"^15\", \"*\") => \"^15\"\n * findIntersection(\">=15\", \"*\") => \">=15\"\n * findIntersection(\"*\", \"*\") => \"*\"\n * findIntersection(\"15.1.0\", \">=1\") => \"15.1.0\"\n * findIntersection(\"^15\", \">=1\") => \"^15\"\n * findIntersection(\">=15\", \">=1\") => \">=15\"\n * findIntersection(\"15.1.0\", \"^15\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15\") => \"^15.2\"\n * findIntersection(\"14\", \"^15\") => undefined\n * findIntersection(\"15.1.0\", \"^15 || ^16\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15 || ^16\") => \"^15.2\"\n * findIntersection(\"14\", \"^15 || ^16\") => undefined\n * findIntersection(\"^15.2 || ^16\", \"^15 || ^16.4\") => \"^15.2 || ^16.4\"\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns the maximum intersecting `ValidRange`, or `undefined` if there is no intersection\n */\nexport function findIntersection(\n a: ValidRange,\n b: ValidRange,\n): ValidRange | undefined {\n if (doesASatisfyB(a, b)) {\n return a;\n } else if (doesASatisfyB(b, a)) {\n return b;\n }\n\n // It's safe to assume that `isAnyVersionRange(a)` and `isAnyVersionRange(b)` are false,\n // since a `MATCH_ANY_VERSION_RANGE` would have been satisfied by anything.\n if (isAnyVersionRange(a) || isAnyVersionRange(b)) {\n throw new Error();\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n // If the ranges were equal, they'd both satisfy each other.\n // Otherwise, the higher range should have satisfied the lower range.\n throw new Error();\n }\n\n if (aIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n // keep every version where `bSemVer` is >= `aSemVer`\n // where bVersion has an operator, we need to adjust the version to take into\n // account aVersion, e.g. if a is >=15.2.3 and b is ^15, then the intersection is actually ^15.2.3\n const compatibleBVersions = bVersions\n .map((bVersion) => {\n const bSemVer = coerce(bVersion)!;\n if (bVersion.startsWith(\"^\") && bSemVer.major >= aSemVer.major) {\n return `^${bSemVer.compare(aSemVer) >= 0 ? bSemVer.raw : aSemVer.raw}`;\n }\n return bSemVer.compare(aSemVer) !== -1 ? bVersion : undefined;\n })\n .filter((bVersion): bVersion is string => bVersion != null);\n if (compatibleBVersions.length === 0) {\n return undefined;\n }\n return compatibleBVersions.join(\" || \") as ValidRange;\n }\n if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n // keep every version where `aSemVer` is >= `bSemVer`\n // where aVersion has an operator, we need to adjust the version to take into\n // account bVersion, e.g. if b is >=15.2.3 and a is ^15, then the intersection is actually ^15.2.3\n const compatibleAVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n if (aVersion.startsWith(\"^\") && aSemVer.major >= bSemVer.major) {\n return `^${aSemVer.compare(bSemVer) >= 0 ? aSemVer.raw : bSemVer.raw}`;\n }\n return aSemVer.compare(bSemVer) !== -1 ? aVersion : undefined;\n })\n .filter((aVersion): aVersion is string => aVersion != null);\n if (compatibleAVersions.length === 0) {\n return undefined;\n }\n return compatibleAVersions.join(\" || \") as ValidRange;\n }\n\n const compatibleVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // there is no intersecting `b` major version for this `a` major version\n return undefined;\n }\n if (\n doesASatisfyB(\n aVersion as ValidRange,\n majorMatchingBVersion as ValidRange,\n )\n ) {\n return aVersion;\n } else if (\n doesASatisfyB(\n majorMatchingBVersion as ValidRange,\n aVersion as ValidRange,\n )\n ) {\n return majorMatchingBVersion;\n } else {\n return undefined;\n }\n })\n .filter((aVersion) => aVersion !== undefined);\n if (compatibleVersions.length === 0) {\n return undefined;\n }\n return compatibleVersions.join(\" || \") as ValidRange;\n}\n\n/**\n * Given two version ranges, determine whether `a` satisfies `b`.\n * `a` satisfies `b` iff `a` is a \"more strict than or equal to\" subset of `b`.\n * For example, both `^15` and `^15.2.0` satisfy `^15`, but `^15 || ^16` does not.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * To determine that `a` is \"more strict than or equal to\" `b`, we first\n * split the set of all versions or ranges that are potentially unioned in `a` and `b`.\n * For example, if `a` is `15.0.5`, we produce the set `[ \"15.0.5\" ]`,\n * and if `b` is `^15 || ^16`, we produce the set `[ \"^15\", \"^16\" ]`.\n * `a` is \"more strict than or equal to\" `b` iff each entry in `a`'s set\n * satisfies (equal to or greater than) some entry in `b`.\n *\n * The following version ranges satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.5 || ^16.0.0`\n * - `^15.0.5 || ^16.x.x`\n * - `15.0.5 || 16.0.0`\n * - `^15.0.999 || ^16.0.0`\n * - `^15.0.5 || ^16.0.999`\n * - `^15.0.999`\n * - `^16.0.0`\n * - `16.0.0`\n * The following version ranges do not satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.0 || ^16.0.0`\n * - `^15.0.5 || ^17.0.0`\n * - `^14.0.0 || ^15.0.5 || ^16.0.0`\n * - `^17.0.0`\n * - `17.0.0`\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns `true` if `a` is more strict than or equal to `b`, `false` otherwise\n */\nexport function doesASatisfyB(a: ValidRange, b: ValidRange): boolean {\n if (a === b) {\n return true;\n }\n\n const aIsAnyVersionRange = isAnyVersionRange(a);\n const bIsAnyVersionRange = isAnyVersionRange(b);\n if (bIsAnyVersionRange) {\n return true;\n } else if (aIsAnyVersionRange) {\n // `bIsAnyVersionRange` is `false`\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n const bSemVer = coerce(b)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n } else if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n });\n } else if (aIsGreaterOrEqualVersionRange) {\n // `bIsGreaterOrEqualVersionRange` is `false` (and `bIsAnyVersionRange` is `false`)\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // `a` permits a major version that is not permitted by `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersionIsRange = isMajorVersionRange(aVersion);\n const majorMatchingBSemVer = coerce(majorMatchingBVersion)!;\n const majorMatchingBVersionIsRange = isMajorVersionRange(\n majorMatchingBVersion,\n );\n\n if (majorMatchingBVersionIsRange) {\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `majorMatchingBSemVer`\n // this is true whether or not `aVersionIsRange`\n return aSemVer.compare(majorMatchingBSemVer) !== -1;\n } else {\n // `majorMatchingBVersionIsRange` is `false`\n if (aVersionIsRange) {\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n // e.g if `b` is `15.5.5`, this is true whether `a` is `^15.0.0`, `^15.5.5`, or `^15.9.9`\n return false;\n } else {\n // `aVersionIsRange` is `false`\n // `a` satisfies `b` if and only if `aSemVer` is equal to `majorMatchingBSemVer`\n return aSemVer.compare(majorMatchingBSemVer) === 0;\n }\n }\n });\n}\n\n/**\n * Returns true if the version evaluates to 'any', e.g. * or x\n */\nfunction isAnyVersionRange(version: string): boolean {\n return MATCH_ANY_VERSION_RANGE.test(version);\n}\n\n/**\n * Retruns true if the version begins with '>='\n */\nfunction isGreaterOrEqualVersionRange(version: string): boolean {\n return MATCH_GREATER_OR_EQUAL_VERSION_RANGE.test(version);\n}\n\nfunction isMajorVersionRange(version: string): boolean {\n return MATCH_MAJOR_VERSION_RANGE.test(version);\n}\n\nexport type ValidRange = string & { _type: \"valid range\" };\nexport function isValidRange(version: string): version is ValidRange {\n return RANGE_REGEX.test(version);\n}\n\ntype IDependencyType = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\nfunction getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType,\n dependencyName,\n version,\n host,\n}: {\n packageJsonPath: string;\n dependencyType: IDependencyType;\n dependencyName: string;\n version: string;\n host: Host;\n}) {\n return () => {\n mutateJson<PackageJson>(packageJsonPath, host, (packageJson) => {\n if (packageJson[dependencyType] == null) {\n packageJson[dependencyType] = {};\n }\n packageJson[dependencyType]![dependencyName] = version;\n return packageJson;\n });\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as globby from \"globby\";\nimport * as path from \"node:path\";\nimport { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const Options = z.undefined();\n\ntype Options = z.infer<typeof Options>;\n\n// Enforce that the root package.json contains all of the workspaces in the repo (including nested packages)\nexport const nestedWorkspaces = createRuleFactory({\n name: \"nestedWorkspaces\",\n check: (context) => {\n const rootPackageJson = context.getWorkspaceContext().getPackageJson();\n\n // Expand a set of globs covering all package.json files in the entire repo (except the root)\n const packageJsonPaths = globby.globbySync([\n \"*/**/package.json\",\n \"!**/node_modules/**\",\n ]);\n\n const workspaces = Array.isArray(rootPackageJson.workspaces)\n ? rootPackageJson.workspaces\n : rootPackageJson.workspaces !== undefined\n ? rootPackageJson.workspaces.packages\n : undefined;\n\n if (workspaces === undefined && packageJsonPaths.length > 0) {\n context.addError({\n file: context.getPackageJsonPath(),\n message:\n \"The \\\"workspace\\\" field is missing, even though there are workspaces in the repository.\",\n });\n return;\n }\n\n // Build a set of globs for each package.json that exists in packages specified by a workspace.\n const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);\n\n // Expand the globs to get an array of all package.json files that are in packages specified by a workspace.\n const expandedWorkspacesGlobs = globby.globbySync([\n ...workspacePackageJsons,\n \"!**/node_modules/**\",\n ]);\n\n // Ensure there are no package.jsons which are not included in the globbed workspaces set\n const difference = packageJsonPaths.filter((packageJsonPath) =>\n !expandedWorkspacesGlobs.includes(packageJsonPath)\n );\n\n if (difference.length !== 0) {\n const differencesList = difference.map((packageJsonPath) => path.dirname(packageJsonPath))\n .join(\", \");\n context.addError({\n file: context.getPackageJsonPath(),\n message: `The \"workspace\" field is missing one or more values: ${differencesList}. `\n + \"You may be able to use a glob to avoid listing each workspace individually, e.g. \\\"packages/nested-workspace/*\\\".\",\n });\n }\n },\n validateOptions: Options.parse,\n});\n","import { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nexport const Options = z.object({\n singletonKey: z.union([z.string(), z.symbol()]),\n customMessage: z.string().optional(),\n});\n\nexport type Options = z.infer<typeof Options>;\n\nconst visitedMap = new Map<string | symbol, Set<string>>();\n\nexport const oncePerPackage = createRuleFactory<Options>({\n name: \"oncePerPackage\",\n\n check: async (context, options) => {\n const visited = visitedMap.get(options.singletonKey) ?? new Set<string>();\n visitedMap.set(options.singletonKey, visited);\n\n if (visited.has(context.getName())) {\n context.addError({\n message: \"This package has already been visited for this key: \"\n + options.singletonKey.toString(),\n file: context.getPackageJsonPath(),\n });\n } else {\n visited.add(context.getName());\n }\n },\n\n validateOptions: Options.parse,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport { z } from \"zod\";\nimport { REMOVE } from \"./REMOVE.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nimport { ZodRemove } from \"./util/zodSchemas.js\";\n\nexport const Options = z.object({\n entries: z.record(z.string(), z.union([z.unknown(), ZodRemove])).optional(), // string => unknown | REMOVE, enforces existence of keys and their values or removal\n entriesExist: z.array(z.string()).optional(), // enforces existence of keys, but not values\n}).refine(\n (data) => data.entries !== undefined || data.entriesExist !== undefined,\n { message: \"At least one of 'entries' or 'entriesExist' must be provided\" },\n);\n\nexport type Options = z.infer<typeof Options>;\n\nexport const packageEntry = createRuleFactory<Options>({\n name: \"packageEntry\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n\n if (options.entries) {\n for (const key of Object.keys(options.entries)) {\n const value = options.entries[key];\n\n if (value === REMOVE) {\n // Handle removal: only add error if key exists\n if (packageJson[key] !== undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createRemovalEntryErrorMessage(key),\n fixer: () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n delete input[key];\n return input;\n },\n );\n },\n });\n }\n } else {\n // Handle regular value checking\n const entryDiff = diff(\n JSON.stringify(value) + \"\\n\",\n (JSON.stringify(packageJson[key]) || \"\") + \"\\n\",\n );\n if (\n (typeof value !== \"object\" && value !== packageJson[key])\n || entryDiff == null\n || !entryDiff.includes(\"Compared values have no visual difference\")\n ) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createStandardizedEntryErrorMessage(key),\n longMessage: entryDiff,\n fixer: () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n input[key] = value;\n return input;\n },\n );\n },\n });\n }\n }\n }\n }\n\n if (options.entriesExist) {\n for (const key of options.entriesExist) {\n if (packageJson[key] === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createExpectedEntryErrorMessage(key),\n });\n }\n }\n }\n },\n validateOptions: Options.parse,\n});\n\nexport function createStandardizedEntryErrorMessage(key: string) {\n return `Expected standardized entry for '${key}'`;\n}\n\nexport function createExpectedEntryErrorMessage(key: string) {\n return `Expected entry for '${key}' to exist`;\n}\n\nexport function createRemovalEntryErrorMessage(key: string) {\n return `Entry '${key}' should be removed`;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\ntype OrderFunction = (context: Context) => (a: string, b: string) => number;\n\nconst Options = z.union([\n z.undefined(),\n z.object({\n order: z.union([\n z.array(z.string()),\n z.function({\n input: [z.any()],\n output: z.function({\n input: [z.string(), z.string()],\n output: z.number(),\n }),\n }),\n ]),\n }),\n]);\n\ntype Options = z.infer<typeof Options>;\n\nconst defaultKeyOrder = [\n \"name\",\n \"version\",\n \"description\",\n \"author\",\n \"contributors\",\n \"url\",\n \"license\",\n \"type\",\n \"exports\",\n \"private\",\n \"engines\",\n \"bin\",\n \"types\",\n \"main\",\n \"module\",\n \"typings\",\n \"style\",\n \"sideEffects\",\n \"workspaces\",\n \"husky\",\n \"lint-staged\",\n \"files\",\n \"scripts\",\n \"resolutions\",\n \"dependencies\",\n \"peerDependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"publishConfig\",\n];\n\nexport const packageOrder = createRuleFactory<Options>({\n name: \"packageOrder\",\n check: (context, opts) => {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const order: string[] | OrderFunction = opts === undefined\n ? defaultKeyOrder\n : opts.order;\n\n const comparator = isOrderFunction(order)\n ? order(context)\n : createComparator(order);\n\n const actualOrder = Object.keys(packageJson);\n const expectedOrder = actualOrder.slice().sort(comparator); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: \"Incorrect order of fields in package.json\",\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const expectedPackageJson: Record<string, any> = {};\n\n expectedOrder.forEach((key) => {\n expectedPackageJson[key] = packageJson[key];\n });\n\n context.host.writeJson(packagePath, expectedPackageJson);\n },\n });\n }\n },\n validateOptions: Options.parse,\n});\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction createComparator(order: ReadonlyArray<string>) {\n return (a: string, b: string) => {\n const aIndex = order.indexOf(a);\n const bIndex = order.indexOf(b);\n\n // if one of the two is missing from the order array, push it further down\n if (aIndex >= 0 && bIndex < 0) {\n return -1;\n } else if (aIndex < 0 && bIndex >= 0) {\n return 1;\n }\n\n // otherwise compare the indexes and use alphabetical as a tie breaker\n const compared = aIndex - bIndex;\n\n if (compared !== 0) {\n return compared;\n } else {\n return a.localeCompare(b);\n }\n };\n}\n\nfunction isOrderFunction(\n order: ReadonlyArray<string> | OrderFunction,\n): order is OrderFunction {\n return !Array.isArray(order);\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport { z } from \"zod\";\nimport { REMOVE } from \"./REMOVE.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nimport { ZodRemove } from \"./util/zodSchemas.js\";\n\nexport const Options = z.object({\n scripts: z.record(\n z.string(),\n z.union([\n z.string(),\n ZodRemove, // Allow direct REMOVE values like { \"build\": REMOVE }\n z.object({\n options: z.array(z.union([\n z.string(),\n z.undefined(),\n ZodRemove,\n ])),\n fixValue: z.union([\n z.string(),\n z.undefined(),\n z.literal(false),\n ZodRemove,\n ]).optional(),\n }),\n ]),\n ), // string => string | REMOVE | object\n});\n\nexport type Options = z.infer<typeof Options>;\n\nexport const MSG_NO_SCRIPTS_BLOCK = \"No scripts block in package.json\";\n\nexport const packageScript = createRuleFactory<Options>({\n name: \"packageScript\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n if (packageJson.scripts === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: MSG_NO_SCRIPTS_BLOCK,\n fixer: () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n input.scripts = {};\n return input;\n },\n );\n },\n });\n return;\n }\n for (const [name, value] of Object.entries(options.scripts)) {\n const allowedValues = new Set<string | undefined | typeof REMOVE>();\n let fixValue: string | undefined | false | typeof REMOVE;\n let allowEmpty = false;\n let fixToEmpty = false;\n let fixToRemove = false;\n\n if (typeof value === \"string\") {\n allowedValues.add(value);\n fixValue = value;\n } else if (value === REMOVE) {\n // Handle direct REMOVE value: script should be removed\n allowedValues.add(REMOVE);\n fixValue = REMOVE;\n fixToRemove = true;\n } else {\n for (const q of value.options) {\n if (q === undefined) {\n allowEmpty = true;\n } else if (q === REMOVE) {\n allowEmpty = true;\n }\n allowedValues.add(q);\n }\n fixToEmpty = Object.prototype.hasOwnProperty.call(value, \"fixValue\")\n && value.fixValue === undefined;\n fixToRemove = Object.prototype.hasOwnProperty.call(value, \"fixValue\")\n && value.fixValue === REMOVE;\n fixValue = value.fixValue;\n }\n\n const actualValue = packageJson.scripts[name];\n\n // Special handling for direct REMOVE: only error if script exists\n if (value === REMOVE) {\n if (actualValue !== undefined) {\n // Script exists but should be removed\n const fixer = () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n delete input.scripts![name];\n return input;\n },\n );\n };\n\n context.addError({\n file: context.getPackageJsonPath(),\n message: `Script '${name}' should be removed`,\n fixer,\n });\n }\n // If script doesn't exist, no error needed\n continue;\n }\n\n if (\n !allowedValues.has(actualValue)\n && !(allowEmpty === true && actualValue === undefined)\n ) {\n let fixer;\n\n if (\n fixValue !== false\n && (fixValue !== undefined || fixToEmpty === true || fixToRemove === true)\n ) {\n const q = fixValue;\n fixer = () => {\n mutateJson<PackageJson>(\n context.getPackageJsonPath(),\n context.host,\n (input) => {\n if ((fixToEmpty && q === undefined) || (fixToRemove && q === REMOVE)) {\n delete input.scripts![name];\n } else {\n input.scripts![name] = q as string;\n }\n return input;\n },\n );\n };\n }\n\n const validOptionsString = Array.from(allowedValues.values())\n .map((a) => (a === undefined || a === REMOVE ? \"(empty)\" : `'${a}'`))\n .join(\", \");\n\n context.addError({\n file: context.getPackageJsonPath(),\n message:\n `Expected standardized script entry for '${name}'. Valid options: ${validOptionsString}`,\n longMessage: diff(\n validOptionsString + \"\\n\",\n (packageJson.scripts[name] || \"\") + \"\\n\",\n ),\n fixer,\n });\n }\n }\n },\n validateOptions: Options.parse,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport { z } from \"zod\";\nimport { REMOVE } from \"./REMOVE.js\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\nimport { ZodRemove } from \"./util/zodSchemas.js\";\n\nconst Options = z.object({\n dependencies: z.record(\n z.string(),\n z.union([\n z.string(),\n ZodRemove,\n ]).optional(),\n ).optional(),\n devDependencies: z.record(\n z.string(),\n z.union([\n z.string(),\n ZodRemove,\n ]).optional(),\n ).optional(),\n peerDependencies: z.record(\n z.string(),\n z.union([\n z.string(),\n ZodRemove,\n ]).optional(),\n ).optional(),\n optionalDependencies: z.record(\n z.string(),\n z.union([\n z.string(),\n ZodRemove,\n ]).optional(),\n ).optional(),\n}).partial();\n\ntype Options = z.infer<typeof Options>;\n\nexport const requireDependency = createRuleFactory({\n name: \"requireDependency\",\n check: function expectPackageEntry(context: Context, options: Options) {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n [\n \"dependencies\" as const,\n \"devDependencies\" as const,\n \"peerDependencies\" as const,\n \"optionalDependencies\" as const,\n ].forEach((type) => {\n const expectedEntries = options[type];\n if (!expectedEntries) {\n return;\n }\n\n // Separate additions from removals upfront\n const dependenciesToAdd = Object.entries(expectedEntries).filter(\n ([, version]) => version !== REMOVE && version !== undefined,\n );\n const dependenciesToRemove = Object.entries(expectedEntries).filter(\n ([, version]) => version === REMOVE,\n );\n\n // Handle missing dependency block\n if (packageJson[type] === undefined) {\n // Only create block if there are dependencies to add (REMOVE entries shouldn't create blocks)\n if (dependenciesToAdd.length > 0) {\n context.addError({\n file: packageJsonPath,\n message: `No ${type} block, cannot add required ${type}.`,\n fixer: () => {\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input[type] = Object.fromEntries(dependenciesToAdd) as Record<string, string>;\n return input;\n });\n },\n });\n }\n return; // Can't remove from non-existent block\n }\n\n // Process additions\n for (const [dep, version] of dependenciesToAdd) {\n if (packageJson[type]?.[dep] !== version) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency ${dep}@${version as string}`,\n longMessage: diff(\n `${dep}@${version as string}\\n`,\n `${dep}@${packageJson[type]![dep] || \"missing\"}\\n`,\n )!,\n fixer: () => {\n mutateJson<PackageJson>(\n packageJsonPath,\n context.host,\n (input) => {\n input[type] = { ...input[type], [dep]: version as string };\n return input;\n },\n );\n },\n });\n }\n }\n\n // Process removals\n for (const [dep] of dependenciesToRemove) {\n if (packageJson[type]?.[dep] !== undefined) {\n context.addError({\n file: packageJsonPath,\n message: `Dependency ${dep} should be removed`,\n fixer: () => {\n mutateJson<PackageJson>(\n packageJsonPath,\n context.host,\n (input) => {\n input[type] = { ...input[type] };\n delete input[type][dep];\n return input;\n },\n );\n },\n });\n }\n }\n });\n },\n validateOptions: Options.parse,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { matchesAnyGlob } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport { z } from \"zod\";\nimport { createRuleFactory } from \"./util/createRuleFactory.js\";\n\nconst DEFAULT_TSCONFIG_FILENAME = \"tsconfig.json\";\n\nconst Options = z.object({\n file: z.string().optional(),\n generator: z.custom<(context: Context) => Promise<string> | string>().optional(),\n tsconfigReferenceFile: z.string().optional(),\n template: z.record(z.string(), z.unknown()).optional(),\n templateFile: z.string().optional(),\n excludedReferences: z.array(z.string()).optional(),\n additionalReferences: z.array(z.string()).optional(),\n}).partial().refine(({ generator, template, templateFile }) => {\n let count = 0;\n if (generator) {\n count++;\n }\n if (template) {\n count++;\n }\n if (templateFile) {\n count++;\n }\n\n return count === 1;\n}, {\n message: \"Expect one of { generator, template, templateFile }\",\n});\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface Options extends z.infer<typeof Options> {}\n\nexport const standardTsconfig = createRuleFactory<Options>({\n name: \"standardTsconfig\",\n check: async (context, opts) => {\n const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;\n const fullPath = path.resolve(context.packageDir, tsconfigFileName);\n const generator = getGenerator(context, opts);\n const expectedContent = await generator(context);\n\n const actualContent = context.host.exists(fullPath)\n ? context.host.readFile(fullPath, { encoding: \"utf-8\" })\n : undefined;\n\n if (expectedContent === undefined) {\n context.addWarning({\n file: fullPath,\n message: \"Excluding from expect-standard-tsconfig\",\n });\n return;\n }\n\n if (actualContent !== expectedContent) {\n context.addError({\n file: fullPath,\n message: \"Expect file contents to match\",\n longMessage: diff(expectedContent, actualContent, { expand: true }),\n fixer: () => {\n context.host.writeFile(fullPath, expectedContent, {\n encoding: \"utf-8\",\n });\n },\n });\n }\n },\n validateOptions: Options.parse,\n});\n\nfunction getGenerator(context: Context, opts: Options) {\n if (opts.generator) {\n return opts.generator;\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = JSON.parse(\n context.host.readFile(fullPath, { encoding: \"utf-8\" }),\n );\n\n return makeGenerator(\n template,\n opts.excludedReferences,\n opts.additionalReferences,\n opts.tsconfigReferenceFile,\n );\n } else if (opts.template) {\n return makeGenerator(\n opts.template,\n opts.excludedReferences,\n opts.additionalReferences,\n opts.tsconfigReferenceFile,\n );\n } else {\n throw new Error(\"Unable to make generator\");\n }\n}\n\nfunction makeGenerator(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n template: any,\n excludedReferences: ReadonlyArray<string> | undefined,\n additionalReferences: ReadonlyArray<string> | undefined,\n tsconfigReferenceFile?: string,\n) {\n return async function generator(context: Context) {\n template = {\n ...template,\n references: [],\n }; // make a copy and ensure we have a references array\n\n const nameToDirectory = await context.getWorkspaceContext()\n .getPackageNameToDir();\n\n const packageJson = context.getPackageJson();\n const deps = [\n ...Object.keys(packageJson.dependencies || {}),\n ...Object.keys(packageJson.devDependencies || {}),\n ];\n for (const dep of deps) {\n const packageDir = nameToDirectory.get(dep);\n if (\n packageDir !== undefined\n && (excludedReferences === undefined\n || !matchesAnyGlob(dep, excludedReferences))\n ) {\n const absoluteReferencePath = tsconfigReferenceFile !== undefined\n ? path.join(packageDir, tsconfigReferenceFile)\n : packageDir;\n template.references.push({\n path: path.relative(context.packageDir, absoluteReferencePath),\n });\n }\n }\n\n if (additionalReferences) {\n for (const additionalReference of additionalReferences) {\n template.references.push({\n path: additionalReference,\n });\n }\n }\n\n return JSON.stringify(template, undefined, 2) + \"\\n\";\n };\n}\n"],"mappings":"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","names":["path","diff","z","Options","z","diff","z","Options","z","diff","path","z","z","z","Options","z","diff","mutateJson","path","resolvePackagePath","coerce","z","Options","z","resolvePackagePath","coerce","mutateJson","path","z","Options","z","z","Options","z","mutateJson","diff","z","Options","z","mutateJson","diff","diff","z","Options","z","arrayOrderCompare","diff","mutateJson","diff","z","Options","z","mutateJson","diff","mutateJson","diff","z","Options","z","mutateJson","diff","matchesAnyGlob","diff","path","z","Options","z","diff","matchesAnyGlob"]}
|