{
  "version": 3,
  "sources": ["../../../../src/packages/fs.hard-link-dir/index.ts"],
  "sourcesContent": ["import assert from 'node:assert';\nimport path from 'node:path';\nimport util from 'node:util';\nimport fs from 'node:fs';\nimport { globalWarn } from '../logger/index.ts';\n\nexport function hardLinkDir(src: string, destDirs: string[]): void {\n  if (destDirs.length === 0) {\n    return;\n  }\n\n  // Don't try to hard link the source directory to itself\n  _hardLinkDir(\n    src,\n    destDirs.filter((destDir) => path.relative(destDir, src) !== ''),\n    true\n  );\n}\n\nfunction _hardLinkDir(\n  src: string,\n  destDirs: string[],\n  isRoot?: boolean | undefined\n): void {\n  let files: string[] = [];\n\n  try {\n    files = fs.readdirSync(src);\n  } catch (err: unknown) {\n    if (\n      isRoot !== true ||\n      !(util.types.isNativeError(err) && 'code' in err && err.code === 'ENOENT')\n    ) {\n      throw err;\n    }\n\n    globalWarn(\n      `Source directory not found when creating hardLinks for: ${src}. Creating destinations as empty: ${destDirs.join(', ')}`\n    );\n\n    for (const dir of destDirs) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n\n    return;\n  }\n\n  for (const file of files) {\n    if (file === 'node_modules') {\n      continue;\n    }\n\n    const srcFile = path.join(src, file);\n\n    if (fs.lstatSync(srcFile).isDirectory()) {\n      const destSubdirs = destDirs.map((destDir) => {\n        const destSubdir = path.join(destDir, file);\n\n        try {\n          fs.mkdirSync(destSubdir, { recursive: true });\n        } catch (err: unknown) {\n          if (\n            !(\n              util.types.isNativeError(err) &&\n              'code' in err &&\n              err.code === 'EEXIST'\n            )\n          ) {\n            throw err;\n          }\n        }\n        return destSubdir;\n      });\n\n      _hardLinkDir(srcFile, destSubdirs);\n\n      continue;\n    }\n\n    for (const destDir of destDirs) {\n      const destFile = path.join(destDir, file);\n\n      try {\n        linkOrCopyFile(srcFile, destFile);\n      } catch (err: unknown) {\n        if (\n          util.types.isNativeError(err) &&\n          'code' in err &&\n          err.code === 'ENOENT'\n        ) {\n          // Ignore broken symlinks\n          continue;\n        }\n\n        throw err;\n      }\n    }\n  }\n}\n\nfunction linkOrCopyFile(srcFile: string, destFile: string): void {\n  try {\n    linkOrCopy(srcFile, destFile);\n  } catch (err: unknown) {\n    assert(util.types.isNativeError(err));\n\n    if ('code' in err && err.code === 'ENOENT') {\n      fs.mkdirSync(path.dirname(destFile), { recursive: true });\n\n      linkOrCopy(srcFile, destFile);\n\n      return;\n    }\n\n    if (!('code' in err && err.code === 'EEXIST')) {\n      throw err;\n    }\n  }\n}\n\n/*\n * This function could be optimized because we don't really need to try linking again\n * if linking failed once.\n */\nfunction linkOrCopy(srcFile: string, destFile: string): void {\n  try {\n    fs.linkSync(srcFile, destFile);\n  } catch (err: unknown) {\n    if (\n      !(util.types.isNativeError(err) && 'code' in err && err.code === 'EXDEV')\n    ) {\n      throw err;\n    }\n\n    fs.copyFileSync(srcFile, destFile);\n  }\n}\n"],
  "mappings": "AAAA,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,kBAAkB;AAEpB,SAAS,YAAY,KAAa,UAA0B;AACjE,MAAI,SAAS,WAAW,GAAG;AACzB;AAAA,EACF;AAGA;AAAA,IACE;AAAA,IACA,SAAS,OAAO,CAAC,YAAY,KAAK,SAAS,SAAS,GAAG,MAAM,EAAE;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,aACP,KACA,UACA,QACM;AACN,MAAI,QAAkB,CAAC;AAEvB,MAAI;AACF,YAAQ,GAAG,YAAY,GAAG;AAAA,EAC5B,SAAS,KAAc;AACrB,QACE,WAAW,QACX,EAAE,KAAK,MAAM,cAAc,GAAG,KAAK,UAAU,OAAO,IAAI,SAAS,WACjE;AACA,YAAM;AAAA,IACR;AAEA;AAAA,MACE,2DAA2D,GAAG,qCAAqC,SAAS,KAAK,IAAI,CAAC;AAAA,IACxH;AAEA,eAAW,OAAO,UAAU;AAC1B,SAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC;AAEA;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,gBAAgB;AAC3B;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,KAAK,KAAK,IAAI;AAEnC,QAAI,GAAG,UAAU,OAAO,EAAE,YAAY,GAAG;AACvC,YAAM,cAAc,SAAS,IAAI,CAAC,YAAY;AAC5C,cAAM,aAAa,KAAK,KAAK,SAAS,IAAI;AAE1C,YAAI;AACF,aAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,QAC9C,SAAS,KAAc;AACrB,cACE,EACE,KAAK,MAAM,cAAc,GAAG,KAC5B,UAAU,OACV,IAAI,SAAS,WAEf;AACA,kBAAM;AAAA,UACR;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAED,mBAAa,SAAS,WAAW;AAEjC;AAAA,IACF;AAEA,eAAW,WAAW,UAAU;AAC9B,YAAM,WAAW,KAAK,KAAK,SAAS,IAAI;AAExC,UAAI;AACF,uBAAe,SAAS,QAAQ;AAAA,MAClC,SAAS,KAAc;AACrB,YACE,KAAK,MAAM,cAAc,GAAG,KAC5B,UAAU,OACV,IAAI,SAAS,UACb;AAEA;AAAA,QACF;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,SAAiB,UAAwB;AAC/D,MAAI;AACF,eAAW,SAAS,QAAQ;AAAA,EAC9B,SAAS,KAAc;AACrB,WAAO,KAAK,MAAM,cAAc,GAAG,CAAC;AAEpC,QAAI,UAAU,OAAO,IAAI,SAAS,UAAU;AAC1C,SAAG,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAExD,iBAAW,SAAS,QAAQ;AAE5B;AAAA,IACF;AAEA,QAAI,EAAE,UAAU,OAAO,IAAI,SAAS,WAAW;AAC7C,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAMA,SAAS,WAAW,SAAiB,UAAwB;AAC3D,MAAI;AACF,OAAG,SAAS,SAAS,QAAQ;AAAA,EAC/B,SAAS,KAAc;AACrB,QACE,EAAE,KAAK,MAAM,cAAc,GAAG,KAAK,UAAU,OAAO,IAAI,SAAS,UACjE;AACA,YAAM;AAAA,IACR;AAEA,OAAG,aAAa,SAAS,QAAQ;AAAA,EACnC;AACF;",
  "names": []
}
