{"version":3,"file":"index.cjs","names":["path","fs"],"sources":["../src/detect-monorepo.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type MonorepoInfo = {\n  /** Absolute path to the monorepo workspace root. */\n  rootDir: string;\n  /** Which workspace marker was found. \"workspaces\" covers npm/yarn/bun. */\n  kind: \"pnpm\" | \"workspaces\" | \"rush\";\n};\n\n/**\n * Markers that indicate a version-control working-copy root. We never walk\n * above one of these — workspace markers above the VCS boundary are not\n * legitimately part of the project.\n */\nconst VCS_MARKERS = [\".git\", \".hg\", \".svn\"];\n\n/**\n * Walk upward from `startDir` looking for a monorepo workspace root. Returns\n * null if no marker is found before a VCS-root boundary (`.git`, `.hg`, or\n * `.svn`) or the filesystem root is reached. The VCS-bearing directory is\n * itself checked for workspace markers before traversal stops, so a\n * workspace root and a repo root may coincide.\n *\n * Supported markers:\n * - `pnpm-workspace.yaml`\n * - `package.json` containing a `workspaces` field (npm, yarn, bun)\n * - `rush.json`\n */\nexport function detectMonorepo(\n  startDir: string = process.cwd(),\n): MonorepoInfo | null {\n  let current = path.resolve(startDir);\n  while (true) {\n    if (fs.existsSync(path.join(current, \"pnpm-workspace.yaml\"))) {\n      return { rootDir: current, kind: \"pnpm\" };\n    }\n    if (fs.existsSync(path.join(current, \"rush.json\"))) {\n      return { rootDir: current, kind: \"rush\" };\n    }\n    const pkgPath = path.join(current, \"package.json\");\n    if (fs.existsSync(pkgPath)) {\n      try {\n        const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as {\n          workspaces?: unknown;\n        };\n        if (hasWorkspacesField(pkg.workspaces)) {\n          return { rootDir: current, kind: \"workspaces\" };\n        }\n      } catch {\n        /** Malformed or unreadable package.json — ignore and continue upward. */\n      }\n    }\n    if (VCS_MARKERS.some((m) => fs.existsSync(path.join(current, m)))) {\n      return null;\n    }\n    const parent = path.dirname(current);\n    if (parent === current) return null;\n    current = parent;\n  }\n}\n\n/**\n * Accepts either an array of globs or a Yarn-style object with a `packages`\n * array. Anything else is treated as not a workspace root.\n */\nfunction hasWorkspacesField(value: unknown): boolean {\n  if (Array.isArray(value)) return true;\n  if (typeof value === \"object\" && value !== null) {\n    const packages = (value as { packages?: unknown }).packages;\n    return Array.isArray(packages);\n  }\n  return false;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAM,cAAc;CAAC;CAAQ;CAAO;CAAO;;;;;;;;;;;;;AAc3C,SAAgB,eACd,WAAmB,QAAQ,KAAK,EACX;CACrB,IAAI,UAAUA,UAAAA,QAAK,QAAQ,SAAS;AACpC,QAAO,MAAM;AACX,MAAIC,QAAAA,QAAG,WAAWD,UAAAA,QAAK,KAAK,SAAS,sBAAsB,CAAC,CAC1D,QAAO;GAAE,SAAS;GAAS,MAAM;GAAQ;AAE3C,MAAIC,QAAAA,QAAG,WAAWD,UAAAA,QAAK,KAAK,SAAS,YAAY,CAAC,CAChD,QAAO;GAAE,SAAS;GAAS,MAAM;GAAQ;EAE3C,MAAM,UAAUA,UAAAA,QAAK,KAAK,SAAS,eAAe;AAClD,MAAIC,QAAAA,QAAG,WAAW,QAAQ,CACxB,KAAI;AAIF,OAAI,mBAHQ,KAAK,MAAMA,QAAAA,QAAG,aAAa,SAAS,OAAO,CAAC,CAG7B,WAAW,CACpC,QAAO;IAAE,SAAS;IAAS,MAAM;IAAc;UAE3C;AAIV,MAAI,YAAY,MAAM,MAAMA,QAAAA,QAAG,WAAWD,UAAAA,QAAK,KAAK,SAAS,EAAE,CAAC,CAAC,CAC/D,QAAO;EAET,MAAM,SAASA,UAAAA,QAAK,QAAQ,QAAQ;AACpC,MAAI,WAAW,QAAS,QAAO;AAC/B,YAAU;;;;;;;AAQd,SAAS,mBAAmB,OAAyB;AACnD,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO;AACjC,KAAI,OAAO,UAAU,YAAY,UAAU,MAAM;EAC/C,MAAM,WAAY,MAAiC;AACnD,SAAO,MAAM,QAAQ,SAAS;;AAEhC,QAAO"}