jsforce
Version:
Salesforce API Library for JavaScript
400 lines (398 loc) • 47.7 kB
JavaScript
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.exec.js";
import "core-js/modules/es.regexp.test.js";
import "core-js/modules/es.regexp.to-string.js";
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method";
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
import _Set from "@babel/runtime-corejs3/core-js-stable/set";
import _JSON$stringify from "@babel/runtime-corejs3/core-js-stable/json/stringify";
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
import _endsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/ends-with";
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && _getIteratorMethod(r) || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { var _context16; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context16 = {}.toString.call(r)).call(_context16, 8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
import "core-js/modules/es.array.join.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.object.keys.js";
import os from 'os';
import fs from 'node:fs';
import path from 'path';
import { Cli } from '../cli/cli';
import { VERSION } from '..';
import { Command } from 'commander';
function getCacheFileDir() {
return path.join(os.tmpdir(), 'jsforce-gen-schema-cache');
}
function getCacheFilePath(orgId) {
return path.join(getCacheFileDir(), orgId, 'describe.json');
}
function readDescribedCache(_x) {
return _readDescribedCache.apply(this, arguments);
}
function _readDescribedCache() {
_readDescribedCache = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(orgId) {
var cacheFile, data;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
cacheFile = getCacheFilePath(orgId);
_context.next = 4;
return fs.promises.readFile(cacheFile, 'utf8');
case 4:
data = _context.sent;
return _context.abrupt("return", JSON.parse(data));
case 8:
_context.prev = 8;
_context.t0 = _context["catch"](0);
return _context.abrupt("return", null);
case 11:
case "end":
return _context.stop();
}
}, _callee, null, [[0, 8]]);
}));
return _readDescribedCache.apply(this, arguments);
}
function loadDescribeResult(_x2, _x3, _x4) {
return _loadDescribeResult.apply(this, arguments);
}
function _loadDescribeResult() {
_loadDescribeResult = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(conn, orgId, cache) {
var _yield$conn$describeG, sos, sobjects, _iterator2, _step2, name, so, cacheFile;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
console.info('describing global');
_context2.next = 3;
return conn.describeGlobal();
case 3:
_yield$conn$describeG = _context2.sent;
sos = _yield$conn$describeG.sobjects;
sobjects = [];
_iterator2 = _createForOfIteratorHelper(sos);
_context2.prev = 7;
_iterator2.s();
case 9:
if ((_step2 = _iterator2.n()).done) {
_context2.next = 18;
break;
}
name = _step2.value.name;
console.info('describing ' + name);
_context2.next = 14;
return conn.describe(name);
case 14:
so = _context2.sent;
sobjects.push(so);
case 16:
_context2.next = 9;
break;
case 18:
_context2.next = 23;
break;
case 20:
_context2.prev = 20;
_context2.t0 = _context2["catch"](7);
_iterator2.e(_context2.t0);
case 23:
_context2.prev = 23;
_iterator2.f();
return _context2.finish(23);
case 26:
if (!cache) {
_context2.next = 32;
break;
}
cacheFile = getCacheFilePath(orgId);
_context2.next = 30;
return fs.promises.mkdir(path.dirname(cacheFile), {
recursive: true
});
case 30:
_context2.next = 32;
return fs.promises.writeFile(cacheFile, _JSON$stringify(sobjects, null, 2), 'utf8');
case 32:
return _context2.abrupt("return", sobjects);
case 33:
case "end":
return _context2.stop();
}
}, _callee2, null, [[7, 20, 23, 26]]);
}));
return _loadDescribeResult.apply(this, arguments);
}
function getParentReferences(sobject) {
var parentReferences = [];
var _iterator = _createForOfIteratorHelper(sobject.fields),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _step$value = _step.value,
type = _step$value.type,
nillable = _step$value.nillable,
relationshipName = _step$value.relationshipName,
referenceTo = _step$value.referenceTo;
if (type === 'reference' && relationshipName && referenceTo && referenceTo.length > 0) {
var parentSObject = referenceTo.length > 1 ? 'Name' : referenceTo[0];
parentReferences.push({
nillable: nillable,
parentSObject: parentSObject,
relationshipName: relationshipName
});
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return parentReferences;
}
function getTSTypeString(type) {
return type === 'double' || type === 'int' || type === 'currency' || type === 'percent' ? 'number' : type === 'boolean' ? 'boolean' : type === 'date' || type === 'datetime' || type === 'time' ? 'DateString' : type === 'base64' ? 'BlobString' : type === 'address' ? 'Address' : type === 'complexvalue' ? 'any' : 'string';
}
function dumpSchema(_x5, _x6, _x7, _x8, _x9, _x10) {
return _dumpSchema.apply(this, arguments);
}
function _dumpSchema() {
_dumpSchema = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(conn, orgId, outputFile, schemaName, cache, filterObjects) {
var sobjects, out;
return _regeneratorRuntime.wrap(function _callee3$(_context14) {
while (1) switch (_context14.prev = _context14.next) {
case 0:
if (!cache) {
_context14.next = 6;
break;
}
_context14.next = 3;
return readDescribedCache(orgId);
case 3:
_context14.t1 = _context14.sent;
_context14.next = 7;
break;
case 6:
_context14.t1 = null;
case 7:
_context14.t0 = _context14.t1;
if (_context14.t0) {
_context14.next = 12;
break;
}
_context14.next = 11;
return loadDescribeResult(conn, orgId, cache);
case 11:
_context14.t0 = _context14.sent;
case 12:
sobjects = _context14.t0;
if (fs.existsSync(outputFile)) {
_context14.next = 18;
break;
}
_context14.next = 16;
return fs.promises.mkdir(path.dirname(outputFile), {
recursive: true
});
case 16:
_context14.next = 18;
return fs.promises.writeFile(outputFile, '', 'utf8');
case 18:
out = fs.createWriteStream(outputFile, 'utf8');
return _context14.abrupt("return", new _Promise(function (resolve, reject) {
out.on('error', function (err) {
return reject(err);
});
out.on('finish', resolve);
var writeLine = function writeLine(message) {
return out.write(message + '\n');
};
writeLine("import { Schema, SObjectDefinition, DateString, BlobString, Address } from 'jsforce';");
writeLine('');
var _iterator3 = _createForOfIteratorHelper(sobjects),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var _context3, _context4, _context5, _context6, _context7;
var sobject = _step3.value;
if (filterObjects && !filterObjects.has(sobject.name)) {
continue;
}
var name = sobject.name,
fields = sobject.fields,
childRelationships = sobject.childRelationships;
writeLine("type Fields$".concat(name, " = {"));
writeLine(' //');
var _iterator5 = _createForOfIteratorHelper(fields),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var _context8, _context9;
var _step5$value = _step5.value,
_name = _step5$value.name,
type = _step5$value.type,
nillable = _step5$value.nillable;
var tsType = getTSTypeString(type);
var orNull = nillable ? ' | null' : '';
writeLine(_concatInstanceProperty(_context8 = _concatInstanceProperty(_context9 = " ".concat(_name, ": ")).call(_context9, tsType)).call(_context8, orNull, ";"));
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
writeLine('};');
writeLine('');
writeLine("type ParentReferences$".concat(name, " = {"));
writeLine(' //');
var parentReferences = getParentReferences(sobject);
var _iterator6 = _createForOfIteratorHelper(parentReferences),
_step6;
try {
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
var _context10, _context11;
var _step6$value = _step6.value,
_nillable = _step6$value.nillable,
parentSObject = _step6$value.parentSObject,
relationshipName = _step6$value.relationshipName;
if (filterObjects && !filterObjects.has(parentSObject)) {
continue;
}
var _orNull = _nillable ? ' | null' : '';
writeLine(_concatInstanceProperty(_context10 = _concatInstanceProperty(_context11 = " ".concat(relationshipName, ": SObjectDefinition$")).call(_context11, parentSObject)).call(_context10, _orNull, ";"));
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
writeLine('};');
writeLine('');
writeLine("type ChildRelationships$".concat(name, " = {"));
writeLine(' //');
var _iterator7 = _createForOfIteratorHelper(childRelationships),
_step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
var _step7$value = _step7.value,
field = _step7$value.field,
childSObject = _step7$value.childSObject,
_relationshipName = _step7$value.relationshipName;
if (filterObjects && !filterObjects.has(childSObject)) {
continue;
}
if (field && childSObject && _relationshipName && !_endsWithInstanceProperty(field).call(field, '__c')) {
var _context12;
writeLine(_concatInstanceProperty(_context12 = " ".concat(_relationshipName, ": SObjectDefinition$")).call(_context12, childSObject, ";"));
}
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
writeLine('};');
writeLine('');
writeLine(_concatInstanceProperty(_context3 = _concatInstanceProperty(_context4 = _concatInstanceProperty(_context5 = _concatInstanceProperty(_context6 = _concatInstanceProperty(_context7 = "interface SObjectDefinition$".concat(name, " extends SObjectDefinition<'")).call(_context7, name, "'> {\n Name: '")).call(_context6, name, "';\n Fields: Fields$")).call(_context5, name, ";\n ParentReferences: ParentReferences$")).call(_context4, name, ";\n ChildRelationships: ChildRelationships$")).call(_context3, name, ";\n }"));
writeLine('');
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
writeLine('');
writeLine("export interface ".concat(schemaName, " extends Schema {"));
writeLine(' SObjects: {');
var _iterator4 = _createForOfIteratorHelper(sobjects),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var _context13;
var _name2 = _step4.value.name;
if (filterObjects && !filterObjects.has(_name2)) {
continue;
}
writeLine(_concatInstanceProperty(_context13 = " ".concat(_name2, ": SObjectDefinition$")).call(_context13, _name2, ";"));
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
writeLine(' };');
writeLine('}');
out.end();
}));
case 20:
case "end":
return _context14.stop();
}
}, _callee3);
}));
return _dumpSchema.apply(this, arguments);
}
function commaSeparatedList(value, _dummyPrevious) {
return new _Set(value.split(','));
}
/**
*
*/
function readCommand() {
return new Command().option('-u, --username [username]', 'Salesforce username').option('-p, --password [password]', 'Salesforce password (and security token, if available)').option('-c, --connection [connection]', 'Connection name stored in connection registry').option('-l, --loginUrl [loginUrl]', 'Salesforce login url').option('-n, --schemaName [schemaName]', 'Name of schema type', 'MySchema').requiredOption('-o, --outputFile <outputFile>', 'Generated schema file path', './schema.d.ts').option('--sandbox', 'Login to Salesforce sandbox').option('--no-cache', 'Do not generate cache file for described result in tmp directory').option('--clearCache', 'Clear all existing described cache files').option('--filterObjects <filterObjects>', 'Only output schema for specified objects', commaSeparatedList).version(VERSION).parse(process.argv);
}
/**
*
*/
export default function main() {
return _main.apply(this, arguments);
}
function _main() {
_main = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
var program, cli, conn;
return _regeneratorRuntime.wrap(function _callee4$(_context15) {
while (1) switch (_context15.prev = _context15.next) {
case 0:
program = readCommand();
cli = new Cli();
_context15.next = 4;
return cli.connect(program);
case 4:
conn = cli.getCurrentConnection();
if (conn.userInfo) {
_context15.next = 8;
break;
}
console.error('Cannot connect to Salesforce');
return _context15.abrupt("return");
case 8:
_context15.next = 10;
return dumpSchema(conn, conn.userInfo.organizationId, program.outputFile, program.schemaName, program.cache, program.filterObjects);
case 10:
if (!program.clearCache) {
_context15.next = 14;
break;
}
console.log('removing cache files');
_context15.next = 14;
return fs.promises.rm(getCacheFileDir(), {
recursive: true
});
case 14:
console.log("Dumped to: ".concat(program.outputFile));
case 15:
case "end":
return _context15.stop();
}
}, _callee4);
}));
return _main.apply(this, arguments);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcyIsImZzIiwicGF0aCIsIkNsaSIsIlZFUlNJT04iLCJDb21tYW5kIiwiZ2V0Q2FjaGVGaWxlRGlyIiwiam9pbiIsInRtcGRpciIsImdldENhY2hlRmlsZVBhdGgiLCJvcmdJZCIsInJlYWREZXNjcmliZWRDYWNoZSIsIl94IiwiX3JlYWREZXNjcmliZWRDYWNoZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJjYWNoZUZpbGUiLCJkYXRhIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInByb21pc2VzIiwicmVhZEZpbGUiLCJzZW50IiwiYWJydXB0IiwiSlNPTiIsInBhcnNlIiwidDAiLCJzdG9wIiwibG9hZERlc2NyaWJlUmVzdWx0IiwiX3gyIiwiX3gzIiwiX3g0IiwiX2xvYWREZXNjcmliZVJlc3VsdCIsIl9jYWxsZWUyIiwiY29ubiIsImNhY2hlIiwiX3lpZWxkJGNvbm4kZGVzY3JpYmVHIiwic29zIiwic29iamVjdHMiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwibmFtZSIsInNvIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiY29uc29sZSIsImluZm8iLCJkZXNjcmliZUdsb2JhbCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJkZXNjcmliZSIsInB1c2giLCJlIiwiZiIsImZpbmlzaCIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIndyaXRlRmlsZSIsIl9KU09OJHN0cmluZ2lmeSIsImdldFBhcmVudFJlZmVyZW5jZXMiLCJzb2JqZWN0IiwicGFyZW50UmVmZXJlbmNlcyIsIl9pdGVyYXRvciIsImZpZWxkcyIsIl9zdGVwIiwiX3N0ZXAkdmFsdWUiLCJ0eXBlIiwibmlsbGFibGUiLCJyZWxhdGlvbnNoaXBOYW1lIiwicmVmZXJlbmNlVG8iLCJsZW5ndGgiLCJwYXJlbnRTT2JqZWN0IiwiZXJyIiwiZ2V0VFNUeXBlU3RyaW5nIiwiZHVtcFNjaGVtYSIsIl94NSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsIl94MTAiLCJfZHVtcFNjaGVtYSIsIl9jYWxsZWUzIiwib3V0cHV0RmlsZSIsInNjaGVtYU5hbWUiLCJmaWx0ZXJPYmplY3RzIiwib3V0IiwiX2NhbGxlZTMkIiwiX2NvbnRleHQxNCIsInQxIiwiZXhpc3RzU3luYyIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiX1Byb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib24iLCJ3cml0ZUxpbmUiLCJtZXNzYWdlIiwid3JpdGUiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiX2NvbnRleHQzIiwiX2NvbnRleHQ0IiwiX2NvbnRleHQ1IiwiX2NvbnRleHQ2IiwiX2NvbnRleHQ3IiwiaGFzIiwiY2hpbGRSZWxhdGlvbnNoaXBzIiwiY29uY2F0IiwiX2l0ZXJhdG9yNSIsIl9zdGVwNSIsIl9jb250ZXh0OCIsIl9jb250ZXh0OSIsIl9zdGVwNSR2YWx1ZSIsInRzVHlwZSIsIm9yTnVsbCIsIl9jb25jYXRJbnN0YW5jZVByb3BlcnR5IiwiY2FsbCIsIl9pdGVyYXRvcjYiLCJfc3RlcDYiLCJfY29udGV4dDEwIiwiX2NvbnRleHQxMSIsIl9zdGVwNiR2YWx1ZSIsIl9pdGVyYXRvcjciLCJfc3RlcDciLCJfc3RlcDckdmFsdWUiLCJmaWVsZCIsImNoaWxkU09iamVjdCIsIl9lbmRzV2l0aEluc3RhbmNlUHJvcGVydHkiLCJfY29udGV4dDEyIiwiX2l0ZXJhdG9yNCIsIl9zdGVwNCIsIl9jb250ZXh0MTMiLCJlbmQiLCJjb21tYVNlcGFyYXRlZExpc3QiLCJfZHVtbXlQcmV2aW91cyIsIl9TZXQiLCJzcGxpdCIsInJlYWRDb21tYW5kIiwib3B0aW9uIiwicmVxdWlyZWRPcHRpb24iLCJ2ZXJzaW9uIiwicHJvY2VzcyIsImFyZ3YiLCJtYWluIiwiX21haW4iLCJfY2FsbGVlNCIsInByb2dyYW0iLCJjbGkiLCJfY2FsbGVlNCQiLCJfY29udGV4dDE1IiwiY29ubmVjdCIsImdldEN1cnJlbnRDb25uZWN0aW9uIiwidXNlckluZm8iLCJlcnJvciIsIm9yZ2FuaXphdGlvbklkIiwiY2xlYXJDYWNoZSIsImxvZyIsInJtIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS9nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRGVzY3JpYmVTT2JqZWN0UmVzdWx0IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2xpIH0gZnJvbSAnLi4vY2xpL2NsaSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uLCBWRVJTSU9OIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBta2RpciB9IGZyb20gJ2ZzJztcblxudHlwZSBVbndyYXBQcm9taXNlPFQ+ID0gVCBleHRlbmRzIFByb21pc2U8aW5mZXIgVT4gPyBVIDogbmV2ZXI7XG5cbmZ1bmN0aW9uIGdldENhY2hlRmlsZURpcigpIHtcbiAgcmV0dXJuIHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2pzZm9yY2UtZ2VuLXNjaGVtYS1jYWNoZScpO1xufVxuXG5mdW5jdGlvbiBnZXRDYWNoZUZpbGVQYXRoKG9yZ0lkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHBhdGguam9pbihnZXRDYWNoZUZpbGVEaXIoKSwgb3JnSWQsICdkZXNjcmliZS5qc29uJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWREZXNjcmliZWRDYWNoZShcbiAgb3JnSWQ6IHN0cmluZyxcbik6IFByb21pc2U8VW53cmFwUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBsb2FkRGVzY3JpYmVSZXN1bHQ+PiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZUZpbGUgPSBnZXRDYWNoZUZpbGVQYXRoKG9yZ0lkKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlLCAndXRmOCcpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZERlc2NyaWJlUmVzdWx0KFxuICBjb25uOiBDb25uZWN0aW9uLFxuICBvcmdJZDogc3RyaW5nLFxuICBjYWNoZT86IGJvb2xlYW4sXG4pIHtcbiAgY29uc29sZS5pbmZvKCdkZXNjcmliaW5nIGdsb2JhbCcpO1xuICBjb25zdCB7IHNvYmplY3RzOiBzb3MgfSA9IGF3YWl0IGNvbm4uZGVzY3JpYmVHbG9iYWwoKTtcbiAgY29uc3Qgc29iamVjdHMgPSBbXTtcbiAgZm9yIChjb25zdCB7IG5hbWUgfSBvZiBzb3MpIHtcbiAgICBjb25zb2xlLmluZm8oJ2Rlc2NyaWJpbmcgJyArIG5hbWUpO1xuICAgIGNvbnN0IHNvID0gYXdhaXQgY29ubi5kZXNjcmliZShuYW1lKTtcbiAgICBzb2JqZWN0cy5wdXNoKHNvKTtcbiAgfVxuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBjYWNoZUZpbGUgPSBnZXRDYWNoZUZpbGVQYXRoKG9yZ0lkKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoY2FjaGVGaWxlKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgY2FjaGVGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc29iamVjdHMsIG51bGwsIDIpLFxuICAgICAgJ3V0ZjgnLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHNvYmplY3RzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRSZWZlcmVuY2VzKHNvYmplY3Q6IERlc2NyaWJlU09iamVjdFJlc3VsdCkge1xuICBjb25zdCBwYXJlbnRSZWZlcmVuY2VzID0gW107XG4gIGZvciAoY29uc3Qge1xuICAgIHR5cGUsXG4gICAgbmlsbGFibGUsXG4gICAgcmVsYXRpb25zaGlwTmFtZSxcbiAgICByZWZlcmVuY2VUbyxcbiAgfSBvZiBzb2JqZWN0LmZpZWxkcykge1xuICAgIGlmIChcbiAgICAgIHR5cGUgPT09ICdyZWZlcmVuY2UnICYmXG4gICAgICByZWxhdGlvbnNoaXBOYW1lICYmXG4gICAgICByZWZlcmVuY2VUbyAmJlxuICAgICAgcmVmZXJlbmNlVG8ubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgY29uc3QgcGFyZW50U09iamVjdCA9IHJlZmVyZW5jZVRvLmxlbmd0aCA+IDEgPyAnTmFtZScgOiByZWZlcmVuY2VUb1swXTtcbiAgICAgIHBhcmVudFJlZmVyZW5jZXMucHVzaCh7IG5pbGxhYmxlLCBwYXJlbnRTT2JqZWN0LCByZWxhdGlvbnNoaXBOYW1lIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyZW50UmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gZ2V0VFNUeXBlU3RyaW5nKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlID09PSAnZG91YmxlJyB8fFxuICAgIHR5cGUgPT09ICdpbnQnIHx8XG4gICAgdHlwZSA9PT0gJ2N1cnJlbmN5JyB8fFxuICAgIHR5cGUgPT09ICdwZXJjZW50J1xuICAgID8gJ251bWJlcidcbiAgICA6IHR5cGUgPT09ICdib29sZWFuJ1xuICAgID8gJ2Jvb2xlYW4nXG4gICAgOiB0eXBlID09PSAnZGF0ZScgfHwgdHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCB0eXBlID09PSAndGltZSdcbiAgICA/ICdEYXRlU3RyaW5nJ1xuICAgIDogdHlwZSA9PT0gJ2Jhc2U2NCdcbiAgICA/ICdCbG9iU3RyaW5nJ1xuICAgIDogdHlwZSA9PT0gJ2FkZHJlc3MnXG4gICAgPyAnQWRkcmVzcydcbiAgICA6IHR5cGUgPT09ICdjb21wbGV4dmFsdWUnXG4gICAgPyAnYW55J1xuICAgIDogJ3N0cmluZyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGR1bXBTY2hlbWEoXG4gIGNvbm46IENvbm5lY3Rpb24sXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIG91dHB1dEZpbGU6IHN0cmluZyxcbiAgc2NoZW1hTmFtZTogc3RyaW5nLFxuICBjYWNoZT86IGJvb2xlYW4sXG4gIGZpbHRlck9iamVjdHM/OiBTZXQ8c3RyaW5nPixcbikge1xuICBjb25zdCBzb2JqZWN0cyA9XG4gICAgKGNhY2hlID8gYXdhaXQgcmVhZERlc2NyaWJlZENhY2hlKG9yZ0lkKSA6IG51bGwpIHx8XG4gICAgKGF3YWl0IGxvYWREZXNjcmliZVJlc3VsdChjb25uLCBvcmdJZCwgY2FjaGUpKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dEZpbGUpKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKG91dHB1dEZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUob3V0cHV0RmlsZSwgJycsICd1dGY4Jyk7XG4gIH1cbiAgY29uc3Qgb3V0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0ob3V0cHV0RmlsZSwgJ3V0ZjgnKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBvdXQub24oJ2Vycm9yJywgKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgIG91dC5vbignZmluaXNoJywgcmVzb2x2ZSk7XG4gICAgY29uc3Qgd3JpdGVMaW5lID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gb3V0LndyaXRlKG1lc3NhZ2UgKyAnXFxuJyk7XG4gICAgd3JpdGVMaW5lKFxuICAgICAgXCJpbXBvcnQgeyBTY2hlbWEsIFNPYmplY3REZWZpbml0aW9uLCBEYXRlU3RyaW5nLCBCbG9iU3RyaW5nLCBBZGRyZXNzIH0gZnJvbSAnanNmb3JjZSc7XCIsXG4gICAgKTtcbiAgICB3cml0ZUxpbmUoJycpO1xuICAgIGZvciAoY29uc3Qgc29iamVjdCBvZiBzb2JqZWN0cykge1xuICAgICAgaWYgKGZpbHRlck9iamVjdHMgJiYgIWZpbHRlck9iamVjdHMuaGFzKHNvYmplY3QubmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IG5hbWUsIGZpZWxkcywgY2hpbGRSZWxhdGlvbnNoaXBzIH0gPSBzb2JqZWN0O1xuICAgICAgd3JpdGVMaW5lKGB0eXBlIEZpZWxkcyQke25hbWV9ID0ge2ApO1xuICAgICAgd3JpdGVMaW5lKCcgIC8vJyk7XG4gICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdHlwZSwgbmlsbGFibGUgfSBvZiBmaWVsZHMpIHtcbiAgICAgICAgY29uc3QgdHNUeXBlID0gZ2V0VFNUeXBlU3RyaW5nKHR5cGUpO1xuICAgICAgICBjb25zdCBvck51bGwgPSBuaWxsYWJsZSA/ICcgfCBudWxsJyA6ICcnO1xuICAgICAgICB3cml0ZUxpbmUoYCAgJHtuYW1lfTogJHt0c1R5cGV9JHtvck51bGx9O2ApO1xuICAgICAgfVxuICAgICAgd3JpdGVMaW5lKCd9OycpO1xuICAgICAgd3JpdGVMaW5lKCcnKTtcbiAgICAgIHdyaXRlTGluZShgdHlwZSBQYXJlbnRSZWZlcmVuY2VzJCR7bmFtZX0gPSB7YCk7XG4gICAgICB3cml0ZUxpbmUoJyAgLy8nKTtcbiAgICAgIGNvbnN0IHBhcmVudFJlZmVyZW5jZXMgPSBnZXRQYXJlbnRSZWZlcmVuY2VzKHNvYmplY3QpO1xuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIG5pbGxhYmxlLFxuICAgICAgICBwYXJlbnRTT2JqZWN0LFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgfSBvZiBwYXJlbnRSZWZlcmVuY2VzKSB7XG4gICAgICAgIGlmIChmaWx0ZXJPYmplY3RzICYmICFmaWx0ZXJPYmplY3RzLmhhcyhwYXJlbnRTT2JqZWN0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yTnVsbCA9IG5pbGxhYmxlID8gJyB8IG51bGwnIDogJyc7XG4gICAgICAgIHdyaXRlTGluZShcbiAgICAgICAgICBgICAke3JlbGF0aW9uc2hpcE5hbWV9OiBTT2JqZWN0RGVmaW5pdGlvbiQke3BhcmVudFNPYmplY3R9JHtvck51bGx9O2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB3cml0ZUxpbmUoJ307Jyk7XG4gICAgICB3cml0ZUxpbmUoJycpO1xuICAgICAgd3JpdGVMaW5lKGB0eXBlIENoaWxkUmVsYXRpb25zaGlwcyQke25hbWV9ID0ge2ApO1xuICAgICAgd3JpdGVMaW5lKCcgIC8vJyk7XG4gICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGNoaWxkU09iamVjdCxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZSxcbiAgICAgIH0gb2YgY2hpbGRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGlmIChmaWx0ZXJPYmplY3RzICYmICFmaWx0ZXJPYmplY3RzLmhhcyhjaGlsZFNPYmplY3QpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkICYmXG4gICAgICAgICAgY2hpbGRTT2JqZWN0ICYmXG4gICAgICAgICAgcmVsYXRpb25zaGlwTmFtZSAmJlxuICAgICAgICAgICFmaWVsZC5lbmRzV2l0aCgnX19jJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgd3JpdGVMaW5lKFxuICAgICAgICAgICAgYCAgJHtyZWxhdGlvbnNoaXBOYW1lfTogU09iamVjdERlZmluaXRpb24kJHtjaGlsZFNPYmplY3R9O2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd3JpdGVMaW5lKCd9OycpO1xuICAgICAgd3JpdGVMaW5lKCcnKTtcbiAgICAgIHdyaXRlTGluZShcbiAgICAgICAgYGludGVyZmFjZSBTT2JqZWN0RGVmaW5pdGlvbiQke25hbWV9IGV4dGVuZHMgU09iamVjdERlZmluaXRpb248JyR7bmFtZX0nPiB7XG4gICAgTmFtZTogJyR7bmFtZX0nO1xuICAgIEZpZWxkczogRmllbGRzJCR7bmFtZX07XG4gICAgUGFyZW50UmVmZXJlbmNlczogUGFyZW50UmVmZXJlbmNlcyQke25hbWV9O1xuICAgIENoaWxkUmVsYXRpb25zaGlwczogQ2hpbGRSZWxhdGlvbnNoaXBzJCR7bmFtZX07XG4gIH1gLFxuICAgICAgKTtcbiAgICAgIHdyaXRlTGluZSgnJyk7XG4gICAgfVxuICAgIHdyaXRlTGluZSgnJyk7XG4gICAgd3JpdGVMaW5lKGBleHBvcnQgaW50ZXJmYWNlICR7c2NoZW1hTmFtZX0gZXh0ZW5kcyBTY2hlbWEge2ApO1xuICAgIHdyaXRlTGluZSgnICBTT2JqZWN0czogeycpO1xuICAgIGZvciAoY29uc3QgeyBuYW1lIH0gb2Ygc29iamVjdHMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmplY3RzICYmICFmaWx0ZXJPYmplY3RzLmhhcyhuYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHdyaXRlTGluZShgICAgICR7bmFtZX06IFNPYmplY3REZWZpbml0aW9uJCR7bmFtZX07YCk7XG4gICAgfVxuICAgIHdyaXRlTGluZSgnICB9OycpO1xuICAgIHdyaXRlTGluZSgnfScpO1xuICAgIG91dC5lbmQoKTtcbiAgfSk7XG59XG5cbnR5cGUgR2VuZXJhdG9yQ29tbWFuZCA9IHtcbiAgY29ubmVjdGlvbj86IHN0cmluZztcbiAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gIHBhc3N3b3JkPzogc3RyaW5nO1xuICBsb2dpblVybD86IHN0cmluZztcbiAgc2FuZGJveD86IGJvb2xlYW47XG4gIG91dHB1dEZpbGU6IHN0cmluZztcbiAgY2FjaGU/OiBib29sZWFuO1xuICBjbGVhckNhY2hlPzogYm9vbGVhbjtcbiAgZmlsdGVyT2JqZWN0cz86IFNldDxzdHJpbmc+O1xufSAmIENvbW1hbmQ7XG5cbmZ1bmN0aW9uIGNvbW1hU2VwYXJhdGVkTGlzdCh2YWx1ZTogc3RyaW5nLCBfZHVtbXlQcmV2aW91czogdW5rbm93bikge1xuICByZXR1cm4gbmV3IFNldCh2YWx1ZS5zcGxpdCgnLCcpKTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiByZWFkQ29tbWFuZCgpOiBHZW5lcmF0b3JDb21tYW5kIHtcbiAgcmV0dXJuIG5ldyBDb21tYW5kKClcbiAgICAub3B0aW9uKCctdSwgLS11c2VybmFtZSBbdXNlcm5hbWVdJywgJ1NhbGVzZm9yY2UgdXNlcm5hbWUnKVxuICAgIC5vcHRpb24oXG4gICAgICAnLXAsIC0tcGFzc3dvcmQgW3Bhc3N3b3JkXScsXG4gICAgICAnU2FsZXNmb3JjZSBwYXNzd29yZCAoYW5kIHNlY3VyaXR5IHRva2VuLCBpZiBhdmFpbGFibGUpJyxcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICctYywgLS1jb25uZWN0aW9uIFtjb25uZWN0aW9uXScsXG4gICAgICAnQ29ubmVjdGlvbiBuYW1lIHN0b3JlZCBpbiBjb25uZWN0aW9uIHJlZ2lzdHJ5JyxcbiAgICApXG4gICAgLm9wdGlvbignLWwsIC0tbG9naW5VcmwgW2xvZ2luVXJsXScsICdTYWxlc2ZvcmNlIGxvZ2luIHVybCcpXG4gICAgLm9wdGlvbignLW4sIC0tc2NoZW1hTmFtZSBbc2NoZW1hTmFtZV0nLCAnTmFtZSBvZiBzY2hlbWEgdHlwZScsICdNeVNjaGVtYScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKFxuICAgICAgJy1vLCAtLW91dHB1dEZpbGUgPG91dHB1dEZpbGU+JyxcbiAgICAgICdHZW5lcmF0ZWQgc2NoZW1hIGZpbGUgcGF0aCcsXG4gICAgICAnLi9zY2hlbWEuZC50cycsXG4gICAgKVxuICAgIC5vcHRpb24oJy0tc2FuZGJveCcsICdMb2dpbiB0byBTYWxlc2ZvcmNlIHNhbmRib3gnKVxuICAgIC5vcHRpb24oXG4gICAgICAnLS1uby1jYWNoZScsXG4gICAgICAnRG8gbm90IGdlbmVyYXRlIGNhY2hlIGZpbGUgZm9yIGRlc2NyaWJlZCByZXN1bHQgaW4gdG1wIGRpcmVjdG9yeScsXG4gICAgKVxuICAgIC5vcHRpb24oJy0tY2xlYXJDYWNoZScsICdDbGVhciBhbGwgZXhpc3RpbmcgZGVzY3JpYmVkIGNhY2hlIGZpbGVzJylcbiAgICAub3B0aW9uKFxuICAgICAgJy0tZmlsdGVyT2JqZWN0cyA8ZmlsdGVyT2JqZWN0cz4nLFxuICAgICAgJ09ubHkgb3V0cHV0IHNjaGVtYSBmb3Igc3BlY2lmaWVkIG9iamVjdHMnLFxuICAgICAgY29tbWFTZXBhcmF0ZWRMaXN0LFxuICAgIClcbiAgICAudmVyc2lvbihWRVJTSU9OKVxuICAgIC5wYXJzZShwcm9jZXNzLmFyZ3YpIGFzIEdlbmVyYXRvckNvbW1hbmQ7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHJlYWRDb21tYW5kKCk7XG4gIGNvbnN0IGNsaSA9IG5ldyBDbGkoKTtcbiAgYXdhaXQgY2xpLmNvbm5lY3QocHJvZ3JhbSk7XG4gIGNvbnN0IGNvbm4gPSBjbGkuZ2V0Q3VycmVudENvbm5lY3Rpb24oKTtcbiAgaWYgKCFjb25uLnVzZXJJbmZvKSB7XG4gICAgY29uc29sZS5lcnJvcignQ2Fubm90IGNvbm5lY3QgdG8gU2FsZXNmb3JjZScpO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBkdW1wU2NoZW1hKFxuICAgIGNvbm4sXG4gICAgY29ubi51c2VySW5mby5vcmdhbml6YXRpb25JZCxcbiAgICBwcm9ncmFtLm91dHB1dEZpbGUsXG4gICAgcHJvZ3JhbS5zY2hlbWFOYW1lLFxuICAgIHByb2dyYW0uY2FjaGUsXG4gICAgcHJvZ3JhbS5maWx0ZXJPYmplY3RzLFxuICApO1xuICBpZiAocHJvZ3JhbS5jbGVhckNhY2hlKSB7XG4gICAgY29uc29sZS5sb2coJ3JlbW92aW5nIGNhY2hlIGZpbGVzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZ2V0Q2FjaGVGaWxlRGlyKCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG4gIGNvbnNvbGUubG9nKGBEdW1wZWQgdG86ICR7cHJvZ3JhbS5v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