@langchain/core 1.1.18 → 1.1.20
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/CHANGELOG.md +12 -0
- package/dist/caches/index.d.cts.map +1 -1
- package/dist/callbacks/base.cjs.map +1 -1
- package/dist/callbacks/base.d.cts.map +1 -1
- package/dist/callbacks/base.js.map +1 -1
- package/dist/documents/document.cjs.map +1 -1
- package/dist/documents/document.js.map +1 -1
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.js.map +1 -1
- package/dist/language_models/base.cjs.map +1 -1
- package/dist/language_models/base.js.map +1 -1
- package/dist/language_models/chat_models.d.cts.map +1 -1
- package/dist/load/serializable.cjs.map +1 -1
- package/dist/load/serializable.js.map +1 -1
- package/dist/memory.d.cts.map +1 -1
- package/dist/messages/ai.cjs.map +1 -1
- package/dist/messages/ai.js.map +1 -1
- package/dist/messages/base.cjs.map +1 -1
- package/dist/messages/base.js.map +1 -1
- package/dist/messages/content/tools.cjs.map +1 -1
- package/dist/messages/content/tools.js.map +1 -1
- package/dist/messages/function.cjs.map +1 -1
- package/dist/messages/function.js.map +1 -1
- package/dist/messages/message.cjs.map +1 -1
- package/dist/messages/message.js.map +1 -1
- package/dist/output_parsers/structured.cjs.map +1 -1
- package/dist/output_parsers/structured.js.map +1 -1
- package/dist/output_parsers/xml.cjs.map +1 -1
- package/dist/output_parsers/xml.js.map +1 -1
- package/dist/prompts/base.cjs.map +1 -1
- package/dist/prompts/base.js.map +1 -1
- package/dist/prompts/chat.cjs.map +1 -1
- package/dist/prompts/chat.js.map +1 -1
- package/dist/prompts/few_shot.cjs.map +1 -1
- package/dist/prompts/few_shot.js.map +1 -1
- package/dist/prompts/prompt.cjs.map +1 -1
- package/dist/prompts/prompt.js.map +1 -1
- package/dist/prompts/structured.cjs.map +1 -1
- package/dist/prompts/structured.js.map +1 -1
- package/dist/retrievers/index.cjs.map +1 -1
- package/dist/retrievers/index.js.map +1 -1
- package/dist/runnables/base.cjs.map +1 -1
- package/dist/runnables/base.js.map +1 -1
- package/dist/runnables/history.cjs.map +1 -1
- package/dist/runnables/history.js.map +1 -1
- package/dist/stores.d.ts.map +1 -1
- package/dist/tools/index.cjs +1 -1
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.cjs.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tracers/event_stream.cjs.map +1 -1
- package/dist/tracers/event_stream.js.map +1 -1
- package/dist/tracers/log_stream.cjs.map +1 -1
- package/dist/tracers/log_stream.js.map +1 -1
- package/dist/utils/async_caller.cjs +1 -1
- package/dist/utils/async_caller.cjs.map +1 -1
- package/dist/utils/async_caller.js +1 -1
- package/dist/utils/async_caller.js.map +1 -1
- package/dist/utils/fast-json-patch/src/core.cjs +3 -10
- package/dist/utils/fast-json-patch/src/core.cjs.map +1 -1
- package/dist/utils/fast-json-patch/src/core.js +3 -10
- package/dist/utils/fast-json-patch/src/core.js.map +1 -1
- package/dist/utils/signal.cjs +1 -1
- package/dist/utils/signal.cjs.map +1 -1
- package/dist/utils/signal.js +1 -1
- package/dist/utils/signal.js.map +1 -1
- package/dist/utils/stream.cjs.map +1 -1
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/testing/chat_models.cjs.map +1 -1
- package/dist/utils/testing/chat_models.js.map +1 -1
- package/dist/utils/testing/tools.cjs.map +1 -1
- package/dist/utils/testing/tools.js.map +1 -1
- package/dist/vectorstores.cjs.map +1 -1
- package/dist/vectorstores.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","names":["key: string | number","document: any","pointer: string","document: T","operation: Operation","validateOperation: boolean | Validator<T>","mutateDocument: boolean","banPrototypeModifications: boolean","index: number","returnValue: OperationResult<T>","patch: ReadonlyArray<Operation>","validateOperation?: boolean | Validator<T>","operationResult: OperationResult<T>","document?: any","existingPathFragment?: string","existingValue: any","sequence: ReadonlyArray<Operation>","document?: T","externalValidator?: Validator<T>","a: any","b: any"],"sources":["../../../../src/utils/fast-json-patch/src/core.ts"],"sourcesContent":["// @ts-nocheck\n\n// Inlined because of ESM import issues\n\n/*!\n * https://github.com/Starcounter-Jack/JSON-Patch\n * (c) 2013-2021 Joachim Wester\n * MIT license\n */\ndeclare var require: any;\n\nimport {\n PatchError,\n _deepClone,\n isInteger,\n unescapePathComponent,\n hasUndefined,\n} from \"./helpers.js\";\n\nexport const JsonPatchError = PatchError;\nexport const deepClone = _deepClone;\n\nexport type Operation =\n | AddOperation<any>\n | RemoveOperation\n | ReplaceOperation<any>\n | MoveOperation\n | CopyOperation\n | TestOperation<any>\n | GetOperation<any>;\n\nexport interface Validator<T> {\n (\n operation: Operation,\n index: number,\n document: T,\n existingPathFragment: string\n ): void;\n}\n\nexport interface OperationResult<T> {\n removed?: any;\n test?: boolean;\n newDocument: T;\n}\n\nexport interface BaseOperation {\n path: string;\n}\n\nexport interface AddOperation<T> extends BaseOperation {\n op: \"add\";\n value: T;\n}\n\nexport interface RemoveOperation extends BaseOperation {\n op: \"remove\";\n}\n\nexport interface ReplaceOperation<T> extends BaseOperation {\n op: \"replace\";\n value: T;\n}\n\nexport interface MoveOperation extends BaseOperation {\n op: \"move\";\n from: string;\n}\n\nexport interface CopyOperation extends BaseOperation {\n op: \"copy\";\n from: string;\n}\n\nexport interface TestOperation<T> extends BaseOperation {\n op: \"test\";\n value: T;\n}\n\nexport interface GetOperation<T> extends BaseOperation {\n op: \"_get\";\n value: T;\n}\nexport interface PatchResult<T> extends Array<OperationResult<T>> {\n newDocument: T;\n}\n\n/* We use a Javascript hash to store each\n function. Each hash entry (property) uses\n the operation identifiers specified in rfc6902.\n In this way, we can map each patch operation\n to its dedicated function in efficient way.\n */\n\n/**\n * Check if a key is a dangerous prototype property that could lead to prototype pollution.\n * This provides defense-in-depth alongside the check in applyOperation.\n */\nfunction isDangerousKey(key: string | number): boolean {\n return Object.getOwnPropertyNames(Object.prototype).includes(key);\n}\n\n/* The operations applicable to an object */\nconst objOps = {\n add: function (obj, key, document) {\n if (isDangerousKey(key)) {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__`, `constructor`, or `prototype` prop is banned for security reasons\"\n );\n }\n obj[key] = this.value;\n return { newDocument: document };\n },\n remove: function (obj, key, document) {\n if (isDangerousKey(key)) {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__`, `constructor`, or `prototype` prop is banned for security reasons\"\n );\n }\n var removed = obj[key];\n delete obj[key];\n return { newDocument: document, removed };\n },\n replace: function (obj, key, document) {\n if (isDangerousKey(key)) {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__`, `constructor`, or `prototype` prop is banned for security reasons\"\n );\n }\n var removed = obj[key];\n obj[key] = this.value;\n return { newDocument: document, removed };\n },\n move: function (obj, key, document) {\n /* in case move target overwrites an existing value,\n return the removed value, this can be taxing performance-wise,\n and is potentially unneeded */\n let removed = getValueByPointer(document, this.path);\n\n if (removed) {\n removed = _deepClone(removed);\n }\n\n const originalValue = applyOperation(document, {\n op: \"remove\",\n path: this.from,\n }).removed;\n\n applyOperation(document, {\n op: \"add\",\n path: this.path,\n value: originalValue,\n });\n\n return { newDocument: document, removed };\n },\n copy: function (obj, key, document) {\n const valueToCopy = getValueByPointer(document, this.from);\n // enforce copy by value so further operations don't affect source (see issue #177)\n applyOperation(document, {\n op: \"add\",\n path: this.path,\n value: _deepClone(valueToCopy),\n });\n return { newDocument: document };\n },\n test: function (obj, key, document) {\n return { newDocument: document, test: _areEquals(obj[key], this.value) };\n },\n _get: function (obj, key, document) {\n this.value = obj[key];\n return { newDocument: document };\n },\n};\n\n/* The operations applicable to an array. Many are the same as for the object */\nvar arrOps = {\n add: function (arr, i, document) {\n if (isInteger(i)) {\n arr.splice(i, 0, this.value);\n } else {\n // array props\n arr[i] = this.value;\n }\n // this may be needed when using '-' in an array\n return { newDocument: document, index: i };\n },\n remove: function (arr, i, document) {\n var removedList = arr.splice(i, 1);\n return { newDocument: document, removed: removedList[0] };\n },\n replace: function (arr, i, document) {\n var removed = arr[i];\n arr[i] = this.value;\n return { newDocument: document, removed };\n },\n move: objOps.move,\n copy: objOps.copy,\n test: objOps.test,\n _get: objOps._get,\n};\n\n/**\n * Retrieves a value from a JSON document by a JSON pointer.\n * Returns the value.\n *\n * @param document The document to get the value from\n * @param pointer an escaped JSON pointer\n * @return The retrieved value\n */\nexport function getValueByPointer(document: any, pointer: string): any {\n if (pointer == \"\") {\n return document;\n }\n var getOriginalDestination = <GetOperation<any>>{ op: \"_get\", path: pointer };\n applyOperation(document, getOriginalDestination);\n return getOriginalDestination.value;\n}\n/**\n * Apply a single JSON Patch Operation on a JSON document.\n * Returns the {newDocument, result} of the operation.\n * It modifies the `document` and `operation` objects - it gets the values by reference.\n * If you would like to avoid touching your values, clone them:\n * `jsonpatch.applyOperation(document, jsonpatch._deepClone(operation))`.\n *\n * @param document The document to patch\n * @param operation The operation to apply\n * @param validateOperation `false` is without validation, `true` to use default jsonpatch's validation, or you can pass a `validateOperation` callback to be used for validation.\n * @param mutateDocument Whether to mutate the original document or clone it before applying\n * @param banPrototypeModifications Whether to ban modifications to `__proto__`, defaults to `true`.\n * @return `{newDocument, result}` after the operation\n */\nexport function applyOperation<T>(\n document: T,\n operation: Operation,\n validateOperation: boolean | Validator<T> = false,\n mutateDocument: boolean = true,\n banPrototypeModifications: boolean = true,\n index: number = 0\n): OperationResult<T> {\n if (validateOperation) {\n if (typeof validateOperation == \"function\") {\n validateOperation(operation, 0, document, operation.path);\n } else {\n validator(operation, 0);\n }\n }\n /* ROOT OPERATIONS */\n if (operation.path === \"\") {\n let returnValue: OperationResult<T> = { newDocument: document };\n if (operation.op === \"add\") {\n returnValue.newDocument = operation.value;\n return returnValue;\n } else if (operation.op === \"replace\") {\n returnValue.newDocument = operation.value;\n returnValue.removed = document; //document we removed\n return returnValue;\n } else if (operation.op === \"move\" || operation.op === \"copy\") {\n // it's a move or copy to root\n returnValue.newDocument = getValueByPointer(document, operation.from); // get the value by json-pointer in `from` field\n if (operation.op === \"move\") {\n // report removed item\n returnValue.removed = document;\n }\n return returnValue;\n } else if (operation.op === \"test\") {\n returnValue.test = _areEquals(document, operation.value);\n if (returnValue.test === false) {\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n returnValue.newDocument = document;\n return returnValue;\n } else if (operation.op === \"remove\") {\n // a remove on root\n returnValue.removed = document;\n returnValue.newDocument = null;\n return returnValue;\n } else if (operation.op === \"_get\") {\n operation.value = document;\n return returnValue;\n } else {\n /* bad operation */\n if (validateOperation) {\n throw new JsonPatchError(\n \"Operation `op` property is not one of operations defined in RFC-6902\",\n \"OPERATION_OP_INVALID\",\n index,\n operation,\n document\n );\n } else {\n return returnValue;\n }\n }\n } /* END ROOT OPERATIONS */ else {\n if (!mutateDocument) {\n document = _deepClone(document);\n }\n const path = operation.path || \"\";\n const keys = path.split(\"/\");\n let obj = document;\n let t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift\n let len = keys.length;\n let existingPathFragment = undefined;\n let key: string | number;\n let validateFunction;\n if (typeof validateOperation == \"function\") {\n validateFunction = validateOperation;\n } else {\n validateFunction = validator;\n }\n while (true) {\n key = keys[t];\n if (key && key.indexOf(\"~\") != -1) {\n key = unescapePathComponent(key);\n }\n\n if (\n banPrototypeModifications &&\n (key == \"__proto__\" ||\n (key == \"prototype\" && t > 0 && keys[t - 1] == \"constructor\"))\n ) {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README\"\n );\n }\n\n if (validateOperation) {\n if (existingPathFragment === undefined) {\n if (obj[key] === undefined) {\n existingPathFragment = keys.slice(0, t).join(\"/\");\n } else if (t == len - 1) {\n existingPathFragment = operation.path;\n }\n if (existingPathFragment !== undefined) {\n validateFunction(operation, 0, document, existingPathFragment);\n }\n }\n }\n t++;\n if (Array.isArray(obj)) {\n if (key === \"-\") {\n key = obj.length;\n } else {\n if (validateOperation && !isInteger(key)) {\n throw new JsonPatchError(\n \"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\",\n \"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\",\n index,\n operation,\n document\n );\n } // only parse key when it's an integer for `arr.prop` to work\n else if (isInteger(key)) {\n key = ~~key;\n }\n }\n if (t >= len) {\n if (validateOperation && operation.op === \"add\" && key > obj.length) {\n throw new JsonPatchError(\n \"The specified index MUST NOT be greater than the number of elements in the array\",\n \"OPERATION_VALUE_OUT_OF_BOUNDS\",\n index,\n operation,\n document\n );\n }\n const returnValue = arrOps[operation.op].call(\n operation,\n obj,\n key,\n document\n ); // Apply patch\n if (returnValue.test === false) {\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n return returnValue;\n }\n } else {\n if (t >= len) {\n const returnValue = objOps[operation.op].call(\n operation,\n obj,\n key,\n document\n ); // Apply patch\n if (returnValue.test === false) {\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n return returnValue;\n }\n }\n obj = obj[key];\n // If we have more keys in the path, but the next value isn't a non-null object,\n // throw an OPERATION_PATH_UNRESOLVABLE error instead of iterating again.\n if (validateOperation && t < len && (!obj || typeof obj !== \"object\")) {\n throw new JsonPatchError(\n \"Cannot perform operation at the desired path\",\n \"OPERATION_PATH_UNRESOLVABLE\",\n index,\n operation,\n document\n );\n }\n }\n }\n}\n\n/**\n * Apply a full JSON Patch array on a JSON document.\n * Returns the {newDocument, result} of the patch.\n * It modifies the `document` object and `patch` - it gets the values by reference.\n * If you would like to avoid touching your values, clone them:\n * `jsonpatch.applyPatch(document, jsonpatch._deepClone(patch))`.\n *\n * @param document The document to patch\n * @param patch The patch to apply\n * @param validateOperation `false` is without validation, `true` to use default jsonpatch's validation, or you can pass a `validateOperation` callback to be used for validation.\n * @param mutateDocument Whether to mutate the original document or clone it before applying\n * @param banPrototypeModifications Whether to ban modifications to `__proto__`, defaults to `true`.\n * @return An array of `{newDocument, result}` after the patch\n */\nexport function applyPatch<T>(\n document: T,\n patch: ReadonlyArray<Operation>,\n validateOperation?: boolean | Validator<T>,\n mutateDocument: boolean = true,\n banPrototypeModifications: boolean = true\n): PatchResult<T> {\n if (validateOperation) {\n if (!Array.isArray(patch)) {\n throw new JsonPatchError(\n \"Patch sequence must be an array\",\n \"SEQUENCE_NOT_AN_ARRAY\"\n );\n }\n }\n if (!mutateDocument) {\n document = _deepClone(document);\n }\n const results = new Array(patch.length) as PatchResult<T>;\n\n for (let i = 0, length = patch.length; i < length; i++) {\n // we don't need to pass mutateDocument argument because if it was true, we already deep cloned the object, we'll just pass `true`\n results[i] = applyOperation(\n document,\n patch[i],\n validateOperation,\n true,\n banPrototypeModifications,\n i\n );\n document = results[i].newDocument; // in case root was replaced\n }\n results.newDocument = document;\n return results;\n}\n\n/**\n * Apply a single JSON Patch Operation on a JSON document.\n * Returns the updated document.\n * Suitable as a reducer.\n *\n * @param document The document to patch\n * @param operation The operation to apply\n * @return The updated document\n */\nexport function applyReducer<T>(\n document: T,\n operation: Operation,\n index: number\n): T {\n const operationResult: OperationResult<T> = applyOperation(\n document,\n operation\n );\n if (operationResult.test === false) {\n // failed test\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n return operationResult.newDocument;\n}\n\n/**\n * Validates a single operation. Called from `jsonpatch.validate`. Throws `JsonPatchError` in case of an error.\n * @param {object} operation - operation object (patch)\n * @param {number} index - index of operation in the sequence\n * @param {object} [document] - object where the operation is supposed to be applied\n * @param {string} [existingPathFragment] - comes along with `document`\n */\nexport function validator(\n operation: Operation,\n index: number,\n document?: any,\n existingPathFragment?: string\n): void {\n if (\n typeof operation !== \"object\" ||\n operation === null ||\n Array.isArray(operation)\n ) {\n throw new JsonPatchError(\n \"Operation is not an object\",\n \"OPERATION_NOT_AN_OBJECT\",\n index,\n operation,\n document\n );\n } else if (!objOps[operation.op]) {\n throw new JsonPatchError(\n \"Operation `op` property is not one of operations defined in RFC-6902\",\n \"OPERATION_OP_INVALID\",\n index,\n operation,\n document\n );\n } else if (typeof operation.path !== \"string\") {\n throw new JsonPatchError(\n \"Operation `path` property is not a string\",\n \"OPERATION_PATH_INVALID\",\n index,\n operation,\n document\n );\n } else if (operation.path.indexOf(\"/\") !== 0 && operation.path.length > 0) {\n // paths that aren't empty string should start with \"/\"\n throw new JsonPatchError(\n 'Operation `path` property must start with \"/\"',\n \"OPERATION_PATH_INVALID\",\n index,\n operation,\n document\n );\n } else if (\n (operation.op === \"move\" || operation.op === \"copy\") &&\n typeof operation.from !== \"string\"\n ) {\n throw new JsonPatchError(\n \"Operation `from` property is not present (applicable in `move` and `copy` operations)\",\n \"OPERATION_FROM_REQUIRED\",\n index,\n operation,\n document\n );\n } else if (\n (operation.op === \"add\" ||\n operation.op === \"replace\" ||\n operation.op === \"test\") &&\n operation.value === undefined\n ) {\n throw new JsonPatchError(\n \"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\n \"OPERATION_VALUE_REQUIRED\",\n index,\n operation,\n document\n );\n } else if (\n (operation.op === \"add\" ||\n operation.op === \"replace\" ||\n operation.op === \"test\") &&\n hasUndefined(operation.value)\n ) {\n throw new JsonPatchError(\n \"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\n \"OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED\",\n index,\n operation,\n document\n );\n } else if (document) {\n if (operation.op == \"add\") {\n var pathLen = operation.path.split(\"/\").length;\n var existingPathLen = existingPathFragment.split(\"/\").length;\n if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) {\n throw new JsonPatchError(\n \"Cannot perform an `add` operation at the desired path\",\n \"OPERATION_PATH_CANNOT_ADD\",\n index,\n operation,\n document\n );\n }\n } else if (\n operation.op === \"replace\" ||\n operation.op === \"remove\" ||\n <any>operation.op === \"_get\"\n ) {\n if (operation.path !== existingPathFragment) {\n throw new JsonPatchError(\n \"Cannot perform the operation at a path that does not exist\",\n \"OPERATION_PATH_UNRESOLVABLE\",\n index,\n operation,\n document\n );\n }\n } else if (operation.op === \"move\" || operation.op === \"copy\") {\n var existingValue: any = {\n op: \"_get\",\n path: operation.from,\n value: undefined,\n };\n var error = validate([existingValue], document);\n if (error && error.name === \"OPERATION_PATH_UNRESOLVABLE\") {\n throw new JsonPatchError(\n \"Cannot perform the operation from a path that does not exist\",\n \"OPERATION_FROM_UNRESOLVABLE\",\n index,\n operation,\n document\n );\n }\n }\n }\n}\n\n/**\n * Validates a sequence of operations. If `document` parameter is provided, the sequence is additionally validated against the object document.\n * If error is encountered, returns a JsonPatchError object\n * @param sequence\n * @param document\n * @returns {JsonPatchError|undefined}\n */\nexport function validate<T>(\n sequence: ReadonlyArray<Operation>,\n document?: T,\n externalValidator?: Validator<T>\n): PatchError {\n try {\n if (!Array.isArray(sequence)) {\n throw new JsonPatchError(\n \"Patch sequence must be an array\",\n \"SEQUENCE_NOT_AN_ARRAY\"\n );\n }\n if (document) {\n //clone document and sequence so that we can safely try applying operations\n applyPatch(\n _deepClone(document),\n _deepClone(sequence),\n externalValidator || true\n );\n } else {\n externalValidator = externalValidator || validator;\n for (var i = 0; i < sequence.length; i++) {\n externalValidator(sequence[i], i, document, undefined);\n }\n }\n } catch (e) {\n if (e instanceof JsonPatchError) {\n return e;\n } else {\n throw e;\n }\n }\n}\n\n// based on https://github.com/epoberezkin/fast-deep-equal\n// MIT License\n\n// Copyright (c) 2017 Evgeny Poberezkin\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nexport function _areEquals(a: any, b: any): boolean {\n if (a === b) return true;\n\n if (a && b && typeof a == \"object\" && typeof b == \"object\") {\n var arrA = Array.isArray(a),\n arrB = Array.isArray(b),\n i,\n length,\n key;\n\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0; ) if (!_areEquals(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n var keys = Object.keys(a);\n length = keys.length;\n\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0; ) if (!b.hasOwnProperty(keys[i])) return false;\n\n for (i = length; i-- !== 0; ) {\n key = keys[i];\n if (!_areEquals(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n return a !== a && b !== b;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,MAAa,iBAAiB;AAC9B,MAAa,YAAY;;;;;AA8EzB,SAAS,eAAeA,KAA+B;AACrD,QAAO,OAAO,oBAAoB,OAAO,UAAU,CAAC,SAAS,IAAI;AAClE;AAGD,MAAM,SAAS;CACb,KAAK,SAAU,KAAK,KAAK,UAAU;AACjC,MAAI,eAAe,IAAI,CACrB,OAAM,IAAI,UACR;EAGJ,IAAI,OAAO,KAAK;AAChB,SAAO,EAAE,aAAa,SAAU;CACjC;CACD,QAAQ,SAAU,KAAK,KAAK,UAAU;AACpC,MAAI,eAAe,IAAI,CACrB,OAAM,IAAI,UACR;EAGJ,IAAI,UAAU,IAAI;EAClB,OAAO,IAAI;AACX,SAAO;GAAE,aAAa;GAAU;EAAS;CAC1C;CACD,SAAS,SAAU,KAAK,KAAK,UAAU;AACrC,MAAI,eAAe,IAAI,CACrB,OAAM,IAAI,UACR;EAGJ,IAAI,UAAU,IAAI;EAClB,IAAI,OAAO,KAAK;AAChB,SAAO;GAAE,aAAa;GAAU;EAAS;CAC1C;CACD,MAAM,SAAU,KAAK,KAAK,UAAU;EAIlC,IAAI,UAAU,kBAAkB,UAAU,KAAK,KAAK;AAEpD,MAAI,SACF,UAAU,WAAW,QAAQ;EAG/B,MAAM,gBAAgB,eAAe,UAAU;GAC7C,IAAI;GACJ,MAAM,KAAK;EACZ,EAAC,CAAC;EAEH,eAAe,UAAU;GACvB,IAAI;GACJ,MAAM,KAAK;GACX,OAAO;EACR,EAAC;AAEF,SAAO;GAAE,aAAa;GAAU;EAAS;CAC1C;CACD,MAAM,SAAU,KAAK,KAAK,UAAU;EAClC,MAAM,cAAc,kBAAkB,UAAU,KAAK,KAAK;EAE1D,eAAe,UAAU;GACvB,IAAI;GACJ,MAAM,KAAK;GACX,OAAO,WAAW,YAAY;EAC/B,EAAC;AACF,SAAO,EAAE,aAAa,SAAU;CACjC;CACD,MAAM,SAAU,KAAK,KAAK,UAAU;AAClC,SAAO;GAAE,aAAa;GAAU,MAAM,WAAW,IAAI,MAAM,KAAK,MAAM;EAAE;CACzE;CACD,MAAM,SAAU,KAAK,KAAK,UAAU;EAClC,KAAK,QAAQ,IAAI;AACjB,SAAO,EAAE,aAAa,SAAU;CACjC;AACF;AAGD,IAAI,SAAS;CACX,KAAK,SAAU,KAAK,GAAG,UAAU;AAC/B,MAAI,UAAU,EAAE,EACd,IAAI,OAAO,GAAG,GAAG,KAAK,MAAM;OAG5B,IAAI,KAAK,KAAK;AAGhB,SAAO;GAAE,aAAa;GAAU,OAAO;EAAG;CAC3C;CACD,QAAQ,SAAU,KAAK,GAAG,UAAU;EAClC,IAAI,cAAc,IAAI,OAAO,GAAG,EAAE;AAClC,SAAO;GAAE,aAAa;GAAU,SAAS,YAAY;EAAI;CAC1D;CACD,SAAS,SAAU,KAAK,GAAG,UAAU;EACnC,IAAI,UAAU,IAAI;EAClB,IAAI,KAAK,KAAK;AACd,SAAO;GAAE,aAAa;GAAU;EAAS;CAC1C;CACD,MAAM,OAAO;CACb,MAAM,OAAO;CACb,MAAM,OAAO;CACb,MAAM,OAAO;AACd;;;;;;;;;AAUD,SAAgB,kBAAkBC,UAAeC,SAAsB;AACrE,KAAI,WAAW,GACb,QAAO;CAET,IAAI,yBAA4C;EAAE,IAAI;EAAQ,MAAM;CAAS;CAC7E,eAAe,UAAU,uBAAuB;AAChD,QAAO,uBAAuB;AAC/B;;;;;;;;;;;;;;;AAeD,SAAgB,eACdC,UACAC,WACAC,oBAA4C,OAC5CC,iBAA0B,MAC1BC,4BAAqC,MACrCC,QAAgB,GACI;AACpB,KAAI,kBACF,KAAI,OAAO,qBAAqB,YAC9B,kBAAkB,WAAW,GAAG,UAAU,UAAU,KAAK;MAEzD,UAAU,WAAW,EAAE;AAI3B,KAAI,UAAU,SAAS,IAAI;EACzB,IAAIC,cAAkC,EAAE,aAAa,SAAU;AAC/D,MAAI,UAAU,OAAO,OAAO;GAC1B,YAAY,cAAc,UAAU;AACpC,UAAO;EACR,WAAU,UAAU,OAAO,WAAW;GACrC,YAAY,cAAc,UAAU;GACpC,YAAY,UAAU;AACtB,UAAO;EACR,WAAU,UAAU,OAAO,UAAU,UAAU,OAAO,QAAQ;GAE7D,YAAY,cAAc,kBAAkB,UAAU,UAAU,KAAK;AACrE,OAAI,UAAU,OAAO,QAEnB,YAAY,UAAU;AAExB,UAAO;EACR,WAAU,UAAU,OAAO,QAAQ;GAClC,YAAY,OAAO,WAAW,UAAU,UAAU,MAAM;AACxD,OAAI,YAAY,SAAS,MACvB,OAAM,IAAI,eACR,yBACA,yBACA,OACA,WACA;GAGJ,YAAY,cAAc;AAC1B,UAAO;EACR,WAAU,UAAU,OAAO,UAAU;GAEpC,YAAY,UAAU;GACtB,YAAY,cAAc;AAC1B,UAAO;EACR,WAAU,UAAU,OAAO,QAAQ;GAClC,UAAU,QAAQ;AAClB,UAAO;EACR,WAEK,kBACF,OAAM,IAAI,eACR,wEACA,wBACA,OACA,WACA;MAGF,QAAO;CAGZ,OAAgC;AAC/B,MAAI,CAAC,gBACH,WAAW,WAAW,SAAS;EAEjC,MAAM,OAAO,UAAU,QAAQ;EAC/B,MAAM,OAAO,KAAK,MAAM,IAAI;EAC5B,IAAI,MAAM;EACV,IAAI,IAAI;EACR,IAAI,MAAM,KAAK;EACf,IAAI,uBAAuB;EAC3B,IAAIT;EACJ,IAAI;AACJ,MAAI,OAAO,qBAAqB,YAC9B,mBAAmB;OAEnB,mBAAmB;AAErB,SAAO,MAAM;GACX,MAAM,KAAK;AACX,OAAI,OAAO,IAAI,QAAQ,IAAI,IAAI,IAC7B,MAAM,sBAAsB,IAAI;AAGlC,OACE,8BACC,OAAO,eACL,OAAO,eAAe,IAAI,KAAK,KAAK,IAAI,MAAM,eAEjD,OAAM,IAAI,UACR;AAIJ,OAAI,mBACF;QAAI,yBAAyB,QAAW;AACtC,SAAI,IAAI,SAAS,QACf,uBAAuB,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;cACxC,KAAK,MAAM,GACpB,uBAAuB,UAAU;AAEnC,SAAI,yBAAyB,QAC3B,iBAAiB,WAAW,GAAG,UAAU,qBAAqB;IAEjE;;GAEH;AACA,OAAI,MAAM,QAAQ,IAAI,EAAE;AACtB,QAAI,QAAQ,KACV,MAAM,IAAI;aAEN,qBAAqB,CAAC,UAAU,IAAI,CACtC,OAAM,IAAI,eACR,2HACA,sCACA,OACA,WACA;aAGK,UAAU,IAAI,EACrB,MAAM,CAAC,CAAC;AAGZ,QAAI,KAAK,KAAK;AACZ,SAAI,qBAAqB,UAAU,OAAO,SAAS,MAAM,IAAI,OAC3D,OAAM,IAAI,eACR,oFACA,iCACA,OACA,WACA;KAGJ,MAAM,cAAc,OAAO,UAAU,IAAI,KACvC,WACA,KACA,KACA,SACD;AACD,SAAI,YAAY,SAAS,MACvB,OAAM,IAAI,eACR,yBACA,yBACA,OACA,WACA;AAGJ,YAAO;IACR;GACF,WACK,KAAK,KAAK;IACZ,MAAM,cAAc,OAAO,UAAU,IAAI,KACvC,WACA,KACA,KACA,SACD;AACD,QAAI,YAAY,SAAS,MACvB,OAAM,IAAI,eACR,yBACA,yBACA,OACA,WACA;AAGJ,WAAO;GACR;GAEH,MAAM,IAAI;AAGV,OAAI,qBAAqB,IAAI,QAAQ,CAAC,OAAO,OAAO,QAAQ,UAC1D,OAAM,IAAI,eACR,gDACA,+BACA,OACA,WACA;EAGL;CACF;AACF;;;;;;;;;;;;;;;AAgBD,SAAgB,WACdG,UACAO,OACAC,mBACAL,iBAA0B,MAC1BC,4BAAqC,MACrB;AAChB,KAAI,mBACF;MAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,OAAM,IAAI,eACR,mCACA;CAEH;AAEH,KAAI,CAAC,gBACH,WAAW,WAAW,SAAS;CAEjC,MAAM,UAAU,IAAI,MAAM,MAAM;AAEhC,MAAK,IAAI,IAAI,GAAG,SAAS,MAAM,QAAQ,IAAI,QAAQ,KAAK;EAEtD,QAAQ,KAAK,eACX,UACA,MAAM,IACN,mBACA,MACA,2BACA,EACD;EACD,WAAW,QAAQ,GAAG;CACvB;CACD,QAAQ,cAAc;AACtB,QAAO;AACR;;;;;;;;;;AAWD,SAAgB,aACdJ,UACAC,WACAI,OACG;CACH,MAAMI,kBAAsC,eAC1C,UACA,UACD;AACD,KAAI,gBAAgB,SAAS,MAE3B,OAAM,IAAI,eACR,yBACA,yBACA,OACA,WACA;AAGJ,QAAO,gBAAgB;AACxB;;;;;;;;AASD,SAAgB,UACdR,WACAI,OACAK,UACAC,sBACM;AACN,KACE,OAAO,cAAc,YACrB,cAAc,QACd,MAAM,QAAQ,UAAU,CAExB,OAAM,IAAI,eACR,8BACA,2BACA,OACA,WACA;UAEO,CAAC,OAAO,UAAU,IAC3B,OAAM,IAAI,eACR,wEACA,wBACA,OACA,WACA;UAEO,OAAO,UAAU,SAAS,SACnC,OAAM,IAAI,eACR,6CACA,0BACA,OACA,WACA;UAEO,UAAU,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU,KAAK,SAAS,EAEtE,OAAM,IAAI,eACR,mDACA,0BACA,OACA,WACA;WAGD,UAAU,OAAO,UAAU,UAAU,OAAO,WAC7C,OAAO,UAAU,SAAS,SAE1B,OAAM,IAAI,eACR,yFACA,2BACA,OACA,WACA;WAGD,UAAU,OAAO,SAChB,UAAU,OAAO,aACjB,UAAU,OAAO,WACnB,UAAU,UAAU,OAEpB,OAAM,IAAI,eACR,oGACA,4BACA,OACA,WACA;WAGD,UAAU,OAAO,SAChB,UAAU,OAAO,aACjB,UAAU,OAAO,WACnB,aAAa,UAAU,MAAM,CAE7B,OAAM,IAAI,eACR,oGACA,4CACA,OACA,WACA;UAEO,UACT;MAAI,UAAU,MAAM,OAAO;GACzB,IAAI,UAAU,UAAU,KAAK,MAAM,IAAI,CAAC;GACxC,IAAI,kBAAkB,qBAAqB,MAAM,IAAI,CAAC;AACtD,OAAI,YAAY,kBAAkB,KAAK,YAAY,gBACjD,OAAM,IAAI,eACR,yDACA,6BACA,OACA,WACA;EAGL,WACC,UAAU,OAAO,aACjB,UAAU,OAAO,YACZ,UAAU,OAAO,QAEtB;OAAI,UAAU,SAAS,qBACrB,OAAM,IAAI,eACR,8DACA,+BACA,OACA,WACA;EAEH,WACQ,UAAU,OAAO,UAAU,UAAU,OAAO,QAAQ;GAC7D,IAAIC,gBAAqB;IACvB,IAAI;IACJ,MAAM,UAAU;IAChB,OAAO;GACR;GACD,IAAI,QAAQ,SAAS,CAAC,aAAc,GAAE,SAAS;AAC/C,OAAI,SAAS,MAAM,SAAS,8BAC1B,OAAM,IAAI,eACR,gEACA,+BACA,OACA,WACA;EAGL;;AAEJ;;;;;;;;AASD,SAAgB,SACdC,UACAC,UACAC,mBACY;AACZ,KAAI;AACF,MAAI,CAAC,MAAM,QAAQ,SAAS,CAC1B,OAAM,IAAI,eACR,mCACA;AAGJ,MAAI,UAEF,WACE,WAAW,SAAS,EACpB,WAAW,SAAS,EACpB,qBAAqB,KACtB;OACI;GACL,oBAAoB,qBAAqB;AACzC,QAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,kBAAkB,SAAS,IAAI,GAAG,UAAU,OAAU;EAEzD;CACF,SAAQ,GAAG;AACV,MAAI,aAAa,eACf,QAAO;MAEP,OAAM;CAET;AACF;AAwBD,SAAgB,WAAWC,GAAQC,GAAiB;AAClD,KAAI,MAAM,EAAG,QAAO;AAEpB,KAAI,KAAK,KAAK,OAAO,KAAK,YAAY,OAAO,KAAK,UAAU;EAC1D,IAAI,OAAO,MAAM,QAAQ,EAAE,EACzB,OAAO,MAAM,QAAQ,EAAE,EACvB,GACA,QACA;AAEF,MAAI,QAAQ,MAAM;GAChB,SAAS,EAAE;AACX,OAAI,UAAU,EAAE,OAAQ,QAAO;AAC/B,QAAK,IAAI,QAAQ,QAAQ,GAAK,KAAI,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,CAAE,QAAO;AAClE,UAAO;EACR;AAED,MAAI,QAAQ,KAAM,QAAO;EAEzB,IAAI,OAAO,OAAO,KAAK,EAAE;EACzB,SAAS,KAAK;AAEd,MAAI,WAAW,OAAO,KAAK,EAAE,CAAC,OAAQ,QAAO;AAE7C,OAAK,IAAI,QAAQ,QAAQ,GAAK,KAAI,CAAC,EAAE,eAAe,KAAK,GAAG,CAAE,QAAO;AAErE,OAAK,IAAI,QAAQ,QAAQ,IAAK;GAC5B,MAAM,KAAK;AACX,OAAI,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAE,QAAO;EACzC;AAED,SAAO;CACR;AAED,QAAO,MAAM,KAAK,MAAM;AACzB"}
|
|
1
|
+
{"version":3,"file":"core.js","names":["document: any","pointer: string","document: T","operation: Operation","validateOperation: boolean | Validator<T>","mutateDocument: boolean","banPrototypeModifications: boolean","index: number","returnValue: OperationResult<T>","key: string | number","patch: ReadonlyArray<Operation>","validateOperation?: boolean | Validator<T>","operationResult: OperationResult<T>","document?: any","existingPathFragment?: string","existingValue: any","sequence: ReadonlyArray<Operation>","document?: T","externalValidator?: Validator<T>","a: any","b: any"],"sources":["../../../../src/utils/fast-json-patch/src/core.ts"],"sourcesContent":["// @ts-nocheck\n\n// Inlined because of ESM import issues\n\n/*!\n * https://github.com/Starcounter-Jack/JSON-Patch\n * (c) 2013-2021 Joachim Wester\n * MIT license\n */\ndeclare var require: any;\n\nimport {\n PatchError,\n _deepClone,\n isInteger,\n unescapePathComponent,\n hasUndefined,\n} from \"./helpers.js\";\n\nexport const JsonPatchError = PatchError;\nexport const deepClone = _deepClone;\n\nexport type Operation =\n | AddOperation<any>\n | RemoveOperation\n | ReplaceOperation<any>\n | MoveOperation\n | CopyOperation\n | TestOperation<any>\n | GetOperation<any>;\n\nexport interface Validator<T> {\n (\n operation: Operation,\n index: number,\n document: T,\n existingPathFragment: string\n ): void;\n}\n\nexport interface OperationResult<T> {\n removed?: any;\n test?: boolean;\n newDocument: T;\n}\n\nexport interface BaseOperation {\n path: string;\n}\n\nexport interface AddOperation<T> extends BaseOperation {\n op: \"add\";\n value: T;\n}\n\nexport interface RemoveOperation extends BaseOperation {\n op: \"remove\";\n}\n\nexport interface ReplaceOperation<T> extends BaseOperation {\n op: \"replace\";\n value: T;\n}\n\nexport interface MoveOperation extends BaseOperation {\n op: \"move\";\n from: string;\n}\n\nexport interface CopyOperation extends BaseOperation {\n op: \"copy\";\n from: string;\n}\n\nexport interface TestOperation<T> extends BaseOperation {\n op: \"test\";\n value: T;\n}\n\nexport interface GetOperation<T> extends BaseOperation {\n op: \"_get\";\n value: T;\n}\nexport interface PatchResult<T> extends Array<OperationResult<T>> {\n newDocument: T;\n}\n\n/* We use a Javascript hash to store each\n function. Each hash entry (property) uses\n the operation identifiers specified in rfc6902.\n In this way, we can map each patch operation\n to its dedicated function in efficient way.\n */\n\n/* The operations applicable to an object */\nconst objOps = {\n add: function (obj, key, document) {\n if (key === \"__proto__\" || key === \"constructor\") {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__` or `constructor` prop is banned for security reasons\"\n );\n }\n obj[key] = this.value;\n return { newDocument: document };\n },\n remove: function (obj, key, document) {\n if (key === \"__proto__\" || key === \"constructor\") {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__` or `constructor` prop is banned for security reasons\"\n );\n }\n var removed = obj[key];\n delete obj[key];\n return { newDocument: document, removed };\n },\n replace: function (obj, key, document) {\n if (key === \"__proto__\" || key === \"constructor\") {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__` or `constructor` prop is banned for security reasons\"\n );\n }\n var removed = obj[key];\n obj[key] = this.value;\n return { newDocument: document, removed };\n },\n move: function (obj, key, document) {\n /* in case move target overwrites an existing value,\n return the removed value, this can be taxing performance-wise,\n and is potentially unneeded */\n let removed = getValueByPointer(document, this.path);\n\n if (removed) {\n removed = _deepClone(removed);\n }\n\n const originalValue = applyOperation(document, {\n op: \"remove\",\n path: this.from,\n }).removed;\n\n applyOperation(document, {\n op: \"add\",\n path: this.path,\n value: originalValue,\n });\n\n return { newDocument: document, removed };\n },\n copy: function (obj, key, document) {\n const valueToCopy = getValueByPointer(document, this.from);\n // enforce copy by value so further operations don't affect source (see issue #177)\n applyOperation(document, {\n op: \"add\",\n path: this.path,\n value: _deepClone(valueToCopy),\n });\n return { newDocument: document };\n },\n test: function (obj, key, document) {\n return { newDocument: document, test: _areEquals(obj[key], this.value) };\n },\n _get: function (obj, key, document) {\n this.value = obj[key];\n return { newDocument: document };\n },\n};\n\n/* The operations applicable to an array. Many are the same as for the object */\nvar arrOps = {\n add: function (arr, i, document) {\n if (isInteger(i)) {\n arr.splice(i, 0, this.value);\n } else {\n // array props\n arr[i] = this.value;\n }\n // this may be needed when using '-' in an array\n return { newDocument: document, index: i };\n },\n remove: function (arr, i, document) {\n var removedList = arr.splice(i, 1);\n return { newDocument: document, removed: removedList[0] };\n },\n replace: function (arr, i, document) {\n var removed = arr[i];\n arr[i] = this.value;\n return { newDocument: document, removed };\n },\n move: objOps.move,\n copy: objOps.copy,\n test: objOps.test,\n _get: objOps._get,\n};\n\n/**\n * Retrieves a value from a JSON document by a JSON pointer.\n * Returns the value.\n *\n * @param document The document to get the value from\n * @param pointer an escaped JSON pointer\n * @return The retrieved value\n */\nexport function getValueByPointer(document: any, pointer: string): any {\n if (pointer == \"\") {\n return document;\n }\n var getOriginalDestination = <GetOperation<any>>{ op: \"_get\", path: pointer };\n applyOperation(document, getOriginalDestination);\n return getOriginalDestination.value;\n}\n/**\n * Apply a single JSON Patch Operation on a JSON document.\n * Returns the {newDocument, result} of the operation.\n * It modifies the `document` and `operation` objects - it gets the values by reference.\n * If you would like to avoid touching your values, clone them:\n * `jsonpatch.applyOperation(document, jsonpatch._deepClone(operation))`.\n *\n * @param document The document to patch\n * @param operation The operation to apply\n * @param validateOperation `false` is without validation, `true` to use default jsonpatch's validation, or you can pass a `validateOperation` callback to be used for validation.\n * @param mutateDocument Whether to mutate the original document or clone it before applying\n * @param banPrototypeModifications Whether to ban modifications to `__proto__`, defaults to `true`.\n * @return `{newDocument, result}` after the operation\n */\nexport function applyOperation<T>(\n document: T,\n operation: Operation,\n validateOperation: boolean | Validator<T> = false,\n mutateDocument: boolean = true,\n banPrototypeModifications: boolean = true,\n index: number = 0\n): OperationResult<T> {\n if (validateOperation) {\n if (typeof validateOperation == \"function\") {\n validateOperation(operation, 0, document, operation.path);\n } else {\n validator(operation, 0);\n }\n }\n /* ROOT OPERATIONS */\n if (operation.path === \"\") {\n let returnValue: OperationResult<T> = { newDocument: document };\n if (operation.op === \"add\") {\n returnValue.newDocument = operation.value;\n return returnValue;\n } else if (operation.op === \"replace\") {\n returnValue.newDocument = operation.value;\n returnValue.removed = document; //document we removed\n return returnValue;\n } else if (operation.op === \"move\" || operation.op === \"copy\") {\n // it's a move or copy to root\n returnValue.newDocument = getValueByPointer(document, operation.from); // get the value by json-pointer in `from` field\n if (operation.op === \"move\") {\n // report removed item\n returnValue.removed = document;\n }\n return returnValue;\n } else if (operation.op === \"test\") {\n returnValue.test = _areEquals(document, operation.value);\n if (returnValue.test === false) {\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n returnValue.newDocument = document;\n return returnValue;\n } else if (operation.op === \"remove\") {\n // a remove on root\n returnValue.removed = document;\n returnValue.newDocument = null;\n return returnValue;\n } else if (operation.op === \"_get\") {\n operation.value = document;\n return returnValue;\n } else {\n /* bad operation */\n if (validateOperation) {\n throw new JsonPatchError(\n \"Operation `op` property is not one of operations defined in RFC-6902\",\n \"OPERATION_OP_INVALID\",\n index,\n operation,\n document\n );\n } else {\n return returnValue;\n }\n }\n } /* END ROOT OPERATIONS */ else {\n if (!mutateDocument) {\n document = _deepClone(document);\n }\n const path = operation.path || \"\";\n const keys = path.split(\"/\");\n let obj = document;\n let t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift\n let len = keys.length;\n let existingPathFragment = undefined;\n let key: string | number;\n let validateFunction;\n if (typeof validateOperation == \"function\") {\n validateFunction = validateOperation;\n } else {\n validateFunction = validator;\n }\n while (true) {\n key = keys[t];\n if (key && key.indexOf(\"~\") != -1) {\n key = unescapePathComponent(key);\n }\n\n if (\n banPrototypeModifications &&\n (key == \"__proto__\" ||\n (key == \"prototype\" && t > 0 && keys[t - 1] == \"constructor\"))\n ) {\n throw new TypeError(\n \"JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README\"\n );\n }\n\n if (validateOperation) {\n if (existingPathFragment === undefined) {\n if (obj[key] === undefined) {\n existingPathFragment = keys.slice(0, t).join(\"/\");\n } else if (t == len - 1) {\n existingPathFragment = operation.path;\n }\n if (existingPathFragment !== undefined) {\n validateFunction(operation, 0, document, existingPathFragment);\n }\n }\n }\n t++;\n if (Array.isArray(obj)) {\n if (key === \"-\") {\n key = obj.length;\n } else {\n if (validateOperation && !isInteger(key)) {\n throw new JsonPatchError(\n \"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\",\n \"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\",\n index,\n operation,\n document\n );\n } // only parse key when it's an integer for `arr.prop` to work\n else if (isInteger(key)) {\n key = ~~key;\n }\n }\n if (t >= len) {\n if (validateOperation && operation.op === \"add\" && key > obj.length) {\n throw new JsonPatchError(\n \"The specified index MUST NOT be greater than the number of elements in the array\",\n \"OPERATION_VALUE_OUT_OF_BOUNDS\",\n index,\n operation,\n document\n );\n }\n const returnValue = arrOps[operation.op].call(\n operation,\n obj,\n key,\n document\n ); // Apply patch\n if (returnValue.test === false) {\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n return returnValue;\n }\n } else {\n if (t >= len) {\n const returnValue = objOps[operation.op].call(\n operation,\n obj,\n key,\n document\n ); // Apply patch\n if (returnValue.test === false) {\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n return returnValue;\n }\n }\n obj = obj[key];\n // If we have more keys in the path, but the next value isn't a non-null object,\n // throw an OPERATION_PATH_UNRESOLVABLE error instead of iterating again.\n if (validateOperation && t < len && (!obj || typeof obj !== \"object\")) {\n throw new JsonPatchError(\n \"Cannot perform operation at the desired path\",\n \"OPERATION_PATH_UNRESOLVABLE\",\n index,\n operation,\n document\n );\n }\n }\n }\n}\n\n/**\n * Apply a full JSON Patch array on a JSON document.\n * Returns the {newDocument, result} of the patch.\n * It modifies the `document` object and `patch` - it gets the values by reference.\n * If you would like to avoid touching your values, clone them:\n * `jsonpatch.applyPatch(document, jsonpatch._deepClone(patch))`.\n *\n * @param document The document to patch\n * @param patch The patch to apply\n * @param validateOperation `false` is without validation, `true` to use default jsonpatch's validation, or you can pass a `validateOperation` callback to be used for validation.\n * @param mutateDocument Whether to mutate the original document or clone it before applying\n * @param banPrototypeModifications Whether to ban modifications to `__proto__`, defaults to `true`.\n * @return An array of `{newDocument, result}` after the patch\n */\nexport function applyPatch<T>(\n document: T,\n patch: ReadonlyArray<Operation>,\n validateOperation?: boolean | Validator<T>,\n mutateDocument: boolean = true,\n banPrototypeModifications: boolean = true\n): PatchResult<T> {\n if (validateOperation) {\n if (!Array.isArray(patch)) {\n throw new JsonPatchError(\n \"Patch sequence must be an array\",\n \"SEQUENCE_NOT_AN_ARRAY\"\n );\n }\n }\n if (!mutateDocument) {\n document = _deepClone(document);\n }\n const results = new Array(patch.length) as PatchResult<T>;\n\n for (let i = 0, length = patch.length; i < length; i++) {\n // we don't need to pass mutateDocument argument because if it was true, we already deep cloned the object, we'll just pass `true`\n results[i] = applyOperation(\n document,\n patch[i],\n validateOperation,\n true,\n banPrototypeModifications,\n i\n );\n document = results[i].newDocument; // in case root was replaced\n }\n results.newDocument = document;\n return results;\n}\n\n/**\n * Apply a single JSON Patch Operation on a JSON document.\n * Returns the updated document.\n * Suitable as a reducer.\n *\n * @param document The document to patch\n * @param operation The operation to apply\n * @return The updated document\n */\nexport function applyReducer<T>(\n document: T,\n operation: Operation,\n index: number\n): T {\n const operationResult: OperationResult<T> = applyOperation(\n document,\n operation\n );\n if (operationResult.test === false) {\n // failed test\n throw new JsonPatchError(\n \"Test operation failed\",\n \"TEST_OPERATION_FAILED\",\n index,\n operation,\n document\n );\n }\n return operationResult.newDocument;\n}\n\n/**\n * Validates a single operation. Called from `jsonpatch.validate`. Throws `JsonPatchError` in case of an error.\n * @param {object} operation - operation object (patch)\n * @param {number} index - index of operation in the sequence\n * @param {object} [document] - object where the operation is supposed to be applied\n * @param {string} [existingPathFragment] - comes along with `document`\n */\nexport function validator(\n operation: Operation,\n index: number,\n document?: any,\n existingPathFragment?: string\n): void {\n if (\n typeof operation !== \"object\" ||\n operation === null ||\n Array.isArray(operation)\n ) {\n throw new JsonPatchError(\n \"Operation is not an object\",\n \"OPERATION_NOT_AN_OBJECT\",\n index,\n operation,\n document\n );\n } else if (!objOps[operation.op]) {\n throw new JsonPatchError(\n \"Operation `op` property is not one of operations defined in RFC-6902\",\n \"OPERATION_OP_INVALID\",\n index,\n operation,\n document\n );\n } else if (typeof operation.path !== \"string\") {\n throw new JsonPatchError(\n \"Operation `path` property is not a string\",\n \"OPERATION_PATH_INVALID\",\n index,\n operation,\n document\n );\n } else if (operation.path.indexOf(\"/\") !== 0 && operation.path.length > 0) {\n // paths that aren't empty string should start with \"/\"\n throw new JsonPatchError(\n 'Operation `path` property must start with \"/\"',\n \"OPERATION_PATH_INVALID\",\n index,\n operation,\n document\n );\n } else if (\n (operation.op === \"move\" || operation.op === \"copy\") &&\n typeof operation.from !== \"string\"\n ) {\n throw new JsonPatchError(\n \"Operation `from` property is not present (applicable in `move` and `copy` operations)\",\n \"OPERATION_FROM_REQUIRED\",\n index,\n operation,\n document\n );\n } else if (\n (operation.op === \"add\" ||\n operation.op === \"replace\" ||\n operation.op === \"test\") &&\n operation.value === undefined\n ) {\n throw new JsonPatchError(\n \"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\n \"OPERATION_VALUE_REQUIRED\",\n index,\n operation,\n document\n );\n } else if (\n (operation.op === \"add\" ||\n operation.op === \"replace\" ||\n operation.op === \"test\") &&\n hasUndefined(operation.value)\n ) {\n throw new JsonPatchError(\n \"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\n \"OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED\",\n index,\n operation,\n document\n );\n } else if (document) {\n if (operation.op == \"add\") {\n var pathLen = operation.path.split(\"/\").length;\n var existingPathLen = existingPathFragment.split(\"/\").length;\n if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) {\n throw new JsonPatchError(\n \"Cannot perform an `add` operation at the desired path\",\n \"OPERATION_PATH_CANNOT_ADD\",\n index,\n operation,\n document\n );\n }\n } else if (\n operation.op === \"replace\" ||\n operation.op === \"remove\" ||\n <any>operation.op === \"_get\"\n ) {\n if (operation.path !== existingPathFragment) {\n throw new JsonPatchError(\n \"Cannot perform the operation at a path that does not exist\",\n \"OPERATION_PATH_UNRESOLVABLE\",\n index,\n operation,\n document\n );\n }\n } else if (operation.op === \"move\" || operation.op === \"copy\") {\n var existingValue: any = {\n op: \"_get\",\n path: operation.from,\n value: undefined,\n };\n var error = validate([existingValue], document);\n if (error && error.name === \"OPERATION_PATH_UNRESOLVABLE\") {\n throw new JsonPatchError(\n \"Cannot perform the operation from a path that does not exist\",\n \"OPERATION_FROM_UNRESOLVABLE\",\n index,\n operation,\n document\n );\n }\n }\n }\n}\n\n/**\n * Validates a sequence of operations. If `document` parameter is provided, the sequence is additionally validated against the object document.\n * If error is encountered, returns a JsonPatchError object\n * @param sequence\n * @param document\n * @returns {JsonPatchError|undefined}\n */\nexport function validate<T>(\n sequence: ReadonlyArray<Operation>,\n document?: T,\n externalValidator?: Validator<T>\n): PatchError {\n try {\n if (!Array.isArray(sequence)) {\n throw new JsonPatchError(\n \"Patch sequence must be an array\",\n \"SEQUENCE_NOT_AN_ARRAY\"\n );\n }\n if (document) {\n //clone document and sequence so that we can safely try applying operations\n applyPatch(\n _deepClone(document),\n _deepClone(sequence),\n externalValidator || true\n );\n } else {\n externalValidator = externalValidator || validator;\n for (var i = 0; i < sequence.length; i++) {\n externalValidator(sequence[i], i, document, undefined);\n }\n }\n } catch (e) {\n if (e instanceof JsonPatchError) {\n return e;\n } else {\n throw e;\n }\n }\n}\n\n// based on https://github.com/epoberezkin/fast-deep-equal\n// MIT License\n\n// Copyright (c) 2017 Evgeny Poberezkin\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nexport function _areEquals(a: any, b: any): boolean {\n if (a === b) return true;\n\n if (a && b && typeof a == \"object\" && typeof b == \"object\") {\n var arrA = Array.isArray(a),\n arrB = Array.isArray(b),\n i,\n length,\n key;\n\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0; ) if (!_areEquals(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n var keys = Object.keys(a);\n length = keys.length;\n\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0; ) if (!b.hasOwnProperty(keys[i])) return false;\n\n for (i = length; i-- !== 0; ) {\n key = keys[i];\n if (!_areEquals(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n return a !== a && b !== b;\n}\n"],"mappings":"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"}
|
package/dist/utils/signal.cjs
CHANGED
|
@@ -18,7 +18,7 @@ async function raceWithSignal(promise, signal) {
|
|
|
18
18
|
listener = () => {
|
|
19
19
|
reject(getAbortSignalError(signal));
|
|
20
20
|
};
|
|
21
|
-
signal.addEventListener("abort", listener);
|
|
21
|
+
signal.addEventListener("abort", listener, { once: true });
|
|
22
22
|
if (signal.aborted) reject(getAbortSignalError(signal));
|
|
23
23
|
})]).finally(() => signal.removeEventListener("abort", listener));
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal.cjs","names":["promise: Promise<T>","signal?: AbortSignal","listener: () => void"],"sources":["../../src/utils/signal.ts"],"sourcesContent":["/**\n * Race a promise with an abort signal. If the signal is aborted, the promise will\n * be rejected with the error from the signal. If the promise is rejected, the signal will be aborted.\n *\n * @param promise - The promise to race.\n * @param signal - The abort signal.\n * @returns The result of the promise.\n */\nexport async function raceWithSignal<T>(\n promise: Promise<T>,\n signal?: AbortSignal\n): Promise<T> {\n if (signal === undefined) {\n return promise;\n }\n let listener: () => void;\n return Promise.race([\n promise.catch<T>((err) => {\n if (!signal?.aborted) {\n throw err;\n } else {\n return undefined as T;\n }\n }),\n new Promise<never>((_, reject) => {\n listener = () => {\n reject(getAbortSignalError(signal));\n };\n signal.addEventListener(\"abort\", listener);\n // Must be here inside the promise to avoid a race condition\n if (signal.aborted) {\n reject(getAbortSignalError(signal));\n }\n }),\n ]).finally(() => signal.removeEventListener(\"abort\", listener));\n}\n\n/**\n * Get the error from an abort signal. Since you can set the reason to anything,\n * we have to do some type gymnastics to get a proper error message.\n *\n * @param signal - The abort signal.\n * @returns The error from the abort signal.\n */\nexport function getAbortSignalError(signal?: AbortSignal) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (signal?.reason instanceof Error) {\n return signal.reason;\n }\n\n if (typeof signal?.reason === \"string\") {\n return new Error(signal.reason);\n }\n\n return new Error(\"Aborted\");\n}\n"],"mappings":";;;;;;;;;;AAQA,eAAsB,eACpBA,SACAC,QACY;AACZ,KAAI,WAAW,OACb,QAAO;CAET,IAAIC;AACJ,QAAO,QAAQ,KAAK,CAClB,QAAQ,MAAS,CAAC,QAAQ;AACxB,MAAI,CAAC,QAAQ,QACX,OAAM;MAEN,QAAO;CAEV,EAAC,EACF,IAAI,QAAe,CAAC,GAAG,WAAW;EAChC,WAAW,MAAM;GACf,OAAO,oBAAoB,OAAO,CAAC;EACpC;EACD,OAAO,iBAAiB,SAAS,
|
|
1
|
+
{"version":3,"file":"signal.cjs","names":["promise: Promise<T>","signal?: AbortSignal","listener: () => void"],"sources":["../../src/utils/signal.ts"],"sourcesContent":["/**\n * Race a promise with an abort signal. If the signal is aborted, the promise will\n * be rejected with the error from the signal. If the promise is rejected, the signal will be aborted.\n *\n * @param promise - The promise to race.\n * @param signal - The abort signal.\n * @returns The result of the promise.\n */\nexport async function raceWithSignal<T>(\n promise: Promise<T>,\n signal?: AbortSignal\n): Promise<T> {\n if (signal === undefined) {\n return promise;\n }\n let listener: () => void;\n return Promise.race([\n promise.catch<T>((err) => {\n if (!signal?.aborted) {\n throw err;\n } else {\n return undefined as T;\n }\n }),\n new Promise<never>((_, reject) => {\n listener = () => {\n reject(getAbortSignalError(signal));\n };\n signal.addEventListener(\"abort\", listener, { once: true });\n // Must be here inside the promise to avoid a race condition\n if (signal.aborted) {\n reject(getAbortSignalError(signal));\n }\n }),\n ]).finally(() => signal.removeEventListener(\"abort\", listener));\n}\n\n/**\n * Get the error from an abort signal. Since you can set the reason to anything,\n * we have to do some type gymnastics to get a proper error message.\n *\n * @param signal - The abort signal.\n * @returns The error from the abort signal.\n */\nexport function getAbortSignalError(signal?: AbortSignal) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (signal?.reason instanceof Error) {\n return signal.reason;\n }\n\n if (typeof signal?.reason === \"string\") {\n return new Error(signal.reason);\n }\n\n return new Error(\"Aborted\");\n}\n"],"mappings":";;;;;;;;;;AAQA,eAAsB,eACpBA,SACAC,QACY;AACZ,KAAI,WAAW,OACb,QAAO;CAET,IAAIC;AACJ,QAAO,QAAQ,KAAK,CAClB,QAAQ,MAAS,CAAC,QAAQ;AACxB,MAAI,CAAC,QAAQ,QACX,OAAM;MAEN,QAAO;CAEV,EAAC,EACF,IAAI,QAAe,CAAC,GAAG,WAAW;EAChC,WAAW,MAAM;GACf,OAAO,oBAAoB,OAAO,CAAC;EACpC;EACD,OAAO,iBAAiB,SAAS,UAAU,EAAE,MAAM,KAAM,EAAC;AAE1D,MAAI,OAAO,SACT,OAAO,oBAAoB,OAAO,CAAC;CAEtC,EACF,EAAC,CAAC,QAAQ,MAAM,OAAO,oBAAoB,SAAS,SAAS,CAAC;AAChE;;;;;;;;AASD,SAAgB,oBAAoBD,QAAsB;AAExD,KAAI,QAAQ,kBAAkB,MAC5B,QAAO,OAAO;AAGhB,KAAI,OAAO,QAAQ,WAAW,SAC5B,QAAO,IAAI,MAAM,OAAO;AAG1B,wBAAO,IAAI,MAAM;AAClB"}
|
package/dist/utils/signal.js
CHANGED
|
@@ -17,7 +17,7 @@ async function raceWithSignal(promise, signal) {
|
|
|
17
17
|
listener = () => {
|
|
18
18
|
reject(getAbortSignalError(signal));
|
|
19
19
|
};
|
|
20
|
-
signal.addEventListener("abort", listener);
|
|
20
|
+
signal.addEventListener("abort", listener, { once: true });
|
|
21
21
|
if (signal.aborted) reject(getAbortSignalError(signal));
|
|
22
22
|
})]).finally(() => signal.removeEventListener("abort", listener));
|
|
23
23
|
}
|
package/dist/utils/signal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal.js","names":["promise: Promise<T>","signal?: AbortSignal","listener: () => void"],"sources":["../../src/utils/signal.ts"],"sourcesContent":["/**\n * Race a promise with an abort signal. If the signal is aborted, the promise will\n * be rejected with the error from the signal. If the promise is rejected, the signal will be aborted.\n *\n * @param promise - The promise to race.\n * @param signal - The abort signal.\n * @returns The result of the promise.\n */\nexport async function raceWithSignal<T>(\n promise: Promise<T>,\n signal?: AbortSignal\n): Promise<T> {\n if (signal === undefined) {\n return promise;\n }\n let listener: () => void;\n return Promise.race([\n promise.catch<T>((err) => {\n if (!signal?.aborted) {\n throw err;\n } else {\n return undefined as T;\n }\n }),\n new Promise<never>((_, reject) => {\n listener = () => {\n reject(getAbortSignalError(signal));\n };\n signal.addEventListener(\"abort\", listener);\n // Must be here inside the promise to avoid a race condition\n if (signal.aborted) {\n reject(getAbortSignalError(signal));\n }\n }),\n ]).finally(() => signal.removeEventListener(\"abort\", listener));\n}\n\n/**\n * Get the error from an abort signal. Since you can set the reason to anything,\n * we have to do some type gymnastics to get a proper error message.\n *\n * @param signal - The abort signal.\n * @returns The error from the abort signal.\n */\nexport function getAbortSignalError(signal?: AbortSignal) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (signal?.reason instanceof Error) {\n return signal.reason;\n }\n\n if (typeof signal?.reason === \"string\") {\n return new Error(signal.reason);\n }\n\n return new Error(\"Aborted\");\n}\n"],"mappings":";;;;;;;;;AAQA,eAAsB,eACpBA,SACAC,QACY;AACZ,KAAI,WAAW,OACb,QAAO;CAET,IAAIC;AACJ,QAAO,QAAQ,KAAK,CAClB,QAAQ,MAAS,CAAC,QAAQ;AACxB,MAAI,CAAC,QAAQ,QACX,OAAM;MAEN,QAAO;CAEV,EAAC,EACF,IAAI,QAAe,CAAC,GAAG,WAAW;EAChC,WAAW,MAAM;GACf,OAAO,oBAAoB,OAAO,CAAC;EACpC;EACD,OAAO,iBAAiB,SAAS,
|
|
1
|
+
{"version":3,"file":"signal.js","names":["promise: Promise<T>","signal?: AbortSignal","listener: () => void"],"sources":["../../src/utils/signal.ts"],"sourcesContent":["/**\n * Race a promise with an abort signal. If the signal is aborted, the promise will\n * be rejected with the error from the signal. If the promise is rejected, the signal will be aborted.\n *\n * @param promise - The promise to race.\n * @param signal - The abort signal.\n * @returns The result of the promise.\n */\nexport async function raceWithSignal<T>(\n promise: Promise<T>,\n signal?: AbortSignal\n): Promise<T> {\n if (signal === undefined) {\n return promise;\n }\n let listener: () => void;\n return Promise.race([\n promise.catch<T>((err) => {\n if (!signal?.aborted) {\n throw err;\n } else {\n return undefined as T;\n }\n }),\n new Promise<never>((_, reject) => {\n listener = () => {\n reject(getAbortSignalError(signal));\n };\n signal.addEventListener(\"abort\", listener, { once: true });\n // Must be here inside the promise to avoid a race condition\n if (signal.aborted) {\n reject(getAbortSignalError(signal));\n }\n }),\n ]).finally(() => signal.removeEventListener(\"abort\", listener));\n}\n\n/**\n * Get the error from an abort signal. Since you can set the reason to anything,\n * we have to do some type gymnastics to get a proper error message.\n *\n * @param signal - The abort signal.\n * @returns The error from the abort signal.\n */\nexport function getAbortSignalError(signal?: AbortSignal) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (signal?.reason instanceof Error) {\n return signal.reason;\n }\n\n if (typeof signal?.reason === \"string\") {\n return new Error(signal.reason);\n }\n\n return new Error(\"Aborted\");\n}\n"],"mappings":";;;;;;;;;AAQA,eAAsB,eACpBA,SACAC,QACY;AACZ,KAAI,WAAW,OACb,QAAO;CAET,IAAIC;AACJ,QAAO,QAAQ,KAAK,CAClB,QAAQ,MAAS,CAAC,QAAQ;AACxB,MAAI,CAAC,QAAQ,QACX,OAAM;MAEN,QAAO;CAEV,EAAC,EACF,IAAI,QAAe,CAAC,GAAG,WAAW;EAChC,WAAW,MAAM;GACf,OAAO,oBAAoB,OAAO,CAAC;EACpC;EACD,OAAO,iBAAiB,SAAS,UAAU,EAAE,MAAM,KAAM,EAAC;AAE1D,MAAI,OAAO,SACT,OAAO,oBAAoB,OAAO,CAAC;CAEtC,EACF,EAAC,CAAC,QAAQ,MAAM,OAAO,oBAAoB,SAAS,SAAS,CAAC;AAChE;;;;;;;;AASD,SAAgB,oBAAoBD,QAAsB;AAExD,KAAI,QAAQ,kBAAkB,MAC5B,QAAO,OAAO;AAGhB,KAAI,OAAO,QAAQ,WAAW,SAC5B,QAAO,IAAI,MAAM,OAAO;AAG1B,wBAAO,IAAI,MAAM;AAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.cjs","names":["e: any","stream: ReadableStream<T>","generator: AsyncGenerator<T>","iter: AsyncGenerator<T>","buffer","first: T","second: T","params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }","AsyncLocalStorageProviderSingleton","pickRunnableConfigKeys","raceWithSignal","value?: TReturn | PromiseLike<TReturn>","e: Error","to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>","generator: AsyncGenerator<T, TReturn, TNext>","startSetup: () => Promise<S>","signal: AbortSignal | undefined"],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { pickRunnableConfigKeys } from \"../runnables/config.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport type { IterableReadableStreamInterface } from \"../types/_internal.js\";\nimport { raceWithSignal } from \"./signal.js\";\n\n// Re-exported for backwards compatibility\n// Do NOT import this type from this file inside the project. Instead, always import from `types/_internal.js`\n// when using internally\nexport type { IterableReadableStreamInterface };\n\n/*\n * Support async iterator syntax for ReadableStreams in all environments.\n * Source: https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport class IterableReadableStream<T>\n extends ReadableStream<T>\n implements IterableReadableStreamInterface<T>\n{\n public reader: ReadableStreamDefaultReader<T>;\n\n ensureReader() {\n if (!this.reader) {\n this.reader = this.getReader();\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n this.ensureReader();\n try {\n const result = await this.reader.read();\n if (result.done) {\n this.reader.releaseLock(); // release lock when stream becomes closed\n return {\n done: true,\n value: undefined,\n };\n } else {\n return {\n done: false,\n value: result.value,\n };\n }\n } catch (e) {\n this.reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n }\n\n async return(): Promise<IteratorResult<T>> {\n this.ensureReader();\n // If wrapped in a Node stream, cancel is already called.\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n return { done: true, value: undefined };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async throw(e: any): Promise<IteratorResult<T>> {\n this.ensureReader();\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n throw e;\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n\n static fromReadableStream<T>(stream: ReadableStream<T>) {\n // From https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams#reading_the_stream\n const reader = stream.getReader();\n return new IterableReadableStream<T>({\n start(controller) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n }\n\n static fromAsyncGenerator<T>(generator: AsyncGenerator<T>) {\n return new IterableReadableStream<T>({\n async pull(controller) {\n const { value, done } = await generator.next();\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n }\n // Fix: `else if (value)` will hang the streaming when nullish value (e.g. empty string) is pulled\n controller.enqueue(value);\n },\n async cancel(reason) {\n await generator.return(reason);\n },\n });\n }\n}\n\nexport function atee<T>(\n iter: AsyncGenerator<T>,\n length = 2\n): AsyncGenerator<T>[] {\n const buffers = Array.from(\n { length },\n () => [] as Array<IteratorResult<T> | IteratorReturnResult<T>>\n );\n return buffers.map(async function* makeIter(buffer) {\n while (true) {\n if (buffer.length === 0) {\n const result = await iter.next();\n for (const buffer of buffers) {\n buffer.push(result);\n }\n } else if (buffer[0].done) {\n return;\n } else {\n yield buffer.shift()!.value;\n }\n }\n });\n}\n\nexport function concat<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Array<any> | string | number | Record<string, any> | any,\n>(first: T, second: T): T {\n if (Array.isArray(first) && Array.isArray(second)) {\n return first.concat(second) as T;\n } else if (typeof first === \"string\" && typeof second === \"string\") {\n return (first + second) as T;\n } else if (typeof first === \"number\" && typeof second === \"number\") {\n return (first + second) as T;\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"concat\" in (first as any) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (first as any).concat === \"function\"\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (first as any).concat(second) as T;\n } else if (typeof first === \"object\" && typeof second === \"object\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chunk = { ...first } as Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const [key, value] of Object.entries(second as Record<string, any>)) {\n if (key in chunk && !Array.isArray(chunk[key])) {\n chunk[key] = concat(chunk[key], value);\n } else {\n chunk[key] = value;\n }\n }\n return chunk as T;\n } else {\n throw new Error(`Cannot concat ${typeof first} and ${typeof second}`);\n }\n}\n\nexport class AsyncGeneratorWithSetup<\n S = unknown,\n T = unknown,\n TReturn = unknown,\n TNext = unknown,\n> implements AsyncGenerator<T, TReturn, TNext>\n{\n private generator: AsyncGenerator<T>;\n\n public setup: Promise<S>;\n\n public config?: unknown;\n\n public signal?: AbortSignal;\n\n private firstResult: Promise<IteratorResult<T>>;\n\n private firstResultUsed = false;\n\n constructor(params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }) {\n this.generator = params.generator;\n this.config = params.config;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.signal = params.signal ?? (this.config as any)?.signal;\n // setup is a promise that resolves only after the first iterator value\n // is available. this is useful when setup of several piped generators\n // needs to happen in logical order, ie. in the order in which input to\n // to each generator is available.\n this.setup = new Promise((resolve, reject) => {\n // eslint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n params.config as Record<string, unknown> | undefined\n ),\n async () => {\n this.firstResult = params.generator.next();\n if (params.startSetup) {\n this.firstResult.then(params.startSetup).then(resolve, reject);\n } else {\n this.firstResult.then((_result) => resolve(undefined as S), reject);\n }\n },\n true\n );\n });\n }\n\n async next(...args: [] | [TNext]): Promise<IteratorResult<T>> {\n this.signal?.throwIfAborted();\n\n if (!this.firstResultUsed) {\n this.firstResultUsed = true;\n return this.firstResult;\n }\n\n return AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n this.config as Record<string, unknown> | undefined\n ),\n this.signal\n ? async () => {\n return raceWithSignal(this.generator.next(...args), this.signal);\n }\n : async () => {\n return this.generator.next(...args);\n },\n true\n );\n }\n\n async return(\n value?: TReturn | PromiseLike<TReturn>\n ): Promise<IteratorResult<T>> {\n return this.generator.return(value);\n }\n\n async throw(e: Error): Promise<IteratorResult<T>> {\n return this.generator.throw(e);\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n}\n\nexport async function pipeGeneratorWithSetup<\n S,\n A extends unknown[],\n T,\n TReturn,\n TNext,\n U,\n UReturn,\n UNext,\n>(\n to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>,\n generator: AsyncGenerator<T, TReturn, TNext>,\n startSetup: () => Promise<S>,\n signal: AbortSignal | undefined,\n ...args: A\n) {\n const gen = new AsyncGeneratorWithSetup({\n generator,\n startSetup,\n signal,\n });\n const setup = await gen.setup;\n return { output: to(gen, setup, ...args), setup };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.cjs","names":["e: any","stream: ReadableStream<T>","generator: AsyncGenerator<T>","iter: AsyncGenerator<T>","buffer","first: T","second: T","params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }","AsyncLocalStorageProviderSingleton","pickRunnableConfigKeys","raceWithSignal","value?: TReturn | PromiseLike<TReturn>","e: Error","to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>","generator: AsyncGenerator<T, TReturn, TNext>","startSetup: () => Promise<S>","signal: AbortSignal | undefined"],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { pickRunnableConfigKeys } from \"../runnables/config.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport type { IterableReadableStreamInterface } from \"../types/_internal.js\";\nimport { raceWithSignal } from \"./signal.js\";\n\n// Re-exported for backwards compatibility\n// Do NOT import this type from this file inside the project. Instead, always import from `types/_internal.js`\n// when using internally\nexport type { IterableReadableStreamInterface };\n\n/*\n * Support async iterator syntax for ReadableStreams in all environments.\n * Source: https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport class IterableReadableStream<T>\n extends ReadableStream<T>\n implements IterableReadableStreamInterface<T>\n{\n public reader: ReadableStreamDefaultReader<T>;\n\n ensureReader() {\n if (!this.reader) {\n this.reader = this.getReader();\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n this.ensureReader();\n try {\n const result = await this.reader.read();\n if (result.done) {\n this.reader.releaseLock(); // release lock when stream becomes closed\n return {\n done: true,\n value: undefined,\n };\n } else {\n return {\n done: false,\n value: result.value,\n };\n }\n } catch (e) {\n this.reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n }\n\n async return(): Promise<IteratorResult<T>> {\n this.ensureReader();\n // If wrapped in a Node stream, cancel is already called.\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n return { done: true, value: undefined };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async throw(e: any): Promise<IteratorResult<T>> {\n this.ensureReader();\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n throw e;\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n\n static fromReadableStream<T>(stream: ReadableStream<T>) {\n // From https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams#reading_the_stream\n const reader = stream.getReader();\n return new IterableReadableStream<T>({\n start(controller) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n }\n\n static fromAsyncGenerator<T>(generator: AsyncGenerator<T>) {\n return new IterableReadableStream<T>({\n async pull(controller) {\n const { value, done } = await generator.next();\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n }\n // Fix: `else if (value)` will hang the streaming when nullish value (e.g. empty string) is pulled\n controller.enqueue(value);\n },\n async cancel(reason) {\n await generator.return(reason);\n },\n });\n }\n}\n\nexport function atee<T>(\n iter: AsyncGenerator<T>,\n length = 2\n): AsyncGenerator<T>[] {\n const buffers = Array.from(\n { length },\n () => [] as Array<IteratorResult<T> | IteratorReturnResult<T>>\n );\n return buffers.map(async function* makeIter(buffer) {\n while (true) {\n if (buffer.length === 0) {\n const result = await iter.next();\n for (const buffer of buffers) {\n buffer.push(result);\n }\n } else if (buffer[0].done) {\n return;\n } else {\n yield buffer.shift()!.value;\n }\n }\n });\n}\n\nexport function concat<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Array<any> | string | number | Record<string, any> | any,\n>(first: T, second: T): T {\n if (Array.isArray(first) && Array.isArray(second)) {\n return first.concat(second) as T;\n } else if (typeof first === \"string\" && typeof second === \"string\") {\n return (first + second) as T;\n } else if (typeof first === \"number\" && typeof second === \"number\") {\n return (first + second) as T;\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"concat\" in (first as any) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (first as any).concat === \"function\"\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (first as any).concat(second) as T;\n } else if (typeof first === \"object\" && typeof second === \"object\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chunk = { ...first } as Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const [key, value] of Object.entries(second as Record<string, any>)) {\n if (key in chunk && !Array.isArray(chunk[key])) {\n chunk[key] = concat(chunk[key], value);\n } else {\n chunk[key] = value;\n }\n }\n return chunk as T;\n } else {\n throw new Error(`Cannot concat ${typeof first} and ${typeof second}`);\n }\n}\n\nexport class AsyncGeneratorWithSetup<\n S = unknown,\n T = unknown,\n TReturn = unknown,\n TNext = unknown,\n> implements AsyncGenerator<T, TReturn, TNext> {\n private generator: AsyncGenerator<T>;\n\n public setup: Promise<S>;\n\n public config?: unknown;\n\n public signal?: AbortSignal;\n\n private firstResult: Promise<IteratorResult<T>>;\n\n private firstResultUsed = false;\n\n constructor(params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }) {\n this.generator = params.generator;\n this.config = params.config;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.signal = params.signal ?? (this.config as any)?.signal;\n // setup is a promise that resolves only after the first iterator value\n // is available. this is useful when setup of several piped generators\n // needs to happen in logical order, ie. in the order in which input to\n // to each generator is available.\n this.setup = new Promise((resolve, reject) => {\n // eslint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n params.config as Record<string, unknown> | undefined\n ),\n async () => {\n this.firstResult = params.generator.next();\n if (params.startSetup) {\n this.firstResult.then(params.startSetup).then(resolve, reject);\n } else {\n this.firstResult.then((_result) => resolve(undefined as S), reject);\n }\n },\n true\n );\n });\n }\n\n async next(...args: [] | [TNext]): Promise<IteratorResult<T>> {\n this.signal?.throwIfAborted();\n\n if (!this.firstResultUsed) {\n this.firstResultUsed = true;\n return this.firstResult;\n }\n\n return AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n this.config as Record<string, unknown> | undefined\n ),\n this.signal\n ? async () => {\n return raceWithSignal(this.generator.next(...args), this.signal);\n }\n : async () => {\n return this.generator.next(...args);\n },\n true\n );\n }\n\n async return(\n value?: TReturn | PromiseLike<TReturn>\n ): Promise<IteratorResult<T>> {\n return this.generator.return(value);\n }\n\n async throw(e: Error): Promise<IteratorResult<T>> {\n return this.generator.throw(e);\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n}\n\nexport async function pipeGeneratorWithSetup<\n S,\n A extends unknown[],\n T,\n TReturn,\n TNext,\n U,\n UReturn,\n UNext,\n>(\n to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>,\n generator: AsyncGenerator<T, TReturn, TNext>,\n startSetup: () => Promise<S>,\n signal: AbortSignal | undefined,\n ...args: A\n) {\n const gen = new AsyncGeneratorWithSetup({\n generator,\n startSetup,\n signal,\n });\n const setup = await gen.setup;\n return { output: to(gen, setup, ...args), setup };\n}\n"],"mappings":"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"}
|
package/dist/utils/stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","names":["e: any","stream: ReadableStream<T>","generator: AsyncGenerator<T>","iter: AsyncGenerator<T>","buffer","first: T","second: T","params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }","value?: TReturn | PromiseLike<TReturn>","e: Error","to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>","generator: AsyncGenerator<T, TReturn, TNext>","startSetup: () => Promise<S>","signal: AbortSignal | undefined"],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { pickRunnableConfigKeys } from \"../runnables/config.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport type { IterableReadableStreamInterface } from \"../types/_internal.js\";\nimport { raceWithSignal } from \"./signal.js\";\n\n// Re-exported for backwards compatibility\n// Do NOT import this type from this file inside the project. Instead, always import from `types/_internal.js`\n// when using internally\nexport type { IterableReadableStreamInterface };\n\n/*\n * Support async iterator syntax for ReadableStreams in all environments.\n * Source: https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport class IterableReadableStream<T>\n extends ReadableStream<T>\n implements IterableReadableStreamInterface<T>\n{\n public reader: ReadableStreamDefaultReader<T>;\n\n ensureReader() {\n if (!this.reader) {\n this.reader = this.getReader();\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n this.ensureReader();\n try {\n const result = await this.reader.read();\n if (result.done) {\n this.reader.releaseLock(); // release lock when stream becomes closed\n return {\n done: true,\n value: undefined,\n };\n } else {\n return {\n done: false,\n value: result.value,\n };\n }\n } catch (e) {\n this.reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n }\n\n async return(): Promise<IteratorResult<T>> {\n this.ensureReader();\n // If wrapped in a Node stream, cancel is already called.\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n return { done: true, value: undefined };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async throw(e: any): Promise<IteratorResult<T>> {\n this.ensureReader();\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n throw e;\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n\n static fromReadableStream<T>(stream: ReadableStream<T>) {\n // From https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams#reading_the_stream\n const reader = stream.getReader();\n return new IterableReadableStream<T>({\n start(controller) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n }\n\n static fromAsyncGenerator<T>(generator: AsyncGenerator<T>) {\n return new IterableReadableStream<T>({\n async pull(controller) {\n const { value, done } = await generator.next();\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n }\n // Fix: `else if (value)` will hang the streaming when nullish value (e.g. empty string) is pulled\n controller.enqueue(value);\n },\n async cancel(reason) {\n await generator.return(reason);\n },\n });\n }\n}\n\nexport function atee<T>(\n iter: AsyncGenerator<T>,\n length = 2\n): AsyncGenerator<T>[] {\n const buffers = Array.from(\n { length },\n () => [] as Array<IteratorResult<T> | IteratorReturnResult<T>>\n );\n return buffers.map(async function* makeIter(buffer) {\n while (true) {\n if (buffer.length === 0) {\n const result = await iter.next();\n for (const buffer of buffers) {\n buffer.push(result);\n }\n } else if (buffer[0].done) {\n return;\n } else {\n yield buffer.shift()!.value;\n }\n }\n });\n}\n\nexport function concat<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Array<any> | string | number | Record<string, any> | any,\n>(first: T, second: T): T {\n if (Array.isArray(first) && Array.isArray(second)) {\n return first.concat(second) as T;\n } else if (typeof first === \"string\" && typeof second === \"string\") {\n return (first + second) as T;\n } else if (typeof first === \"number\" && typeof second === \"number\") {\n return (first + second) as T;\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"concat\" in (first as any) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (first as any).concat === \"function\"\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (first as any).concat(second) as T;\n } else if (typeof first === \"object\" && typeof second === \"object\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chunk = { ...first } as Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const [key, value] of Object.entries(second as Record<string, any>)) {\n if (key in chunk && !Array.isArray(chunk[key])) {\n chunk[key] = concat(chunk[key], value);\n } else {\n chunk[key] = value;\n }\n }\n return chunk as T;\n } else {\n throw new Error(`Cannot concat ${typeof first} and ${typeof second}`);\n }\n}\n\nexport class AsyncGeneratorWithSetup<\n S = unknown,\n T = unknown,\n TReturn = unknown,\n TNext = unknown,\n> implements AsyncGenerator<T, TReturn, TNext>\n{\n private generator: AsyncGenerator<T>;\n\n public setup: Promise<S>;\n\n public config?: unknown;\n\n public signal?: AbortSignal;\n\n private firstResult: Promise<IteratorResult<T>>;\n\n private firstResultUsed = false;\n\n constructor(params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }) {\n this.generator = params.generator;\n this.config = params.config;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.signal = params.signal ?? (this.config as any)?.signal;\n // setup is a promise that resolves only after the first iterator value\n // is available. this is useful when setup of several piped generators\n // needs to happen in logical order, ie. in the order in which input to\n // to each generator is available.\n this.setup = new Promise((resolve, reject) => {\n // eslint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n params.config as Record<string, unknown> | undefined\n ),\n async () => {\n this.firstResult = params.generator.next();\n if (params.startSetup) {\n this.firstResult.then(params.startSetup).then(resolve, reject);\n } else {\n this.firstResult.then((_result) => resolve(undefined as S), reject);\n }\n },\n true\n );\n });\n }\n\n async next(...args: [] | [TNext]): Promise<IteratorResult<T>> {\n this.signal?.throwIfAborted();\n\n if (!this.firstResultUsed) {\n this.firstResultUsed = true;\n return this.firstResult;\n }\n\n return AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n this.config as Record<string, unknown> | undefined\n ),\n this.signal\n ? async () => {\n return raceWithSignal(this.generator.next(...args), this.signal);\n }\n : async () => {\n return this.generator.next(...args);\n },\n true\n );\n }\n\n async return(\n value?: TReturn | PromiseLike<TReturn>\n ): Promise<IteratorResult<T>> {\n return this.generator.return(value);\n }\n\n async throw(e: Error): Promise<IteratorResult<T>> {\n return this.generator.throw(e);\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n}\n\nexport async function pipeGeneratorWithSetup<\n S,\n A extends unknown[],\n T,\n TReturn,\n TNext,\n U,\n UReturn,\n UNext,\n>(\n to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>,\n generator: AsyncGenerator<T, TReturn, TNext>,\n startSetup: () => Promise<S>,\n signal: AbortSignal | undefined,\n ...args: A\n) {\n const gen = new AsyncGeneratorWithSetup({\n generator,\n startSetup,\n signal,\n });\n const setup = await gen.setup;\n return { output: to(gen, setup, ...args), setup };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.js","names":["e: any","stream: ReadableStream<T>","generator: AsyncGenerator<T>","iter: AsyncGenerator<T>","buffer","first: T","second: T","params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }","value?: TReturn | PromiseLike<TReturn>","e: Error","to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>","generator: AsyncGenerator<T, TReturn, TNext>","startSetup: () => Promise<S>","signal: AbortSignal | undefined"],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { pickRunnableConfigKeys } from \"../runnables/config.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport type { IterableReadableStreamInterface } from \"../types/_internal.js\";\nimport { raceWithSignal } from \"./signal.js\";\n\n// Re-exported for backwards compatibility\n// Do NOT import this type from this file inside the project. Instead, always import from `types/_internal.js`\n// when using internally\nexport type { IterableReadableStreamInterface };\n\n/*\n * Support async iterator syntax for ReadableStreams in all environments.\n * Source: https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport class IterableReadableStream<T>\n extends ReadableStream<T>\n implements IterableReadableStreamInterface<T>\n{\n public reader: ReadableStreamDefaultReader<T>;\n\n ensureReader() {\n if (!this.reader) {\n this.reader = this.getReader();\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n this.ensureReader();\n try {\n const result = await this.reader.read();\n if (result.done) {\n this.reader.releaseLock(); // release lock when stream becomes closed\n return {\n done: true,\n value: undefined,\n };\n } else {\n return {\n done: false,\n value: result.value,\n };\n }\n } catch (e) {\n this.reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n }\n\n async return(): Promise<IteratorResult<T>> {\n this.ensureReader();\n // If wrapped in a Node stream, cancel is already called.\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n return { done: true, value: undefined };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async throw(e: any): Promise<IteratorResult<T>> {\n this.ensureReader();\n if (this.locked) {\n const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet\n this.reader.releaseLock(); // release lock first\n await cancelPromise; // now await it\n }\n throw e;\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n\n static fromReadableStream<T>(stream: ReadableStream<T>) {\n // From https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams#reading_the_stream\n const reader = stream.getReader();\n return new IterableReadableStream<T>({\n start(controller) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n }\n\n static fromAsyncGenerator<T>(generator: AsyncGenerator<T>) {\n return new IterableReadableStream<T>({\n async pull(controller) {\n const { value, done } = await generator.next();\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n }\n // Fix: `else if (value)` will hang the streaming when nullish value (e.g. empty string) is pulled\n controller.enqueue(value);\n },\n async cancel(reason) {\n await generator.return(reason);\n },\n });\n }\n}\n\nexport function atee<T>(\n iter: AsyncGenerator<T>,\n length = 2\n): AsyncGenerator<T>[] {\n const buffers = Array.from(\n { length },\n () => [] as Array<IteratorResult<T> | IteratorReturnResult<T>>\n );\n return buffers.map(async function* makeIter(buffer) {\n while (true) {\n if (buffer.length === 0) {\n const result = await iter.next();\n for (const buffer of buffers) {\n buffer.push(result);\n }\n } else if (buffer[0].done) {\n return;\n } else {\n yield buffer.shift()!.value;\n }\n }\n });\n}\n\nexport function concat<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Array<any> | string | number | Record<string, any> | any,\n>(first: T, second: T): T {\n if (Array.isArray(first) && Array.isArray(second)) {\n return first.concat(second) as T;\n } else if (typeof first === \"string\" && typeof second === \"string\") {\n return (first + second) as T;\n } else if (typeof first === \"number\" && typeof second === \"number\") {\n return (first + second) as T;\n } else if (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"concat\" in (first as any) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (first as any).concat === \"function\"\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (first as any).concat(second) as T;\n } else if (typeof first === \"object\" && typeof second === \"object\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chunk = { ...first } as Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const [key, value] of Object.entries(second as Record<string, any>)) {\n if (key in chunk && !Array.isArray(chunk[key])) {\n chunk[key] = concat(chunk[key], value);\n } else {\n chunk[key] = value;\n }\n }\n return chunk as T;\n } else {\n throw new Error(`Cannot concat ${typeof first} and ${typeof second}`);\n }\n}\n\nexport class AsyncGeneratorWithSetup<\n S = unknown,\n T = unknown,\n TReturn = unknown,\n TNext = unknown,\n> implements AsyncGenerator<T, TReturn, TNext> {\n private generator: AsyncGenerator<T>;\n\n public setup: Promise<S>;\n\n public config?: unknown;\n\n public signal?: AbortSignal;\n\n private firstResult: Promise<IteratorResult<T>>;\n\n private firstResultUsed = false;\n\n constructor(params: {\n generator: AsyncGenerator<T>;\n startSetup?: () => Promise<S>;\n config?: unknown;\n signal?: AbortSignal;\n }) {\n this.generator = params.generator;\n this.config = params.config;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.signal = params.signal ?? (this.config as any)?.signal;\n // setup is a promise that resolves only after the first iterator value\n // is available. this is useful when setup of several piped generators\n // needs to happen in logical order, ie. in the order in which input to\n // to each generator is available.\n this.setup = new Promise((resolve, reject) => {\n // eslint-disable-next-line no-void\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n params.config as Record<string, unknown> | undefined\n ),\n async () => {\n this.firstResult = params.generator.next();\n if (params.startSetup) {\n this.firstResult.then(params.startSetup).then(resolve, reject);\n } else {\n this.firstResult.then((_result) => resolve(undefined as S), reject);\n }\n },\n true\n );\n });\n }\n\n async next(...args: [] | [TNext]): Promise<IteratorResult<T>> {\n this.signal?.throwIfAborted();\n\n if (!this.firstResultUsed) {\n this.firstResultUsed = true;\n return this.firstResult;\n }\n\n return AsyncLocalStorageProviderSingleton.runWithConfig(\n pickRunnableConfigKeys(\n this.config as Record<string, unknown> | undefined\n ),\n this.signal\n ? async () => {\n return raceWithSignal(this.generator.next(...args), this.signal);\n }\n : async () => {\n return this.generator.next(...args);\n },\n true\n );\n }\n\n async return(\n value?: TReturn | PromiseLike<TReturn>\n ): Promise<IteratorResult<T>> {\n return this.generator.return(value);\n }\n\n async throw(e: Error): Promise<IteratorResult<T>> {\n return this.generator.throw(e);\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Not present in Node 18 types, required in latest Node 22\n async [Symbol.asyncDispose]() {\n await this.return();\n }\n}\n\nexport async function pipeGeneratorWithSetup<\n S,\n A extends unknown[],\n T,\n TReturn,\n TNext,\n U,\n UReturn,\n UNext,\n>(\n to: (\n g: AsyncGenerator<T, TReturn, TNext>,\n s: S,\n ...args: A\n ) => AsyncGenerator<U, UReturn, UNext>,\n generator: AsyncGenerator<T, TReturn, TNext>,\n startSetup: () => Promise<S>,\n signal: AbortSignal | undefined,\n ...args: A\n) {\n const gen = new AsyncGeneratorWithSetup({\n generator,\n startSetup,\n signal,\n });\n const setup = await gen.setup;\n return { output: to(gen, setup, ...args), setup };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_models.cjs","names":["BaseChatModel","messages: BaseMessage[]","options?: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","AIMessage","tools: (StructuredTool | ToolSpec)[]","toJsonSchema","_options: this[\"ParsedCallOptions\"]","_runManager?: CallbackManagerForLLMRun","generation: ChatResult","_messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","ChatGenerationChunk","AIMessageChunk","params: FakeChatInput","text: string","generationInfo?: Record<string, any>","_params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","_config?: StructuredOutputMethodOptions<boolean>","RunnableLambda"],"sources":["../../../src/utils/testing/chat_models.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"../../callbacks/manager.js\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n BaseChatModelParams,\n} from \"../../language_models/chat_models.js\";\nimport { BaseLLMParams } from \"../../language_models/llms.js\";\nimport {\n BaseMessage,\n AIMessage,\n AIMessageChunk,\n} from \"../../messages/index.js\";\nimport { type ChatResult, ChatGenerationChunk } from \"../../outputs.js\";\nimport { Runnable, RunnableLambda } from \"../../runnables/base.js\";\nimport { StructuredTool } from \"../../tools/index.js\";\nimport {\n StructuredOutputMethodParams,\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"../../language_models/base.js\";\n\nimport { toJsonSchema } from \"../json_schema.js\";\nimport { InteropZodType } from \"../types/zod.js\";\n\n/** Minimal shape actually needed by `bindTools` */\nexport interface ToolSpec {\n name: string;\n description?: string;\n schema: InteropZodType | Record<string, unknown>; // Either a Zod schema *or* a plain JSON-Schema object\n}\n\n/**\n * Interface specific to the Fake Streaming Chat model.\n */\nexport interface FakeStreamingChatModelCallOptions\n extends BaseChatModelCallOptions {}\n/**\n * Interface for the Constructor-field specific to the Fake Streaming Chat model (all optional because we fill in defaults).\n */\nexport interface FakeStreamingChatModelFields extends BaseChatModelParams {\n /** Milliseconds to pause between fallback char-by-char chunks */\n sleep?: number;\n\n /** Full AI messages to fall back to when no `chunks` supplied */\n responses?: BaseMessage[];\n\n /** Exact chunks to emit (can include tool-call deltas) */\n chunks?: AIMessageChunk[];\n\n /** How tool specs are formatted in `bindTools` */\n toolStyle?: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\";\n\n /** Throw this error instead of streaming (useful in tests) */\n thrownErrorString?: string;\n}\n\nexport class FakeChatModel extends BaseChatModel {\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake\";\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (options?.stop?.length) {\n return {\n generations: [\n {\n message: new AIMessage(options.stop[0]),\n text: options.stop[0],\n },\n ],\n };\n }\n const text = messages\n .map((m) => {\n if (typeof m.content === \"string\") {\n return m.content;\n }\n return JSON.stringify(m.content, null, 2);\n })\n .join(\"\\n\");\n await runManager?.handleLLMNewToken(text);\n return {\n generations: [\n {\n message: new AIMessage(text),\n text,\n },\n ],\n llmOutput: {},\n };\n }\n}\n\nexport class FakeStreamingChatModel extends BaseChatModel<FakeStreamingChatModelCallOptions> {\n sleep = 50;\n\n responses: BaseMessage[] = [];\n\n chunks: AIMessageChunk[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n thrownErrorString?: string;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n constructor({\n sleep = 50,\n responses = [],\n chunks = [],\n toolStyle = \"openai\",\n thrownErrorString,\n ...rest\n }: FakeStreamingChatModelFields & BaseLLMParams) {\n super(rest);\n this.sleep = sleep;\n this.responses = responses;\n this.chunks = chunks;\n this.toolStyle = toolStyle;\n this.thrownErrorString = thrownErrorString;\n }\n\n _llmType() {\n return \"fake\";\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n /* creating a *new* instance – mirrors LangChain .bind semantics for type-safety and avoiding noise */\n const next = new FakeStreamingChatModel({\n sleep: this.sleep,\n responses: this.responses,\n chunks: this.chunks,\n toolStyle: this.toolStyle,\n thrownErrorString: this.thrownErrorString,\n });\n next.tools = merged;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n async _generate(\n messages: BaseMessage[],\n _options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n\n const content = this.responses?.[0]?.content ?? messages[0].content ?? \"\";\n\n const generation: ChatResult = {\n generations: [\n {\n text: \"\",\n message: new AIMessage({\n content,\n tool_calls: this.chunks?.[0]?.tool_calls,\n }),\n },\n ],\n };\n\n return generation;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n if (this.chunks?.length) {\n for (const msgChunk of this.chunks) {\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: msgChunk.content,\n tool_calls: msgChunk.tool_calls,\n additional_kwargs: msgChunk.additional_kwargs ?? {},\n }),\n text: msgChunk.content?.toString() ?? \"\",\n });\n\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n msgChunk.content as string,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n return;\n }\n\n const fallback =\n this.responses?.[0] ??\n new AIMessage(\n typeof _messages[0].content === \"string\" ? _messages[0].content : \"\"\n );\n const text = typeof fallback.content === \"string\" ? fallback.content : \"\";\n\n for (const ch of text) {\n await new Promise((r) => setTimeout(r, this.sleep));\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({ content: ch }),\n text: ch,\n });\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n ch,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n }\n}\n\n/**\n * Interface for the input parameters specific to the Fake List Chat model.\n */\nexport interface FakeChatInput extends BaseChatModelParams {\n /** Responses to return */\n responses: string[];\n\n /** Time to sleep in milliseconds between responses */\n sleep?: number;\n\n emitCustomEvent?: boolean;\n\n /**\n * Generation info to include on the last chunk during streaming.\n * This gets merged into response_metadata by the base chat model.\n * Useful for testing response_metadata propagation (e.g., finish_reason).\n */\n generationInfo?: Record<string, unknown>;\n}\n\nexport interface FakeListChatModelCallOptions extends BaseChatModelCallOptions {\n thrownErrorString?: string;\n}\n\n/**\n * A fake Chat Model that returns a predefined list of responses. It can be used\n * for testing purposes.\n * @example\n * ```typescript\n * const chat = new FakeListChatModel({\n * responses: [\"I'll callback later.\", \"You 'console' them!\"]\n * });\n *\n * const firstMessage = new HumanMessage(\"You want to hear a JavaScript joke?\");\n * const secondMessage = new HumanMessage(\"How do you cheer up a JavaScript developer?\");\n *\n * // Call the chat model with a message and log the response\n * const firstResponse = await chat.call([firstMessage]);\n * console.log({ firstResponse });\n *\n * const secondResponse = await chat.call([secondMessage]);\n * console.log({ secondResponse });\n * ```\n */\nexport class FakeListChatModel extends BaseChatModel<FakeListChatModelCallOptions> {\n static lc_name() {\n return \"FakeListChatModel\";\n }\n\n lc_serializable = true;\n\n responses: string[];\n\n i = 0;\n\n sleep?: number;\n\n emitCustomEvent = false;\n\n generationInfo?: Record<string, unknown>;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n constructor(params: FakeChatInput) {\n super(params);\n const { responses, sleep, emitCustomEvent, generationInfo } = params;\n this.responses = responses;\n this.sleep = sleep;\n this.emitCustomEvent = emitCustomEvent ?? this.emitCustomEvent;\n this.generationInfo = generationInfo;\n }\n\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake-list\";\n }\n\n async _generate(\n _messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n if (options?.stop?.length) {\n return {\n generations: [this._formatGeneration(options.stop[0])],\n };\n } else {\n const response = this._currentResponse();\n this._incrementResponse();\n\n return {\n generations: [this._formatGeneration(response)],\n llmOutput: {},\n };\n }\n }\n\n _formatGeneration(text: string) {\n return {\n message: new AIMessage(text),\n text,\n };\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const response = this._currentResponse();\n this._incrementResponse();\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n const responseChars = [...response];\n for (let i = 0; i < responseChars.length; i++) {\n const text = responseChars[i];\n const isLastChunk = i === responseChars.length - 1;\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n // Include generationInfo on the last chunk (like real providers do)\n // This gets merged into response_metadata by the base chat model\n const chunk = this._createResponseChunk(\n text,\n isLastChunk ? this.generationInfo : undefined\n );\n if (options.signal?.aborted) break;\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(text);\n }\n }\n\n async _sleepIfRequested() {\n if (this.sleep !== undefined) {\n await this._sleep();\n }\n }\n\n async _sleep() {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), this.sleep);\n });\n }\n\n _createResponseChunk(\n text: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n generationInfo?: Record<string, any>\n ): ChatGenerationChunk {\n return new ChatGenerationChunk({\n message: new AIMessageChunk({ content: text }),\n text,\n generationInfo,\n });\n }\n\n _currentResponse() {\n return this.responses[this.i];\n }\n\n _incrementResponse() {\n if (this.i < this.responses.length - 1) {\n this.i += 1;\n } else {\n this.i = 0;\n }\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n const next = new FakeListChatModel({\n responses: this.responses,\n sleep: this.sleep,\n emitCustomEvent: this.emitCustomEvent,\n generationInfo: this.generationInfo,\n });\n next.tools = merged;\n next.toolStyle = this.toolStyle;\n next.i = this.i;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, false>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, true>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n _config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n return RunnableLambda.from(async (input) => {\n const message = await this.invoke(input);\n if (message.tool_calls?.[0]?.args) {\n return message.tool_calls[0].args as RunOutput;\n }\n if (typeof message.content === \"string\") {\n return JSON.parse(message.content);\n }\n throw new Error(\"No structured output found\");\n }) as Runnable;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat_models.cjs","names":["BaseChatModel","messages: BaseMessage[]","options?: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","AIMessage","tools: (StructuredTool | ToolSpec)[]","toJsonSchema","_options: this[\"ParsedCallOptions\"]","_runManager?: CallbackManagerForLLMRun","generation: ChatResult","_messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","ChatGenerationChunk","AIMessageChunk","params: FakeChatInput","text: string","generationInfo?: Record<string, any>","_params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","_config?: StructuredOutputMethodOptions<boolean>","RunnableLambda"],"sources":["../../../src/utils/testing/chat_models.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"../../callbacks/manager.js\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n BaseChatModelParams,\n} from \"../../language_models/chat_models.js\";\nimport { BaseLLMParams } from \"../../language_models/llms.js\";\nimport {\n BaseMessage,\n AIMessage,\n AIMessageChunk,\n} from \"../../messages/index.js\";\nimport { type ChatResult, ChatGenerationChunk } from \"../../outputs.js\";\nimport { Runnable, RunnableLambda } from \"../../runnables/base.js\";\nimport { StructuredTool } from \"../../tools/index.js\";\nimport {\n StructuredOutputMethodParams,\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"../../language_models/base.js\";\n\nimport { toJsonSchema } from \"../json_schema.js\";\nimport { InteropZodType } from \"../types/zod.js\";\n\n/** Minimal shape actually needed by `bindTools` */\nexport interface ToolSpec {\n name: string;\n description?: string;\n schema: InteropZodType | Record<string, unknown>; // Either a Zod schema *or* a plain JSON-Schema object\n}\n\n/**\n * Interface specific to the Fake Streaming Chat model.\n */\nexport interface FakeStreamingChatModelCallOptions extends BaseChatModelCallOptions {}\n/**\n * Interface for the Constructor-field specific to the Fake Streaming Chat model (all optional because we fill in defaults).\n */\nexport interface FakeStreamingChatModelFields extends BaseChatModelParams {\n /** Milliseconds to pause between fallback char-by-char chunks */\n sleep?: number;\n\n /** Full AI messages to fall back to when no `chunks` supplied */\n responses?: BaseMessage[];\n\n /** Exact chunks to emit (can include tool-call deltas) */\n chunks?: AIMessageChunk[];\n\n /** How tool specs are formatted in `bindTools` */\n toolStyle?: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\";\n\n /** Throw this error instead of streaming (useful in tests) */\n thrownErrorString?: string;\n}\n\nexport class FakeChatModel extends BaseChatModel {\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake\";\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (options?.stop?.length) {\n return {\n generations: [\n {\n message: new AIMessage(options.stop[0]),\n text: options.stop[0],\n },\n ],\n };\n }\n const text = messages\n .map((m) => {\n if (typeof m.content === \"string\") {\n return m.content;\n }\n return JSON.stringify(m.content, null, 2);\n })\n .join(\"\\n\");\n await runManager?.handleLLMNewToken(text);\n return {\n generations: [\n {\n message: new AIMessage(text),\n text,\n },\n ],\n llmOutput: {},\n };\n }\n}\n\nexport class FakeStreamingChatModel extends BaseChatModel<FakeStreamingChatModelCallOptions> {\n sleep = 50;\n\n responses: BaseMessage[] = [];\n\n chunks: AIMessageChunk[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n thrownErrorString?: string;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n constructor({\n sleep = 50,\n responses = [],\n chunks = [],\n toolStyle = \"openai\",\n thrownErrorString,\n ...rest\n }: FakeStreamingChatModelFields & BaseLLMParams) {\n super(rest);\n this.sleep = sleep;\n this.responses = responses;\n this.chunks = chunks;\n this.toolStyle = toolStyle;\n this.thrownErrorString = thrownErrorString;\n }\n\n _llmType() {\n return \"fake\";\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n /* creating a *new* instance – mirrors LangChain .bind semantics for type-safety and avoiding noise */\n const next = new FakeStreamingChatModel({\n sleep: this.sleep,\n responses: this.responses,\n chunks: this.chunks,\n toolStyle: this.toolStyle,\n thrownErrorString: this.thrownErrorString,\n });\n next.tools = merged;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n async _generate(\n messages: BaseMessage[],\n _options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n\n const content = this.responses?.[0]?.content ?? messages[0].content ?? \"\";\n\n const generation: ChatResult = {\n generations: [\n {\n text: \"\",\n message: new AIMessage({\n content,\n tool_calls: this.chunks?.[0]?.tool_calls,\n }),\n },\n ],\n };\n\n return generation;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n if (this.chunks?.length) {\n for (const msgChunk of this.chunks) {\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: msgChunk.content,\n tool_calls: msgChunk.tool_calls,\n additional_kwargs: msgChunk.additional_kwargs ?? {},\n }),\n text: msgChunk.content?.toString() ?? \"\",\n });\n\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n msgChunk.content as string,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n return;\n }\n\n const fallback =\n this.responses?.[0] ??\n new AIMessage(\n typeof _messages[0].content === \"string\" ? _messages[0].content : \"\"\n );\n const text = typeof fallback.content === \"string\" ? fallback.content : \"\";\n\n for (const ch of text) {\n await new Promise((r) => setTimeout(r, this.sleep));\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({ content: ch }),\n text: ch,\n });\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n ch,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n }\n}\n\n/**\n * Interface for the input parameters specific to the Fake List Chat model.\n */\nexport interface FakeChatInput extends BaseChatModelParams {\n /** Responses to return */\n responses: string[];\n\n /** Time to sleep in milliseconds between responses */\n sleep?: number;\n\n emitCustomEvent?: boolean;\n\n /**\n * Generation info to include on the last chunk during streaming.\n * This gets merged into response_metadata by the base chat model.\n * Useful for testing response_metadata propagation (e.g., finish_reason).\n */\n generationInfo?: Record<string, unknown>;\n}\n\nexport interface FakeListChatModelCallOptions extends BaseChatModelCallOptions {\n thrownErrorString?: string;\n}\n\n/**\n * A fake Chat Model that returns a predefined list of responses. It can be used\n * for testing purposes.\n * @example\n * ```typescript\n * const chat = new FakeListChatModel({\n * responses: [\"I'll callback later.\", \"You 'console' them!\"]\n * });\n *\n * const firstMessage = new HumanMessage(\"You want to hear a JavaScript joke?\");\n * const secondMessage = new HumanMessage(\"How do you cheer up a JavaScript developer?\");\n *\n * // Call the chat model with a message and log the response\n * const firstResponse = await chat.call([firstMessage]);\n * console.log({ firstResponse });\n *\n * const secondResponse = await chat.call([secondMessage]);\n * console.log({ secondResponse });\n * ```\n */\nexport class FakeListChatModel extends BaseChatModel<FakeListChatModelCallOptions> {\n static lc_name() {\n return \"FakeListChatModel\";\n }\n\n lc_serializable = true;\n\n responses: string[];\n\n i = 0;\n\n sleep?: number;\n\n emitCustomEvent = false;\n\n generationInfo?: Record<string, unknown>;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n constructor(params: FakeChatInput) {\n super(params);\n const { responses, sleep, emitCustomEvent, generationInfo } = params;\n this.responses = responses;\n this.sleep = sleep;\n this.emitCustomEvent = emitCustomEvent ?? this.emitCustomEvent;\n this.generationInfo = generationInfo;\n }\n\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake-list\";\n }\n\n async _generate(\n _messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n if (options?.stop?.length) {\n return {\n generations: [this._formatGeneration(options.stop[0])],\n };\n } else {\n const response = this._currentResponse();\n this._incrementResponse();\n\n return {\n generations: [this._formatGeneration(response)],\n llmOutput: {},\n };\n }\n }\n\n _formatGeneration(text: string) {\n return {\n message: new AIMessage(text),\n text,\n };\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const response = this._currentResponse();\n this._incrementResponse();\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n const responseChars = [...response];\n for (let i = 0; i < responseChars.length; i++) {\n const text = responseChars[i];\n const isLastChunk = i === responseChars.length - 1;\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n // Include generationInfo on the last chunk (like real providers do)\n // This gets merged into response_metadata by the base chat model\n const chunk = this._createResponseChunk(\n text,\n isLastChunk ? this.generationInfo : undefined\n );\n if (options.signal?.aborted) break;\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(text);\n }\n }\n\n async _sleepIfRequested() {\n if (this.sleep !== undefined) {\n await this._sleep();\n }\n }\n\n async _sleep() {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), this.sleep);\n });\n }\n\n _createResponseChunk(\n text: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n generationInfo?: Record<string, any>\n ): ChatGenerationChunk {\n return new ChatGenerationChunk({\n message: new AIMessageChunk({ content: text }),\n text,\n generationInfo,\n });\n }\n\n _currentResponse() {\n return this.responses[this.i];\n }\n\n _incrementResponse() {\n if (this.i < this.responses.length - 1) {\n this.i += 1;\n } else {\n this.i = 0;\n }\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n const next = new FakeListChatModel({\n responses: this.responses,\n sleep: this.sleep,\n emitCustomEvent: this.emitCustomEvent,\n generationInfo: this.generationInfo,\n });\n next.tools = merged;\n next.toolStyle = this.toolStyle;\n next.i = this.i;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, false>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, true>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n _config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n return RunnableLambda.from(async (input) => {\n const message = await this.invoke(input);\n if (message.tool_calls?.[0]?.args) {\n return message.tool_calls[0].args as RunOutput;\n }\n if (typeof message.content === \"string\") {\n return JSON.parse(message.content);\n }\n throw new Error(\"No structured output found\");\n }) as Runnable;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_models.js","names":["messages: BaseMessage[]","options?: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","tools: (StructuredTool | ToolSpec)[]","_options: this[\"ParsedCallOptions\"]","_runManager?: CallbackManagerForLLMRun","generation: ChatResult","_messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","params: FakeChatInput","text: string","generationInfo?: Record<string, any>","_params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","_config?: StructuredOutputMethodOptions<boolean>"],"sources":["../../../src/utils/testing/chat_models.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"../../callbacks/manager.js\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n BaseChatModelParams,\n} from \"../../language_models/chat_models.js\";\nimport { BaseLLMParams } from \"../../language_models/llms.js\";\nimport {\n BaseMessage,\n AIMessage,\n AIMessageChunk,\n} from \"../../messages/index.js\";\nimport { type ChatResult, ChatGenerationChunk } from \"../../outputs.js\";\nimport { Runnable, RunnableLambda } from \"../../runnables/base.js\";\nimport { StructuredTool } from \"../../tools/index.js\";\nimport {\n StructuredOutputMethodParams,\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"../../language_models/base.js\";\n\nimport { toJsonSchema } from \"../json_schema.js\";\nimport { InteropZodType } from \"../types/zod.js\";\n\n/** Minimal shape actually needed by `bindTools` */\nexport interface ToolSpec {\n name: string;\n description?: string;\n schema: InteropZodType | Record<string, unknown>; // Either a Zod schema *or* a plain JSON-Schema object\n}\n\n/**\n * Interface specific to the Fake Streaming Chat model.\n */\nexport interface FakeStreamingChatModelCallOptions\n extends BaseChatModelCallOptions {}\n/**\n * Interface for the Constructor-field specific to the Fake Streaming Chat model (all optional because we fill in defaults).\n */\nexport interface FakeStreamingChatModelFields extends BaseChatModelParams {\n /** Milliseconds to pause between fallback char-by-char chunks */\n sleep?: number;\n\n /** Full AI messages to fall back to when no `chunks` supplied */\n responses?: BaseMessage[];\n\n /** Exact chunks to emit (can include tool-call deltas) */\n chunks?: AIMessageChunk[];\n\n /** How tool specs are formatted in `bindTools` */\n toolStyle?: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\";\n\n /** Throw this error instead of streaming (useful in tests) */\n thrownErrorString?: string;\n}\n\nexport class FakeChatModel extends BaseChatModel {\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake\";\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (options?.stop?.length) {\n return {\n generations: [\n {\n message: new AIMessage(options.stop[0]),\n text: options.stop[0],\n },\n ],\n };\n }\n const text = messages\n .map((m) => {\n if (typeof m.content === \"string\") {\n return m.content;\n }\n return JSON.stringify(m.content, null, 2);\n })\n .join(\"\\n\");\n await runManager?.handleLLMNewToken(text);\n return {\n generations: [\n {\n message: new AIMessage(text),\n text,\n },\n ],\n llmOutput: {},\n };\n }\n}\n\nexport class FakeStreamingChatModel extends BaseChatModel<FakeStreamingChatModelCallOptions> {\n sleep = 50;\n\n responses: BaseMessage[] = [];\n\n chunks: AIMessageChunk[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n thrownErrorString?: string;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n constructor({\n sleep = 50,\n responses = [],\n chunks = [],\n toolStyle = \"openai\",\n thrownErrorString,\n ...rest\n }: FakeStreamingChatModelFields & BaseLLMParams) {\n super(rest);\n this.sleep = sleep;\n this.responses = responses;\n this.chunks = chunks;\n this.toolStyle = toolStyle;\n this.thrownErrorString = thrownErrorString;\n }\n\n _llmType() {\n return \"fake\";\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n /* creating a *new* instance – mirrors LangChain .bind semantics for type-safety and avoiding noise */\n const next = new FakeStreamingChatModel({\n sleep: this.sleep,\n responses: this.responses,\n chunks: this.chunks,\n toolStyle: this.toolStyle,\n thrownErrorString: this.thrownErrorString,\n });\n next.tools = merged;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n async _generate(\n messages: BaseMessage[],\n _options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n\n const content = this.responses?.[0]?.content ?? messages[0].content ?? \"\";\n\n const generation: ChatResult = {\n generations: [\n {\n text: \"\",\n message: new AIMessage({\n content,\n tool_calls: this.chunks?.[0]?.tool_calls,\n }),\n },\n ],\n };\n\n return generation;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n if (this.chunks?.length) {\n for (const msgChunk of this.chunks) {\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: msgChunk.content,\n tool_calls: msgChunk.tool_calls,\n additional_kwargs: msgChunk.additional_kwargs ?? {},\n }),\n text: msgChunk.content?.toString() ?? \"\",\n });\n\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n msgChunk.content as string,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n return;\n }\n\n const fallback =\n this.responses?.[0] ??\n new AIMessage(\n typeof _messages[0].content === \"string\" ? _messages[0].content : \"\"\n );\n const text = typeof fallback.content === \"string\" ? fallback.content : \"\";\n\n for (const ch of text) {\n await new Promise((r) => setTimeout(r, this.sleep));\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({ content: ch }),\n text: ch,\n });\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n ch,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n }\n}\n\n/**\n * Interface for the input parameters specific to the Fake List Chat model.\n */\nexport interface FakeChatInput extends BaseChatModelParams {\n /** Responses to return */\n responses: string[];\n\n /** Time to sleep in milliseconds between responses */\n sleep?: number;\n\n emitCustomEvent?: boolean;\n\n /**\n * Generation info to include on the last chunk during streaming.\n * This gets merged into response_metadata by the base chat model.\n * Useful for testing response_metadata propagation (e.g., finish_reason).\n */\n generationInfo?: Record<string, unknown>;\n}\n\nexport interface FakeListChatModelCallOptions extends BaseChatModelCallOptions {\n thrownErrorString?: string;\n}\n\n/**\n * A fake Chat Model that returns a predefined list of responses. It can be used\n * for testing purposes.\n * @example\n * ```typescript\n * const chat = new FakeListChatModel({\n * responses: [\"I'll callback later.\", \"You 'console' them!\"]\n * });\n *\n * const firstMessage = new HumanMessage(\"You want to hear a JavaScript joke?\");\n * const secondMessage = new HumanMessage(\"How do you cheer up a JavaScript developer?\");\n *\n * // Call the chat model with a message and log the response\n * const firstResponse = await chat.call([firstMessage]);\n * console.log({ firstResponse });\n *\n * const secondResponse = await chat.call([secondMessage]);\n * console.log({ secondResponse });\n * ```\n */\nexport class FakeListChatModel extends BaseChatModel<FakeListChatModelCallOptions> {\n static lc_name() {\n return \"FakeListChatModel\";\n }\n\n lc_serializable = true;\n\n responses: string[];\n\n i = 0;\n\n sleep?: number;\n\n emitCustomEvent = false;\n\n generationInfo?: Record<string, unknown>;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n constructor(params: FakeChatInput) {\n super(params);\n const { responses, sleep, emitCustomEvent, generationInfo } = params;\n this.responses = responses;\n this.sleep = sleep;\n this.emitCustomEvent = emitCustomEvent ?? this.emitCustomEvent;\n this.generationInfo = generationInfo;\n }\n\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake-list\";\n }\n\n async _generate(\n _messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n if (options?.stop?.length) {\n return {\n generations: [this._formatGeneration(options.stop[0])],\n };\n } else {\n const response = this._currentResponse();\n this._incrementResponse();\n\n return {\n generations: [this._formatGeneration(response)],\n llmOutput: {},\n };\n }\n }\n\n _formatGeneration(text: string) {\n return {\n message: new AIMessage(text),\n text,\n };\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const response = this._currentResponse();\n this._incrementResponse();\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n const responseChars = [...response];\n for (let i = 0; i < responseChars.length; i++) {\n const text = responseChars[i];\n const isLastChunk = i === responseChars.length - 1;\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n // Include generationInfo on the last chunk (like real providers do)\n // This gets merged into response_metadata by the base chat model\n const chunk = this._createResponseChunk(\n text,\n isLastChunk ? this.generationInfo : undefined\n );\n if (options.signal?.aborted) break;\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(text);\n }\n }\n\n async _sleepIfRequested() {\n if (this.sleep !== undefined) {\n await this._sleep();\n }\n }\n\n async _sleep() {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), this.sleep);\n });\n }\n\n _createResponseChunk(\n text: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n generationInfo?: Record<string, any>\n ): ChatGenerationChunk {\n return new ChatGenerationChunk({\n message: new AIMessageChunk({ content: text }),\n text,\n generationInfo,\n });\n }\n\n _currentResponse() {\n return this.responses[this.i];\n }\n\n _incrementResponse() {\n if (this.i < this.responses.length - 1) {\n this.i += 1;\n } else {\n this.i = 0;\n }\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n const next = new FakeListChatModel({\n responses: this.responses,\n sleep: this.sleep,\n emitCustomEvent: this.emitCustomEvent,\n generationInfo: this.generationInfo,\n });\n next.tools = merged;\n next.toolStyle = this.toolStyle;\n next.i = this.i;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, false>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, true>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n _config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n return RunnableLambda.from(async (input) => {\n const message = await this.invoke(input);\n if (message.tool_calls?.[0]?.args) {\n return message.tool_calls[0].args as RunOutput;\n }\n if (typeof message.content === \"string\") {\n return JSON.parse(message.content);\n }\n throw new Error(\"No structured output found\");\n }) as Runnable;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat_models.js","names":["messages: BaseMessage[]","options?: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","tools: (StructuredTool | ToolSpec)[]","_options: this[\"ParsedCallOptions\"]","_runManager?: CallbackManagerForLLMRun","generation: ChatResult","_messages: BaseMessage[]","options: this[\"ParsedCallOptions\"]","params: FakeChatInput","text: string","generationInfo?: Record<string, any>","_params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","_config?: StructuredOutputMethodOptions<boolean>"],"sources":["../../../src/utils/testing/chat_models.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"../../callbacks/manager.js\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n BaseChatModelParams,\n} from \"../../language_models/chat_models.js\";\nimport { BaseLLMParams } from \"../../language_models/llms.js\";\nimport {\n BaseMessage,\n AIMessage,\n AIMessageChunk,\n} from \"../../messages/index.js\";\nimport { type ChatResult, ChatGenerationChunk } from \"../../outputs.js\";\nimport { Runnable, RunnableLambda } from \"../../runnables/base.js\";\nimport { StructuredTool } from \"../../tools/index.js\";\nimport {\n StructuredOutputMethodParams,\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"../../language_models/base.js\";\n\nimport { toJsonSchema } from \"../json_schema.js\";\nimport { InteropZodType } from \"../types/zod.js\";\n\n/** Minimal shape actually needed by `bindTools` */\nexport interface ToolSpec {\n name: string;\n description?: string;\n schema: InteropZodType | Record<string, unknown>; // Either a Zod schema *or* a plain JSON-Schema object\n}\n\n/**\n * Interface specific to the Fake Streaming Chat model.\n */\nexport interface FakeStreamingChatModelCallOptions extends BaseChatModelCallOptions {}\n/**\n * Interface for the Constructor-field specific to the Fake Streaming Chat model (all optional because we fill in defaults).\n */\nexport interface FakeStreamingChatModelFields extends BaseChatModelParams {\n /** Milliseconds to pause between fallback char-by-char chunks */\n sleep?: number;\n\n /** Full AI messages to fall back to when no `chunks` supplied */\n responses?: BaseMessage[];\n\n /** Exact chunks to emit (can include tool-call deltas) */\n chunks?: AIMessageChunk[];\n\n /** How tool specs are formatted in `bindTools` */\n toolStyle?: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\";\n\n /** Throw this error instead of streaming (useful in tests) */\n thrownErrorString?: string;\n}\n\nexport class FakeChatModel extends BaseChatModel {\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake\";\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (options?.stop?.length) {\n return {\n generations: [\n {\n message: new AIMessage(options.stop[0]),\n text: options.stop[0],\n },\n ],\n };\n }\n const text = messages\n .map((m) => {\n if (typeof m.content === \"string\") {\n return m.content;\n }\n return JSON.stringify(m.content, null, 2);\n })\n .join(\"\\n\");\n await runManager?.handleLLMNewToken(text);\n return {\n generations: [\n {\n message: new AIMessage(text),\n text,\n },\n ],\n llmOutput: {},\n };\n }\n}\n\nexport class FakeStreamingChatModel extends BaseChatModel<FakeStreamingChatModelCallOptions> {\n sleep = 50;\n\n responses: BaseMessage[] = [];\n\n chunks: AIMessageChunk[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n thrownErrorString?: string;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n constructor({\n sleep = 50,\n responses = [],\n chunks = [],\n toolStyle = \"openai\",\n thrownErrorString,\n ...rest\n }: FakeStreamingChatModelFields & BaseLLMParams) {\n super(rest);\n this.sleep = sleep;\n this.responses = responses;\n this.chunks = chunks;\n this.toolStyle = toolStyle;\n this.thrownErrorString = thrownErrorString;\n }\n\n _llmType() {\n return \"fake\";\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n /* creating a *new* instance – mirrors LangChain .bind semantics for type-safety and avoiding noise */\n const next = new FakeStreamingChatModel({\n sleep: this.sleep,\n responses: this.responses,\n chunks: this.chunks,\n toolStyle: this.toolStyle,\n thrownErrorString: this.thrownErrorString,\n });\n next.tools = merged;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n async _generate(\n messages: BaseMessage[],\n _options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n\n const content = this.responses?.[0]?.content ?? messages[0].content ?? \"\";\n\n const generation: ChatResult = {\n generations: [\n {\n text: \"\",\n message: new AIMessage({\n content,\n tool_calls: this.chunks?.[0]?.tool_calls,\n }),\n },\n ],\n };\n\n return generation;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (this.thrownErrorString) {\n throw new Error(this.thrownErrorString);\n }\n if (this.chunks?.length) {\n for (const msgChunk of this.chunks) {\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: msgChunk.content,\n tool_calls: msgChunk.tool_calls,\n additional_kwargs: msgChunk.additional_kwargs ?? {},\n }),\n text: msgChunk.content?.toString() ?? \"\",\n });\n\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n msgChunk.content as string,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n return;\n }\n\n const fallback =\n this.responses?.[0] ??\n new AIMessage(\n typeof _messages[0].content === \"string\" ? _messages[0].content : \"\"\n );\n const text = typeof fallback.content === \"string\" ? fallback.content : \"\";\n\n for (const ch of text) {\n await new Promise((r) => setTimeout(r, this.sleep));\n const cg = new ChatGenerationChunk({\n message: new AIMessageChunk({ content: ch }),\n text: ch,\n });\n if (options.signal?.aborted) break;\n yield cg;\n await runManager?.handleLLMNewToken(\n ch,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: cg }\n );\n }\n }\n}\n\n/**\n * Interface for the input parameters specific to the Fake List Chat model.\n */\nexport interface FakeChatInput extends BaseChatModelParams {\n /** Responses to return */\n responses: string[];\n\n /** Time to sleep in milliseconds between responses */\n sleep?: number;\n\n emitCustomEvent?: boolean;\n\n /**\n * Generation info to include on the last chunk during streaming.\n * This gets merged into response_metadata by the base chat model.\n * Useful for testing response_metadata propagation (e.g., finish_reason).\n */\n generationInfo?: Record<string, unknown>;\n}\n\nexport interface FakeListChatModelCallOptions extends BaseChatModelCallOptions {\n thrownErrorString?: string;\n}\n\n/**\n * A fake Chat Model that returns a predefined list of responses. It can be used\n * for testing purposes.\n * @example\n * ```typescript\n * const chat = new FakeListChatModel({\n * responses: [\"I'll callback later.\", \"You 'console' them!\"]\n * });\n *\n * const firstMessage = new HumanMessage(\"You want to hear a JavaScript joke?\");\n * const secondMessage = new HumanMessage(\"How do you cheer up a JavaScript developer?\");\n *\n * // Call the chat model with a message and log the response\n * const firstResponse = await chat.call([firstMessage]);\n * console.log({ firstResponse });\n *\n * const secondResponse = await chat.call([secondMessage]);\n * console.log({ secondResponse });\n * ```\n */\nexport class FakeListChatModel extends BaseChatModel<FakeListChatModelCallOptions> {\n static lc_name() {\n return \"FakeListChatModel\";\n }\n\n lc_serializable = true;\n\n responses: string[];\n\n i = 0;\n\n sleep?: number;\n\n emitCustomEvent = false;\n\n generationInfo?: Record<string, unknown>;\n\n private tools: (StructuredTool | ToolSpec)[] = [];\n\n toolStyle: \"openai\" | \"anthropic\" | \"bedrock\" | \"google\" = \"openai\";\n\n constructor(params: FakeChatInput) {\n super(params);\n const { responses, sleep, emitCustomEvent, generationInfo } = params;\n this.responses = responses;\n this.sleep = sleep;\n this.emitCustomEvent = emitCustomEvent ?? this.emitCustomEvent;\n this.generationInfo = generationInfo;\n }\n\n _combineLLMOutput() {\n return [];\n }\n\n _llmType(): string {\n return \"fake-list\";\n }\n\n async _generate(\n _messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n if (options?.stop?.length) {\n return {\n generations: [this._formatGeneration(options.stop[0])],\n };\n } else {\n const response = this._currentResponse();\n this._incrementResponse();\n\n return {\n generations: [this._formatGeneration(response)],\n llmOutput: {},\n };\n }\n }\n\n _formatGeneration(text: string) {\n return {\n message: new AIMessage(text),\n text,\n };\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const response = this._currentResponse();\n this._incrementResponse();\n if (this.emitCustomEvent) {\n await runManager?.handleCustomEvent(\"some_test_event\", {\n someval: true,\n });\n }\n\n const responseChars = [...response];\n for (let i = 0; i < responseChars.length; i++) {\n const text = responseChars[i];\n const isLastChunk = i === responseChars.length - 1;\n await this._sleepIfRequested();\n if (options?.thrownErrorString) {\n throw new Error(options.thrownErrorString);\n }\n // Include generationInfo on the last chunk (like real providers do)\n // This gets merged into response_metadata by the base chat model\n const chunk = this._createResponseChunk(\n text,\n isLastChunk ? this.generationInfo : undefined\n );\n if (options.signal?.aborted) break;\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(text);\n }\n }\n\n async _sleepIfRequested() {\n if (this.sleep !== undefined) {\n await this._sleep();\n }\n }\n\n async _sleep() {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), this.sleep);\n });\n }\n\n _createResponseChunk(\n text: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n generationInfo?: Record<string, any>\n ): ChatGenerationChunk {\n return new ChatGenerationChunk({\n message: new AIMessageChunk({ content: text }),\n text,\n generationInfo,\n });\n }\n\n _currentResponse() {\n return this.responses[this.i];\n }\n\n _incrementResponse() {\n if (this.i < this.responses.length - 1) {\n this.i += 1;\n } else {\n this.i = 0;\n }\n }\n\n bindTools(tools: (StructuredTool | ToolSpec)[]) {\n const merged = [...this.tools, ...tools];\n\n const toolDicts = merged.map((t) => {\n switch (this.toolStyle) {\n case \"openai\":\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n },\n };\n case \"anthropic\":\n return {\n name: t.name,\n description: t.description,\n input_schema: toJsonSchema(t.schema),\n };\n case \"bedrock\":\n return {\n toolSpec: {\n name: t.name,\n description: t.description,\n inputSchema: toJsonSchema(t.schema),\n },\n };\n case \"google\":\n return {\n name: t.name,\n description: t.description,\n parameters: toJsonSchema(t.schema),\n };\n default:\n throw new Error(`Unsupported tool style: ${this.toolStyle}`);\n }\n });\n\n const wrapped =\n this.toolStyle === \"google\"\n ? [{ functionDeclarations: toolDicts }]\n : toolDicts;\n\n const next = new FakeListChatModel({\n responses: this.responses,\n sleep: this.sleep,\n emitCustomEvent: this.emitCustomEvent,\n generationInfo: this.generationInfo,\n });\n next.tools = merged;\n next.toolStyle = this.toolStyle;\n next.i = this.i;\n\n return next.withConfig({ tools: wrapped } as BaseChatModelCallOptions);\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, false>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, true>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n _params:\n | StructuredOutputMethodParams<RunOutput, boolean>\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n _config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n return RunnableLambda.from(async (input) => {\n const message = await this.invoke(input);\n if (message.tool_calls?.[0]?.args) {\n return message.tool_calls[0].args as RunOutput;\n }\n if (typeof message.content === \"string\") {\n return JSON.parse(message.content);\n }\n throw new Error(\"No structured output found\");\n }) as Runnable;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.cjs","names":["StructuredTool","fields: FakeToolParams<T>","arg: ToolInputSchemaOutputType<T>","_runManager?: CallbackManagerForToolRun"],"sources":["../../../src/utils/testing/tools.ts"],"sourcesContent":["import { CallbackManagerForToolRun } from \"../../callbacks/manager.js\";\nimport { StructuredTool, ToolParams } from \"../../tools/index.js\";\nimport { ToolInputSchemaOutputType } from \"../../tools/types.js\";\nimport { InteropZodObject } from \"../types/zod.js\";\n\nexport interface FakeToolParams
|
|
1
|
+
{"version":3,"file":"tools.cjs","names":["StructuredTool","fields: FakeToolParams<T>","arg: ToolInputSchemaOutputType<T>","_runManager?: CallbackManagerForToolRun"],"sources":["../../../src/utils/testing/tools.ts"],"sourcesContent":["import { CallbackManagerForToolRun } from \"../../callbacks/manager.js\";\nimport { StructuredTool, ToolParams } from \"../../tools/index.js\";\nimport { ToolInputSchemaOutputType } from \"../../tools/types.js\";\nimport { InteropZodObject } from \"../types/zod.js\";\n\nexport interface FakeToolParams<\n T extends InteropZodObject = InteropZodObject,\n> extends ToolParams {\n name: string;\n description: string;\n schema: T;\n}\n\nexport class FakeTool<\n T extends InteropZodObject = InteropZodObject,\n> extends StructuredTool<T> {\n name: string;\n\n description: string;\n\n schema: T;\n\n constructor(fields: FakeToolParams<T>) {\n super(fields);\n this.name = fields.name;\n this.description = fields.description;\n this.schema = fields.schema;\n }\n\n protected async _call(\n arg: ToolInputSchemaOutputType<T>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n return JSON.stringify(arg);\n }\n}\n"],"mappings":";;;AAaA,IAAa,WAAb,cAEUA,mCAAkB;CAC1B;CAEA;CAEA;CAEA,YAAYC,QAA2B;EACrC,MAAM,OAAO;EACb,KAAK,OAAO,OAAO;EACnB,KAAK,cAAc,OAAO;EAC1B,KAAK,SAAS,OAAO;CACtB;CAED,MAAgB,MACdC,KACAC,aACiB;AACjB,SAAO,KAAK,UAAU,IAAI;CAC3B;AACF"}
|