From a9817a350859f6e0f51d60b63a1445534dd72213 Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Thu, 23 Feb 2023 17:22:07 +1100 Subject: [PATCH] Removing workspace specific dataloader and upgrading to latest release now that https://github.com/graphql/dataloader/pull/321 was merged and released. --- src/packages/core/package.json | 2 +- src/packages/dataloader/LICENSE | 21 -- src/packages/dataloader/README.md | 5 - src/packages/dataloader/index.d.ts | 118 ------- src/packages/dataloader/index.js | 445 --------------------------- src/packages/dataloader/package.json | 27 -- src/packages/mikroorm/package.json | 2 +- src/packages/rest/package.json | 2 +- src/packages/xero/package.json | 2 +- src/pnpm-lock.yaml | 24 +- 10 files changed, 15 insertions(+), 633 deletions(-) delete mode 100644 src/packages/dataloader/LICENSE delete mode 100644 src/packages/dataloader/README.md delete mode 100644 src/packages/dataloader/index.d.ts delete mode 100644 src/packages/dataloader/index.js delete mode 100644 src/packages/dataloader/package.json diff --git a/src/packages/core/package.json b/src/packages/core/package.json index 8bb3935fd..6606afbd8 100644 --- a/src/packages/core/package.json +++ b/src/packages/core/package.json @@ -21,7 +21,7 @@ "dependencies": { "@exogee/logger": "workspace:0.1.0", "class-validator": "0.13.2", - "dataloader": "workspace:2.1.1", + "dataloader": "2.2.2", "graphql": "16.6.0", "pluralize": "8.0.0", "reflect-metadata": "0.1.13", diff --git a/src/packages/dataloader/LICENSE b/src/packages/dataloader/LICENSE deleted file mode 100644 index 7bbf892a0..000000000 --- a/src/packages/dataloader/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) GraphQL Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/src/packages/dataloader/README.md b/src/packages/dataloader/README.md deleted file mode 100644 index 49171669d..000000000 --- a/src/packages/dataloader/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# DataLoader - -This is a fork of https://github.com/graphql/dataloader with this fix applied: https://github.com/graphql/dataloader/pull/321 - -As soon as that fix is merged and released in DataLoader proper we should delete this package. diff --git a/src/packages/dataloader/index.d.ts b/src/packages/dataloader/index.d.ts deleted file mode 100644 index 709b3e0db..000000000 --- a/src/packages/dataloader/index.d.ts +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Copyright (c) 2019-present, GraphQL Foundation - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * DataLoader creates a public API for loading data from a particular - * data back-end with unique keys such as the id column of a SQL table - * or document name in a MongoDB database, given a batch loading function. - * - * Each DataLoader instance contains a unique memoized cache. Use caution - * when used in long-lived applications or those which serve many users - * with different access permissions and consider creating a new instance - * per web request. - */ -declare class DataLoader { - constructor(batchLoadFn: DataLoader.BatchLoadFn, options?: DataLoader.Options); - - /** - * Loads a key, returning a `Promise` for the value represented by that key. - */ - load(key: K): Promise; - - /** - * Loads multiple keys, promising an array of values: - * - * var [ a, b ] = await myLoader.loadMany([ 'a', 'b' ]); - * - * This is equivalent to the more verbose: - * - * var [ a, b ] = await Promise.all([ - * myLoader.load('a'), - * myLoader.load('b') - * ]); - * - */ - loadMany(keys: ArrayLike): Promise>; - - /** - * Clears the value at `key` from the cache, if it exists. Returns itself for - * method chaining. - */ - clear(key: K): this; - - /** - * Clears the entire cache. To be used when some event results in unknown - * invalidations across this particular `DataLoader`. Returns itself for - * method chaining. - */ - clearAll(): this; - - /** - * Adds the provided key and value to the cache. If the key already exists, no - * change is made. Returns itself for method chaining. - */ - prime(key: K, value: V | PromiseLike | Error): this; -} - -declare namespace DataLoader { - // If a custom cache is provided, it must be of this type (a subset of ES6 Map). - export type CacheMap = { - get(key: K): V | void; - set(key: K, value: V): any; - delete(key: K): any; - clear(): any; - }; - - // A Function, which when given an Array of keys, returns a Promise of an Array - // of values or Errors. - export type BatchLoadFn = (keys: ReadonlyArray) => PromiseLike>; - - // Optionally turn off batching or caching or provide a cache key function or a - // custom cache instance. - export type Options = { - /** - * Default `true`. Set to `false` to disable batching, invoking - * `batchLoadFn` with a single load key. This is equivalent to setting - * `maxBatchSize` to `1`. - */ - batch?: boolean; - - /** - * Default `Infinity`. Limits the number of items that get passed in to the - * `batchLoadFn`. May be set to `1` to disable batching. - */ - maxBatchSize?: number; - - /** - * Default see https://github.com/graphql/dataloader#batch-scheduling. - * A function to schedule the later execution of a batch. The function is - * expected to call the provided callback in the immediate future. - */ - batchScheduleFn?: (callback: () => void) => void; - - /** - * Default `true`. Set to `false` to disable memoization caching, creating a - * new Promise and new key in the `batchLoadFn` for every load of the same - * key. This is equivalent to setting `cacheMap` to `null`. - */ - cache?: boolean; - - /** - * Default `key => key`. Produces cache key for a given load key. Useful - * when keys are objects and two objects should be considered equivalent. - */ - cacheKeyFn?: (key: K) => C; - - /** - * Default `new Map()`. Instance of `Map` (or an object with a similar API) - * to be used as cache. May be set to `null` to disable caching. - */ - cacheMap?: CacheMap> | null; - }; -} - -export = DataLoader; diff --git a/src/packages/dataloader/index.js b/src/packages/dataloader/index.js deleted file mode 100644 index e693bcab0..000000000 --- a/src/packages/dataloader/index.js +++ /dev/null @@ -1,445 +0,0 @@ -'use strict'; - -/** - * Copyright (c) 2019-present, GraphQL Foundation - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ -// A Function, which when given an Array of keys, returns a Promise of an Array -// of values or Errors. -// Optionally turn off batching or caching or provide a cache key function or a -// custom cache instance. -// If a custom cache is provided, it must be of this type (a subset of ES6 Map). - -/** - * A `DataLoader` creates a public API for loading data from a particular - * data back-end with unique keys such as the `id` column of a SQL table or - * document name in a MongoDB database, given a batch loading function. - * - * Each `DataLoader` instance contains a unique memoized cache. Use caution when - * used in long-lived applications or those which serve many users with - * different access permissions and consider creating a new instance per - * web request. - */ -var DataLoader = - /*#__PURE__*/ - (function () { - function DataLoader(batchLoadFn, options) { - if (typeof batchLoadFn !== 'function') { - throw new TypeError( - 'DataLoader must be constructed with a function which accepts ' + - ('Array and returns Promise>, but got: ' + batchLoadFn + '.') - ); - } - - this._batchLoadFn = batchLoadFn; - this._maxBatchSize = getValidMaxBatchSize(options); - this._batchScheduleFn = getValidBatchScheduleFn(options); - this._cacheKeyFn = getValidCacheKeyFn(options); - this._cacheMap = getValidCacheMap(options); - this._batch = null; - } // Private - - var _proto = DataLoader.prototype; - - /** - * Loads a key, returning a `Promise` for the value represented by that key. - */ - _proto.load = function load(key) { - if (key === null || key === undefined) { - throw new TypeError( - 'The loader.load() function must be called with a value, ' + - ('but got: ' + String(key) + '.') - ); - } - - var batch = getCurrentBatch(this); - var cacheMap = this._cacheMap; - - var cacheKey = this._cacheKeyFn(key); // If caching and there is a cache-hit, return cached Promise. - - if (cacheMap) { - var cachedPromise = cacheMap.get(cacheKey); - - if (cachedPromise) { - var cacheHits = batch.cacheHits || (batch.cacheHits = []); - return new Promise(function (resolve) { - cacheHits.push(function () { - resolve(cachedPromise); - }); - }); - } - } // Otherwise, produce a new Promise for this key, and enqueue it to be - // dispatched along with the current batch. - - batch.keys.push(key); - var promise = new Promise(function (resolve, reject) { - batch.callbacks.push({ - resolve: resolve, - reject: reject, - }); - }); // If caching, cache this promise. - - if (cacheMap) { - cacheMap.set(cacheKey, promise); - } - - return promise; - }; - /** - * Loads multiple keys, promising an array of values: - * - * var [ a, b ] = await myLoader.loadMany([ 'a', 'b' ]); - * - * This is similar to the more verbose: - * - * var [ a, b ] = await Promise.all([ - * myLoader.load('a'), - * myLoader.load('b') - * ]); - * - * However it is different in the case where any load fails. Where - * Promise.all() would reject, loadMany() always resolves, however each result - * is either a value or an Error instance. - * - * var [ a, b, c ] = await myLoader.loadMany([ 'a', 'b', 'badkey' ]); - * // c instanceof Error - * - */ - - _proto.loadMany = function loadMany(keys) { - if (!isArrayLike(keys)) { - throw new TypeError( - 'The loader.loadMany() function must be called with Array ' + - ('but got: ' + keys + '.') - ); - } // Support ArrayLike by using only minimal property access - - var loadPromises = []; - - for (var i = 0; i < keys.length; i++) { - loadPromises.push( - this.load(keys[i])['catch'](function (error) { - return error; - }) - ); - } - - return Promise.all(loadPromises); - }; - /** - * Clears the value at `key` from the cache, if it exists. Returns itself for - * method chaining. - */ - - _proto.clear = function clear(key) { - var cacheMap = this._cacheMap; - - if (cacheMap) { - var cacheKey = this._cacheKeyFn(key); - - cacheMap['delete'](cacheKey); - } - - return this; - }; - /** - * Clears the entire cache. To be used when some event results in unknown - * invalidations across this particular `DataLoader`. Returns itself for - * method chaining. - */ - - _proto.clearAll = function clearAll() { - var cacheMap = this._cacheMap; - - if (cacheMap) { - cacheMap.clear(); - } - - return this; - }; - /** - * Adds the provided key and value to the cache. If the key already - * exists, no change is made. Returns itself for method chaining. - * - * To prime the cache with an error at a key, provide an Error instance. - */ - - _proto.prime = function prime(key, value) { - var cacheMap = this._cacheMap; - - if (cacheMap) { - var cacheKey = this._cacheKeyFn(key); // Only add the key if it does not already exist. - - if (cacheMap.get(cacheKey) === undefined) { - // Cache a rejected promise if the value is an Error, in order to match - // the behavior of load(key). - var promise; - - if (value instanceof Error) { - promise = Promise.reject(value); // Since this is a case where an Error is intentionally being primed - // for a given key, we want to disable unhandled promise rejection. - - promise['catch'](function () {}); - } else { - promise = Promise.resolve(value); - } - - cacheMap.set(cacheKey, promise); - } - } - - return this; - }; - - return DataLoader; - })(); // Private: Enqueue a Job to be executed after all "PromiseJobs" Jobs. -// -// ES6 JavaScript uses the concepts Job and JobQueue to schedule work to occur -// after the current execution context has completed: -// http://www.ecma-international.org/ecma-262/6.0/#sec-jobs-and-job-queues -// -// Node.js uses the `process.nextTick` mechanism to implement the concept of a -// Job, maintaining a global FIFO JobQueue for all Jobs, which is flushed after -// the current call stack ends. -// -// When calling `then` on a Promise, it enqueues a Job on a specific -// "PromiseJobs" JobQueue which is flushed in Node as a single Job on the -// global JobQueue. -// -// DataLoader batches all loads which occur in a single frame of execution, but -// should include in the batch all loads which occur during the flushing of the -// "PromiseJobs" JobQueue after that same execution frame. -// -// In order to avoid the DataLoader dispatch Job occuring before "PromiseJobs", -// A Promise Job is created with the sole purpose of enqueuing a global Job, -// ensuring that it always occurs after "PromiseJobs" ends. -// -// Node.js's job queue is unique. Browsers do not have an equivalent mechanism -// for enqueuing a job to be performed after promise microtasks and before the -// next macrotask. For browser environments, a macrotask is used (via -// setImmediate or setTimeout) at a potential performance penalty. - -var enqueuePostPromiseJob = - typeof process === 'object' && typeof process.nextTick === 'function' - ? function (fn) { - if (!resolvedPromise) { - resolvedPromise = Promise.resolve(); - } - - resolvedPromise.then(function () { - process.nextTick(fn); - }); - } - : typeof setImmediate === 'function' - ? function (fn) { - setImmediate(fn); - } - : function (fn) { - setTimeout(fn); - }; // Private: cached resolved Promise instance - -var resolvedPromise; // Private: Describes a batch of requests - -// Private: Either returns the current batch, or creates and schedules a -// dispatch of a new batch for the given loader. -function getCurrentBatch(loader) { - // If there is an existing batch which has not yet dispatched and is within - // the limit of the batch size, then return it. - var existingBatch = loader._batch; - - if ( - existingBatch !== null && - !existingBatch.hasDispatched && - existingBatch.keys.length < loader._maxBatchSize - ) { - return existingBatch; - } // Otherwise, create a new batch for this loader. - - var newBatch = { - hasDispatched: false, - keys: [], - callbacks: [], - }; // Store it on the loader so it may be reused. - - loader._batch = newBatch; // Then schedule a task to dispatch this batch of requests. - - loader._batchScheduleFn(function () { - dispatchBatch(loader, newBatch); - }); - - return newBatch; -} - -function dispatchBatch(loader, batch) { - // Mark this batch as having been dispatched. - batch.hasDispatched = true; // If there's nothing to load, resolve any cache hits and return early. - - if (batch.keys.length === 0) { - resolveCacheHits(batch); - return; - } // Call the provided batchLoadFn for this loader with the batch's keys and - // with the loader as the `this` context. - - var batchPromise = loader._batchLoadFn(batch.keys); // Assert the expected response from batchLoadFn - - if (!batchPromise || typeof batchPromise.then !== 'function') { - return failedDispatch( - loader, - batch, - new TypeError( - 'DataLoader must be constructed with a function which accepts ' + - 'Array and returns Promise>, but the function did ' + - ('not return a Promise: ' + String(batchPromise) + '.') - ) - ); - } // Await the resolution of the call to batchLoadFn. - - batchPromise - .then(function (values) { - // Assert the expected resolution from batchLoadFn. - if (!isArrayLike(values)) { - throw new TypeError( - 'DataLoader must be constructed with a function which accepts ' + - 'Array and returns Promise>, but the function did ' + - ('not return a Promise of an Array: ' + String(values) + '.') - ); - } - - if (values.length !== batch.keys.length) { - throw new TypeError( - 'DataLoader must be constructed with a function which accepts ' + - 'Array and returns Promise>, but the function did ' + - 'not return a Promise of an Array of the same length as the Array ' + - 'of keys.' + - ('\n\nKeys:\n' + String(batch.keys)) + - ('\n\nValues:\n' + String(values)) - ); - } // Resolve all cache hits in the same micro-task as freshly loaded values. - - resolveCacheHits(batch); // Step through values, resolving or rejecting each Promise in the batch. - - for (var i = 0; i < batch.callbacks.length; i++) { - var value = values[i]; - - if (value instanceof Error) { - batch.callbacks[i].reject(value); - } else { - batch.callbacks[i].resolve(value); - } - } - }) - ['catch'](function (error) { - failedDispatch(loader, batch, error); - }); -} // Private: do not cache individual loads if the entire batch dispatch fails, -// but still reject each request so they do not hang. - -function failedDispatch(loader, batch, error) { - // Cache hits are resolved, even though the batch failed. - resolveCacheHits(batch); - - for (var i = 0; i < batch.keys.length; i++) { - loader.clear(batch.keys[i]); - batch.callbacks[i].reject(error); - } -} // Private: Resolves the Promises for any cache hits in this batch. - -function resolveCacheHits(batch) { - if (batch.cacheHits) { - for (var i = 0; i < batch.cacheHits.length; i++) { - batch.cacheHits[i](); - } - } -} // Private: given the DataLoader's options, produce a valid max batch size. - -function getValidMaxBatchSize(options) { - var shouldBatch = !options || options.batch !== false; - - if (!shouldBatch) { - return 1; - } - - var maxBatchSize = options && options.maxBatchSize; - - if (maxBatchSize === undefined) { - return Infinity; - } - - if (typeof maxBatchSize !== 'number' || maxBatchSize < 1) { - throw new TypeError('maxBatchSize must be a positive number: ' + maxBatchSize); - } - - return maxBatchSize; -} // Private - -function getValidBatchScheduleFn(options) { - var batchScheduleFn = options && options.batchScheduleFn; - - if (batchScheduleFn === undefined) { - return enqueuePostPromiseJob; - } - - if (typeof batchScheduleFn !== 'function') { - throw new TypeError('batchScheduleFn must be a function: ' + batchScheduleFn); - } - - return batchScheduleFn; -} // Private: given the DataLoader's options, produce a cache key function. - -function getValidCacheKeyFn(options) { - var cacheKeyFn = options && options.cacheKeyFn; - - if (cacheKeyFn === undefined) { - return function (key) { - return key; - }; - } - - if (typeof cacheKeyFn !== 'function') { - throw new TypeError('cacheKeyFn must be a function: ' + cacheKeyFn); - } - - return cacheKeyFn; -} // Private: given the DataLoader's options, produce a CacheMap to be used. - -function getValidCacheMap(options) { - var shouldCache = !options || options.cache !== false; - - if (!shouldCache) { - return null; - } - - var cacheMap = options && options.cacheMap; - - if (cacheMap === undefined) { - return new Map(); - } - - if (cacheMap !== null) { - var cacheFunctions = ['get', 'set', 'delete', 'clear']; - var missingFunctions = cacheFunctions.filter(function (fnName) { - return cacheMap && typeof cacheMap[fnName] !== 'function'; - }); - - if (missingFunctions.length !== 0) { - throw new TypeError('Custom cacheMap missing methods: ' + missingFunctions.join(', ')); - } - } - - return cacheMap; -} // Private - -function isArrayLike(x) { - return ( - typeof x === 'object' && - x !== null && - typeof x.length === 'number' && - (x.length === 0 || (x.length > 0 && Object.prototype.hasOwnProperty.call(x, x.length - 1))) - ); -} - -module.exports = DataLoader; diff --git a/src/packages/dataloader/package.json b/src/packages/dataloader/package.json deleted file mode 100644 index 941c705d6..000000000 --- a/src/packages/dataloader/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "dataloader", - "version": "2.1.1", - "description": "A data loading utility to reduce requests to a backend via batching and caching.", - "contributors": [ - "Lee Byron (http://leebyron.com/)", - "Daniel Schafer ", - "Nicholas Schrock " - ], - "license": "MIT", - "homepage": "https://github.com/graphql/dataloader", - "bugs": { - "url": "https://github.com/graphql/dataloader/issues" - }, - "repository": { - "type": "git", - "url": "http://github.com/graphql/dataloader.git" - }, - "main": "index.js", - "typings": "index.d.ts", - "files": [ - "index.js", - "index.d.ts", - "README.md", - "LICENSE" - ] -} diff --git a/src/packages/mikroorm/package.json b/src/packages/mikroorm/package.json index 81f90d98e..58e3b7328 100644 --- a/src/packages/mikroorm/package.json +++ b/src/packages/mikroorm/package.json @@ -23,7 +23,7 @@ "@exogee/graphweaver": "workspace:0.1.0-alpha.5", "@exogee/logger": "workspace:0.1.0", "apollo-server-core": "3.10.3", - "dataloader": "2.0.0", + "dataloader": "2.2.2", "decimal.js": "10.3.1", "dotenv": "16.0.0", "graphql": "16.6.0", diff --git a/src/packages/rest/package.json b/src/packages/rest/package.json index 6584f3f7b..acbb594d3 100644 --- a/src/packages/rest/package.json +++ b/src/packages/rest/package.json @@ -25,7 +25,7 @@ "apollo-datasource-rest": "3.7.0", "apollo-server-errors": "3.3.1", "class-validator": "0.13.2", - "dataloader": "2.1.0", + "dataloader": "2.2.2", "dotenv": "10.0.0", "graphql": "16.6.0", "lodash": "4.17.21", diff --git a/src/packages/xero/package.json b/src/packages/xero/package.json index 9246fdb5a..5d72d825c 100644 --- a/src/packages/xero/package.json +++ b/src/packages/xero/package.json @@ -23,7 +23,7 @@ "@exogee/graphweaver": "workspace:0.1.0-alpha.5", "@exogee/logger": "workspace:0.1.0", "class-validator": "0.13.2", - "dataloader": "2.1.0", + "dataloader": "2.2.2", "xero-node": "4.30.0" }, "devDependencies": { diff --git a/src/pnpm-lock.yaml b/src/pnpm-lock.yaml index ae06f1f7f..713570512 100644 --- a/src/pnpm-lock.yaml +++ b/src/pnpm-lock.yaml @@ -430,7 +430,7 @@ importers: '@types/jest': 27.0.2 '@types/pluralize': 0.0.29 class-validator: 0.13.2 - dataloader: workspace:2.1.1 + dataloader: 2.2.2 esbuild: 0.15.5 graphql: 16.6.0 jest: 27.2.2 @@ -442,7 +442,7 @@ importers: dependencies: '@exogee/logger': link:../logger class-validator: 0.13.2 - dataloader: link:../dataloader + dataloader: 2.2.2 graphql: 16.6.0 pluralize: 8.0.0 reflect-metadata: 0.1.13 @@ -472,9 +472,6 @@ importers: esbuild: 0.15.5 prettier: 2.7.1 - packages/dataloader: - specifiers: {} - packages/logger: specifiers: '@types/bunyan': 1.8.6 @@ -496,7 +493,7 @@ importers: '@mikro-orm/postgresql': 5.4.2 '@types/node': 18.11.11 apollo-server-core: 3.10.3 - dataloader: 2.0.0 + dataloader: 2.2.2 decimal.js: 10.3.1 dotenv: 16.0.0 esbuild: 0.15.5 @@ -508,7 +505,7 @@ importers: '@exogee/graphweaver': link:../core '@exogee/logger': link:../logger apollo-server-core: 3.10.3_graphql@16.6.0 - dataloader: 2.0.0 + dataloader: 2.2.2 decimal.js: 10.3.1 dotenv: 16.0.0 graphql: 16.6.0 @@ -530,7 +527,7 @@ importers: apollo-datasource-rest: 3.7.0 apollo-server-errors: 3.3.1 class-validator: 0.13.2 - dataloader: 2.1.0 + dataloader: 2.2.2 dotenv: 10.0.0 graphql: 16.6.0 jest: 26.6.3 @@ -549,7 +546,7 @@ importers: apollo-datasource-rest: 3.7.0_graphql@16.6.0 apollo-server-errors: 3.3.1_graphql@16.6.0 class-validator: 0.13.2 - dataloader: 2.1.0 + dataloader: 2.2.2 dotenv: 10.0.0 graphql: 16.6.0 lodash: 4.17.21 @@ -632,7 +629,7 @@ importers: '@exogee/logger': workspace:0.1.0 '@types/node': 14.14.10 class-validator: 0.13.2 - dataloader: 2.1.0 + dataloader: 2.2.2 esbuild: 0.15.5 jest: 26.6.3 prettier: 2.2.1 @@ -643,7 +640,7 @@ importers: '@exogee/graphweaver': link:../core '@exogee/logger': link:../logger class-validator: 0.13.2 - dataloader: 2.1.0 + dataloader: 2.2.2 xero-node: 4.30.0 devDependencies: '@types/node': 14.14.10 @@ -8206,9 +8203,10 @@ packages: /dataloader/2.0.0: resolution: {integrity: sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==} + dev: true - /dataloader/2.1.0: - resolution: {integrity: sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ==} + /dataloader/2.2.2: + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} dev: false /date-fns/1.30.1: