import * as rimraf from "rimraf"; import * as spawn from "cross-spawn-promise"; import { mkdirSync, symlinkSync, constants, existsSync } from "fs"; import { join } from "path"; export function link(): Promise { const prefix = "@myscope"; // set to empty string if your libraries are not scoped const packageNameUnPrefixed = process.argv[1]; if (!packageNameUnPrefixed) { return enableLinking(); } else { return createLink(prefix, packageNameUnPrefixed); } } export function enableLinking(): Promise { return spawn("npm", ["link"]) .then(() => { if (!existsSync("dist")) { mkdirSync("dist", constants.S_IRWXO); } }) .catch((error: any) => { console.error(error.stderr.toString()); process.exit(1); }); } export function createLink(prefix: string, packageNameUnPrefixed: string): Promise { const packageName = `${prefix}/${packageNameUnPrefixed}`; return spawn("npm", ["config", "get", "prefix"]) .then((stdout: NodeBuffer) => { let path = stdout.toString().replace("\n", ""); if (!path.toUpperCase().indexOf("APPDATA")) { // ios path = join(path, "lib"); } const modulePrefixPath = join("node_modules", prefix); const modulePackagePath = join(modulePrefixPath, packageNameUnPrefixed); const nodeLinkPath = join(path, modulePackagePath); if (!existsSync(nodeLinkPath)) { console.error(`Cannot find package '${packageName}'. Did you enable linking?`); process.exit(1); } if (!existsSync(modulePrefixPath)) { mkdirSync(modulePrefixPath, constants.S_IRWXO); } rimraf(modulePackagePath, err => { mkdirSync(modulePackagePath, constants.S_IRWXO); symlinkSync(join(nodeLinkPath, "dist"), join(modulePackagePath, "dist"), "junction"); symlinkSync(join(nodeLinkPath, "package.json"), join(modulePackagePath, "package.json")); }); console.log("Installing typings..."); return spawn("typings", ["install", `npm:${packageName}`, "--save"]); }) .catch((error: any) => { console.error(error.stderr.toString()); process.exit(1); }); }