jsforce2 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +74 -0
  3. package/bin/jsforce +3 -0
  4. package/bower.json +30 -0
  5. package/build/jsforce-api-analytics.js +393 -0
  6. package/build/jsforce-api-analytics.min.js +2 -0
  7. package/build/jsforce-api-analytics.min.js.map +1 -0
  8. package/build/jsforce-api-apex.js +183 -0
  9. package/build/jsforce-api-apex.min.js +2 -0
  10. package/build/jsforce-api-apex.min.js.map +1 -0
  11. package/build/jsforce-api-bulk.js +1054 -0
  12. package/build/jsforce-api-bulk.min.js +2 -0
  13. package/build/jsforce-api-bulk.min.js.map +1 -0
  14. package/build/jsforce-api-chatter.js +320 -0
  15. package/build/jsforce-api-chatter.min.js +2 -0
  16. package/build/jsforce-api-chatter.min.js.map +1 -0
  17. package/build/jsforce-api-metadata.js +3020 -0
  18. package/build/jsforce-api-metadata.min.js +2 -0
  19. package/build/jsforce-api-metadata.min.js.map +1 -0
  20. package/build/jsforce-api-soap.js +403 -0
  21. package/build/jsforce-api-soap.min.js +2 -0
  22. package/build/jsforce-api-soap.min.js.map +1 -0
  23. package/build/jsforce-api-streaming.js +3479 -0
  24. package/build/jsforce-api-streaming.min.js +2 -0
  25. package/build/jsforce-api-streaming.min.js.map +1 -0
  26. package/build/jsforce-api-tooling.js +319 -0
  27. package/build/jsforce-api-tooling.min.js +2 -0
  28. package/build/jsforce-api-tooling.min.js.map +1 -0
  29. package/build/jsforce-core.js +25250 -0
  30. package/build/jsforce-core.min.js +2 -0
  31. package/build/jsforce-core.min.js.map +1 -0
  32. package/build/jsforce.js +31637 -0
  33. package/build/jsforce.min.js +2 -0
  34. package/build/jsforce.min.js.map +1 -0
  35. package/core.js +1 -0
  36. package/index.js +1 -0
  37. package/lib/VERSION.js +2 -0
  38. package/lib/_required.js +29 -0
  39. package/lib/api/analytics.js +387 -0
  40. package/lib/api/apex.js +177 -0
  41. package/lib/api/bulk.js +862 -0
  42. package/lib/api/chatter.js +314 -0
  43. package/lib/api/index.js +8 -0
  44. package/lib/api/metadata.js +848 -0
  45. package/lib/api/soap.js +397 -0
  46. package/lib/api/streaming-extension.js +136 -0
  47. package/lib/api/streaming.js +270 -0
  48. package/lib/api/tooling.js +313 -0
  49. package/lib/browser/canvas.js +90 -0
  50. package/lib/browser/client.js +241 -0
  51. package/lib/browser/core.js +5 -0
  52. package/lib/browser/jsforce.js +6 -0
  53. package/lib/browser/jsonp.js +52 -0
  54. package/lib/browser/request.js +70 -0
  55. package/lib/cache.js +252 -0
  56. package/lib/cli/cli.js +431 -0
  57. package/lib/cli/repl.js +337 -0
  58. package/lib/connection.js +1881 -0
  59. package/lib/core.js +16 -0
  60. package/lib/csv.js +50 -0
  61. package/lib/date.js +163 -0
  62. package/lib/http-api.js +300 -0
  63. package/lib/jsforce.js +10 -0
  64. package/lib/logger.js +52 -0
  65. package/lib/oauth2.js +206 -0
  66. package/lib/process.js +275 -0
  67. package/lib/promise.js +164 -0
  68. package/lib/query.js +881 -0
  69. package/lib/quick-action.js +90 -0
  70. package/lib/record-stream.js +305 -0
  71. package/lib/record.js +107 -0
  72. package/lib/registry/file-registry.js +48 -0
  73. package/lib/registry/index.js +3 -0
  74. package/lib/registry/registry.js +111 -0
  75. package/lib/require.js +14 -0
  76. package/lib/soap.js +207 -0
  77. package/lib/sobject.js +558 -0
  78. package/lib/soql-builder.js +236 -0
  79. package/lib/transport.js +233 -0
  80. package/package.json +110 -0
@@ -0,0 +1,319 @@
1
+ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Tooling = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
+ /**
3
+ * @file Manages Tooling APIs
4
+ * @author Shinichi Tomita <shinichi.tomita@gmail.com>
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ var jsforce = window.jsforce.require('./core'),
10
+ _ = window.jsforce.require('lodash/core'),
11
+ Cache = window.jsforce.require('./cache');
12
+
13
+ /**
14
+ * API class for Tooling API call
15
+ *
16
+ * @class
17
+ * @param {Connection} conn - Connection
18
+ */
19
+ var Tooling = function(conn) {
20
+ this._conn = conn;
21
+ this._logger = conn._logger;
22
+ var delegates = [
23
+ "query",
24
+ "queryMore",
25
+ "_toRecordResult",
26
+ "create",
27
+ "_createSingle",
28
+ "_createParallel",
29
+ "_createMany",
30
+ "insert",
31
+ "retrieve",
32
+ "_retrieveSingle",
33
+ "_retrieveParallel",
34
+ "_retrieveMany",
35
+ "update",
36
+ "_updateSingle",
37
+ "_updateParallel",
38
+ "_updateMany",
39
+ "upsert",
40
+ "del",
41
+ "delete",
42
+ "destroy",
43
+ "_destroySingle",
44
+ "_destroyParallel",
45
+ "_destroyMany",
46
+ "describe",
47
+ "describeGlobal",
48
+ "sobject"
49
+ ];
50
+ delegates.forEach(function(method) {
51
+ this[method] = conn.constructor.prototype[method];
52
+ }, this);
53
+
54
+ this.cache = new Cache();
55
+
56
+ var cacheOptions = {
57
+ key: function(type) { return type ? "describe." + type : "describe"; }
58
+ };
59
+ this.describe$ = this.cache.makeCacheable(this.describe, this, cacheOptions);
60
+ this.describe = this.cache.makeResponseCacheable(this.describe, this, cacheOptions);
61
+ this.describeSObject$ = this.describe$;
62
+ this.describeSObject = this.describe;
63
+
64
+ cacheOptions = { key: 'describeGlobal' };
65
+ this.describeGlobal$ = this.cache.makeCacheable(this.describeGlobal, this, cacheOptions);
66
+ this.describeGlobal = this.cache.makeResponseCacheable(this.describeGlobal, this, cacheOptions);
67
+
68
+ this.initialize();
69
+ };
70
+
71
+ /**
72
+ * Initialize tooling API
73
+ * @protected
74
+ */
75
+ Tooling.prototype.initialize = function() {
76
+ this.sobjects = {};
77
+ this.cache.clear();
78
+ this.cache.get('describeGlobal').removeAllListeners('value');
79
+ this.cache.get('describeGlobal').on('value', _.bind(function(res) {
80
+ if (res.result) {
81
+ var types = _.map(res.result.sobjects, function(so) { return so.name; });
82
+ types.forEach(this.sobject, this);
83
+ }
84
+ }, this));
85
+ };
86
+
87
+ /**
88
+ * @private
89
+ */
90
+ Tooling.prototype._baseUrl = function() {
91
+ return this._conn._baseUrl() + "/tooling";
92
+ };
93
+
94
+ /**
95
+ * @private
96
+ */
97
+ Tooling.prototype._supports = function(feature) {
98
+ // should return false in order not to use compsite collection
99
+ if (feature === 'sobject-collection') {
100
+ return false;
101
+ }
102
+ return this._conn._supports.apply(this._conn, arguments);
103
+ };
104
+
105
+ /**
106
+ * @private
107
+ */
108
+ Tooling.prototype.request = function() {
109
+ return this._conn.request.apply(this._conn, arguments);
110
+ };
111
+
112
+ /**
113
+ * Execute query by using SOQL
114
+ *
115
+ * @param {String} soql - SOQL string
116
+ * @param {Callback.<QueryResult>} [callback] - Callback function
117
+ * @returns {Query.<QueryResult>}
118
+ */
119
+ /**
120
+ * Query next record set by using query locator
121
+ *
122
+ * @method Tooling#query
123
+ * @param {String} locator - Next record set locator
124
+ * @param {Callback.<QueryResult>} [callback] - Callback function
125
+ * @returns {Query.<QueryResult>}
126
+ */
127
+ /**
128
+ * Retrieve specified records
129
+ *
130
+ * @method Tooling#queryMore
131
+ * @param {String} type - SObject Type
132
+ * @param {String|Array.<String>} ids - A record ID or array of record IDs
133
+ * @param {Callback.<Record|Array.<Record>>} [callback] - Callback function
134
+ * @returns {Promise.<Record|Array.<Record>>}
135
+ */
136
+
137
+ /**
138
+ * Synonym of Tooling#create()
139
+ *
140
+ * @method Tooling#insert
141
+ * @param {String} type - SObject Type
142
+ * @param {Object|Array.<Object>} records - A record or array of records to create
143
+ * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback function
144
+ * @returns {Promise.<RecordResult|Array.<RecordResult>>}
145
+ */
146
+ /**
147
+ * Create records
148
+ *
149
+ * @method Tooling#create
150
+ * @param {String} type - SObject Type
151
+ * @param {Record|Array.<Record>} records - A record or array of records to create
152
+ * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback function
153
+ * @returns {Promise.<RecordResult|Array.<RecordResult>>}
154
+ */
155
+
156
+ /**
157
+ * Update records
158
+ *
159
+ * @method Tooling#update
160
+ * @param {String} type - SObject Type
161
+ * @param {Record|Array.<Record>} records - A record or array of records to update
162
+ * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback function
163
+ * @returns {Promise.<RecordResult|Array.<RecordResult>>}
164
+ */
165
+
166
+ /**
167
+ * Upsert records
168
+ *
169
+ * @method Tooling#upsert
170
+ * @param {String} type - SObject Type
171
+ * @param {Record|Array.<Record>} records - Record or array of records to upsert
172
+ * @param {String} extIdField - External ID field name
173
+ * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback
174
+ * @returns {Promise.<RecordResult|Array.<RecordResult>>}
175
+ */
176
+
177
+ /**
178
+ * Synonym of Tooling#destroy()
179
+ *
180
+ * @method Tooling#delete
181
+ * @param {String} type - SObject Type
182
+ * @param {String|Array.<String>} ids - A ID or array of IDs to delete
183
+ * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback
184
+ * @returns {Promise.<RecordResult|Array.<RecordResult>>}
185
+ */
186
+ /**
187
+ * Synonym of Tooling#destroy()
188
+ *
189
+ * @method Tooling#del
190
+ * @param {String} type - SObject Type
191
+ * @param {String|Array.<String>} ids - A ID or array of IDs to delete
192
+ * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback
193
+ * @returns {Promise.<RecordResult|Array.<RecordResult>>}
194
+ */
195
+ /**
196
+ * Delete records
197
+ *
198
+ * @method Tooling#destroy
199
+ * @param {String} type - SObject Type
200
+ * @param {String|Array.<String>} ids - A ID or array of IDs to delete
201
+ * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback
202
+ * @returns {Promise.<RecordResult|Array.<RecordResult>>}
203
+ */
204
+
205
+ /**
206
+ * Synonym of Tooling#describe()
207
+ *
208
+ * @method Tooling#describeSObject
209
+ * @param {String} type - SObject Type
210
+ * @param {Callback.<DescribeSObjectResult>} [callback] - Callback function
211
+ * @returns {Promise.<DescribeSObjectResult>}
212
+ */
213
+ /**
214
+ * Describe SObject metadata
215
+ *
216
+ * @method Tooling#describe
217
+ * @param {String} type - SObject Type
218
+ * @param {Callback.<DescribeSObjectResult>} [callback] - Callback function
219
+ * @returns {Promise.<DescribeSObjectResult>}
220
+ */
221
+
222
+ /**
223
+ * Describe global SObjects
224
+ *
225
+ * @method Tooling#describeGlobal
226
+ * @param {Callback.<DescribeGlobalResult>} [callback] - Callback function
227
+ * @returns {Promise.<DescribeGlobalResult>}
228
+ */
229
+
230
+ /**
231
+ * Get SObject instance
232
+ *
233
+ * @method Tooling#sobject
234
+ * @param {String} type - SObject Type
235
+ * @returns {SObject}
236
+ */
237
+
238
+ /**
239
+ * @typedef {Object} Tooling~ExecuteAnonymousResult
240
+ * @prop {Boolean} compiled - Flag if the query is compiled successfully
241
+ * @prop {String} compileProblem - Error reason in compilation
242
+ * @prop {Boolean} success - Flag if the code is executed successfully
243
+ * @prop {Number} line - Line number for the error
244
+ * @prop {Number} column - Column number for the error
245
+ * @prop {String} exceptionMessage - Exception message
246
+ * @prop {String} exceptionStackTrace - Exception stack trace
247
+ */
248
+ /**
249
+ * Executes Apex code anonymously
250
+ *
251
+ * @param {String} body - Anonymous Apex code
252
+ * @param {Callback.<Tooling~ExecuteAnonymousResult>} [callback] - Callback function
253
+ * @returns {Promise.<Tooling~ExecuteAnonymousResult>}
254
+ */
255
+ Tooling.prototype.executeAnonymous = function(body, callback) {
256
+ var url = this._baseUrl() + "/executeAnonymous?anonymousBody=" + encodeURIComponent(body);
257
+ return this.request(url).thenCall(callback);
258
+ };
259
+
260
+ /**
261
+ * Executes Apex tests asynchronously
262
+ *
263
+ * @param {Array.<String>} classids - Comma separated list of class IDs
264
+ * @param {Callback.<Tooling~ExecuteAnonymousResult>} [callback] - Callback function
265
+ * @returns {Promise.<Tooling~ExecuteAnonymousResult>}
266
+ */
267
+ Tooling.prototype.runTestsAsynchronous = function(classids, callback) {
268
+ var url = this._baseUrl() + "/runTestsAsynchronous/";
269
+ return this._conn.requestPost(url, {classids : classids.join(',')}, undefined, callback);
270
+ };
271
+
272
+ /**
273
+ * Executes Apex tests synchronously
274
+ *
275
+ * @param {Array.<String>} classnames - Comma separated list of class Names
276
+ * @param {Callback.<Tooling~ExecuteAnonymousResult>} [callback] - Callback function
277
+ * @returns {Promise.<Tooling~ExecuteAnonymousResult>}
278
+ */
279
+ Tooling.prototype.runTestsSynchronous = function(classnames, callback) {
280
+ var url = this._baseUrl() + "/runTestsSynchronous/";
281
+ return this._conn.requestPost(url, {classnames : classnames.join(',')}, undefined, callback);
282
+ };
283
+
284
+ /**
285
+ * @typedef {Object} Tooling~CompletionsResult
286
+ * @prop {Object} publicDeclarations
287
+ */
288
+ /**
289
+ * Retrieves available code completions of the referenced type
290
+ *
291
+ * @param {String} [type] - completion type (default 'apex')
292
+ * @param {Callback.<Tooling~CompletionsResult>} [callback] - Callback function
293
+ * @returns {Promise.<Tooling~CompletionsResult>}
294
+ */
295
+ Tooling.prototype.completions = function(type, callback) {
296
+ if (!_.isString(type)) {
297
+ callback = type;
298
+ type = 'apex';
299
+ }
300
+ var url = this._baseUrl() + "/completions?type=" + encodeURIComponent(type);
301
+ return this.request(url).thenCall(callback);
302
+ };
303
+
304
+
305
+ /*--------------------------------------------*/
306
+ /*
307
+ * Register hook in connection instantiation for dynamically adding this API module features
308
+ */
309
+ jsforce.on('connection:new', function(conn) {
310
+ conn.tooling = new Tooling(conn);
311
+ });
312
+
313
+
314
+ module.exports = Tooling;
315
+
316
+ },{}]},{},[1])(1)
317
+ });
318
+
319
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYXBpL3Rvb2xpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLyoqXG4gKiBAZmlsZSBNYW5hZ2VzIFRvb2xpbmcgQVBJc1xuICogQGF1dGhvciBTaGluaWNoaSBUb21pdGEgPHNoaW5pY2hpLnRvbWl0YUBnbWFpbC5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIganNmb3JjZSA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJy4vY29yZScpLFxuICAgIF8gICAgID0gd2luZG93LmpzZm9yY2UucmVxdWlyZSgnbG9kYXNoL2NvcmUnKSxcbiAgICBDYWNoZSA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJy4vY2FjaGUnKTtcblxuLyoqXG4gKiBBUEkgY2xhc3MgZm9yIFRvb2xpbmcgQVBJIGNhbGxcbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubiAtIENvbm5lY3Rpb25cbiAqL1xudmFyIFRvb2xpbmcgPSBmdW5jdGlvbihjb25uKSB7XG4gIHRoaXMuX2Nvbm4gPSBjb25uO1xuICB0aGlzLl9sb2dnZXIgPSBjb25uLl9sb2dnZXI7XG4gIHZhciBkZWxlZ2F0ZXMgPSBbXG4gICAgXCJxdWVyeVwiLFxuICAgIFwicXVlcnlNb3JlXCIsXG4gICAgXCJfdG9SZWNvcmRSZXN1bHRcIixcbiAgICBcImNyZWF0ZVwiLFxuICAgIFwiX2NyZWF0ZVNpbmdsZVwiLFxuICAgIFwiX2NyZWF0ZVBhcmFsbGVsXCIsXG4gICAgXCJfY3JlYXRlTWFueVwiLFxuICAgIFwiaW5zZXJ0XCIsXG4gICAgXCJyZXRyaWV2ZVwiLFxuICAgIFwiX3JldHJpZXZlU2luZ2xlXCIsXG4gICAgXCJfcmV0cmlldmVQYXJhbGxlbFwiLFxuICAgIFwiX3JldHJpZXZlTWFueVwiLFxuICAgIFwidXBkYXRlXCIsXG4gICAgXCJfdXBkYXRlU2luZ2xlXCIsXG4gICAgXCJfdXBkYXRlUGFyYWxsZWxcIixcbiAgICBcIl91cGRhdGVNYW55XCIsXG4gICAgXCJ1cHNlcnRcIixcbiAgICBcImRlbFwiLFxuICAgIFwiZGVsZXRlXCIsXG4gICAgXCJkZXN0cm95XCIsXG4gICAgXCJfZGVzdHJveVNpbmdsZVwiLFxuICAgIFwiX2Rlc3Ryb3lQYXJhbGxlbFwiLFxuICAgIFwiX2Rlc3Ryb3lNYW55XCIsXG4gICAgXCJkZXNjcmliZVwiLFxuICAgIFwiZGVzY3JpYmVHbG9iYWxcIixcbiAgICBcInNvYmplY3RcIlxuICBdO1xuICBkZWxlZ2F0ZXMuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICB0aGlzW21ldGhvZF0gPSBjb25uLmNvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2RdO1xuICB9LCB0aGlzKTtcblxuICB0aGlzLmNhY2hlID0gbmV3IENhY2hlKCk7XG5cbiAgdmFyIGNhY2hlT3B0aW9ucyA9IHtcbiAgICBrZXk6IGZ1bmN0aW9uKHR5cGUpIHsgcmV0dXJuIHR5cGUgPyBcImRlc2NyaWJlLlwiICsgdHlwZSA6IFwiZGVzY3JpYmVcIjsgfVxuICB9O1xuICB0aGlzLmRlc2NyaWJlJCA9IHRoaXMuY2FjaGUubWFrZUNhY2hlYWJsZSh0aGlzLmRlc2NyaWJlLCB0aGlzLCBjYWNoZU9wdGlvbnMpO1xuICB0aGlzLmRlc2NyaWJlID0gdGhpcy5jYWNoZS5tYWtlUmVzcG9uc2VDYWNoZWFibGUodGhpcy5kZXNjcmliZSwgdGhpcywgY2FjaGVPcHRpb25zKTtcbiAgdGhpcy5kZXNjcmliZVNPYmplY3QkID0gdGhpcy5kZXNjcmliZSQ7XG4gIHRoaXMuZGVzY3JpYmVTT2JqZWN0ID0gdGhpcy5kZXNjcmliZTtcblxuICBjYWNoZU9wdGlvbnMgPSB7IGtleTogJ2Rlc2NyaWJlR2xvYmFsJyB9O1xuICB0aGlzLmRlc2NyaWJlR2xvYmFsJCA9IHRoaXMuY2FjaGUubWFrZUNhY2hlYWJsZSh0aGlzLmRlc2NyaWJlR2xvYmFsLCB0aGlzLCBjYWNoZU9wdGlvbnMpO1xuICB0aGlzLmRlc2NyaWJlR2xvYmFsID0gdGhpcy5jYWNoZS5tYWtlUmVzcG9uc2VDYWNoZWFibGUodGhpcy5kZXNjcmliZUdsb2JhbCwgdGhpcywgY2FjaGVPcHRpb25zKTtcblxuICB0aGlzLmluaXRpYWxpemUoKTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0b29saW5nIEFQSVxuICogQHByb3RlY3RlZFxuICovXG5Ub29saW5nLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc29iamVjdHMgPSB7fTtcbiAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICB0aGlzLmNhY2hlLmdldCgnZGVzY3JpYmVHbG9iYWwnKS5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3ZhbHVlJyk7XG4gIHRoaXMuY2FjaGUuZ2V0KCdkZXNjcmliZUdsb2JhbCcpLm9uKCd2YWx1ZScsIF8uYmluZChmdW5jdGlvbihyZXMpIHtcbiAgICBpZiAocmVzLnJlc3VsdCkge1xuICAgICAgdmFyIHR5cGVzID0gXy5tYXAocmVzLnJlc3VsdC5zb2JqZWN0cywgZnVuY3Rpb24oc28pIHsgcmV0dXJuIHNvLm5hbWU7IH0pO1xuICAgICAgdHlwZXMuZm9yRWFjaCh0aGlzLnNvYmplY3QsIHRoaXMpO1xuICAgIH1cbiAgfSwgdGhpcykpO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5Ub29saW5nLnByb3RvdHlwZS5fYmFzZVVybCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fY29ubi5fYmFzZVVybCgpICsgXCIvdG9vbGluZ1wiO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5Ub29saW5nLnByb3RvdHlwZS5fc3VwcG9ydHMgPSBmdW5jdGlvbihmZWF0dXJlKSB7XG4gIC8vIHNob3VsZCByZXR1cm4gZmFsc2UgaW4gb3JkZXIgbm90IHRvIHVzZSBjb21wc2l0ZSBjb2xsZWN0aW9uXG4gIGlmIChmZWF0dXJlID09PSAnc29iamVjdC1jb2xsZWN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fY29ubi5fc3VwcG9ydHMuYXBwbHkodGhpcy5fY29ubiwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuVG9vbGluZy5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fY29ubi5yZXF1ZXN0LmFwcGx5KHRoaXMuX2Nvbm4sIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGUgcXVlcnkgYnkgdXNpbmcgU09RTFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3FsIC0gU09RTCBzdHJpbmdcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFF1ZXJ5UmVzdWx0Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UXVlcnkuPFF1ZXJ5UmVzdWx0Pn1cbiAqL1xuLyoqXG4gKiBRdWVyeSBuZXh0IHJlY29yZCBzZXQgYnkgdXNpbmcgcXVlcnkgbG9jYXRvclxuICpcbiAqIEBtZXRob2QgVG9vbGluZyNxdWVyeVxuICogQHBhcmFtIHtTdHJpbmd9IGxvY2F0b3IgLSBOZXh0IHJlY29yZCBzZXQgbG9jYXRvclxuICogQHBhcmFtIHtDYWxsYmFjay48UXVlcnlSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtRdWVyeS48UXVlcnlSZXN1bHQ+fVxuICovXG4vKipcbiAqIFJldHJpZXZlIHNwZWNpZmllZCByZWNvcmRzXG4gKlxuICogQG1ldGhvZCBUb29saW5nI3F1ZXJ5TW9yZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBTT2JqZWN0IFR5cGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5LjxTdHJpbmc+fSBpZHMgLSBBIHJlY29yZCBJRCBvciBhcnJheSBvZiByZWNvcmQgSURzXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxSZWNvcmR8QXJyYXkuPFJlY29yZD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxSZWNvcmR8QXJyYXkuPFJlY29yZD4+fVxuICovXG5cbi8qKlxuICogU3lub255bSBvZiBUb29saW5nI2NyZWF0ZSgpXG4gKlxuICogQG1ldGhvZCBUb29saW5nI2luc2VydFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBTT2JqZWN0IFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5LjxPYmplY3Q+fSByZWNvcmRzIC0gQSByZWNvcmQgb3IgYXJyYXkgb2YgcmVjb3JkcyB0byBjcmVhdGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFJlY29yZFJlc3VsdHxBcnJheS48UmVjb3JkUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFJlY29yZFJlc3VsdHxBcnJheS48UmVjb3JkUmVzdWx0Pj59XG4gKi9cbi8qKlxuICogQ3JlYXRlIHJlY29yZHNcbiAqXG4gKiBAbWV0aG9kIFRvb2xpbmcjY3JlYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFNPYmplY3QgVHlwZVxuICogQHBhcmFtIHtSZWNvcmR8QXJyYXkuPFJlY29yZD59IHJlY29yZHMgLSBBIHJlY29yZCBvciBhcnJheSBvZiByZWNvcmRzIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtDYWxsYmFjay48UmVjb3JkUmVzdWx0fEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48UmVjb3JkUmVzdWx0fEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn1cbiAqL1xuXG4vKipcbiAqIFVwZGF0ZSByZWNvcmRzXG4gKlxuICogQG1ldGhvZCBUb29saW5nI3VwZGF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBTT2JqZWN0IFR5cGVcbiAqIEBwYXJhbSB7UmVjb3JkfEFycmF5LjxSZWNvcmQ+fSByZWNvcmRzIC0gQSByZWNvcmQgb3IgYXJyYXkgb2YgcmVjb3JkcyB0byB1cGRhdGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFJlY29yZFJlc3VsdHxBcnJheS48UmVjb3JkUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFJlY29yZFJlc3VsdHxBcnJheS48UmVjb3JkUmVzdWx0Pj59XG4gKi9cblxuLyoqXG4gKiBVcHNlcnQgcmVjb3Jkc1xuICpcbiAqIEBtZXRob2QgVG9vbGluZyN1cHNlcnRcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gU09iamVjdCBUeXBlXG4gKiBAcGFyYW0ge1JlY29yZHxBcnJheS48UmVjb3JkPn0gcmVjb3JkcyAtIFJlY29yZCBvciBhcnJheSBvZiByZWNvcmRzIHRvIHVwc2VydFxuICogQHBhcmFtIHtTdHJpbmd9IGV4dElkRmllbGQgLSBFeHRlcm5hbCBJRCBmaWVsZCBuYW1lXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxSZWNvcmRSZXN1bHR8QXJyYXkuPFJlY29yZFJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2tcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxSZWNvcmRSZXN1bHR8QXJyYXkuPFJlY29yZFJlc3VsdD4+fVxuICovXG5cbi8qKlxuICogU3lub255bSBvZiBUb29saW5nI2Rlc3Ryb3koKVxuICpcbiAqIEBtZXRob2QgVG9vbGluZyNkZWxldGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gU09iamVjdCBUeXBlXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheS48U3RyaW5nPn0gaWRzIC0gQSBJRCBvciBhcnJheSBvZiBJRHMgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxSZWNvcmRSZXN1bHR8QXJyYXkuPFJlY29yZFJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2tcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxSZWNvcmRSZXN1bHR8QXJyYXkuPFJlY29yZFJlc3VsdD4+fVxuICovXG4vKipcbiAqIFN5bm9ueW0gb2YgVG9vbGluZyNkZXN0cm95KClcbiAqXG4gKiBAbWV0aG9kIFRvb2xpbmcjZGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFNPYmplY3QgVHlwZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXkuPFN0cmluZz59IGlkcyAtIEEgSUQgb3IgYXJyYXkgb2YgSURzIHRvIGRlbGV0ZVxuICogQHBhcmFtIHtDYWxsYmFjay48UmVjb3JkUmVzdWx0fEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48UmVjb3JkUmVzdWx0fEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn1cbiAqL1xuLyoqXG4gKiBEZWxldGUgcmVjb3Jkc1xuICpcbiAqIEBtZXRob2QgVG9vbGluZyNkZXN0cm95XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFNPYmplY3QgVHlwZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXkuPFN0cmluZz59IGlkcyAtIEEgSUQgb3IgYXJyYXkgb2YgSURzIHRvIGRlbGV0ZVxuICogQHBhcmFtIHtDYWxsYmFjay48UmVjb3JkUmVzdWx0fEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48UmVjb3JkUmVzdWx0fEFycmF5LjxSZWNvcmRSZXN1bHQ+Pn1cbiAqL1xuXG4vKipcbiAqIFN5bm9ueW0gb2YgVG9vbGluZyNkZXNjcmliZSgpXG4gKlxuICogQG1ldGhvZCBUb29saW5nI2Rlc2NyaWJlU09iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBTT2JqZWN0IFR5cGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPERlc2NyaWJlU09iamVjdFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPERlc2NyaWJlU09iamVjdFJlc3VsdD59XG4gKi9cbi8qKlxuICogRGVzY3JpYmUgU09iamVjdCBtZXRhZGF0YVxuICpcbiAqIEBtZXRob2QgVG9vbGluZyNkZXNjcmliZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBTT2JqZWN0IFR5cGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPERlc2NyaWJlU09iamVjdFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPERlc2NyaWJlU09iamVjdFJlc3VsdD59XG4gKi9cblxuLyoqXG4gKiBEZXNjcmliZSBnbG9iYWwgU09iamVjdHNcbiAqXG4gKiBAbWV0aG9kIFRvb2xpbmcjZGVzY3JpYmVHbG9iYWxcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPERlc2NyaWJlR2xvYmFsUmVzdWx0Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48RGVzY3JpYmVHbG9iYWxSZXN1bHQ+fVxuICovXG5cbi8qKlxuICogR2V0IFNPYmplY3QgaW5zdGFuY2VcbiAqXG4gKiBAbWV0aG9kIFRvb2xpbmcjc29iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBTT2JqZWN0IFR5cGVcbiAqIEByZXR1cm5zIHtTT2JqZWN0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVG9vbGluZ35FeGVjdXRlQW5vbnltb3VzUmVzdWx0XG4gKiBAcHJvcCB7Qm9vbGVhbn0gY29tcGlsZWQgLSBGbGFnIGlmIHRoZSBxdWVyeSBpcyBjb21waWxlZCBzdWNjZXNzZnVsbHlcbiAqIEBwcm9wIHtTdHJpbmd9IGNvbXBpbGVQcm9ibGVtIC0gRXJyb3IgcmVhc29uIGluIGNvbXBpbGF0aW9uXG4gKiBAcHJvcCB7Qm9vbGVhbn0gc3VjY2VzcyAtIEZsYWcgaWYgdGhlIGNvZGUgaXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5XG4gKiBAcHJvcCB7TnVtYmVyfSBsaW5lIC0gTGluZSBudW1iZXIgZm9yIHRoZSBlcnJvclxuICogQHByb3Age051bWJlcn0gY29sdW1uIC0gQ29sdW1uIG51bWJlciBmb3IgdGhlIGVycm9yXG4gKiBAcHJvcCB7U3RyaW5nfSBleGNlcHRpb25NZXNzYWdlIC0gRXhjZXB0aW9uIG1lc3NhZ2VcbiAqIEBwcm9wIHtTdHJpbmd9IGV4Y2VwdGlvblN0YWNrVHJhY2UgLSBFeGNlcHRpb24gc3RhY2sgdHJhY2VcbiAqL1xuLyoqXG4gKiBFeGVjdXRlcyBBcGV4IGNvZGUgYW5vbnltb3VzbHlcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYm9keSAtIEFub255bW91cyBBcGV4IGNvZGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFRvb2xpbmd+RXhlY3V0ZUFub255bW91c1Jlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFRvb2xpbmd+RXhlY3V0ZUFub255bW91c1Jlc3VsdD59XG4gKi9cblRvb2xpbmcucHJvdG90eXBlLmV4ZWN1dGVBbm9ueW1vdXMgPSBmdW5jdGlvbihib2R5LCBjYWxsYmFjaykge1xuICB2YXIgdXJsID0gdGhpcy5fYmFzZVVybCgpICsgXCIvZXhlY3V0ZUFub255bW91cz9hbm9ueW1vdXNCb2R5PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJvZHkpO1xuICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyBBcGV4IHRlc3RzIGFzeW5jaHJvbm91c2x5XG4gKlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gY2xhc3NpZHMgLSBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBJRHNcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFRvb2xpbmd+RXhlY3V0ZUFub255bW91c1Jlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFRvb2xpbmd+RXhlY3V0ZUFub255bW91c1Jlc3VsdD59XG4gKi9cblRvb2xpbmcucHJvdG90eXBlLnJ1blRlc3RzQXN5bmNocm9ub3VzID0gZnVuY3Rpb24oY2xhc3NpZHMsIGNhbGxiYWNrKSB7XG4gIHZhciB1cmwgPSB0aGlzLl9iYXNlVXJsKCkgKyBcIi9ydW5UZXN0c0FzeW5jaHJvbm91cy9cIjtcbiAgcmV0dXJuIHRoaXMuX2Nvbm4ucmVxdWVzdFBvc3QodXJsLCB7Y2xhc3NpZHMgOiBjbGFzc2lkcy5qb2luKCcsJyl9LCB1bmRlZmluZWQsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgQXBleCB0ZXN0cyBzeW5jaHJvbm91c2x5XG4gKlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gY2xhc3NuYW1lcyAtIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzIE5hbWVzXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxUb29saW5nfkV4ZWN1dGVBbm9ueW1vdXNSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxUb29saW5nfkV4ZWN1dGVBbm9ueW1vdXNSZXN1bHQ+fVxuICovXG5Ub29saW5nLnByb3RvdHlwZS5ydW5UZXN0c1N5bmNocm9ub3VzID0gZnVuY3Rpb24oY2xhc3NuYW1lcywgY2FsbGJhY2spIHtcbiAgdmFyIHVybCA9IHRoaXMuX2Jhc2VVcmwoKSArIFwiL3J1blRlc3RzU3luY2hyb25vdXMvXCI7XG4gIHJldHVybiB0aGlzLl9jb25uLnJlcXVlc3RQb3N0KHVybCwge2NsYXNzbmFtZXMgOiBjbGFzc25hbWVzLmpvaW4oJywnKX0sIHVuZGVmaW5lZCwgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb29saW5nfkNvbXBsZXRpb25zUmVzdWx0XG4gKiBAcHJvcCB7T2JqZWN0fSBwdWJsaWNEZWNsYXJhdGlvbnNcbiAqL1xuLyoqXG4gKiBSZXRyaWV2ZXMgYXZhaWxhYmxlIGNvZGUgY29tcGxldGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgdHlwZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0gLSBjb21wbGV0aW9uIHR5cGUgKGRlZmF1bHQgJ2FwZXgnKVxuICogQHBhcmFtIHtDYWxsYmFjay48VG9vbGluZ35Db21wbGV0aW9uc1Jlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFRvb2xpbmd+Q29tcGxldGlvbnNSZXN1bHQ+fVxuICovXG5Ub29saW5nLnByb3RvdHlwZS5jb21wbGV0aW9ucyA9IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gIGlmICghXy5pc1N0cmluZyh0eXBlKSkge1xuICAgIGNhbGxiYWNrID0gdHlwZTtcbiAgICB0eXBlID0gJ2FwZXgnO1xuICB9XG4gIHZhciB1cmwgPSB0aGlzLl9iYXNlVXJsKCkgKyBcIi9jb21wbGV0aW9ucz90eXBlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHR5cGUpO1xuICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8qXG4gKiBSZWdpc3RlciBob29rIGluIGNvbm5lY3Rpb24gaW5zdGFudGlhdGlvbiBmb3IgZHluYW1pY2FsbHkgYWRkaW5nIHRoaXMgQVBJIG1vZHVsZSBmZWF0dXJlc1xuICovXG5qc2ZvcmNlLm9uKCdjb25uZWN0aW9uOm5ldycsIGZ1bmN0aW9uKGNvbm4pIHtcbiAgY29ubi50b29saW5nID0gbmV3IFRvb2xpbmcoY29ubik7XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2xpbmc7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ !function(e){var t;"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):(t=(t=(t=(t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).jsforce||(t.jsforce={})).modules||(t.modules={})).api||(t.api={})).Tooling=e()}(function(){return function n(r,s,i){function c(t,e){if(!s[t]){if(!r[t]){var o="function"==typeof require&&require;if(!e&&o)return o(t,!0);if(u)return u(t,!0);throw(o=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",o}o=s[t]={exports:{}},r[t][0].call(o.exports,function(e){return c(r[t][1][e]||e)},o,o.exports,n,r,s,i)}return s[t].exports}for(var u="function"==typeof require&&require,e=0;e<i.length;e++)c(i[e]);return c}({1:[function(e,t,o){"use strict";function n(t){this._conn=t,this._logger=t._logger,["query","queryMore","_toRecordResult","create","_createSingle","_createParallel","_createMany","insert","retrieve","_retrieveSingle","_retrieveParallel","_retrieveMany","update","_updateSingle","_updateParallel","_updateMany","upsert","del","delete","destroy","_destroySingle","_destroyParallel","_destroyMany","describe","describeGlobal","sobject"].forEach(function(e){this[e]=t.constructor.prototype[e]},this),this.cache=new i;var e={key:function(e){return e?"describe."+e:"describe"}};this.describe$=this.cache.makeCacheable(this.describe,this,e),this.describe=this.cache.makeResponseCacheable(this.describe,this,e),this.describeSObject$=this.describe$,this.describeSObject=this.describe,e={key:"describeGlobal"},this.describeGlobal$=this.cache.makeCacheable(this.describeGlobal,this,e),this.describeGlobal=this.cache.makeResponseCacheable(this.describeGlobal,this,e),this.initialize()}var r=window.jsforce.require("./core"),s=window.jsforce.require("lodash/core"),i=window.jsforce.require("./cache");n.prototype.initialize=function(){this.sobjects={},this.cache.clear(),this.cache.get("describeGlobal").removeAllListeners("value"),this.cache.get("describeGlobal").on("value",s.bind(function(e){e.result&&s.map(e.result.sobjects,function(e){return e.name}).forEach(this.sobject,this)},this))},n.prototype._baseUrl=function(){return this._conn._baseUrl()+"/tooling"},n.prototype._supports=function(e){return"sobject-collection"!==e&&this._conn._supports.apply(this._conn,arguments)},n.prototype.request=function(){return this._conn.request.apply(this._conn,arguments)},n.prototype.executeAnonymous=function(e,t){e=this._baseUrl()+"/executeAnonymous?anonymousBody="+encodeURIComponent(e);return this.request(e).thenCall(t)},n.prototype.runTestsAsynchronous=function(e,t){var o=this._baseUrl()+"/runTestsAsynchronous/";return this._conn.requestPost(o,{classids:e.join(",")},void 0,t)},n.prototype.runTestsSynchronous=function(e,t){var o=this._baseUrl()+"/runTestsSynchronous/";return this._conn.requestPost(o,{classnames:e.join(",")},void 0,t)},n.prototype.completions=function(e,t){s.isString(e)||(t=e,e="apex");e=this._baseUrl()+"/completions?type="+encodeURIComponent(e);return this.request(e).thenCall(t)},r.on("connection:new",function(e){e.tooling=new n(e)}),t.exports=n},{}]},{},[1])(1)});
2
+ //# sourceMappingURL=jsforce-api-tooling.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/tooling.js"],"names":["f","g","exports","module","define","amd","window","global","self","this","jsforce","modules","api","Tooling","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","conn","_conn","_logger","forEach","method","constructor","prototype","cache","Cache","cacheOptions","key","type","describe$","makeCacheable","describe","makeResponseCacheable","describeSObject$","describeSObject","describeGlobal$","describeGlobal","initialize","_","sobjects","clear","get","removeAllListeners","on","bind","res","result","map","so","name","sobject","_baseUrl","_supports","feature","apply","arguments","request","executeAnonymous","body","callback","url","encodeURIComponent","thenCall","runTestsAsynchronous","classids","requestPost","join","undefined","runTestsSynchronous","classnames","completions","isString","tooling"],"mappings":"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","file":"jsforce-api-tooling.min.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","/**\n * @file Manages Tooling APIs\n * @author Shinichi Tomita <shinichi.tomita@gmail.com>\n */\n\n'use strict';\n\nvar jsforce = window.jsforce.require('./core'),\n _ = window.jsforce.require('lodash/core'),\n Cache = window.jsforce.require('./cache');\n\n/**\n * API class for Tooling API call\n *\n * @class\n * @param {Connection} conn - Connection\n */\nvar Tooling = function(conn) {\n this._conn = conn;\n this._logger = conn._logger;\n var delegates = [\n \"query\",\n \"queryMore\",\n \"_toRecordResult\",\n \"create\",\n \"_createSingle\",\n \"_createParallel\",\n \"_createMany\",\n \"insert\",\n \"retrieve\",\n \"_retrieveSingle\",\n \"_retrieveParallel\",\n \"_retrieveMany\",\n \"update\",\n \"_updateSingle\",\n \"_updateParallel\",\n \"_updateMany\",\n \"upsert\",\n \"del\",\n \"delete\",\n \"destroy\",\n \"_destroySingle\",\n \"_destroyParallel\",\n \"_destroyMany\",\n \"describe\",\n \"describeGlobal\",\n \"sobject\"\n ];\n delegates.forEach(function(method) {\n this[method] = conn.constructor.prototype[method];\n }, this);\n\n this.cache = new Cache();\n\n var cacheOptions = {\n key: function(type) { return type ? \"describe.\" + type : \"describe\"; }\n };\n this.describe$ = this.cache.makeCacheable(this.describe, this, cacheOptions);\n this.describe = this.cache.makeResponseCacheable(this.describe, this, cacheOptions);\n this.describeSObject$ = this.describe$;\n this.describeSObject = this.describe;\n\n cacheOptions = { key: 'describeGlobal' };\n this.describeGlobal$ = this.cache.makeCacheable(this.describeGlobal, this, cacheOptions);\n this.describeGlobal = this.cache.makeResponseCacheable(this.describeGlobal, this, cacheOptions);\n\n this.initialize();\n};\n\n/**\n * Initialize tooling API\n * @protected\n */\nTooling.prototype.initialize = function() {\n this.sobjects = {};\n this.cache.clear();\n this.cache.get('describeGlobal').removeAllListeners('value');\n this.cache.get('describeGlobal').on('value', _.bind(function(res) {\n if (res.result) {\n var types = _.map(res.result.sobjects, function(so) { return so.name; });\n types.forEach(this.sobject, this);\n }\n }, this));\n};\n\n/**\n * @private\n */\nTooling.prototype._baseUrl = function() {\n return this._conn._baseUrl() + \"/tooling\";\n};\n\n/**\n * @private\n */\nTooling.prototype._supports = function(feature) {\n // should return false in order not to use compsite collection\n if (feature === 'sobject-collection') {\n return false;\n }\n return this._conn._supports.apply(this._conn, arguments);\n};\n\n/**\n * @private\n */\nTooling.prototype.request = function() {\n return this._conn.request.apply(this._conn, arguments);\n};\n\n/**\n * Execute query by using SOQL\n *\n * @param {String} soql - SOQL string\n * @param {Callback.<QueryResult>} [callback] - Callback function\n * @returns {Query.<QueryResult>}\n */\n/**\n * Query next record set by using query locator\n *\n * @method Tooling#query\n * @param {String} locator - Next record set locator\n * @param {Callback.<QueryResult>} [callback] - Callback function\n * @returns {Query.<QueryResult>}\n */\n/**\n * Retrieve specified records\n *\n * @method Tooling#queryMore\n * @param {String} type - SObject Type\n * @param {String|Array.<String>} ids - A record ID or array of record IDs\n * @param {Callback.<Record|Array.<Record>>} [callback] - Callback function\n * @returns {Promise.<Record|Array.<Record>>}\n */\n\n/**\n * Synonym of Tooling#create()\n *\n * @method Tooling#insert\n * @param {String} type - SObject Type\n * @param {Object|Array.<Object>} records - A record or array of records to create\n * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback function\n * @returns {Promise.<RecordResult|Array.<RecordResult>>}\n */\n/**\n * Create records\n *\n * @method Tooling#create\n * @param {String} type - SObject Type\n * @param {Record|Array.<Record>} records - A record or array of records to create\n * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback function\n * @returns {Promise.<RecordResult|Array.<RecordResult>>}\n */\n\n/**\n * Update records\n *\n * @method Tooling#update\n * @param {String} type - SObject Type\n * @param {Record|Array.<Record>} records - A record or array of records to update\n * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback function\n * @returns {Promise.<RecordResult|Array.<RecordResult>>}\n */\n\n/**\n * Upsert records\n *\n * @method Tooling#upsert\n * @param {String} type - SObject Type\n * @param {Record|Array.<Record>} records - Record or array of records to upsert\n * @param {String} extIdField - External ID field name\n * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback\n * @returns {Promise.<RecordResult|Array.<RecordResult>>}\n */\n\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#delete\n * @param {String} type - SObject Type\n * @param {String|Array.<String>} ids - A ID or array of IDs to delete\n * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback\n * @returns {Promise.<RecordResult|Array.<RecordResult>>}\n */\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#del\n * @param {String} type - SObject Type\n * @param {String|Array.<String>} ids - A ID or array of IDs to delete\n * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback\n * @returns {Promise.<RecordResult|Array.<RecordResult>>}\n */\n/**\n * Delete records\n *\n * @method Tooling#destroy\n * @param {String} type - SObject Type\n * @param {String|Array.<String>} ids - A ID or array of IDs to delete\n * @param {Callback.<RecordResult|Array.<RecordResult>>} [callback] - Callback\n * @returns {Promise.<RecordResult|Array.<RecordResult>>}\n */\n\n/**\n * Synonym of Tooling#describe()\n *\n * @method Tooling#describeSObject\n * @param {String} type - SObject Type\n * @param {Callback.<DescribeSObjectResult>} [callback] - Callback function\n * @returns {Promise.<DescribeSObjectResult>}\n */\n/**\n * Describe SObject metadata\n *\n * @method Tooling#describe\n * @param {String} type - SObject Type\n * @param {Callback.<DescribeSObjectResult>} [callback] - Callback function\n * @returns {Promise.<DescribeSObjectResult>}\n */\n\n/**\n * Describe global SObjects\n *\n * @method Tooling#describeGlobal\n * @param {Callback.<DescribeGlobalResult>} [callback] - Callback function\n * @returns {Promise.<DescribeGlobalResult>}\n */\n\n/**\n * Get SObject instance\n *\n * @method Tooling#sobject\n * @param {String} type - SObject Type\n * @returns {SObject}\n */\n\n/**\n * @typedef {Object} Tooling~ExecuteAnonymousResult\n * @prop {Boolean} compiled - Flag if the query is compiled successfully\n * @prop {String} compileProblem - Error reason in compilation\n * @prop {Boolean} success - Flag if the code is executed successfully\n * @prop {Number} line - Line number for the error\n * @prop {Number} column - Column number for the error\n * @prop {String} exceptionMessage - Exception message\n * @prop {String} exceptionStackTrace - Exception stack trace\n */\n/**\n * Executes Apex code anonymously\n *\n * @param {String} body - Anonymous Apex code\n * @param {Callback.<Tooling~ExecuteAnonymousResult>} [callback] - Callback function\n * @returns {Promise.<Tooling~ExecuteAnonymousResult>}\n */\nTooling.prototype.executeAnonymous = function(body, callback) {\n var url = this._baseUrl() + \"/executeAnonymous?anonymousBody=\" + encodeURIComponent(body);\n return this.request(url).thenCall(callback);\n};\n\n/**\n * Executes Apex tests asynchronously\n *\n * @param {Array.<String>} classids - Comma separated list of class IDs\n * @param {Callback.<Tooling~ExecuteAnonymousResult>} [callback] - Callback function\n * @returns {Promise.<Tooling~ExecuteAnonymousResult>}\n */\nTooling.prototype.runTestsAsynchronous = function(classids, callback) {\n var url = this._baseUrl() + \"/runTestsAsynchronous/\";\n return this._conn.requestPost(url, {classids : classids.join(',')}, undefined, callback);\n};\n\n/**\n * Executes Apex tests synchronously\n *\n * @param {Array.<String>} classnames - Comma separated list of class Names\n * @param {Callback.<Tooling~ExecuteAnonymousResult>} [callback] - Callback function\n * @returns {Promise.<Tooling~ExecuteAnonymousResult>}\n */\nTooling.prototype.runTestsSynchronous = function(classnames, callback) {\n var url = this._baseUrl() + \"/runTestsSynchronous/\";\n return this._conn.requestPost(url, {classnames : classnames.join(',')}, undefined, callback);\n};\n\n/**\n * @typedef {Object} Tooling~CompletionsResult\n * @prop {Object} publicDeclarations\n */\n/**\n * Retrieves available code completions of the referenced type\n *\n * @param {String} [type] - completion type (default 'apex')\n * @param {Callback.<Tooling~CompletionsResult>} [callback] - Callback function\n * @returns {Promise.<Tooling~CompletionsResult>}\n */\nTooling.prototype.completions = function(type, callback) {\n if (!_.isString(type)) {\n callback = type;\n type = 'apex';\n }\n var url = this._baseUrl() + \"/completions?type=\" + encodeURIComponent(type);\n return this.request(url).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.tooling = new Tooling(conn);\n});\n\n\nmodule.exports = Tooling;\n"]}