{"version":3,"file":"self-link.d.ts","sourceRoot":"","sources":["../../src/self-link.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAmCpC,eAAO,MAAM,IAAI,uCAuBhB,CAAA;AAED,eAAO,MAAM,MAAM,uCAQlB,CAAA","sourcesContent":["// link the package folder into ./target/node_modules/<pkgname>\nimport { readlinkSync, symlinkSync } from 'fs'\nimport { mkdirpSync } from 'mkdirp'\nimport { dirname, relative, resolve, sep } from 'path'\nimport { rimrafSync } from 'rimraf'\nimport { walkUp } from 'walk-up-path'\nimport { Package } from './types.js'\n\nconst dirsMade = new Map<string, string>()\n\n// if the cwd is in already linked to or living within node_modules,\n// then skip the linking, because it's already done.\n// This is typically the case in a workspaces setup, and\n// creating yet *another* symlink to ourselves in src/node_modules\n// will break nx's change detection logic with an ELOOP error.\nlet inNM: boolean | undefined = undefined\n\nconst linkedAlready = (pkg: Package) => {\n  if (inNM !== undefined) {\n    return inNM\n  }\n\n  const cwd = process.cwd()\n  const p = `${sep}node_modules${sep}${pkg.name}`.toLowerCase()\n  if (cwd.toLowerCase().endsWith(p)) {\n    return (inNM = true)\n  }\n\n  for (const p of walkUp(cwd)) {\n    const link = resolve(p, 'node_modules', pkg.name)\n    try {\n      const target = resolve(dirname(link), readlinkSync(link))\n      if (relative(target, cwd) === '') {\n        return (inNM = true)\n      }\n    } catch {}\n  }\n\n  return (inNM = false)\n}\n\nexport const link = (pkg: Package, where: string) => {\n  const selfLink = pkg?.tshy?.selfLink\n  if (!pkg.name || selfLink === false || linkedAlready(pkg)) {\n    return\n  }\n  const dest = resolve(where, 'node_modules', pkg.name)\n  const dir = dirname(dest)\n  const src = relative(dir, process.cwd())\n  const made = mkdirpSync(dir)\n  if (made) dirsMade.set(dest, made)\n  try {\n    symlinkSync(src, dest)\n  } catch {\n    rimrafSync(dest)\n    let threw = true\n    try {\n      symlinkSync(src, dest)\n      threw = false\n    } finally {\n      // best effort if not set explicitly. suppress error with return.\n      if (threw && selfLink === undefined) return\n    }\n  }\n}\n\nexport const unlink = (pkg: Package, where: string) => {\n  if (!pkg.name || pkg?.tshy?.selfLink === false || linkedAlready(pkg)) {\n    return\n  }\n  const dest = resolve(where, 'node_modules', pkg.name)\n  rimrafSync(dest)\n  const made = dirsMade.get(dest)\n  if (made) rimrafSync(made)\n}\n"]}