module-link-unlink
Version:
Link and unlink a module with saving and restoring the previous install
1 lines • 4.08 kB
Source Map (JSON)
{"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":["linkModule","lock","Lock","linkBin","src","binPath","nodeModules","binName","callback","binFullPath","path","join","apply","split","destBin","fs","stat","err","link","console","log","worker","release","pkg","JSON","parse","readFileSync","dest","name","mkdirp","dirname","queue","Queue","defer","bind","bin","await","Promise","resolve","reject","restore"],"mappings":";;;;+BAiDA;;;eAAwBA;;;yDAjDT;2DACE;0BACI;oBACA;oEACF;8DACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAElB,IAAMC,OAAOC,IAAAA,UAAI;AAEjB,SAASC,QAAQC,GAAG,EAAEC,OAAO,EAAEC,WAAW,EAAEC,OAAO,EAAEC,QAAQ;IAC3D,IAAMC,cAAcC,aAAI,CAACC,IAAI,CAACC,KAAK,CAAC,MAAM;QAACR;KAA2B,CAA5B,OAAM,qBAAGC,QAAQQ,KAAK,CAAC;IACjE,IAAMC,UAAUJ,aAAI,CAACC,IAAI,CAACL,aAAa,QAAQC;IAE/CQ,WAAE,CAACC,IAAI,CAACP,aAAa,SAACQ;QACpB,IAAI,CAACA,KAAK,OAAOC,IAAAA,gBAAI,EAACT,aAAaK,SAASN;QAC5CW,QAAQC,GAAG,CAAC,AAAC,kBAA6B,OAAZX,aAAY;QAC1CD;IACF;AACF;AAEA,SAASa,OAAOjB,GAAG,EAAEE,WAAW,EAAEE,QAAQ;IACxCP,KAAK;QAACG;QAAKE;KAAY,EAAE,SAACgB;QACxBd,WAAWc,QAAQd;QACnB,IAAI;YACF,IAAMe,MAAMC,KAAKC,KAAK,CAACV,WAAE,CAACW,YAAY,CAAChB,aAAI,CAACC,IAAI,CAACP,KAAK,iBAAiB;YACvE,IAAMuB,OAAOjB,aAAI,CAACC,IAAI,CAACC,KAAK,CAAC,MAAM;gBAACN;aAAoC,CAArC,OAAc,qBAAGiB,IAAIK,IAAI,CAACf,KAAK,CAAC;YAEnEgB,IAAAA,sBAAM,EAACnB,aAAI,CAACoB,OAAO,CAACH,OAAO,SAACV;gBAC1B,IAAIA,KAAK,OAAOT,SAASS;gBAEzB,IAAMc,QAAQ,IAAIC,gBAAK;gBACvBD,MAAME,KAAK,CAACf,gBAAI,CAACgB,IAAI,CAAC,MAAM9B,KAAKuB;gBAEjC,IAAI,OAAOJ,IAAIY,GAAG,KAAK,UACrBJ,MAAME,KAAK,CAAC9B,QAAQ+B,IAAI,CAAC,MAAM9B,KAAKmB,IAAIY,GAAG,EAAE7B,aAAaiB,IAAIK,IAAI,IAAI,cAAc;qBACjF,IAAK,IAAMrB,WAAWgB,IAAIY,GAAG,CAAEJ,MAAME,KAAK,CAAC9B,QAAQ+B,IAAI,CAAC,MAAM9B,KAAKmB,IAAIY,GAAG,CAAC5B,QAAQ,EAAED,aAAaC,WAAW,iBAAiB;gBAEnIwB,MAAMK,KAAK,CAAC,SAACnB;oBACXA,MAAMT,SAASS,OAAOT,SAAS,MAAMmB;gBACvC;YACF;QACF,EAAE,OAAOV,KAAK;YACZ,OAAOT,SAASS;QAClB;IACF;AACF;AAIe,SAASjB,WAAWI,GAAW,EAAEE,WAAmB,EAAEE,QAAmC;IACtG,IAAI,OAAOA,aAAa,YAAY,OAAOa,OAAOjB,KAAKE,aAAaE;IACpE,OAAO,IAAI6B,QAAQ,SAACC,SAASC;eAAWlB,OAAOjB,KAAKE,aAAa,SAACW,KAAKuB;mBAAcvB,MAAMsB,OAAOtB,OAAOqB,QAAQE;;;AACnH"}