123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- "use strict";
- var fs = require("fs"),
- path = require("path"),
- child_process = require("child_process");
-
- var semver;
-
- try {
- // installed as a peer dependency
- require.resolve("protobufjs");
- exports.pathToProtobufJs = "protobufjs";
- } catch (e) {
- // local development, i.e. forked from github
- exports.pathToProtobufJs = "..";
- }
-
- var protobuf = require(exports.pathToProtobufJs);
-
- function basenameCompare(a, b) {
- var aa = String(a).replace(/\.\w+$/, "").split(/(-?\d*\.?\d+)/g),
- bb = String(b).replace(/\.\w+$/, "").split(/(-?\d*\.?\d+)/g);
- for (var i = 0, k = Math.min(aa.length, bb.length); i < k; i++) {
- var x = parseFloat(aa[i]) || aa[i].toLowerCase(),
- y = parseFloat(bb[i]) || bb[i].toLowerCase();
- if (x < y)
- return -1;
- if (x > y)
- return 1;
- }
- return a.length < b.length ? -1 : 0;
- }
-
- exports.requireAll = function requireAll(dirname) {
- dirname = path.join(__dirname, dirname);
- var files = fs.readdirSync(dirname).sort(basenameCompare),
- all = {};
- files.forEach(function(file) {
- var basename = path.basename(file, ".js"),
- extname = path.extname(file);
- if (extname === ".js")
- all[basename] = require(path.join(dirname, file));
- });
- return all;
- };
-
- exports.traverse = function traverse(current, fn) {
- fn(current);
- if (current.fieldsArray)
- current.fieldsArray.forEach(function(field) {
- traverse(field, fn);
- });
- if (current.oneofsArray)
- current.oneofsArray.forEach(function(oneof) {
- traverse(oneof, fn);
- });
- if (current.methodsArray)
- current.methodsArray.forEach(function(method) {
- traverse(method, fn);
- });
- if (current.nestedArray)
- current.nestedArray.forEach(function(nested) {
- traverse(nested, fn);
- });
- };
-
- exports.traverseResolved = function traverseResolved(current, fn) {
- fn(current);
- if (current.resolvedType)
- traverseResolved(current.resolvedType, fn);
- if (current.resolvedKeyType)
- traverseResolved(current.resolvedKeyType, fn);
- if (current.resolvedRequestType)
- traverseResolved(current.resolvedRequestType, fn);
- if (current.resolvedResponseType)
- traverseResolved(current.resolvedResponseType, fn);
- };
-
- exports.inspect = function inspect(object, indent) {
- if (!object)
- return "";
- var chalk = require("chalk");
- var sb = [];
- if (!indent)
- indent = "";
- var ind = indent ? indent.substring(0, indent.length - 2) + "└ " : "";
- sb.push(
- ind + chalk.bold(object.toString()) + (object.visible ? " (visible)" : ""),
- indent + chalk.gray("parent: ") + object.parent
- );
- if (object instanceof protobuf.Field) {
- if (object.extend !== undefined)
- sb.push(indent + chalk.gray("extend: ") + object.extend);
- if (object.partOf)
- sb.push(indent + chalk.gray("oneof : ") + object.oneof);
- }
- sb.push("");
- if (object.fieldsArray)
- object.fieldsArray.forEach(function(field) {
- sb.push(inspect(field, indent + " "));
- });
- if (object.oneofsArray)
- object.oneofsArray.forEach(function(oneof) {
- sb.push(inspect(oneof, indent + " "));
- });
- if (object.methodsArray)
- object.methodsArray.forEach(function(service) {
- sb.push(inspect(service, indent + " "));
- });
- if (object.nestedArray)
- object.nestedArray.forEach(function(nested) {
- sb.push(inspect(nested, indent + " "));
- });
- return sb.join("\n");
- };
-
- function modExists(name, version) {
- for (var i = 0; i < module.paths.length; ++i) {
- try {
- var pkg = JSON.parse(fs.readFileSync(path.join(module.paths[i], name, "package.json")));
- return semver
- ? semver.satisfies(pkg.version, version)
- : parseInt(pkg.version, 10) === parseInt(version.replace(/^[\^~]/, ""), 10); // used for semver only
- } catch (e) {/**/}
- }
- return false;
- }
-
- function modInstall(install) {
- child_process.execSync("npm --silent install " + (typeof install === "string" ? install : install.join(" ")), {
- cwd: __dirname,
- stdio: "ignore"
- });
- }
-
- exports.setup = function() {
- var pkg = require(path.join(__dirname, "..", "package.json"));
- var version = pkg.dependencies["semver"] || pkg.devDependencies["semver"];
- if (!modExists("semver", version)) {
- process.stderr.write("installing semver@" + version + "\n");
- modInstall("semver@" + version);
- }
- semver = require("semver"); // used from now on for version comparison
- var install = [];
- pkg.cliDependencies.forEach(function(name) {
- if (name === "semver")
- return;
- version = pkg.dependencies[name] || pkg.devDependencies[name];
- if (!modExists(name, version)) {
- process.stderr.write("installing " + name + "@" + version + "\n");
- install.push(name + "@" + version);
- }
- });
- require("../scripts/postinstall"); // emit postinstall warning, if any
- if (!install.length)
- return;
- modInstall(install);
- };
-
- exports.wrap = function(OUTPUT, options) {
- var name = options.wrap || "default";
- var wrap;
- try {
- // try built-in wrappers first
- wrap = fs.readFileSync(path.join(__dirname, "wrappers", name + ".js")).toString("utf8");
- } catch (e) {
- // otherwise fetch the custom one
- wrap = fs.readFileSync(path.resolve(process.cwd(), name)).toString("utf8");
- }
- wrap = wrap.replace(/\$DEPENDENCY/g, JSON.stringify(options.dependency || "protobufjs"));
- wrap = wrap.replace(/( *)\$OUTPUT;/, function($0, $1) {
- return $1.length ? OUTPUT.replace(/^/mg, $1) : OUTPUT;
- });
- if (options.lint !== "")
- wrap = "/*" + options.lint + "*/\n" + wrap;
- return wrap.replace(/\r?\n/g, "\n");
- };
-
- exports.pad = function(str, len, l) {
- while (str.length < len)
- str = l ? str + " " : " " + str;
- return str;
- };
|