UNPKG

typings-core

Version:
252 lines 9.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var fs = require("graceful-fs"); var extend = require("xtend"); var thenify = require("thenify"); var stripBom = require("strip-bom"); var parse = require("parse-json"); var popsicle = require("popsicle"); var popsicleStatus = require("popsicle-status"); var popsicleRetry = require("popsicle-retry"); var popsicleRewrite = require("popsicle-rewrite"); var detectIndent = require("detect-indent"); var sortKeys = require("sort-keys"); var Mkdirp = require("mkdirp"); var uniq = require("array-uniq"); var lockfile = require("lockfile"); var Rimraf = require("rimraf"); var createProxy = require("popsicle-proxy-agent"); var Throat = require("throat"); var promise_finally_1 = require("promise-finally"); var Touch = require("touch"); var path_1 = require("path"); var url_1 = require("url"); var template = require("string-template"); var config_1 = require("./config"); var path_2 = require("./path"); var references_1 = require("./references"); var rc_1 = require("./rc"); var store_1 = require("./store"); var debug_1 = require("./debug"); var pkg = require('../../package.json'); var registryURL = url_1.parse(rc_1.default.registryURL); var throat = Throat(Promise); exports.touch = throat(10, thenify(Touch)); exports.stat = throat(10, thenify(fs.stat)); exports.readFile = throat(10, thenify(fs.readFile)); exports.writeFile = thenify(fs.writeFile); exports.mkdirp = throat(10, thenify(Mkdirp)); exports.unlink = throat(10, thenify(fs.unlink)); exports.lock = throat(10, thenify(lockfile.lock)); exports.unlock = throat(10, thenify(lockfile.unlock)); exports.rimraf = throat(10, thenify(Rimraf)); exports.readdir = throat(10, thenify(fs.readdir)); exports.rmdir = throat(10, thenify(fs.rmdir)); function rmdirUntil(path, until) { if (path === until) { return Promise.resolve(); } return exports.readdir(path) .then(function (files) { if (files.length) { return; } return exports.rmdir(path) .then(function () { return rmdirUntil(path_1.dirname(path), until); }); }) .catch(function (err) { if (err.code === 'ENOENT') { return; } return Promise.reject(err); }); } exports.rmdirUntil = rmdirUntil; function isFile(path) { return exports.stat(path).then(function (stat) { return stat.isFile(); }, function () { return false; }); } exports.isFile = isFile; function readJson(path, allowEmpty) { return exports.readFile(path, 'utf8') .then(stripBom) .then(function (contents) { return parseJson(contents, path, allowEmpty); }); } exports.readJson = readJson; function writeJson(path, json, indent, eol) { return exports.writeFile(path, stringifyJson(json, indent, eol)); } exports.writeJson = writeJson; function readConfig(path) { return readJson(path, true).then(function (data) { return parseConfig(data, path); }); } exports.readConfig = readConfig; function readConfigFrom(path) { return readJsonFrom(path, true).then(function (data) { return parseConfig(data, path); }); } exports.readConfigFrom = readConfigFrom; function parseConfig(config, path) { return config; } exports.parseConfig = parseConfig; exports.proxy = createProxy({ proxy: rc_1.default.proxy, httpProxy: rc_1.default.httpProxy, httpsProxy: rc_1.default.httpsProxy, noProxy: rc_1.default.noProxy }); exports.readHttp = throat(5, function readHttp(url) { var rejectUnauthorized = rc_1.default.rejectUnauthorized, ca = rc_1.default.ca, key = rc_1.default.key, cert = rc_1.default.cert, userAgent = rc_1.default.userAgent; return popsicle.get({ url: url, headers: { 'User-Agent': template(userAgent, { nodeVersion: process.version, platform: process.platform, arch: process.arch, typingsVersion: pkg.version }) }, transport: popsicle.createTransport({ ca: ca, key: key, cert: cert, agent: exports.proxy(url), rejectUnauthorized: rejectUnauthorized }) }) .use(popsicleStatus(200)) .use(popsicleRewrite(rc_1.default.urlRewrites || {})) .use(function (request, next) { if (request.Url.host === registryURL.host) { if (store_1.default.get('clientId')) { request.set('Typings-Client-Id', store_1.default.get('clientId')); } return next().then(function (response) { if (response.get('Typings-Client-Id')) { store_1.default.set('clientId', response.get('Typings-Client-Id')); } return response; }); } return next(); }) .use(function (request, next) { var hostname = request.Url.hostname; if (rc_1.default.githubToken && (hostname === 'raw.githubusercontent.com' || hostname === 'api.github.com')) { request.set('Authorization', "token " + rc_1.default.githubToken); } return next(); }) .use(popsicleRetry()) .then(function (response) { debug_1.default('http response', response.toJSON()); return response.body; }); }); function readFileFrom(from) { return path_2.isHttp(from) ? exports.readHttp(from) : exports.readFile(from, 'utf8'); } exports.readFileFrom = readFileFrom; function readJsonFrom(from, allowEmpty) { return readFileFrom(from) .then(stripBom) .then(function (contents) { return parseJson(contents, from, allowEmpty); }); } exports.readJsonFrom = readJsonFrom; function stringifyJson(json, indent, eol) { if (eol === void 0) { eol = path_2.EOL; } return path_2.normalizeEOL(JSON.stringify(json, null, indent || 2), eol) + eol; } exports.stringifyJson = stringifyJson; function parseJson(contents, path, allowEmpty) { if (contents === '' && allowEmpty) { return {}; } return parse(contents, null, path); } exports.parseJson = parseJson; function transformFile(path, transform) { function handle(contents) { return Promise.resolve(transform(contents)) .then(function (contents) { return exports.writeFile(path, contents); }); } var lockfile = path + ".lock"; var lockOptions = { wait: 250, retries: 25, stale: 60000 }; var result = exports.lock(lockfile, lockOptions) .then(function () { return exports.readFile(path, 'utf8'); }) .then(function (contents) { return handle(contents); }, function () { return handle(undefined); }); return promise_finally_1.default(result, function () { return exports.unlock(lockfile); }); } exports.transformFile = transformFile; function transformJson(path, transform, allowEmpty) { return transformFile(path, function (contents) { var indent = contents ? detectIndent(contents).indent : undefined; var json = contents ? parseJson(stripBom(contents), path, allowEmpty) : undefined; var eol = contents ? path_2.detectEOL(contents) : undefined; return Promise.resolve(transform(json)) .then(function (json) { return stringifyJson(json, indent, eol); }); }); } exports.transformJson = transformJson; function transformConfig(cwd, transform) { var path = path_1.join(cwd, config_1.CONFIG_FILE); return transformJson(path, function (config) { if (config === void 0) { config = {}; } return Promise.resolve(transform(parseConfig(config, path))) .then(function (config) { if (config.dependencies) { config.dependencies = sortKeys(config.dependencies); } if (config.peerDependencies) { config.peerDependencies = sortKeys(config.peerDependencies); } if (config.devDependencies) { config.devDependencies = sortKeys(config.devDependencies); } if (config.globalDependencies) { config.globalDependencies = sortKeys(config.globalDependencies); } if (config.globalDevDependencies) { config.globalDevDependencies = sortKeys(config.globalDevDependencies); } return config; }); }, true); } exports.transformConfig = transformConfig; function transformDtsFile(path, transform) { var cwd = path_1.dirname(path); return transformFile(path, function (contents) { var typings = references_1.parseReferences(contents, cwd); return Promise.resolve(transform(typings)) .then(function (typings) { return references_1.stringifyReferences(uniq(typings).sort(), cwd); }); }); } exports.transformDtsFile = transformDtsFile; function treeToJson(tree) { return extend(tree, { parent: undefined, dependencies: dependenciesToJson(tree.dependencies), devDependencies: dependenciesToJson(tree.devDependencies), peerDependencies: dependenciesToJson(tree.peerDependencies), globalDependencies: dependenciesToJson(tree.globalDependencies), globalDevDependencies: dependenciesToJson(tree.globalDevDependencies) }); } exports.treeToJson = treeToJson; function dependenciesToJson(dependencies) { var json = {}; var keys = Object.keys(dependencies); if (keys.length === 0) { return; } for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { var key = keys_1[_i]; json[key] = treeToJson(dependencies[key]); } return json; } exports.dependenciesToJson = dependenciesToJson; //# sourceMappingURL=fs.js.map