{
  "version": 3,
  "sources": ["../../../../src/packages/filter-workspace-packages/index.ts"],
  "sourcesContent": ["import { createMatcher } from '../matcher/index.ts';\nimport type { ProjectRootDir, SupportedArchitectures } from '../types/index.ts';\nimport {\n  findWorkspacePackages,\n  type Project,\n} from '../workspace.find-packages/index.ts';\nimport {\n  createPkgGraph,\n  type Package,\n  type PackageNode,\n} from '../workspace.pkgs-graph/index.ts';\nimport isSubdir from 'is-subdir';\nimport difference from 'ramda/src/difference';\nimport partition from 'ramda/src/partition';\nimport pick from 'ramda/src/pick';\nimport * as micromatch from 'micromatch';\nimport { getChangedPackages } from './getChangedPackages.ts';\nimport {\n  parsePackageSelector,\n  type PackageSelector,\n} from './parsePackageSelector.ts';\n\nexport { parsePackageSelector, type PackageSelector };\n\nexport type WorkspaceFilter = {\n  filter: string;\n  followProdDepsOnly: boolean;\n};\n\nexport type PackageGraph<Pkg extends Package> = {\n  [id: ProjectRootDir]: PackageNode<Pkg>;\n};\n\ntype Graph = {\n  [nodeId: ProjectRootDir]: ProjectRootDir[];\n};\n\ntype FilteredGraph<Pkg extends Package> = {\n  selectedProjectsGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >;\n  unmatchedFilters: string[];\n};\n\nexport type ReadProjectsResult = {\n  allProjects: Project[];\n  allProjectsGraph: PackageGraph<Project>;\n  selectedProjectsGraph: PackageGraph<Project>;\n};\n\nexport type FilterPackagesOptions = {\n  linkWorkspacePackages?: boolean;\n  prefix: string;\n  workspaceDir: string;\n  testPattern?: string[] | undefined;\n  changedFilesIgnorePattern?: string[] | undefined;\n  useGlobDirFiltering?: boolean | undefined;\n  sharedWorkspaceLockfile?: boolean | undefined;\n};\n\nexport interface FilterPackagesFromDirResult\n  extends FilterPackagesResult<Project> {\n  allProjects: Project[];\n}\n\nexport async function filterPackagesFromDir(\n  workspaceDir: string,\n  filter: WorkspaceFilter[],\n  opts: FilterPackagesOptions & {\n    engineStrict?: boolean | undefined;\n    nodeVersion?: string | undefined;\n    patterns?: string[] | undefined;\n    supportedArchitectures?: SupportedArchitectures | undefined;\n  }\n): Promise<FilterPackagesFromDirResult> {\n  const allProjects = await findWorkspacePackages(workspaceDir, {\n    engineStrict: opts.engineStrict,\n    patterns: opts.patterns,\n    sharedWorkspaceLockfile: opts.sharedWorkspaceLockfile,\n    nodeVersion: opts.nodeVersion,\n    supportedArchitectures: opts.supportedArchitectures,\n  });\n\n  return {\n    allProjects,\n    ...(await filterPackages(allProjects, filter, opts)),\n  };\n}\n\nexport interface FilterPackagesResult<Pkg extends Package> {\n  allProjectsGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >;\n  selectedProjectsGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >;\n  unmatchedFilters: string[];\n}\n\nexport async function filterPackages<Pkg extends Package>(\n  pkgs: Pkg[],\n  filter: WorkspaceFilter[],\n  opts: FilterPackagesOptions\n): Promise<FilterPackagesResult<Pkg>> {\n  const packageSelectors = filter.map(({ filter: f, followProdDepsOnly }) => ({\n    ...parsePackageSelector(f, opts.prefix),\n    followProdDepsOnly,\n  }));\n\n  return filterPkgsBySelectorObjects<Pkg>(pkgs, packageSelectors, opts);\n}\n\nexport async function filterPkgsBySelectorObjects<Pkg extends Package>(\n  pkgs: Pkg[],\n  packageSelectors: PackageSelector[],\n  opts: {\n    linkWorkspacePackages?: boolean | undefined;\n    workspaceDir: string;\n    testPattern?: string[] | undefined;\n    changedFilesIgnorePattern?: string[] | undefined;\n    useGlobDirFiltering?: boolean | undefined;\n  }\n): Promise<{\n  allProjectsGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >;\n  selectedProjectsGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >;\n  unmatchedFilters: string[];\n}> {\n  const [prodPackageSelectors, allPackageSelectors] = partition.default(\n    ({ followProdDepsOnly }) => followProdDepsOnly === true,\n    packageSelectors\n  );\n\n  if (allPackageSelectors.length > 0 || prodPackageSelectors.length > 0) {\n    let filteredGraph: FilteredGraph<Pkg> | undefined;\n\n    const { graph } = createPkgGraph<Pkg>(pkgs, {\n      linkWorkspacePackages: opts.linkWorkspacePackages,\n    });\n\n    if (allPackageSelectors.length > 0) {\n      filteredGraph = await filterWorkspacePackages(\n        graph,\n        allPackageSelectors,\n        {\n          workspaceDir: opts.workspaceDir,\n          testPattern: opts.testPattern ?? [],\n          changedFilesIgnorePattern: opts.changedFilesIgnorePattern ?? [],\n          useGlobDirFiltering: opts.useGlobDirFiltering ?? false,\n        }\n      );\n    }\n\n    let prodFilteredGraph: FilteredGraph<Pkg> | undefined;\n\n    if (prodPackageSelectors.length > 0) {\n      const { graph } = createPkgGraph<Pkg>(pkgs, {\n        ignoreDevDeps: true,\n        linkWorkspacePackages: opts.linkWorkspacePackages,\n      });\n\n      prodFilteredGraph = await filterWorkspacePackages<Pkg>(\n        graph,\n        prodPackageSelectors,\n        {\n          workspaceDir: opts.workspaceDir,\n          testPattern: opts.testPattern ?? [],\n          changedFilesIgnorePattern: opts.changedFilesIgnorePattern ?? [],\n          useGlobDirFiltering: opts.useGlobDirFiltering ?? false,\n        }\n      );\n    }\n\n    return {\n      allProjectsGraph: graph,\n      selectedProjectsGraph: {\n        ...prodFilteredGraph?.selectedProjectsGraph,\n        ...filteredGraph?.selectedProjectsGraph,\n      },\n      unmatchedFilters: [\n        ...(prodFilteredGraph !== undefined\n          ? prodFilteredGraph.unmatchedFilters\n          : []),\n        ...(filteredGraph !== undefined ? filteredGraph.unmatchedFilters : []),\n      ],\n    };\n  }\n\n  const { graph } = createPkgGraph<Pkg>(pkgs, {\n    linkWorkspacePackages: opts.linkWorkspacePackages,\n  });\n\n  return {\n    allProjectsGraph: graph,\n    selectedProjectsGraph: graph,\n    unmatchedFilters: [],\n  };\n}\n\nexport async function filterWorkspacePackages<Pkg extends Package>(\n  pkgGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >,\n  packageSelectors: PackageSelector[],\n  opts: {\n    workspaceDir: string;\n    testPattern?: string[] | undefined;\n    changedFilesIgnorePattern?: string[] | undefined;\n    useGlobDirFiltering?: boolean | undefined;\n  }\n): Promise<{\n  selectedProjectsGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >;\n  unmatchedFilters: string[];\n}> {\n  const [excludeSelectors, includeSelectors] =\n    partition.default<PackageSelector>(\n      (selector: PackageSelector) => selector.exclude === true,\n      packageSelectors\n    );\n\n  const fg = _filterGraph.bind(null, pkgGraph, opts);\n\n  const include =\n    includeSelectors.length === 0\n      ? { selected: Object.keys(pkgGraph), unmatchedFilters: [] }\n      : await fg(includeSelectors);\n\n  const exclude = await fg(excludeSelectors);\n\n  return {\n    selectedProjectsGraph: pick.default(\n      difference.default(\n        include.selected,\n        exclude.selected\n      ) as ProjectRootDir[],\n      pkgGraph\n    ),\n    unmatchedFilters: [\n      ...include.unmatchedFilters,\n      ...exclude.unmatchedFilters,\n    ],\n  };\n}\n\nasync function _filterGraph<Pkg extends Package>(\n  pkgGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: string[];\n      package: Pkg;\n    }\n  >,\n  opts: {\n    workspaceDir: string;\n    testPattern?: string[] | undefined;\n    changedFilesIgnorePattern?: string[] | undefined;\n    useGlobDirFiltering?: boolean | undefined;\n  },\n  packageSelectors: PackageSelector[]\n): Promise<{\n  selected: ProjectRootDir[];\n  unmatchedFilters: string[];\n}> {\n  const cherryPickedPackages = [] as ProjectRootDir[];\n  const walkedDependencies = new Set<ProjectRootDir>();\n  const walkedDependents = new Set<ProjectRootDir>();\n  const walkedDependentsDependencies = new Set<ProjectRootDir>();\n  const graph = pkgGraphToGraph(pkgGraph);\n  const unmatchedFilters = [] as string[];\n  let reversedGraph: Graph | undefined;\n  const matchPackagesByPath =\n    opts.useGlobDirFiltering === true\n      ? matchPackagesByGlob\n      : matchPackagesByExactPath;\n  for (const selector of packageSelectors) {\n    let entryPackages: ProjectRootDir[] | null = null;\n\n    if (typeof selector.diff === 'string') {\n      let ignoreDependentForPkgs: ProjectRootDir[] = [];\n\n      [entryPackages, ignoreDependentForPkgs] = await getChangedPackages(\n        Object.keys(pkgGraph) as ProjectRootDir[],\n        selector.diff,\n        {\n          changedFilesIgnorePattern: opts.changedFilesIgnorePattern ?? [],\n          testPattern: opts.testPattern ?? [],\n          workspaceDir: selector.parentDir ?? opts.workspaceDir,\n        }\n      );\n\n      selectEntries(\n        {\n          ...selector,\n          includeDependents: false,\n        },\n        ignoreDependentForPkgs\n      );\n    } else if (typeof selector.parentDir === 'string') {\n      entryPackages = matchPackagesByPath(pkgGraph, selector.parentDir);\n    }\n    if (typeof selector.namePattern === 'string') {\n      if (entryPackages == null) {\n        entryPackages = matchPackages(pkgGraph, selector.namePattern);\n      } else {\n        entryPackages = matchPackages(\n          pick.default(entryPackages, pkgGraph),\n          selector.namePattern\n        );\n      }\n    }\n\n    if (entryPackages == null) {\n      throw new Error(\n        `Unsupported package selector: ${JSON.stringify(selector)}`\n      );\n    }\n\n    if (entryPackages.length === 0) {\n      if (typeof selector.namePattern === 'string') {\n        unmatchedFilters.push(selector.namePattern);\n      }\n      if (typeof selector.parentDir === 'string') {\n        unmatchedFilters.push(selector.parentDir);\n      }\n    }\n\n    selectEntries(selector, entryPackages);\n  }\n  const walked = new Set([\n    ...walkedDependencies,\n    ...walkedDependents,\n    ...walkedDependentsDependencies,\n  ]);\n\n  for (const cherryPickedPackage of cherryPickedPackages) {\n    walked.add(cherryPickedPackage);\n  }\n\n  return {\n    selected: Array.from(walked),\n    unmatchedFilters,\n  };\n\n  function selectEntries(\n    selector: PackageSelector,\n    entryPackages: ProjectRootDir[]\n  ): void {\n    if (selector.includeDependencies === true) {\n      pickSubgraph(graph, entryPackages, walkedDependencies, {\n        includeRoot: selector.excludeSelf !== true,\n      });\n    }\n\n    if (selector.includeDependents === true) {\n      if (reversedGraph == null) {\n        reversedGraph = reverseGraph(graph);\n      }\n\n      pickSubgraph(reversedGraph, entryPackages, walkedDependents, {\n        includeRoot: selector.excludeSelf !== true,\n      });\n    }\n\n    if (\n      selector.includeDependencies === true &&\n      selector.includeDependents === true\n    ) {\n      pickSubgraph(\n        graph,\n        Array.from(walkedDependents),\n        walkedDependentsDependencies,\n        { includeRoot: false }\n      );\n    }\n\n    if (\n      selector.includeDependencies !== true &&\n      selector.includeDependents !== true\n    ) {\n      Array.prototype.push.apply(cherryPickedPackages, entryPackages);\n    }\n  }\n}\n\nfunction pkgGraphToGraph<Pkg extends Package>(\n  pkgGraph: Record<\n    ProjectRootDir,\n    {\n      dependencies: string[];\n      package: Pkg;\n    }\n  >\n): Graph {\n  const graph: Graph = {};\n\n  for (const nodeId of Object.keys(pkgGraph) as ProjectRootDir[]) {\n    graph[nodeId] = (pkgGraph[nodeId]?.dependencies ?? []) as ProjectRootDir[];\n  }\n\n  return graph;\n}\n\nfunction reverseGraph(graph: Graph): Graph {\n  const reversedGraph: Graph = {};\n  for (const dependentNodeId of Object.keys(graph) as ProjectRootDir[]) {\n    for (const dependencyNodeId of graph[dependentNodeId] ?? []) {\n      if (reversedGraph[dependencyNodeId]) {\n        reversedGraph[dependencyNodeId].push(dependentNodeId);\n      } else {\n        reversedGraph[dependencyNodeId] = [dependentNodeId];\n      }\n    }\n  }\n\n  return reversedGraph;\n}\n\nfunction matchPackages<Pkg extends Package>(\n  graph: Record<\n    ProjectRootDir,\n    {\n      dependencies: string[];\n      package: Pkg;\n    }\n  >,\n  pattern: string\n): ProjectRootDir[] {\n  const match = createMatcher(pattern);\n\n  const matches = Object.keys(graph).filter((id: string): boolean => {\n    return (\n      typeof graph[id as keyof typeof graph]?.package.manifest.name ===\n        'string' &&\n      match(graph[id as keyof typeof graph]?.package.manifest.name ?? '')\n    );\n  });\n\n  if (\n    matches.length === 0 &&\n    !pattern.startsWith('@') &&\n    !pattern.includes('/')\n  ) {\n    const scopedMatches = matchPackages(graph, `@*/${pattern}`);\n    return scopedMatches.length !== 1 ? [] : scopedMatches;\n  }\n\n  return matches as ProjectRootDir[];\n}\n\nfunction matchPackagesByExactPath<Pkg extends Package>(\n  graph: Record<\n    ProjectRootDir,\n    {\n      dependencies: string[];\n      package: Pkg;\n    }\n  >,\n  pathStartsWith: string\n): ProjectRootDir[] {\n  return (Object.keys(graph) as ProjectRootDir[]).filter((parentDir) =>\n    isSubdir(pathStartsWith, parentDir)\n  );\n}\n\nfunction matchPackagesByGlob<Pkg extends Package>(\n  graph: Record<\n    ProjectRootDir,\n    {\n      dependencies: string[];\n      package: Pkg;\n    }\n  >,\n  pathStartsWith: string\n): ProjectRootDir[] {\n  const format = (str: string): string => {\n    return str.replace(/\\/$/, '');\n  };\n\n  const formattedFilter = pathStartsWith.replace(/\\\\/g, '/').replace(/\\/$/, '');\n\n  return Object.keys(graph).filter((parentDir: string): boolean => {\n    return micromatch.isMatch(parentDir, formattedFilter, { format });\n  }) as ProjectRootDir[];\n}\n\nfunction pickSubgraph(\n  graph: Graph,\n  nextNodeIds: ProjectRootDir[],\n  walked: Set<ProjectRootDir>,\n  opts: {\n    includeRoot: boolean;\n  }\n): void {\n  for (const nextNodeId of nextNodeIds) {\n    if (!walked.has(nextNodeId)) {\n      if (opts.includeRoot) {\n        walked.add(nextNodeId);\n      }\n\n      if (graph[nextNodeId])\n        pickSubgraph(graph, graph[nextNodeId], walked, { includeRoot: true });\n    }\n  }\n}\n"],
  "mappings": "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",
  "names": ["graph"]
}
