jsforce
Version:
Salesforce API Library for JavaScript
383 lines (382 loc) • 45.1 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 _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";
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
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) {
return _dumpSchema.apply(this, arguments);
}
function _dumpSchema() {
_dumpSchema = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(conn, orgId, outputFile, schemaName, cache) {
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;
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;
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 (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;
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 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').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);
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcyIsImZzIiwicGF0aCIsIkNsaSIsIlZFUlNJT04iLCJDb21tYW5kIiwiZ2V0Q2FjaGVGaWxlRGlyIiwiam9pbiIsInRtcGRpciIsImdldENhY2hlRmlsZVBhdGgiLCJvcmdJZCIsInJlYWREZXNjcmliZWRDYWNoZSIsIl94IiwiX3JlYWREZXNjcmliZWRDYWNoZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJjYWNoZUZpbGUiLCJkYXRhIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInByb21pc2VzIiwicmVhZEZpbGUiLCJzZW50IiwiYWJydXB0IiwiSlNPTiIsInBhcnNlIiwidDAiLCJzdG9wIiwibG9hZERlc2NyaWJlUmVzdWx0IiwiX3gyIiwiX3gzIiwiX3g0IiwiX2xvYWREZXNjcmliZVJlc3VsdCIsIl9jYWxsZWUyIiwiY29ubiIsImNhY2hlIiwiX3lpZWxkJGNvbm4kZGVzY3JpYmVHIiwic29zIiwic29iamVjdHMiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwibmFtZSIsInNvIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiY29uc29sZSIsImluZm8iLCJkZXNjcmliZUdsb2JhbCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJkZXNjcmliZSIsInB1c2giLCJlIiwiZiIsImZpbmlzaCIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIndyaXRlRmlsZSIsIl9KU09OJHN0cmluZ2lmeSIsImdldFBhcmVudFJlZmVyZW5jZXMiLCJzb2JqZWN0IiwicGFyZW50UmVmZXJlbmNlcyIsIl9pdGVyYXRvciIsImZpZWxkcyIsIl9zdGVwIiwiX3N0ZXAkdmFsdWUiLCJ0eXBlIiwibmlsbGFibGUiLCJyZWxhdGlvbnNoaXBOYW1lIiwicmVmZXJlbmNlVG8iLCJsZW5ndGgiLCJwYXJlbnRTT2JqZWN0IiwiZXJyIiwiZ2V0VFNUeXBlU3RyaW5nIiwiZHVtcFNjaGVtYSIsIl94NSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsIl9kdW1wU2NoZW1hIiwiX2NhbGxlZTMiLCJvdXRwdXRGaWxlIiwic2NoZW1hTmFtZSIsIm91dCIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MTQiLCJ0MSIsImV4aXN0c1N5bmMiLCJjcmVhdGVXcml0ZVN0cmVhbSIsIl9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwid3JpdGVMaW5lIiwibWVzc2FnZSIsIndyaXRlIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIl9jb250ZXh0MyIsIl9jb250ZXh0NCIsIl9jb250ZXh0NSIsIl9jb250ZXh0NiIsIl9jb250ZXh0NyIsImNoaWxkUmVsYXRpb25zaGlwcyIsImNvbmNhdCIsIl9pdGVyYXRvcjUiLCJfc3RlcDUiLCJfY29udGV4dDgiLCJfY29udGV4dDkiLCJfc3RlcDUkdmFsdWUiLCJ0c1R5cGUiLCJvck51bGwiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNhbGwiLCJfaXRlcmF0b3I2IiwiX3N0ZXA2IiwiX2NvbnRleHQxMCIsIl9jb250ZXh0MTEiLCJfc3RlcDYkdmFsdWUiLCJfaXRlcmF0b3I3IiwiX3N0ZXA3IiwiX3N0ZXA3JHZhbHVlIiwiZmllbGQiLCJjaGlsZFNPYmplY3QiLCJfZW5kc1dpdGhJbnN0YW5jZVByb3BlcnR5IiwiX2NvbnRleHQxMiIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJfY29udGV4dDEzIiwiZW5kIiwicmVhZENvbW1hbmQiLCJvcHRpb24iLCJyZXF1aXJlZE9wdGlvbiIsInZlcnNpb24iLCJwcm9jZXNzIiwiYXJndiIsIm1haW4iLCJfbWFpbiIsIl9jYWxsZWU0IiwicHJvZ3JhbSIsImNsaSIsIl9jYWxsZWU0JCIsIl9jb250ZXh0MTUiLCJjb25uZWN0IiwiZ2V0Q3VycmVudENvbm5lY3Rpb24iLCJ1c2VySW5mbyIsImVycm9yIiwib3JnYW5pemF0aW9uSWQiLCJjbGVhckNhY2hlIiwibG9nIiwicm0iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hL2dlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEZXNjcmliZVNPYmplY3RSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDbGkgfSBmcm9tICcuLi9jbGkvY2xpJztcbmltcG9ydCB7IENvbm5lY3Rpb24sIFZFUlNJT04gfSBmcm9tICcuLic7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IG1rZGlyIH0gZnJvbSAnZnMnO1xuXG50eXBlIFVud3JhcFByb21pc2U8VD4gPSBUIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBVPiA/IFUgOiBuZXZlcjtcblxuZnVuY3Rpb24gZ2V0Q2FjaGVGaWxlRGlyKCkge1xuICByZXR1cm4gcGF0aC5qb2luKG9zLnRtcGRpcigpLCAnanNmb3JjZS1nZW4tc2NoZW1hLWNhY2hlJyk7XG59XG5cbmZ1bmN0aW9uIGdldENhY2hlRmlsZVBhdGgob3JnSWQ6IHN0cmluZykge1xuICByZXR1cm4gcGF0aC5qb2luKGdldENhY2hlRmlsZURpcigpLCBvcmdJZCwgJ2Rlc2NyaWJlLmpzb24nKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZERlc2NyaWJlZENhY2hlKFxuICBvcmdJZDogc3RyaW5nLFxuKTogUHJvbWlzZTxVbndyYXBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIGxvYWREZXNjcmliZVJlc3VsdD4+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlRmlsZSA9IGdldENhY2hlRmlsZVBhdGgob3JnSWQpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGUsICd1dGY4Jyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkRGVzY3JpYmVSZXN1bHQoXG4gIGNvbm46IENvbm5lY3Rpb24sXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIGNhY2hlPzogYm9vbGVhbixcbikge1xuICBjb25zb2xlLmluZm8oJ2Rlc2NyaWJpbmcgZ2xvYmFsJyk7XG4gIGNvbnN0IHsgc29iamVjdHM6IHNvcyB9ID0gYXdhaXQgY29ubi5kZXNjcmliZUdsb2JhbCgpO1xuICBjb25zdCBzb2JqZWN0cyA9IFtdO1xuICBmb3IgKGNvbnN0IHsgbmFtZSB9IG9mIHNvcykge1xuICAgIGNvbnNvbGUuaW5mbygnZGVzY3JpYmluZyAnICsgbmFtZSk7XG4gICAgY29uc3Qgc28gPSBhd2FpdCBjb25uLmRlc2NyaWJlKG5hbWUpO1xuICAgIHNvYmplY3RzLnB1c2goc28pO1xuICB9XG4gIGlmIChjYWNoZSkge1xuICAgIGNvbnN0IGNhY2hlRmlsZSA9IGdldENhY2hlRmlsZVBhdGgob3JnSWQpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShjYWNoZUZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBjYWNoZUZpbGUsXG4gICAgICBKU09OLnN0cmluZ2lmeShzb2JqZWN0cywgbnVsbCwgMiksXG4gICAgICAndXRmOCcsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gc29iamVjdHM7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudFJlZmVyZW5jZXMoc29iamVjdDogRGVzY3JpYmVTT2JqZWN0UmVzdWx0KSB7XG4gIGNvbnN0IHBhcmVudFJlZmVyZW5jZXMgPSBbXTtcbiAgZm9yIChjb25zdCB7XG4gICAgdHlwZSxcbiAgICBuaWxsYWJsZSxcbiAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgIHJlZmVyZW5jZVRvLFxuICB9IG9mIHNvYmplY3QuZmllbGRzKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZSA9PT0gJ3JlZmVyZW5jZScgJiZcbiAgICAgIHJlbGF0aW9uc2hpcE5hbWUgJiZcbiAgICAgIHJlZmVyZW5jZVRvICYmXG4gICAgICByZWZlcmVuY2VUby5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBwYXJlbnRTT2JqZWN0ID0gcmVmZXJlbmNlVG8ubGVuZ3RoID4gMSA/ICdOYW1lJyA6IHJlZmVyZW5jZVRvWzBdO1xuICAgICAgcGFyZW50UmVmZXJlbmNlcy5wdXNoKHsgbmlsbGFibGUsIHBhcmVudFNPYmplY3QsIHJlbGF0aW9uc2hpcE5hbWUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJlbnRSZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBnZXRUU1R5cGVTdHJpbmcodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGUgPT09ICdkb3VibGUnIHx8XG4gICAgdHlwZSA9PT0gJ2ludCcgfHxcbiAgICB0eXBlID09PSAnY3VycmVuY3knIHx8XG4gICAgdHlwZSA9PT0gJ3BlcmNlbnQnXG4gICAgPyAnbnVtYmVyJ1xuICAgIDogdHlwZSA9PT0gJ2Jvb2xlYW4nXG4gICAgPyAnYm9vbGVhbidcbiAgICA6IHR5cGUgPT09ICdkYXRlJyB8fCB0eXBlID09PSAnZGF0ZXRpbWUnIHx8IHR5cGUgPT09ICd0aW1lJ1xuICAgID8gJ0RhdGVTdHJpbmcnXG4gICAgOiB0eXBlID09PSAnYmFzZTY0J1xuICAgID8gJ0Jsb2JTdHJpbmcnXG4gICAgOiB0eXBlID09PSAnYWRkcmVzcydcbiAgICA/ICdBZGRyZXNzJ1xuICAgIDogdHlwZSA9PT0gJ2NvbXBsZXh2YWx1ZSdcbiAgICA/ICdhbnknXG4gICAgOiAnc3RyaW5nJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZHVtcFNjaGVtYShcbiAgY29ubjogQ29ubmVjdGlvbixcbiAgb3JnSWQ6IHN0cmluZyxcbiAgb3V0cHV0RmlsZTogc3RyaW5nLFxuICBzY2hlbWFOYW1lOiBzdHJpbmcsXG4gIGNhY2hlPzogYm9vbGVhbixcbikge1xuICBjb25zdCBzb2JqZWN0cyA9XG4gICAgKGNhY2hlID8gYXdhaXQgcmVhZERlc2NyaWJlZENhY2hlKG9yZ0lkKSA6IG51bGwpIHx8XG4gICAgKGF3YWl0IGxvYWREZXNjcmliZVJlc3VsdChjb25uLCBvcmdJZCwgY2FjaGUpKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dEZpbGUpKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKG91dHB1dEZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUob3V0cHV0RmlsZSwgJycsICd1dGY4Jyk7XG4gIH1cbiAgY29uc3Qgb3V0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0ob3V0cHV0RmlsZSwgJ3V0ZjgnKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBvdXQub24oJ2Vycm9yJywgKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgIG91dC5vbignZmluaXNoJywgcmVzb2x2ZSk7XG4gICAgY29uc3Qgd3JpdGVMaW5lID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gb3V0LndyaXRlKG1lc3NhZ2UgKyAnXFxuJyk7XG4gICAgd3JpdGVMaW5lKFxuICAgICAgXCJpbXBvcnQgeyBTY2hlbWEsIFNPYmplY3REZWZpbml0aW9uLCBEYXRlU3RyaW5nLCBCbG9iU3RyaW5nLCBBZGRyZXNzIH0gZnJvbSAnanNmb3JjZSc7XCIsXG4gICAgKTtcbiAgICB3cml0ZUxpbmUoJycpO1xuICAgIGZvciAoY29uc3Qgc29iamVjdCBvZiBzb2JqZWN0cykge1xuICAgICAgY29uc3QgeyBuYW1lLCBmaWVsZHMsIGNoaWxkUmVsYXRpb25zaGlwcyB9ID0gc29iamVjdDtcbiAgICAgIHdyaXRlTGluZShgdHlwZSBGaWVsZHMkJHtuYW1lfSA9IHtgKTtcbiAgICAgIHdyaXRlTGluZSgnICAvLycpO1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHR5cGUsIG5pbGxhYmxlIH0gb2YgZmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHRzVHlwZSA9IGdldFRTVHlwZVN0cmluZyh0eXBlKTtcbiAgICAgICAgY29uc3Qgb3JOdWxsID0gbmlsbGFibGUgPyAnIHwgbnVsbCcgOiAnJztcbiAgICAgICAgd3JpdGVMaW5lKGAgICR7bmFtZX06ICR7dHNUeXBlfSR7b3JOdWxsfTtgKTtcbiAgICAgIH1cbiAgICAgIHdyaXRlTGluZSgnfTsnKTtcbiAgICAgIHdyaXRlTGluZSgnJyk7XG4gICAgICB3cml0ZUxpbmUoYHR5cGUgUGFyZW50UmVmZXJlbmNlcyQke25hbWV9ID0ge2ApO1xuICAgICAgd3JpdGVMaW5lKCcgIC8vJyk7XG4gICAgICBjb25zdCBwYXJlbnRSZWZlcmVuY2VzID0gZ2V0UGFyZW50UmVmZXJlbmNlcyhzb2JqZWN0KTtcbiAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICBuaWxsYWJsZSxcbiAgICAgICAgcGFyZW50U09iamVjdCxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZSxcbiAgICAgIH0gb2YgcGFyZW50UmVmZXJlbmNlcykge1xuICAgICAgICBjb25zdCBvck51bGwgPSBuaWxsYWJsZSA/ICcgfCBudWxsJyA6ICcnO1xuICAgICAgICB3cml0ZUxpbmUoXG4gICAgICAgICAgYCAgJHtyZWxhdGlvbnNoaXBOYW1lfTogU09iamVjdERlZmluaXRpb24kJHtwYXJlbnRTT2JqZWN0fSR7b3JOdWxsfTtgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgd3JpdGVMaW5lKCd9OycpO1xuICAgICAgd3JpdGVMaW5lKCcnKTtcbiAgICAgIHdyaXRlTGluZShgdHlwZSBDaGlsZFJlbGF0aW9uc2hpcHMkJHtuYW1lfSA9IHtgKTtcbiAgICAgIHdyaXRlTGluZSgnICAvLycpO1xuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBjaGlsZFNPYmplY3QsXG4gICAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICB9IG9mIGNoaWxkUmVsYXRpb25zaGlwcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmllbGQgJiZcbiAgICAgICAgICBjaGlsZFNPYmplY3QgJiZcbiAgICAgICAgICByZWxhdGlvbnNoaXBOYW1lICYmXG4gICAgICAgICAgIWZpZWxkLmVuZHNXaXRoKCdfX2MnKVxuICAgICAgICApIHtcbiAgICAgICAgICB3cml0ZUxpbmUoXG4gICAgICAgICAgICBgICAke3JlbGF0aW9uc2hpcE5hbWV9OiBTT2JqZWN0RGVmaW5pdGlvbiQke2NoaWxkU09iamVjdH07YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3cml0ZUxpbmUoJ307Jyk7XG4gICAgICB3cml0ZUxpbmUoJycpO1xuICAgICAgd3JpdGVMaW5lKFxuICAgICAgICBgaW50ZXJmYWNlIFNPYmplY3REZWZpbml0aW9uJCR7bmFtZX0gZXh0ZW5kcyBTT2JqZWN0RGVmaW5pdGlvbjwnJHtuYW1lfSc+IHtcbiAgICBOYW1lOiAnJHtuYW1lfSc7XG4gICAgRmllbGRzOiBGaWVsZHMkJHtuYW1lfTtcbiAgICBQYXJlbnRSZWZlcmVuY2VzOiBQYXJlbnRSZWZlcmVuY2VzJCR7bmFtZX07XG4gICAgQ2hpbGRSZWxhdGlvbnNoaXBzOiBDaGlsZFJlbGF0aW9uc2hpcHMkJHtuYW1lfTtcbiAgfWAsXG4gICAgICApO1xuICAgICAgd3JpdGVMaW5lKCcnKTtcbiAgICB9XG4gICAgd3JpdGVMaW5lKCcnKTtcbiAgICB3cml0ZUxpbmUoYGV4cG9ydCBpbnRlcmZhY2UgJHtzY2hlbWFOYW1lfSBleHRlbmRzIFNjaGVtYSB7YCk7XG4gICAgd3JpdGVMaW5lKCcgIFNPYmplY3RzOiB7Jyk7XG4gICAgZm9yIChjb25zdCB7IG5hbWUgfSBvZiBzb2JqZWN0cykge1xuICAgICAgd3JpdGVMaW5lKGAgICAgJHtuYW1lfTogU09iamVjdERlZmluaXRpb24kJHtuYW1lfTtgKTtcbiAgICB9XG4gICAgd3JpdGVMaW5lKCcgIH07Jyk7XG4gICAgd3JpdGVMaW5lKCd9Jyk7XG4gICAgb3V0LmVuZCgpO1xuICB9KTtcbn1cblxudHlwZSBHZW5lcmF0b3JDb21tYW5kID0ge1xuICBjb25uZWN0aW9uPzogc3RyaW5nO1xuICB1c2VybmFtZT86IHN0cmluZztcbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIGxvZ2luVXJsPzogc3RyaW5nO1xuICBzYW5kYm94PzogYm9vbGVhbjtcbiAgb3V0cHV0RmlsZTogc3RyaW5nO1xuICBjYWNoZT86IGJvb2xlYW47XG4gIGNsZWFyQ2FjaGU/OiBib29sZWFuO1xufSAmIENvbW1hbmQ7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gcmVhZENvbW1hbmQoKTogR2VuZXJhdG9yQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgpXG4gICAgLm9wdGlvbignLXUsIC0tdXNlcm5hbWUgW3VzZXJuYW1lXScsICdTYWxlc2ZvcmNlIHVzZXJuYW1lJylcbiAgICAub3B0aW9uKFxuICAgICAgJy1wLCAtLXBhc3N3b3JkIFtwYXNzd29yZF0nLFxuICAgICAgJ1NhbGVzZm9yY2UgcGFzc3dvcmQgKGFuZCBzZWN1cml0eSB0b2tlbiwgaWYgYXZhaWxhYmxlKScsXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAnLWMsIC0tY29ubmVjdGlvbiBbY29ubmVjdGlvbl0nLFxuICAgICAgJ0Nvbm5lY3Rpb24gbmFtZSBzdG9yZWQgaW4gY29ubmVjdGlvbiByZWdpc3RyeScsXG4gICAgKVxuICAgIC5vcHRpb24oJy1sLCAtLWxvZ2luVXJsIFtsb2dpblVybF0nLCAnU2FsZXNmb3JjZSBsb2dpbiB1cmwnKVxuICAgIC5vcHRpb24oJy1uLCAtLXNjaGVtYU5hbWUgW3NjaGVtYU5hbWVdJywgJ05hbWUgb2Ygc2NoZW1hIHR5cGUnLCAnTXlTY2hlbWEnKVxuICAgIC5yZXF1aXJlZE9wdGlvbihcbiAgICAgICctbywgLS1vdXRwdXRGaWxlIDxvdXRwdXRGaWxlPicsXG4gICAgICAnR2VuZXJhdGVkIHNjaGVtYSBmaWxlIHBhdGgnLFxuICAgICAgJy4vc2NoZW1hLmQudHMnLFxuICAgIClcbiAgICAub3B0aW9uKCctLXNhbmRib3gnLCAnTG9naW4gdG8gU2FsZXNmb3JjZSBzYW5kYm94JylcbiAgICAub3B0aW9uKFxuICAgICAgJy0tbm8tY2FjaGUnLFxuICAgICAgJ0RvIG5vdCBnZW5lcmF0ZSBjYWNoZSBmaWxlIGZvciBkZXNjcmliZWQgcmVzdWx0IGluIHRtcCBkaXJlY3RvcnknLFxuICAgIClcbiAgICAub3B0aW9uKCctLWNsZWFyQ2FjaGUnLCAnQ2xlYXIgYWxsIGV4aXN0aW5nIGRlc2NyaWJlZCBjYWNoZSBmaWxlcycpXG4gICAgLnZlcnNpb24oVkVSU0lPTilcbiAgICAucGFyc2UocHJvY2Vzcy5hcmd2KSBhcyBHZW5lcmF0b3JDb21tYW5kO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IHByb2dyYW0gPSByZWFkQ29tbWFuZCgpO1xuICBjb25zdCBjbGkgPSBuZXcgQ2xpKCk7XG4gIGF3YWl0IGNsaS5jb25uZWN0KHByb2dyYW0pO1xuICBjb25zdCBjb25uID0gY2xpLmdldEN1cnJlbnRDb25uZWN0aW9uKCk7XG4gIGlmICghY29ubi51c2VySW5mbykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHRvIFNhbGVzZm9yY2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgZHVtcFNjaGVtYShcbiAgICBjb25uLFxuICAgIGNvbm4udXNlckluZm8ub3JnYW5pemF0aW9uSWQsXG4gICAgcHJvZ3JhbS5vdXRwdXRGaWxlLFxuICAgIHByb2dyYW0uc2NoZW1hTmFtZSxcbiAgICBwcm9ncmFtLmNhY2hlLFxuICApO1xuICBpZiAocHJvZ3JhbS5jbGVhckNhY2hlKSB7XG4gICAgY29uc29sZS5sb2coJ3JlbW92aW5nIGNhY2hlIGZpbGVzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZ2V0Q2FjaGVGaWxlRGlyKCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG4gIGNvbnNvbGUubG9nKGBEdW1wZWQgdG86ICR7cHJvZ3JhbS5vdXRwdXRGaWxlfWApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU9BLEVBQUUsTUFBTSxJQUFJO0FBQ25CLE9BQU9DLEVBQUUsTUFBTSxTQUFTO0FBQ3hCLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBRXZCLFNBQVNDLEdBQUcsUUFBUSxZQUFZO0FBQ2hDLFNBQXFCQyxPQUFPLFFBQVEsSUFBSTtBQUN4QyxTQUFTQyxPQUFPLFFBQVEsV0FBVztBQUtuQyxTQUFTQyxlQUFlQSxDQUFBLEVBQUc7RUFDekIsT0FBT0osSUFBSSxDQUFDSyxJQUFJLENBQUNQLEVBQUUsQ0FBQ1EsTUFBTSxDQUFDLENBQUMsRUFBRSwwQkFBMEIsQ0FBQztBQUMzRDtBQUVBLFNBQVNDLGdCQUFnQkEsQ0FBQ0MsS0FBYSxFQUFFO0VBQ3ZDLE9BQU9SLElBQUksQ0FBQ0ssSUFBSSxDQUFDRCxlQUFlLENBQUMsQ0FBQyxFQUFFSSxLQUFLLEVBQUUsZUFBZSxDQUFDO0FBQzdEO0FBQUMsU0FFY0Msa0JBQWtCQSxDQUFBQyxFQUFBO0VBQUEsT0FBQUMsbUJBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0FBQUE7QUFBQSxTQUFBRixvQkFBQTtFQUFBQSxtQkFBQSxHQUFBRyxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQWpDLFNBQUFDLFFBQ0VULEtBQWE7SUFBQSxJQUFBVSxTQUFBLEVBQUFDLElBQUE7SUFBQSxPQUFBSixtQkFBQSxDQUFBSyxJQUFBLFVBQUFDLFNBQUFDLFFBQUE7TUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsSUFBQTtVQUdMTCxTQUFTLEdBQUdYLGdCQUFnQixDQUFDQyxLQUFLLENBQUM7VUFBQWMs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