{
  "version": 3,
  "sources": ["../../../../src/packages/filter-workspace-packages/getChangedPackages.ts"],
  "sourcesContent": ["import assert from 'node:assert';\nimport path from 'node:path';\nimport util from 'node:util';\nimport { PnpmError } from '../error/index.ts';\nimport * as micromatch from 'micromatch';\nimport { execa } from 'execa';\nimport { findUp } from 'find-up';\nimport type { ProjectRootDir } from '../types/index.ts';\n\ntype ChangeType = 'source' | 'test';\n\ntype ChangedDir = {\n  dir: string;\n  changeType: ChangeType;\n};\n\nexport async function getChangedPackages(\n  packageDirs: ProjectRootDir[],\n  commit: string,\n  opts: {\n    workspaceDir: string;\n    testPattern?: string[];\n    changedFilesIgnorePattern?: string[];\n  }\n): Promise<[ProjectRootDir[], ProjectRootDir[]]> {\n  const repoRoot = path.resolve(\n    (await findUp('.git', { cwd: opts.workspaceDir, type: 'directory' })) ??\n      opts.workspaceDir,\n    '..'\n  );\n  const changedDirs = (\n    await getChangedDirsSinceCommit(\n      commit,\n      opts.workspaceDir,\n      opts.testPattern ?? [],\n      opts.changedFilesIgnorePattern ?? []\n    )\n  ).map((changedDir) => ({\n    ...changedDir,\n    dir: path.join(repoRoot, changedDir.dir),\n  }));\n  const pkgChangeTypes = new Map<ProjectRootDir, ChangeType | undefined>();\n  for (const pkgDir of packageDirs) {\n    pkgChangeTypes.set(pkgDir, undefined);\n  }\n  for (const changedDir of changedDirs) {\n    let currentDir = changedDir.dir;\n    while (!pkgChangeTypes.has(currentDir as ProjectRootDir)) {\n      const nextDir = path.dirname(currentDir);\n      if (nextDir === currentDir) break;\n      currentDir = nextDir;\n    }\n    if (pkgChangeTypes.get(currentDir as ProjectRootDir) === 'source') continue;\n    pkgChangeTypes.set(currentDir as ProjectRootDir, changedDir.changeType);\n  }\n\n  const changedPkgs = [] as ProjectRootDir[];\n  const ignoreDependentForPkgs = [] as ProjectRootDir[];\n  for (const [changedDir, changeType] of pkgChangeTypes.entries()) {\n    switch (changeType) {\n      case 'source':\n        changedPkgs.push(changedDir);\n        break;\n      case 'test':\n        ignoreDependentForPkgs.push(changedDir);\n        break;\n    }\n  }\n  return [changedPkgs, ignoreDependentForPkgs];\n}\n\nasync function getChangedDirsSinceCommit(\n  commit: string,\n  workingDir: string,\n  testPattern: string[],\n  changedFilesIgnorePattern: string[]\n): Promise<ChangedDir[]> {\n  let diff!: string;\n  try {\n    diff = (\n      await execa('git', ['diff', '--name-only', commit, '--', workingDir], {\n        cwd: workingDir,\n      })\n    ).stdout;\n  } catch (err: unknown) {\n    assert(util.types.isNativeError(err));\n    throw new PnpmError(\n      'FILTER_CHANGED',\n      `Filtering by changed packages failed. ${'stderr' in err ? (err.stderr as string) : ''}`\n    );\n  }\n  const changedDirs = new Map<string, ChangeType>();\n\n  if (!diff) {\n    return [];\n  }\n\n  const allChangedFiles = diff\n    .split('\\n')\n    // The prefix and suffix '\"' are appended to the Korean path\n    .map((line) => line.replace(/^\"/, '').replace(/\"$/, ''));\n  const patterns = changedFilesIgnorePattern.filter(\n    (pattern) => pattern.length\n  );\n  const changedFiles =\n    patterns.length > 0\n      ? micromatch.not(allChangedFiles, patterns, {\n          dot: true,\n        })\n      : allChangedFiles;\n\n  for (const changedFile of changedFiles) {\n    const dir = path.dirname(changedFile);\n\n    if (changedDirs.get(dir) === 'source') continue;\n\n    const changeType: ChangeType = testPattern.some((pattern) =>\n      micromatch.isMatch(changedFile, pattern)\n    )\n      ? 'test'\n      : 'source';\n    changedDirs.set(dir, changeType);\n  }\n\n  return Array.from(changedDirs.entries()).map(([dir, changeType]) => ({\n    dir,\n    changeType,\n  }));\n}\n"],
  "mappings": "AAAA,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,YAAY,gBAAgB;AAC5B,SAAS,aAAa;AACtB,SAAS,cAAc;AAUvB,eAAsB,mBACpB,aACA,QACA,MAK+C;AAC/C,QAAM,WAAW,KAAK;AAAA,IACnB,MAAM,OAAO,QAAQ,EAAE,KAAK,KAAK,cAAc,MAAM,YAAY,CAAC,KACjE,KAAK;AAAA,IACP;AAAA,EACF;AACA,QAAM,eACJ,MAAM;AAAA,IACJ;AAAA,IACA,KAAK;AAAA,IACL,KAAK,eAAe,CAAC;AAAA,IACrB,KAAK,6BAA6B,CAAC;AAAA,EACrC,GACA,IAAI,CAAC,gBAAgB;AAAA,IACrB,GAAG;AAAA,IACH,KAAK,KAAK,KAAK,UAAU,WAAW,GAAG;AAAA,EACzC,EAAE;AACF,QAAM,iBAAiB,oBAAI,IAA4C;AACvE,aAAW,UAAU,aAAa;AAChC,mBAAe,IAAI,QAAQ,MAAS;AAAA,EACtC;AACA,aAAW,cAAc,aAAa;AACpC,QAAI,aAAa,WAAW;AAC5B,WAAO,CAAC,eAAe,IAAI,UAA4B,GAAG;AACxD,YAAM,UAAU,KAAK,QAAQ,UAAU;AACvC,UAAI,YAAY,WAAY;AAC5B,mBAAa;AAAA,IACf;AACA,QAAI,eAAe,IAAI,UAA4B,MAAM,SAAU;AACnE,mBAAe,IAAI,YAA8B,WAAW,UAAU;AAAA,EACxE;AAEA,QAAM,cAAc,CAAC;AACrB,QAAM,yBAAyB,CAAC;AAChC,aAAW,CAAC,YAAY,UAAU,KAAK,eAAe,QAAQ,GAAG;AAC/D,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,oBAAY,KAAK,UAAU;AAC3B;AAAA,MACF,KAAK;AACH,+BAAuB,KAAK,UAAU;AACtC;AAAA,IACJ;AAAA,EACF;AACA,SAAO,CAAC,aAAa,sBAAsB;AAC7C;AAEA,eAAe,0BACb,QACA,YACA,aACA,2BACuB;AACvB,MAAI;AACJ,MAAI;AACF,YACE,MAAM,MAAM,OAAO,CAAC,QAAQ,eAAe,QAAQ,MAAM,UAAU,GAAG;AAAA,MACpE,KAAK;AAAA,IACP,CAAC,GACD;AAAA,EACJ,SAAS,KAAc;AACrB,WAAO,KAAK,MAAM,cAAc,GAAG,CAAC;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,yCAAyC,YAAY,MAAO,IAAI,SAAoB,EAAE;AAAA,IACxF;AAAA,EACF;AACA,QAAM,cAAc,oBAAI,IAAwB;AAEhD,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,kBAAkB,KACrB,MAAM,IAAI,EAEV,IAAI,CAAC,SAAS,KAAK,QAAQ,MAAM,EAAE,EAAE,QAAQ,MAAM,EAAE,CAAC;AACzD,QAAM,WAAW,0BAA0B;AAAA,IACzC,CAAC,YAAY,QAAQ;AAAA,EACvB;AACA,QAAM,eACJ,SAAS,SAAS,IACd,WAAW,IAAI,iBAAiB,UAAU;AAAA,IACxC,KAAK;AAAA,EACP,CAAC,IACD;AAEN,aAAW,eAAe,cAAc;AACtC,UAAM,MAAM,KAAK,QAAQ,WAAW;AAEpC,QAAI,YAAY,IAAI,GAAG,MAAM,SAAU;AAEvC,UAAM,aAAyB,YAAY;AAAA,MAAK,CAAC,YAC/C,WAAW,QAAQ,aAAa,OAAO;AAAA,IACzC,IACI,SACA;AACJ,gBAAY,IAAI,KAAK,UAAU;AAAA,EACjC;AAEA,SAAO,MAAM,KAAK,YAAY,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,OAAO;AAAA,IACnE;AAAA,IACA;AAAA,EACF,EAAE;AACJ;",
  "names": []
}
