{
  "version": 3,
  "sources": ["../../../../src/packages/fs.find-packages/index.ts"],
  "sourcesContent": ["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport util from 'node:util';\nimport { readExactProjectManifest } from '../read-project-manifest/index.ts';\nimport type {\n  Project,\n  ProjectRootDir,\n  ProjectRootDirRealPath,\n} from '../types/index.ts';\nimport { lexCompare } from '../util.lex-comparator/index.ts';\nimport { glob } from 'tinyglobby';\nimport pFilter from 'p-filter';\n\nconst DEFAULT_IGNORE = [\n  '**/node_modules/**',\n  '**/bower_components/**',\n  '**/test/**',\n  '**/tests/**',\n];\n\nexport interface Options {\n  ignore?: string[] | undefined;\n  includeRoot?: boolean | undefined;\n  patterns?: string[] | undefined;\n}\n\nexport async function findPackages(\n  root: string,\n  opts?: Options | undefined\n): Promise<Project[]> {\n  const newOpts = opts ?? {};\n\n  const globOpts = { ...newOpts, cwd: root, expandDirectories: false };\n\n  globOpts.ignore = newOpts.ignore ?? DEFAULT_IGNORE;\n\n  const patterns = normalizePatterns(newOpts.patterns ?? ['.', '**']);\n\n  // biome-ignore lint/performance/noDelete: <explanation>\n  delete globOpts.patterns;\n\n  const paths: string[] = await glob(patterns, {\n    ...globOpts,\n    ignore: newOpts.ignore ?? DEFAULT_IGNORE,\n  });\n\n  if (globOpts.includeRoot === true) {\n    // Always include the workspace root (https://github.com/pnpm/pnpm/issues/1986)\n    Array.prototype.push.apply(\n      paths,\n      await glob(normalizePatterns(['.']), {\n        ...globOpts,\n        ignore: newOpts.ignore ?? DEFAULT_IGNORE,\n      })\n    );\n  }\n\n  return (\n    await pFilter(\n      // `Array.from()` doesn't create an intermediate instance,\n      // unlike `array.map()`\n      Array.from(\n        // Remove duplicate paths using `Set`\n        new Set(\n          paths\n            .map((manifestPath) => {\n              return path.join(root, manifestPath);\n            })\n            .sort((path1, path2) => {\n              return lexCompare(path.dirname(path1), path.dirname(path2));\n            })\n        ),\n        async (manifestPath: string): Promise<Project | null> => {\n          try {\n            const rootDir = path.dirname(manifestPath);\n\n            return {\n              rootDir: rootDir as ProjectRootDir,\n              rootDirRealPath: (await fs.realpath(\n                rootDir\n              )) as ProjectRootDirRealPath,\n              ...(await readExactProjectManifest(manifestPath)),\n            };\n          } catch (err: unknown) {\n            if (\n              util.types.isNativeError(err) &&\n              'code' in err &&\n              err.code === 'ENOENT'\n            ) {\n              return null;\n            }\n\n            throw err;\n          }\n        }\n      ),\n      Boolean\n    )\n  ).filter(Boolean);\n}\n\nfunction normalizePatterns(patterns: readonly string[]): string[] {\n  const normalizedPatterns: string[] = [];\n  for (const pattern of patterns) {\n    // We should add separate pattern for each extension\n    // for some reason, fast-glob is buggy with /package.{json,yaml,json5} pattern\n    normalizedPatterns.push(pattern.replace(/\\/?$/, '/package.json'));\n    normalizedPatterns.push(pattern.replace(/\\/?$/, '/package.json5'));\n    normalizedPatterns.push(pattern.replace(/\\/?$/, '/package.yaml'));\n  }\n  return normalizedPatterns;\n}\n"],
  "mappings": "AAAA,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,gCAAgC;AAMzC,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,OAAO,aAAa;AAEpB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQA,eAAsB,aACpB,MACA,MACoB;AACpB,QAAM,UAAU,QAAQ,CAAC;AAEzB,QAAM,WAAW,EAAE,GAAG,SAAS,KAAK,MAAM,mBAAmB,MAAM;AAEnE,WAAS,SAAS,QAAQ,UAAU;AAEpC,QAAM,WAAW,kBAAkB,QAAQ,YAAY,CAAC,KAAK,IAAI,CAAC;AAGlE,SAAO,SAAS;AAEhB,QAAM,QAAkB,MAAM,KAAK,UAAU;AAAA,IAC3C,GAAG;AAAA,IACH,QAAQ,QAAQ,UAAU;AAAA,EAC5B,CAAC;AAED,MAAI,SAAS,gBAAgB,MAAM;AAEjC,UAAM,UAAU,KAAK;AAAA,MACnB;AAAA,MACA,MAAM,KAAK,kBAAkB,CAAC,GAAG,CAAC,GAAG;AAAA,QACnC,GAAG;AAAA,QACH,QAAQ,QAAQ,UAAU;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UACE,MAAM;AAAA;AAAA;AAAA,IAGJ,MAAM;AAAA;AAAA,MAEJ,IAAI;AAAA,QACF,MACG,IAAI,CAAC,iBAAiB;AACrB,iBAAO,KAAK,KAAK,MAAM,YAAY;AAAA,QACrC,CAAC,EACA,KAAK,CAAC,OAAO,UAAU;AACtB,iBAAO,WAAW,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,CAAC;AAAA,QAC5D,CAAC;AAAA,MACL;AAAA,MACA,OAAO,iBAAkD;AACvD,YAAI;AACF,gBAAM,UAAU,KAAK,QAAQ,YAAY;AAEzC,iBAAO;AAAA,YACL;AAAA,YACA,iBAAkB,MAAM,GAAG;AAAA,cACzB;AAAA,YACF;AAAA,YACA,GAAI,MAAM,yBAAyB,YAAY;AAAA,UACjD;AAAA,QACF,SAAS,KAAc;AACrB,cACE,KAAK,MAAM,cAAc,GAAG,KAC5B,UAAU,OACV,IAAI,SAAS,UACb;AACA,mBAAO;AAAA,UACT;AAEA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,EACF,GACA,OAAO,OAAO;AAClB;AAEA,SAAS,kBAAkB,UAAuC;AAChE,QAAM,qBAA+B,CAAC;AACtC,aAAW,WAAW,UAAU;AAG9B,uBAAmB,KAAK,QAAQ,QAAQ,QAAQ,eAAe,CAAC;AAChE,uBAAmB,KAAK,QAAQ,QAAQ,QAAQ,gBAAgB,CAAC;AACjE,uBAAmB,KAAK,QAAQ,QAAQ,QAAQ,eAAe,CAAC;AAAA,EAClE;AACA,SAAO;AACT;",
  "names": []
}
