module-link-unlink
Version:
Link and unlink a module with saving and restoring the previous install
1 lines • 3.43 kB
Source Map (JSON)
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/module-link-unlink/src/unlinkModule.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { unlink } from 'link-unlink';\nimport { Lock } from 'lock';\nimport Queue from 'queue-cb';\n\nconst lock = Lock();\n\nfunction unlinkBin(nodeModules, binName, callback) {\n const destBin = path.join(nodeModules, '.bin', binName);\n\n fs.stat(destBin, (err) => {\n if (!err) return unlink(destBin, callback);\n console.log(`bin not found: ${destBin}. 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 const queue = new Queue(1);\n queue.defer(unlink.bind(null, dest));\n\n if (typeof pkg.bin === 'string')\n queue.defer(unlinkBin.bind(null, nodeModules, pkg.name)); // single bins\n else for (const binName in pkg.bin) queue.defer(unlinkBin.bind(null, nodeModules, binName)); // object of bins\n\n queue.await((err) => {\n err ? callback(err) : callback(null, dest);\n });\n } catch (err) {\n return callback(err);\n }\n });\n}\n\nimport type { UnlinkCallback } from './types';\n\nexport default function unlinkModule(src: string, nodeModules: string, callback?: undefined | UnlinkCallback): 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","unlink","Lock","Queue","lock","unlinkBin","nodeModules","binName","callback","destBin","join","stat","err","console","log","worker","src","release","pkg","JSON","parse","readFileSync","dest","apply","name","split","queue","defer","bind","bin","await","unlinkModule","Promise","resolve","reject","restore"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,MAAM,QAAQ,cAAc;AACrC,SAASC,IAAI,QAAQ,OAAO;AAC5B,OAAOC,WAAW,WAAW;AAE7B,MAAMC,OAAOF;AAEb,SAASG,UAAUC,WAAW,EAAEC,OAAO,EAAEC,QAAQ;IAC/C,MAAMC,UAAUT,KAAKU,IAAI,CAACJ,aAAa,QAAQC;IAE/CR,GAAGY,IAAI,CAACF,SAAS,CAACG;QAChB,IAAI,CAACA,KAAK,OAAOX,OAAOQ,SAASD;QACjCK,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEL,QAAQ,UAAU,CAAC;QACjDD;IACF;AACF;AAEA,SAASO,OAAOC,GAAG,EAAEV,WAAW,EAAEE,QAAQ;IACxCJ,KAAK;QAACY;QAAKV;KAAY,EAAE,CAACW;QACxBT,WAAWS,QAAQT;QACnB,IAAI;YACF,MAAMU,MAAMC,KAAKC,KAAK,CAACrB,GAAGsB,YAAY,CAACrB,KAAKU,IAAI,CAACM,KAAK,iBAAiB;YACvE,MAAMM,OAAOtB,KAAKU,IAAI,CAACa,KAAK,CAAC,MAAM;gBAACjB;mBAAgBY,IAAIM,IAAI,CAACC,KAAK,CAAC;aAAK;YAExE,MAAMC,QAAQ,IAAIvB,MAAM;YACxBuB,MAAMC,KAAK,CAAC1B,OAAO2B,IAAI,CAAC,MAAMN;YAE9B,IAAI,OAAOJ,IAAIW,GAAG,KAAK,UACrBH,MAAMC,KAAK,CAACtB,UAAUuB,IAAI,CAAC,MAAMtB,aAAaY,IAAIM,IAAI,IAAI,cAAc;iBACrE,IAAK,MAAMjB,WAAWW,IAAIW,GAAG,CAAEH,MAAMC,KAAK,CAACtB,UAAUuB,IAAI,CAAC,MAAMtB,aAAaC,WAAW,iBAAiB;YAE9GmB,MAAMI,KAAK,CAAC,CAAClB;gBACXA,MAAMJ,SAASI,OAAOJ,SAAS,MAAMc;YACvC;QACF,EAAE,OAAOV,KAAK;YACZ,OAAOJ,SAASI;QAClB;IACF;AACF;AAIA,eAAe,SAASmB,aAAaf,GAAW,EAAEV,WAAmB,EAAEE,QAAqC;IAC1G,IAAI,OAAOA,aAAa,YAAY,OAAOO,OAAOC,KAAKV,aAAaE;IACpE,OAAO,IAAIwB,QAAQ,CAACC,SAASC,SAAWnB,OAAOC,KAAKV,aAAa,CAACM,KAAKuB,UAAcvB,MAAMsB,OAAOtB,OAAOqB,QAAQE;AACnH"}