braintrust 3.12.0 → 3.14.0
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.
- package/dev/dist/index.d.mts +31 -14
- package/dev/dist/index.d.ts +31 -14
- package/dev/dist/index.js +919 -485
- package/dev/dist/index.mjs +480 -46
- package/dist/apply-auto-instrumentation.js +204 -174
- package/dist/apply-auto-instrumentation.mjs +35 -5
- package/dist/auto-instrumentations/bundler/esbuild.cjs +226 -1
- package/dist/auto-instrumentations/bundler/esbuild.mjs +3 -2
- package/dist/auto-instrumentations/bundler/next.cjs +226 -1
- package/dist/auto-instrumentations/bundler/next.mjs +4 -3
- package/dist/auto-instrumentations/bundler/rollup.cjs +226 -1
- package/dist/auto-instrumentations/bundler/rollup.mjs +3 -2
- package/dist/auto-instrumentations/bundler/vite.cjs +226 -1
- package/dist/auto-instrumentations/bundler/vite.mjs +3 -2
- package/dist/auto-instrumentations/bundler/webpack-loader.cjs +9 -0
- package/dist/auto-instrumentations/bundler/webpack.cjs +226 -1
- package/dist/auto-instrumentations/bundler/webpack.mjs +4 -3
- package/dist/auto-instrumentations/{chunk-2DPA74KK.mjs → chunk-E5DUYJWK.mjs} +1 -0
- package/dist/auto-instrumentations/chunk-J57YF7WS.mjs +208 -0
- package/dist/auto-instrumentations/{chunk-AFXRW7I7.mjs → chunk-OTUQ7KH5.mjs} +1 -1
- package/dist/auto-instrumentations/chunk-QFMACSOL.mjs +280 -0
- package/dist/auto-instrumentations/{chunk-73BZUKVI.mjs → chunk-XKAAVWT6.mjs} +24 -2
- package/dist/auto-instrumentations/hook.mjs +7981 -7
- package/dist/auto-instrumentations/index.cjs +1 -0
- package/dist/auto-instrumentations/index.mjs +1 -1
- package/dist/auto-instrumentations/loader/cjs-patch.cjs +194 -4
- package/dist/auto-instrumentations/loader/cjs-patch.mjs +13 -27
- package/dist/auto-instrumentations/loader/esm-hook.mjs +24 -10
- package/dist/browser.d.mts +274 -30
- package/dist/browser.d.ts +274 -30
- package/dist/browser.js +407 -48
- package/dist/browser.mjs +407 -48
- package/dist/{chunk-BW4DF4CY.js → chunk-NKD77KGB.js} +180 -1
- package/dist/{chunk-MSLBGITU.mjs → chunk-NU2GSPHX.mjs} +180 -1
- package/dist/cli.js +494 -94
- package/dist/edge-light.d.mts +1 -1
- package/dist/edge-light.d.ts +1 -1
- package/dist/edge-light.js +407 -48
- package/dist/edge-light.mjs +407 -48
- package/dist/index.d.mts +274 -30
- package/dist/index.d.ts +274 -30
- package/dist/index.js +1267 -857
- package/dist/index.mjs +465 -55
- package/dist/instrumentation/index.d.mts +47 -11
- package/dist/instrumentation/index.d.ts +47 -11
- package/dist/instrumentation/index.js +116 -26
- package/dist/instrumentation/index.mjs +116 -26
- package/dist/workerd.d.mts +1 -1
- package/dist/workerd.d.ts +1 -1
- package/dist/workerd.js +407 -48
- package/dist/workerd.mjs +407 -48
- package/package.json +3 -23
- package/util/dist/index.d.mts +3 -1
- package/util/dist/index.d.ts +3 -1
- package/dist/auto-instrumentations/chunk-MWZXZQUO.mjs +0 -81
|
@@ -126,6 +126,7 @@ var iso = {
|
|
|
126
126
|
getRepoInfo: async (_settings) => void 0,
|
|
127
127
|
getPastNAncestors: async () => [],
|
|
128
128
|
getEnv: (_name) => void 0,
|
|
129
|
+
getBraintrustApiKey: async () => void 0,
|
|
129
130
|
getCallerLocation: () => void 0,
|
|
130
131
|
newAsyncLocalStorage: () => new DefaultAsyncLocalStorage(),
|
|
131
132
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -93,6 +93,175 @@ function getPackageName(baseDir) {
|
|
|
93
93
|
return void 0;
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
+
// src/auto-instrumentations/loader/mastra-observability-patch.ts
|
|
97
|
+
var MASTRA_EXPORTER_FACTORY_GLOBAL = "__braintrustMastraExporterFactory";
|
|
98
|
+
var MASTRA_CORE_PACKAGE = "@mastra/core";
|
|
99
|
+
var MASTRA_OBSERVABILITY_PACKAGE = "@mastra/observability";
|
|
100
|
+
var MASTRA_CORE_ENTRY_PATHS = /* @__PURE__ */ new Set([
|
|
101
|
+
"dist/index.js",
|
|
102
|
+
"dist/index.cjs",
|
|
103
|
+
"dist/mastra/index.js",
|
|
104
|
+
"dist/mastra/index.cjs"
|
|
105
|
+
]);
|
|
106
|
+
var MASTRA_OBSERVABILITY_ENTRY_PATHS = /* @__PURE__ */ new Set([
|
|
107
|
+
"dist/index.js",
|
|
108
|
+
"dist/index.cjs"
|
|
109
|
+
]);
|
|
110
|
+
function classifyMastraTarget(packageName, modulePath) {
|
|
111
|
+
if (packageName === MASTRA_CORE_PACKAGE && MASTRA_CORE_ENTRY_PATHS.has(modulePath)) {
|
|
112
|
+
return "core";
|
|
113
|
+
}
|
|
114
|
+
if (packageName === MASTRA_OBSERVABILITY_PACKAGE && MASTRA_OBSERVABILITY_ENTRY_PATHS.has(modulePath)) {
|
|
115
|
+
return "observability";
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
function extractChunkPath(source) {
|
|
120
|
+
const esmMatch = source.match(
|
|
121
|
+
/export\s*\{\s*Mastra(?:\s+as\s+\w+)?\s*\}\s*from\s*['"]([^'"]+)['"]/
|
|
122
|
+
);
|
|
123
|
+
if (esmMatch) return esmMatch[1];
|
|
124
|
+
const cjsMatch = source.match(
|
|
125
|
+
/require\s*\(\s*['"]([^'"]+chunk-[^'"]+)['"]\s*\)/
|
|
126
|
+
);
|
|
127
|
+
if (cjsMatch) return cjsMatch[1];
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
var EXPORTER_FACTORY_KEY = JSON.stringify(MASTRA_EXPORTER_FACTORY_GLOBAL);
|
|
131
|
+
var MASTRA_PROXY_HANDLER_BODY = `
|
|
132
|
+
{
|
|
133
|
+
construct(target, args, newTarget) {
|
|
134
|
+
var firstArg = args[0];
|
|
135
|
+
if (
|
|
136
|
+
(!firstArg || typeof firstArg !== "object" || !firstArg.observability) &&
|
|
137
|
+
__braintrustObservabilityClass
|
|
138
|
+
) {
|
|
139
|
+
try {
|
|
140
|
+
// serviceName is required by Mastra's Observability validator; pass
|
|
141
|
+
// something sensible by default. Users who want a different name
|
|
142
|
+
// should construct Observability themselves.
|
|
143
|
+
var observability = new __braintrustObservabilityClass({
|
|
144
|
+
configs: { default: { serviceName: "mastra" } },
|
|
145
|
+
});
|
|
146
|
+
args = args.slice();
|
|
147
|
+
args[0] = Object.assign({}, firstArg, { observability: observability });
|
|
148
|
+
} catch (e) {
|
|
149
|
+
// Fall through. Mastra will use its own NoOp; user code still works,
|
|
150
|
+
// just without auto-instrumentation.
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return Reflect.construct(target, args, newTarget);
|
|
154
|
+
},
|
|
155
|
+
}`;
|
|
156
|
+
function buildMastraEsmWrapper(chunkPath) {
|
|
157
|
+
const chunk = JSON.stringify(chunkPath);
|
|
158
|
+
return `import { Mastra as __braintrustOrigMastra } from ${chunk};
|
|
159
|
+
import { createRequire as __braintrustCreateRequire } from "node:module";
|
|
160
|
+
|
|
161
|
+
let __braintrustObservabilityClass = null;
|
|
162
|
+
try {
|
|
163
|
+
// Resolve @mastra/observability relative to this module (the Mastra entry),
|
|
164
|
+
// so it's looked up from the user's node_modules tree.
|
|
165
|
+
const __braintrustRequire = __braintrustCreateRequire(import.meta.url);
|
|
166
|
+
__braintrustObservabilityClass =
|
|
167
|
+
__braintrustRequire("@mastra/observability").Observability;
|
|
168
|
+
} catch (e) {
|
|
169
|
+
// @mastra/observability isn't installed; the construct trap will skip the
|
|
170
|
+
// auto-construct branch and Mastra falls back to its own NoOp.
|
|
171
|
+
}
|
|
172
|
+
const Mastra = new Proxy(__braintrustOrigMastra, ${MASTRA_PROXY_HANDLER_BODY});
|
|
173
|
+
export { Mastra };
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
function buildMastraCjsWrapper(chunkPath) {
|
|
177
|
+
const chunk = JSON.stringify(chunkPath);
|
|
178
|
+
return `'use strict';
|
|
179
|
+
const __braintrustChunk = require(${chunk});
|
|
180
|
+
|
|
181
|
+
let __braintrustObservabilityClass = null;
|
|
182
|
+
try {
|
|
183
|
+
__braintrustObservabilityClass = require("@mastra/observability").Observability;
|
|
184
|
+
} catch (e) {
|
|
185
|
+
// @mastra/observability isn't installed; same fallback as the ESM wrapper.
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const __braintrustWrappedMastra = new Proxy(
|
|
189
|
+
__braintrustChunk.Mastra,
|
|
190
|
+
${MASTRA_PROXY_HANDLER_BODY},
|
|
191
|
+
);
|
|
192
|
+
Object.defineProperty(exports, "Mastra", {
|
|
193
|
+
enumerable: true,
|
|
194
|
+
configurable: true,
|
|
195
|
+
get: function () { return __braintrustWrappedMastra; }
|
|
196
|
+
});
|
|
197
|
+
`;
|
|
198
|
+
}
|
|
199
|
+
var OBSERVABILITY_APPEND_BODY = `
|
|
200
|
+
;(function __braintrustWrapObservability() {
|
|
201
|
+
// Top-level so we can both read and reassign the var binding the original
|
|
202
|
+
// entry declared.
|
|
203
|
+
if (typeof Observability === "undefined") return;
|
|
204
|
+
if (Observability.__braintrustWrapped) return;
|
|
205
|
+
function __braintrustEnsureExporter(rawConfig) {
|
|
206
|
+
try {
|
|
207
|
+
var factory = globalThis[${EXPORTER_FACTORY_KEY}];
|
|
208
|
+
if (typeof factory !== "function") return rawConfig;
|
|
209
|
+
var config = rawConfig && typeof rawConfig === "object" ? rawConfig : {};
|
|
210
|
+
var configsIn = config.configs && typeof config.configs === "object" ? config.configs : null;
|
|
211
|
+
var configsOut = {};
|
|
212
|
+
var hadEntries = false;
|
|
213
|
+
if (configsIn) {
|
|
214
|
+
for (var name in configsIn) {
|
|
215
|
+
if (!Object.prototype.hasOwnProperty.call(configsIn, name)) continue;
|
|
216
|
+
hadEntries = true;
|
|
217
|
+
var inst = configsIn[name] || {};
|
|
218
|
+
var existing = Array.isArray(inst.exporters) ? inst.exporters : [];
|
|
219
|
+
var hasOurs = existing.some(function (e) { return e && e.name === "braintrust"; });
|
|
220
|
+
configsOut[name] = Object.assign({}, inst, {
|
|
221
|
+
exporters: hasOurs ? existing : existing.concat([factory()]),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (!hadEntries) {
|
|
226
|
+
configsOut.default = {
|
|
227
|
+
serviceName: "mastra",
|
|
228
|
+
exporters: [factory()],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return Object.assign({}, config, { configs: configsOut });
|
|
232
|
+
} catch (e) {
|
|
233
|
+
return rawConfig;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
var __OriginalObservability = Observability;
|
|
237
|
+
Observability = new Proxy(__OriginalObservability, {
|
|
238
|
+
construct: function (target, args, newTarget) {
|
|
239
|
+
var nextArgs = args.slice();
|
|
240
|
+
nextArgs[0] = __braintrustEnsureExporter(nextArgs[0]);
|
|
241
|
+
return Reflect.construct(target, nextArgs, newTarget);
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
Observability.__braintrustWrapped = true;
|
|
245
|
+
if (typeof exports !== "undefined" && exports && typeof exports === "object") {
|
|
246
|
+
try {
|
|
247
|
+
Object.defineProperty(exports, "Observability", {
|
|
248
|
+
enumerable: true,
|
|
249
|
+
configurable: true,
|
|
250
|
+
get: function () { return Observability; },
|
|
251
|
+
});
|
|
252
|
+
} catch (e) {}
|
|
253
|
+
}
|
|
254
|
+
})();
|
|
255
|
+
`;
|
|
256
|
+
function patchMastraSource(source, target, format) {
|
|
257
|
+
if (target === "core") {
|
|
258
|
+
const chunkPath = extractChunkPath(source);
|
|
259
|
+
if (!chunkPath) return source;
|
|
260
|
+
return format === "esm" ? buildMastraEsmWrapper(chunkPath) : buildMastraCjsWrapper(chunkPath);
|
|
261
|
+
}
|
|
262
|
+
return source + OBSERVABILITY_APPEND_BODY;
|
|
263
|
+
}
|
|
264
|
+
|
|
96
265
|
// src/auto-instrumentations/loader/openai-api-promise-patch.ts
|
|
97
266
|
var OPENAI_API_PROMISE_PATCH = `
|
|
98
267
|
;(function __btPatchAPIPromise() {
|
|
@@ -114,6 +283,21 @@ var OPENAI_API_PROMISE_PATCH = `
|
|
|
114
283
|
})();
|
|
115
284
|
`;
|
|
116
285
|
|
|
286
|
+
// src/auto-instrumentations/loader/special-case-patches.ts
|
|
287
|
+
function applySpecialCasePatch(input) {
|
|
288
|
+
if (input.packageName === "openai" && input.modulePath.includes("api-promise")) {
|
|
289
|
+
return input.source + OPENAI_API_PROMISE_PATCH;
|
|
290
|
+
}
|
|
291
|
+
const mastraTarget = classifyMastraTarget(
|
|
292
|
+
input.packageName,
|
|
293
|
+
input.modulePath
|
|
294
|
+
);
|
|
295
|
+
if (mastraTarget) {
|
|
296
|
+
return patchMastraSource(input.source, mastraTarget, input.format);
|
|
297
|
+
}
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
|
|
117
301
|
// src/auto-instrumentations/loader/cjs-patch.ts
|
|
118
302
|
var ModulePatch = class {
|
|
119
303
|
packages;
|
|
@@ -142,12 +326,18 @@ var ModulePatch = class {
|
|
|
142
326
|
const resolvedModule = (0, import_module_details_from_path.default)(normalizedForPlatform);
|
|
143
327
|
if (resolvedModule) {
|
|
144
328
|
const packageName = getPackageName(resolvedModule.basedir) ?? resolvedModule.name;
|
|
145
|
-
|
|
329
|
+
const normalizedModulePath = resolvedModule.path.replace(/\\/g, "/");
|
|
330
|
+
const patched = applySpecialCasePatch({
|
|
331
|
+
packageName,
|
|
332
|
+
modulePath: normalizedModulePath,
|
|
333
|
+
source: String(content),
|
|
334
|
+
format: "cjs"
|
|
335
|
+
});
|
|
336
|
+
if (patched !== null) {
|
|
337
|
+
args[0] = patched;
|
|
146
338
|
return self.originalCompile.apply(this, args);
|
|
147
339
|
}
|
|
148
|
-
|
|
149
|
-
if (packageName === "openai" && normalizedModulePath.includes("api-promise")) {
|
|
150
|
-
args[0] = content + OPENAI_API_PROMISE_PATCH;
|
|
340
|
+
if (!self.packages.has(packageName)) {
|
|
151
341
|
return self.originalCompile.apply(this, args);
|
|
152
342
|
}
|
|
153
343
|
const version = getPackageVersion(resolvedModule.basedir);
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applySpecialCasePatch
|
|
3
|
+
} from "../chunk-J57YF7WS.mjs";
|
|
1
4
|
import {
|
|
2
5
|
getPackageName,
|
|
3
6
|
getPackageVersion
|
|
@@ -10,29 +13,6 @@ import {
|
|
|
10
13
|
import * as NodeModule from "module";
|
|
11
14
|
import { sep } from "path";
|
|
12
15
|
import moduleDetailsFromPath from "module-details-from-path";
|
|
13
|
-
|
|
14
|
-
// src/auto-instrumentations/loader/openai-api-promise-patch.ts
|
|
15
|
-
var OPENAI_API_PROMISE_PATCH = `
|
|
16
|
-
;(function __btPatchAPIPromise() {
|
|
17
|
-
if (typeof APIPromise === "undefined" || APIPromise.prototype.__btParsePatched) return;
|
|
18
|
-
APIPromise.prototype.__btParsePatched = true;
|
|
19
|
-
var _origThen = APIPromise.prototype.then;
|
|
20
|
-
APIPromise.prototype.then = function __btThen(onfulfilled, onrejected) {
|
|
21
|
-
if (!this.__btParseWrapped && Object.prototype.hasOwnProperty.call(this, "parseResponse")) {
|
|
22
|
-
this.__btParseWrapped = true;
|
|
23
|
-
var _origParse = this.parseResponse;
|
|
24
|
-
var _cached;
|
|
25
|
-
this.parseResponse = function() {
|
|
26
|
-
if (!_cached) _cached = _origParse.apply(this, arguments);
|
|
27
|
-
return _cached;
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
return _origThen.call(this, onfulfilled, onrejected);
|
|
31
|
-
};
|
|
32
|
-
})();
|
|
33
|
-
`;
|
|
34
|
-
|
|
35
|
-
// src/auto-instrumentations/loader/cjs-patch.ts
|
|
36
16
|
var ModulePatch = class {
|
|
37
17
|
packages;
|
|
38
18
|
instrumentator;
|
|
@@ -60,12 +40,18 @@ var ModulePatch = class {
|
|
|
60
40
|
const resolvedModule = moduleDetailsFromPath(normalizedForPlatform);
|
|
61
41
|
if (resolvedModule) {
|
|
62
42
|
const packageName = getPackageName(resolvedModule.basedir) ?? resolvedModule.name;
|
|
63
|
-
|
|
43
|
+
const normalizedModulePath = resolvedModule.path.replace(/\\/g, "/");
|
|
44
|
+
const patched = applySpecialCasePatch({
|
|
45
|
+
packageName,
|
|
46
|
+
modulePath: normalizedModulePath,
|
|
47
|
+
source: String(content),
|
|
48
|
+
format: "cjs"
|
|
49
|
+
});
|
|
50
|
+
if (patched !== null) {
|
|
51
|
+
args[0] = patched;
|
|
64
52
|
return self.originalCompile.apply(this, args);
|
|
65
53
|
}
|
|
66
|
-
|
|
67
|
-
if (packageName === "openai" && normalizedModulePath.includes("api-promise")) {
|
|
68
|
-
args[0] = content + OPENAI_API_PROMISE_PATCH;
|
|
54
|
+
if (!self.packages.has(packageName)) {
|
|
69
55
|
return self.originalCompile.apply(this, args);
|
|
70
56
|
}
|
|
71
57
|
const version = getPackageVersion(resolvedModule.basedir);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
applySpecialCasePatch,
|
|
3
3
|
getPackageName,
|
|
4
|
-
getPackageVersion
|
|
5
|
-
|
|
4
|
+
getPackageVersion,
|
|
5
|
+
isSpecialCaseTarget
|
|
6
|
+
} from "../chunk-QFMACSOL.mjs";
|
|
6
7
|
|
|
7
8
|
// src/auto-instrumentations/loader/esm-hook.mts
|
|
8
9
|
import { readFile } from "fs/promises";
|
|
@@ -15,6 +16,7 @@ import moduleDetailsFromPath from "module-details-from-path";
|
|
|
15
16
|
var instrumentator;
|
|
16
17
|
var packages;
|
|
17
18
|
var transformers = /* @__PURE__ */ new Map();
|
|
19
|
+
var specialCaseUrls = /* @__PURE__ */ new Map();
|
|
18
20
|
function getModuleType(url, format) {
|
|
19
21
|
if (format === "module") {
|
|
20
22
|
return "esm";
|
|
@@ -44,11 +46,17 @@ async function resolve(specifier, context, nextResolve) {
|
|
|
44
46
|
const resolvedModule = moduleDetailsFromPath(normalizedForPlatform);
|
|
45
47
|
if (resolvedModule) {
|
|
46
48
|
const packageName = getPackageName(resolvedModule.basedir) ?? resolvedModule.name;
|
|
49
|
+
const normalizedModulePath = resolvedModule.path.replace(/\\/g, "/");
|
|
50
|
+
if (isSpecialCaseTarget(packageName, normalizedModulePath)) {
|
|
51
|
+
specialCaseUrls.set(url.url, {
|
|
52
|
+
packageName,
|
|
53
|
+
modulePath: normalizedModulePath
|
|
54
|
+
});
|
|
55
|
+
}
|
|
47
56
|
if (!packages?.has(packageName)) {
|
|
48
57
|
return url;
|
|
49
58
|
}
|
|
50
59
|
const version = getPackageVersion(resolvedModule.basedir);
|
|
51
|
-
const normalizedModulePath = resolvedModule.path.replace(/\\/g, "/");
|
|
52
60
|
const transformer = instrumentator.getTransformer(
|
|
53
61
|
packageName,
|
|
54
62
|
version,
|
|
@@ -60,19 +68,25 @@ async function resolve(specifier, context, nextResolve) {
|
|
|
60
68
|
}
|
|
61
69
|
return url;
|
|
62
70
|
}
|
|
63
|
-
function isOpenAIApiPromise(url) {
|
|
64
|
-
return url.includes("/openai") && url.includes("api-promise");
|
|
65
|
-
}
|
|
66
71
|
async function load(url, context, nextLoad) {
|
|
67
72
|
const result = await nextLoad(url, context);
|
|
68
|
-
|
|
73
|
+
const specialCase = specialCaseUrls.get(url);
|
|
74
|
+
if (specialCase) {
|
|
69
75
|
if (result.format === "commonjs") {
|
|
70
76
|
const parsedUrl = new URL(result.responseURL ?? url);
|
|
71
77
|
result.source ??= await readFile(parsedUrl);
|
|
72
78
|
}
|
|
73
79
|
if (result.source) {
|
|
74
|
-
|
|
75
|
-
|
|
80
|
+
const patched = applySpecialCasePatch({
|
|
81
|
+
packageName: specialCase.packageName,
|
|
82
|
+
modulePath: specialCase.modulePath,
|
|
83
|
+
source: result.source.toString("utf8"),
|
|
84
|
+
format: result.format === "commonjs" ? "cjs" : "esm"
|
|
85
|
+
});
|
|
86
|
+
if (patched !== null) {
|
|
87
|
+
result.source = patched;
|
|
88
|
+
result.shortCircuit = true;
|
|
89
|
+
}
|
|
76
90
|
}
|
|
77
91
|
return result;
|
|
78
92
|
}
|