{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/module-link-unlink/src/linkModule.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { link } from 'link-unlink';\nimport { Lock } from 'lock';\nimport mkdirp from 'mkdirp-classic';\nimport Queue from 'queue-cb';\n\nconst lock = Lock();\n\nfunction linkBin(src, binPath, nodeModules, binName, callback) {\n  const binFullPath = path.join.apply(null, [src, ...binPath.split('/')]);\n  const destBin = path.join(nodeModules, '.bin', binName);\n\n  fs.stat(binFullPath, (err) => {\n    if (!err) return link(binFullPath, destBin, callback);\n    console.log(`bin not found: ${binFullPath}. Skipping`);\n    callback();\n  });\n}\n\nfunction worker(src, nodeModules, callback) {\n  lock([src, nodeModules], (release) => {\n    callback = release(callback);\n    try {\n      const pkg = JSON.parse(fs.readFileSync(path.join(src, 'package.json'), 'utf8'));\n      const dest = path.join.apply(null, [nodeModules, ...pkg.name.split('/')]);\n\n      mkdirp(path.dirname(dest), (err) => {\n        if (err) return callback(err);\n\n        const queue = new Queue();\n        queue.defer(link.bind(null, src, dest));\n\n        if (typeof pkg.bin === 'string')\n          queue.defer(linkBin.bind(null, src, pkg.bin, nodeModules, pkg.name)); // single bins\n        else for (const binName in pkg.bin) queue.defer(linkBin.bind(null, src, pkg.bin[binName], nodeModules, binName)); // object of bins\n\n        queue.await((err) => {\n          err ? callback(err) : callback(null, dest);\n        });\n      });\n    } catch (err) {\n      return callback(err);\n    }\n  });\n}\n\nimport type { LinkCallback } from './types';\n\nexport default function linkModule(src: string, nodeModules: string, callback?: undefined | LinkCallback): undefined | Promise<string> {\n  if (typeof callback === 'function') return worker(src, nodeModules, callback) as undefined;\n  return new Promise((resolve, reject) => worker(src, nodeModules, (err, restore?) => (err ? reject(err) : resolve(restore))));\n}\n"],"names":["fs","path","link","Lock","mkdirp","Queue","lock","linkBin","src","binPath","nodeModules","binName","callback","binFullPath","join","apply","split","destBin","stat","err","console","log","worker","release","pkg","JSON","parse","readFileSync","dest","name","dirname","queue","defer","bind","bin","await","linkModule","Promise","resolve","reject","restore"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,IAAI,QAAQ,cAAc;AACnC,SAASC,IAAI,QAAQ,OAAO;AAC5B,OAAOC,YAAY,iBAAiB;AACpC,OAAOC,WAAW,WAAW;AAE7B,MAAMC,OAAOH;AAEb,SAASI,QAAQC,GAAG,EAAEC,OAAO,EAAEC,WAAW,EAAEC,OAAO,EAAEC,QAAQ;IAC3D,MAAMC,cAAcZ,KAAKa,IAAI,CAACC,KAAK,CAAC,MAAM;QAACP;WAAQC,QAAQO,KAAK,CAAC;KAAK;IACtE,MAAMC,UAAUhB,KAAKa,IAAI,CAACJ,aAAa,QAAQC;IAE/CX,GAAGkB,IAAI,CAACL,aAAa,CAACM;QACpB,IAAI,CAACA,KAAK,OAAOjB,KAAKW,aAAaI,SAASL;QAC5CQ,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAER,YAAY,UAAU,CAAC;QACrDD;IACF;AACF;AAEA,SAASU,OAAOd,GAAG,EAAEE,WAAW,EAAEE,QAAQ;IACxCN,KAAK;QAACE;QAAKE;KAAY,EAAE,CAACa;QACxBX,WAAWW,QAAQX;QACnB,IAAI;YACF,MAAMY,MAAMC,KAAKC,KAAK,CAAC1B,GAAG2B,YAAY,CAAC1B,KAAKa,IAAI,CAACN,KAAK,iBAAiB;YACvE,MAAMoB,OAAO3B,KAAKa,IAAI,CAACC,KAAK,CAAC,MAAM;gBAACL;mBAAgBc,IAAIK,IAAI,CAACb,KAAK,CAAC;aAAK;YAExEZ,OAAOH,KAAK6B,OAAO,CAACF,OAAO,CAACT;gBAC1B,IAAIA,KAAK,OAAOP,SAASO;gBAEzB,MAAMY,QAAQ,IAAI1B;gBAClB0B,MAAMC,KAAK,CAAC9B,KAAK+B,IAAI,CAAC,MAAMzB,KAAKoB;gBAEjC,IAAI,OAAOJ,IAAIU,GAAG,KAAK,UACrBH,MAAMC,KAAK,CAACzB,QAAQ0B,IAAI,CAAC,MAAMzB,KAAKgB,IAAIU,GAAG,EAAExB,aAAac,IAAIK,IAAI,IAAI,cAAc;qBACjF,IAAK,MAAMlB,WAAWa,IAAIU,GAAG,CAAEH,MAAMC,KAAK,CAACzB,QAAQ0B,IAAI,CAAC,MAAMzB,KAAKgB,IAAIU,GAAG,CAACvB,QAAQ,EAAED,aAAaC,WAAW,iBAAiB;gBAEnIoB,MAAMI,KAAK,CAAC,CAAChB;oBACXA,MAAMP,SAASO,OAAOP,SAAS,MAAMgB;gBACvC;YACF;QACF,EAAE,OAAOT,KAAK;YACZ,OAAOP,SAASO;QAClB;IACF;AACF;AAIA,eAAe,SAASiB,WAAW5B,GAAW,EAAEE,WAAmB,EAAEE,QAAmC;IACtG,IAAI,OAAOA,aAAa,YAAY,OAAOU,OAAOd,KAAKE,aAAaE;IACpE,OAAO,IAAIyB,QAAQ,CAACC,SAASC,SAAWjB,OAAOd,KAAKE,aAAa,CAACS,KAAKqB,UAAcrB,MAAMoB,OAAOpB,OAAOmB,QAAQE;AACnH"}