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,236 @@
1
+ /**
2
+ * @file Create and build SOQL string from configuration
3
+ * @author Shinichi Tomita <shinichi.tomita@gmail.com>
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ var _ = require('lodash/core'),
9
+ SfDate = require("./date");
10
+
11
+
12
+ /**
13
+ * Create SOQL
14
+ * @private
15
+ */
16
+ function createSOQL(query) {
17
+ var soql = [
18
+ "SELECT ",
19
+ createFieldsClause(query.fields, query.includes),
20
+ " FROM ",
21
+ query.table
22
+ ].join("");
23
+ var cond = createConditionClause(query.conditions);
24
+ if (cond) {
25
+ soql += " WHERE " + cond;
26
+ }
27
+ var orderby = createOrderByClause(query.sort);
28
+ if (orderby) {
29
+ soql += " ORDER BY " + orderby;
30
+ }
31
+ if (query.limit) {
32
+ soql += " LIMIT " + query.limit;
33
+ }
34
+ if (query.offset) {
35
+ soql += " OFFSET " + query.offset;
36
+ }
37
+ return soql;
38
+ }
39
+
40
+ /** @private **/
41
+ function createFieldsClause(fields, childQueries) {
42
+ childQueries = _.map(_.values(childQueries || {}), function(cquery) {
43
+ return '(' + createSOQL(cquery) + ')';
44
+ });
45
+ return (fields || [ "Id" ]).concat(childQueries).join(', ');
46
+ }
47
+
48
+ /** @private **/
49
+ function createConditionClause(conditions, operator, depth) {
50
+ if (_.isString(conditions)) {
51
+ return conditions;
52
+ }
53
+ conditions = conditions || [];
54
+ operator = operator || "AND";
55
+ depth = depth || 0;
56
+ if (!isArray(conditions)) { // if passed in hash object
57
+ conditions = _.keys(conditions).map(function(key) {
58
+ return {
59
+ key: key,
60
+ value: conditions[key]
61
+ };
62
+ });
63
+ } else {
64
+ conditions = conditions.map(function(cond) {
65
+ var conds = [];
66
+ for (var key in cond) {
67
+ conds.push({
68
+ key: key,
69
+ value: cond[key]
70
+ });
71
+ }
72
+ return conds.length>1 ? conds : conds[0];
73
+ });
74
+ }
75
+ conditions = conditions.map(function(cond) {
76
+ var d = depth+1, op;
77
+ switch (cond.key) {
78
+ case "$or" :
79
+ case "$and" :
80
+ case "$not" :
81
+ if (operator !== "NOT" && conditions.length === 1) {
82
+ d = depth; // not change tree depth
83
+ }
84
+ op = cond.key === "$or" ? "OR" :
85
+ cond.key === "$and" ? "AND" :
86
+ "NOT";
87
+ return createConditionClause(cond.value, op, d);
88
+ default:
89
+ return createFieldExpression(cond.key, cond.value);
90
+ }
91
+ }).filter(function(expr) { return expr; });
92
+
93
+ var paren;
94
+ if (operator === 'NOT') {
95
+ paren = depth > 0;
96
+ return (paren ? "(" : "") + "NOT " + conditions[0] + (paren ? ")" : "");
97
+ } else {
98
+ paren = depth > 0 && conditions.length > 1;
99
+ return (paren ? "(" : "") + conditions.join(" "+operator+" ") + (paren ? ")" : "");
100
+ }
101
+ }
102
+
103
+ var opMap = {
104
+ "=" : "=",
105
+ "$eq" : "=",
106
+ "!=" : "!=",
107
+ "$ne" : "!=",
108
+ ">" : ">",
109
+ "$gt" : ">",
110
+ "<" : "<",
111
+ "$lt" : "<",
112
+ ">=" : ">=",
113
+ "$gte" : ">=",
114
+ "<=" : "<=",
115
+ "$lte" : "<=",
116
+ "$like" : "LIKE",
117
+ "$nlike" : "NOT LIKE",
118
+ "$in" : "IN",
119
+ "$nin" : "NOT IN",
120
+ "$includes" : "INCLUDES",
121
+ "$excludes" : "EXCLUDES",
122
+ "$exists" : "EXISTS"
123
+ };
124
+
125
+ /** @private **/
126
+ function createFieldExpression(field, value) {
127
+ // Assume the `$in` operator if value is an array and none was supplied.
128
+ if (_.isArray(value)) {
129
+ return createOpExpression(field, "$in", value);
130
+ }
131
+ // Otherwise, if an object was passed then process the supplied ops.
132
+ else if (_.isObject(value)) {
133
+ var expressions = _.map(value, function (v, k) {
134
+ if (k[0] === "$") return createOpExpression(field, k, v);
135
+ });
136
+ return expressions.join(' AND ');
137
+ }
138
+ // If the value is a scalar, it's an equality condition.
139
+ else return createOpExpression(field, "$eq", value);
140
+ }
141
+
142
+ /** @private **/
143
+ function createOpExpression(field, op, value) {
144
+ var sfop = opMap[op];
145
+ if (!sfop || _.isUndefined(value)) { return null; }
146
+ var valueExpr = createValueExpression(value);
147
+ if (_.isUndefined(valueExpr)) { return null; }
148
+ switch (sfop) {
149
+ case "NOT LIKE":
150
+ return "(" + [ "NOT", field, 'LIKE', valueExpr ].join(" ") + ")";
151
+ case "EXISTS":
152
+ return [ field, value ? "!=" : "=", "null" ].join(" ");
153
+ default:
154
+ return [ field, sfop, valueExpr ].join(" ");
155
+ }
156
+ }
157
+
158
+ /** @private **/
159
+ function createValueExpression(value) {
160
+ if (isArray(value)) {
161
+ return value.length > 0 ?
162
+ "(" + value.map(createValueExpression).join(", ") + ")" :
163
+ undefined;
164
+ }
165
+ if (value instanceof SfDate) {
166
+ return value.toString();
167
+ }
168
+ if (_.isString(value)) {
169
+ return "'" + escapeSOQLString(value) + "'";
170
+ }
171
+ if (_.isNumber(value)) {
172
+ return (value).toString();
173
+ }
174
+ if (_.isNull(value)) {
175
+ return "null";
176
+ }
177
+ return value;
178
+ }
179
+
180
+ /** @private **/
181
+ function escapeSOQLString(str) {
182
+ return String(str || '').replace(/'/g, "\\'");
183
+ }
184
+
185
+ /** @private **/
186
+ function isArray(a) {
187
+ return _.isObject(a) && _.isFunction(a.pop);
188
+ }
189
+
190
+
191
+ /** @private **/
192
+ function createOrderByClause(sort) {
193
+ sort = sort || [];
194
+ if (_.isString(sort)) {
195
+ if (/,|\s+(asc|desc)\s*$/.test(sort)) {
196
+ // must be specified in pure "order by" clause. Return raw config.
197
+ return sort;
198
+ }
199
+ // sort order in mongoose-style expression.
200
+ // e.g. "FieldA -FieldB" => "ORDER BY FieldA ASC, FieldB DESC"
201
+ sort = sort.split(/\s+/).map(function(field) {
202
+ var dir = "ASC"; // ascending
203
+ var flag = field[0];
204
+ if (flag === '-') {
205
+ dir = "DESC";
206
+ field = field.substring(1);
207
+ } else if (flag === '+') {
208
+ field = field.substring(1);
209
+ }
210
+ return [ field, dir ];
211
+ });
212
+ } else if (!isArray(sort)) {
213
+ sort = _.keys(sort).map(function(field) {
214
+ var dir = sort[field];
215
+ return [ field, dir ];
216
+ });
217
+ }
218
+ return sort.map(function(s) {
219
+ var field = s[0], dir = s[1];
220
+ switch (String(dir)) {
221
+ case "DESC":
222
+ case "desc":
223
+ case "descending":
224
+ case "-":
225
+ case "-1":
226
+ dir = "DESC";
227
+ break;
228
+ default:
229
+ dir = "ASC";
230
+ }
231
+ return field + " " + dir;
232
+ }).join(", ");
233
+ }
234
+
235
+
236
+ exports.createSOQL = createSOQL;
@@ -0,0 +1,233 @@
1
+ /*global process, Sfdc */
2
+
3
+ 'use strict';
4
+
5
+ var inherits = require('inherits'),
6
+ Promise = require('./promise');
7
+
8
+ /* */
9
+
10
+ var request = require('request'),
11
+ canvas = require('./browser/canvas'),
12
+ jsonp = require('./browser/jsonp');
13
+
14
+ // set options if defaults setting is available in request, which is not available in xhr module.
15
+ if (request.defaults) {
16
+ var defaults = {
17
+ followAllRedirects: true
18
+ };
19
+ if (process.env.HTTP_PROXY) {
20
+ defaults.proxy = process.env.HTTP_PROXY;
21
+ }
22
+ if (parseInt(process.env.HTTP_TIMEOUT)) {
23
+ defaults.timeout = parseInt(process.env.HTTP_TIMEOUT);
24
+ }
25
+ request = request.defaults(defaults);
26
+ }
27
+
28
+ var baseUrl;
29
+ if (typeof window === 'undefined') {
30
+ baseUrl = process.env.LOCATION_BASE_URL || "";
31
+ } else {
32
+ var apiHost = normalizeApiHost(window.location.host);
33
+ baseUrl = apiHost ? "https://" + apiHost : "";
34
+ }
35
+
36
+ /**
37
+ * Add stream() method to promise (and following promise chain), to access original request stream.
38
+ * @private
39
+ */
40
+ function streamify(promise, factory) {
41
+ var _then = promise.then;
42
+ promise.then = function() {
43
+ factory();
44
+ var newPromise = _then.apply(promise, arguments);
45
+ return streamify(newPromise, factory);
46
+ };
47
+ promise.stream = factory;
48
+ return promise;
49
+ }
50
+
51
+ /**
52
+ * Normarize Salesforce API host name
53
+ * @private
54
+ */
55
+ function normalizeApiHost(apiHost) {
56
+ var m = /(\w+)\.(visual\.force|salesforce)\.com$/.exec(apiHost);
57
+ if (m) {
58
+ apiHost = m[1] + ".salesforce.com";
59
+ }
60
+ return apiHost;
61
+ }
62
+
63
+ /**
64
+ * Class for HTTP request transport
65
+ *
66
+ * @class
67
+ * @protected
68
+ */
69
+ var Transport = module.exports = function() {};
70
+
71
+ /**
72
+ * Make HTTP request, returns promise instead of stream
73
+ *
74
+ * @param {Object} params - HTTP request
75
+ * @param {Callback.<Object>} [callback] - Calback Function
76
+ * @returns {Promise.<Object>}
77
+ */
78
+ Transport.prototype.httpRequest = function(params, callback) {
79
+ var deferred = Promise.defer();
80
+ var req;
81
+ var httpRequest = this._getHttpRequestModule();
82
+ var createRequest = function() {
83
+ if (!req) {
84
+ req = httpRequest(params, function(err, response) {
85
+ if (err) {
86
+ deferred.reject(err);
87
+ } else {
88
+ deferred.resolve(response);
89
+ }
90
+ });
91
+ }
92
+ return req;
93
+ };
94
+ return streamify(deferred.promise, createRequest).thenCall(callback);
95
+ };
96
+
97
+ /** @protected **/
98
+ Transport.prototype._getHttpRequestModule = function() {
99
+ return request;
100
+ };
101
+
102
+
103
+ /**
104
+ * Class for JSONP request transport
105
+ * @class Transport~JsonpTransport
106
+ * @protected
107
+ * @extends Transport
108
+ * @param {String} jsonpParam - Callback parameter name for JSONP invokation.
109
+ */
110
+ var JsonpTransport = Transport.JsonpTransport = function(jsonpParam) {
111
+ this._jsonpParam = jsonpParam;
112
+ };
113
+
114
+ inherits(JsonpTransport, Transport);
115
+
116
+ /** @protected **/
117
+ JsonpTransport.prototype._getHttpRequestModule = function() {
118
+ return jsonp.createRequest(this._jsonpParam);
119
+ };
120
+
121
+ JsonpTransport.supported = jsonp.supported;
122
+
123
+
124
+ /**
125
+ * Class for Sfdc Canvas request transport
126
+ * @class Transport~CanvasTransport
127
+ * @protected
128
+ * @extends Transport
129
+ * @param {Object} signedRequest - Parsed signed request object
130
+ */
131
+ var CanvasTransport = Transport.CanvasTransport = function(signedRequest) {
132
+ this._signedRequest = signedRequest;
133
+ };
134
+
135
+ inherits(CanvasTransport, Transport);
136
+
137
+ /** @protected **/
138
+ CanvasTransport.prototype._getHttpRequestModule = function() {
139
+ return canvas.createRequest(this._signedRequest);
140
+ };
141
+
142
+ CanvasTransport.supported = canvas.supported;
143
+
144
+
145
+ /**
146
+ * Class for HTTP request transport using AJAX proxy service
147
+ *
148
+ * @class Transport~ProxyTransport
149
+ * @protected
150
+ * @extends Transport
151
+ * @param {String} proxyUrl - AJAX Proxy server URL
152
+ */
153
+ var ProxyTransport = Transport.ProxyTransport = function(proxyUrl) {
154
+ this._proxyUrl = proxyUrl;
155
+ };
156
+
157
+ inherits(ProxyTransport, Transport);
158
+
159
+ /**
160
+ * Make HTTP request via AJAX proxy
161
+ *
162
+ * @method Transport~ProxyTransport#httpRequest
163
+ * @param {Object} params - HTTP request
164
+ * @param {Callback.<Object>} [callback] - Calback Function
165
+ * @returns {Promise.<Object>}
166
+ */
167
+ ProxyTransport.prototype.httpRequest = function(params, callback) {
168
+ var url = params.url;
169
+ if (url.indexOf("/") === 0) {
170
+ url = baseUrl + url;
171
+ }
172
+ var proxyParams = {
173
+ method: params.method,
174
+ url: this._proxyUrl + '?' + Date.now() + "." + ("" + Math.random()).substring(2),
175
+ headers: {
176
+ 'salesforceproxy-endpoint': url
177
+ }
178
+ };
179
+ if (params.body || params.body === "") {
180
+ proxyParams.body = params.body;
181
+ }
182
+ if (params.headers) {
183
+ for (var name in params.headers) {
184
+ proxyParams.headers[name] = params.headers[name];
185
+ }
186
+ }
187
+ return ProxyTransport.super_.prototype.httpRequest.call(this, proxyParams, callback);
188
+ };
189
+
190
+
191
+ /**
192
+ * Class for HTTP request transport using a proxy server
193
+ *
194
+ * @class Transport~HttpProxyTransport
195
+ * @protected
196
+ * @extends Transport
197
+ * @param {String} httpProxy - URL of the HTTP proxy server
198
+ */
199
+ var HttpProxyTransport = Transport.HttpProxyTransport = function(httpProxy) {
200
+ this._httpProxy = httpProxy;
201
+ };
202
+
203
+ inherits(HttpProxyTransport, Transport);
204
+
205
+ /**
206
+ * Make HTTP request via proxy server
207
+ *
208
+ * @method Transport~HttpProxyTransport#httpRequest
209
+ * @param {Object} params - HTTP request
210
+ * @param {Callback.<Object>} [callback] - Callback Function
211
+ * @returns {Promise.<Object>}
212
+ */
213
+ HttpProxyTransport.prototype.httpRequest = function(params, callback) {
214
+ var url = params.url;
215
+ if (url.indexOf("/") === 0) {
216
+ url = baseUrl + url;
217
+ }
218
+ var proxyParams = {
219
+ method: params.method,
220
+ url: params.url,
221
+ proxy: this._httpProxy,
222
+ headers: {}
223
+ };
224
+ if (params.body || params.body === "") {
225
+ proxyParams.body = params.body;
226
+ }
227
+ if (params.headers) {
228
+ for (var name in params.headers) {
229
+ proxyParams.headers[name] = params.headers[name];
230
+ }
231
+ }
232
+ return HttpProxyTransport.super_.prototype.httpRequest.call(this, proxyParams, callback);
233
+ };
package/package.json ADDED
@@ -0,0 +1,110 @@
1
+ {
2
+ "author": "Shinichi Tomita <shinichi.tomita@gmail.com>",
3
+ "name": "jsforce2",
4
+ "description": "Salesforce API Library for JavaScript",
5
+ "keywords": [
6
+ "salesforce",
7
+ "salesforce.com",
8
+ "sfdc",
9
+ "force.com",
10
+ "database.com"
11
+ ],
12
+ "homepage": "http://github.com/jsforce/jsforce",
13
+ "version": "1.11.1",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git://github.com/jsforce/jsforce.git"
17
+ },
18
+ "license": "MIT",
19
+ "licenses": [
20
+ {
21
+ "type": "MIT",
22
+ "url": "http://github.com/jsforce/jsforce/raw/master/LICENSE"
23
+ }
24
+ ],
25
+ "main": "./index",
26
+ "scripts": {
27
+ "build": "gulp build",
28
+ "build:test": "gulp build:test",
29
+ "build:all": "gulp build:all",
30
+ "doc": "jsdoc lib -d doc --recurse --lenient",
31
+ "test": "npm run test:node",
32
+ "test:all": "npm run test:node && npm run test:browser",
33
+ "test:node": "mocha --retries 2 --reporter spec --require intelli-espower-loader --exit",
34
+ "test:browser": "testem",
35
+ "prepublish": "node -e \"if(process.env.npm_package_version!==require('./lib/VERSION')){console.error('The pacakge.json version is not matching to ./lib/VERSION.js');process.exit(1)}\""
36
+ },
37
+ "directories": {
38
+ "test": "test/"
39
+ },
40
+ "files": [
41
+ "README.md",
42
+ "bower.json",
43
+ "LICENSE",
44
+ "package.json",
45
+ "bin",
46
+ "build",
47
+ "lib",
48
+ "core.js",
49
+ "index.js"
50
+ ],
51
+ "engines": {
52
+ "node": ">=4.0"
53
+ },
54
+ "bin": {
55
+ "jsforce": "./bin/jsforce"
56
+ },
57
+ "dependencies": {
58
+ "base64-url": "^2.2.0",
59
+ "co-prompt": "^1.0.0",
60
+ "coffeescript": "^1.10.0",
61
+ "commander": "^2.9.0",
62
+ "csv-parse": "^4.10.1",
63
+ "csv-stringify": "^1.0.4",
64
+ "faye": "^1.4.0",
65
+ "inherits": "^2.0.1",
66
+ "lodash": "^4.17.19",
67
+ "multistream": "^2.0.5",
68
+ "opn": "^5.3.0",
69
+ "promise": "^7.1.1",
70
+ "readable-stream": "^2.1.0",
71
+ "request": "^2.72.0",
72
+ "xml2js": "^0.4.16"
73
+ },
74
+ "devDependencies": {
75
+ "archiver": "^1.3.0",
76
+ "async": "^1.5.2",
77
+ "babel": "^6.23.0",
78
+ "babel-core": "^6.26.3",
79
+ "babel-preset-env": "^1.7.0",
80
+ "babel-register": "^6.26.0",
81
+ "browserify": "^16.2.2",
82
+ "bufferutil": "^4.0.0",
83
+ "envify": "^3.4.1",
84
+ "espower-loader": "^1.2.2",
85
+ "espowerify": "^1.1.0",
86
+ "gulp": "^4.0.0",
87
+ "gulp-rename": "^1.4.0",
88
+ "gulp-sourcemaps": "^1.12.1",
89
+ "gulp-uglify": "^3.0.2",
90
+ "intelli-espower-loader": "^1.0.1",
91
+ "jsdoc": "^3.6.3",
92
+ "mocha": "^5.2.0",
93
+ "power-assert": "^1.6.0",
94
+ "puppeteer": "^1.18.1",
95
+ "require-swapper": "^0.1.7",
96
+ "testem": "^2.8.2",
97
+ "through2": "^2.0.3",
98
+ "utf-8-validate": "^5.0.1",
99
+ "vinyl-buffer": "^1.0.1",
100
+ "vinyl-source-stream": "^2.0.0"
101
+ },
102
+ "browser": {
103
+ "./index": "./lib/browser/jsforce",
104
+ "./index.js": "./lib/browser/jsforce",
105
+ "./core": "./lib/browser/core",
106
+ "./core.js": "./lib/browser/core",
107
+ "request": "./lib/browser/request.js"
108
+ },
109
+ "types": "types/index.d.ts"
110
+ }