From 27d970df418680f7fc3d0fcb2c6b2ba291db2757 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 2 Dec 2024 09:32:38 -0500 Subject: [PATCH] Update UI dependencies --- .../dist/graphiql/graphiql.min.js | 5568 +++++++---------- netbox/project-static/dist/netbox.js | Bin 390918 -> 390368 bytes netbox/project-static/dist/netbox.js.map | Bin 527957 -> 524890 bytes .../netbox-graphiql/package.json | 6 +- netbox/project-static/package.json | 6 +- .../src/select/classes/dynamicTomSelect.ts | 39 +- netbox/project-static/tsconfig.json | 4 +- netbox/project-static/yarn.lock | 82 +- 8 files changed, 2406 insertions(+), 3299 deletions(-) diff --git a/netbox/project-static/dist/graphiql/graphiql.min.js b/netbox/project-static/dist/graphiql/graphiql.min.js index 862ce3a80..03d4ac1e1 100644 --- a/netbox/project-static/dist/graphiql/graphiql.min.js +++ b/netbox/project-static/dist/graphiql/graphiql.min.js @@ -22986,17 +22986,79 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GraphQLError = void 0; +exports.formatError = formatError; +exports.printError = printError; var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _location = __webpack_require__(/*! ../language/location.mjs */ "../../../node_modules/graphql/language/location.mjs"); var _printLocation = __webpack_require__(/*! ../language/printLocation.mjs */ "../../../node_modules/graphql/language/printLocation.mjs"); +function toNormalizedOptions(args) { + const firstArg = args[0]; + if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) { + return { + nodes: firstArg, + source: args[1], + positions: args[2], + path: args[3], + originalError: args[4], + extensions: args[5] + }; + } + return firstArg; +} /** * A GraphQLError describes an Error found during the parse, validate, or * execute phases of performing a GraphQL operation. In addition to a message * and stack trace, it also includes information about the locations in a * GraphQL document and/or execution result that correspond to the Error. */ + class GraphQLError extends Error { - constructor(message, options = {}) { + /** + * An array of `{ line, column }` locations within the source GraphQL document + * which correspond to this error. + * + * Errors during validation often contain multiple locations, for example to + * point out two things with the same name. Errors during execution include a + * single location, the field which produced the error. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + + /** + * An array describing the JSON-path into the execution response which + * corresponds to this error. Only included for errors during execution. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + + /** + * An array of GraphQL AST Nodes corresponding to this error. + */ + + /** + * The source GraphQL document for the first location of this error. + * + * Note that if this Error represents more than one node, the source may not + * represent nodes after the first node. + */ + + /** + * An array of character offsets within the source GraphQL document + * which correspond to this error. + */ + + /** + * The original error thrown from a field resolver during execution. + */ + + /** + * Extension fields to add to the formatted error. + */ + + /** + * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead. + */ + constructor(message, ...rawArgs) { var _this$nodes, _nodeLocations$, _ref; const { nodes, @@ -23005,22 +23067,22 @@ class GraphQLError extends Error { path, originalError, extensions - } = options; + } = toNormalizedOptions(rawArgs); super(message); this.name = 'GraphQLError'; this.path = path !== null && path !== void 0 ? path : undefined; - this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; - // Compute list of blame nodes. + this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; // Compute list of blame nodes. + this.nodes = undefinedIfEmpty(Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined); - const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); - // Compute locations in the source for the given nodes/positions. + const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); // Compute locations in the source for the given nodes/positions. + this.source = source !== null && source !== void 0 ? source : nodeLocations === null || nodeLocations === void 0 ? void 0 : (_nodeLocations$ = nodeLocations[0]) === null || _nodeLocations$ === void 0 ? void 0 : _nodeLocations$.source; this.positions = positions !== null && positions !== void 0 ? positions : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => loc.start); this.locations = positions && source ? positions.map(pos => (0, _location.getLocation)(source, pos)) : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => (0, _location.getLocation)(loc.source, loc.start)); const originalExtensions = (0, _isObjectLike.isObjectLike)(originalError === null || originalError === void 0 ? void 0 : originalError.extensions) ? originalError === null || originalError === void 0 ? void 0 : originalError.extensions : undefined; - this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); - // Only properties prescribed by the spec should be enumerable. + this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); // Only properties prescribed by the spec should be enumerable. // Keep the rest as non-enumerable. + Object.defineProperties(this, { message: { writable: true, @@ -23041,17 +23103,18 @@ class GraphQLError extends Error { originalError: { enumerable: false } - }); - // Include (non-enumerable) stack trace. + }); // Include (non-enumerable) stack trace. + /* c8 ignore start */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 - if ((originalError === null || originalError === void 0 ? void 0 : originalError.stack) != null) { + + if (originalError !== null && originalError !== void 0 && originalError.stack) { Object.defineProperty(this, 'stack', { value: originalError.stack, writable: true, configurable: true }); - } else if (Error.captureStackTrace != null) { + } else if (Error.captureStackTrace) { Error.captureStackTrace(this, GraphQLError); } else { Object.defineProperty(this, 'stack', { @@ -23100,6 +23163,29 @@ exports.GraphQLError = GraphQLError; function undefinedIfEmpty(array) { return array === undefined || array.length === 0 ? undefined : array; } +/** + * See: https://spec.graphql.org/draft/#sec-Errors + */ + +/** + * Prints a GraphQLError to a string, representing useful location information + * about the error's position in the source. + * + * @deprecated Please use `error.toString` instead. Will be removed in v17 + */ +function printError(error) { + return error.toString(); +} +/** + * Given a GraphQLError, format it according to the rules described by the + * Response Format, Errors section of the GraphQL Specification. + * + * @deprecated Please use `error.toJSON` instead. Will be removed in v17 + */ + +function formatError(error) { + return error.toJSON(); +} /***/ }), @@ -23120,12 +23206,24 @@ Object.defineProperty(exports, "GraphQLError", ({ return _GraphQLError.GraphQLError; } })); +Object.defineProperty(exports, "formatError", ({ + enumerable: true, + get: function () { + return _GraphQLError.formatError; + } +})); Object.defineProperty(exports, "locatedError", ({ enumerable: true, get: function () { return _locatedError.locatedError; } })); +Object.defineProperty(exports, "printError", ({ + enumerable: true, + get: function () { + return _GraphQLError.printError; + } +})); Object.defineProperty(exports, "syntaxError", ({ enumerable: true, get: function () { @@ -23157,15 +23255,16 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * GraphQL operation, produce a new GraphQLError aware of the location in the * document responsible for the original Error. */ + function locatedError(rawOriginalError, nodes, path) { - var _originalError$nodes; - const originalError = (0, _toError.toError)(rawOriginalError); - // Note: this uses a brand-check to support GraphQL errors originating from other contexts. + var _nodes; + const originalError = (0, _toError.toError)(rawOriginalError); // Note: this uses a brand-check to support GraphQL errors originating from other contexts. + if (isLocatedGraphQLError(originalError)) { return originalError; } return new _GraphQLError.GraphQLError(originalError.message, { - nodes: (_originalError$nodes = originalError.nodes) !== null && _originalError$nodes !== void 0 ? _originalError$nodes : nodes, + nodes: (_nodes = originalError.nodes) !== null && _nodes !== void 0 ? _nodes : nodes, source: originalError.source, positions: originalError.positions, path, @@ -23195,6 +23294,7 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * Produces a GraphQLError representing a syntax error, containing useful * descriptive information about the syntax error's position in the source. */ + function syntaxError(source, position, description) { return new _GraphQLError.GraphQLError(`Syntax Error: ${description}`, { source, @@ -23204,613 +23304,6 @@ function syntaxError(source, position, description) { /***/ }), -/***/ "../../../node_modules/graphql/execution/IncrementalGraph.mjs": -/*!********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/IncrementalGraph.mjs ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.IncrementalGraph = void 0; -var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); -var _promiseWithResolvers = __webpack_require__(/*! ../jsutils/promiseWithResolvers.mjs */ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); -/** - * @internal - */ -class IncrementalGraph { - constructor() { - this._rootNodes = new Set(); - this._completedQueue = []; - this._nextQueue = []; - } - getNewRootNodes(incrementalDataRecords) { - const initialResultChildren = new Set(); - this._addIncrementalDataRecords(incrementalDataRecords, undefined, initialResultChildren); - return this._promoteNonEmptyToRoot(initialResultChildren); - } - addCompletedSuccessfulExecutionGroup(successfulExecutionGroup) { - for (const deferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - deferredFragmentRecord.pendingExecutionGroups.delete(successfulExecutionGroup.pendingExecutionGroup); - deferredFragmentRecord.successfulExecutionGroups.add(successfulExecutionGroup); - } - const incrementalDataRecords = successfulExecutionGroup.incrementalDataRecords; - if (incrementalDataRecords !== undefined) { - this._addIncrementalDataRecords(incrementalDataRecords, successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords); - } - } - *currentCompletedBatch() { - let completed; - while ((completed = this._completedQueue.shift()) !== undefined) { - yield completed; - } - if (this._rootNodes.size === 0) { - for (const resolve of this._nextQueue) { - resolve(undefined); - } - } - } - nextCompletedBatch() { - const { - promise, - resolve - } = (0, _promiseWithResolvers.promiseWithResolvers)(); - this._nextQueue.push(resolve); - return promise; - } - abort() { - for (const resolve of this._nextQueue) { - resolve(undefined); - } - } - hasNext() { - return this._rootNodes.size > 0; - } - completeDeferredFragment(deferredFragmentRecord) { - if (!this._rootNodes.has(deferredFragmentRecord) || deferredFragmentRecord.pendingExecutionGroups.size > 0) { - return; - } - const successfulExecutionGroups = Array.from(deferredFragmentRecord.successfulExecutionGroups); - this._removeRootNode(deferredFragmentRecord); - for (const successfulExecutionGroup of successfulExecutionGroups) { - for (const otherDeferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - otherDeferredFragmentRecord.successfulExecutionGroups.delete(successfulExecutionGroup); - } - } - const newRootNodes = this._promoteNonEmptyToRoot(deferredFragmentRecord.children); - return { - newRootNodes, - successfulExecutionGroups - }; - } - removeDeferredFragment(deferredFragmentRecord) { - if (!this._rootNodes.has(deferredFragmentRecord)) { - return false; - } - this._removeRootNode(deferredFragmentRecord); - return true; - } - removeStream(streamRecord) { - this._removeRootNode(streamRecord); - } - _removeRootNode(deliveryGroup) { - this._rootNodes.delete(deliveryGroup); - } - _addIncrementalDataRecords(incrementalDataRecords, parents, initialResultChildren) { - for (const incrementalDataRecord of incrementalDataRecords) { - if ((0, _types.isPendingExecutionGroup)(incrementalDataRecord)) { - for (const deferredFragmentRecord of incrementalDataRecord.deferredFragmentRecords) { - this._addDeferredFragment(deferredFragmentRecord, initialResultChildren); - deferredFragmentRecord.pendingExecutionGroups.add(incrementalDataRecord); - } - if (this._completesRootNode(incrementalDataRecord)) { - this._onExecutionGroup(incrementalDataRecord); - } - } else if (parents === undefined) { - initialResultChildren !== undefined || (0, _invariant.invariant)(false); - initialResultChildren.add(incrementalDataRecord); - } else { - for (const parent of parents) { - this._addDeferredFragment(parent, initialResultChildren); - parent.children.add(incrementalDataRecord); - } - } - } - } - _promoteNonEmptyToRoot(maybeEmptyNewRootNodes) { - const newRootNodes = []; - for (const node of maybeEmptyNewRootNodes) { - if ((0, _types.isDeferredFragmentRecord)(node)) { - if (node.pendingExecutionGroups.size > 0) { - for (const pendingExecutionGroup of node.pendingExecutionGroups) { - if (!this._completesRootNode(pendingExecutionGroup)) { - this._onExecutionGroup(pendingExecutionGroup); - } - } - this._rootNodes.add(node); - newRootNodes.push(node); - continue; - } - for (const child of node.children) { - maybeEmptyNewRootNodes.add(child); - } - } else { - this._rootNodes.add(node); - newRootNodes.push(node); - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this._onStreamItems(node); - } - } - return newRootNodes; - } - _completesRootNode(pendingExecutionGroup) { - return pendingExecutionGroup.deferredFragmentRecords.some(deferredFragmentRecord => this._rootNodes.has(deferredFragmentRecord)); - } - _addDeferredFragment(deferredFragmentRecord, initialResultChildren) { - if (this._rootNodes.has(deferredFragmentRecord)) { - return; - } - const parent = deferredFragmentRecord.parent; - if (parent === undefined) { - initialResultChildren !== undefined || (0, _invariant.invariant)(false); - initialResultChildren.add(deferredFragmentRecord); - return; - } - parent.children.add(deferredFragmentRecord); - this._addDeferredFragment(parent, initialResultChildren); - } - _onExecutionGroup(pendingExecutionGroup) { - let completedExecutionGroup = pendingExecutionGroup.result; - if (!(completedExecutionGroup instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue)) { - completedExecutionGroup = completedExecutionGroup(); - } - const value = completedExecutionGroup.value; - if ((0, _isPromise.isPromise)(value)) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - value.then(resolved => this._enqueue(resolved)); - } else { - this._enqueue(value); - } - } - async _onStreamItems(streamRecord) { - let items = []; - let errors = []; - let incrementalDataRecords = []; - const streamItemQueue = streamRecord.streamItemQueue; - let streamItemRecord; - while ((streamItemRecord = streamItemQueue.shift()) !== undefined) { - let result = streamItemRecord instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue ? streamItemRecord.value : streamItemRecord().value; - if ((0, _isPromise.isPromise)(result)) { - if (items.length > 0) { - this._enqueue({ - streamRecord, - result: - // TODO add additional test case or rework for coverage - errors.length > 0 /* c8 ignore start */ ? { - items, - errors - } /* c8 ignore stop */ : { - items - }, - incrementalDataRecords - }); - items = []; - errors = []; - incrementalDataRecords = []; - } - // eslint-disable-next-line no-await-in-loop - result = await result; - // wait an additional tick to coalesce resolving additional promises - // within the queue - // eslint-disable-next-line no-await-in-loop - await Promise.resolve(); - } - if (result.item === undefined) { - if (items.length > 0) { - this._enqueue({ - streamRecord, - result: errors.length > 0 ? { - items, - errors - } : { - items - }, - incrementalDataRecords - }); - } - this._enqueue(result.errors === undefined ? { - streamRecord - } : { - streamRecord, - errors: result.errors - }); - return; - } - items.push(result.item); - if (result.errors !== undefined) { - errors.push(...result.errors); - } - if (result.incrementalDataRecords !== undefined) { - incrementalDataRecords.push(...result.incrementalDataRecords); - } - } - } - *_yieldCurrentCompletedIncrementalData(first) { - yield first; - yield* this.currentCompletedBatch(); - } - _enqueue(completed) { - const next = this._nextQueue.shift(); - if (next !== undefined) { - next(this._yieldCurrentCompletedIncrementalData(completed)); - return; - } - this._completedQueue.push(completed); - } -} -exports.IncrementalGraph = IncrementalGraph; - -/***/ }), - -/***/ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs": -/*!************************************************************************!*\ - !*** ../../../node_modules/graphql/execution/IncrementalPublisher.mjs ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.buildIncrementalResponse = buildIncrementalResponse; -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); -var _IncrementalGraph = __webpack_require__(/*! ./IncrementalGraph.mjs */ "../../../node_modules/graphql/execution/IncrementalGraph.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); -function buildIncrementalResponse(context, result, errors, incrementalDataRecords) { - const incrementalPublisher = new IncrementalPublisher(context); - return incrementalPublisher.buildResponse(result, errors, incrementalDataRecords); -} -/** - * This class is used to publish incremental results to the client, enabling semi-concurrent - * execution while preserving result order. - * - * @internal - */ -class IncrementalPublisher { - constructor(context) { - this._context = context; - this._nextId = 0; - this._incrementalGraph = new _IncrementalGraph.IncrementalGraph(); - } - buildResponse(data, errors, incrementalDataRecords) { - const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); - const pending = this._toPendingResults(newRootNodes); - const initialResult = errors === undefined ? { - data, - pending, - hasNext: true - } : { - errors, - data, - pending, - hasNext: true - }; - return { - initialResult, - subsequentResults: this._subscribe() - }; - } - _toPendingResults(newRootNodes) { - const pendingResults = []; - for (const node of newRootNodes) { - const id = String(this._getNextId()); - node.id = id; - const pendingResult = { - id, - path: (0, _Path.pathToArray)(node.path) - }; - if (node.label !== undefined) { - pendingResult.label = node.label; - } - pendingResults.push(pendingResult); - } - return pendingResults; - } - _getNextId() { - return String(this._nextId++); - } - _subscribe() { - let isDone = false; - const _next = async () => { - if (isDone) { - await this._returnAsyncIteratorsIgnoringErrors(); - return { - value: undefined, - done: true - }; - } - const context = { - pending: [], - incremental: [], - completed: [] - }; - let batch = this._incrementalGraph.currentCompletedBatch(); - do { - for (const completedResult of batch) { - this._handleCompletedIncrementalData(completedResult, context); - } - const { - incremental, - completed - } = context; - if (incremental.length > 0 || completed.length > 0) { - const hasNext = this._incrementalGraph.hasNext(); - if (!hasNext) { - isDone = true; - } - const subsequentIncrementalExecutionResult = { - hasNext - }; - const pending = context.pending; - if (pending.length > 0) { - subsequentIncrementalExecutionResult.pending = pending; - } - if (incremental.length > 0) { - subsequentIncrementalExecutionResult.incremental = incremental; - } - if (completed.length > 0) { - subsequentIncrementalExecutionResult.completed = completed; - } - return { - value: subsequentIncrementalExecutionResult, - done: false - }; - } - // eslint-disable-next-line no-await-in-loop - batch = await this._incrementalGraph.nextCompletedBatch(); - } while (batch !== undefined); - await this._returnAsyncIteratorsIgnoringErrors(); - return { - value: undefined, - done: true - }; - }; - const _return = async () => { - isDone = true; - this._incrementalGraph.abort(); - await this._returnAsyncIterators(); - return { - value: undefined, - done: true - }; - }; - const _throw = async error => { - isDone = true; - this._incrementalGraph.abort(); - await this._returnAsyncIterators(); - return Promise.reject(error); - }; - return { - [Symbol.asyncIterator]() { - return this; - }, - next: _next, - return: _return, - throw: _throw - }; - } - _handleCompletedIncrementalData(completedIncrementalData, context) { - if ((0, _types.isCompletedExecutionGroup)(completedIncrementalData)) { - this._handleCompletedExecutionGroup(completedIncrementalData, context); - } else { - this._handleCompletedStreamItems(completedIncrementalData, context); - } - } - _handleCompletedExecutionGroup(completedExecutionGroup, context) { - if ((0, _types.isFailedExecutionGroup)(completedExecutionGroup)) { - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - const id = deferredFragmentRecord.id; - if (!this._incrementalGraph.removeDeferredFragment(deferredFragmentRecord)) { - // This can occur if multiple deferred grouped field sets error for a fragment. - continue; - } - id !== undefined || (0, _invariant.invariant)(false); - context.completed.push({ - id, - errors: completedExecutionGroup.errors - }); - } - return; - } - this._incrementalGraph.addCompletedSuccessfulExecutionGroup(completedExecutionGroup); - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - const completion = this._incrementalGraph.completeDeferredFragment(deferredFragmentRecord); - if (completion === undefined) { - continue; - } - const id = deferredFragmentRecord.id; - id !== undefined || (0, _invariant.invariant)(false); - const incremental = context.incremental; - const { - newRootNodes, - successfulExecutionGroups - } = completion; - context.pending.push(...this._toPendingResults(newRootNodes)); - for (const successfulExecutionGroup of successfulExecutionGroups) { - const { - bestId, - subPath - } = this._getBestIdAndSubPath(id, deferredFragmentRecord, successfulExecutionGroup); - const incrementalEntry = { - ...successfulExecutionGroup.result, - id: bestId - }; - if (subPath !== undefined) { - incrementalEntry.subPath = subPath; - } - incremental.push(incrementalEntry); - } - context.completed.push({ - id - }); - } - } - _handleCompletedStreamItems(streamItemsResult, context) { - const streamRecord = streamItemsResult.streamRecord; - const id = streamRecord.id; - id !== undefined || (0, _invariant.invariant)(false); - if (streamItemsResult.errors !== undefined) { - context.completed.push({ - id, - errors: streamItemsResult.errors - }); - this._incrementalGraph.removeStream(streamRecord); - if ((0, _types.isCancellableStreamRecord)(streamRecord)) { - this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); - this._context.cancellableStreams.delete(streamRecord); - streamRecord.earlyReturn().catch(() => { - /* c8 ignore next 1 */ - // ignore error - }); - } - } else if (streamItemsResult.result === undefined) { - context.completed.push({ - id - }); - this._incrementalGraph.removeStream(streamRecord); - if ((0, _types.isCancellableStreamRecord)(streamRecord)) { - this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); - this._context.cancellableStreams.delete(streamRecord); - } - } else { - const incrementalEntry = { - id, - ...streamItemsResult.result - }; - context.incremental.push(incrementalEntry); - const incrementalDataRecords = streamItemsResult.incrementalDataRecords; - if (incrementalDataRecords !== undefined) { - const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); - context.pending.push(...this._toPendingResults(newRootNodes)); - } - } - } - _getBestIdAndSubPath(initialId, initialDeferredFragmentRecord, completedExecutionGroup) { - let maxLength = (0, _Path.pathToArray)(initialDeferredFragmentRecord.path).length; - let bestId = initialId; - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - if (deferredFragmentRecord === initialDeferredFragmentRecord) { - continue; - } - const id = deferredFragmentRecord.id; - // TODO: add test case for when an fragment has not been released, but might be processed for the shortest path. - /* c8 ignore next 3 */ - if (id === undefined) { - continue; - } - const fragmentPath = (0, _Path.pathToArray)(deferredFragmentRecord.path); - const length = fragmentPath.length; - if (length > maxLength) { - maxLength = length; - bestId = id; - } - } - const subPath = completedExecutionGroup.path.slice(maxLength); - return { - bestId, - subPath: subPath.length > 0 ? subPath : undefined - }; - } - async _returnAsyncIterators() { - const cancellableStreams = this._context.cancellableStreams; - if (cancellableStreams === undefined) { - return; - } - const promises = []; - for (const streamRecord of cancellableStreams) { - if (streamRecord.earlyReturn !== undefined) { - promises.push(streamRecord.earlyReturn()); - } - } - await Promise.all(promises); - } - async _returnAsyncIteratorsIgnoringErrors() { - await this._returnAsyncIterators().catch(() => { - // Ignore errors - }); - } -} - -/***/ }), - -/***/ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs": -/*!**********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/buildExecutionPlan.mjs ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.buildExecutionPlan = buildExecutionPlan; -var _getBySet = __webpack_require__(/*! ../jsutils/getBySet.mjs */ "../../../node_modules/graphql/jsutils/getBySet.mjs"); -var _isSameSet = __webpack_require__(/*! ../jsutils/isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); -function buildExecutionPlan(originalGroupedFieldSet, parentDeferUsages = new Set()) { - const groupedFieldSet = new Map(); - const newGroupedFieldSets = new Map(); - for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { - const filteredDeferUsageSet = getFilteredDeferUsageSet(fieldGroup); - if ((0, _isSameSet.isSameSet)(filteredDeferUsageSet, parentDeferUsages)) { - groupedFieldSet.set(responseKey, fieldGroup); - continue; - } - let newGroupedFieldSet = (0, _getBySet.getBySet)(newGroupedFieldSets, filteredDeferUsageSet); - if (newGroupedFieldSet === undefined) { - newGroupedFieldSet = new Map(); - newGroupedFieldSets.set(filteredDeferUsageSet, newGroupedFieldSet); - } - newGroupedFieldSet.set(responseKey, fieldGroup); - } - return { - groupedFieldSet, - newGroupedFieldSets - }; -} -function getFilteredDeferUsageSet(fieldGroup) { - const filteredDeferUsageSet = new Set(); - for (const fieldDetails of fieldGroup) { - const deferUsage = fieldDetails.deferUsage; - if (deferUsage === undefined) { - filteredDeferUsageSet.clear(); - return filteredDeferUsageSet; - } - filteredDeferUsageSet.add(deferUsage); - } - for (const deferUsage of filteredDeferUsageSet) { - let parentDeferUsage = deferUsage.parentDeferUsage; - while (parentDeferUsage !== undefined) { - if (filteredDeferUsageSet.has(parentDeferUsage)) { - filteredDeferUsageSet.delete(deferUsage); - break; - } - parentDeferUsage = parentDeferUsage.parentDeferUsage; - } - } - return filteredDeferUsageSet; -} - -/***/ }), - /***/ "../../../node_modules/graphql/execution/collectFields.mjs": /*!*****************************************************************!*\ !*** ../../../node_modules/graphql/execution/collectFields.mjs ***! @@ -23824,9 +23317,6 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.collectFields = collectFields; exports.collectSubfields = collectSubfields; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -23841,22 +23331,11 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra * * @internal */ -function collectFields(schema, fragments, variableValues, runtimeType, operation) { - const groupedFieldSet = new _AccumulatorMap.AccumulatorMap(); - const newDeferUsages = []; - const context = { - schema, - fragments, - variableValues, - runtimeType, - operation, - visitedFragmentNames: new Set() - }; - collectFieldsImpl(context, operation.selectionSet, groupedFieldSet, newDeferUsages); - return { - groupedFieldSet, - newDeferUsages - }; + +function collectFields(schema, fragments, variableValues, runtimeType, selectionSet) { + const fields = new Map(); + collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, new Set()); + return fields; } /** * Given an array of field nodes, collects all of the subfields of the passed @@ -23868,38 +23347,18 @@ function collectFields(schema, fragments, variableValues, runtimeType, operation * * @internal */ -// eslint-disable-next-line max-params -function collectSubfields(schema, fragments, variableValues, operation, returnType, fieldGroup) { - const context = { - schema, - fragments, - variableValues, - runtimeType: returnType, - operation, - visitedFragmentNames: new Set() - }; - const subGroupedFieldSet = new _AccumulatorMap.AccumulatorMap(); - const newDeferUsages = []; - for (const fieldDetail of fieldGroup) { - const node = fieldDetail.node; + +function collectSubfields(schema, fragments, variableValues, returnType, fieldNodes) { + const subFieldNodes = new Map(); + const visitedFragmentNames = new Set(); + for (const node of fieldNodes) { if (node.selectionSet) { - collectFieldsImpl(context, node.selectionSet, subGroupedFieldSet, newDeferUsages, fieldDetail.deferUsage); + collectFieldsImpl(schema, fragments, variableValues, returnType, node.selectionSet, subFieldNodes, visitedFragmentNames); } } - return { - groupedFieldSet: subGroupedFieldSet, - newDeferUsages - }; + return subFieldNodes; } -function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsages, deferUsage) { - const { - schema, - fragments, - variableValues, - runtimeType, - operation, - visitedFragmentNames - } = context; +function collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, visitedFragmentNames) { for (const selection of selectionSet.selections) { switch (selection.kind) { case _kinds.Kind.FIELD: @@ -23907,10 +23366,13 @@ function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsage if (!shouldIncludeNode(variableValues, selection)) { continue; } - groupedFieldSet.add(getFieldEntryKey(selection), { - node: selection, - deferUsage - }); + const name = getFieldEntryKey(selection); + const fieldList = fields.get(name); + if (fieldList !== undefined) { + fieldList.push(selection); + } else { + fields.set(name, [selection]); + } break; } case _kinds.Kind.INLINE_FRAGMENT: @@ -23918,61 +23380,31 @@ function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsage if (!shouldIncludeNode(variableValues, selection) || !doesFragmentConditionMatch(schema, selection, runtimeType)) { continue; } - const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); - if (!newDeferUsage) { - collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); - } else { - newDeferUsages.push(newDeferUsage); - collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); - } + collectFieldsImpl(schema, fragments, variableValues, runtimeType, selection.selectionSet, fields, visitedFragmentNames); break; } case _kinds.Kind.FRAGMENT_SPREAD: { const fragName = selection.name.value; - const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); - if (!newDeferUsage && (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection))) { + if (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection)) { continue; } + visitedFragmentNames.add(fragName); const fragment = fragments[fragName]; - if (fragment == null || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { + if (!fragment || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { continue; } - if (!newDeferUsage) { - visitedFragmentNames.add(fragName); - collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); - } else { - newDeferUsages.push(newDeferUsage); - collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); - } + collectFieldsImpl(schema, fragments, variableValues, runtimeType, fragment.selectionSet, fields, visitedFragmentNames); break; } } } } -/** - * Returns an object containing the `@defer` arguments if a field should be - * deferred based on the experimental flag, defer directive present and - * not disabled by the "if" argument. - */ -function getDeferUsage(operation, variableValues, node, parentDeferUsage) { - const defer = (0, _values.getDirectiveValues)(_directives.GraphQLDeferDirective, node, variableValues); - if (!defer) { - return; - } - if (defer.if === false) { - return; - } - operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.'); - return { - label: typeof defer.label === 'string' ? defer.label : undefined, - parentDeferUsage - }; -} /** * Determines if a field should be included based on the `@include` and `@skip` * directives, where `@skip` has higher precedence than `@include`. */ + function shouldIncludeNode(variableValues, node) { const skip = (0, _values.getDirectiveValues)(_directives.GraphQLSkipDirective, node, variableValues); if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) { @@ -23987,6 +23419,7 @@ function shouldIncludeNode(variableValues, node) { /** * Determines if a fragment is applicable to the given type. */ + function doesFragmentConditionMatch(schema, fragment, type) { const typeConditionNode = fragment.typeCondition; if (!typeConditionNode) { @@ -24004,6 +23437,7 @@ function doesFragmentConditionMatch(schema, fragment, type) { /** * Implements the logic to compute the key of a given field's entry */ + function getFieldEntryKey(node) { return node.alias ? node.alias.value : node.name.value; } @@ -24021,18 +23455,16 @@ function getFieldEntryKey(node) { Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.assertValidExecutionArguments = assertValidExecutionArguments; exports.buildExecutionContext = buildExecutionContext; exports.buildResolveInfo = buildResolveInfo; -exports.createSourceEventStream = createSourceEventStream; exports.defaultTypeResolver = exports.defaultFieldResolver = void 0; exports.execute = execute; exports.executeSync = executeSync; -exports.experimentalExecuteIncrementally = experimentalExecuteIncrementally; -exports.subscribe = subscribe; -var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); +exports.getFieldDef = getFieldDef; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); var _isIterableObject = __webpack_require__(/*! ../jsutils/isIterableObject.mjs */ "../../../node_modules/graphql/jsutils/isIterableObject.mjs"); var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); @@ -24045,25 +23477,44 @@ var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); +var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); -var _buildExecutionPlan = __webpack_require__(/*! ./buildExecutionPlan.mjs */ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs"); var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); -var _IncrementalPublisher = __webpack_require__(/*! ./IncrementalPublisher.mjs */ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs"); -var _mapAsyncIterable = __webpack_require__(/*! ./mapAsyncIterable.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); -/* eslint-disable max-params */ -// This file contains a lot of such errors but we plan to refactor it anyway -// so just disable it for entire file. /** * A memoized collection of relevant subfields with regard to the return * type. Memoizing ensures the subfields are not repeatedly calculated, which * saves overhead when resolving lists of values. */ -const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldGroup) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, exeContext.operation, returnType, fieldGroup)); -const UNEXPECTED_EXPERIMENTAL_DIRECTIVES = 'The provided schema unexpectedly contains experimental directives (@defer or @stream). These directives may only be utilized if experimental execution features are explicitly enabled.'; -const UNEXPECTED_MULTIPLE_PAYLOADS = 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)'; + +const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldNodes) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, returnType, fieldNodes)); +/** + * Terminology + * + * "Definitions" are the generic name for top-level statements in the document. + * Examples of this include: + * 1) Operations (such as a query) + * 2) Fragments + * + * "Operations" are a generic name for requests in the document. + * Examples of this include: + * 1) query, + * 2) mutation + * + * "Selections" are the definitions that can appear legally and at + * single level of the query. These include: + * 1) field references e.g `a` + * 2) fragment "spreads" e.g. `...c` + * 3) inline fragment "spreads" e.g. `...on Type { a }` + */ + +/** + * Data that must be available at all points during query execution. + * + * Namely, schema of the type system that is currently executing, + * and the fragments defined in the query document + */ + /** * Implements the "Executing requests" section of the GraphQL specification. * @@ -24073,177 +23524,105 @@ const UNEXPECTED_MULTIPLE_PAYLOADS = 'Executing this GraphQL operation would une * * If the arguments to this function do not result in a legal execution context, * a GraphQLError will be thrown immediately explaining the invalid input. - * - * This function does not support incremental delivery (`@defer` and `@stream`). - * If an operation which would defer or stream data is executed with this - * function, it will throw or return a rejected promise. - * Use `experimentalExecuteIncrementally` if you want to support incremental - * delivery. */ function execute(args) { - if (args.schema.getDirective('defer') || args.schema.getDirective('stream')) { - throw new Error(UNEXPECTED_EXPERIMENTAL_DIRECTIVES); - } - const result = experimentalExecuteIncrementally(args); - if (!(0, _isPromise.isPromise)(result)) { - if ('initialResult' in result) { - // This can happen if the operation contains @defer or @stream directives - // and is not validated prior to execution - throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); - } - return result; - } - return result.then(incrementalResult => { - if ('initialResult' in incrementalResult) { - // This can happen if the operation contains @defer or @stream directives - // and is not validated prior to execution - throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); - } - return incrementalResult; - }); -} -/** - * Implements the "Executing requests" section of the GraphQL specification, - * including `@defer` and `@stream` as proposed in - * https://github.com/graphql/graphql-spec/pull/742 - * - * This function returns a Promise of an ExperimentalIncrementalExecutionResults - * object. This object either consists of a single ExecutionResult, or an - * object containing an `initialResult` and a stream of `subsequentResults`. - * - * If the arguments to this function do not result in a legal execution context, - * a GraphQLError will be thrown immediately explaining the invalid input. - */ -function experimentalExecuteIncrementally(args) { - // If a valid execution context cannot be created due to incorrect arguments, + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); + const { + schema, + document, + variableValues, + rootValue + } = args; // If arguments are missing or incorrect, throw an error. + + assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. + + const exeContext = buildExecutionContext(args); // Return early errors if execution context failed. + if (!('schema' in exeContext)) { return { errors: exeContext }; - } - return executeOperation(exeContext); -} -/** - * Implements the "Executing operations" section of the spec. - * - * Returns a Promise that will eventually resolve to the data described by - * The "Response" section of the GraphQL specification. - * - * If errors are encountered while executing a GraphQL field, only that - * field and its descendants will be omitted, and sibling fields will still - * be executed. An execution which encounters errors will still result in a - * resolved Promise. - * - * Errors from sub-fields of a NonNull type may propagate to the top level, - * at which point we still log the error and null the parent field, which - * in this case is the entire response. - */ -function executeOperation(exeContext) { + } // Return a Promise that will eventually resolve to the data described by + // The "Response" section of the GraphQL specification. + // + // If errors are encountered while executing a GraphQL field, only that + // field and its descendants will be omitted, and sibling fields will still + // be executed. An execution which encounters errors will still result in a + // resolved Promise. + // + // Errors from sub-fields of a NonNull type may propagate to the top level, + // at which point we still log the error and null the parent field, which + // in this case is the entire response. + try { const { - operation, - schema, - fragments, - variableValues, - rootValue + operation } = exeContext; - const rootType = schema.getRootType(operation.operation); - if (rootType == null) { - throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { - nodes: operation + const result = executeOperation(exeContext, operation, rootValue); + if ((0, _isPromise.isPromise)(result)) { + return result.then(data => buildResponse(data, exeContext.errors), error => { + exeContext.errors.push(error); + return buildResponse(null, exeContext.errors); }); } - const collectedFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); - let groupedFieldSet = collectedFields.groupedFieldSet; - const newDeferUsages = collectedFields.newDeferUsages; - let graphqlWrappedResult; - if (newDeferUsages.length === 0) { - graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, undefined); - } else { - const executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(groupedFieldSet); - groupedFieldSet = executionPlan.groupedFieldSet; - const newGroupedFieldSets = executionPlan.newGroupedFieldSets; - const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map()); - graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, newDeferMap); - if (newGroupedFieldSets.size > 0) { - const newPendingExecutionGroups = collectExecutionGroups(exeContext, rootType, rootValue, undefined, undefined, newGroupedFieldSets, newDeferMap); - graphqlWrappedResult = withNewExecutionGroups(graphqlWrappedResult, newPendingExecutionGroups); - } - } - if ((0, _isPromise.isPromise)(graphqlWrappedResult)) { - return graphqlWrappedResult.then(resolved => buildDataResponse(exeContext, resolved[0], resolved[1]), error => ({ - data: null, - errors: withError(exeContext.errors, error) - })); - } - return buildDataResponse(exeContext, graphqlWrappedResult[0], graphqlWrappedResult[1]); + return buildResponse(result, exeContext.errors); } catch (error) { - return { - data: null, - errors: withError(exeContext.errors, error) - }; + exeContext.errors.push(error); + return buildResponse(null, exeContext.errors); } } -function withNewExecutionGroups(result, newPendingExecutionGroups) { - if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => { - addIncrementalDataRecords(resolved, newPendingExecutionGroups); - return resolved; - }); - } - addIncrementalDataRecords(result, newPendingExecutionGroups); - return result; -} -function addIncrementalDataRecords(graphqlWrappedResult, incrementalDataRecords) { - if (incrementalDataRecords === undefined) { - return; - } - if (graphqlWrappedResult[1] === undefined) { - graphqlWrappedResult[1] = [...incrementalDataRecords]; - } else { - graphqlWrappedResult[1].push(...incrementalDataRecords); - } -} -function withError(errors, error) { - return errors === undefined ? [error] : [...errors, error]; -} -function buildDataResponse(exeContext, data, incrementalDataRecords) { - const errors = exeContext.errors; - if (incrementalDataRecords === undefined) { - return errors !== undefined ? { - errors, - data - } : { - data - }; - } - return (0, _IncrementalPublisher.buildIncrementalResponse)(exeContext, data, errors, incrementalDataRecords); -} /** * Also implements the "Executing requests" section of the GraphQL specification. * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ + function executeSync(args) { - const result = experimentalExecuteIncrementally(args); - // Assert that the execution was synchronous. - if ((0, _isPromise.isPromise)(result) || 'initialResult' in result) { + const result = execute(args); // Assert that the execution was synchronous. + + if ((0, _isPromise.isPromise)(result)) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } +/** + * Given a completed execution context and data, build the `{ errors, data }` + * response defined by the "Response" section of the GraphQL specification. + */ + +function buildResponse(data, errors) { + return errors.length === 0 ? { + data + } : { + errors, + data + }; +} +/** + * Essential assertions before executing to provide developer feedback for + * improper use of the GraphQL library. + * + * @internal + */ + +function assertValidExecutionArguments(schema, document, rawVariableValues) { + document || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for execution is invalid, throw an error. + + (0, _validate.assertValidSchema)(schema); // Variables, if provided, must be an object. + + rawVariableValues == null || (0, _isObjectLike.isObjectLike)(rawVariableValues) || (0, _devAssert.devAssert)(false, 'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.'); +} /** * Constructs a ExecutionContext object from the arguments passed to * execute, which we will pass throughout the other execution methods. * * Throws a GraphQLError if a valid execution context cannot be created. * - * TODO: consider no longer exporting this function * @internal */ + function buildExecutionContext(args) { var _definition$name, _operation$variableDe; const { @@ -24255,11 +23634,8 @@ function buildExecutionContext(args) { operationName, fieldResolver, typeResolver, - subscribeFieldResolver, - enableEarlyExecution + subscribeFieldResolver } = args; - // If the schema used for execution is invalid, throw an error. - (0, _validate.assertValidSchema)(schema); let operation; const fragments = Object.create(null); for (const definition of document.definitions) { @@ -24277,8 +23653,7 @@ function buildExecutionContext(args) { case _kinds.Kind.FRAGMENT_DEFINITION: fragments[definition.name.value] = definition; break; - default: - // ignore non-executable definitions + default: // ignore non-executable definitions } } if (!operation) { @@ -24286,9 +23661,10 @@ function buildExecutionContext(args) { return [new _GraphQLError.GraphQLError(`Unknown operation named "${operationName}".`)]; } return [new _GraphQLError.GraphQLError('Must provide an operation.')]; - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; const coercedVariableValues = (0, _values.getVariableValues)(schema, variableDefinitions, rawVariableValues !== null && rawVariableValues !== void 0 ? rawVariableValues : {}, { maxErrors: 50 @@ -24306,100 +23682,91 @@ function buildExecutionContext(args) { fieldResolver: fieldResolver !== null && fieldResolver !== void 0 ? fieldResolver : defaultFieldResolver, typeResolver: typeResolver !== null && typeResolver !== void 0 ? typeResolver : defaultTypeResolver, subscribeFieldResolver: subscribeFieldResolver !== null && subscribeFieldResolver !== void 0 ? subscribeFieldResolver : defaultFieldResolver, - enableEarlyExecution: enableEarlyExecution === true, - errors: undefined, - cancellableStreams: undefined + errors: [] }; } -function buildPerEventExecutionContext(exeContext, payload) { - return { - ...exeContext, - rootValue: payload, - errors: undefined - }; -} -function executeRootGroupedFieldSet(exeContext, operation, rootType, rootValue, groupedFieldSet, deferMap) { - switch (operation) { +/** + * Implements the "Executing operations" section of the spec. + */ + +function executeOperation(exeContext, operation, rootValue) { + const rootType = exeContext.schema.getRootType(operation.operation); + if (rootType == null) { + throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { + nodes: operation + }); + } + const rootFields = (0, _collectFields.collectFields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, rootType, operation.selectionSet); + const path = undefined; + switch (operation.operation) { case _ast.OperationTypeNode.QUERY: - return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFields(exeContext, rootType, rootValue, path, rootFields); case _ast.OperationTypeNode.MUTATION: - return executeFieldsSerially(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFieldsSerially(exeContext, rootType, rootValue, path, rootFields); case _ast.OperationTypeNode.SUBSCRIPTION: // TODO: deprecate `subscribe` and move all logic here // Temporary solution until we finish merging execute and subscribe together - return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFields(exeContext, rootType, rootValue, path, rootFields); } } /** * Implements the "Executing selection sets" section of the spec * for fields that must be executed serially. */ -function executeFieldsSerially(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { - return (0, _promiseReduce.promiseReduce)(groupedFieldSet, (graphqlWrappedResult, [responseName, fieldGroup]) => { + +function executeFieldsSerially(exeContext, parentType, sourceValue, path, fields) { + return (0, _promiseReduce.promiseReduce)(fields.entries(), (results, [responseName, fieldNodes]) => { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); + const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); if (result === undefined) { - return graphqlWrappedResult; + return results; } if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => { - graphqlWrappedResult[0][responseName] = resolved[0]; - addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); - return graphqlWrappedResult; + return result.then(resolvedResult => { + results[responseName] = resolvedResult; + return results; }); } - graphqlWrappedResult[0][responseName] = result[0]; - addIncrementalDataRecords(graphqlWrappedResult, result[1]); - return graphqlWrappedResult; - }, [Object.create(null), undefined]); + results[responseName] = result; + return results; + }, Object.create(null)); } /** * Implements the "Executing selection sets" section of the spec * for fields that may be executed in parallel. */ -function executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { + +function executeFields(exeContext, parentType, sourceValue, path, fields) { const results = Object.create(null); - const graphqlWrappedResult = [results, undefined]; let containsPromise = false; try { - for (const [responseName, fieldGroup] of groupedFieldSet) { + for (const [responseName, fieldNodes] of fields.entries()) { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); + const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); if (result !== undefined) { + results[responseName] = result; if ((0, _isPromise.isPromise)(result)) { - results[responseName] = result.then(resolved => { - addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); - return resolved[0]; - }); containsPromise = true; - } else { - results[responseName] = result[0]; - addIncrementalDataRecords(graphqlWrappedResult, result[1]); } } } } catch (error) { if (containsPromise) { // Ensure that any promises returned by other fields are handled, as they may also reject. - return (0, _promiseForObject.promiseForObject)(results, () => { - /* noop */ - }).finally(() => { + return (0, _promiseForObject.promiseForObject)(results).finally(() => { throw error; }); } throw error; - } - // If there are no promises, we can just return the object and any incrementalDataRecords + } // If there are no promises, we can just return the object + if (!containsPromise) { - return graphqlWrappedResult; - } - // Otherwise, results is a map from field name to the result of resolving that + return results; + } // Otherwise, results is a map from field name to the result of resolving that // field, which is possibly a promise. Return a promise that will return this // same map, but with any promises replaced with the values they resolved to. - return (0, _promiseForObject.promiseForObject)(results, resolved => [resolved, graphqlWrappedResult[1]]); -} -function toNodes(fieldGroup) { - return fieldGroup.map(fieldDetails => fieldDetails.node); + + return (0, _promiseForObject.promiseForObject)(results); } /** * Implements the "Executing fields" section of the spec @@ -24407,49 +23774,51 @@ function toNodes(fieldGroup) { * calling its resolve function, then calls completeValue to complete promises, * serialize scalars, or execute the sub-selection-set for objects. */ -function executeField(exeContext, parentType, source, fieldGroup, path, incrementalContext, deferMap) { + +function executeField(exeContext, parentType, source, fieldNodes, path) { var _fieldDef$resolve; - const fieldName = fieldGroup[0].node.name.value; - const fieldDef = exeContext.schema.getField(parentType, fieldName); + const fieldDef = getFieldDef(exeContext.schema, parentType, fieldNodes[0]); if (!fieldDef) { return; } const returnType = fieldDef.type; const resolveFn = (_fieldDef$resolve = fieldDef.resolve) !== null && _fieldDef$resolve !== void 0 ? _fieldDef$resolve : exeContext.fieldResolver; - const info = buildResolveInfo(exeContext, fieldDef, toNodes(fieldGroup), parentType, path); - // Get the resolve function, regardless of if its result is normal or abrupt (error). + const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path); // Get the resolve function, regardless of if its result is normal or abrupt (error). + try { // Build a JS object of arguments from the field.arguments AST, using the // variables scope to fulfill any variable references. // TODO: find a way to memoize, in case this field is within a List type. - const args = (0, _values.getArgumentValues)(fieldDef, fieldGroup[0].node, exeContext.variableValues); - // The resolve function's optional third argument is a context value that + const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], exeContext.variableValues); // The resolve function's optional third argument is a context value that // is provided to every resolve function within an execution. It is commonly // used to represent an authenticated user, or request-specific caches. + const contextValue = exeContext.contextValue; const result = resolveFn(source, args, contextValue, info); + let completed; if ((0, _isPromise.isPromise)(result)) { - return completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + completed = result.then(resolved => completeValue(exeContext, returnType, fieldNodes, info, path, resolved)); + } else { + completed = completeValue(exeContext, returnType, fieldNodes, info, path, result); } - const completed = completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); if ((0, _isPromise.isPromise)(completed)) { // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. return completed.then(undefined, rawError => { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); + return handleFieldError(error, returnType, exeContext); }); } return completed; } catch (rawError) { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); + return handleFieldError(error, returnType, exeContext); } } /** - * TODO: consider no longer exporting this function * @internal */ + function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { // The resolve function's optional fourth argument is a collection of // information about the current execution state. @@ -24466,22 +23835,16 @@ function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { variableValues: exeContext.variableValues }; } -function handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext) { - const error = (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); +function handleFieldError(error, returnType, exeContext) { // If the field type is non-nullable, then it is resolved without any // protection from errors, however it still properly locates the error. if ((0, _definition.isNonNullType)(returnType)) { throw error; - } - // Otherwise, error protection is applied, logging the error and resolving + } // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. - const context = incrementalContext !== null && incrementalContext !== void 0 ? incrementalContext : exeContext; - let errors = context.errors; - if (errors === undefined) { - errors = []; - context.errors = errors; - } - errors.push(error); + + exeContext.errors.push(error); + return null; } /** * Implements the instructions for completeValue as defined in the @@ -24504,271 +23867,94 @@ function handleFieldError(rawError, exeContext, returnType, fieldGroup, path, in * Otherwise, the field type expects a sub-selection set, and will complete the * value by executing all sub-selections. */ -function completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + +function completeValue(exeContext, returnType, fieldNodes, info, path, result) { // If result is an Error, throw a located error. if (result instanceof Error) { throw result; - } - // If field type is NonNull, complete for inner type, and throw field error + } // If field type is NonNull, complete for inner type, and throw field error // if result is null. + if ((0, _definition.isNonNullType)(returnType)) { - const completed = completeValue(exeContext, returnType.ofType, fieldGroup, info, path, result, incrementalContext, deferMap); - if (completed[0] === null) { + const completed = completeValue(exeContext, returnType.ofType, fieldNodes, info, path, result); + if (completed === null) { throw new Error(`Cannot return null for non-nullable field ${info.parentType.name}.${info.fieldName}.`); } return completed; - } - // If result value is null or undefined then return null. + } // If result value is null or undefined then return null. + if (result == null) { - return [null, undefined]; - } - // If field type is List, complete each item in the list with the inner type + return null; + } // If field type is List, complete each item in the list with the inner type + if ((0, _definition.isListType)(returnType)) { - return completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); - } - // If field type is a leaf type, Scalar or Enum, serialize to a valid value, + return completeListValue(exeContext, returnType, fieldNodes, info, path, result); + } // If field type is a leaf type, Scalar or Enum, serialize to a valid value, // returning null if serialization is not possible. + if ((0, _definition.isLeafType)(returnType)) { - return [completeLeafValue(returnType, result), undefined]; - } - // If field type is an abstract type, Interface or Union, determine the + return completeLeafValue(returnType, result); + } // If field type is an abstract type, Interface or Union, determine the // runtime Object type and complete for that type. + if ((0, _definition.isAbstractType)(returnType)) { - return completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); - } - // If field type is Object, execute and complete all sub-selections. + return completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result); + } // If field type is Object, execute and complete all sub-selections. + if ((0, _definition.isObjectType)(returnType)) { - return completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + return completeObjectValue(exeContext, returnType, fieldNodes, info, path, result); } /* c8 ignore next 6 */ // Not reachable, all possible output types have been considered. + false || (0, _invariant.invariant)(false, 'Cannot complete value of unexpected output type: ' + (0, _inspect.inspect)(returnType)); } -async function completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - try { - const resolved = await result; - let completed = completeValue(exeContext, returnType, fieldGroup, info, path, resolved, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completed)) { - completed = await completed; - } - return completed; - } catch (rawError) { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; - } -} -/** - * Returns an object containing info for streaming if a field should be - * streamed based on the experimental flag, stream directive present and - * not disabled by the "if" argument. - */ -function getStreamUsage(exeContext, fieldGroup, path) { - // do not stream inner lists of multi-dimensional lists - if (typeof path.key === 'number') { - return; - } - // TODO: add test for this case (a streamed list nested under a list). - /* c8 ignore next 7 */ - if (fieldGroup._streamUsage !== undefined) { - return fieldGroup._streamUsage; - } - // validation only allows equivalent streams on multiple fields, so it is - // safe to only check the first fieldNode for the stream directive - const stream = (0, _values.getDirectiveValues)(_directives.GraphQLStreamDirective, fieldGroup[0].node, exeContext.variableValues); - if (!stream) { - return; - } - if (stream.if === false) { - return; - } - typeof stream.initialCount === 'number' || (0, _invariant.invariant)(false, 'initialCount must be a number'); - stream.initialCount >= 0 || (0, _invariant.invariant)(false, 'initialCount must be a positive integer'); - exeContext.operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@stream` directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.'); - const streamedFieldGroup = fieldGroup.map(fieldDetails => ({ - node: fieldDetails.node, - deferUsage: undefined - })); - const streamUsage = { - initialCount: stream.initialCount, - label: typeof stream.label === 'string' ? stream.label : undefined, - fieldGroup: streamedFieldGroup - }; - fieldGroup._streamUsage = streamUsage; - return streamUsage; -} -/** - * Complete a async iterator value by completing the result and calling - * recursively until all the results are completed. - */ -async function completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap) { - let containsPromise = false; - const completedResults = []; - const graphqlWrappedResult = [completedResults, undefined]; - let index = 0; - const streamUsage = getStreamUsage(exeContext, fieldGroup, path); - const earlyReturn = asyncIterator.return === undefined ? undefined : asyncIterator.return.bind(asyncIterator); - try { - // eslint-disable-next-line no-constant-condition - while (true) { - if (streamUsage && index >= streamUsage.initialCount) { - const streamItemQueue = buildAsyncStreamItemQueue(index, path, asyncIterator, exeContext, streamUsage.fieldGroup, info, itemType); - let streamRecord; - if (earlyReturn === undefined) { - streamRecord = { - label: streamUsage.label, - path, - streamItemQueue - }; - } else { - streamRecord = { - label: streamUsage.label, - path, - earlyReturn, - streamItemQueue - }; - if (exeContext.cancellableStreams === undefined) { - exeContext.cancellableStreams = new Set(); - } - exeContext.cancellableStreams.add(streamRecord); - } - addIncrementalDataRecords(graphqlWrappedResult, [streamRecord]); - break; - } - const itemPath = (0, _Path.addPath)(path, index, undefined); - let iteration; - try { - // eslint-disable-next-line no-await-in-loop - iteration = await asyncIterator.next(); - } catch (rawError) { - throw (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); - } - // TODO: add test case for stream returning done before initialCount - /* c8 ignore next 3 */ - if (iteration.done) { - break; - } - const item = iteration.value; - // TODO: add tests for stream backed by asyncIterator that returns a promise - /* c8 ignore start */ - if ((0, _isPromise.isPromise)(item)) { - completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); - containsPromise = true; - } else if ( /* c8 ignore stop */ - completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) - // TODO: add tests for stream backed by asyncIterator that completes to a promise - /* c8 ignore start */) { - containsPromise = true; - } - /* c8 ignore stop */ - index++; - } - } catch (error) { - if (earlyReturn !== undefined) { - earlyReturn().catch(() => { - /* c8 ignore next 1 */ - // ignore error - }); - } - throw error; - } - return containsPromise ? /* c8 ignore start */Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : /* c8 ignore stop */graphqlWrappedResult; -} /** * Complete a list value by completing each item in the list with the * inner type */ -function completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - const itemType = returnType.ofType; - if ((0, _isAsyncIterable.isAsyncIterable)(result)) { - const asyncIterator = result[Symbol.asyncIterator](); - return completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap); - } + +function completeListValue(exeContext, returnType, fieldNodes, info, path, result) { if (!(0, _isIterableObject.isIterableObject)(result)) { throw new _GraphQLError.GraphQLError(`Expected Iterable, but did not find one for field "${info.parentType.name}.${info.fieldName}".`); - } - return completeIterableValue(exeContext, itemType, fieldGroup, info, path, result, incrementalContext, deferMap); -} -function completeIterableValue(exeContext, itemType, fieldGroup, info, path, items, incrementalContext, deferMap) { - // This is specified as a simple map, however we're optimizing the path + } // This is specified as a simple map, however we're optimizing the path // where the list contains no Promises by avoiding creating another Promise. + + const itemType = returnType.ofType; let containsPromise = false; - const completedResults = []; - const graphqlWrappedResult = [completedResults, undefined]; - let index = 0; - const streamUsage = getStreamUsage(exeContext, fieldGroup, path); - const iterator = items[Symbol.iterator](); - let iteration = iterator.next(); - while (!iteration.done) { - const item = iteration.value; - if (streamUsage && index >= streamUsage.initialCount) { - const syncStreamRecord = { - label: streamUsage.label, - path, - streamItemQueue: buildSyncStreamItemQueue(item, index, path, iterator, exeContext, streamUsage.fieldGroup, info, itemType) - }; - addIncrementalDataRecords(graphqlWrappedResult, [syncStreamRecord]); - break; - } + const completedResults = Array.from(result, (item, index) => { // No need to modify the info object containing the path, // since from here on it is not ever accessed by resolver functions. const itemPath = (0, _Path.addPath)(path, index, undefined); - if ((0, _isPromise.isPromise)(item)) { - completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); - containsPromise = true; - } else if (completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)) { - containsPromise = true; + try { + let completedItem; + if ((0, _isPromise.isPromise)(item)) { + completedItem = item.then(resolved => completeValue(exeContext, itemType, fieldNodes, info, itemPath, resolved)); + } else { + completedItem = completeValue(exeContext, itemType, fieldNodes, info, itemPath, item); + } + if ((0, _isPromise.isPromise)(completedItem)) { + containsPromise = true; // Note: we don't rely on a `catch` method, but we do expect "thenable" + // to take a second callback for the error case. + + return completedItem.then(undefined, rawError => { + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); + return handleFieldError(error, itemType, exeContext); + }); + } + return completedItem; + } catch (rawError) { + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); + return handleFieldError(error, itemType, exeContext); } - index++; - iteration = iterator.next(); - } - return containsPromise ? Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : graphqlWrappedResult; -} -/** - * Complete a list item value by adding it to the completed results. - * - * Returns true if the value is a Promise. - */ -function completeListItemValue(item, completedResults, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { - try { - const completedItem = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completedItem)) { - // Note: we don't rely on a `catch` method, but we do expect "thenable" - // to take a second callback for the error case. - completedResults.push(completedItem.then(resolved => { - addIncrementalDataRecords(parent, resolved[1]); - return resolved[0]; - }, rawError => { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return null; - })); - return true; - } - completedResults.push(completedItem[0]); - addIncrementalDataRecords(parent, completedItem[1]); - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - completedResults.push(null); - } - return false; -} -async function completePromisedListItemValue(item, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { - try { - const resolved = await item; - let completed = completeValue(exeContext, itemType, fieldGroup, info, itemPath, resolved, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completed)) { - completed = await completed; - } - addIncrementalDataRecords(parent, completed[1]); - return completed[0]; - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return null; - } + }); + return containsPromise ? Promise.all(completedResults) : completedResults; } /** * Complete a Scalar or Enum by serializing to a valid value, returning * null if serialization is not possible. */ + function completeLeafValue(returnType, result) { const serializedResult = returnType.serialize(result); if (serializedResult == null) { @@ -24780,24 +23966,23 @@ function completeLeafValue(returnType, result) { * Complete a value of an abstract type by determining the runtime object type * of that value, then complete the value for that type. */ -function completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + +function completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result) { var _returnType$resolveTy; const resolveTypeFn = (_returnType$resolveTy = returnType.resolveType) !== null && _returnType$resolveTy !== void 0 ? _returnType$resolveTy : exeContext.typeResolver; const contextValue = exeContext.contextValue; const runtimeType = resolveTypeFn(result, contextValue, info, returnType); if ((0, _isPromise.isPromise)(runtimeType)) { - return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap)); + return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result)); } - return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap); + return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result); } -function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGroup, info, result) { +function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldNodes, info, result) { if (runtimeTypeName == null) { - throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, { - nodes: toNodes(fieldGroup) - }); - } - // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` + throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, fieldNodes); + } // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` // TODO: remove in 17.0.0 release + if ((0, _definition.isObjectType)(runtimeTypeName)) { throw new _GraphQLError.GraphQLError('Support for returning GraphQLObjectType from resolveType was removed in graphql-js@16.0.0 please return type name instead.'); } @@ -24807,17 +23992,17 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGr const runtimeType = exeContext.schema.getType(runtimeTypeName); if (runtimeType == null) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a type "${runtimeTypeName}" that does not exist inside the schema.`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } if (!(0, _definition.isObjectType)(runtimeType)) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a non-object type "${runtimeTypeName}".`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } if (!exeContext.schema.isSubType(returnType, runtimeType)) { throw new _GraphQLError.GraphQLError(`Runtime Object type "${runtimeType.name}" is not a possible type for "${returnType.name}".`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } return runtimeType; @@ -24825,92 +24010,34 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGr /** * Complete an Object value by executing all sub-selections. */ -function completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - // If there is an isTypeOf predicate function, call it with the + +function completeObjectValue(exeContext, returnType, fieldNodes, info, path, result) { + // Collect sub-fields to execute to complete this value. + const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes); // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather // than continuing execution. + if (returnType.isTypeOf) { const isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info); if ((0, _isPromise.isPromise)(isTypeOf)) { return isTypeOf.then(resolvedIsTypeOf => { if (!resolvedIsTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldGroup); + throw invalidReturnTypeError(returnType, result, fieldNodes); } - return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); + return executeFields(exeContext, returnType, result, path, subFieldNodes); }); } if (!isTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldGroup); + throw invalidReturnTypeError(returnType, result, fieldNodes); } } - return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); + return executeFields(exeContext, returnType, result, path, subFieldNodes); } -function invalidReturnTypeError(returnType, result, fieldGroup) { +function invalidReturnTypeError(returnType, result, fieldNodes) { return new _GraphQLError.GraphQLError(`Expected value of type "${returnType.name}" but got: ${(0, _inspect.inspect)(result)}.`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } -/** - * Instantiates new DeferredFragmentRecords for the given path within an - * incremental data record, returning an updated map of DeferUsage - * objects to DeferredFragmentRecords. - * - * Note: As defer directives may be used with operations returning lists, - * a DeferUsage object may correspond to many DeferredFragmentRecords. - * - * DeferredFragmentRecord creation includes the following steps: - * 1. The new DeferredFragmentRecord is instantiated at the given path. - * 2. The parent result record is calculated from the given incremental data - * record. - * 3. The IncrementalPublisher is notified that a new DeferredFragmentRecord - * with the calculated parent has been added; the record will be released only - * after the parent has completed. - * - */ -function addNewDeferredFragments(newDeferUsages, newDeferMap, path) { - // For each new deferUsage object: - for (const newDeferUsage of newDeferUsages) { - const parentDeferUsage = newDeferUsage.parentDeferUsage; - const parent = parentDeferUsage === undefined ? undefined : deferredFragmentRecordFromDeferUsage(parentDeferUsage, newDeferMap); - // Instantiate the new record. - const deferredFragmentRecord = new _types.DeferredFragmentRecord(path, newDeferUsage.label, parent); - // Update the map. - newDeferMap.set(newDeferUsage, deferredFragmentRecord); - } - return newDeferMap; -} -function deferredFragmentRecordFromDeferUsage(deferUsage, deferMap) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return deferMap.get(deferUsage); -} -function collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap) { - // Collect sub-fields to execute to complete this value. - const collectedSubfields = collectSubfields(exeContext, returnType, fieldGroup); - let groupedFieldSet = collectedSubfields.groupedFieldSet; - const newDeferUsages = collectedSubfields.newDeferUsages; - if (deferMap === undefined && newDeferUsages.length === 0) { - return executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, undefined); - } - const subExecutionPlan = buildSubExecutionPlan(groupedFieldSet, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet); - groupedFieldSet = subExecutionPlan.groupedFieldSet; - const newGroupedFieldSets = subExecutionPlan.newGroupedFieldSets; - const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map(deferMap), path); - const subFields = executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, newDeferMap); - if (newGroupedFieldSets.size > 0) { - const newPendingExecutionGroups = collectExecutionGroups(exeContext, returnType, result, path, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet, newGroupedFieldSets, newDeferMap); - return withNewExecutionGroups(subFields, newPendingExecutionGroups); - } - return subFields; -} -function buildSubExecutionPlan(originalGroupedFieldSet, deferUsageSet) { - let executionPlan = originalGroupedFieldSet._executionPlan; - if (executionPlan !== undefined) { - return executionPlan; - } - executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(originalGroupedFieldSet, deferUsageSet); - originalGroupedFieldSet._executionPlan = executionPlan; - return executionPlan; -} /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: @@ -24921,12 +24048,13 @@ function buildSubExecutionPlan(originalGroupedFieldSet, deferUsageSet) { * Otherwise, test each possible type for the abstract type by calling * isTypeOf for the object being coerced, returning the first type that matches. */ + const defaultTypeResolver = function (value, contextValue, info, abstractType) { // First, look for `__typename`. if ((0, _isObjectLike.isObjectLike)(value) && typeof value.__typename === 'string') { return value.__typename; - } - // Otherwise, test each possible type. + } // Otherwise, test each possible type. + const possibleTypes = info.schema.getPossibleTypes(abstractType); const promisedIsTypeOfResults = []; for (let i = 0; i < possibleTypes.length; i++) { @@ -24968,340 +24096,27 @@ const defaultFieldResolver = function (source, args, contextValue, info) { } }; /** - * Implements the "Subscribe" algorithm described in the GraphQL specification. + * This method looks up the field on the given type definition. + * It has special casing for the three introspection fields, + * __schema, __type and __typename. __typename is special because + * it can always be queried as a field, even in situations where no + * other fields are allowed, like on a Union. __schema and __type + * could get automatically added to the query type, but that would + * require mutating type definitions, which would cause issues. * - * Returns a Promise which resolves to either an AsyncIterator (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with descriptive - * errors and no data will be returned. - * - * If the source stream could not be created due to faulty subscription resolver - * logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to an AsyncIterator, which - * yields a stream of ExecutionResults representing the response stream. - * - * This function does not support incremental delivery (`@defer` and `@stream`). - * If an operation which would defer or stream data is executed with this - * function, a field error will be raised at the location of the `@defer` or - * `@stream` directive. - * - * Accepts an object with named arguments. + * @internal */ exports.defaultFieldResolver = defaultFieldResolver; -function subscribe(args) { - // If a valid execution context cannot be created due to incorrect arguments, - // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. - if (!('schema' in exeContext)) { - return { - errors: exeContext - }; +function getFieldDef(schema, parentType, fieldNode) { + const fieldName = fieldNode.name.value; + if (fieldName === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.SchemaMetaFieldDef; + } else if (fieldName === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.TypeMetaFieldDef; + } else if (fieldName === _introspection.TypeNameMetaFieldDef.name) { + return _introspection.TypeNameMetaFieldDef; } - const resultOrStream = createSourceEventStreamImpl(exeContext); - if ((0, _isPromise.isPromise)(resultOrStream)) { - return resultOrStream.then(resolvedResultOrStream => mapSourceToResponse(exeContext, resolvedResultOrStream)); - } - return mapSourceToResponse(exeContext, resultOrStream); -} -function mapSourceToResponse(exeContext, resultOrStream) { - if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { - return resultOrStream; - } - // For each payload yielded from a subscription, map it over the normal - // GraphQL `execute` function, with `payload` as the rootValue. - // This implements the "MapSourceToResponseEvent" algorithm described in - // the GraphQL specification. The `execute` function provides the - // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the - // "ExecuteQuery" algorithm, for which `execute` is also used. - return (0, _mapAsyncIterable.mapAsyncIterable)(resultOrStream, payload => executeOperation(buildPerEventExecutionContext(exeContext, payload))); -} -/** - * Implements the "CreateSourceEventStream" algorithm described in the - * GraphQL specification, resolving the subscription source event stream. - * - * Returns a Promise which resolves to either an AsyncIterable (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with - * descriptive errors and no data will be returned. - * - * If the the source stream could not be created due to faulty subscription - * resolver logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to the AsyncIterable for the - * event stream returned by the resolver. - * - * A Source Event Stream represents a sequence of events, each of which triggers - * a GraphQL execution for that event. - * - * This may be useful when hosting the stateful subscription service in a - * different process or machine than the stateless GraphQL execution engine, - * or otherwise separating these two steps. For more on this, see the - * "Supporting Subscriptions at Scale" information in the GraphQL specification. - */ -function createSourceEventStream(args) { - // If a valid execution context cannot be created due to incorrect arguments, - // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. - if (!('schema' in exeContext)) { - return { - errors: exeContext - }; - } - return createSourceEventStreamImpl(exeContext); -} -function createSourceEventStreamImpl(exeContext) { - try { - const eventStream = executeSubscription(exeContext); - if ((0, _isPromise.isPromise)(eventStream)) { - return eventStream.then(undefined, error => ({ - errors: [error] - })); - } - return eventStream; - } catch (error) { - return { - errors: [error] - }; - } -} -function executeSubscription(exeContext) { - const { - schema, - fragments, - operation, - variableValues, - rootValue - } = exeContext; - const rootType = schema.getSubscriptionType(); - if (rootType == null) { - throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { - nodes: operation - }); - } - const { - groupedFieldSet - } = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); - const firstRootField = groupedFieldSet.entries().next().value; - const [responseName, fieldGroup] = firstRootField; - const fieldName = fieldGroup[0].node.name.value; - const fieldDef = schema.getField(rootType, fieldName); - const fieldNodes = fieldGroup.map(fieldDetails => fieldDetails.node); - if (!fieldDef) { - throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { - nodes: fieldNodes - }); - } - const path = (0, _Path.addPath)(undefined, responseName, rootType.name); - const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, rootType, path); - try { - var _fieldDef$subscribe; - // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. - // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. - // Build a JS object of arguments from the field.arguments AST, using the - // variables scope to fulfill any variable references. - const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); - // The resolve function's optional third argument is a context value that - // is provided to every resolve function within an execution. It is commonly - // used to represent an authenticated user, or request-specific caches. - const contextValue = exeContext.contextValue; - // Call the `subscribe()` resolver or the default resolver to produce an - // AsyncIterable yielding raw payloads. - const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; - const result = resolveFn(rootValue, args, contextValue, info); - if ((0, _isPromise.isPromise)(result)) { - return result.then(assertEventStream).then(undefined, error => { - throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); - }); - } - return assertEventStream(result); - } catch (error) { - throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); - } -} -function assertEventStream(result) { - if (result instanceof Error) { - throw result; - } - // Assert field returned an event stream, otherwise yield an error. - if (!(0, _isAsyncIterable.isAsyncIterable)(result)) { - throw new _GraphQLError.GraphQLError('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(result)}.`); - } - return result; -} -function collectExecutionGroups(exeContext, parentType, sourceValue, path, parentDeferUsages, newGroupedFieldSets, deferMap) { - const newPendingExecutionGroups = []; - for (const [deferUsageSet, groupedFieldSet] of newGroupedFieldSets) { - const deferredFragmentRecords = getDeferredFragmentRecords(deferUsageSet, deferMap); - const pendingExecutionGroup = { - deferredFragmentRecords, - result: undefined - }; - const executor = () => executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, { - errors: undefined, - deferUsageSet - }, deferMap); - if (exeContext.enableEarlyExecution) { - pendingExecutionGroup.result = new _BoxedPromiseOrValue.BoxedPromiseOrValue(shouldDefer(parentDeferUsages, deferUsageSet) ? Promise.resolve().then(executor) : executor()); - } else { - pendingExecutionGroup.result = () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()); - } - newPendingExecutionGroups.push(pendingExecutionGroup); - } - return newPendingExecutionGroups; -} -function shouldDefer(parentDeferUsages, deferUsages) { - // If we have a new child defer usage, defer. - // Otherwise, this defer usage was already deferred when it was initially - // encountered, and is now in the midst of executing early, so the new - // deferred grouped fields set can be executed immediately. - return parentDeferUsages === undefined || !Array.from(deferUsages).every(deferUsage => parentDeferUsages.has(deferUsage)); -} -function executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { - let result; - try { - result = executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap); - } catch (error) { - return { - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - errors: withError(incrementalContext.errors, error) - }; - } - if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, resolved), error => ({ - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - errors: withError(incrementalContext.errors, error) - })); - } - return buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, result); -} -function buildCompletedExecutionGroup(errors, pendingExecutionGroup, path, result) { - return { - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - result: errors === undefined ? { - data: result[0] - } : { - data: result[0], - errors - }, - incrementalDataRecords: result[1] - }; -} -function getDeferredFragmentRecords(deferUsages, deferMap) { - return Array.from(deferUsages).map(deferUsage => deferredFragmentRecordFromDeferUsage(deferUsage, deferMap)); -} -function buildSyncStreamItemQueue(initialItem, initialIndex, streamPath, iterator, exeContext, fieldGroup, info, itemType) { - const streamItemQueue = []; - const enableEarlyExecution = exeContext.enableEarlyExecution; - const firstExecutor = () => { - const initialPath = (0, _Path.addPath)(streamPath, initialIndex, undefined); - const firstStreamItem = new _BoxedPromiseOrValue.BoxedPromiseOrValue(completeStreamItem(initialPath, initialItem, exeContext, { - errors: undefined - }, fieldGroup, info, itemType)); - let iteration = iterator.next(); - let currentIndex = initialIndex + 1; - let currentStreamItem = firstStreamItem; - while (!iteration.done) { - // TODO: add test case for early sync termination - /* c8 ignore next 6 */ - if (currentStreamItem instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue) { - const result = currentStreamItem.value; - if (!(0, _isPromise.isPromise)(result) && result.errors !== undefined) { - break; - } - } - const itemPath = (0, _Path.addPath)(streamPath, currentIndex, undefined); - const value = iteration.value; - const currentExecutor = () => completeStreamItem(itemPath, value, exeContext, { - errors: undefined - }, fieldGroup, info, itemType); - currentStreamItem = enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()); - streamItemQueue.push(currentStreamItem); - iteration = iterator.next(); - currentIndex = initialIndex + 1; - } - streamItemQueue.push(new _BoxedPromiseOrValue.BoxedPromiseOrValue({})); - return firstStreamItem.value; - }; - streamItemQueue.push(enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(Promise.resolve().then(firstExecutor)) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(firstExecutor())); - return streamItemQueue; -} -function buildAsyncStreamItemQueue(initialIndex, streamPath, asyncIterator, exeContext, fieldGroup, info, itemType) { - const streamItemQueue = []; - const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, initialIndex, asyncIterator, exeContext, fieldGroup, info, itemType); - streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); - return streamItemQueue; -} -async function getNextAsyncStreamItemResult(streamItemQueue, streamPath, index, asyncIterator, exeContext, fieldGroup, info, itemType) { - let iteration; - try { - iteration = await asyncIterator.next(); - } catch (error) { - return { - errors: [(0, _locatedError.locatedError)(error, toNodes(fieldGroup), (0, _Path.pathToArray)(streamPath))] - }; - } - if (iteration.done) { - return {}; - } - const itemPath = (0, _Path.addPath)(streamPath, index, undefined); - const result = completeStreamItem(itemPath, iteration.value, exeContext, { - errors: undefined - }, fieldGroup, info, itemType); - const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, index + 1, asyncIterator, exeContext, fieldGroup, info, itemType); - streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); - return result; -} -function completeStreamItem(itemPath, item, exeContext, incrementalContext, fieldGroup, info, itemType) { - if ((0, _isPromise.isPromise)(item)) { - return completePromisedValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ - errors: withError(incrementalContext.errors, error) - })); - } - let result; - try { - try { - result = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()); - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - result = [null, undefined]; - } - } catch (error) { - return { - errors: withError(incrementalContext.errors, error) - }; - } - if ((0, _isPromise.isPromise)(result)) { - return result.then(undefined, rawError => { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return [null, undefined]; - }).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ - errors: withError(incrementalContext.errors, error) - })); - } - return buildStreamItemResult(incrementalContext.errors, result); -} -function buildStreamItemResult(errors, result) { - return { - item: result[0], - errors, - incrementalDataRecords: result[1] - }; + return parentType.getFields()[fieldName]; } /***/ }), @@ -25320,7 +24135,7 @@ Object.defineProperty(exports, "__esModule", ({ Object.defineProperty(exports, "createSourceEventStream", ({ enumerable: true, get: function () { - return _execute.createSourceEventStream; + return _subscribe.createSourceEventStream; } })); Object.defineProperty(exports, "defaultFieldResolver", ({ @@ -25347,12 +24162,6 @@ Object.defineProperty(exports, "executeSync", ({ return _execute.executeSync; } })); -Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ - enumerable: true, - get: function () { - return _execute.experimentalExecuteIncrementally; - } -})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -25380,18 +24189,19 @@ Object.defineProperty(exports, "responsePathAsArray", ({ Object.defineProperty(exports, "subscribe", ({ enumerable: true, get: function () { - return _execute.subscribe; + return _subscribe.subscribe; } })); var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +var _subscribe = __webpack_require__(/*! ./subscribe.mjs */ "../../../node_modules/graphql/execution/subscribe.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); /***/ }), -/***/ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs": +/***/ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs": /*!********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/mapAsyncIterable.mjs ***! + !*** ../../../node_modules/graphql/execution/mapAsyncIterator.mjs ***! \********************************************************************/ /***/ (function(__unused_webpack_module, exports) { @@ -25400,12 +24210,12 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.mapAsyncIterable = mapAsyncIterable; +exports.mapAsyncIterator = mapAsyncIterator; /** * Given an AsyncIterable and a callback function, return an AsyncIterator * which produces values mapped via calling the callback function. */ -function mapAsyncIterable(iterable, callback) { +function mapAsyncIterator(iterable, callback) { const iterator = iterable[Symbol.asyncIterator](); async function mapResult(result) { if (result.done) { @@ -25455,49 +24265,201 @@ function mapAsyncIterable(iterable, callback) { /***/ }), -/***/ "../../../node_modules/graphql/execution/types.mjs": -/*!*********************************************************!*\ - !*** ../../../node_modules/graphql/execution/types.mjs ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ "../../../node_modules/graphql/execution/subscribe.mjs": +/*!*************************************************************!*\ + !*** ../../../node_modules/graphql/execution/subscribe.mjs ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DeferredFragmentRecord = void 0; -exports.isCancellableStreamRecord = isCancellableStreamRecord; -exports.isCompletedExecutionGroup = isCompletedExecutionGroup; -exports.isDeferredFragmentRecord = isDeferredFragmentRecord; -exports.isFailedExecutionGroup = isFailedExecutionGroup; -exports.isPendingExecutionGroup = isPendingExecutionGroup; -function isPendingExecutionGroup(incrementalDataRecord) { - return 'deferredFragmentRecords' in incrementalDataRecord; +exports.createSourceEventStream = createSourceEventStream; +exports.subscribe = subscribe; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); +var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../../node_modules/graphql/error/locatedError.mjs"); +var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); +var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +var _mapAsyncIterator = __webpack_require__(/*! ./mapAsyncIterator.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs"); +var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); +/** + * Implements the "Subscribe" algorithm described in the GraphQL specification. + * + * Returns a Promise which resolves to either an AsyncIterator (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with + * descriptive errors and no data will be returned. + * + * If the source stream could not be created due to faulty subscription + * resolver logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to an AsyncIterator, which + * yields a stream of ExecutionResults representing the response stream. + * + * Accepts either an object with named arguments, or individual arguments. + */ + +async function subscribe(args) { + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); + const resultOrStream = await createSourceEventStream(args); + if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { + return resultOrStream; + } // For each payload yielded from a subscription, map it over the normal + // GraphQL `execute` function, with `payload` as the rootValue. + // This implements the "MapSourceToResponseEvent" algorithm described in + // the GraphQL specification. The `execute` function provides the + // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the + // "ExecuteQuery" algorithm, for which `execute` is also used. + + const mapSourceToResponse = payload => (0, _execute.execute)({ + ...args, + rootValue: payload + }); // Map every source value to a ExecutionResult value as described above. + + return (0, _mapAsyncIterator.mapAsyncIterator)(resultOrStream, mapSourceToResponse); } -function isCompletedExecutionGroup(subsequentResult) { - return 'pendingExecutionGroup' in subsequentResult; +function toNormalizedArgs(args) { + const firstArg = args[0]; + if (firstArg && 'document' in firstArg) { + return firstArg; + } + return { + schema: firstArg, + // FIXME: when underlying TS bug fixed, see https://github.com/microsoft/TypeScript/issues/31613 + document: args[1], + rootValue: args[2], + contextValue: args[3], + variableValues: args[4], + operationName: args[5], + subscribeFieldResolver: args[6] + }; } -function isFailedExecutionGroup(completedExecutionGroup) { - return completedExecutionGroup.errors !== undefined; -} -/** @internal */ -class DeferredFragmentRecord { - constructor(path, label, parent) { - this.path = path; - this.label = label; - this.parent = parent; - this.pendingExecutionGroups = new Set(); - this.successfulExecutionGroups = new Set(); - this.children = new Set(); +/** + * Implements the "CreateSourceEventStream" algorithm described in the + * GraphQL specification, resolving the subscription source event stream. + * + * Returns a Promise which resolves to either an AsyncIterable (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with + * descriptive errors and no data will be returned. + * + * If the the source stream could not be created due to faulty subscription + * resolver logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to the AsyncIterable for the + * event stream returned by the resolver. + * + * A Source Event Stream represents a sequence of events, each of which triggers + * a GraphQL execution for that event. + * + * This may be useful when hosting the stateful subscription service in a + * different process or machine than the stateless GraphQL execution engine, + * or otherwise separating these two steps. For more on this, see the + * "Supporting Subscriptions at Scale" information in the GraphQL specification. + */ + +async function createSourceEventStream(...rawArgs) { + const args = toNormalizedArgs(rawArgs); + const { + schema, + document, + variableValues + } = args; // If arguments are missing or incorrectly typed, this is an internal + // developer mistake which should throw an early error. + + (0, _execute.assertValidExecutionArguments)(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, + // a "Response" with only errors is returned. + + const exeContext = (0, _execute.buildExecutionContext)(args); // Return early errors if execution context failed. + + if (!('schema' in exeContext)) { + return { + errors: exeContext + }; + } + try { + const eventStream = await executeSubscription(exeContext); // Assert field returned an event stream, otherwise yield an error. + + if (!(0, _isAsyncIterable.isAsyncIterable)(eventStream)) { + throw new Error('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(eventStream)}.`); + } + return eventStream; + } catch (error) { + // If it GraphQLError, report it as an ExecutionResult, containing only errors and no data. + // Otherwise treat the error as a system-class error and re-throw it. + if (error instanceof _GraphQLError.GraphQLError) { + return { + errors: [error] + }; + } + throw error; } } -exports.DeferredFragmentRecord = DeferredFragmentRecord; -function isDeferredFragmentRecord(deliveryGroup) { - return deliveryGroup instanceof DeferredFragmentRecord; -} -function isCancellableStreamRecord(deliveryGroup) { - return 'earlyReturn' in deliveryGroup; +async function executeSubscription(exeContext) { + const { + schema, + fragments, + operation, + variableValues, + rootValue + } = exeContext; + const rootType = schema.getSubscriptionType(); + if (rootType == null) { + throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { + nodes: operation + }); + } + const rootFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation.selectionSet); + const [responseName, fieldNodes] = [...rootFields.entries()][0]; + const fieldDef = (0, _execute.getFieldDef)(schema, rootType, fieldNodes[0]); + if (!fieldDef) { + const fieldName = fieldNodes[0].name.value; + throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { + nodes: fieldNodes + }); + } + const path = (0, _Path.addPath)(undefined, responseName, rootType.name); + const info = (0, _execute.buildResolveInfo)(exeContext, fieldDef, fieldNodes, rootType, path); + try { + var _fieldDef$subscribe; + + // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. + // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. + // Build a JS object of arguments from the field.arguments AST, using the + // variables scope to fulfill any variable references. + const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); // The resolve function's optional third argument is a context value that + // is provided to every resolve function within an execution. It is commonly + // used to represent an authenticated user, or request-specific caches. + + const contextValue = exeContext.contextValue; // Call the `subscribe()` resolver or the default resolver to produce an + // AsyncIterable yielding raw payloads. + + const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; + const eventStream = await resolveFn(rootValue, args, contextValue, info); + if (eventStream instanceof Error) { + throw eventStream; + } + return eventStream; + } catch (error) { + throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); + } } /***/ }), @@ -25517,6 +24479,7 @@ exports.getArgumentValues = getArgumentValues; exports.getDirectiveValues = getDirectiveValues; exports.getVariableValues = getVariableValues; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _printPathArray = __webpack_require__(/*! ../jsutils/printPathArray.mjs */ "../../../node_modules/graphql/jsutils/printPathArray.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); @@ -25570,7 +24533,7 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { })); continue; } - if (!Object.hasOwn(inputs, varName)) { + if (!hasOwnProperty(inputs, varName)) { if (varDefNode.defaultValue) { coercedValues[varName] = (0, _valueFromAST.valueFromAST)(varDefNode.defaultValue, varType); } else if ((0, _definition.isNonNullType)(varType)) { @@ -25610,18 +24573,20 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ + function getArgumentValues(def, node, variableValues) { var _node$arguments; - const coercedValues = {}; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const coercedValues = {}; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const argumentNodes = (_node$arguments = node.arguments) !== null && _node$arguments !== void 0 ? _node$arguments : []; - const argNodeMap = new Map(argumentNodes.map(arg => [arg.name.value, arg])); + const argNodeMap = (0, _keyMap.keyMap)(argumentNodes, arg => arg.name.value); for (const argDef of def.args) { const name = argDef.name; const argType = argDef.type; - const argumentNode = argNodeMap.get(name); - if (argumentNode == null) { + const argumentNode = argNodeMap[name]; + if (!argumentNode) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -25635,7 +24600,7 @@ function getArgumentValues(def, node, variableValues) { let isNull = valueNode.kind === _kinds.Kind.NULL; if (valueNode.kind === _kinds.Kind.VARIABLE) { const variableName = valueNode.name.value; - if (variableValues == null || !Object.hasOwn(variableValues, variableName)) { + if (variableValues == null || !hasOwnProperty(variableValues, variableName)) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -25676,6 +24641,7 @@ function getArgumentValues(def, node, variableValues) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ + function getDirectiveValues(directiveDef, node, variableValues) { var _node$directives; const directiveNode = (_node$directives = node.directives) === null || _node$directives === void 0 ? void 0 : _node$directives.find(directive => directive.name.value === directiveDef.name); @@ -25683,6 +24649,9 @@ function getDirectiveValues(directiveDef, node, variableValues) { return getArgumentValues(directiveDef, directiveNode, variableValues); } } +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} /***/ }), @@ -25699,11 +24668,52 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.graphql = graphql; exports.graphqlSync = graphqlSync; +var _devAssert = __webpack_require__(/*! ./jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _isPromise = __webpack_require__(/*! ./jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); var _parser = __webpack_require__(/*! ./language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _validate = __webpack_require__(/*! ./type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); var _validate2 = __webpack_require__(/*! ./validation/validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _execute = __webpack_require__(/*! ./execution/execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +/** + * This is the primary entry point function for fulfilling GraphQL operations + * by parsing, validating, and executing a GraphQL document along side a + * GraphQL schema. + * + * More sophisticated GraphQL servers, such as those which persist queries, + * may wish to separate the validation and execution phases to a static time + * tooling step, and a server runtime step. + * + * Accepts either an object with named arguments, or individual arguments: + * + * schema: + * The GraphQL type system to use when validating and executing a query. + * source: + * A GraphQL language formatted string representing the requested operation. + * rootValue: + * The value provided as the first argument to resolver functions on the top + * level type (e.g. the query object type). + * contextValue: + * The context value is provided as an argument to resolver functions after + * field arguments. It is used to pass shared information useful at any point + * during executing this query, for example the currently logged in user and + * connections to databases or other services. + * variableValues: + * A mapping of variable name to runtime value to use for all variables + * defined in the requestString. + * operationName: + * The name of the operation to use if requestString contains multiple + * possible operations. Can be omitted if requestString contains only + * one operation. + * fieldResolver: + * A resolver function to use when one is not provided by the schema. + * If not provided, the default field resolver is used (which looks for a + * value or method on the source value with the field's name). + * typeResolver: + * A type resolver function to use when none is provided by the schema. + * If not provided, the default type resolver is used (which looks for a + * `__typename` field or alternatively calls the `isTypeOf` method). + */ + function graphql(args) { // Always return a Promise for a consistent API. return new Promise(resolve => resolve(graphqlImpl(args))); @@ -25714,15 +24724,18 @@ function graphql(args) { * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ + function graphqlSync(args) { - const result = graphqlImpl(args); - // Assert that the execution was synchronous. + const result = graphqlImpl(args); // Assert that the execution was synchronous. + if ((0, _isPromise.isPromise)(result)) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } function graphqlImpl(args) { + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); const { schema, source, @@ -25732,15 +24745,15 @@ function graphqlImpl(args) { operationName, fieldResolver, typeResolver - } = args; - // Validate Schema + } = args; // Validate Schema + const schemaValidationErrors = (0, _validate.validateSchema)(schema); if (schemaValidationErrors.length > 0) { return { errors: schemaValidationErrors }; - } - // Parse + } // Parse + let document; try { document = (0, _parser.parse)(source); @@ -25748,15 +24761,15 @@ function graphqlImpl(args) { return { errors: [syntaxError] }; - } - // Validate + } // Validate + const validationErrors = (0, _validate2.validate)(schema, document); if (validationErrors.length > 0) { return { errors: validationErrors }; - } - // Execute + } // Execute + return (0, _execute.execute)({ schema, document, @@ -25848,12 +24861,6 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _index.GraphQLBoolean; } })); -Object.defineProperty(exports, "GraphQLDeferDirective", ({ - enumerable: true, - get: function () { - return _index.GraphQLDeferDirective; - } -})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -25962,12 +24969,6 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _index.GraphQLSpecifiedByDirective; } })); -Object.defineProperty(exports, "GraphQLStreamDirective", ({ - enumerable: true, - get: function () { - return _index.GraphQLStreamDirective; - } -})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -26430,6 +25431,12 @@ Object.defineProperty(exports, "assertUnionType", ({ return _index.assertUnionType; } })); +Object.defineProperty(exports, "assertValidName", ({ + enumerable: true, + get: function () { + return _index6.assertValidName; + } +})); Object.defineProperty(exports, "assertValidSchema", ({ enumerable: true, get: function () { @@ -26514,12 +25521,6 @@ Object.defineProperty(exports, "executeSync", ({ return _index3.executeSync; } })); -Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ - enumerable: true, - get: function () { - return _index3.experimentalExecuteIncrementally; - } -})); Object.defineProperty(exports, "extendSchema", ({ enumerable: true, get: function () { @@ -26538,6 +25539,12 @@ Object.defineProperty(exports, "findDangerousChanges", ({ return _index6.findDangerousChanges; } })); +Object.defineProperty(exports, "formatError", ({ + enumerable: true, + get: function () { + return _index5.formatError; + } +})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -26586,12 +25593,24 @@ Object.defineProperty(exports, "getOperationAST", ({ return _index6.getOperationAST; } })); +Object.defineProperty(exports, "getOperationRootType", ({ + enumerable: true, + get: function () { + return _index6.getOperationRootType; + } +})); Object.defineProperty(exports, "getVariableValues", ({ enumerable: true, get: function () { return _index3.getVariableValues; } })); +Object.defineProperty(exports, "getVisitFn", ({ + enumerable: true, + get: function () { + return _index2.getVisitFn; + } +})); Object.defineProperty(exports, "graphql", ({ enumerable: true, get: function () { @@ -26712,12 +25731,6 @@ Object.defineProperty(exports, "isNonNullType", ({ return _index.isNonNullType; } })); -Object.defineProperty(exports, "isNullabilityAssertionNode", ({ - enumerable: true, - get: function () { - return _index2.isNullabilityAssertionNode; - } -})); Object.defineProperty(exports, "isNullableType", ({ enumerable: true, get: function () { @@ -26826,6 +25839,12 @@ Object.defineProperty(exports, "isUnionType", ({ return _index.isUnionType; } })); +Object.defineProperty(exports, "isValidNameError", ({ + enumerable: true, + get: function () { + return _index6.isValidNameError; + } +})); Object.defineProperty(exports, "isValueNode", ({ enumerable: true, get: function () { @@ -26880,10 +25899,10 @@ Object.defineProperty(exports, "print", ({ return _index2.print; } })); -Object.defineProperty(exports, "printDirective", ({ +Object.defineProperty(exports, "printError", ({ enumerable: true, get: function () { - return _index6.printDirective; + return _index5.printError; } })); Object.defineProperty(exports, "printIntrospectionSchema", ({ @@ -27053,76 +26072,6 @@ var _index6 = __webpack_require__(/*! ./utilities/index.mjs */ "../../../node_mo /***/ }), -/***/ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs": -/*!****************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/AccumulatorMap.mjs ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.AccumulatorMap = void 0; -/** - * ES6 Map with additional `add` method to accumulate items. - */ -class AccumulatorMap extends Map { - get [Symbol.toStringTag]() { - return 'AccumulatorMap'; - } - add(key, item) { - const group = this.get(key); - if (group === undefined) { - this.set(key, [item]); - } else { - group.push(item); - } - } -} -exports.AccumulatorMap = AccumulatorMap; - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs": -/*!*********************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.BoxedPromiseOrValue = void 0; -var _isPromise = __webpack_require__(/*! ./isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); -/** - * A BoxedPromiseOrValue is a container for a value or promise where the value - * will be updated when the promise resolves. - * - * A BoxedPromiseOrValue may only be used with promises whose possible - * rejection has already been handled, otherwise this will lead to unhandled - * promise rejections. - * - * @internal - * */ -class BoxedPromiseOrValue { - constructor(value) { - this.value = value; - if ((0, _isPromise.isPromise)(value)) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - value.then(resolved => { - this.value = resolved; - }); - } - } -} -exports.BoxedPromiseOrValue = BoxedPromiseOrValue; - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/Path.mjs": /*!******************************************************!*\ !*** ../../../node_modules/graphql/jsutils/Path.mjs ***! @@ -27149,6 +26098,7 @@ function addPath(prev, key, typename) { /** * Given a Path, return an Array of the path keys. */ + function pathToArray(path) { const flattened = []; let curr = path; @@ -27161,27 +26111,6 @@ function pathToArray(path) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/capitalize.mjs": -/*!************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/capitalize.mjs ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.capitalize = capitalize; -/** - * Converts the first character of string to upper case and the remaining to lower case. - */ -function capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/devAssert.mjs": /*!***********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/devAssert.mjs ***! @@ -27195,7 +26124,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.devAssert = devAssert; function devAssert(condition, message) { - if (!condition) { + const booleanCondition = Boolean(condition); + if (!booleanCondition) { throw new Error(message); } } @@ -27206,7 +26136,7 @@ function devAssert(condition, message) { /*!************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/didYouMean.mjs ***! \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports) { @@ -27214,84 +26144,29 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.didYouMean = didYouMean; -var _formatList = __webpack_require__(/*! ./formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); const MAX_SUGGESTIONS = 5; +/** + * Given [ A, B, C ] return ' Did you mean A, B, or C?'. + */ + function didYouMean(firstArg, secondArg) { - const [subMessage, suggestions] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; - if (suggestions.length === 0) { - return ''; - } + const [subMessage, suggestionsArg] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; let message = ' Did you mean '; - if (subMessage != null) { + if (subMessage) { message += subMessage + ' '; } - const suggestionList = (0, _formatList.orList)(suggestions.slice(0, MAX_SUGGESTIONS).map(x => `"${x}"`)); - return message + suggestionList + '?'; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/formatList.mjs": -/*!************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/formatList.mjs ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.andList = andList; -exports.orList = orList; -var _invariant = __webpack_require__(/*! ./invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -/** - * Given [ A, B, C ] return 'A, B, or C'. - */ -function orList(items) { - return formatList('or', items); -} -/** - * Given [ A, B, C ] return 'A, B, and C'. - */ -function andList(items) { - return formatList('and', items); -} -function formatList(conjunction, items) { - items.length !== 0 || (0, _invariant.invariant)(false); - switch (items.length) { + const suggestions = suggestionsArg.map(x => `"${x}"`); + switch (suggestions.length) { + case 0: + return ''; case 1: - return items[0]; + return message + suggestions[0] + '?'; case 2: - return items[0] + ' ' + conjunction + ' ' + items[1]; + return message + suggestions[0] + ' or ' + suggestions[1] + '?'; } - const allButLast = items.slice(0, -1); - const lastItem = items.at(-1); - return allButLast.join(', ') + ', ' + conjunction + ' ' + lastItem; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/getBySet.mjs": -/*!**********************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/getBySet.mjs ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getBySet = getBySet; -var _isSameSet = __webpack_require__(/*! ./isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); -function getBySet(map, setToMatch) { - for (const set of map.keys()) { - if ((0, _isSameSet.isSameSet)(set, setToMatch)) { - return map.get(set); - } - } - return undefined; + const selected = suggestions.slice(0, MAX_SUGGESTIONS); + const lastItem = selected.pop(); + return message + selected.join(', ') + ', or ' + lastItem + '?'; } /***/ }), @@ -27300,7 +26175,7 @@ function getBySet(map, setToMatch) { /*!*********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/groupBy.mjs ***! \*********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports) { @@ -27308,14 +26183,19 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.groupBy = groupBy; -var _AccumulatorMap = __webpack_require__(/*! ./AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); /** * Groups array items into a Map, given a function to produce grouping key. */ function groupBy(list, keyFn) { - const result = new _AccumulatorMap.AccumulatorMap(); + const result = new Map(); for (const item of list) { - result.add(keyFn(item), item); + const key = keyFn(item); + const group = result.get(key); + if (group === undefined) { + result.set(key, [item]); + } else { + group.push(item); + } } return result; } @@ -27360,6 +26240,7 @@ const MAX_RECURSIVE_DEPTH = 2; /** * Used to print values in error messages. */ + function inspect(value) { return formatValue(value, []); } @@ -27384,8 +26265,8 @@ function formatObjectValue(value, previouslySeenValues) { } const seenValues = [...previouslySeenValues, value]; if (isJSONable(value)) { - const jsonValue = value.toJSON(); - // check for infinite recursion + const jsonValue = value.toJSON(); // check for infinite recursion + if (jsonValue !== value) { return typeof jsonValue === 'string' ? jsonValue : formatValue(jsonValue, seenValues); } @@ -27454,15 +26335,21 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.instanceOf = void 0; var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +/* c8 ignore next 3 */ + +const isProduction = globalThis.process && +// eslint-disable-next-line no-undef +"development" === 'production'; /** * A replacement for instanceof which includes an error warning when multi-realm * constructors are detected. * See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production * See: https://webpack.js.org/guides/production/ */ + const instanceOf = exports.instanceOf = /* c8 ignore next 6 */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 -globalThis.process != null && globalThis.process.env.NODE_ENV === 'production' ? function instanceOf(value, constructor) { +isProduction ? function instanceOf(value, constructor) { return value instanceof constructor; } : function instanceOf(value, constructor) { if (value instanceof constructor) { @@ -27470,11 +26357,13 @@ globalThis.process != null && globalThis.process.env.NODE_ENV === 'production' ? } if (typeof value === 'object' && value !== null) { var _value$constructor; + // Prefer Symbol.toStringTag since it is immune to minification. const className = constructor.prototype[Symbol.toStringTag]; const valueClassName = // We still need to support constructor's name to detect conflicts with older versions of this library. - Symbol.toStringTag in value ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; + Symbol.toStringTag in value // @ts-expect-error TS bug see, https://github.com/microsoft/TypeScript/issues/38009 + ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; if (className === valueClassName) { const stringifiedValue = (0, _inspect.inspect)(value); throw new Error(`Cannot use ${className} "${stringifiedValue}" from another module or realm. @@ -27509,7 +26398,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.invariant = invariant; function invariant(condition, message) { - if (!condition) { + const booleanCondition = Boolean(condition); + if (!booleanCondition) { throw new Error(message != null ? message : 'Unexpected invariant triggered.'); } } @@ -27617,32 +26507,6 @@ function isPromise(value) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/isSameSet.mjs": -/*!***********************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/isSameSet.mjs ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isSameSet = isSameSet; -function isSameSet(setA, setB) { - if (setA.size !== setB.size) { - return false; - } - for (const item of setA) { - if (!setB.has(item)) { - return false; - } - } - return true; -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/keyMap.mjs": /*!********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/keyMap.mjs ***! @@ -27904,15 +26768,14 @@ exports.promiseForObject = promiseForObject; * This is akin to bluebird's `Promise.props`, but implemented only using * `Promise.all` so it will work with any implementation of ES6 promises. */ -async function promiseForObject(object, callback) { - const keys = Object.keys(object); - const values = Object.values(object); - const resolvedValues = await Promise.all(values); - const resolvedObject = Object.create(null); - for (let i = 0; i < keys.length; ++i) { - resolvedObject[keys[i]] = resolvedValues[i]; - } - return callback(resolvedObject); +function promiseForObject(object) { + return Promise.all(Object.values(object)).then(resolvedValues => { + const resolvedObject = Object.create(null); + for (const [i, key] of Object.keys(object).entries()) { + resolvedObject[key] = resolvedValues[i]; + } + return resolvedObject; + }); } /***/ }), @@ -27947,39 +26810,6 @@ function promiseReduce(values, callbackFn, initialValue) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs": -/*!**********************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.promiseWithResolvers = promiseWithResolvers; -/** - * Based on Promise.withResolvers proposal - * https://github.com/tc39/proposal-promise-with-resolvers - */ -function promiseWithResolvers() { - // these are assigned synchronously within the Promise constructor - let resolve; - let reject; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - return { - promise, - resolve, - reject - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/suggestionList.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/suggestionList.mjs ***! @@ -27997,6 +26827,7 @@ var _naturalCompare = __webpack_require__(/*! ./naturalCompare.mjs */ "../../../ * Given an invalid input string and a list of valid options, returns a filtered * list of valid options sorted based on their similarity with the input. */ + function suggestionList(input, options) { const optionsByDistance = Object.create(null); const lexicalDistance = new LexicalDistance(input); @@ -28026,6 +26857,7 @@ function suggestionList(input, options) { * * This distance can be useful for detecting typos in input or sorting */ + class LexicalDistance { constructor(input) { this._input = input; @@ -28037,8 +26869,8 @@ class LexicalDistance { if (this._input === option) { return 0; } - const optionLowerCase = option.toLowerCase(); - // Any case change counts as a single edit + const optionLowerCase = option.toLowerCase(); // Any case change counts as a single edit + if (this._inputLowerCase === optionLowerCase) { return 1; } @@ -28068,7 +26900,8 @@ class LexicalDistance { // delete currentRow[j - 1] + 1, // insert - upRow[j - 1] + cost); + upRow[j - 1] + cost // substitute + ); if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { // transposition const doubleDiagonalCell = rows[(i - 2) % 3][j - 2]; @@ -28078,8 +26911,8 @@ class LexicalDistance { smallestCell = currentCell; } currentRow[j] = currentCell; - } - // Early exit, since distance can't go smaller than smallest element of the previous row. + } // Early exit, since distance can't go smaller than smallest element of the previous row. + if (smallestCell > threshold) { return undefined; } @@ -28115,6 +26948,7 @@ var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/g /** * Sometimes a non-error is thrown, wrap it as an Error instance to ensure a consistent Error interface. */ + function toError(thrownValue) { return thrownValue instanceof Error ? thrownValue : new NonErrorThrown(thrownValue); } @@ -28174,6 +27008,25 @@ exports.isNode = isNode; * identify the region of the source from which the AST derived. */ class Location { + /** + * The character offset at which this Node begins. + */ + + /** + * The character offset at which this Node ends. + */ + + /** + * The Token at which this Node begins. + */ + + /** + * The Token at which this Node ends. + */ + + /** + * The Source document the AST represents. + */ constructor(startToken, endToken, source) { this.start = startToken.start; this.end = endToken.end; @@ -28197,14 +27050,45 @@ class Location { */ exports.Location = Location; class Token { - // eslint-disable-next-line max-params + /** + * The kind of Token. + */ + + /** + * The character offset at which this Node begins. + */ + + /** + * The character offset at which this Node ends. + */ + + /** + * The 1-indexed line number on which this Token appears. + */ + + /** + * The 1-indexed column number at which this Token begins. + */ + + /** + * For non-punctuation tokens, represents the interpreted value of the token. + * + * Note: is undefined for punctuation tokens, but typed as string for + * convenience in the parser. + */ + + /** + * Tokens exist as nodes in a double-linked-list amongst all tokens + * including ignored tokens. is always the first node and + * the last. + */ constructor(kind, start, end, line, column, value) { this.kind = kind; this.start = start; this.end = end; this.line = line; - this.column = column; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.column = column; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.value = value; this.prev = null; this.next = null; @@ -28221,6 +27105,10 @@ class Token { }; } } +/** + * The list of all possible AST node types. + */ + /** * @internal */ @@ -28232,16 +27120,8 @@ const QueryDocumentKeys = exports.QueryDocumentKeys = { VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], Variable: ['name'], SelectionSet: ['selections'], - Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', - // Note: Client Controlled Nullability is experimental and may be changed - // or removed in the future. - 'nullabilityAssertion'], + Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'], Argument: ['name', 'value'], - // Note: Client Controlled Nullability is experimental and may be changed - // or removed in the future. - ListNullabilityOperator: ['nullabilityAssertion'], - NonNullAssertion: ['nullabilityAssertion'], - ErrorBoundary: ['nullabilityAssertion'], FragmentSpread: ['name', 'directives'], InlineFragment: ['typeCondition', 'directives', 'selectionSet'], FragmentDefinition: ['name', @@ -28284,10 +27164,13 @@ const kindValues = new Set(Object.keys(QueryDocumentKeys)); /** * @internal */ + function isNode(maybeNode) { const maybeKind = maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.kind; return typeof maybeKind === 'string' && kindValues.has(maybeKind); } +/** Name */ + var OperationTypeNode; (function (OperationTypeNode) { OperationTypeNode['QUERY'] = 'query'; @@ -28320,28 +27203,28 @@ var _characterClasses = __webpack_require__(/*! ./characterClasses.mjs */ "../.. * * @internal */ + function dedentBlockStringLines(lines) { - var _firstNonEmptyLine; + var _firstNonEmptyLine2; let commonIndent = Number.MAX_SAFE_INTEGER; let firstNonEmptyLine = null; let lastNonEmptyLine = -1; for (let i = 0; i < lines.length; ++i) { + var _firstNonEmptyLine; const line = lines[i]; const indent = leadingWhitespace(line); if (indent === line.length) { continue; // skip empty lines } - firstNonEmptyLine ??= i; + firstNonEmptyLine = (_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : i; lastNonEmptyLine = i; if (i !== 0 && indent < commonIndent) { commonIndent = indent; } } - return lines - // Remove common indentation from all lines but first. - .map((line, i) => i === 0 ? line : line.slice(commonIndent)) - // Remove leading and trailing blank lines. - .slice((_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : 0, lastNonEmptyLine + 1); + return lines // Remove common indentation from all lines but first. + .map((line, i) => i === 0 ? line : line.slice(commonIndent)) // Remove leading and trailing blank lines. + .slice((_firstNonEmptyLine2 = firstNonEmptyLine) !== null && _firstNonEmptyLine2 !== void 0 ? _firstNonEmptyLine2 : 0, lastNonEmptyLine + 1); } function leadingWhitespace(str) { let i = 0; @@ -28353,6 +27236,7 @@ function leadingWhitespace(str) { /** * @internal */ + function isPrintableAsBlockString(value) { if (value === '') { return true; // empty string is printable @@ -28378,10 +27262,12 @@ function isPrintableAsBlockString(value) { case 0x000f: return false; // Has non-printable characters + case 0x000d: // \r return false; // Has \r or \r\n which will be replaced as \n + case 10: // \n if (isEmptyLine && !seenNonEmptyLine) { @@ -28392,12 +27278,13 @@ function isPrintableAsBlockString(value) { hasIndent = false; break; case 9: // \t + case 32: // - hasIndent ||= isEmptyLine; + hasIndent || (hasIndent = isEmptyLine); break; default: - hasCommonIndent &&= hasIndent; + hasCommonIndent && (hasCommonIndent = hasIndent); isEmptyLine = false; } } @@ -28416,24 +27303,25 @@ function isPrintableAsBlockString(value) { * * @internal */ + function printBlockString(value, options) { - const escapedValue = value.replaceAll('"""', '\\"""'); - // Expand a block string's raw value into independent lines. + const escapedValue = value.replace(/"""/g, '\\"""'); // Expand a block string's raw value into independent lines. + const lines = escapedValue.split(/\r\n|[\n\r]/g); - const isSingleLine = lines.length === 1; - // If common indentation is found we can fix some of those cases by adding leading new line - const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); - // Trailing triple quotes just looks confusing but doesn't force trailing new line - const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); - // Trailing quote (single or double) or slash forces trailing new line + const isSingleLine = lines.length === 1; // If common indentation is found we can fix some of those cases by adding leading new line + + const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); // Trailing triple quotes just looks confusing but doesn't force trailing new line + + const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); // Trailing quote (single or double) or slash forces trailing new line + const hasTrailingQuote = value.endsWith('"') && !hasTrailingTripleQuotes; const hasTrailingSlash = value.endsWith('\\'); const forceTrailingNewline = hasTrailingQuote || hasTrailingSlash; const printAsMultipleLines = !(options !== null && options !== void 0 && options.minimize) && ( // add leading and trailing new lines only if it improves readability !isSingleLine || value.length > 70 || forceTrailingNewline || forceLeadingNewLine || hasTrailingTripleQuotes); - let result = ''; - // Format a multi-line block quote to account for leading space. + let result = ''; // Format a multi-line block quote to account for leading space. + const skipLeadingNewLine = isSingleLine && (0, _characterClasses.isWhiteSpace)(value.charCodeAt(0)); if (printAsMultipleLines && !skipLeadingNewLine || forceLeadingNewLine) { result += '\n'; @@ -28481,6 +27369,7 @@ function isWhiteSpace(code) { * ``` * @internal */ + function isDigit(code) { return code >= 0x0030 && code <= 0x0039; } @@ -28494,6 +27383,7 @@ function isDigit(code) { * ``` * @internal */ + function isLetter(code) { return code >= 0x0061 && code <= 0x007a || // A-Z @@ -28508,6 +27398,7 @@ function isLetter(code) { * ``` * @internal */ + function isNameStart(code) { return isLetter(code) || code === 0x005f; } @@ -28520,6 +27411,7 @@ function isNameStart(code) { * ``` * @internal */ + function isNameContinue(code) { return isLetter(code) || isDigit(code) || code === 0x005f; } @@ -28543,7 +27435,6 @@ exports.DirectiveLocation = void 0; */ var DirectiveLocation; (function (DirectiveLocation) { - /** Request Definitions */ DirectiveLocation['QUERY'] = 'QUERY'; DirectiveLocation['MUTATION'] = 'MUTATION'; DirectiveLocation['SUBSCRIPTION'] = 'SUBSCRIPTION'; @@ -28552,7 +27443,6 @@ var DirectiveLocation; DirectiveLocation['FRAGMENT_SPREAD'] = 'FRAGMENT_SPREAD'; DirectiveLocation['INLINE_FRAGMENT'] = 'INLINE_FRAGMENT'; DirectiveLocation['VARIABLE_DEFINITION'] = 'VARIABLE_DEFINITION'; - /** Type System Definitions */ DirectiveLocation['SCHEMA'] = 'SCHEMA'; DirectiveLocation['SCALAR'] = 'SCALAR'; DirectiveLocation['OBJECT'] = 'OBJECT'; @@ -28566,6 +27456,12 @@ var DirectiveLocation; DirectiveLocation['INPUT_FIELD_DEFINITION'] = 'INPUT_FIELD_DEFINITION'; })(DirectiveLocation || (exports.DirectiveLocation = DirectiveLocation = {})); +/** + * The enum type representing the directive location values. + * + * @deprecated Please use `DirectiveLocation`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/index.mjs": @@ -28645,6 +27541,12 @@ Object.defineProperty(exports, "getLocation", ({ return _location.getLocation; } })); +Object.defineProperty(exports, "getVisitFn", ({ + enumerable: true, + get: function () { + return _visitor.getVisitFn; + } +})); Object.defineProperty(exports, "isConstValueNode", ({ enumerable: true, get: function () { @@ -28663,12 +27565,6 @@ Object.defineProperty(exports, "isExecutableDefinitionNode", ({ return _predicates.isExecutableDefinitionNode; } })); -Object.defineProperty(exports, "isNullabilityAssertionNode", ({ - enumerable: true, - get: function () { - return _predicates.isNullabilityAssertionNode; - } -})); Object.defineProperty(exports, "isSelectionNode", ({ enumerable: true, get: function () { @@ -28797,24 +27693,16 @@ exports.Kind = void 0; */ var Kind; (function (Kind) { - /** Name */ Kind['NAME'] = 'Name'; - /** Document */ Kind['DOCUMENT'] = 'Document'; Kind['OPERATION_DEFINITION'] = 'OperationDefinition'; Kind['VARIABLE_DEFINITION'] = 'VariableDefinition'; Kind['SELECTION_SET'] = 'SelectionSet'; Kind['FIELD'] = 'Field'; Kind['ARGUMENT'] = 'Argument'; - /** Nullability Modifiers */ - Kind['LIST_NULLABILITY_OPERATOR'] = 'ListNullabilityOperator'; - Kind['NON_NULL_ASSERTION'] = 'NonNullAssertion'; - Kind['ERROR_BOUNDARY'] = 'ErrorBoundary'; - /** Fragments */ Kind['FRAGMENT_SPREAD'] = 'FragmentSpread'; Kind['INLINE_FRAGMENT'] = 'InlineFragment'; Kind['FRAGMENT_DEFINITION'] = 'FragmentDefinition'; - /** Values */ Kind['VARIABLE'] = 'Variable'; Kind['INT'] = 'IntValue'; Kind['FLOAT'] = 'FloatValue'; @@ -28825,16 +27713,12 @@ var Kind; Kind['LIST'] = 'ListValue'; Kind['OBJECT'] = 'ObjectValue'; Kind['OBJECT_FIELD'] = 'ObjectField'; - /** Directives */ Kind['DIRECTIVE'] = 'Directive'; - /** Types */ Kind['NAMED_TYPE'] = 'NamedType'; Kind['LIST_TYPE'] = 'ListType'; Kind['NON_NULL_TYPE'] = 'NonNullType'; - /** Type System Definitions */ Kind['SCHEMA_DEFINITION'] = 'SchemaDefinition'; Kind['OPERATION_TYPE_DEFINITION'] = 'OperationTypeDefinition'; - /** Type Definitions */ Kind['SCALAR_TYPE_DEFINITION'] = 'ScalarTypeDefinition'; Kind['OBJECT_TYPE_DEFINITION'] = 'ObjectTypeDefinition'; Kind['FIELD_DEFINITION'] = 'FieldDefinition'; @@ -28844,11 +27728,8 @@ var Kind; Kind['ENUM_TYPE_DEFINITION'] = 'EnumTypeDefinition'; Kind['ENUM_VALUE_DEFINITION'] = 'EnumValueDefinition'; Kind['INPUT_OBJECT_TYPE_DEFINITION'] = 'InputObjectTypeDefinition'; - /** Directive Definitions */ Kind['DIRECTIVE_DEFINITION'] = 'DirectiveDefinition'; - /** Type System Extensions */ Kind['SCHEMA_EXTENSION'] = 'SchemaExtension'; - /** Type Extensions */ Kind['SCALAR_TYPE_EXTENSION'] = 'ScalarTypeExtension'; Kind['OBJECT_TYPE_EXTENSION'] = 'ObjectTypeExtension'; Kind['INTERFACE_TYPE_EXTENSION'] = 'InterfaceTypeExtension'; @@ -28857,6 +27738,12 @@ var Kind; Kind['INPUT_OBJECT_TYPE_EXTENSION'] = 'InputObjectTypeExtension'; })(Kind || (exports.Kind = Kind = {})); +/** + * The enum type representing the possible kind values of AST nodes. + * + * @deprecated Please use `Kind`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/lexer.mjs": @@ -28885,7 +27772,23 @@ var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modul * EOF, after which the lexer will repeatedly return the same EOF token * whenever called. */ + class Lexer { + /** + * The previously focused non-ignored token. + */ + + /** + * The currently focused non-ignored token. + */ + + /** + * The (1-indexed) line containing the current token. + */ + + /** + * The character offset at which the current line begins. + */ constructor(source) { const startOfFileToken = new _ast.Token(_tokenKind.TokenKind.SOF, 0, 0, 0, 0); this.source = source; @@ -28900,6 +27803,7 @@ class Lexer { /** * Advances the token stream to the next non-ignored token. */ + advance() { this.lastToken = this.token; const token = this.token = this.lookahead(); @@ -28909,6 +27813,7 @@ class Lexer { * Looks ahead and returns the next non-ignored token, but does not change * the state of Lexer. */ + lookahead() { let token = this.token; if (token.kind !== _tokenKind.TokenKind.EOF) { @@ -28917,10 +27822,10 @@ class Lexer { token = token.next; } else { // Read the next token and form a link in the token linked-list. - const nextToken = readNextToken(this, token.end); - // @ts-expect-error next is only mutable during parsing. - token.next = nextToken; - // @ts-expect-error prev is only mutable during parsing. + const nextToken = readNextToken(this, token.end); // @ts-expect-error next is only mutable during parsing. + + token.next = nextToken; // @ts-expect-error prev is only mutable during parsing. + nextToken.prev = token; token = nextToken; } @@ -28934,7 +27839,7 @@ class Lexer { */ exports.Lexer = Lexer; function isPunctuatorTokenKind(kind) { - return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.QUESTION_MARK || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; + return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; } /** * A Unicode scalar value is any Unicode code point except surrogate code @@ -28944,6 +27849,7 @@ function isPunctuatorTokenKind(kind) { * SourceCharacter :: * - "Any Unicode scalar value" */ + function isUnicodeScalarValue(code) { return code >= 0x0000 && code <= 0xd7ff || code >= 0xe000 && code <= 0x10ffff; } @@ -28955,6 +27861,7 @@ function isUnicodeScalarValue(code) { * encodes a supplementary code point (above U+FFFF), but unpaired surrogate * code points are not valid source characters. */ + function isSupplementaryCodePoint(body, location) { return isLeadingSurrogate(body.charCodeAt(location)) && isTrailingSurrogate(body.charCodeAt(location + 1)); } @@ -28971,6 +27878,7 @@ function isTrailingSurrogate(code) { * Printable ASCII is printed quoted, while other points are printed in Unicode * code point form (ie. U+1234). */ + function printCodePointAt(lexer, location) { const code = lexer.source.body.codePointAt(location); if (code === undefined) { @@ -28979,13 +27887,14 @@ function printCodePointAt(lexer, location) { // Printable ASCII const char = String.fromCodePoint(code); return char === '"' ? "'\"'" : `"${char}"`; - } - // Unicode code point + } // Unicode code point + return 'U+' + code.toString(16).toUpperCase().padStart(4, '0'); } /** * Create a token with line and column location information. */ + function createToken(lexer, kind, start, end, value) { const line = lexer.line; const col = 1 + start - lexer.lineStart; @@ -28998,13 +27907,14 @@ function createToken(lexer, kind, start, end, value) { * punctuators immediately or calls the appropriate helper function for more * complicated tokens. */ + function readNextToken(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start; while (position < bodyLength) { - const code = body.charCodeAt(position); - // SourceCharacter + const code = body.charCodeAt(position); // SourceCharacter + switch (code) { // Ignored :: // - UnicodeBOM @@ -29021,8 +27931,11 @@ function readNextToken(lexer, start) { // // Comma :: , case 0xfeff: // + case 0x0009: // \t + case 0x0020: // + case 0x002c: // , ++position; @@ -29031,6 +27944,7 @@ function readNextToken(lexer, start) { // - "New Line (U+000A)" // - "Carriage Return (U+000D)" [lookahead != "New Line (U+000A)"] // - "Carriage Return (U+000D)" "New Line (U+000A)" + case 0x000a: // \n ++position; @@ -29048,6 +27962,7 @@ function readNextToken(lexer, start) { lexer.lineStart = position; continue; // Comment + case 0x0023: // # return readComment(lexer, position); @@ -29059,6 +27974,7 @@ function readNextToken(lexer, start) { // - StringValue // // Punctuator :: one of ! $ & ( ) ... : = @ [ ] { | } + case 0x0021: // ! return createToken(lexer, _tokenKind.TokenKind.BANG, position, position + 1); @@ -29104,22 +28020,20 @@ function readNextToken(lexer, start) { case 0x007d: // } return createToken(lexer, _tokenKind.TokenKind.BRACE_R, position, position + 1); - case 0x003f: - // ? - return createToken(lexer, _tokenKind.TokenKind.QUESTION_MARK, position, position + 1); // StringValue + case 0x0022: // " if (body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { return readBlockString(lexer, position); } return readString(lexer, position); - } - // IntValue | FloatValue (Digit | -) + } // IntValue | FloatValue (Digit | -) + if ((0, _characterClasses.isDigit)(code) || code === 0x002d) { return readNumber(lexer, position, code); - } - // Name + } // Name + if ((0, _characterClasses.isNameStart)(code)) { return readName(lexer, position); } @@ -29136,17 +28050,18 @@ function readNextToken(lexer, start) { * CommentChar :: SourceCharacter but not LineTerminator * ``` */ + function readComment(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start + 1; while (position < bodyLength) { - const code = body.charCodeAt(position); - // LineTerminator (\n | \r) + const code = body.charCodeAt(position); // LineTerminator (\n | \r) + if (code === 0x000a || code === 0x000d) { break; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29186,16 +28101,17 @@ function readComment(lexer, start) { * Sign :: one of + - * ``` */ + function readNumber(lexer, start, firstCode) { const body = lexer.source.body; let position = start; let code = firstCode; - let isFloat = false; - // NegativeSign (-) + let isFloat = false; // NegativeSign (-) + if (code === 0x002d) { code = body.charCodeAt(++position); - } - // Zero (0) + } // Zero (0) + if (code === 0x0030) { code = body.charCodeAt(++position); if ((0, _characterClasses.isDigit)(code)) { @@ -29204,26 +28120,26 @@ function readNumber(lexer, start, firstCode) { } else { position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // Full stop (.) + } // Full stop (.) + if (code === 0x002e) { isFloat = true; code = body.charCodeAt(++position); position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // E e + } // E e + if (code === 0x0045 || code === 0x0065) { isFloat = true; - code = body.charCodeAt(++position); - // + - + code = body.charCodeAt(++position); // + - + if (code === 0x002b || code === 0x002d) { code = body.charCodeAt(++position); } position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // Numbers cannot be followed by . or NameStart + } // Numbers cannot be followed by . or NameStart + if (code === 0x002e || (0, _characterClasses.isNameStart)(code)) { throw (0, _syntaxError.syntaxError)(lexer.source, position, `Invalid number, expected digit but got: ${printCodePointAt(lexer, position)}.`); } @@ -29232,12 +28148,14 @@ function readNumber(lexer, start, firstCode) { /** * Returns the new position in the source after reading one or more digits. */ + function readDigits(lexer, start, firstCode) { if (!(0, _characterClasses.isDigit)(firstCode)) { throw (0, _syntaxError.syntaxError)(lexer.source, start, `Invalid number, expected digit but got: ${printCodePointAt(lexer, start)}.`); } const body = lexer.source.body; let position = start + 1; // +1 to skip first firstCode + while ((0, _characterClasses.isDigit)(body.charCodeAt(position))) { ++position; } @@ -29263,6 +28181,7 @@ function readDigits(lexer, start, firstCode) { * EscapedCharacter :: one of `"` `\` `/` `b` `f` `n` `r` `t` * ``` */ + function readString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29270,13 +28189,13 @@ function readString(lexer, start) { let chunkStart = position; let value = ''; while (position < bodyLength) { - const code = body.charCodeAt(position); - // Closing Quote (") + const code = body.charCodeAt(position); // Closing Quote (") + if (code === 0x0022) { value += body.slice(chunkStart, position); return createToken(lexer, _tokenKind.TokenKind.STRING, start, position + 1, value); - } - // Escape Sequence (\) + } // Escape Sequence (\) + if (code === 0x005c) { value += body.slice(chunkStart, position); const escape = body.charCodeAt(position + 1) === 0x0075 // u @@ -29286,12 +28205,12 @@ function readString(lexer, start) { position += escape.size; chunkStart = position; continue; - } - // LineTerminator (\n | \r) + } // LineTerminator (\n | \r) + if (code === 0x000a || code === 0x000d) { break; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29301,15 +28220,16 @@ function readString(lexer, start) { } } throw (0, _syntaxError.syntaxError)(lexer.source, position, 'Unterminated string.'); -} +} // The string value and lexed size of an escape sequence. + function readEscapedUnicodeVariableWidth(lexer, position) { const body = lexer.source.body; let point = 0; - let size = 3; - // Cannot be larger than 12 chars (\u{00000000}). + let size = 3; // Cannot be larger than 12 chars (\u{00000000}). + while (size < 12) { - const code = body.charCodeAt(position + size++); - // Closing Brace (}) + const code = body.charCodeAt(position + size++); // Closing Brace (}) + if (code === 0x007d) { // Must be at least 5 chars (\u{0}) and encode a Unicode scalar value. if (size < 5 || !isUnicodeScalarValue(point)) { @@ -29319,8 +28239,8 @@ function readEscapedUnicodeVariableWidth(lexer, position) { value: String.fromCodePoint(point), size }; - } - // Append this hex digit to the code point. + } // Append this hex digit to the code point. + point = point << 4 | readHexDigit(code); if (point < 0) { break; @@ -29336,9 +28256,9 @@ function readEscapedUnicodeFixedWidth(lexer, position) { value: String.fromCodePoint(code), size: 6 }; - } - // GraphQL allows JSON-style surrogate pair escape sequences, but only when + } // GraphQL allows JSON-style surrogate pair escape sequences, but only when // a valid pair is formed. + if (isLeadingSurrogate(code)) { // \u if (body.charCodeAt(position + 6) === 0x005c && body.charCodeAt(position + 7) === 0x0075) { @@ -29366,6 +28286,7 @@ function readEscapedUnicodeFixedWidth(lexer, position) { * * Returns a negative number if any char was not a valid hexadecimal digit. */ + function read16BitHexCode(body, position) { // readHexDigit() returns -1 on error. ORing a negative value with any other // value always produces a negative value. @@ -29385,6 +28306,7 @@ function read16BitHexCode(body, position) { * - `A` `B` `C` `D` `E` `F` * - `a` `b` `c` `d` `e` `f` */ + function readHexDigit(code) { return code >= 0x0030 && code <= 0x0039 // 0-9 ? code - 0x0030 : code >= 0x0041 && code <= 0x0046 // A-F @@ -29403,6 +28325,7 @@ function readHexDigit(code) { * | `r` | U+000D | carriage return | * | `t` | U+0009 | horizontal tab | */ + function readEscapedCharacter(lexer, position) { const body = lexer.source.body; const code = body.charCodeAt(position + 1); @@ -29470,6 +28393,7 @@ function readEscapedCharacter(lexer, position) { * - `\"""` * ``` */ + function readBlockString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29479,8 +28403,8 @@ function readBlockString(lexer, start) { let currentLine = ''; const blockLines = []; while (position < bodyLength) { - const code = body.charCodeAt(position); - // Closing Triple-Quote (""") + const code = body.charCodeAt(position); // Closing Triple-Quote (""") + if (code === 0x0022 && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -29490,15 +28414,16 @@ function readBlockString(lexer, start) { lexer.line += blockLines.length - 1; lexer.lineStart = lineStart; return token; - } - // Escaped Triple-Quote (\""") + } // Escaped Triple-Quote (\""") + if (code === 0x005c && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022 && body.charCodeAt(position + 3) === 0x0022) { currentLine += body.slice(chunkStart, position); chunkStart = position + 1; // skip only slash + position += 4; continue; - } - // LineTerminator + } // LineTerminator + if (code === 0x000a || code === 0x000d) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -29511,8 +28436,8 @@ function readBlockString(lexer, start) { chunkStart = position; lineStart = position; continue; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29531,6 +28456,7 @@ function readBlockString(lexer, start) { * - NameStart NameContinue* [lookahead != NameContinue] * ``` */ + function readName(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29562,6 +28488,10 @@ Object.defineProperty(exports, "__esModule", ({ exports.getLocation = getLocation; var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); const LineRegExp = /\r\n|[\n\r]/g; +/** + * Represents a location in a Source. + */ + /** * Takes a Source and a UTF-8 character offset, and returns the corresponding * line and column as a SourceLocation. @@ -29608,6 +28538,10 @@ var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graph var _lexer = __webpack_require__(/*! ./lexer.mjs */ "../../../node_modules/graphql/language/lexer.mjs"); var _source = __webpack_require__(/*! ./source.mjs */ "../../../node_modules/graphql/language/source.mjs"); var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modules/graphql/language/tokenKind.mjs"); +/** + * Configuration options to control parser behavior + */ + /** * Given a GraphQL source, parses it into a Document. * Throws GraphQLError if a syntax error is encountered. @@ -29626,6 +28560,7 @@ function parse(source, options) { * * Consider providing the results to the utility function: valueFromAST(). */ + function parseValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29637,6 +28572,7 @@ function parseValue(source, options) { * Similar to parseValue(), but raises a parse error if it encounters a * variable. The return type will be a constant value. */ + function parseConstValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29654,6 +28590,7 @@ function parseConstValue(source, options) { * * Consider providing the results to the utility function: typeFromAST(). */ + function parseType(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29672,6 +28609,7 @@ function parseType(source, options) { * * @internal */ + class Parser { constructor(source, options = {}) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); @@ -29682,17 +28620,19 @@ class Parser { /** * Converts a name lex token into a name parse node. */ + parseName() { const token = this.expectToken(_tokenKind.TokenKind.NAME); return this.node(token, { kind: _kinds.Kind.NAME, value: token.value }); - } - // Implements the parsing rules in the Document section. + } // Implements the parsing rules in the Document section. + /** * Document : Definition+ */ + parseDocument() { return this.node(this._lexer.token, { kind: _kinds.Kind.DOCUMENT, @@ -29722,11 +28662,12 @@ class Parser { * - EnumTypeDefinition * - InputObjectTypeDefinition */ + parseDefinition() { if (this.peek(_tokenKind.TokenKind.BRACE_L)) { return this.parseOperationDefinition(); - } - // Many definitions begin with a description and require a lookahead. + } // Many definitions begin with a description and require a lookahead. + const hasDescription = this.peekDescription(); const keywordToken = hasDescription ? this._lexer.lookahead() : this._lexer.token; if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -29763,13 +28704,14 @@ class Parser { } } throw this.unexpected(keywordToken); - } - // Implements the parsing rules in the Operations section. + } // Implements the parsing rules in the Operations section. + /** * OperationDefinition : * - SelectionSet * - OperationType Name? VariableDefinitions? Directives? SelectionSet */ + parseOperationDefinition() { const start = this._lexer.token; if (this.peek(_tokenKind.TokenKind.BRACE_L)) { @@ -29799,6 +28741,7 @@ class Parser { /** * OperationType : one of query mutation subscription */ + parseOperationType() { const operationToken = this.expectToken(_tokenKind.TokenKind.NAME); switch (operationToken.value) { @@ -29814,12 +28757,14 @@ class Parser { /** * VariableDefinitions : ( VariableDefinition+ ) */ + parseVariableDefinitions() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseVariableDefinition, _tokenKind.TokenKind.PAREN_R); } /** * VariableDefinition : Variable : Type DefaultValue? Directives[Const]? */ + parseVariableDefinition() { return this.node(this._lexer.token, { kind: _kinds.Kind.VARIABLE_DEFINITION, @@ -29832,6 +28777,7 @@ class Parser { /** * Variable : $ Name */ + parseVariable() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.DOLLAR); @@ -29845,6 +28791,7 @@ class Parser { * SelectionSet : { Selection+ } * ``` */ + parseSelectionSet() { return this.node(this._lexer.token, { kind: _kinds.Kind.SELECTION_SET, @@ -29857,6 +28804,7 @@ class Parser { * - FragmentSpread * - InlineFragment */ + parseSelection() { return this.peek(_tokenKind.TokenKind.SPREAD) ? this.parseFragment() : this.parseField(); } @@ -29865,6 +28813,7 @@ class Parser { * * Alias : Name : */ + parseField() { const start = this._lexer.token; const nameOrAlias = this.parseName(); @@ -29881,47 +28830,22 @@ class Parser { alias, name, arguments: this.parseArguments(false), - // Experimental support for Client Controlled Nullability changes - // the grammar of Field: - nullabilityAssertion: this.parseNullabilityAssertion(), directives: this.parseDirectives(false), selectionSet: this.peek(_tokenKind.TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined }); } - // TODO: add grammar comment after it finalizes - parseNullabilityAssertion() { - // Note: Client Controlled Nullability is experimental and may be changed or - // removed in the future. - if (this._options.experimentalClientControlledNullability !== true) { - return undefined; - } - const start = this._lexer.token; - let nullabilityAssertion; - if (this.expectOptionalToken(_tokenKind.TokenKind.BRACKET_L)) { - const innerModifier = this.parseNullabilityAssertion(); - this.expectToken(_tokenKind.TokenKind.BRACKET_R); - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.LIST_NULLABILITY_OPERATOR, - nullabilityAssertion: innerModifier - }); - } - if (this.expectOptionalToken(_tokenKind.TokenKind.BANG)) { - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.NON_NULL_ASSERTION, - nullabilityAssertion - }); - } else if (this.expectOptionalToken(_tokenKind.TokenKind.QUESTION_MARK)) { - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.ERROR_BOUNDARY, - nullabilityAssertion - }); - } - return nullabilityAssertion; - } + /** + * Arguments[Const] : ( Argument[?Const]+ ) + */ + parseArguments(isConst) { const item = isConst ? this.parseConstArgument : this.parseArgument; return this.optionalMany(_tokenKind.TokenKind.PAREN_L, item, _tokenKind.TokenKind.PAREN_R); } + /** + * Argument[Const] : Name : Value[?Const] + */ + parseArgument(isConst = false) { const start = this._lexer.token; const name = this.parseName(); @@ -29934,8 +28858,8 @@ class Parser { } parseConstArgument() { return this.parseArgument(true); - } - // Implements the parsing rules in the Fragments section. + } // Implements the parsing rules in the Fragments section. + /** * Corresponds to both FragmentSpread and InlineFragment in the spec. * @@ -29943,6 +28867,7 @@ class Parser { * * InlineFragment : ... TypeCondition? Directives? SelectionSet */ + parseFragment() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.SPREAD); @@ -29967,12 +28892,13 @@ class Parser { * * TypeCondition : NamedType */ + parseFragmentDefinition() { const start = this._lexer.token; - this.expectKeyword('fragment'); - // Legacy support for defining variables within fragments changes + this.expectKeyword('fragment'); // Legacy support for defining variables within fragments changes // the grammar of FragmentDefinition: // - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet + if (this._options.allowLegacyFragmentVariables === true) { return this.node(start, { kind: _kinds.Kind.FRAGMENT_DEFINITION, @@ -29994,12 +28920,33 @@ class Parser { /** * FragmentName : Name but not `on` */ + parseFragmentName() { if (this._lexer.token.value === 'on') { throw this.unexpected(); } return this.parseName(); - } + } // Implements the parsing rules in the Values section. + + /** + * Value[Const] : + * - [~Const] Variable + * - IntValue + * - FloatValue + * - StringValue + * - BooleanValue + * - NullValue + * - EnumValue + * - ListValue[?Const] + * - ObjectValue[?Const] + * + * BooleanValue : one of `true` `false` + * + * NullValue : `null` + * + * EnumValue : Name but not `true`, `false` or `null` + */ + parseValueLiteral(isConst) { const token = this._lexer.token; switch (token.kind) { @@ -30072,6 +29019,12 @@ class Parser { block: token.kind === _tokenKind.TokenKind.BLOCK_STRING }); } + /** + * ListValue[Const] : + * - [ ] + * - [ Value[?Const]+ ] + */ + parseList(isConst) { const item = () => this.parseValueLiteral(isConst); return this.node(this._lexer.token, { @@ -30079,6 +29032,14 @@ class Parser { values: this.any(_tokenKind.TokenKind.BRACKET_L, item, _tokenKind.TokenKind.BRACKET_R) }); } + /** + * ``` + * ObjectValue[Const] : + * - { } + * - { ObjectField[?Const]+ } + * ``` + */ + parseObject(isConst) { const item = () => this.parseObjectField(isConst); return this.node(this._lexer.token, { @@ -30086,6 +29047,10 @@ class Parser { fields: this.any(_tokenKind.TokenKind.BRACE_L, item, _tokenKind.TokenKind.BRACE_R) }); } + /** + * ObjectField[Const] : Name : Value[?Const] + */ + parseObjectField(isConst) { const start = this._lexer.token; const name = this.parseName(); @@ -30095,7 +29060,12 @@ class Parser { name, value: this.parseValueLiteral(isConst) }); - } + } // Implements the parsing rules in the Directives section. + + /** + * Directives[Const] : Directive[?Const]+ + */ + parseDirectives(isConst) { const directives = []; while (this.peek(_tokenKind.TokenKind.AT)) { @@ -30106,6 +29076,12 @@ class Parser { parseConstDirectives() { return this.parseDirectives(true); } + /** + * ``` + * Directive[Const] : @ Name Arguments[?Const]? + * ``` + */ + parseDirective(isConst) { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.AT); @@ -30114,14 +29090,15 @@ class Parser { name: this.parseName(), arguments: this.parseArguments(isConst) }); - } - // Implements the parsing rules in the Types section. + } // Implements the parsing rules in the Types section. + /** * Type : * - NamedType * - ListType * - NonNullType */ + parseTypeReference() { const start = this._lexer.token; let type; @@ -30146,19 +29123,21 @@ class Parser { /** * NamedType : Name */ + parseNamedType() { return this.node(this._lexer.token, { kind: _kinds.Kind.NAMED_TYPE, name: this.parseName() }); - } - // Implements the parsing rules in the Type Definition section. + } // Implements the parsing rules in the Type Definition section. + peekDescription() { return this.peek(_tokenKind.TokenKind.STRING) || this.peek(_tokenKind.TokenKind.BLOCK_STRING); } /** * Description : StringValue */ + parseDescription() { if (this.peekDescription()) { return this.parseStringLiteral(); @@ -30169,6 +29148,7 @@ class Parser { * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ } * ``` */ + parseSchemaDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30185,6 +29165,7 @@ class Parser { /** * OperationTypeDefinition : OperationType : NamedType */ + parseOperationTypeDefinition() { const start = this._lexer.token; const operation = this.parseOperationType(); @@ -30199,6 +29180,7 @@ class Parser { /** * ScalarTypeDefinition : Description? scalar Name Directives[Const]? */ + parseScalarTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30217,6 +29199,7 @@ class Parser { * Description? * type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition? */ + parseObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30239,6 +29222,7 @@ class Parser { * - implements `&`? NamedType * - ImplementsInterfaces & NamedType */ + parseImplementsInterfaces() { return this.expectOptionalKeyword('implements') ? this.delimitedMany(_tokenKind.TokenKind.AMP, this.parseNamedType) : []; } @@ -30247,6 +29231,7 @@ class Parser { * FieldsDefinition : { FieldDefinition+ } * ``` */ + parseFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseFieldDefinition, _tokenKind.TokenKind.BRACE_R); } @@ -30254,6 +29239,7 @@ class Parser { * FieldDefinition : * - Description? Name ArgumentsDefinition? : Type Directives[Const]? */ + parseFieldDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30274,6 +29260,7 @@ class Parser { /** * ArgumentsDefinition : ( InputValueDefinition+ ) */ + parseArgumentDefs() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseInputValueDef, _tokenKind.TokenKind.PAREN_R); } @@ -30281,6 +29268,7 @@ class Parser { * InputValueDefinition : * - Description? Name : Type DefaultValue? Directives[Const]? */ + parseInputValueDef() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30305,6 +29293,7 @@ class Parser { * InterfaceTypeDefinition : * - Description? interface Name Directives[Const]? FieldsDefinition? */ + parseInterfaceTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30326,6 +29315,7 @@ class Parser { * UnionTypeDefinition : * - Description? union Name Directives[Const]? UnionMemberTypes? */ + parseUnionTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30346,6 +29336,7 @@ class Parser { * - = `|`? NamedType * - UnionMemberTypes | NamedType */ + parseUnionMemberTypes() { return this.expectOptionalToken(_tokenKind.TokenKind.EQUALS) ? this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseNamedType) : []; } @@ -30353,6 +29344,7 @@ class Parser { * EnumTypeDefinition : * - Description? enum Name Directives[Const]? EnumValuesDefinition? */ + parseEnumTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30373,12 +29365,14 @@ class Parser { * EnumValuesDefinition : { EnumValueDefinition+ } * ``` */ + parseEnumValuesDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseEnumValueDefinition, _tokenKind.TokenKind.BRACE_R); } /** * EnumValueDefinition : Description? EnumValue Directives[Const]? */ + parseEnumValueDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30394,6 +29388,7 @@ class Parser { /** * EnumValue : Name but not `true`, `false` or `null` */ + parseEnumValueName() { if (this._lexer.token.value === 'true' || this._lexer.token.value === 'false' || this._lexer.token.value === 'null') { throw (0, _syntaxError.syntaxError)(this._lexer.source, this._lexer.token.start, `${getTokenDesc(this._lexer.token)} is reserved and cannot be used for an enum value.`); @@ -30404,6 +29399,7 @@ class Parser { * InputObjectTypeDefinition : * - Description? input Name Directives[Const]? InputFieldsDefinition? */ + parseInputObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30424,6 +29420,7 @@ class Parser { * InputFieldsDefinition : { InputValueDefinition+ } * ``` */ + parseInputFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseInputValueDef, _tokenKind.TokenKind.BRACE_R); } @@ -30440,6 +29437,7 @@ class Parser { * - EnumTypeExtension * - InputObjectTypeDefinition */ + parseTypeSystemExtension() { const keywordToken = this._lexer.lookahead(); if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -30469,6 +29467,7 @@ class Parser { * - extend schema Directives[Const] * ``` */ + parseSchemaExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30488,6 +29487,7 @@ class Parser { * ScalarTypeExtension : * - extend scalar Name Directives[Const] */ + parseScalarTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30509,6 +29509,7 @@ class Parser { * - extend type Name ImplementsInterfaces? Directives[Const] * - extend type Name ImplementsInterfaces */ + parseObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30534,6 +29535,7 @@ class Parser { * - extend interface Name ImplementsInterfaces? Directives[Const] * - extend interface Name ImplementsInterfaces */ + parseInterfaceTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30558,6 +29560,7 @@ class Parser { * - extend union Name Directives[Const]? UnionMemberTypes * - extend union Name Directives[Const] */ + parseUnionTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30580,6 +29583,7 @@ class Parser { * - extend enum Name Directives[Const]? EnumValuesDefinition * - extend enum Name Directives[Const] */ + parseEnumTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30602,6 +29606,7 @@ class Parser { * - extend input Name Directives[Const]? InputFieldsDefinition * - extend input Name Directives[Const] */ + parseInputObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30625,6 +29630,7 @@ class Parser { * - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations * ``` */ + parseDirectiveDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30649,6 +29655,7 @@ class Parser { * - `|`? DirectiveLocation * - DirectiveLocations | DirectiveLocation */ + parseDirectiveLocations() { return this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseDirectiveLocation); } @@ -30679,20 +29686,22 @@ class Parser { * `INPUT_OBJECT` * `INPUT_FIELD_DEFINITION` */ + parseDirectiveLocation() { const start = this._lexer.token; const name = this.parseName(); - if (Object.hasOwn(_directiveLocation.DirectiveLocation, name.value)) { + if (Object.prototype.hasOwnProperty.call(_directiveLocation.DirectiveLocation, name.value)) { return name; } throw this.unexpected(start); - } - // Core parsing utility functions + } // Core parsing utility functions + /** * Returns a node that, if configured to do so, sets a "loc" field as a * location object, used to identify the place in the source that created a * given parsed object. */ + node(startToken, node) { if (this._options.noLocation !== true) { node.loc = new _ast.Location(startToken, this._lexer.lastToken, this._lexer.source); @@ -30702,6 +29711,7 @@ class Parser { /** * Determines if the next token is of a given kind */ + peek(kind) { return this._lexer.token.kind === kind; } @@ -30709,6 +29719,7 @@ class Parser { * If the next token is of the given kind, return that token after advancing the lexer. * Otherwise, do not change the parser state and throw an error. */ + expectToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -30721,6 +29732,7 @@ class Parser { * If the next token is of the given kind, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ + expectOptionalToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -30733,6 +29745,7 @@ class Parser { * If the next token is a given keyword, advance the lexer. * Otherwise, do not change the parser state and throw an error. */ + expectKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -30745,6 +29758,7 @@ class Parser { * If the next token is a given keyword, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ + expectOptionalKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -30756,6 +29770,7 @@ class Parser { /** * Helper function for creating an error when an unexpected lexed token is encountered. */ + unexpected(atToken) { const token = atToken !== null && atToken !== void 0 ? atToken : this._lexer.token; return (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Unexpected ${getTokenDesc(token)}.`); @@ -30765,6 +29780,7 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + any(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -30779,6 +29795,7 @@ class Parser { * that begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + optionalMany(openKind, parseFn, closeKind) { if (this.expectOptionalToken(openKind)) { const nodes = []; @@ -30794,6 +29811,7 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + many(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -30807,6 +29825,7 @@ class Parser { * This list may begin with a lex token of delimiterKind followed by items separated by lex tokens of tokenKind. * Advances the parser to the next lex token after last item in the list. */ + delimitedMany(delimiterKind, parseFn) { this.expectOptionalToken(delimiterKind); const nodes = []; @@ -30823,7 +29842,7 @@ class Parser { if (maxTokens !== undefined && token.kind !== _tokenKind.TokenKind.EOF) { ++this._tokenCounter; if (this._tokenCounter > maxTokens) { - throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more than ${maxTokens} tokens. Parsing aborted.`); + throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more that ${maxTokens} tokens. Parsing aborted.`); } } } @@ -30839,6 +29858,7 @@ function getTokenDesc(token) { /** * A helper function to describe a token kind as a string for debugging. */ + function getTokenKindDesc(kind) { return (0, _lexer.isPunctuatorTokenKind)(kind) ? `"${kind}"` : kind; } @@ -30859,7 +29879,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.isConstValueNode = isConstValueNode; exports.isDefinitionNode = isDefinitionNode; exports.isExecutableDefinitionNode = isExecutableDefinitionNode; -exports.isNullabilityAssertionNode = isNullabilityAssertionNode; exports.isSelectionNode = isSelectionNode; exports.isTypeDefinitionNode = isTypeDefinitionNode; exports.isTypeExtensionNode = isTypeExtensionNode; @@ -30877,9 +29896,6 @@ function isExecutableDefinitionNode(node) { function isSelectionNode(node) { return node.kind === _kinds.Kind.FIELD || node.kind === _kinds.Kind.FRAGMENT_SPREAD || node.kind === _kinds.Kind.INLINE_FRAGMENT; } -function isNullabilityAssertionNode(node) { - return node.kind === _kinds.Kind.LIST_NULLABILITY_OPERATOR || node.kind === _kinds.Kind.NON_NULL_ASSERTION || node.kind === _kinds.Kind.ERROR_BOUNDARY; -} function isValueNode(node) { return node.kind === _kinds.Kind.VARIABLE || node.kind === _kinds.Kind.INT || node.kind === _kinds.Kind.FLOAT || node.kind === _kinds.Kind.STRING || node.kind === _kinds.Kind.BOOLEAN || node.kind === _kinds.Kind.NULL || node.kind === _kinds.Kind.ENUM || node.kind === _kinds.Kind.LIST || node.kind === _kinds.Kind.OBJECT; } @@ -30927,6 +29943,7 @@ function printLocation(location) { /** * Render a helpful description of the location in the GraphQL Source document. */ + function printSourceLocation(source, sourceLocation) { const firstLineColumnOffset = source.locationOffset.column - 1; const body = ''.padStart(firstLineColumnOffset) + source.body; @@ -30937,8 +29954,8 @@ function printSourceLocation(source, sourceLocation) { const columnNum = sourceLocation.column + columnOffset; const locationStr = `${source.name}:${lineNum}:${columnNum}\n`; const lines = body.split(/\r\n|[\n\r]/g); - const locationLine = lines[lineIndex]; - // Special case for minified documents + const locationLine = lines[lineIndex]; // Special case for minified documents + if (locationLine.length > 120) { const subLineIndex = Math.floor(columnNum / 80); const subLineColumnNum = columnNum % 80; @@ -30978,14 +29995,24 @@ exports.printString = printString; */ function printString(str) { return `"${str.replace(escapedRegExp, escapedReplacer)}"`; -} -// eslint-disable-next-line no-control-regex +} // eslint-disable-next-line no-control-regex + const escapedRegExp = /[\x00-\x1f\x22\x5c\x7f-\x9f]/g; function escapedReplacer(str) { return escapeSequences[str.charCodeAt(0)]; -} -// prettier-ignore -const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; +} // prettier-ignore + +const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 2F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 3F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 4F +'', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', +// 5F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 6F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; /***/ }), @@ -31008,6 +30035,7 @@ var _visitor = __webpack_require__(/*! ./visitor.mjs */ "../../../node_modules/g * Converts an AST into a string, using one set of reasonable * formatting rules. */ + function print(ast) { return (0, _visitor.visit)(ast, printDocASTReducer); } @@ -31026,9 +30054,9 @@ const printDocASTReducer = { OperationDefinition: { leave(node) { const varDefs = wrap('(', join(node.variableDefinitions, ', '), ')'); - const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); - // Anonymous queries with no directives or variable definitions can use + const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); // Anonymous queries with no directives or variable definitions can use // the query short form. + return (prefix === 'query' ? '' : prefix + ' ') + node.selectionSet; } }, @@ -31050,19 +30078,15 @@ const printDocASTReducer = { alias, name, arguments: args, - nullabilityAssertion, directives, selectionSet }) { - const prefix = join([wrap('', alias, ': '), name], ''); + const prefix = wrap('', alias, ': ') + name; let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); } - return join([argsLine, - // Note: Client Controlled Nullability is experimental and may be - // changed or removed in the future. - nullabilityAssertion, wrap(' ', join(directives, ' ')), wrap(' ', selectionSet)]); + return join([argsLine, join(directives, ' '), selectionSet], ' '); } }, Argument: { @@ -31071,28 +30095,6 @@ const printDocASTReducer = { value }) => name + ': ' + value }, - // Nullability Modifiers - ListNullabilityOperator: { - leave({ - nullabilityAssertion - }) { - return join(['[', nullabilityAssertion, ']']); - } - }, - NonNullAssertion: { - leave({ - nullabilityAssertion - }) { - return join([nullabilityAssertion, '!']); - } - }, - ErrorBoundary: { - leave({ - nullabilityAssertion - }) { - return join([nullabilityAssertion, '?']); - } - }, // Fragments FragmentSpread: { leave: ({ @@ -31114,8 +30116,8 @@ const printDocASTReducer = { variableDefinitions, directives, selectionSet - }) => - // Note: fragment variable definitions are experimental and may be changed + } // Note: fragment variable definitions are experimental and may be changed + ) => // or removed in the future. `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` + `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` + selectionSet }, @@ -31134,7 +30136,7 @@ const printDocASTReducer = { leave: ({ value, block: isBlockString - }) => isBlockString === true ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value) + }) => isBlockString ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value) }, BooleanValue: { leave: ({ @@ -31152,21 +30154,12 @@ const printDocASTReducer = { ListValue: { leave: ({ values - }) => { - const valuesLine = '[' + join(values, ', ') + ']'; - if (valuesLine.length > MAX_LINE_LENGTH) { - return '[\n' + indent(join(values, '\n')) + '\n]'; - } - return valuesLine; - } + }) => '[' + join(values, ', ') + ']' }, ObjectValue: { leave: ({ fields - }) => { - const fieldsLine = '{ ' + join(fields, ', ') + ' }'; - return fieldsLine.length > MAX_LINE_LENGTH ? block(fields) : fieldsLine; - } + }) => '{' + join(fields, ', ') + '}' }, ObjectField: { leave: ({ @@ -31348,6 +30341,7 @@ const printDocASTReducer = { * Given maybeArray, print an empty string if it is null or empty, otherwise * print all items together separated by separator if provided */ + function join(maybeArray, separator = '') { var _maybeArray$filter$jo; return (_maybeArray$filter$jo = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.filter(x => x).join(separator)) !== null && _maybeArray$filter$jo !== void 0 ? _maybeArray$filter$jo : ''; @@ -31355,21 +30349,25 @@ function join(maybeArray, separator = '') { /** * Given array, print each item on its own line, wrapped in an indented `{ }` block. */ + function block(array) { return wrap('{\n', indent(join(array, '\n')), '\n}'); } /** * If maybeString is not null or empty, then wrap with start and end, otherwise print an empty string. */ + function wrap(start, maybeString, end = '') { return maybeString != null && maybeString !== '' ? start + maybeString + end : ''; } function indent(str) { - return wrap(' ', str.replaceAll('\n', '\n ')); + return wrap(' ', str.replace(/\n/g, '\n ')); } function hasMultilineItems(maybeArray) { var _maybeArray$some; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ return (_maybeArray$some = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.some(str => str.includes('\n'))) !== null && _maybeArray$some !== void 0 ? _maybeArray$some : false; } @@ -31390,6 +30388,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.Source = void 0; exports.isSource = isSource; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); /** * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are @@ -31403,6 +30402,7 @@ class Source { line: 1, column: 1 }) { + typeof body === 'string' || (0, _devAssert.devAssert)(false, `Body must be a string. Received: ${(0, _inspect.inspect)(body)}.`); this.body = body; this.name = name; this.locationOffset = locationOffset; @@ -31446,7 +30446,6 @@ var TokenKind; TokenKind['SOF'] = ''; TokenKind['EOF'] = ''; TokenKind['BANG'] = '!'; - TokenKind['QUESTION_MARK'] = '?'; TokenKind['DOLLAR'] = '$'; TokenKind['AMP'] = '&'; TokenKind['PAREN_L'] = '('; @@ -31468,6 +30467,12 @@ var TokenKind; TokenKind['COMMENT'] = 'Comment'; })(TokenKind || (exports.TokenKind = TokenKind = {})); +/** + * The enum type representing the token kinds values. + * + * @deprecated Please use `TokenKind`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/visitor.mjs": @@ -31483,19 +30488,105 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.BREAK = void 0; exports.getEnterLeaveForKind = getEnterLeaveForKind; +exports.getVisitFn = getVisitFn; exports.visit = visit; exports.visitInParallel = visitInParallel; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _ast = __webpack_require__(/*! ./ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +/** + * A visitor is provided to visit, it contains the collection of + * relevant functions to be called during the visitor's traversal. + */ + const BREAK = exports.BREAK = Object.freeze({}); +/** + * visit() will walk through an AST using a depth-first traversal, calling + * the visitor's enter function at each node in the traversal, and calling the + * leave function after visiting that node and all of its child nodes. + * + * By returning different values from the enter and leave functions, the + * behavior of the visitor can be altered, including skipping over a sub-tree of + * the AST (by returning false), editing the AST by returning a value or null + * to remove the value, or to stop the whole traversal by returning BREAK. + * + * When using visit() to edit an AST, the original AST will not be modified, and + * a new version of the AST with the changes applied will be returned from the + * visit function. + * + * ```ts + * const editedAST = visit(ast, { + * enter(node, key, parent, path, ancestors) { + * // @return + * // undefined: no action + * // false: skip visiting this node + * // visitor.BREAK: stop visiting altogether + * // null: delete this node + * // any value: replace this node with the returned value + * }, + * leave(node, key, parent, path, ancestors) { + * // @return + * // undefined: no action + * // false: no action + * // visitor.BREAK: stop visiting altogether + * // null: delete this node + * // any value: replace this node with the returned value + * } + * }); + * ``` + * + * Alternatively to providing enter() and leave() functions, a visitor can + * instead provide functions named the same as the kinds of AST nodes, or + * enter/leave visitors at a named key, leading to three permutations of the + * visitor API: + * + * 1) Named visitors triggered when entering a node of a specific kind. + * + * ```ts + * visit(ast, { + * Kind(node) { + * // enter the "Kind" node + * } + * }) + * ``` + * + * 2) Named visitors that trigger upon entering and leaving a node of a specific kind. + * + * ```ts + * visit(ast, { + * Kind: { + * enter(node) { + * // enter the "Kind" node + * } + * leave(node) { + * // leave the "Kind" node + * } + * } + * }) + * ``` + * + * 3) Generic visitors that trigger upon entering and leaving any node. + * + * ```ts + * visit(ast, { + * enter(node) { + * // enter any node + * }, + * leave(node) { + * // leave any node + * } + * }) + * ``` + */ + function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { const enterLeaveMap = new Map(); for (const kind of Object.values(_kinds.Kind)) { enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind)); } /* eslint-disable no-undef-init */ + let stack = undefined; let inArray = Array.isArray(root); let keys = [root]; @@ -31507,6 +30598,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { const path = []; const ancestors = []; /* eslint-enable no-undef-init */ + do { index++; const isLeaving = index === keys.length; @@ -31540,7 +30632,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { edits = stack.edits; inArray = stack.inArray; stack = stack.prev; - } else if (parent != null) { + } else if (parent) { key = inArray ? index : keys[index]; node = parent[key]; if (node === null || node === undefined) { @@ -31580,7 +30672,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { if (isLeaving) { path.pop(); } else { - var _visitorKeys$node$kin; + var _node$kind; stack = { inArray, index, @@ -31589,10 +30681,10 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { prev: stack }; inArray = Array.isArray(node); - keys = inArray ? node : (_visitorKeys$node$kin = visitorKeys[node.kind]) !== null && _visitorKeys$node$kin !== void 0 ? _visitorKeys$node$kin : []; + keys = inArray ? node : (_node$kind = visitorKeys[node.kind]) !== null && _node$kind !== void 0 ? _node$kind : []; index = -1; edits = []; - if (parent != null) { + if (parent) { ancestors.push(parent); } parent = node; @@ -31600,7 +30692,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { } while (stack !== undefined); if (edits.length !== 0) { // New root - return edits.at(-1)[1]; + return edits[edits.length - 1][1]; } return root; } @@ -31610,6 +30702,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { * * If a prior visitor edits a node, no following visitors will see that node. */ + function visitInParallel(visitors) { const skipping = new Array(visitors.length).fill(null); const mergedVisitor = Object.create(null); @@ -31622,7 +30715,7 @@ function visitInParallel(visitors) { enter, leave } = getEnterLeaveForKind(visitors[i], kind); - hasVisitor ||= enter != null || leave != null; + hasVisitor || (hasVisitor = enter != null || leave != null); enterList[i] = enter; leaveList[i] = leave; } @@ -31670,6 +30763,7 @@ function visitInParallel(visitors) { /** * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind. */ + function getEnterLeaveForKind(visitor, kind) { const kindVisitor = visitor[kind]; if (typeof kindVisitor === 'object') { @@ -31681,13 +30775,29 @@ function getEnterLeaveForKind(visitor, kind) { enter: kindVisitor, leave: undefined }; - } - // { enter() {}, leave() {} } + } // { enter() {}, leave() {} } + return { enter: visitor.enter, leave: visitor.leave }; } +/** + * Given a visitor instance, if it is leaving or not, and a node kind, return + * the function the visitor runtime should call. + * + * @deprecated Please use `getEnterLeaveForKind` instead. Will be removed in v17 + */ + +/* c8 ignore next 8 */ + +function getVisitFn(visitor, kind, isLeaving) { + const { + enter, + leave + } = getEnterLeaveForKind(visitor, kind); + return isLeaving ? leave : enter; +} /***/ }), @@ -31704,12 +30814,16 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertEnumValueName = assertEnumValueName; exports.assertName = assertName; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _characterClasses = __webpack_require__(/*! ../language/characterClasses.mjs */ "../../../node_modules/graphql/language/characterClasses.mjs"); /** * Upholds the spec rules about naming. */ + function assertName(name) { + name != null || (0, _devAssert.devAssert)(false, 'Must provide name.'); + typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); if (name.length === 0) { throw new _GraphQLError.GraphQLError('Expected name to be a non-empty string.'); } @@ -31728,6 +30842,7 @@ function assertName(name) { * * @internal */ + function assertEnumValueName(name) { if (name === 'true' || name === 'false' || name === 'null') { throw new _GraphQLError.GraphQLError(`Enum values cannot be named: ${name}`); @@ -31796,6 +30911,7 @@ var _didYouMean = __webpack_require__(/*! ../jsutils/didYouMean.mjs */ "../../.. var _identityFunc = __webpack_require__(/*! ../jsutils/identityFunc.mjs */ "../../../node_modules/graphql/jsutils/identityFunc.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); @@ -31818,6 +30934,7 @@ function assertType(type) { /** * There are predicates for each kind of GraphQL type. */ + function isScalarType(type) { return (0, _instanceOf.instanceOf)(type, GraphQLScalarType); } @@ -31890,6 +31007,10 @@ function assertNonNullType(type) { } return type; } +/** + * These types may be used as input types for arguments and directives. + */ + function isInputType(type) { return isScalarType(type) || isEnumType(type) || isInputObjectType(type) || isWrappingType(type) && isInputType(type.ofType); } @@ -31899,6 +31020,10 @@ function assertInputType(type) { } return type; } +/** + * These types may be used as output types as the result of fields. + */ + function isOutputType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isWrappingType(type) && isOutputType(type.ofType); } @@ -31908,6 +31033,10 @@ function assertOutputType(type) { } return type; } +/** + * These types may describe types which may be leaf values. + */ + function isLeafType(type) { return isScalarType(type) || isEnumType(type); } @@ -31917,6 +31046,10 @@ function assertLeafType(type) { } return type; } +/** + * These types may describe the parent context of a selection set. + */ + function isCompositeType(type) { return isObjectType(type) || isInterfaceType(type) || isUnionType(type); } @@ -31926,6 +31059,10 @@ function assertCompositeType(type) { } return type; } +/** + * These types may describe the parent context of a selection set. + */ + function isAbstractType(type) { return isInterfaceType(type) || isUnionType(type); } @@ -31954,8 +31091,10 @@ function assertAbstractType(type) { * }) * ``` */ + class GraphQLList { constructor(ofType) { + isType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -31992,6 +31131,7 @@ class GraphQLList { exports.GraphQLList = GraphQLList; class GraphQLNonNull { constructor(ofType) { + isNullableType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL nullable type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -32004,6 +31144,9 @@ class GraphQLNonNull { return this.toString(); } } +/** + * These types wrap and modify other types + */ exports.GraphQLNonNull = GraphQLNonNull; function isWrappingType(type) { return isListType(type) || isNonNullType(type); @@ -32014,6 +31157,10 @@ function assertWrappingType(type) { } return type; } +/** + * These types can all accept null as a value. + */ + function isNullableType(type) { return isType(type) && !isNonNullType(type); } @@ -32028,6 +31175,10 @@ function getNullableType(type) { return isNonNullType(type) ? type.ofType : type; } } +/** + * These named types do not include modifiers like List or NonNull. + */ + function isNamedType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type); } @@ -32046,12 +31197,27 @@ function getNamedType(type) { return unwrappedType; } } +/** + * Used while defining GraphQL types to allow for circular references in + * otherwise immutable type definitions. + */ + function resolveReadonlyArrayThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } function resolveObjMapThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Scalar Type Definition * @@ -32096,6 +31262,8 @@ class GraphQLScalarType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; + config.specifiedByURL == null || typeof config.specifiedByURL === 'string' || (0, _devAssert.devAssert)(false, `${this.name} must provide "specifiedByURL" as a string, ` + `but got: ${(0, _inspect.inspect)(config.specifiedByURL)}.`); + config.serialize == null || typeof config.serialize === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "serialize" function. If this custom Scalar is also used as an input type, ensure "parseValue" and "parseLiteral" functions are also provided.`); if (config.parseLiteral) { typeof config.parseValue === 'function' && typeof config.parseLiteral === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide both "parseValue" and "parseLiteral" functions.`); } @@ -32123,6 +31291,7 @@ class GraphQLScalarType { return this.toString(); } } + /** * Object Type Definition * @@ -32173,10 +31342,9 @@ class GraphQLObjectType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN2 = config.extensionASTNodes) !== null && _config$extensionASTN2 !== void 0 ? _config$extensionASTN2 : []; - // prettier-ignore - // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 - this._fields = defineFieldMap.bind(undefined, config.fields); - this._interfaces = defineInterfaces.bind(undefined, config.interfaces); + this._fields = () => defineFieldMap(config); + this._interfaces = () => defineInterfaces(config); + config.isTypeOf == null || typeof config.isTypeOf === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "isTypeOf" as a function, ` + `but got: ${(0, _inspect.inspect)(config.isTypeOf)}.`); } get [Symbol.toStringTag]() { return 'GraphQLObjectType'; @@ -32213,14 +31381,21 @@ class GraphQLObjectType { } } exports.GraphQLObjectType = GraphQLObjectType; -function defineInterfaces(interfaces) { - return resolveReadonlyArrayThunk(interfaces !== null && interfaces !== void 0 ? interfaces : []); +function defineInterfaces(config) { + var _config$interfaces; + const interfaces = resolveReadonlyArrayThunk((_config$interfaces = config.interfaces) !== null && _config$interfaces !== void 0 ? _config$interfaces : []); + Array.isArray(interfaces) || (0, _devAssert.devAssert)(false, `${config.name} interfaces must be an Array or a function which returns an Array.`); + return interfaces; } -function defineFieldMap(fields) { - const fieldMap = resolveObjMapThunk(fields); +function defineFieldMap(config) { + const fieldMap = resolveObjMapThunk(config.fields); + isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { var _fieldConfig$args; + isPlainObj(fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field config must be an object.`); + fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function' || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field resolver must be a function if ` + `provided, but got: ${(0, _inspect.inspect)(fieldConfig.resolve)}.`); const argsConfig = (_fieldConfig$args = fieldConfig.args) !== null && _fieldConfig$args !== void 0 ? _fieldConfig$args : {}; + isPlainObj(argsConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} args must be an object with argument names as keys.`); return { name: (0, _assertName.assertName)(fieldName), description: fieldConfig.description, @@ -32234,8 +31409,8 @@ function defineFieldMap(fields) { }; }); } -function defineArguments(args) { - return Object.entries(args).map(([argName, argConfig]) => ({ +function defineArguments(config) { + return Object.entries(config).map(([argName, argConfig]) => ({ name: (0, _assertName.assertName)(argName), description: argConfig.description, type: argConfig.type, @@ -32245,6 +31420,9 @@ function defineArguments(args) { astNode: argConfig.astNode })); } +function isPlainObj(obj) { + return (0, _isObjectLike.isObjectLike)(obj) && !Array.isArray(obj); +} function fieldsToFieldsConfig(fields) { return (0, _mapValue.mapValue)(fields, field => ({ description: field.description, @@ -32260,6 +31438,7 @@ function fieldsToFieldsConfig(fields) { /** * @internal */ + function argsToArgsConfig(args) { return (0, _keyValMap.keyValMap)(args, arg => arg.name, arg => ({ description: arg.description, @@ -32273,6 +31452,7 @@ function argsToArgsConfig(args) { function isRequiredArgument(arg) { return isNonNullType(arg.type) && arg.defaultValue === undefined; } + /** * Interface Type Definition * @@ -32301,10 +31481,9 @@ class GraphQLInterfaceType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN3 = config.extensionASTNodes) !== null && _config$extensionASTN3 !== void 0 ? _config$extensionASTN3 : []; - // prettier-ignore - // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 - this._fields = defineFieldMap.bind(undefined, config.fields); - this._interfaces = defineInterfaces.bind(undefined, config.interfaces); + this._fields = defineFieldMap.bind(undefined, config); + this._interfaces = defineInterfaces.bind(undefined, config); + config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); } get [Symbol.toStringTag]() { return 'GraphQLInterfaceType'; @@ -32340,6 +31519,7 @@ class GraphQLInterfaceType { return this.toString(); } } + /** * Union Type Definition * @@ -32374,7 +31554,8 @@ class GraphQLUnionType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN4 = config.extensionASTNodes) !== null && _config$extensionASTN4 !== void 0 ? _config$extensionASTN4 : []; - this._types = defineTypes.bind(undefined, config.types); + this._types = defineTypes.bind(undefined, config); + config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); } get [Symbol.toStringTag]() { return 'GraphQLUnionType'; @@ -32404,19 +31585,12 @@ class GraphQLUnionType { } } exports.GraphQLUnionType = GraphQLUnionType; -function defineTypes(types) { - return resolveReadonlyArrayThunk(types); -} -function enumValuesFromConfig(values) { - return Object.entries(values).map(([valueName, valueConfig]) => ({ - name: (0, _assertName.assertEnumValueName)(valueName), - description: valueConfig.description, - value: valueConfig.value !== undefined ? valueConfig.value : valueName, - deprecationReason: valueConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), - astNode: valueConfig.astNode - })); +function defineTypes(config) { + const types = resolveReadonlyArrayThunk(config.types); + Array.isArray(types) || (0, _devAssert.devAssert)(false, `Must provide Array of types or a function which returns such an array for Union ${config.name}.`); + return types; } + /** * Enum Type Definition * @@ -32440,7 +31614,8 @@ function enumValuesFromConfig(values) { * Note: If a value is not provided in a definition, the name of the enum value * will be used as its internal value. */ -class GraphQLEnumType /* */ { +class GraphQLEnumType { + /* */ constructor(config) { var _config$extensionASTN5; this.name = (0, _assertName.assertName)(config.name); @@ -32448,7 +31623,7 @@ class GraphQLEnumType /* */ { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN5 = config.extensionASTNodes) !== null && _config$extensionASTN5 !== void 0 ? _config$extensionASTN5 : []; - this._values = typeof config.values === 'function' ? config.values : enumValuesFromConfig(config.values); + this._values = typeof config.values === 'function' ? config.values : defineEnumValues(this.name, config.values); this._valueLookup = null; this._nameLookup = null; } @@ -32457,7 +31632,7 @@ class GraphQLEnumType /* */ { } getValues() { if (typeof this._values === 'function') { - this._values = enumValuesFromConfig(this._values()); + this._values = defineEnumValues(this.name, this._values()); } return this._values; } @@ -32467,7 +31642,7 @@ class GraphQLEnumType /* */ { } return this._nameLookup[name]; } - serialize(outputValue /* T */) { + serialize(outputValue) { if (this._valueLookup === null) { this._valueLookup = new Map(this.getValues().map(enumValue => [enumValue.value, enumValue])); } @@ -32477,7 +31652,8 @@ class GraphQLEnumType /* */ { } return enumValue.name; } - parseValue(inputValue) { + parseValue(inputValue) /* T */ + { if (typeof inputValue !== 'string') { const valueStr = (0, _inspect.inspect)(inputValue); throw new _GraphQLError.GraphQLError(`Enum "${this.name}" cannot represent non-string value: ${valueStr}.` + didYouMeanEnumValue(this, valueStr)); @@ -32488,7 +31664,8 @@ class GraphQLEnumType /* */ { } return enumValue.value; } - parseLiteral(valueNode, _variables) { + parseLiteral(valueNode, _variables) /* T */ + { // Note: variables will be resolved to a value before calling this function. if (valueNode.kind !== _kinds.Kind.ENUM) { const valueStr = (0, _printer.print)(valueNode); @@ -32535,6 +31712,21 @@ function didYouMeanEnumValue(enumType, unknownValueStr) { const suggestedValues = (0, _suggestionList.suggestionList)(unknownValueStr, allNames); return (0, _didYouMean.didYouMean)('the enum value', suggestedValues); } +function defineEnumValues(typeName, valueMap) { + isPlainObj(valueMap) || (0, _devAssert.devAssert)(false, `${typeName} values must be an object with value names as keys.`); + return Object.entries(valueMap).map(([valueName, valueConfig]) => { + isPlainObj(valueConfig) || (0, _devAssert.devAssert)(false, `${typeName}.${valueName} must refer to an object with a "value" key ` + `representing an internal value but got: ${(0, _inspect.inspect)(valueConfig)}.`); + return { + name: (0, _assertName.assertEnumValueName)(valueName), + description: valueConfig.description, + value: valueConfig.value !== undefined ? valueConfig.value : valueName, + deprecationReason: valueConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), + astNode: valueConfig.astNode + }; + }); +} + /** * Input Object Type Definition * @@ -32565,7 +31757,7 @@ class GraphQLInputObjectType { this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN6 = config.extensionASTNodes) !== null && _config$extensionASTN6 !== void 0 ? _config$extensionASTN6 : []; this.isOneOf = (_config$isOneOf = config.isOneOf) !== null && _config$isOneOf !== void 0 ? _config$isOneOf : false; - this._fields = defineInputFieldMap.bind(undefined, config.fields); + this._fields = defineInputFieldMap.bind(undefined, config); } get [Symbol.toStringTag]() { return 'GraphQLInputObjectType'; @@ -32603,17 +31795,21 @@ class GraphQLInputObjectType { } } exports.GraphQLInputObjectType = GraphQLInputObjectType; -function defineInputFieldMap(fields) { - const fieldMap = resolveObjMapThunk(fields); - return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => ({ - name: (0, _assertName.assertName)(fieldName), - description: fieldConfig.description, - type: fieldConfig.type, - defaultValue: fieldConfig.defaultValue, - deprecationReason: fieldConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), - astNode: fieldConfig.astNode - })); +function defineInputFieldMap(config) { + const fieldMap = resolveObjMapThunk(config.fields); + isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); + return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { + !('resolve' in fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field has a resolve property, but Input Types cannot define resolvers.`); + return { + name: (0, _assertName.assertName)(fieldName), + description: fieldConfig.description, + type: fieldConfig.type, + defaultValue: fieldConfig.defaultValue, + deprecationReason: fieldConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), + astNode: fieldConfig.astNode + }; + }); } function isRequiredInputField(field) { return isNonNullType(field.type) && field.defaultValue === undefined; @@ -32632,13 +31828,15 @@ function isRequiredInputField(field) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GraphQLStreamDirective = exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLOneOfDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.GraphQLDeferDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; +exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLOneOfDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; exports.assertDirective = assertDirective; exports.isDirective = isDirective; exports.isSpecifiedDirective = isSpecifiedDirective; exports.specifiedDirectives = void 0; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _directiveLocation = __webpack_require__(/*! ../language/directiveLocation.mjs */ "../../../node_modules/graphql/language/directiveLocation.mjs"); var _assertName = __webpack_require__(/*! ./assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); @@ -32647,6 +31845,7 @@ var _scalars = __webpack_require__(/*! ./scalars.mjs */ "../../../node_modules/g /** * Test if the given value is a GraphQL directive. */ + function isDirective(directive) { return (0, _instanceOf.instanceOf)(directive, GraphQLDirective); } @@ -32656,6 +31855,16 @@ function assertDirective(directive) { } return directive; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Directives are used by the GraphQL runtime as a way of modifying execution * behavior. Type system creators will usually not create these directly. @@ -32669,7 +31878,9 @@ class GraphQLDirective { this.isRepeatable = (_config$isRepeatable = config.isRepeatable) !== null && _config$isRepeatable !== void 0 ? _config$isRepeatable : false; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; + Array.isArray(config.locations) || (0, _devAssert.devAssert)(false, `@${config.name} locations must be an Array.`); const args = (_config$args = config.args) !== null && _config$args !== void 0 ? _config$args : {}; + (0, _isObjectLike.isObjectLike)(args) && !Array.isArray(args) || (0, _devAssert.devAssert)(false, `@${config.name} args must be an object with argument names as keys.`); this.args = (0, _definition.defineArguments)(args); } get [Symbol.toStringTag]() { @@ -32693,6 +31904,7 @@ class GraphQLDirective { return this.toString(); } } + /** * Used to conditionally include fields or fragments. */ @@ -32711,6 +31923,7 @@ const GraphQLIncludeDirective = exports.GraphQLIncludeDirective = new GraphQLDir /** * Used to conditionally skip (exclude) fields or fragments. */ + const GraphQLSkipDirective = exports.GraphQLSkipDirective = new GraphQLDirective({ name: 'skip', description: 'Directs the executor to skip this field or fragment when the `if` argument is true.', @@ -32722,56 +31935,15 @@ const GraphQLSkipDirective = exports.GraphQLSkipDirective = new GraphQLDirective } } }); -/** - * Used to conditionally defer fragments. - */ -const GraphQLDeferDirective = exports.GraphQLDeferDirective = new GraphQLDirective({ - name: 'defer', - description: 'Directs the executor to defer this fragment when the `if` argument is true or undefined.', - locations: [_directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT], - args: { - if: { - type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), - description: 'Deferred when true or undefined.', - defaultValue: true - }, - label: { - type: _scalars.GraphQLString, - description: 'Unique name' - } - } -}); -/** - * Used to conditionally stream list fields. - */ -const GraphQLStreamDirective = exports.GraphQLStreamDirective = new GraphQLDirective({ - name: 'stream', - description: 'Directs the executor to stream plural fields when the `if` argument is true or undefined.', - locations: [_directiveLocation.DirectiveLocation.FIELD], - args: { - if: { - type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), - description: 'Stream when true or undefined.', - defaultValue: true - }, - label: { - type: _scalars.GraphQLString, - description: 'Unique name' - }, - initialCount: { - defaultValue: 0, - type: _scalars.GraphQLInt, - description: 'Number of items to return immediately' - } - } -}); /** * Constant string used for default reason for a deprecation. */ + const DEFAULT_DEPRECATION_REASON = exports.DEFAULT_DEPRECATION_REASON = 'No longer supported'; /** * Used to declare element of a GraphQL schema as deprecated. */ + const GraphQLDeprecatedDirective = exports.GraphQLDeprecatedDirective = new GraphQLDirective({ name: 'deprecated', description: 'Marks an element of a GraphQL schema as no longer supported.', @@ -32787,6 +31959,7 @@ const GraphQLDeprecatedDirective = exports.GraphQLDeprecatedDirective = new Grap /** * Used to provide a URL for specifying the behavior of custom scalar definitions. */ + const GraphQLSpecifiedByDirective = exports.GraphQLSpecifiedByDirective = new GraphQLDirective({ name: 'specifiedBy', description: 'Exposes a URL that specifies the behavior of this scalar.', @@ -32801,6 +31974,7 @@ const GraphQLSpecifiedByDirective = exports.GraphQLSpecifiedByDirective = new Gr /** * Used to indicate an Input Object is a OneOf Input Object. */ + const GraphQLOneOfDirective = exports.GraphQLOneOfDirective = new GraphQLDirective({ name: 'oneOf', description: 'Indicates exactly one field must be supplied and this field must not be `null`.', @@ -32810,6 +31984,7 @@ const GraphQLOneOfDirective = exports.GraphQLOneOfDirective = new GraphQLDirecti /** * The full list of specified directives. */ + const specifiedDirectives = exports.specifiedDirectives = Object.freeze([GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective, GraphQLOneOfDirective]); function isSpecifiedDirective(directive) { return specifiedDirectives.some(({ @@ -32854,12 +32029,6 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _scalars.GraphQLBoolean; } })); -Object.defineProperty(exports, "GraphQLDeferDirective", ({ - enumerable: true, - get: function () { - return _directives.GraphQLDeferDirective; - } -})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -32962,12 +32131,6 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _directives.GraphQLSpecifiedByDirective; } })); -Object.defineProperty(exports, "GraphQLStreamDirective", ({ - enumerable: true, - get: function () { - return _directives.GraphQLStreamDirective; - } -})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -33474,7 +32637,7 @@ const __Directive = exports.__Directive = new _definition.GraphQLObjectType({ resolve(field, { includeDeprecated }) { - return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); + return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); } } }) @@ -33594,6 +32757,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered) + false || (0, _invariant.invariant)(false, `Unexpected type: "${(0, _inspect.inspect)(type)}".`); } }, @@ -33603,9 +32767,8 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }, description: { type: _scalars.GraphQLString, - resolve: type => - // FIXME: add test case - /* c8 ignore next */ + resolve: (type // FIXME: add test case + ) => /* c8 ignore next */ 'description' in type ? type.description : undefined }, specifiedByURL: { @@ -33625,7 +32788,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const fields = Object.values(type.getFields()); - return includeDeprecated === true ? fields : fields.filter(field => field.deprecationReason == null); + return includeDeprecated ? fields : fields.filter(field => field.deprecationReason == null); } } }, @@ -33660,7 +32823,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isEnumType)(type)) { const values = type.getValues(); - return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); } } }, @@ -33677,7 +32840,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isInputObjectType)(type)) { const values = Object.values(type.getFields()); - return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); } } }, @@ -33718,7 +32881,7 @@ const __Field = exports.__Field = new _definition.GraphQLObjectType({ resolve(field, { includeDeprecated }) { - return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); + return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); } }, type: { @@ -33848,6 +33011,7 @@ const __TypeKind = exports.__TypeKind = new _definition.GraphQLEnumType({ * Note that these are GraphQLField and not GraphQLFieldConfig, * so the format for args is different. */ + const SchemaMetaFieldDef = exports.SchemaMetaFieldDef = { name: '__schema', type: new _definition.GraphQLNonNull(__Schema), @@ -33927,11 +33091,13 @@ var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_mod * Maximum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe up-to 2^53 - 1 * */ + const GRAPHQL_MAX_INT = exports.GRAPHQL_MAX_INT = 2147483647; /** * Minimum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe starting at -(2^53 - 1) * */ + const GRAPHQL_MIN_INT = exports.GRAPHQL_MIN_INT = -2147483648; const GraphQLInt = exports.GraphQLInt = new _definition.GraphQLScalarType({ name: 'Int', @@ -34002,9 +33168,7 @@ const GraphQLFloat = exports.GraphQLFloat = new _definition.GraphQLScalarType({ }, parseLiteral(valueNode) { if (valueNode.kind !== _kinds.Kind.FLOAT && valueNode.kind !== _kinds.Kind.INT) { - throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, { - nodes: valueNode - }); + throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, valueNode); } return parseFloat(valueNode.value); } @@ -34013,9 +33177,9 @@ const GraphQLString = exports.GraphQLString = new _definition.GraphQLScalarType( name: 'String', description: 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.', serialize(outputValue) { - const coercedValue = serializeObject(outputValue); - // Serialize string, boolean and number values to a string, but do not + const coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not // attempt to coerce object, function, symbol, or other types as strings. + if (typeof coercedValue === 'string') { return coercedValue; } @@ -34106,10 +33270,10 @@ function isSpecifiedScalarType(type) { return specifiedScalarTypes.some(({ name }) => type.name === name); -} -// Support serializing objects with custom valueOf() or toJSON() functions - +} // Support serializing objects with custom valueOf() or toJSON() functions - // a common way to represent a complex value which can be represented as // a string (ex: MongoDB id objects). + function serializeObject(outputValue) { if ((0, _isObjectLike.isObjectLike)(outputValue)) { if (typeof outputValue.valueOf === 'function') { @@ -34141,8 +33305,10 @@ Object.defineProperty(exports, "__esModule", ({ exports.GraphQLSchema = void 0; exports.assertSchema = assertSchema; exports.isSchema = isSchema; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); @@ -34151,6 +33317,7 @@ var _introspection = __webpack_require__(/*! ./introspection.mjs */ "../../../no /** * Test if the given value is a GraphQL schema. */ + function isSchema(schema) { return (0, _instanceOf.instanceOf)(schema, GraphQLSchema); } @@ -34160,6 +33327,16 @@ function assertSchema(schema) { } return schema; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Schema Definition * @@ -34229,22 +33406,28 @@ function assertSchema(schema) { * ``` */ class GraphQLSchema { + // Used as a cache for validateSchema(). constructor(config) { var _config$extensionASTN, _config$directives; + // If this schema was built from a source known to be valid, then it may be // marked with assumeValid to avoid an additional type system validation. - this.__validationErrors = config.assumeValid === true ? [] : undefined; + this.__validationErrors = config.assumeValid === true ? [] : undefined; // Check for common mistakes during construction to produce early errors. + + (0, _isObjectLike.isObjectLike)(config) || (0, _devAssert.devAssert)(false, 'Must provide configuration object.'); + !config.types || Array.isArray(config.types) || (0, _devAssert.devAssert)(false, `"types" must be Array if provided but got: ${(0, _inspect.inspect)(config.types)}.`); + !config.directives || Array.isArray(config.directives) || (0, _devAssert.devAssert)(false, '"directives" must be Array if provided but got: ' + `${(0, _inspect.inspect)(config.directives)}.`); this.description = config.description; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; this._queryType = config.query; this._mutationType = config.mutation; - this._subscriptionType = config.subscription; - // Provide specified directives (e.g. @include and @skip) by default. - this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; - // To preserve order of user-provided types, we add first to add them to + this._subscriptionType = config.subscription; // Provide specified directives (e.g. @include and @skip) by default. + + this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; // To preserve order of user-provided types, we add first to add them to // the set of "collected" types, so `collectReferencedTypes` ignore them. + const allReferencedTypes = new Set(config.types); if (config.types != null) { for (const type of config.types) { @@ -34271,17 +33454,18 @@ class GraphQLSchema { } } } - collectReferencedTypes(_introspection.__Schema, allReferencedTypes); - // Storing the resulting map for reference by the schema. + collectReferencedTypes(_introspection.__Schema, allReferencedTypes); // Storing the resulting map for reference by the schema. + this._typeMap = Object.create(null); - this._subTypeMap = new Map(); - // Keep track of all implementations by interface name. + this._subTypeMap = Object.create(null); // Keep track of all implementations by interface name. + this._implementationsMap = Object.create(null); for (const namedType of allReferencedTypes) { if (namedType == null) { continue; } const typeName = namedType.name; + typeName || (0, _devAssert.devAssert)(false, 'One of the provided types for building the Schema is missing a name.'); if (this._typeMap[typeName] !== undefined) { throw new Error(`Schema must contain uniquely named types but contains multiple types named "${typeName}".`); } @@ -34356,17 +33540,25 @@ class GraphQLSchema { }; } isSubType(abstractType, maybeSubType) { - let set = this._subTypeMap.get(abstractType); - if (set === undefined) { + let map = this._subTypeMap[abstractType.name]; + if (map === undefined) { + map = Object.create(null); if ((0, _definition.isUnionType)(abstractType)) { - set = new Set(abstractType.getTypes()); + for (const type of abstractType.getTypes()) { + map[type.name] = true; + } } else { const implementations = this.getImplementations(abstractType); - set = new Set([...implementations.objects, ...implementations.interfaces]); + for (const type of implementations.objects) { + map[type.name] = true; + } + for (const type of implementations.interfaces) { + map[type.name] = true; + } } - this._subTypeMap.set(abstractType, set); + this._subTypeMap[abstractType.name] = map; } - return set.has(maybeSubType); + return map[maybeSubType.name] !== undefined; } getDirectives() { return this._directives; @@ -34374,33 +33566,6 @@ class GraphQLSchema { getDirective(name) { return this.getDirectives().find(directive => directive.name === name); } - /** - * This method looks up the field on the given type definition. - * It has special casing for the three introspection fields, `__schema`, - * `__type` and `__typename`. - * - * `__typename` is special because it can always be queried as a field, even - * in situations where no other fields are allowed, like on a Union. - * - * `__schema` and `__type` could get automatically added to the query type, - * but that would require mutating type definitions, which would cause issues. - */ - getField(parentType, fieldName) { - switch (fieldName) { - case _introspection.SchemaMetaFieldDef.name: - return this.getQueryType() === parentType ? _introspection.SchemaMetaFieldDef : undefined; - case _introspection.TypeMetaFieldDef.name: - return this.getQueryType() === parentType ? _introspection.TypeMetaFieldDef : undefined; - case _introspection.TypeNameMetaFieldDef.name: - return _introspection.TypeNameMetaFieldDef; - } - // this function is part "hot" path inside executor and check presence - // of 'getFields' is faster than to use `!isUnionType` - if ('getFields' in parentType) { - return parentType.getFields()[fieldName]; - } - return undefined; - } toConfig() { return { description: this.description, @@ -34459,9 +33624,6 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertValidSchema = assertValidSchema; exports.validateSchema = validateSchema; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); -var _capitalize = __webpack_require__(/*! ../jsutils/capitalize.mjs */ "../../../node_modules/graphql/jsutils/capitalize.mjs"); -var _formatList = __webpack_require__(/*! ../jsutils/formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); @@ -34477,20 +33639,21 @@ var _schema = __webpack_require__(/*! ./schema.mjs */ "../../../node_modules/gra * Validation runs synchronously, returning an array of encountered errors, or * an empty array if no errors were encountered and the Schema is valid. */ + function validateSchema(schema) { // First check to ensure the provided value is in fact a GraphQLSchema. - (0, _schema.assertSchema)(schema); - // If this Schema has already been validated, return the previous results. + (0, _schema.assertSchema)(schema); // If this Schema has already been validated, return the previous results. + if (schema.__validationErrors) { return schema.__validationErrors; - } - // Validate the schema, producing a list of errors. + } // Validate the schema, producing a list of errors. + const context = new SchemaValidationContext(schema); validateRootTypes(context); validateDirectives(context); - validateTypes(context); - // Persist the results of validation before returning to ensure validation + validateTypes(context); // Persist the results of validation before returning to ensure validation // does not run multiple times for this schema. + const errors = context.getErrors(); schema.__validationErrors = errors; return errors; @@ -34499,6 +33662,7 @@ function validateSchema(schema) { * Utility function which asserts a schema is valid by throwing an error if * it is invalid. */ + function assertValidSchema(schema) { const errors = validateSchema(schema); if (errors.length !== 0) { @@ -34522,28 +33686,22 @@ class SchemaValidationContext { } function validateRootTypes(context) { const schema = context.schema; - if (schema.getQueryType() == null) { + const queryType = schema.getQueryType(); + if (!queryType) { context.reportError('Query root type must be provided.', schema.astNode); + } else if (!(0, _definition.isObjectType)(queryType)) { + var _getOperationTypeNode; + context.reportError(`Query root type must be Object type, it cannot be ${(0, _inspect.inspect)(queryType)}.`, (_getOperationTypeNode = getOperationTypeNode(schema, _ast.OperationTypeNode.QUERY)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : queryType.astNode); } - const rootTypesMap = new _AccumulatorMap.AccumulatorMap(); - for (const operationType of Object.values(_ast.OperationTypeNode)) { - const rootType = schema.getRootType(operationType); - if (rootType != null) { - if (!(0, _definition.isObjectType)(rootType)) { - var _getOperationTypeNode; - const operationTypeStr = (0, _capitalize.capitalize)(operationType); - const rootTypeStr = (0, _inspect.inspect)(rootType); - context.reportError(operationType === _ast.OperationTypeNode.QUERY ? `${operationTypeStr} root type must be Object type, it cannot be ${rootTypeStr}.` : `${operationTypeStr} root type must be Object type if provided, it cannot be ${rootTypeStr}.`, (_getOperationTypeNode = getOperationTypeNode(schema, operationType)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : rootType.astNode); - } else { - rootTypesMap.add(rootType, operationType); - } - } + const mutationType = schema.getMutationType(); + if (mutationType && !(0, _definition.isObjectType)(mutationType)) { + var _getOperationTypeNode2; + context.reportError('Mutation root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(mutationType)}.`, (_getOperationTypeNode2 = getOperationTypeNode(schema, _ast.OperationTypeNode.MUTATION)) !== null && _getOperationTypeNode2 !== void 0 ? _getOperationTypeNode2 : mutationType.astNode); } - for (const [rootType, operationTypes] of rootTypesMap) { - if (operationTypes.length > 1) { - const operationList = (0, _formatList.andList)(operationTypes); - context.reportError(`All root types must be different, "${rootType.name}" type is used as ${operationList} root types.`, operationTypes.map(operationType => getOperationTypeNode(schema, operationType))); - } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType && !(0, _definition.isObjectType)(subscriptionType)) { + var _getOperationTypeNode3; + context.reportError('Subscription root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(subscriptionType)}.`, (_getOperationTypeNode3 = getOperationTypeNode(schema, _ast.OperationTypeNode.SUBSCRIPTION)) !== null && _getOperationTypeNode3 !== void 0 ? _getOperationTypeNode3 : subscriptionType.astNode); } } function getOperationTypeNode(schema, operation) { @@ -34552,7 +33710,9 @@ function getOperationTypeNode(schema, operation) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 schemaNode => { var _schemaNode$operation; - return /* c8 ignore next */(_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : []; + return /* c8 ignore next */( + (_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : [] + ); }).find(operationNode => operationNode.operation === operation)) === null || _flatMap$find === void 0 ? void 0 : _flatMap$find.type; } function validateDirectives(context) { @@ -34561,17 +33721,15 @@ function validateDirectives(context) { if (!(0, _directives.isDirective)(directive)) { context.reportError(`Expected directive but got: ${(0, _inspect.inspect)(directive)}.`, directive === null || directive === void 0 ? void 0 : directive.astNode); continue; - } - // Ensure they are named correctly. - validateName(context, directive); - if (directive.locations.length === 0) { - context.reportError(`Directive @${directive.name} must include 1 or more locations.`, directive.astNode); - } + } // Ensure they are named correctly. + + validateName(context, directive); // TODO: Ensure proper locations. // Ensure the arguments are valid. + for (const arg of directive.args) { // Ensure they are named correctly. - validateName(context, arg); - // Ensure the type is an input type. + validateName(context, arg); // Ensure the type is an input type. + if (!(0, _definition.isInputType)(arg.type)) { context.reportError(`The type of @${directive.name}(${arg.name}:) must be Input Type ` + `but got: ${(0, _inspect.inspect)(arg.type)}.`, arg.astNode); } @@ -34596,20 +33754,20 @@ function validateTypes(context) { if (!(0, _definition.isNamedType)(type)) { context.reportError(`Expected GraphQL named type but got: ${(0, _inspect.inspect)(type)}.`, type.astNode); continue; - } - // Ensure it is named correctly (excluding introspection types). + } // Ensure it is named correctly (excluding introspection types). + if (!(0, _introspection.isIntrospectionType)(type)) { validateName(context, type); } if ((0, _definition.isObjectType)(type)) { // Ensure fields are valid - validateFields(context, type); - // Ensure objects implement the interfaces they claim to. + validateFields(context, type); // Ensure objects implement the interfaces they claim to. + validateInterfaces(context, type); } else if ((0, _definition.isInterfaceType)(type)) { // Ensure fields are valid. - validateFields(context, type); - // Ensure interfaces implement the interfaces they claim to. + validateFields(context, type); // Ensure interfaces implement the interfaces they claim to. + validateInterfaces(context, type); } else if ((0, _definition.isUnionType)(type)) { // Ensure Unions include valid member types. @@ -34619,32 +33777,32 @@ function validateTypes(context) { validateEnumValues(context, type); } else if ((0, _definition.isInputObjectType)(type)) { // Ensure Input Object fields are valid. - validateInputFields(context, type); - // Ensure Input Objects do not contain non-nullable circular references + validateInputFields(context, type); // Ensure Input Objects do not contain non-nullable circular references + validateInputObjectCircularRefs(type); } } } function validateFields(context, type) { - const fields = Object.values(type.getFields()); - // Objects and Interfaces both must define one or more fields. + const fields = Object.values(type.getFields()); // Objects and Interfaces both must define one or more fields. + if (fields.length === 0) { context.reportError(`Type ${type.name} must define one or more fields.`, [type.astNode, ...type.extensionASTNodes]); } for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); - // Ensure the type is an output type + validateName(context, field); // Ensure the type is an output type + if (!(0, _definition.isOutputType)(field.type)) { var _field$astNode; context.reportError(`The type of ${type.name}.${field.name} must be Output Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode = field.astNode) === null || _field$astNode === void 0 ? void 0 : _field$astNode.type); - } - // Ensure the arguments are valid + } // Ensure the arguments are valid + for (const arg of field.args) { - const argName = arg.name; - // Ensure they are named correctly. - validateName(context, arg); - // Ensure the type is an input type + const argName = arg.name; // Ensure they are named correctly. + + validateName(context, arg); // Ensure the type is an input type + if (!(0, _definition.isInputType)(arg.type)) { var _arg$astNode2; context.reportError(`The type of ${type.name}.${field.name}(${argName}:) must be Input ` + `Type but got: ${(0, _inspect.inspect)(arg.type)}.`, (_arg$astNode2 = arg.astNode) === null || _arg$astNode2 === void 0 ? void 0 : _arg$astNode2.type); @@ -34657,7 +33815,7 @@ function validateFields(context, type) { } } function validateInterfaces(context, type) { - const ifaceTypeNames = new Set(); + const ifaceTypeNames = Object.create(null); for (const iface of type.getInterfaces()) { if (!(0, _definition.isInterfaceType)(iface)) { context.reportError(`Type ${(0, _inspect.inspect)(type)} must only implement Interface types, ` + `it cannot implement ${(0, _inspect.inspect)(iface)}.`, getAllImplementsInterfaceNodes(type, iface)); @@ -34667,51 +33825,50 @@ function validateInterfaces(context, type) { context.reportError(`Type ${type.name} cannot implement itself because it would create a circular reference.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - if (ifaceTypeNames.has(iface.name)) { + if (ifaceTypeNames[iface.name]) { context.reportError(`Type ${type.name} can only implement ${iface.name} once.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - ifaceTypeNames.add(iface.name); + ifaceTypeNames[iface.name] = true; validateTypeImplementsAncestors(context, type, iface); validateTypeImplementsInterface(context, type, iface); } } function validateTypeImplementsInterface(context, type, iface) { - const typeFieldMap = type.getFields(); - // Assert each interface field is implemented. + const typeFieldMap = type.getFields(); // Assert each interface field is implemented. + for (const ifaceField of Object.values(iface.getFields())) { const fieldName = ifaceField.name; - const typeField = typeFieldMap[fieldName]; - // Assert interface field exists on type. - if (typeField == null) { + const typeField = typeFieldMap[fieldName]; // Assert interface field exists on type. + + if (!typeField) { context.reportError(`Interface field ${iface.name}.${fieldName} expected but ${type.name} does not provide it.`, [ifaceField.astNode, type.astNode, ...type.extensionASTNodes]); continue; - } - // Assert interface field type is satisfied by type field type, by being + } // Assert interface field type is satisfied by type field type, by being // a valid subtype. (covariant) + if (!(0, _typeComparators.isTypeSubTypeOf)(context.schema, typeField.type, ifaceField.type)) { var _ifaceField$astNode, _typeField$astNode; context.reportError(`Interface field ${iface.name}.${fieldName} expects type ` + `${(0, _inspect.inspect)(ifaceField.type)} but ${type.name}.${fieldName} ` + `is type ${(0, _inspect.inspect)(typeField.type)}.`, [(_ifaceField$astNode = ifaceField.astNode) === null || _ifaceField$astNode === void 0 ? void 0 : _ifaceField$astNode.type, (_typeField$astNode = typeField.astNode) === null || _typeField$astNode === void 0 ? void 0 : _typeField$astNode.type]); - } - // Assert each interface field arg is implemented. + } // Assert each interface field arg is implemented. + for (const ifaceArg of ifaceField.args) { const argName = ifaceArg.name; - const typeArg = typeField.args.find(arg => arg.name === argName); - // Assert interface field arg exists on object field. + const typeArg = typeField.args.find(arg => arg.name === argName); // Assert interface field arg exists on object field. + if (!typeArg) { context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) expected but ${type.name}.${fieldName} does not provide it.`, [ifaceArg.astNode, typeField.astNode]); continue; - } - // Assert interface field arg type matches object field arg type. + } // Assert interface field arg type matches object field arg type. // (invariant) // TODO: change to contravariant? + if (!(0, _typeComparators.isEqualType)(ifaceArg.type, typeArg.type)) { var _ifaceArg$astNode, _typeArg$astNode; context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) ` + `expects type ${(0, _inspect.inspect)(ifaceArg.type)} but ` + `${type.name}.${fieldName}(${argName}:) is type ` + `${(0, _inspect.inspect)(typeArg.type)}.`, [(_ifaceArg$astNode = ifaceArg.astNode) === null || _ifaceArg$astNode === void 0 ? void 0 : _ifaceArg$astNode.type, (_typeArg$astNode = typeArg.astNode) === null || _typeArg$astNode === void 0 ? void 0 : _typeArg$astNode.type]); - } - // TODO: validate default values? - } - // Assert additional arguments must not be required. + } // TODO: validate default values? + } // Assert additional arguments must not be required. + for (const typeArg of typeField.args) { const argName = typeArg.name; const ifaceArg = ifaceField.args.find(arg => arg.name === argName); @@ -34734,13 +33891,13 @@ function validateUnionMembers(context, union) { if (memberTypes.length === 0) { context.reportError(`Union type ${union.name} must define one or more member types.`, [union.astNode, ...union.extensionASTNodes]); } - const includedTypeNames = new Set(); + const includedTypeNames = Object.create(null); for (const memberType of memberTypes) { - if (includedTypeNames.has(memberType.name)) { + if (includedTypeNames[memberType.name]) { context.reportError(`Union type ${union.name} can only include type ${memberType.name} once.`, getUnionMemberTypeNodes(union, memberType.name)); continue; } - includedTypeNames.add(memberType.name); + includedTypeNames[memberType.name] = true; if (!(0, _definition.isObjectType)(memberType)) { context.reportError(`Union type ${union.name} can only include Object types, ` + `it cannot include ${(0, _inspect.inspect)(memberType)}.`, getUnionMemberTypeNodes(union, String(memberType))); } @@ -34760,12 +33917,12 @@ function validateInputFields(context, inputObj) { const fields = Object.values(inputObj.getFields()); if (fields.length === 0) { context.reportError(`Input Object type ${inputObj.name} must define one or more fields.`, [inputObj.astNode, ...inputObj.extensionASTNodes]); - } - // Ensure the arguments are valid + } // Ensure the arguments are valid + for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); - // Ensure the type is an input type + validateName(context, field); // Ensure the type is an input type + if (!(0, _definition.isInputType)(field.type)) { var _field$astNode2; context.reportError(`The type of ${inputObj.name}.${field.name} must be Input Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode2 = field.astNode) === null || _field$astNode2 === void 0 ? void 0 : _field$astNode2.type); @@ -34792,20 +33949,20 @@ function createInputObjectCircularRefsValidator(context) { // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'. // Tracks already visited types to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedTypes = new Set(); - // Array of types nodes used to produce meaningful errors - const fieldPath = []; - // Position in the type path + const visitedTypes = Object.create(null); // Array of types nodes used to produce meaningful errors + + const fieldPath = []; // Position in the type path + const fieldPathIndexByTypeName = Object.create(null); - return detectCycleRecursive; - // This does a straight-forward DFS to find cycles. + return detectCycleRecursive; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. + function detectCycleRecursive(inputObj) { - if (visitedTypes.has(inputObj)) { + if (visitedTypes[inputObj.name]) { return; } - visitedTypes.add(inputObj); + visitedTypes[inputObj.name] = true; fieldPathIndexByTypeName[inputObj.name] = fieldPath.length; const fields = Object.values(inputObj.getFields()); for (const field of fields) { @@ -34831,11 +33988,13 @@ function getAllImplementsInterfaceNodes(type, iface) { astNode, extensionASTNodes } = type; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + return nodes.flatMap(typeNode => { var _typeNode$interfaces; - return /* c8 ignore next */(_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : []; + return /* c8 ignore next */( + (_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : [] + ); }).filter(ifaceNode => ifaceNode.name.value === iface.name); } function getUnionMemberTypeNodes(union, typeName) { @@ -34843,11 +34002,13 @@ function getUnionMemberTypeNodes(union, typeName) { astNode, extensionASTNodes } = union; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + return nodes.flatMap(unionNode => { var _unionNode$types; - return /* c8 ignore next */(_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : []; + return /* c8 ignore next */( + (_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : [] + ); }).filter(typeNode => typeNode.name.value === typeName); } function getDeprecatedDirectiveNode(definitionNode) { @@ -34874,12 +34035,14 @@ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); +var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); var _typeFromAST = __webpack_require__(/*! ./typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); /** * TypeInfo is a utility class which, given a GraphQL schema, can keep track * of the current field and type definitions at any point in a GraphQL document * AST during a recursive descent by calling `enter(node)` and `leave(node)`. */ + class TypeInfo { constructor(schema, /** @@ -34914,22 +34077,34 @@ class TypeInfo { return 'TypeInfo'; } getType() { - return this._typeStack.at(-1); + if (this._typeStack.length > 0) { + return this._typeStack[this._typeStack.length - 1]; + } } getParentType() { - return this._parentTypeStack.at(-1); + if (this._parentTypeStack.length > 0) { + return this._parentTypeStack[this._parentTypeStack.length - 1]; + } } getInputType() { - return this._inputTypeStack.at(-1); + if (this._inputTypeStack.length > 0) { + return this._inputTypeStack[this._inputTypeStack.length - 1]; + } } getParentInputType() { - return this._inputTypeStack.at(-2); + if (this._inputTypeStack.length > 1) { + return this._inputTypeStack[this._inputTypeStack.length - 2]; + } } getFieldDef() { - return this._fieldDefStack.at(-1); + if (this._fieldDefStack.length > 0) { + return this._fieldDefStack[this._fieldDefStack.length - 1]; + } } getDefaultValue() { - return this._defaultValueStack.at(-1); + if (this._defaultValueStack.length > 0) { + return this._defaultValueStack[this._defaultValueStack.length - 1]; + } } getDirective() { return this._directive; @@ -34941,11 +34116,11 @@ class TypeInfo { return this._enumValue; } enter(node) { - const schema = this._schema; - // Note: many of the types below are explicitly typed as "unknown" to drop + const schema = this._schema; // Note: many of the types below are explicitly typed as "unknown" to drop // any assumptions of a valid schema to ensure runtime types are properly // checked before continuing since TypeInfo is used as part of validation // which occurs before guarantees of schema and document validity. + switch (node.kind) { case _kinds.Kind.SELECTION_SET: { @@ -35011,8 +34186,8 @@ class TypeInfo { case _kinds.Kind.LIST: { const listType = (0, _definition.getNullableType)(this.getInputType()); - const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; - // List positions never have a default value. + const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; // List positions never have a default value. + this._defaultValueStack.push(undefined); this._inputTypeStack.push((0, _definition.isInputType)(itemType) ? itemType : undefined); break; @@ -35024,7 +34199,7 @@ class TypeInfo { let inputField; if ((0, _definition.isInputObjectType)(objectType)) { inputField = objectType.getFields()[node.name.value]; - if (inputField != null) { + if (inputField) { inputFieldType = inputField.type; } } @@ -35042,8 +34217,7 @@ class TypeInfo { this._enumValue = enumValue; break; } - default: - // Ignore other nodes + default: // Ignore other nodes } } leave(node) { @@ -35079,19 +34253,37 @@ class TypeInfo { case _kinds.Kind.ENUM: this._enumValue = null; break; - default: - // Ignore other nodes + default: // Ignore other nodes } } } + +/** + * Not exactly the same as the executor's definition of getFieldDef, in this + * statically evaluated environment we do not always have an Object type, + * and need to handle Interface and Union types. + */ exports.TypeInfo = TypeInfo; function getFieldDef(schema, parentType, fieldNode) { - return schema.getField(parentType, fieldNode.name.value); + const name = fieldNode.name.value; + if (name === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.SchemaMetaFieldDef; + } + if (name === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.TypeMetaFieldDef; + } + if (name === _introspection.TypeNameMetaFieldDef.name && (0, _definition.isCompositeType)(parentType)) { + return _introspection.TypeNameMetaFieldDef; + } + if ((0, _definition.isObjectType)(parentType) || (0, _definition.isInterfaceType)(parentType)) { + return parentType.getFields()[name]; + } } /** * Creates a new visitor instance which maintains a provided TypeInfo instance * along with visiting visitor. */ + function visitWithTypeInfo(typeInfo, visitor) { return { enter(...args) { @@ -35124,6 +34316,56 @@ function visitWithTypeInfo(typeInfo, visitor) { /***/ }), +/***/ "../../../node_modules/graphql/utilities/assertValidName.mjs": +/*!*******************************************************************!*\ + !*** ../../../node_modules/graphql/utilities/assertValidName.mjs ***! + \*******************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.assertValidName = assertValidName; +exports.isValidNameError = isValidNameError; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _assertName = __webpack_require__(/*! ../type/assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); +/* c8 ignore start */ + +/** + * Upholds the spec rules about naming. + * @deprecated Please use `assertName` instead. Will be removed in v17 + */ + +function assertValidName(name) { + const error = isValidNameError(name); + if (error) { + throw error; + } + return name; +} +/** + * Returns an Error if a name is invalid. + * @deprecated Please use `assertName` instead. Will be removed in v17 + */ + +function isValidNameError(name) { + typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); + if (name.startsWith('__')) { + return new _GraphQLError.GraphQLError(`Name "${name}" must not begin with "__", which is reserved by GraphQL introspection.`); + } + try { + (0, _assertName.assertName)(name); + } catch (error) { + return error; + } +} +/* c8 ignore stop */ + +/***/ }), + /***/ "../../../node_modules/graphql/utilities/astFromValue.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/utilities/astFromValue.mjs ***! @@ -35164,6 +34406,7 @@ var _scalars = __webpack_require__(/*! ../type/scalars.mjs */ "../../../node_mod * | null | NullValue | * */ + function astFromValue(value, type) { if ((0, _definition.isNonNullType)(type)) { const astValue = astFromValue(value, type.ofType); @@ -35171,19 +34414,19 @@ function astFromValue(value, type) { return null; } return astValue; - } - // only explicit null, not undefined, NaN + } // only explicit null, not undefined, NaN + if (value === null) { return { kind: _kinds.Kind.NULL }; - } - // undefined + } // undefined + if (value === undefined) { return null; - } - // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but + } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but // the value is not an array, convert the value using the list's item type. + if ((0, _definition.isListType)(type)) { const itemType = type.ofType; if ((0, _isIterableObject.isIterableObject)(value)) { @@ -35200,9 +34443,9 @@ function astFromValue(value, type) { }; } return astFromValue(value, itemType); - } - // Populate the fields of the input object by creating ASTs from each value + } // Populate the fields of the input object by creating ASTs from each value // in the JavaScript object according to the fields in the input type. + if ((0, _definition.isInputObjectType)(type)) { if (!(0, _isObjectLike.isObjectLike)(value)) { return null; @@ -35232,15 +34475,15 @@ function astFromValue(value, type) { const serialized = type.serialize(value); if (serialized == null) { return null; - } - // Others serialize based on their corresponding JavaScript scalar types. + } // Others serialize based on their corresponding JavaScript scalar types. + if (typeof serialized === 'boolean') { return { kind: _kinds.Kind.BOOLEAN, value: serialized }; - } - // JavaScript numbers can be Int or Float values. + } // JavaScript numbers can be Int or Float values. + if (typeof serialized === 'number' && Number.isFinite(serialized)) { const stringNum = String(serialized); return integerStringRegExp.test(stringNum) ? { @@ -35258,8 +34501,8 @@ function astFromValue(value, type) { kind: _kinds.Kind.ENUM, value: serialized }; - } - // ID types can use Int literals. + } // ID types can use Int literals. + if (type === _scalars.GraphQLID && integerStringRegExp.test(serialized)) { return { kind: _kinds.Kind.INT, @@ -35275,6 +34518,7 @@ function astFromValue(value, type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } /** @@ -35282,6 +34526,7 @@ function astFromValue(value, type) { * - NegativeSign? 0 * - NegativeSign? NonZeroDigit ( Digit+ )? */ + const integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/; /***/ }), @@ -35299,6 +34544,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.buildASTSchema = buildASTSchema; exports.buildSchema = buildSchema; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _parser = __webpack_require__(/*! ../language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modules/graphql/type/schema.mjs"); @@ -35315,6 +34562,7 @@ var _extendSchema = __webpack_require__(/*! ./extendSchema.mjs */ "../../../node * has no resolve methods, so execution will use default resolvers. */ function buildASTSchema(documentAST, options) { + documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDL)(documentAST); } @@ -35360,6 +34608,7 @@ function buildASTSchema(documentAST, options) { * A helper function to build a GraphQLSchema directly from a source * document. */ + function buildSchema(source, options) { const document = (0, _parser.parse)(source, { noLocation: options === null || options === void 0 ? void 0 : options.noLocation, @@ -35408,50 +34657,49 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node * This function expects a complete introspection result. Don't forget to check * the "errors" field of a server response before calling this function. */ + function buildClientSchema(introspection, options) { - // Even though the `introspection` argument is typed, in most cases it's received - // as an untyped value from the server, so we will do an additional check here. - (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); - // Get the schema from the introspection result. - const schemaIntrospection = introspection.__schema; - // Iterate through all types, getting the type definition for each. - const typeMap = new Map(schemaIntrospection.types.map(typeIntrospection => [typeIntrospection.name, buildType(typeIntrospection)])); - // Include standard types only if they are used. + (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); // Get the schema from the introspection result. + + const schemaIntrospection = introspection.__schema; // Iterate through all types, getting the type definition for each. + + const typeMap = (0, _keyValMap.keyValMap)(schemaIntrospection.types, typeIntrospection => typeIntrospection.name, typeIntrospection => buildType(typeIntrospection)); // Include standard types only if they are used. + for (const stdType of [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes]) { - if (typeMap.has(stdType.name)) { - typeMap.set(stdType.name, stdType); + if (typeMap[stdType.name]) { + typeMap[stdType.name] = stdType; } - } - // Get the root Query, Mutation, and Subscription types. - const queryType = schemaIntrospection.queryType != null ? getObjectType(schemaIntrospection.queryType) : null; - const mutationType = schemaIntrospection.mutationType != null ? getObjectType(schemaIntrospection.mutationType) : null; - const subscriptionType = schemaIntrospection.subscriptionType != null ? getObjectType(schemaIntrospection.subscriptionType) : null; - // Get the directives supported by Introspection, assuming empty-set if + } // Get the root Query, Mutation, and Subscription types. + + const queryType = schemaIntrospection.queryType ? getObjectType(schemaIntrospection.queryType) : null; + const mutationType = schemaIntrospection.mutationType ? getObjectType(schemaIntrospection.mutationType) : null; + const subscriptionType = schemaIntrospection.subscriptionType ? getObjectType(schemaIntrospection.subscriptionType) : null; // Get the directives supported by Introspection, assuming empty-set if // directives were not queried for. - const directives = schemaIntrospection.directives != null ? schemaIntrospection.directives.map(buildDirective) : []; - // Then produce and return a Schema with these types. + + const directives = schemaIntrospection.directives ? schemaIntrospection.directives.map(buildDirective) : []; // Then produce and return a Schema with these types. + return new _schema.GraphQLSchema({ description: schemaIntrospection.description, query: queryType, mutation: mutationType, subscription: subscriptionType, - types: [...typeMap.values()], + types: Object.values(typeMap), directives, assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid - }); - // Given a type reference in introspection, return the GraphQLType instance. + }); // Given a type reference in introspection, return the GraphQLType instance. // preferring cached instances before building new instances. + function getType(typeRef) { if (typeRef.kind === _introspection.TypeKind.LIST) { const itemRef = typeRef.ofType; - if (itemRef == null) { + if (!itemRef) { throw new Error('Decorated type deeper than introspection query.'); } return new _definition.GraphQLList(getType(itemRef)); } if (typeRef.kind === _introspection.TypeKind.NON_NULL) { const nullableRef = typeRef.ofType; - if (nullableRef == null) { + if (!nullableRef) { throw new Error('Decorated type deeper than introspection query.'); } const nullableType = getType(nullableRef); @@ -35464,8 +34712,8 @@ function buildClientSchema(introspection, options) { if (!typeName) { throw new Error(`Unknown type reference: ${(0, _inspect.inspect)(typeRef)}.`); } - const type = typeMap.get(typeName); - if (type == null) { + const type = typeMap[typeName]; + if (!type) { throw new Error(`Invalid or incomplete schema, unknown type: ${typeName}. Ensure that a full introspection query is used in order to build a client schema.`); } return type; @@ -35475,9 +34723,9 @@ function buildClientSchema(introspection, options) { } function getInterfaceType(typeRef) { return (0, _definition.assertInterfaceType)(getNamedType(typeRef)); - } - // Given a type's introspection result, construct the correct + } // Given a type's introspection result, construct the correct // GraphQLType instance. + function buildType(type) { // eslint-disable-next-line @typescript-eslint/prefer-optional-chain if (type != null && type.name != null && type.kind != null) { @@ -35514,7 +34762,7 @@ function buildClientSchema(introspection, options) { if (implementingIntrospection.interfaces === null && implementingIntrospection.kind === _introspection.TypeKind.INTERFACE) { return []; } - if (implementingIntrospection.interfaces == null) { + if (!implementingIntrospection.interfaces) { const implementingIntrospectionStr = (0, _inspect.inspect)(implementingIntrospection); throw new Error(`Introspection result missing interfaces: ${implementingIntrospectionStr}.`); } @@ -35537,7 +34785,7 @@ function buildClientSchema(introspection, options) { }); } function buildUnionDef(unionIntrospection) { - if (unionIntrospection.possibleTypes == null) { + if (!unionIntrospection.possibleTypes) { const unionIntrospectionStr = (0, _inspect.inspect)(unionIntrospection); throw new Error(`Introspection result missing possibleTypes: ${unionIntrospectionStr}.`); } @@ -35548,7 +34796,7 @@ function buildClientSchema(introspection, options) { }); } function buildEnumDef(enumIntrospection) { - if (enumIntrospection.enumValues == null) { + if (!enumIntrospection.enumValues) { const enumIntrospectionStr = (0, _inspect.inspect)(enumIntrospection); throw new Error(`Introspection result missing enumValues: ${enumIntrospectionStr}.`); } @@ -35562,7 +34810,7 @@ function buildClientSchema(introspection, options) { }); } function buildInputObjectDef(inputObjectIntrospection) { - if (inputObjectIntrospection.inputFields == null) { + if (!inputObjectIntrospection.inputFields) { const inputObjectIntrospectionStr = (0, _inspect.inspect)(inputObjectIntrospection); throw new Error(`Introspection result missing inputFields: ${inputObjectIntrospectionStr}.`); } @@ -35574,7 +34822,7 @@ function buildClientSchema(introspection, options) { }); } function buildFieldDefMap(typeIntrospection) { - if (typeIntrospection.fields == null) { + if (!typeIntrospection.fields) { throw new Error(`Introspection result missing fields: ${(0, _inspect.inspect)(typeIntrospection)}.`); } return (0, _keyValMap.keyValMap)(typeIntrospection.fields, fieldIntrospection => fieldIntrospection.name, buildField); @@ -35585,7 +34833,7 @@ function buildClientSchema(introspection, options) { const typeStr = (0, _inspect.inspect)(type); throw new Error(`Introspection must provide output type for fields, but received: ${typeStr}.`); } - if (fieldIntrospection.args == null) { + if (!fieldIntrospection.args) { const fieldIntrospectionStr = (0, _inspect.inspect)(fieldIntrospection); throw new Error(`Introspection result missing field args: ${fieldIntrospectionStr}.`); } @@ -35614,11 +34862,11 @@ function buildClientSchema(introspection, options) { }; } function buildDirective(directiveIntrospection) { - if (directiveIntrospection.args == null) { + if (!directiveIntrospection.args) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive args: ${directiveIntrospectionStr}.`); } - if (directiveIntrospection.locations == null) { + if (!directiveIntrospection.locations) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive locations: ${directiveIntrospectionStr}.`); } @@ -35689,8 +34937,8 @@ function coerceInputValueImpl(inputValue, type, onError, path) { const itemPath = (0, _Path.addPath)(path, index, undefined); return coerceInputValueImpl(itemValue, itemType, onError, itemPath); }); - } - // Lists accept a non-list value as a list of one. + } // Lists accept a non-list value as a list of one. + return [coerceInputValueImpl(inputValue, itemType, onError, path)]; } if ((0, _definition.isInputObjectType)(type)) { @@ -35712,10 +34960,10 @@ function coerceInputValueImpl(inputValue, type, onError, path) { continue; } coercedValue[field.name] = coerceInputValueImpl(fieldValue, field.type, onError, (0, _Path.addPath)(path, field.name, type.name)); - } - // Ensure every provided field is defined. + } // Ensure every provided field is defined. + for (const fieldName of Object.keys(inputValue)) { - if (fieldDefs[fieldName] == null) { + if (!fieldDefs[fieldName]) { const suggestions = (0, _suggestionList.suggestionList)(fieldName, Object.keys(type.getFields())); onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError(`Field "${fieldName}" is not defined by type "${type.name}".` + (0, _didYouMean.didYouMean)(suggestions))); } @@ -35734,10 +34982,10 @@ function coerceInputValueImpl(inputValue, type, onError, path) { return coercedValue; } if ((0, _definition.isLeafType)(type)) { - let parseResult; - // Scalars and Enums determine if an input value is valid via parseValue(), + let parseResult; // Scalars and Enums determine if a input value is valid via parseValue(), // which can throw to indicate failure. If it throws, maintain a reference // to the original error. + try { parseResult = type.parseValue(inputValue); } catch (error) { @@ -35757,6 +35005,7 @@ function coerceInputValueImpl(inputValue, type, onError, path) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } @@ -35780,6 +35029,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * concatenate the ASTs together into batched AST, useful for validating many * GraphQL source files which together represent one conceptual application. */ + function concatAST(documents) { const definitions = []; for (const doc of documents) { @@ -35806,11 +35056,13 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.extendSchema = extendSchema; exports.extendSchemaImpl = extendSchemaImpl; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +var _predicates = __webpack_require__(/*! ../language/predicates.mjs */ "../../../node_modules/graphql/language/predicates.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); @@ -35833,6 +35085,7 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node */ function extendSchema(schema, documentAST, options) { (0, _schema.assertSchema)(schema); + documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDLExtension)(documentAST, schema); } @@ -35843,77 +35096,47 @@ function extendSchema(schema, documentAST, options) { /** * @internal */ + function extendSchemaImpl(schemaConfig, documentAST, options) { - var _schemaDef$descriptio, _schemaDef, _schemaDef$descriptio2, _schemaDef2, _options$assumeValid; + var _schemaDef, _schemaDef$descriptio, _schemaDef2, _options$assumeValid; + // Collect the type definitions and extensions found in the document. const typeDefs = []; - const scalarExtensions = new _AccumulatorMap.AccumulatorMap(); - const objectExtensions = new _AccumulatorMap.AccumulatorMap(); - const interfaceExtensions = new _AccumulatorMap.AccumulatorMap(); - const unionExtensions = new _AccumulatorMap.AccumulatorMap(); - const enumExtensions = new _AccumulatorMap.AccumulatorMap(); - const inputObjectExtensions = new _AccumulatorMap.AccumulatorMap(); - // New directives and types are separate because a directives and types can + const typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can // have the same name. For example, a type named "skip". + const directiveDefs = []; - let schemaDef; - // Schema extensions are collected which may add additional operation types. + let schemaDef; // Schema extensions are collected which may add additional operation types. + const schemaExtensions = []; - let isSchemaChanged = false; for (const def of documentAST.definitions) { - switch (def.kind) { - case _kinds.Kind.SCHEMA_DEFINITION: - schemaDef = def; - break; - case _kinds.Kind.SCHEMA_EXTENSION: - schemaExtensions.push(def); - break; - case _kinds.Kind.DIRECTIVE_DEFINITION: - directiveDefs.push(def); - break; - // Type Definitions - case _kinds.Kind.SCALAR_TYPE_DEFINITION: - case _kinds.Kind.OBJECT_TYPE_DEFINITION: - case _kinds.Kind.INTERFACE_TYPE_DEFINITION: - case _kinds.Kind.UNION_TYPE_DEFINITION: - case _kinds.Kind.ENUM_TYPE_DEFINITION: - case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: - typeDefs.push(def); - break; - // Type System Extensions - case _kinds.Kind.SCALAR_TYPE_EXTENSION: - scalarExtensions.add(def.name.value, def); - break; - case _kinds.Kind.OBJECT_TYPE_EXTENSION: - objectExtensions.add(def.name.value, def); - break; - case _kinds.Kind.INTERFACE_TYPE_EXTENSION: - interfaceExtensions.add(def.name.value, def); - break; - case _kinds.Kind.UNION_TYPE_EXTENSION: - unionExtensions.add(def.name.value, def); - break; - case _kinds.Kind.ENUM_TYPE_EXTENSION: - enumExtensions.add(def.name.value, def); - break; - case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: - inputObjectExtensions.add(def.name.value, def); - break; - default: - continue; + if (def.kind === _kinds.Kind.SCHEMA_DEFINITION) { + schemaDef = def; + } else if (def.kind === _kinds.Kind.SCHEMA_EXTENSION) { + schemaExtensions.push(def); + } else if ((0, _predicates.isTypeDefinitionNode)(def)) { + typeDefs.push(def); + } else if ((0, _predicates.isTypeExtensionNode)(def)) { + const extendedTypeName = def.name.value; + const existingTypeExtensions = typeExtensionsMap[extendedTypeName]; + typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def]; + } else if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { + directiveDefs.push(def); } - isSchemaChanged = true; - } - // If this document contains no new types, extensions, or directives then + } // If this document contains no new types, extensions, or directives then // return the same unmodified GraphQLSchema instance. - if (!isSchemaChanged) { + + if (Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null) { return schemaConfig; } - const typeMap = new Map(schemaConfig.types.map(type => [type.name, extendNamedType(type)])); + const typeMap = Object.create(null); + for (const existingType of schemaConfig.types) { + typeMap[existingType.name] = extendNamedType(existingType); + } for (const typeNode of typeDefs) { - var _stdTypeMap$get; + var _stdTypeMap$name; const name = typeNode.name.value; - typeMap.set(name, (_stdTypeMap$get = stdTypeMap.get(name)) !== null && _stdTypeMap$get !== void 0 ? _stdTypeMap$get : buildType(typeNode)); + typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode); } const operationTypes = { // Get the extended root operation types. @@ -35923,20 +35146,20 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // Then, incorporate schema definition and all schema extensions. ...(schemaDef && getOperationTypes([schemaDef])), ...getOperationTypes(schemaExtensions) - }; - // Then produce and return a Schema config with these types. + }; // Then produce and return a Schema config with these types. + return { - description: (_schemaDef$descriptio = (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio2 = _schemaDef.description) === null || _schemaDef$descriptio2 === void 0 ? void 0 : _schemaDef$descriptio2.value) !== null && _schemaDef$descriptio !== void 0 ? _schemaDef$descriptio : schemaConfig.description, + description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value, ...operationTypes, - types: Array.from(typeMap.values()), + types: Object.values(typeMap), directives: [...schemaConfig.directives.map(replaceDirective), ...directiveDefs.map(buildDirective)], - extensions: schemaConfig.extensions, + extensions: Object.create(null), astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode, extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions), assumeValid: (_options$assumeValid = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _options$assumeValid !== void 0 ? _options$assumeValid : false - }; - // Below are functions used for producing this schema that have closed over + }; // Below are functions used for producing this schema that have closed over // this scope and have access to the schema, cache, and newly defined types. + function replaceType(type) { if ((0, _definition.isListType)(type)) { // @ts-expect-error @@ -35945,21 +35168,17 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } - // @ts-expect-error FIXME + } // @ts-expect-error FIXME + return replaceNamedType(type); } function replaceNamedType(type) { // Note: While this could make early assertions to get the correctly // typed values, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. - return typeMap.get(type.name); + return typeMap[type.name]; } function replaceDirective(directive) { - if ((0, _directives.isSpecifiedDirective)(directive)) { - // Builtin directives are not extended. - return directive; - } const config = directive.toConfig(); return new _directives.GraphQLDirective({ ...config, @@ -35991,12 +35210,13 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } /* c8 ignore next 3 */ // Not reachable, all possible type definition nodes have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extendInputObjectType(type) { - var _inputObjectExtension; + var _typeExtensionsMap$co; const config = type.toConfig(); - const extensions = (_inputObjectExtension = inputObjectExtensions.get(config.name)) !== null && _inputObjectExtension !== void 0 ? _inputObjectExtension : []; + const extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : []; return new _definition.GraphQLInputObjectType({ ...config, fields: () => ({ @@ -36010,9 +35230,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendEnumType(type) { - var _enumExtensions$get; + var _typeExtensionsMap$ty; const config = type.toConfig(); - const extensions = (_enumExtensions$get = enumExtensions.get(type.name)) !== null && _enumExtensions$get !== void 0 ? _enumExtensions$get : []; + const extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : []; return new _definition.GraphQLEnumType({ ...config, values: { @@ -36023,9 +35243,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendScalarType(type) { - var _scalarExtensions$get; + var _typeExtensionsMap$co2; const config = type.toConfig(); - const extensions = (_scalarExtensions$get = scalarExtensions.get(config.name)) !== null && _scalarExtensions$get !== void 0 ? _scalarExtensions$get : []; + const extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : []; let specifiedByURL = config.specifiedByURL; for (const extensionNode of extensions) { var _getSpecifiedByURL; @@ -36038,9 +35258,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendObjectType(type) { - var _objectExtensions$get; + var _typeExtensionsMap$co3; const config = type.toConfig(); - const extensions = (_objectExtensions$get = objectExtensions.get(config.name)) !== null && _objectExtensions$get !== void 0 ? _objectExtensions$get : []; + const extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : []; return new _definition.GraphQLObjectType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -36052,9 +35272,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendInterfaceType(type) { - var _interfaceExtensions$; + var _typeExtensionsMap$co4; const config = type.toConfig(); - const extensions = (_interfaceExtensions$ = interfaceExtensions.get(config.name)) !== null && _interfaceExtensions$ !== void 0 ? _interfaceExtensions$ : []; + const extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : []; return new _definition.GraphQLInterfaceType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -36066,9 +35286,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendUnionType(type) { - var _unionExtensions$get; + var _typeExtensionsMap$co5; const config = type.toConfig(); - const extensions = (_unionExtensions$get = unionExtensions.get(config.name)) !== null && _unionExtensions$get !== void 0 ? _unionExtensions$get : []; + const extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : []; return new _definition.GraphQLUnionType({ ...config, types: () => [...type.getTypes().map(replaceNamedType), ...buildUnionTypes(extensions)], @@ -36092,8 +35312,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const opTypes = {}; for (const node of nodes) { var _node$operationTypes; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const operationTypesNodes = /* c8 ignore next */(_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; + const operationTypesNodes = /* c8 ignore next */ + (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { // Note: While this could make early assertions to get the correctly // typed values below, that would throw immediately while type system @@ -36105,9 +35327,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { return opTypes; } function getNamedType(node) { - var _stdTypeMap$get2; + var _stdTypeMap$name2; const name = node.name.value; - const type = (_stdTypeMap$get2 = stdTypeMap.get(name)) !== null && _stdTypeMap$get2 !== void 0 ? _stdTypeMap$get2 : typeMap.get(name); + const type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name]; if (type === undefined) { throw new Error(`Unknown type: "${name}".`); } @@ -36140,8 +35362,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const fieldConfigMap = Object.create(null); for (const node of nodes) { var _node$fields; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const nodeFields = /* c8 ignore next */(_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; + const nodeFields = /* c8 ignore next */ + (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; for (const field of nodeFields) { var _field$description; fieldConfigMap[field.name.value] = { @@ -36160,10 +35384,12 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } function buildArgumentMap(args) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const argsNodes = /* c8 ignore next */args !== null && args !== void 0 ? args : []; + const argsNodes = /* c8 ignore next */ + args !== null && args !== void 0 ? args : []; const argConfigMap = Object.create(null); for (const arg of argsNodes) { var _arg$description; + // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -36182,10 +35408,13 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const inputFieldMap = Object.create(null); for (const node of nodes) { var _node$fields2; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const fieldsNodes = /* c8 ignore next */(_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; + const fieldsNodes = /* c8 ignore next */ + (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; for (const field of fieldsNodes) { var _field$description2; + // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -36205,8 +35434,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const enumValueMap = Object.create(null); for (const node of nodes) { var _node$values; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const valuesNodes = /* c8 ignore next */(_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; + const valuesNodes = /* c8 ignore next */ + (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; for (const value of valuesNodes) { var _value$description; enumValueMap[value.name.value] = { @@ -36227,7 +35458,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$interfaces$map, _node$interfaces; - return /* c8 ignore next */(_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : []; + return /* c8 ignore next */( + (_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : [] + ); }); } function buildUnionTypes(nodes) { @@ -36239,16 +35472,19 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$types$map, _node$types; - return /* c8 ignore next */(_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : []; + return /* c8 ignore next */( + (_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : [] + ); }); } function buildType(astNode) { + var _typeExtensionsMap$na; const name = astNode.name.value; + const extensionASTNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : []; switch (astNode.kind) { case _kinds.Kind.OBJECT_TYPE_DEFINITION: { - var _objectExtensions$get2, _astNode$description; - const extensionASTNodes = (_objectExtensions$get2 = objectExtensions.get(name)) !== null && _objectExtensions$get2 !== void 0 ? _objectExtensions$get2 : []; + var _astNode$description; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLObjectType({ name, @@ -36261,8 +35497,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INTERFACE_TYPE_DEFINITION: { - var _interfaceExtensions$2, _astNode$description2; - const extensionASTNodes = (_interfaceExtensions$2 = interfaceExtensions.get(name)) !== null && _interfaceExtensions$2 !== void 0 ? _interfaceExtensions$2 : []; + var _astNode$description2; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInterfaceType({ name, @@ -36275,8 +35510,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.ENUM_TYPE_DEFINITION: { - var _enumExtensions$get2, _astNode$description3; - const extensionASTNodes = (_enumExtensions$get2 = enumExtensions.get(name)) !== null && _enumExtensions$get2 !== void 0 ? _enumExtensions$get2 : []; + var _astNode$description3; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLEnumType({ name, @@ -36288,8 +35522,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.UNION_TYPE_DEFINITION: { - var _unionExtensions$get2, _astNode$description4; - const extensionASTNodes = (_unionExtensions$get2 = unionExtensions.get(name)) !== null && _unionExtensions$get2 !== void 0 ? _unionExtensions$get2 : []; + var _astNode$description4; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLUnionType({ name, @@ -36301,8 +35534,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.SCALAR_TYPE_DEFINITION: { - var _scalarExtensions$get2, _astNode$description5; - const extensionASTNodes = (_scalarExtensions$get2 = scalarExtensions.get(name)) !== null && _scalarExtensions$get2 !== void 0 ? _scalarExtensions$get2 : []; + var _astNode$description5; return new _definition.GraphQLScalarType({ name, description: (_astNode$description5 = astNode.description) === null || _astNode$description5 === void 0 ? void 0 : _astNode$description5.value, @@ -36313,8 +35545,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: { - var _inputObjectExtension2, _astNode$description6; - const extensionASTNodes = (_inputObjectExtension2 = inputObjectExtensions.get(name)) !== null && _inputObjectExtension2 !== void 0 ? _inputObjectExtension2 : []; + var _astNode$description6; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInputObjectType({ name, @@ -36328,27 +35559,30 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } } } -const stdTypeMap = new Map([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => [type.name, type])); +const stdTypeMap = (0, _keyMap.keyMap)([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes], type => type.name); /** * Given a field or enum value node, returns the string value for the * deprecation reason. */ + function getDeprecationReason(node) { - const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); - // @ts-expect-error validated by `getDirectiveValues` + const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); // @ts-expect-error validated by `getDirectiveValues` + return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason; } /** * Given a scalar node, returns the string value for the specifiedByURL. */ + function getSpecifiedByURL(node) { - const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); - // @ts-expect-error validated by `getDirectiveValues` + const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); // @ts-expect-error validated by `getDirectiveValues` + return specifiedBy === null || specifiedBy === void 0 ? void 0 : specifiedBy.url; } /** * Given an input object node, returns if the node should be OneOf. */ + function isOneOf(node) { return Boolean((0, _values.getDirectiveValues)(_directives.GraphQLOneOfDirective, node)); } @@ -36417,6 +35651,7 @@ function findBreakingChanges(oldSchema, newSchema) { * Given two schemas, returns an Array containing descriptions of all the types * of potentially dangerous changes covered by the other functions down below. */ + function findDangerousChanges(oldSchema, newSchema) { // @ts-expect-error return findSchemaChanges(oldSchema, newSchema).filter(change => change.type in DangerousChangeType); @@ -36685,8 +35920,8 @@ function isChangeSafeForInputObjectFieldOrFieldArg(oldType, newType) { // moving from non-null to nullable of the same underlying type is safe !(0, _definition.isNonNullType)(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType) ); - } - // if they're both named types, see if their names are equivalent + } // if they're both named types, see if their names are equivalent + return (0, _definition.isNamedType)(newType) && oldType.name === newType.name; } function typeKindName(type) { @@ -36710,6 +35945,7 @@ function typeKindName(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function stringifyValue(value, type) { @@ -36912,6 +36148,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * name. If a name is not provided, an operation is only returned if only one is * provided in the document. */ + function getOperationAST(documentAST, operationName) { let operation = null; for (const definition of documentAST.definitions) { @@ -36935,6 +36172,59 @@ function getOperationAST(documentAST, operationName) { /***/ }), +/***/ "../../../node_modules/graphql/utilities/getOperationRootType.mjs": +/*!************************************************************************!*\ + !*** ../../../node_modules/graphql/utilities/getOperationRootType.mjs ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getOperationRootType = getOperationRootType; +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +/** + * Extracts the root type of the operation from the schema. + * + * @deprecated Please use `GraphQLSchema.getRootType` instead. Will be removed in v17 + */ +function getOperationRootType(schema, operation) { + if (operation.operation === 'query') { + const queryType = schema.getQueryType(); + if (!queryType) { + throw new _GraphQLError.GraphQLError('Schema does not define the required query root type.', { + nodes: operation + }); + } + return queryType; + } + if (operation.operation === 'mutation') { + const mutationType = schema.getMutationType(); + if (!mutationType) { + throw new _GraphQLError.GraphQLError('Schema is not configured for mutations.', { + nodes: operation + }); + } + return mutationType; + } + if (operation.operation === 'subscription') { + const subscriptionType = schema.getSubscriptionType(); + if (!subscriptionType) { + throw new _GraphQLError.GraphQLError('Schema is not configured for subscriptions.', { + nodes: operation + }); + } + return subscriptionType; + } + throw new _GraphQLError.GraphQLError('Can only have query, mutation and subscription operations.', { + nodes: operation + }); +} + +/***/ }), + /***/ "../../../node_modules/graphql/utilities/index.mjs": /*!*********************************************************!*\ !*** ../../../node_modules/graphql/utilities/index.mjs ***! @@ -36964,6 +36254,12 @@ Object.defineProperty(exports, "TypeInfo", ({ return _TypeInfo.TypeInfo; } })); +Object.defineProperty(exports, "assertValidName", ({ + enumerable: true, + get: function () { + return _assertValidName.assertValidName; + } +})); Object.defineProperty(exports, "astFromValue", ({ enumerable: true, get: function () { @@ -37036,6 +36332,12 @@ Object.defineProperty(exports, "getOperationAST", ({ return _getOperationAST.getOperationAST; } })); +Object.defineProperty(exports, "getOperationRootType", ({ + enumerable: true, + get: function () { + return _getOperationRootType.getOperationRootType; + } +})); Object.defineProperty(exports, "introspectionFromSchema", ({ enumerable: true, get: function () { @@ -37054,18 +36356,18 @@ Object.defineProperty(exports, "isTypeSubTypeOf", ({ return _typeComparators.isTypeSubTypeOf; } })); +Object.defineProperty(exports, "isValidNameError", ({ + enumerable: true, + get: function () { + return _assertValidName.isValidNameError; + } +})); Object.defineProperty(exports, "lexicographicSortSchema", ({ enumerable: true, get: function () { return _lexicographicSortSchema.lexicographicSortSchema; } })); -Object.defineProperty(exports, "printDirective", ({ - enumerable: true, - get: function () { - return _printSchema.printDirective; - } -})); Object.defineProperty(exports, "printIntrospectionSchema", ({ enumerable: true, get: function () { @@ -37122,6 +36424,7 @@ Object.defineProperty(exports, "visitWithTypeInfo", ({ })); var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs */ "../../../node_modules/graphql/utilities/getIntrospectionQuery.mjs"); var _getOperationAST = __webpack_require__(/*! ./getOperationAST.mjs */ "../../../node_modules/graphql/utilities/getOperationAST.mjs"); +var _getOperationRootType = __webpack_require__(/*! ./getOperationRootType.mjs */ "../../../node_modules/graphql/utilities/getOperationRootType.mjs"); var _introspectionFromSchema = __webpack_require__(/*! ./introspectionFromSchema.mjs */ "../../../node_modules/graphql/utilities/introspectionFromSchema.mjs"); var _buildClientSchema = __webpack_require__(/*! ./buildClientSchema.mjs */ "../../../node_modules/graphql/utilities/buildClientSchema.mjs"); var _buildASTSchema = __webpack_require__(/*! ./buildASTSchema.mjs */ "../../../node_modules/graphql/utilities/buildASTSchema.mjs"); @@ -37138,6 +36441,7 @@ var _concatAST = __webpack_require__(/*! ./concatAST.mjs */ "../../../node_modul var _separateOperations = __webpack_require__(/*! ./separateOperations.mjs */ "../../../node_modules/graphql/utilities/separateOperations.mjs"); var _stripIgnoredCharacters = __webpack_require__(/*! ./stripIgnoredCharacters.mjs */ "../../../node_modules/graphql/utilities/stripIgnoredCharacters.mjs"); var _typeComparators = __webpack_require__(/*! ./typeComparators.mjs */ "../../../node_modules/graphql/utilities/typeComparators.mjs"); +var _assertValidName = __webpack_require__(/*! ./assertValidName.mjs */ "../../../node_modules/graphql/utilities/assertValidName.mjs"); var _findBreakingChanges = __webpack_require__(/*! ./findBreakingChanges.mjs */ "../../../node_modules/graphql/utilities/findBreakingChanges.mjs"); /***/ }), @@ -37167,6 +36471,7 @@ var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs * This is the inverse of buildClientSchema. The primary use case is outside * of the server context, for instance when doing schema comparisons. */ + function introspectionFromSchema(schema, options) { const optionsWithDefaults = { specifiedByUrl: true, @@ -37181,7 +36486,7 @@ function introspectionFromSchema(schema, options) { schema, document }); - result.errors == null && result.data != null || (0, _invariant.invariant)(false); + !result.errors && result.data || (0, _invariant.invariant)(false); return result.data; } @@ -37201,6 +36506,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.lexicographicSortSchema = lexicographicSortSchema; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _naturalCompare = __webpack_require__(/*! ../jsutils/naturalCompare.mjs */ "../../../node_modules/graphql/jsutils/naturalCompare.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -37211,12 +36517,13 @@ var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modul * * This function returns a sorted copy of the given GraphQLSchema. */ + function lexicographicSortSchema(schema) { const schemaConfig = schema.toConfig(); - const typeMap = new Map(sortByName(schemaConfig.types).map(type => [type.name, sortNamedType(type)])); + const typeMap = (0, _keyValMap.keyValMap)(sortByName(schemaConfig.types), type => type.name, sortNamedType); return new _schema.GraphQLSchema({ ...schemaConfig, - types: Array.from(typeMap.values()), + types: Object.values(typeMap), directives: sortByName(schemaConfig.directives).map(sortDirective), query: replaceMaybeType(schemaConfig.query), mutation: replaceMaybeType(schemaConfig.mutation), @@ -37229,12 +36536,12 @@ function lexicographicSortSchema(schema) { } else if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } - // @ts-expect-error FIXME: TS Conversion + } // @ts-expect-error FIXME: TS Conversion + return replaceNamedType(type); } function replaceNamedType(type) { - return typeMap.get(type.name); + return typeMap[type.name]; } function replaceMaybeType(maybeType) { return maybeType && replaceNamedType(maybeType); @@ -37312,6 +36619,7 @@ function lexicographicSortSchema(schema) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } } @@ -37346,7 +36654,6 @@ function sortBy(array, mapToKey) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.printDirective = printDirective; exports.printIntrospectionSchema = printIntrospectionSchema; exports.printSchema = printSchema; exports.printType = printType; @@ -37375,19 +36682,23 @@ function printFilteredSchema(schema, directiveFilter, typeFilter) { return [printSchemaDefinition(schema), ...directives.map(directive => printDirective(directive)), ...types.map(type => printType(type))].filter(Boolean).join('\n\n'); } function printSchemaDefinition(schema) { - const queryType = schema.getQueryType(); - const mutationType = schema.getMutationType(); - const subscriptionType = schema.getSubscriptionType(); - // Special case: When a schema has no root operation types, no valid schema - // definition can be printed. - if (!queryType && !mutationType && !subscriptionType) { + if (schema.description == null && isSchemaOfCommonNames(schema)) { return; } - // Only print a schema definition if there is a description or if it should - // not be omitted because of having default type names. - if (schema.description != null || !hasDefaultRootOperationTypes(schema)) { - return printDescription(schema) + 'schema {\n' + (queryType ? ` query: ${queryType.name}\n` : '') + (mutationType ? ` mutation: ${mutationType.name}\n` : '') + (subscriptionType ? ` subscription: ${subscriptionType.name}\n` : '') + '}'; + const operationTypes = []; + const queryType = schema.getQueryType(); + if (queryType) { + operationTypes.push(` query: ${queryType.name}`); } + const mutationType = schema.getMutationType(); + if (mutationType) { + operationTypes.push(` mutation: ${mutationType.name}`); + } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType) { + operationTypes.push(` subscription: ${subscriptionType.name}`); + } + return printDescription(schema) + `schema {\n${operationTypes.join('\n')}\n}`; } /** * GraphQL schema define root types for each type of operation. These types are @@ -37402,16 +36713,23 @@ function printSchemaDefinition(schema) { * } * ``` * - * When using this naming convention, the schema description can be omitted so - * long as these names are only used for operation types. - * - * Note however that if any of these default names are used elsewhere in the - * schema but not as a root operation type, the schema definition must still - * be printed to avoid ambiguity. + * When using this naming convention, the schema description can be omitted. */ -function hasDefaultRootOperationTypes(schema) { - /* eslint-disable eqeqeq */ - return schema.getQueryType() == schema.getType('Query') && schema.getMutationType() == schema.getType('Mutation') && schema.getSubscriptionType() == schema.getType('Subscription'); + +function isSchemaOfCommonNames(schema) { + const queryType = schema.getQueryType(); + if (queryType && queryType.name !== 'Query') { + return false; + } + const mutationType = schema.getMutationType(); + if (mutationType && mutationType.name !== 'Mutation') { + return false; + } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType && subscriptionType.name !== 'Subscription') { + return false; + } + return true; } function printType(type) { if ((0, _definition.isScalarType)(type)) { @@ -37434,6 +36752,7 @@ function printType(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function printScalar(type) { @@ -37472,9 +36791,9 @@ function printBlock(items) { function printArgs(args, indentation = '') { if (args.length === 0) { return ''; - } - // If every arg does not have a description, print them on one line. - if (args.every(arg => arg.description == null)) { + } // If every arg does not have a description, print them on one line. + + if (args.every(arg => !arg.description)) { return '(' + args.map(printInputValue).join(', ') + ')'; } return '(\n' + args.map((arg, i) => printDescription(arg, ' ' + indentation, !i) + ' ' + indentation + printInputValue(arg)).join('\n') + '\n' + indentation + ')'; @@ -37526,7 +36845,7 @@ function printDescription(def, indentation = '', firstInBlock = true) { block: (0, _blockString.isPrintableAsBlockString)(description) }); const prefix = indentation && !firstInBlock ? '\n' + indentation : indentation; - return prefix + blockString.replaceAll('\n', '\n' + indentation) + '\n'; + return prefix + blockString.replace(/\n/g, '\n' + indentation) + '\n'; } /***/ }), @@ -37551,10 +36870,11 @@ var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node * which contains a single operation as well the fragment definitions it * refers to. */ + function separateOperations(documentAST) { const operations = []; - const depGraph = Object.create(null); - // Populate metadata and build a dependency graph. + const depGraph = Object.create(null); // Populate metadata and build a dependency graph. + for (const definitionNode of documentAST.definitions) { switch (definitionNode.kind) { case _kinds.Kind.OPERATION_DEFINITION: @@ -37563,22 +36883,21 @@ function separateOperations(documentAST) { case _kinds.Kind.FRAGMENT_DEFINITION: depGraph[definitionNode.name.value] = collectDependencies(definitionNode.selectionSet); break; - default: - // ignore non-executable definitions + default: // ignore non-executable definitions } - } - // For each operation, produce a new synthesized AST which includes only what + } // For each operation, produce a new synthesized AST which includes only what // is necessary for completing that operation. + const separatedDocumentASTs = Object.create(null); for (const operation of operations) { const dependencies = new Set(); for (const fragmentName of collectDependencies(operation.selectionSet)) { collectTransitiveDependencies(dependencies, depGraph, fragmentName); - } - // Provides the empty string for anonymous operations. - const operationName = operation.name ? operation.name.value : ''; - // The list of definition nodes to be included for this operation, sorted + } // Provides the empty string for anonymous operations. + + const operationName = operation.name ? operation.name.value : ''; // The list of definition nodes to be included for this operation, sorted // to retain the same order as the original document. + separatedDocumentASTs[operationName] = { kind: _kinds.Kind.DOCUMENT, definitions: documentAST.definitions.filter(node => node === operation || node.kind === _kinds.Kind.FRAGMENT_DEFINITION && dependencies.has(node.name.value)) @@ -37586,6 +36905,7 @@ function separateOperations(documentAST) { } return separatedDocumentASTs; } + // From a dependency graph, collects a list of transitive dependencies by // recursing through a dependency graph. function collectTransitiveDependencies(collected, depGraph, fromName) { @@ -37632,6 +36952,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * * @internal */ + function sortValueNode(valueNode) { switch (valueNode.kind) { case _kinds.Kind.OBJECT: @@ -37739,6 +37060,7 @@ var _tokenKind = __webpack_require__(/*! ../language/tokenKind.mjs */ "../../../ * """Type description""" type Foo{"""Field description""" bar:String} * ``` */ + function stripIgnoredCharacters(source) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); const body = sourceObj.body; @@ -37753,6 +37075,7 @@ function stripIgnoredCharacters(source) { * Also prevent case of non-punctuator token following by spread resulting * in invalid token (e.g. `1...` is invalid Float token). */ + const isNonPunctuator = !(0, _lexer.isPunctuatorTokenKind)(currentToken.kind); if (wasLastAddedTokenNonPunctuator) { if (isNonPunctuator || currentToken.kind === _tokenKind.TokenKind.SPREAD) { @@ -37796,28 +37119,29 @@ function isEqualType(typeA, typeB) { // Equivalent types are equal. if (typeA === typeB) { return true; - } - // If either type is non-null, the other must also be non-null. + } // If either type is non-null, the other must also be non-null. + if ((0, _definition.isNonNullType)(typeA) && (0, _definition.isNonNullType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } - // If either type is a list, the other must also be a list. + } // If either type is a list, the other must also be a list. + if ((0, _definition.isListType)(typeA) && (0, _definition.isListType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } - // Otherwise the types are not equal. + } // Otherwise the types are not equal. + return false; } /** * Provided a type and a super type, return true if the first type is either * equal or a subset of the second super type (covariant). */ + function isTypeSubTypeOf(schema, maybeSubType, superType) { // Equivalent type is a valid subtype if (maybeSubType === superType) { return true; - } - // If superType is non-null, maybeSubType must also be non-null. + } // If superType is non-null, maybeSubType must also be non-null. + if ((0, _definition.isNonNullType)(superType)) { if ((0, _definition.isNonNullType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37827,8 +37151,8 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isNonNullType)(maybeSubType)) { // If superType is nullable, maybeSubType may be non-null or nullable. return isTypeSubTypeOf(schema, maybeSubType.ofType, superType); - } - // If superType type is a list, maybeSubType type must also be a list. + } // If superType type is a list, maybeSubType type must also be a list. + if ((0, _definition.isListType)(superType)) { if ((0, _definition.isListType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37838,9 +37162,9 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isListType)(maybeSubType)) { // If superType is not a list, maybeSubType must also be not a list. return false; - } - // If superType type is an abstract type, check if it is super type of maybeSubType. + } // If superType type is an abstract type, check if it is super type of maybeSubType. // Otherwise, the child type is not a valid subtype of the parent type. + return (0, _definition.isAbstractType)(superType) && ((0, _definition.isInterfaceType)(maybeSubType) || (0, _definition.isObjectType)(maybeSubType)) && schema.isSubType(superType, maybeSubType); } /** @@ -37852,6 +37176,7 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { * * This function is commutative. */ + function doTypesOverlap(schema, typeA, typeB) { // Equivalent types overlap if (typeA === typeB) { @@ -37862,15 +37187,15 @@ function doTypesOverlap(schema, typeA, typeB) { // If both types are abstract, then determine if there is any intersection // between possible concrete types of each. return schema.getPossibleTypes(typeA).some(type => schema.isSubType(typeB, type)); - } - // Determine if the latter type is a possible concrete type of the former. + } // Determine if the latter type is a possible concrete type of the former. + return schema.isSubType(typeA, typeB); } if ((0, _definition.isAbstractType)(typeB)) { // Determine if the former type is a possible concrete type of the latter. return schema.isSubType(typeB, typeA); - } - // Otherwise the types do not overlap. + } // Otherwise the types do not overlap. + return false; } @@ -37923,6 +37248,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.valueFromAST = valueFromAST; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); /** @@ -37945,6 +37271,7 @@ var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../no * | NullValue | null | * */ + function valueFromAST(valueNode, type, variables) { if (!valueNode) { // When there is no node, then there is also no value. @@ -37960,10 +37287,10 @@ function valueFromAST(valueNode, type, variables) { const variableValue = variables[variableName]; if (variableValue === null && (0, _definition.isNonNullType)(type)) { return; // Invalid: intentionally return no value. - } - // Note: This does no further checking that this variable is correct. + } // Note: This does no further checking that this variable is correct. // This assumes that this query has been validated and the variable // usage here is of the correct type. + return variableValue; } if ((0, _definition.isNonNullType)(type)) { @@ -38009,10 +37336,10 @@ function valueFromAST(valueNode, type, variables) { return; // Invalid: intentionally return no value. } const coercedObj = Object.create(null); - const fieldNodes = new Map(valueNode.fields.map(field => [field.name.value, field])); + const fieldNodes = (0, _keyMap.keyMap)(valueNode.fields, field => field.name.value); for (const field of Object.values(type.getFields())) { - const fieldNode = fieldNodes.get(field.name); - if (fieldNode == null || isMissingVariable(fieldNode.value, variables)) { + const fieldNode = fieldNodes[field.name]; + if (!fieldNode || isMissingVariable(fieldNode.value, variables)) { if (field.defaultValue !== undefined) { coercedObj[field.name] = field.defaultValue; } else if ((0, _definition.isNonNullType)(field.type)) { @@ -38054,10 +37381,11 @@ function valueFromAST(valueNode, type, variables) { } /* c8 ignore next 3 */ // Not reachable, all possible input types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); -} -// Returns true if the provided valueNode is a variable which is not defined +} // Returns true if the provided valueNode is a variable which is not defined // in the set of variables. + function isMissingVariable(valueNode, variables) { return valueNode.kind === _kinds.Kind.VARIABLE && (variables == null || variables[valueNode.name.value] === undefined); } @@ -38094,6 +37422,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * | Null | null | * */ + function valueFromASTUntyped(valueNode, variables) { switch (valueNode.kind) { case _kinds.Kind.NULL: @@ -38192,14 +37521,14 @@ class ASTValidationContext { let fragments = this._recursivelyReferencedFragments.get(operation); if (!fragments) { fragments = []; - const collectedNames = new Set(); + const collectedNames = Object.create(null); const nodesToVisit = [operation.selectionSet]; let node; while (node = nodesToVisit.pop()) { for (const spread of this.getFragmentSpreads(node)) { const fragName = spread.name.value; - if (!collectedNames.has(fragName)) { - collectedNames.add(fragName); + if (collectedNames[fragName] !== true) { + collectedNames[fragName] = true; const fragment = this.getFragment(fragName); if (fragment) { fragments.push(fragment); @@ -38312,24 +37641,6 @@ exports.ValidationContext = ValidationContext; Object.defineProperty(exports, "__esModule", ({ value: true })); -Object.defineProperty(exports, "DeferStreamDirectiveLabelRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule; - } -})); -Object.defineProperty(exports, "DeferStreamDirectiveOnRootFieldRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule; - } -})); -Object.defineProperty(exports, "DeferStreamDirectiveOnValidOperationsRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule; - } -})); Object.defineProperty(exports, "ExecutableDefinitionsRule", ({ enumerable: true, get: function () { @@ -38462,12 +37773,6 @@ Object.defineProperty(exports, "SingleFieldSubscriptionsRule", ({ return _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule; } })); -Object.defineProperty(exports, "StreamDirectiveOnListFieldRule", ({ - enumerable: true, - get: function () { - return _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule; - } -})); Object.defineProperty(exports, "UniqueArgumentDefinitionNamesRule", ({ enumerable: true, get: function () { @@ -38585,9 +37890,6 @@ Object.defineProperty(exports, "validate", ({ var _validate = __webpack_require__(/*! ./validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../../../node_modules/graphql/validation/ValidationContext.mjs"); var _specifiedRules = __webpack_require__(/*! ./specifiedRules.mjs */ "../../../node_modules/graphql/validation/specifiedRules.mjs"); -var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); -var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); -var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -38605,7 +37907,6 @@ var _PossibleFragmentSpreadsRule = __webpack_require__(/*! ./rules/PossibleFragm var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); -var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectivesPerLocationRule = __webpack_require__(/*! ./rules/UniqueDirectivesPerLocationRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs"); var _UniqueFragmentNamesRule = __webpack_require__(/*! ./rules/UniqueFragmentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs"); @@ -38629,182 +37930,6 @@ var _NoSchemaIntrospectionCustomRule = __webpack_require__(/*! ./rules/custom/No /***/ }), -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs": -/*!****************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs ***! - \****************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveLabelRule = DeferStreamDirectiveLabelRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Defer and stream directive labels are unique - * - * A GraphQL document is only valid if defer and stream directives' label argument is static and unique. - */ -function DeferStreamDirectiveLabelRule(context) { - const knownLabels = new Map(); - return { - Directive(node) { - if (node.name.value === _directives.GraphQLDeferDirective.name || node.name.value === _directives.GraphQLStreamDirective.name) { - var _node$arguments; - const labelArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'label'); - const labelValue = labelArgument === null || labelArgument === void 0 ? void 0 : labelArgument.value; - if (!labelValue) { - return; - } - if (labelValue.kind !== _kinds.Kind.STRING) { - context.reportError(new _GraphQLError.GraphQLError(`Directive "${node.name.value}"'s label argument must be a static string.`, { - nodes: node - })); - return; - } - const knownLabel = knownLabels.get(labelValue.value); - if (knownLabel != null) { - context.reportError(new _GraphQLError.GraphQLError('Defer/Stream directive label argument must be unique.', { - nodes: [knownLabel, node] - })); - } else { - knownLabels.set(labelValue.value, node); - } - } - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs": -/*!**********************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs ***! - \**********************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveOnRootFieldRule = DeferStreamDirectiveOnRootFieldRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Defer and stream directives are used on valid root field - * - * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. - */ -function DeferStreamDirectiveOnRootFieldRule(context) { - return { - Directive(node) { - const mutationType = context.getSchema().getMutationType(); - const subscriptionType = context.getSchema().getSubscriptionType(); - const parentType = context.getParentType(); - if (parentType && node.name.value === _directives.GraphQLDeferDirective.name) { - if (mutationType && parentType === mutationType) { - context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root mutation type "${parentType.name}".`, { - nodes: node - })); - } - if (subscriptionType && parentType === subscriptionType) { - context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root subscription type "${parentType.name}".`, { - nodes: node - })); - } - } - if (parentType && node.name.value === _directives.GraphQLStreamDirective.name) { - if (mutationType && parentType === mutationType) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root mutation type "${parentType.name}".`, { - nodes: node - })); - } - if (subscriptionType && parentType === subscriptionType) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root subscription type "${parentType.name}".`, { - nodes: node - })); - } - } - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs": -/*!****************************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs ***! - \****************************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveOnValidOperationsRule = DeferStreamDirectiveOnValidOperationsRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _ast = __webpack_require__(/*! ../../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); -var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -function ifArgumentCanBeFalse(node) { - var _node$arguments; - const ifArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'if'); - if (!ifArgument) { - return false; - } - if (ifArgument.value.kind === _kinds.Kind.BOOLEAN) { - if (ifArgument.value.value) { - return false; - } - } else if (ifArgument.value.kind !== _kinds.Kind.VARIABLE) { - return false; - } - return true; -} -/** - * Defer And Stream Directives Are Used On Valid Operations - * - * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. - */ -function DeferStreamDirectiveOnValidOperationsRule(context) { - const fragmentsUsedOnSubscriptions = new Set(); - return { - OperationDefinition(operation) { - if (operation.operation === _ast.OperationTypeNode.SUBSCRIPTION) { - for (const fragment of context.getRecursivelyReferencedFragments(operation)) { - fragmentsUsedOnSubscriptions.add(fragment.name.value); - } - } - }, - Directive(node, _key, _parent, _path, ancestors) { - const definitionNode = ancestors[2]; - if ('kind' in definitionNode && (definitionNode.kind === _kinds.Kind.FRAGMENT_DEFINITION && fragmentsUsedOnSubscriptions.has(definitionNode.name.value) || definitionNode.kind === _kinds.Kind.OPERATION_DEFINITION && definitionNode.operation === _ast.OperationTypeNode.SUBSCRIPTION)) { - if (node.name.value === _directives.GraphQLDeferDirective.name) { - if (!ifArgumentCanBeFalse(node)) { - context.reportError(new _GraphQLError.GraphQLError('Defer directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.', { - nodes: node - })); - } - } else if (node.name.value === _directives.GraphQLStreamDirective.name) { - if (!ifArgumentCanBeFalse(node)) { - context.reportError(new _GraphQLError.GraphQLError('Stream directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.', { - nodes: node - })); - } - } - } - } - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs": /*!************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs ***! @@ -38880,14 +38005,14 @@ function FieldsOnCorrectTypeRule(context) { if (!fieldDef) { // This field doesn't exist, lets look for suggestions. const schema = context.getSchema(); - const fieldName = node.name.value; - // First determine if there are any suggested types to condition on. - let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); - // If there are no suggested types, then perhaps this was a typo? + const fieldName = node.name.value; // First determine if there are any suggested types to condition on. + + let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); // If there are no suggested types, then perhaps this was a typo? + if (suggestion === '') { suggestion = (0, _didYouMean.didYouMean)(getSuggestedFieldNames(type, fieldName)); - } - // Report an error, including helpful suggestions. + } // Report an error, including helpful suggestions. + context.reportError(new _GraphQLError.GraphQLError(`Cannot query field "${fieldName}" on type "${type.name}".` + suggestion, { nodes: node })); @@ -38901,6 +38026,7 @@ function FieldsOnCorrectTypeRule(context) { * they implement. If any of those types include the provided field, suggest them, * sorted by how often the type is referenced. */ + function getSuggestedTypeNames(schema, type, fieldName) { if (!(0, _definition.isAbstractType)(type)) { // Must be an Object type, which does not have possible fields. @@ -38909,18 +38035,18 @@ function getSuggestedTypeNames(schema, type, fieldName) { const suggestedTypes = new Set(); const usageCount = Object.create(null); for (const possibleType of schema.getPossibleTypes(type)) { - if (possibleType.getFields()[fieldName] == null) { + if (!possibleType.getFields()[fieldName]) { continue; - } - // This object type defines this field. + } // This object type defines this field. + suggestedTypes.add(possibleType); usageCount[possibleType.name] = 1; for (const possibleInterface of possibleType.getInterfaces()) { var _usageCount$possibleI; - if (possibleInterface.getFields()[fieldName] == null) { + if (!possibleInterface.getFields()[fieldName]) { continue; - } - // This interface type defines this field. + } // This interface type defines this field. + suggestedTypes.add(possibleInterface); usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1; } @@ -38930,8 +38056,8 @@ function getSuggestedTypeNames(schema, type, fieldName) { const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name]; if (usageCountDiff !== 0) { return usageCountDiff; - } - // Suggest super types first followed by subtypes + } // Suggest super types first followed by subtypes + if ((0, _definition.isInterfaceType)(typeA) && schema.isSubType(typeA, typeB)) { return -1; } @@ -38945,12 +38071,13 @@ function getSuggestedTypeNames(schema, type, fieldName) { * For the field name provided, determine if there are any similar field names * that may be the result of a typo. */ + function getSuggestedFieldNames(type, fieldName) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const possibleFieldNames = Object.keys(type.getFields()); return (0, _suggestionList.suggestionList)(fieldName, possibleFieldNames); - } - // Otherwise, must be a Union type, which does not define fields. + } // Otherwise, must be a Union type, which does not define fields. + return []; } @@ -39058,28 +38185,31 @@ function KnownArgumentNamesRule(context) { /** * @internal */ + function KnownArgumentNamesOnDirectivesRule(context) { - const directiveArgs = new Map(); + const directiveArgs = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - directiveArgs.set(directive.name, directive.args.map(arg => arg.name)); + directiveArgs[directive.name] = directive.args.map(arg => arg.name); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argsNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - directiveArgs.set(def.name.value, argsNodes.map(arg => arg.name.value)); + directiveArgs[def.name.value] = argsNodes.map(arg => arg.name.value); } } return { Directive(directiveNode) { const directiveName = directiveNode.name.value; - const knownArgs = directiveArgs.get(directiveName); - if (directiveNode.arguments != null && knownArgs != null) { + const knownArgs = directiveArgs[directiveName]; + if (directiveNode.arguments && knownArgs) { for (const argNode of directiveNode.arguments) { const argName = argNode.name.value; if (!knownArgs.includes(argName)) { @@ -39125,30 +38255,30 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Defined */ function KnownDirectivesRule(context) { - const locationsMap = new Map(); + const locationsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - locationsMap.set(directive.name, directive.locations); + locationsMap[directive.name] = directive.locations; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - locationsMap.set(def.name.value, def.locations.map(name => name.value)); + locationsMap[def.name.value] = def.locations.map(name => name.value); } } return { Directive(node, _key, _parent, _path, ancestors) { const name = node.name.value; - const locations = locationsMap.get(name); - if (locations == null) { + const locations = locationsMap[name]; + if (!locations) { context.reportError(new _GraphQLError.GraphQLError(`Unknown directive "@${name}".`, { nodes: node })); return; } const candidateLocation = getDirectiveLocationForASTPath(ancestors); - if (candidateLocation != null && !locations.includes(candidateLocation)) { + if (candidateLocation && !locations.includes(candidateLocation)) { context.reportError(new _GraphQLError.GraphQLError(`Directive "@${name}" may not be used on ${candidateLocation}.`, { nodes: node })); @@ -39157,8 +38287,8 @@ function KnownDirectivesRule(context) { }; } function getDirectiveLocationForASTPath(ancestors) { - const appliedTo = ancestors.at(-1); - appliedTo != null && 'kind' in appliedTo || (0, _invariant.invariant)(false); + const appliedTo = ancestors[ancestors.length - 1]; + 'kind' in appliedTo || (0, _invariant.invariant)(false); switch (appliedTo.kind) { case _kinds.Kind.OPERATION_DEFINITION: return getDirectiveLocationForOperation(appliedTo.operation); @@ -39199,12 +38329,14 @@ function getDirectiveLocationForASTPath(ancestors) { return _directiveLocation.DirectiveLocation.INPUT_OBJECT; case _kinds.Kind.INPUT_VALUE_DEFINITION: { - const parentNode = ancestors.at(-3); - parentNode != null && 'kind' in parentNode || (0, _invariant.invariant)(false); + const parentNode = ancestors[ancestors.length - 3]; + 'kind' in parentNode || (0, _invariant.invariant)(false); return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION ? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION : _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION; } // Not reachable, all possible types have been considered. - /* c8 ignore next 2 */ + + /* c8 ignore next */ + default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(appliedTo.kind)); } @@ -39286,23 +38418,26 @@ var _scalars = __webpack_require__(/*! ../../type/scalars.mjs */ "../../../node_ * See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence */ function KnownTypeNamesRule(context) { - var _context$getSchema$ge, _context$getSchema; - const { - definitions - } = context.getDocument(); - const existingTypesMap = (_context$getSchema$ge = (_context$getSchema = context.getSchema()) === null || _context$getSchema === void 0 ? void 0 : _context$getSchema.getTypeMap()) !== null && _context$getSchema$ge !== void 0 ? _context$getSchema$ge : {}; - const typeNames = new Set([...Object.keys(existingTypesMap), ...definitions.filter(_predicates.isTypeDefinitionNode).map(def => def.name.value)]); + const schema = context.getSchema(); + const existingTypesMap = schema ? schema.getTypeMap() : Object.create(null); + const definedTypes = Object.create(null); + for (const def of context.getDocument().definitions) { + if ((0, _predicates.isTypeDefinitionNode)(def)) { + definedTypes[def.name.value] = true; + } + } + const typeNames = [...Object.keys(existingTypesMap), ...Object.keys(definedTypes)]; return { NamedType(node, _1, parent, _2, ancestors) { const typeName = node.name.value; - if (!typeNames.has(typeName)) { + if (!existingTypesMap[typeName] && !definedTypes[typeName]) { var _ancestors$; const definitionNode = (_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0 ? _ancestors$ : parent; const isSDL = definitionNode != null && isSDLNode(definitionNode); - if (isSDL && standardTypeNames.has(typeName)) { + if (isSDL && standardTypeNames.includes(typeName)) { return; } - const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? [...standardTypeNames, ...typeNames] : [...typeNames]); + const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? standardTypeNames.concat(typeNames) : typeNames); context.reportError(new _GraphQLError.GraphQLError(`Unknown type "${typeName}".` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node })); @@ -39310,7 +38445,7 @@ function KnownTypeNamesRule(context) { } }; } -const standardTypeNames = new Set([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name)); +const standardTypeNames = [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name); function isSDLNode(value) { return 'kind' in value && ((0, _predicates.isTypeSystemDefinitionNode)(value) || (0, _predicates.isTypeSystemExtensionNode)(value)); } @@ -39429,14 +38564,14 @@ function MaxIntrospectionDepthRule(context) { } const fragment = context.getFragment(fragmentName); if (!fragment) { - // Missing fragments checks are handled by the `KnownFragmentNamesRule`. + // Missing fragments checks are handled by `KnownFragmentNamesRule`. return false; - } - // Rather than following an immutable programming pattern which has + } // Rather than following an immutable programming pattern which has // significant memory and garbage collection overhead, we've opted to // take a mutable approach for efficiency's sake. Importantly visiting a // fragment twice is fine, so long as you don't do one visit inside the // other. + try { visitedFragments[fragmentName] = true; return checkDepth(fragment, visitedFragments, depth); @@ -39446,15 +38581,14 @@ function MaxIntrospectionDepthRule(context) { } if (node.kind === _kinds.Kind.FIELD && ( // check all introspection lists - // TODO: instead of relying on field names, check whether the type is a list node.name.value === 'fields' || node.name.value === 'interfaces' || node.name.value === 'possibleTypes' || node.name.value === 'inputFields')) { // eslint-disable-next-line no-param-reassign depth++; if (depth >= MAX_LISTS_DEPTH) { return true; } - } - // handles fields and inline fragments + } // handles fields and inline fragments + if ('selectionSet' in node && node.selectionSet) { for (const child of node.selectionSet.selections) { if (checkDepth(child, visitedFragments, depth)) { @@ -39504,10 +38638,10 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ function NoFragmentCyclesRule(context) { // Tracks already visited fragments to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedFrags = new Set(); - // Array of AST nodes used to produce meaningful errors - const spreadPath = []; - // Position in the spread path + const visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors + + const spreadPath = []; // Position in the spread path + const spreadPathIndexByName = Object.create(null); return { OperationDefinition: () => false, @@ -39515,16 +38649,16 @@ function NoFragmentCyclesRule(context) { detectCycleRecursive(node); return false; } - }; - // This does a straight-forward DFS to find cycles. + }; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. + function detectCycleRecursive(fragment) { - if (visitedFrags.has(fragment.name.value)) { + if (visitedFrags[fragment.name.value]) { return; } const fragmentName = fragment.name.value; - visitedFrags.add(fragmentName); + visitedFrags[fragmentName] = true; const spreadNodes = context.getFragmentSpreads(fragment.selectionSet); if (spreadNodes.length === 0) { return; @@ -39576,21 +38710,28 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined */ function NoUndefinedVariablesRule(context) { + let variableNameDefined = Object.create(null); return { - OperationDefinition(operation) { - var _operation$variableDe; - const variableNameDefined = new Set((_operation$variableDe = operation.variableDefinitions) === null || _operation$variableDe === void 0 ? void 0 : _operation$variableDe.map(node => node.variable.name.value)); - const usages = context.getRecursiveVariableUsages(operation); - for (const { - node - } of usages) { - const varName = node.name.value; - if (!variableNameDefined.has(varName)) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { - nodes: [node, operation] - })); + OperationDefinition: { + enter() { + variableNameDefined = Object.create(null); + }, + leave(operation) { + const usages = context.getRecursiveVariableUsages(operation); + for (const { + node + } of usages) { + const varName = node.name.value; + if (variableNameDefined[varName] !== true) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { + nodes: [node, operation] + })); + } } } + }, + VariableDefinition(node) { + variableNameDefined[node.variable.name.value] = true; } }; } @@ -39619,13 +38760,11 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used */ function NoUnusedFragmentsRule(context) { - const fragmentNameUsed = new Set(); + const operationDefs = []; const fragmentDefs = []; return { - OperationDefinition(operation) { - for (const fragment of context.getRecursivelyReferencedFragments(operation)) { - fragmentNameUsed.add(fragment.name.value); - } + OperationDefinition(node) { + operationDefs.push(node); return false; }, FragmentDefinition(node) { @@ -39634,9 +38773,15 @@ function NoUnusedFragmentsRule(context) { }, Document: { leave() { + const fragmentNameUsed = Object.create(null); + for (const operation of operationDefs) { + for (const fragment of context.getRecursivelyReferencedFragments(operation)) { + fragmentNameUsed[fragment.name.value] = true; + } + } for (const fragmentDef of fragmentDefs) { const fragName = fragmentDef.name.value; - if (!fragmentNameUsed.has(fragName)) { + if (fragmentNameUsed[fragName] !== true) { context.reportError(new _GraphQLError.GraphQLError(`Fragment "${fragName}" is never used.`, { nodes: fragmentDef })); @@ -39671,24 +38816,32 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variables-Used */ function NoUnusedVariablesRule(context) { + let variableDefs = []; return { - OperationDefinition(operation) { - var _operation$variableDe; - const usages = context.getRecursiveVariableUsages(operation); - const variableNameUsed = new Set(usages.map(({ - node - }) => node.name.value)); - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ - const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; - for (const variableDef of variableDefinitions) { - const variableName = variableDef.variable.name.value; - if (!variableNameUsed.has(variableName)) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { - nodes: variableDef - })); + OperationDefinition: { + enter() { + variableDefs = []; + }, + leave(operation) { + const variableNameUsed = Object.create(null); + const usages = context.getRecursiveVariableUsages(operation); + for (const { + node + } of usages) { + variableNameUsed[node.name.value] = true; + } + for (const variableDef of variableDefs) { + const variableName = variableDef.variable.name.value; + if (variableNameUsed[variableName] !== true) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { + nodes: variableDef + })); + } } } + }, + VariableDefinition(def) { + variableDefs.push(def); } }; } @@ -39714,9 +38867,6 @@ var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../n var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _sortValueNode = __webpack_require__(/*! ../../utilities/sortValueNode.mjs */ "../../../node_modules/graphql/utilities/sortValueNode.mjs"); var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); -/* eslint-disable max-params */ -// This file contains a lot of such errors but we plan to refactor it anyway -// so just disable it for entire file. function reasonMessage(reason) { if (Array.isArray(reason)) { return reason.map(([responseName, subReason]) => `subfields "${responseName}" conflict because ` + reasonMessage(subReason)).join(' and '); @@ -39732,14 +38882,15 @@ function reasonMessage(reason) { * * See https://spec.graphql.org/draft/#sec-Field-Selection-Merging */ + function OverlappingFieldsCanBeMergedRule(context) { // A memoization for when two fragments are compared "between" each other for // conflicts. Two fragments may be compared many times, so memoizing this can // dramatically improve the performance of this validator. - const comparedFragmentPairs = new PairSet(); - // A cache for the "field map" and list of fragment names found in any given + const comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given // selection set. Selection sets may be asked for this information multiple // times, so this improves the performance of this validator. + const cachedFieldsAndFragmentNames = new Map(); return { SelectionSet(selectionSet) { @@ -39753,6 +38904,7 @@ function OverlappingFieldsCanBeMergedRule(context) { } }; } + /** * Algorithm: * @@ -39812,43 +38964,43 @@ function OverlappingFieldsCanBeMergedRule(context) { // GraphQL Document. function findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet) { const conflicts = []; - const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); - // (A) Find find all conflicts "within" the fields of this selection set. + const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); // (A) Find find all conflicts "within" the fields of this selection set. // Note: this is the *only place* `collectConflictsWithin` is called. + collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap); if (fragmentNames.length !== 0) { // (B) Then collect conflicts between these fields and those represented by // each spread fragment name found. for (let i = 0; i < fragmentNames.length; i++) { - collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); - // (C) Then compare this fragment with all other fragments found in this + collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); // (C) Then compare this fragment with all other fragments found in this // selection set to collect conflicts between fragments spread together. // This compares each item in the list of fragment names to every other // item in that same list (except for itself). + for (let j = i + 1; j < fragmentNames.length; j++) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j]); } } } return conflicts; -} -// Collect all conflicts found between a set of fields and a fragment reference +} // Collect all conflicts found between a set of fields and a fragment reference // including via spreading in any nested fragments. + function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName) { const fragment = context.getFragment(fragmentName); if (!fragment) { return; } - const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); - // Do not compare a fragment's fieldMap to itself. + const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); // Do not compare a fragment's fieldMap to itself. + if (fieldMap === fieldMap2) { return; - } - // (D) First collect any conflicts between the provided collection of fields + } // (D) First collect any conflicts between the provided collection of fields // and the collection of fields represented by the given fragment. - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); - // (E) Then collect any conflicts between the provided collection of fields + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); // (E) Then collect any conflicts between the provided collection of fields // and any fragment names found in the given fragment. + for (const referencedFragmentName of referencedFragmentNames) { // Memoize so two fragments are not compared for conflicts more than once. if (comparedFragmentPairs.has(referencedFragmentName, fragmentName, areMutuallyExclusive)) { @@ -39857,15 +39009,15 @@ function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFiel comparedFragmentPairs.add(referencedFragmentName, fragmentName, areMutuallyExclusive); collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, referencedFragmentName); } -} -// Collect all conflicts found between two fragments, including via spreading in +} // Collect all conflicts found between two fragments, including via spreading in // any nested fragments. + function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2) { // No need to compare a fragment to itself. if (fragmentName1 === fragmentName2) { return; - } - // Memoize so two fragments are not compared for conflicts more than once. + } // Memoize so two fragments are not compared for conflicts more than once. + if (comparedFragmentPairs.has(fragmentName1, fragmentName2, areMutuallyExclusive)) { return; } @@ -39876,57 +39028,57 @@ function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFra return; } const [fieldMap1, referencedFragmentNames1] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment1); - const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); - // (F) First, collect all conflicts between these two collections of fields + const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); // (F) First, collect all conflicts between these two collections of fields // (not including any nested fragments). - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); - // (G) Then collect conflicts between the first fragment and any nested + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (G) Then collect conflicts between the first fragment and any nested // fragments spread in the second fragment. + for (const referencedFragmentName2 of referencedFragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, referencedFragmentName2); - } - // (G) Then collect conflicts between the second fragment and any nested + } // (G) Then collect conflicts between the second fragment and any nested // fragments spread in the first fragment. + for (const referencedFragmentName1 of referencedFragmentNames1) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, referencedFragmentName1, fragmentName2); } -} -// Find all conflicts found between two selection sets, including those found +} // Find all conflicts found between two selection sets, including those found // via spreading in fragments. Called when determining if conflicts exist // between the sub-fields of two overlapping fields. + function findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2) { const conflicts = []; const [fieldMap1, fragmentNames1] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType1, selectionSet1); - const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); - // (H) First, collect all conflicts between these two collections of field. - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); - // (I) Then collect conflicts between the first collection of fields and + const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); // (H) First, collect all conflicts between these two collections of field. + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (I) Then collect conflicts between the first collection of fields and // those referenced by each fragment name associated with the second. + for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentName2); - } - // (I) Then collect conflicts between the second collection of fields and + } // (I) Then collect conflicts between the second collection of fields and // those referenced by each fragment name associated with the first. + for (const fragmentName1 of fragmentNames1) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentName1); - } - // (J) Also collect conflicts between any fragment names by the first and + } // (J) Also collect conflicts between any fragment names by the first and // fragment names by the second. This compares each item in the first set of // names to each item in the second set of names. + for (const fragmentName1 of fragmentNames1) { for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2); } } return conflicts; -} -// Collect all Conflicts "within" one collection of fields. +} // Collect all Conflicts "within" one collection of fields. + function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For every response name, if there are multiple fields, they // must be compared to find a potential conflict. - for (const [responseName, fields] of fieldMap.entries()) { + for (const [responseName, fields] of Object.entries(fieldMap)) { // This compares every field in the list to every other field in this list // (except to itself). If the list only has one item, nothing needs to // be compared. @@ -39943,21 +39095,21 @@ function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames } } } -} -// Collect all Conflicts between two collections of fields. This is similar to, +} // Collect all Conflicts between two collections of fields. This is similar to, // but different from the `collectConflictsWithin` function above. This check // assumes that `collectConflictsWithin` has already been called on each // provided collection of fields. This is true because this validator traverses // each individual selection set. + function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For any response name which appears in both provided field // maps, each field from the first field map must be compared to every field // in the second field map to find potential conflicts. - for (const [responseName, fields1] of fieldMap1.entries()) { - const fields2 = fieldMap2.get(responseName); - if (fields2 != null) { + for (const [responseName, fields1] of Object.entries(fieldMap1)) { + const fields2 = fieldMap2[responseName]; + if (fields2) { for (const field1 of fields1) { for (const field2 of fields2) { const conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2); @@ -39968,14 +39120,12 @@ function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentName } } } -} -// Determines if there is a conflict between two particular fields, including +} // Determines if there is a conflict between two particular fields, including // comparing their sub-fields. + function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2) { - var _node1$directives, _node2$directives; const [parentType1, node1, def1] = field1; - const [parentType2, node2, def2] = field2; - // If it is known that two fields could not possibly apply at the same + const [parentType2, node2, def2] = field2; // If it is known that two fields could not possibly apply at the same // time, due to the parent types, then it is safe to permit them to diverge // in aliased field or arguments used as they will not present any ambiguity // by differing. @@ -39983,6 +39133,7 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai // different Object types. Interface or Union types might overlap - if not // in the current state of the schema, then perhaps in some future version, // thus may not safely diverge. + const areMutuallyExclusive = parentFieldsAreMutuallyExclusive || parentType1 !== parentType2 && (0, _definition.isObjectType)(parentType1) && (0, _definition.isObjectType)(parentType2); if (!areMutuallyExclusive) { // Two aliases must refer to the same field. @@ -39990,27 +39141,21 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai const name2 = node2.name.value; if (name1 !== name2) { return [[responseName, `"${name1}" and "${name2}" are different fields`], [node1], [node2]]; - } - // Two field calls must have the same arguments. + } // Two field calls must have the same arguments. + if (!sameArguments(node1, node2)) { return [[responseName, 'they have differing arguments'], [node1], [node2]]; } - } - // FIXME https://github.com/graphql/graphql-js/issues/2203 - const directives1 = /* c8 ignore next */(_node1$directives = node1.directives) !== null && _node1$directives !== void 0 ? _node1$directives : []; - const directives2 = /* c8 ignore next */(_node2$directives = node2.directives) !== null && _node2$directives !== void 0 ? _node2$directives : []; - if (!sameStreams(directives1, directives2)) { - return [[responseName, 'they have differing stream directives'], [node1], [node2]]; - } - // The return type for each field. + } // The return type for each field. + const type1 = def1 === null || def1 === void 0 ? void 0 : def1.type; const type2 = def2 === null || def2 === void 0 ? void 0 : def2.type; if (type1 && type2 && doTypesConflict(type1, type2)) { return [[responseName, `they return conflicting types "${(0, _inspect.inspect)(type1)}" and "${(0, _inspect.inspect)(type2)}"`], [node1], [node2]]; - } - // Collect and compare sub-fields. Use the same "visited fragment names" list + } // Collect and compare sub-fields. Use the same "visited fragment names" list // for both collections so fields in a fragment reference are never // compared to themselves. + const selectionSet1 = node1.selectionSet; const selectionSet2 = node2.selectionSet; if (selectionSet1 && selectionSet2) { @@ -40027,8 +39172,12 @@ function sameArguments(node1, node2) { if (args2 === undefined || args2.length === 0) { return false; } + /* c8 ignore next */ + if (args1.length !== args2.length) { + /* c8 ignore next */ return false; + /* c8 ignore next */ } const values2 = new Map(args2.map(({ name, @@ -40045,26 +39194,10 @@ function sameArguments(node1, node2) { } function stringifyValue(value) { return (0, _printer.print)((0, _sortValueNode.sortValueNode)(value)); -} -function getStreamDirective(directives) { - return directives.find(directive => directive.name.value === 'stream'); -} -function sameStreams(directives1, directives2) { - const stream1 = getStreamDirective(directives1); - const stream2 = getStreamDirective(directives2); - if (!stream1 && !stream2) { - // both fields do not have streams - return true; - } else if (stream1 && stream2) { - // check if both fields have equivalent streams - return sameArguments(stream1, stream2); - } - // fields have a mix of stream and no stream - return false; -} -// Two types conflict if both types could not apply to a value simultaneously. +} // Two types conflict if both types could not apply to a value simultaneously. // Composite types are ignored as their individual field types will be compared // later recursively. However List and Non-Null types must match. + function doTypesConflict(type1, type2) { if ((0, _definition.isListType)(type1)) { return (0, _definition.isListType)(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true; @@ -40082,24 +39215,24 @@ function doTypesConflict(type1, type2) { return type1 !== type2; } return false; -} -// Given a selection set, return the collection of fields (a mapping of response +} // Given a selection set, return the collection of fields (a mapping of response // name to field nodes and definitions) as well as a list of fragment names // referenced via fragment spreads. + function getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet) { const cached = cachedFieldsAndFragmentNames.get(selectionSet); if (cached) { return cached; } - const nodeAndDefs = new Map(); - const fragmentNames = new Set(); + const nodeAndDefs = Object.create(null); + const fragmentNames = Object.create(null); _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames); - const result = [nodeAndDefs, [...fragmentNames]]; + const result = [nodeAndDefs, Object.keys(fragmentNames)]; cachedFieldsAndFragmentNames.set(selectionSet, result); return result; -} -// Given a reference to a fragment, return the represented collection of fields +} // Given a reference to a fragment, return the represented collection of fields // as well as a list of nested fragment names referenced via fragment spreads. + function getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment) { // Short-circuit building a type from the node if possible. const cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet); @@ -40120,16 +39253,14 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA fieldDef = parentType.getFields()[fieldName]; } const responseName = selection.alias ? selection.alias.value : fieldName; - let nodeAndDefsList = nodeAndDefs.get(responseName); - if (nodeAndDefsList == null) { - nodeAndDefsList = []; - nodeAndDefs.set(responseName, nodeAndDefsList); + if (!nodeAndDefs[responseName]) { + nodeAndDefs[responseName] = []; } - nodeAndDefsList.push([parentType, selection, fieldDef]); + nodeAndDefs[responseName].push([parentType, selection, fieldDef]); break; } case _kinds.Kind.FRAGMENT_SPREAD: - fragmentNames.add(selection.name.value); + fragmentNames[selection.name.value] = true; break; case _kinds.Kind.INLINE_FRAGMENT: { @@ -40140,9 +39271,9 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA } } } -} -// Given a series of Conflicts which occurred between two sub-fields, generate +} // Given a series of Conflicts which occurred between two sub-fields, generate // a single Conflict. + function subfieldConflicts(conflicts, responseName, node1, node2) { if (conflicts.length > 0) { return [[responseName, conflicts.map(([reason]) => reason)], [node1, ...conflicts.map(([, fields1]) => fields1).flat()], [node2, ...conflicts.map(([,, fields2]) => fields2).flat()]]; @@ -40151,6 +39282,7 @@ function subfieldConflicts(conflicts, responseName, node1, node2) { /** * A way to keep track of pairs of things when the ordering of the pair does not matter. */ + class PairSet { constructor() { this._data = new Map(); @@ -40161,10 +39293,10 @@ class PairSet { const result = (_this$_data$get = this._data.get(key1)) === null || _this$_data$get === void 0 ? void 0 : _this$_data$get.get(key2); if (result === undefined) { return false; - } - // areMutuallyExclusive being false is a superset of being true, hence if + } // areMutuallyExclusive being false is a superset of being true, hence if // we want to know if this PairSet "has" these two with no exclusivity, // we have to ensure it was added as such. + return areMutuallyExclusive ? true : areMutuallyExclusive === result; } add(a, b, areMutuallyExclusive) { @@ -40270,10 +39402,10 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. */ function PossibleTypeExtensionsRule(context) { const schema = context.getSchema(); - const definedTypes = new Map(); + const definedTypes = Object.create(null); for (const def of context.getDocument().definitions) { if ((0, _predicates.isTypeDefinitionNode)(def)) { - definedTypes.set(def.name.value, def); + definedTypes[def.name.value] = def; } } return { @@ -40286,15 +39418,15 @@ function PossibleTypeExtensionsRule(context) { }; function checkExtension(node) { const typeName = node.name.value; - const defNode = definedTypes.get(typeName); + const defNode = definedTypes[typeName]; const existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName); let expectedKind; - if (defNode != null) { + if (defNode) { expectedKind = defKindToExtKind[defNode.kind]; } else if (existingType) { expectedKind = typeToExtKind(existingType); } - if (expectedKind != null) { + if (expectedKind) { if (expectedKind !== node.kind) { const kindStr = extensionKindToTypeName(node.kind); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend non-${kindStr} type "${typeName}".`, { @@ -40302,8 +39434,10 @@ function PossibleTypeExtensionsRule(context) { })); } } else { - var _schema$getTypeMap; - const allTypeNames = [...definedTypes.keys(), ...Object.keys((_schema$getTypeMap = schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) !== null && _schema$getTypeMap !== void 0 ? _schema$getTypeMap : {})]; + const allTypeNames = Object.keys({ + ...definedTypes, + ...(schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) + }); const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, allTypeNames); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend type "${typeName}" because it is not defined.` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node.name @@ -40340,6 +39474,7 @@ function typeToExtKind(type) { } /* c8 ignore next 3 */ // Not reachable. All possible types have been considered + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extensionKindToTypeName(kind) { @@ -40357,7 +39492,9 @@ function extensionKindToTypeName(kind) { case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: return 'input object'; // Not reachable. All possible types have been considered - /* c8 ignore next 2 */ + + /* c8 ignore next */ + default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(kind)); } @@ -40379,6 +39516,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.ProvidedRequiredArgumentsOnDirectivesRule = ProvidedRequiredArgumentsOnDirectivesRule; exports.ProvidedRequiredArgumentsRule = ProvidedRequiredArgumentsRule; var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../node_modules/graphql/language/printer.mjs"); @@ -40402,7 +39540,8 @@ function ProvidedRequiredArgumentsRule(context) { if (!fieldDef) { return false; } - const providedArgs = new Set( // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const providedArgs = new Set( + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ (_fieldNode$arguments = fieldNode.arguments) === null || _fieldNode$arguments === void 0 ? void 0 : _fieldNode$arguments.map(arg => arg.name.value)); for (const argDef of fieldDef.args) { @@ -40420,22 +39559,25 @@ function ProvidedRequiredArgumentsRule(context) { /** * @internal */ + function ProvidedRequiredArgumentsOnDirectivesRule(context) { var _schema$getDirectives; - const requiredArgsMap = new Map(); + const requiredArgsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = (_schema$getDirectives = schema === null || schema === void 0 ? void 0 : schema.getDirectives()) !== null && _schema$getDirectives !== void 0 ? _schema$getDirectives : _directives.specifiedDirectives; for (const directive of definedDirectives) { - requiredArgsMap.set(directive.name, new Map(directive.args.filter(_definition.isRequiredArgument).map(arg => [arg.name, arg]))); + requiredArgsMap[directive.name] = (0, _keyMap.keyMap)(directive.args.filter(_definition.isRequiredArgument), arg => arg.name); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - requiredArgsMap.set(def.name.value, new Map(argNodes.filter(isRequiredArgumentNode).map(arg => [arg.name.value, arg]))); + requiredArgsMap[def.name.value] = (0, _keyMap.keyMap)(argNodes.filter(isRequiredArgumentNode), arg => arg.name.value); } } return { @@ -40443,14 +39585,16 @@ function ProvidedRequiredArgumentsOnDirectivesRule(context) { // Validate on leave to allow for deeper errors to appear first. leave(directiveNode) { const directiveName = directiveNode.name.value; - const requiredArgs = requiredArgsMap.get(directiveName); - if (requiredArgs != null) { + const requiredArgs = requiredArgsMap[directiveName]; + if (requiredArgs) { var _directiveNode$argume; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; const argNodeMap = new Set(argNodes.map(arg => arg.name.value)); - for (const [argName, argDef] of requiredArgs.entries()) { + for (const [argName, argDef] of Object.entries(requiredArgs)) { if (!argNodeMap.has(argName)) { const argType = (0, _definition.isType)(argDef.type) ? (0, _inspect.inspect)(argDef.type) : (0, _printer.print)(argDef.type); context.reportError(new _GraphQLError.GraphQLError(`Directive "@${directiveName}" argument "${argName}" of type "${argType}" is required, but it was not provided.`, { @@ -40533,9 +39677,6 @@ exports.SingleFieldSubscriptionsRule = SingleFieldSubscriptionsRule; var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _collectFields = __webpack_require__(/*! ../../execution/collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); -function toNodes(fieldGroup) { - return fieldGroup.map(fieldDetails => fieldDetails.node); -} /** * Subscriptions must only include a non-introspection field. * @@ -40560,22 +39701,21 @@ function SingleFieldSubscriptionsRule(context) { fragments[definition.name.value] = definition; } } - const { - groupedFieldSet - } = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node); - if (groupedFieldSet.size > 1) { - const fieldGroups = [...groupedFieldSet.values()]; - const extraFieldGroups = fieldGroups.slice(1); - const extraFieldSelections = extraFieldGroups.flatMap(fieldGroup => toNodes(fieldGroup)); + const fields = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node.selectionSet); + if (fields.size > 1) { + const fieldSelectionLists = [...fields.values()]; + const extraFieldSelectionLists = fieldSelectionLists.slice(1); + const extraFieldSelections = extraFieldSelectionLists.flat(); context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must select only one top level field.` : 'Anonymous Subscription must select only one top level field.', { nodes: extraFieldSelections })); } - for (const fieldGroup of groupedFieldSet.values()) { - const fieldName = toNodes(fieldGroup)[0].name.value; + for (const fieldNodes of fields.values()) { + const field = fieldNodes[0]; + const fieldName = field.name.value; if (fieldName.startsWith('__')) { context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must not select an introspection top level field.` : 'Anonymous Subscription must not select an introspection top level field.', { - nodes: toNodes(fieldGroup) + nodes: fieldNodes })); } } @@ -40587,42 +39727,6 @@ function SingleFieldSubscriptionsRule(context) { /***/ }), -/***/ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs": -/*!*****************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs ***! - \*****************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.StreamDirectiveOnListFieldRule = StreamDirectiveOnListFieldRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Stream directives are used on list fields - * - * A GraphQL document is only valid if stream directives are used on list fields. - */ -function StreamDirectiveOnListFieldRule(context) { - return { - Directive(node) { - const fieldDef = context.getFieldDef(); - const parentType = context.getParentType(); - if (fieldDef && parentType && node.name.value === _directives.GraphQLStreamDirective.name && !((0, _definition.isListType)(fieldDef.type) || (0, _definition.isWrappingType)(fieldDef.type) && (0, _definition.isListType)(fieldDef.type.ofType))) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on non-list field "${fieldDef.name}" on type "${parentType.name}".`, { - nodes: node - })); - } - } - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs": /*!********************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs ***! @@ -40647,7 +39751,9 @@ function UniqueArgumentDefinitionNamesRule(context) { return { DirectiveDefinition(directiveNode) { var _directiveNode$argume; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argumentNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes); @@ -40659,15 +39765,17 @@ function UniqueArgumentDefinitionNamesRule(context) { }; function checkArgUniquenessPerField(typeNode) { var _typeNode$fields; - const typeName = typeNode.name.value; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const typeName = typeNode.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const fieldNodes = (_typeNode$fields = typeNode.fields) !== null && _typeNode$fields !== void 0 ? _typeNode$fields : []; for (const fieldDef of fieldNodes) { var _fieldDef$arguments; - const fieldName = fieldDef.name.value; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const fieldName = fieldDef.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const argumentNodes = (_fieldDef$arguments = fieldDef.arguments) !== null && _fieldDef$arguments !== void 0 ? _fieldDef$arguments : []; checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes); } @@ -40717,7 +39825,9 @@ function UniqueArgumentNamesRule(context) { }; function checkArgUniqueness(parentNode) { var _parentNode$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argumentNodes = (_parentNode$arguments = parentNode.arguments) !== null && _parentNode$arguments !== void 0 ? _parentNode$arguments : []; const seenArgs = (0, _groupBy.groupBy)(argumentNodes, arg => arg.name.value); @@ -40752,7 +39862,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined directives have unique names. */ function UniqueDirectiveNamesRule(context) { - const knownDirectiveNames = new Map(); + const knownDirectiveNames = Object.create(null); const schema = context.getSchema(); return { DirectiveDefinition(node) { @@ -40763,13 +39873,12 @@ function UniqueDirectiveNamesRule(context) { })); return; } - const knownName = knownDirectiveNames.get(directiveName); - if (knownName) { + if (knownDirectiveNames[directiveName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one directive named "@${directiveName}".`, { - nodes: [knownName, node.name] + nodes: [knownDirectiveNames[directiveName], node.name] })); } else { - knownDirectiveNames.set(directiveName, node.name); + knownDirectiveNames[directiveName] = node.name; } return false; } @@ -40803,20 +39912,20 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Unique-Per-Location */ function UniqueDirectivesPerLocationRule(context) { - const uniqueDirectiveMap = new Map(); + const uniqueDirectiveMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - uniqueDirectiveMap.set(directive.name, !directive.isRepeatable); + uniqueDirectiveMap[directive.name] = !directive.isRepeatable; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - uniqueDirectiveMap.set(def.name.value, !def.repeatable); + uniqueDirectiveMap[def.name.value] = !def.repeatable; } } - const schemaDirectives = new Map(); - const typeDirectivesMap = new Map(); + const schemaDirectives = Object.create(null); + const typeDirectivesMap = Object.create(null); return { // Many different AST nodes may contain directives. Rather than listing // them all, just listen for entering any node, and check to see if it @@ -40830,24 +39939,22 @@ function UniqueDirectivesPerLocationRule(context) { seenDirectives = schemaDirectives; } else if ((0, _predicates.isTypeDefinitionNode)(node) || (0, _predicates.isTypeExtensionNode)(node)) { const typeName = node.name.value; - seenDirectives = typeDirectivesMap.get(typeName); + seenDirectives = typeDirectivesMap[typeName]; if (seenDirectives === undefined) { - seenDirectives = new Map(); - typeDirectivesMap.set(typeName, seenDirectives); + typeDirectivesMap[typeName] = seenDirectives = Object.create(null); } } else { - seenDirectives = new Map(); + seenDirectives = Object.create(null); } for (const directive of node.directives) { const directiveName = directive.name.value; - if (uniqueDirectiveMap.get(directiveName) === true) { - const seenDirective = seenDirectives.get(directiveName); - if (seenDirective != null) { + if (uniqueDirectiveMap[directiveName]) { + if (seenDirectives[directiveName]) { context.reportError(new _GraphQLError.GraphQLError(`The directive "@${directiveName}" can only be used once at this location.`, { - nodes: [seenDirective, directive] + nodes: [seenDirectives[directiveName], directive] })); } else { - seenDirectives.set(directiveName, directive); + seenDirectives[directiveName] = directive; } } } @@ -40879,7 +39986,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueEnumValueNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownValueNames = new Map(); + const knownValueNames = Object.create(null); return { EnumTypeDefinition: checkValueUniqueness, EnumTypeExtension: checkValueUniqueness @@ -40887,14 +39994,14 @@ function UniqueEnumValueNamesRule(context) { function checkValueUniqueness(node) { var _node$values; const typeName = node.name.value; - let valueNames = knownValueNames.get(typeName); - if (valueNames == null) { - valueNames = new Map(); - knownValueNames.set(typeName, valueNames); - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + if (!knownValueNames[typeName]) { + knownValueNames[typeName] = Object.create(null); + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; + const valueNames = knownValueNames[typeName]; for (const valueDef of valueNodes) { const valueName = valueDef.name.value; const existingType = existingTypeMap[typeName]; @@ -40902,15 +40009,12 @@ function UniqueEnumValueNamesRule(context) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: valueDef.name })); - continue; - } - const knownValueName = valueNames.get(valueName); - if (knownValueName != null) { + } else if (valueNames[valueName]) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" can only be defined once.`, { - nodes: [knownValueName, valueDef.name] + nodes: [valueNames[valueName], valueDef.name] })); } else { - valueNames.set(valueName, valueDef.name); + valueNames[valueName] = valueDef.name; } } return false; @@ -40941,7 +40045,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueFieldDefinitionNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownFieldNames = new Map(); + const knownFieldNames = Object.create(null); return { InputObjectTypeDefinition: checkFieldUniqueness, InputObjectTypeExtension: checkFieldUniqueness, @@ -40953,29 +40057,26 @@ function UniqueFieldDefinitionNamesRule(context) { function checkFieldUniqueness(node) { var _node$fields; const typeName = node.name.value; - let fieldNames = knownFieldNames.get(typeName); - if (fieldNames == null) { - fieldNames = new Map(); - knownFieldNames.set(typeName, fieldNames); - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + if (!knownFieldNames[typeName]) { + knownFieldNames[typeName] = Object.create(null); + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; + const fieldNames = knownFieldNames[typeName]; for (const fieldDef of fieldNodes) { const fieldName = fieldDef.name.value; if (hasField(existingTypeMap[typeName], fieldName)) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: fieldDef.name })); - continue; - } - const knownFieldName = fieldNames.get(fieldName); - if (knownFieldName != null) { + } else if (fieldNames[fieldName]) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" can only be defined once.`, { - nodes: [knownFieldName, fieldDef.name] + nodes: [fieldNames[fieldName], fieldDef.name] })); } else { - fieldNames.set(fieldName, fieldDef.name); + fieldNames[fieldName] = fieldDef.name; } } return false; @@ -41011,18 +40112,17 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragment-Name-Uniqueness */ function UniqueFragmentNamesRule(context) { - const knownFragmentNames = new Map(); + const knownFragmentNames = Object.create(null); return { OperationDefinition: () => false, FragmentDefinition(node) { const fragmentName = node.name.value; - const knownFragmentName = knownFragmentNames.get(fragmentName); - if (knownFragmentName != null) { + if (knownFragmentNames[fragmentName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one fragment named "${fragmentName}".`, { - nodes: [knownFragmentName, node.name] + nodes: [knownFragmentNames[fragmentName], node.name] })); } else { - knownFragmentNames.set(fragmentName, node.name); + knownFragmentNames[fragmentName] = node.name; } return false; } @@ -41055,28 +40155,27 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueInputFieldNamesRule(context) { const knownNameStack = []; - let knownNames = new Map(); + let knownNames = Object.create(null); return { ObjectValue: { enter() { knownNameStack.push(knownNames); - knownNames = new Map(); + knownNames = Object.create(null); }, leave() { const prevKnownNames = knownNameStack.pop(); - prevKnownNames != null || (0, _invariant.invariant)(false); + prevKnownNames || (0, _invariant.invariant)(false); knownNames = prevKnownNames; } }, ObjectField(node) { const fieldName = node.name.value; - const knownName = knownNames.get(fieldName); - if (knownName != null) { + if (knownNames[fieldName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one input field named "${fieldName}".`, { - nodes: [knownName, node.name] + nodes: [knownNames[fieldName], node.name] })); } else { - knownNames.set(fieldName, node.name); + knownNames[fieldName] = node.name; } } }; @@ -41105,18 +40204,17 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness */ function UniqueOperationNamesRule(context) { - const knownOperationNames = new Map(); + const knownOperationNames = Object.create(null); return { OperationDefinition(node) { const operationName = node.name; - if (operationName != null) { - const knownOperationName = knownOperationNames.get(operationName.value); - if (knownOperationName != null) { + if (operationName) { + if (knownOperationNames[operationName.value]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one operation named "${operationName.value}".`, { - nodes: [knownOperationName, operationName] + nodes: [knownOperationNames[operationName.value], operationName] })); } else { - knownOperationNames.set(operationName.value, operationName); + knownOperationNames[operationName.value] = operationName; } } return false; @@ -41147,7 +40245,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueOperationTypesRule(context) { const schema = context.getSchema(); - const definedOperationTypes = new Map(); + const definedOperationTypes = Object.create(null); const existingOperationTypes = schema ? { query: schema.getQueryType(), mutation: schema.getMutationType(), @@ -41159,12 +40257,14 @@ function UniqueOperationTypesRule(context) { }; function checkOperationTypes(node) { var _node$operationTypes; + // See: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { const operation = operationType.operation; - const alreadyDefinedOperationType = definedOperationTypes.get(operation); + const alreadyDefinedOperationType = definedOperationTypes[operation]; if (existingOperationTypes[operation]) { context.reportError(new _GraphQLError.GraphQLError(`Type for ${operation} already defined in the schema. It cannot be redefined.`, { nodes: operationType @@ -41174,7 +40274,7 @@ function UniqueOperationTypesRule(context) { nodes: [alreadyDefinedOperationType, operationType] })); } else { - definedOperationTypes.set(operation, operationType); + definedOperationTypes[operation] = operationType; } } return false; @@ -41202,7 +40302,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined types have unique names. */ function UniqueTypeNamesRule(context) { - const knownTypeNames = new Map(); + const knownTypeNames = Object.create(null); const schema = context.getSchema(); return { ScalarTypeDefinition: checkTypeName, @@ -41220,13 +40320,12 @@ function UniqueTypeNamesRule(context) { })); return; } - const knownNameNode = knownTypeNames.get(typeName); - if (knownNameNode != null) { + if (knownTypeNames[typeName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one type named "${typeName}".`, { - nodes: [knownNameNode, node.name] + nodes: [knownTypeNames[typeName], node.name] })); } else { - knownTypeNames.set(typeName, node.name); + knownTypeNames[typeName] = node.name; } return false; } @@ -41257,7 +40356,9 @@ function UniqueVariableNamesRule(context) { return { OperationDefinition(operationNode) { var _operationNode$variab; + // See: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const variableDefinitions = (_operationNode$variab = operationNode.variableDefinitions) !== null && _operationNode$variab !== void 0 ? _operationNode$variab : []; const seenVariableDefinitions = (0, _groupBy.groupBy)(variableDefinitions, node => node.variable.name.value); @@ -41288,6 +40389,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.ValuesOfCorrectTypeRule = ValuesOfCorrectTypeRule; var _didYouMean = __webpack_require__(/*! ../../jsutils/didYouMean.mjs */ "../../../node_modules/graphql/jsutils/didYouMean.mjs"); var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _suggestionList = __webpack_require__(/*! ../../jsutils/suggestionList.mjs */ "../../../node_modules/graphql/jsutils/suggestionList.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); @@ -41326,11 +40428,11 @@ function ValuesOfCorrectTypeRule(context) { if (!(0, _definition.isInputObjectType)(type)) { isValidValueNode(context, node); return false; // Don't traverse further. - } - // Ensure every required field exists. - const fieldNodeMap = new Map(node.fields.map(field => [field.name.value, field])); + } // Ensure every required field exists. + + const fieldNodeMap = (0, _keyMap.keyMap)(node.fields, field => field.name.value); for (const fieldDef of Object.values(type.getFields())) { - const fieldNode = fieldNodeMap.get(fieldDef.name); + const fieldNode = fieldNodeMap[fieldDef.name]; if (!fieldNode && (0, _definition.isRequiredInputField)(fieldDef)) { const typeStr = (0, _inspect.inspect)(fieldDef.type); context.reportError(new _GraphQLError.GraphQLError(`Field "${type.name}.${fieldDef.name}" of required type "${typeStr}" was not provided.`, { @@ -41371,6 +40473,7 @@ function ValuesOfCorrectTypeRule(context) { * Any value literal may be a valid representation of a Scalar, depending on * that scalar type. */ + function isValidValueNode(context, node) { // Report any error at the full type expected by the location. const locationType = context.getInputType(); @@ -41384,11 +40487,12 @@ function isValidValueNode(context, node) { nodes: node })); return; - } - // Scalars and Enums determine if a literal value is valid via parseLiteral(), + } // Scalars and Enums determine if a literal value is valid via parseLiteral(), // which may throw or return an invalid value to indicate failure. + try { - const parseResult = type.parseLiteral(node, undefined /* variables */); + const parseResult = type.parseLiteral(node, undefined + /* variables */); if (parseResult === undefined) { const typeStr = (0, _inspect.inspect)(locationType); context.reportError(new _GraphQLError.GraphQLError(`Expected value of type "${typeStr}", found ${(0, _printer.print)(node)}.`, { @@ -41408,8 +40512,8 @@ function isValidValueNode(context, node) { } } function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDefinitions) { - var _fieldNodeMap$get; - const keys = Array.from(fieldNodeMap.keys()); + var _fieldNodeMap$keys$; + const keys = Object.keys(fieldNodeMap); const isNotExactlyOneField = keys.length !== 1; if (isNotExactlyOneField) { context.reportError(new _GraphQLError.GraphQLError(`OneOf Input Object "${type.name}" must specify exactly one key.`, { @@ -41417,7 +40521,7 @@ function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDef })); return; } - const value = (_fieldNodeMap$get = fieldNodeMap.get(keys[0])) === null || _fieldNodeMap$get === void 0 ? void 0 : _fieldNodeMap$get.value; + const value = (_fieldNodeMap$keys$ = fieldNodeMap[keys[0]]) === null || _fieldNodeMap$keys$ === void 0 ? void 0 : _fieldNodeMap$keys$.value; const isNullLiteral = !value || value.kind === _kinds.Kind.NULL; const isVariable = (value === null || value === void 0 ? void 0 : value.kind) === _kinds.Kind.VARIABLE; if (isNullLiteral) { @@ -41507,11 +40611,11 @@ var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ ". * See https://spec.graphql.org/draft/#sec-All-Variable-Usages-are-Allowed */ function VariablesInAllowedPositionRule(context) { - let varDefMap; + let varDefMap = Object.create(null); return { OperationDefinition: { enter() { - varDefMap = new Map(); + varDefMap = Object.create(null); }, leave(operation) { const usages = context.getRecursiveVariableUsages(operation); @@ -41521,7 +40625,7 @@ function VariablesInAllowedPositionRule(context) { defaultValue } of usages) { const varName = node.name.value; - const varDef = varDefMap.get(varName); + const varDef = varDefMap[varName]; if (varDef && type) { // A var type is allowed if it is the same or more strict (e.g. is // a subtype of) than the expected type. It can be more strict if @@ -41542,7 +40646,7 @@ function VariablesInAllowedPositionRule(context) { } }, VariableDefinition(node) { - varDefMap.set(node.variable.name.value, node); + varDefMap[node.variable.name.value] = node; } }; } @@ -41551,6 +40655,7 @@ function VariablesInAllowedPositionRule(context) { * which includes considering if default values exist for either the variable * or the location at which it is located. */ + function allowedVariableUsage(schema, varType, varDefaultValue, locationType, locationDefaultValue) { if ((0, _definition.isNonNullType)(locationType) && !(0, _definition.isNonNullType)(varType)) { const hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== _kinds.Kind.NULL; @@ -41703,9 +40808,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.specifiedSDLRules = exports.specifiedRules = exports.recommendedRules = void 0; -var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); -var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); -var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -41726,7 +40828,6 @@ var _PossibleTypeExtensionsRule = __webpack_require__(/*! ./rules/PossibleTypeEx var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); -var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentDefinitionNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentDefinitionNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectiveNamesRule = __webpack_require__(/*! ./rules/UniqueDirectiveNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs"); @@ -41742,14 +40843,7 @@ var _UniqueVariableNamesRule = __webpack_require__(/*! ./rules/UniqueVariableNam var _ValuesOfCorrectTypeRule = __webpack_require__(/*! ./rules/ValuesOfCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs"); var _VariablesAreInputTypesRule = __webpack_require__(/*! ./rules/VariablesAreInputTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs"); var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesInAllowedPositionRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs"); -// Spec Section: "Defer And Stream Directive Labels Are Unique" - -// Spec Section: "Defer And Stream Directives Are Used On Valid Root Field" - -// Spec Section: "Defer And Stream Directives Are Used On Valid Operations" - // Spec Section: "Executable Definitions" - // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types" // Spec Section: "Fragments on Composite Types" @@ -41786,8 +40880,6 @@ var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesI // Spec Section: "Subscriptions with Single Root Field" -// Spec Section: "Stream Directives Are Used On List Fields" - // Spec Section: "Argument Uniqueness" // Spec Section: "Directives Are Unique Per Location" @@ -41817,10 +40909,12 @@ const recommendedRules = exports.recommendedRules = Object.freeze([_MaxIntrospec * The order of the rules in this list has been adjusted to lead to the * most clear output when encountering multiple validation errors. */ -const specifiedRules = exports.specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule, _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule, _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule, _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, ...recommendedRules]); + +const specifiedRules = exports.specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, ...recommendedRules]); /** * @internal */ + const specifiedSDLRules = exports.specifiedSDLRules = Object.freeze([_LoneSchemaDefinitionRule.LoneSchemaDefinitionRule, _UniqueOperationTypesRule.UniqueOperationTypesRule, _UniqueTypeNamesRule.UniqueTypeNamesRule, _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule, _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule, _UniqueArgumentDefinitionNamesRule.UniqueArgumentDefinitionNamesRule, _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule, _KnownTypeNamesRule.KnownTypeNamesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule, _KnownArgumentNamesRule.KnownArgumentNamesOnDirectivesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsOnDirectivesRule]); /***/ }), @@ -41840,6 +40934,7 @@ exports.assertValidSDL = assertValidSDL; exports.assertValidSDLExtension = assertValidSDLExtension; exports.validate = validate; exports.validateSDL = validateSDL; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); @@ -41866,30 +40961,32 @@ var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../ * Optionally a custom TypeInfo instance may be provided. If not provided, one * will be created from the provided schema. */ + function validate(schema, documentAST, rules = _specifiedRules.specifiedRules, options, /** @deprecated will be removed in 17.0.0 */ typeInfo = new _TypeInfo.TypeInfo(schema)) { var _options$maxErrors; const maxErrors = (_options$maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors) !== null && _options$maxErrors !== void 0 ? _options$maxErrors : 100; - // If the schema used for validation is invalid, throw an error. + documentAST || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for validation is invalid, throw an error. + (0, _validate.assertValidSchema)(schema); - const abortError = new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.'); + const abortObj = Object.freeze({}); const errors = []; const context = new _ValidationContext.ValidationContext(schema, documentAST, typeInfo, error => { if (errors.length >= maxErrors) { - throw abortError; + errors.push(new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.')); // eslint-disable-next-line @typescript-eslint/no-throw-literal + + throw abortObj; } errors.push(error); - }); - // This uses a specialized visitor which runs multiple visitors in parallel, + }); // This uses a specialized visitor which runs multiple visitors in parallel, // while maintaining the visitor skip and break API. - const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); - // Visit the whole document with each instance of all provided rules. + + const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); // Visit the whole document with each instance of all provided rules. + try { (0, _visitor.visit)(documentAST, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, visitor)); } catch (e) { - if (e === abortError) { - errors.push(abortError); - } else { + if (e !== abortObj) { throw e; } } @@ -41898,6 +40995,7 @@ typeInfo = new _TypeInfo.TypeInfo(schema)) { /** * @internal */ + function validateSDL(documentAST, schemaToExtend, rules = _specifiedRules.specifiedSDLRules) { const errors = []; const context = new _ValidationContext.SDLValidationContext(documentAST, schemaToExtend, error => { @@ -41913,6 +41011,7 @@ function validateSDL(documentAST, schemaToExtend, rules = _specifiedRules.specif * * @internal */ + function assertValidSDL(documentAST) { const errors = validateSDL(documentAST); if (errors.length !== 0) { @@ -41925,6 +41024,7 @@ function assertValidSDL(documentAST) { * * @internal */ + function assertValidSDLExtension(documentAST, schema) { const errors = validateSDL(documentAST, schema); if (errors.length !== 0) { @@ -41948,18 +41048,20 @@ Object.defineProperty(exports, "__esModule", ({ exports.versionInfo = exports.version = void 0; // Note: This file is autogenerated using "resources/gen-version.js" script and // automatically updated by "npm version" command. + /** * A string containing the version of the GraphQL.js library */ -const version = exports.version = '17.0.0-alpha.7'; +const version = exports.version = '16.9.0'; /** * An object containing the components of the GraphQL.js version string */ + const versionInfo = exports.versionInfo = Object.freeze({ - major: 17, - minor: 0, + major: 16, + minor: 9, patch: 0, - preReleaseTag: 'alpha.7' + preReleaseTag: null }); /***/ }), @@ -69309,7 +68411,7 @@ function createContextHook(context) { var _a; const value = React.useContext(context); if (value === null && (options == null ? void 0 : options.nonNull)) { - throw new Error(`Tried to use \`${((_a = options.caller) == null ? void 0 : _a.name) || useGivenContext.caller.name}\` without the necessary context. Make sure to render the \`${context.displayName}Provider\` component higher up the tree.`); + throw new Error(`Tried to use \`${((_a = options.caller) == null ? void 0 : _a.name) || "a component"}\` without the necessary context. Make sure to render the \`${context.displayName}Provider\` component higher up the tree.`); } return value; } diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 5e24ee6250e4ad778886c374c7ca972faf2e3ce6..beee9c5781500ba5781fb0ae7b7640961b293848 100644 GIT binary patch literal 390368 zcmcG%dtV#JlK=nz?@@p@FCxVQ#yPv^BCPOrY!W-ij(rTy4YOW>1{hmNL=v_M@Z5jz zPgQqMk0hLAFXv)3J$V1E*^3!SW`Qh90Xtr@Q zDf_c>ON9^mv2aixSEKU9WPDyuW|zfxsdnQjtgHqT;| z+SXP0Wea~Y-5Fh+m6QJA&>{5Au-C4tqO6Kp1t`mEr5deN)%JsaD84FFgYN2PaWozs zS0@+Nfu281s+l^|@Av)TMcJKIH=S-(?U&U-Z&nqLsxW{y>Ucb9YhPwIOj%uDx67(` zb<^ogFE)<)!y%8F$lBUBLyb@Svf7_j2c50zxIMn;WF3r;SH>6A?{r4zzteV7&Mqce z)=e=T)zkUz)Yf=zofy9KFY33#EZ$sSS5=$8y{q!$`FJv$cCT)3Ive4E>2>&jeC!m% ztcQi=b{wj#>I%f^`qGL9fNwfC#pJx+lVYT8xnlKYwYDZCVBO57*BTqPx2~`A!sCn4 z(X1MeS_Y|MIa`@jE3}yTB3C1rf$cZ$nc4=+RXEq5l)7qKcq&jHKu05)Hznn4? zHSSzrk63uZj+@R_4QGSqQG|u#R(n?UD#jaK42Ro40sC{n-{}BPR&0=7tpGRwY`l3> zPM?hj7sFDB2)tSx)BeS9)+#vc!ZP7(8XDvS=cuOsZ0Is>vkx7xDMD|x*P7ZvYi*a+ zomPvTP(7dYxCTB@7?mGZIDco=v~06{Ej$pMan&1E{GLrNulf~}+!&P~XYCCX*_w@`g{IvIbswSM30537yAcvNnWDr#=n+B@Aap^Zs79S`4^^_z{^ zX*p_-D@N;VF)4wZiS^IVhnIeyI~|`Ull1jI9rXGaAh;uUab{508ru<mn~%M+YKw+!oX*ZZf;0B_`dXzo zop$JRS`Lrd$cvGWIB0FFq#G9!XV+#A{P<@jt(=F5ApNU%H6A@3_Xpi?3TWj~Ih}TY zn-$|xcTg7N4CJxo>>(=>rI%}n~!*1CoPdOCj+4z0geN*%YgNMVuW)#Z&X;jR{ zCnv+wpFS&Q{deK_kA=fz=i{s#O(6%}SCi1RF8X>>496#$_7D2;Jy_O#t6y59&S;?Z z-K*1T3fH^b8HvyjMCn7x!~W4}xm*2KcJFP{|1tP@`h4`*t3Rul@#;NIMJIRnL;rkt zb_u6wRijZkdA#@RX)AyEs2uh$yPK(~oXv)%7k;@}RHLKe#h`pL8dMyv@x;2Kf4vDs z4u_U-W<3?QnAfitY)Sq$6tx7|GQif`SwX9qYVc}wk~fNFyk#lp^KU~LeGZ4?4?Aq4 zCT9=3CO7Q$Pr`iZx%4uCegr^hGy}U1FJ|R*Z@gtJl!J0KtNKHO_N+Q9#}_l;_+k38gj`NJ{`*QDP0z+-%{?H)H{+v=DIlPZPy}XZsPy&4l)1g=Px@z8 z%%u9mAFA@h-lPv6i?LbnXXWg4JecmC_GhoA<*UiinoI#1JpmUHf|tJS)90h%r8=ul zM&n7jSAkS|^a(y0&Bp5g`RMC0$51;KPWkS6c{H_2*;%+L&ij)o=*RrDwS(eKcUHKh zx$~Y??~X4fY-M)b6WtLD$?E9fUoGq$4D2TK_hWguJ3e}cfY9holmo`E-ck+qwU2NV zC>(;wVcOK*zcyT0+sL;Xs(e$tFDFJ7TK6{ov2pLq7PO{!1?ulPg?ro|4Tcbbr?cX4 zJh*%~9?kj{ke`;tQGfK{NYwG^7;$YEBi7l^=MP5WPKUmcO5yOUVHB;|<{R#heFU#T# zf*Y~EJ1h{ZPfFK8rrn{x_OtwCbUg0v731-t#_8^q1te*58P6FsxqDFxYdLlgMgyz# zRs|w~PtMNDLB#1Jn_Qg(g;PO{L}8s zo8m*y4@=?vhd&nxSBP22jG{H?f-y&_>V4Qa>!0VsKtyb#4y`*C5>!qcLP-lD`R%wG zwOhqXt5fXu$~J_nKj8PT`aRQ0h_+ok21>HwuEr?$)CcO-0HHZ^)(PMf9U-W&|{!mUH_R$18$ZYj6Q{Vqirtce@e)Rkqg2}X;pu|fJ zbBcj7xeJjVov2l7R(_n_MPwa93fX%!YO&m{vifRst5a6%>na5mj;jeW>}fR|#Dxn} zw84%vLhoStdK9obvZi)NUDwn7-k{>t?(TgJcXtE9Q)DbVjk3QuIzwVst&JdLAk})R zN|;3n_+oUOc~Hy(CMEJ9)N;3IwHP{yAzEE&i?#2^ep9q(t)%_o!iCgb#eEWh=p5$l8_#CrvwHpaKfuPvA2{4HfS4A) zwl=C@==E4|7Y!B`;)A{9Kz=_Slu7Bgp;S1! z*5vE<8>gtf9gq|5F<&!7#Yb~u8(Nn%Ot zkU+?@un1M`bcEN41I;Y@lcUp4aTg)xvzl#lu&B%CM&5h(_1!z4-E{^G7~LK%%AfEm zo6oFWrWbpYc0z`l@1@rz#t&*^tVlcajjblEuh0f^NyM_`$O-q zURbpa_?of=2-JOO;Lw)WD;8nO2{S6@d|Sy6YJR+=`J33BEi)GgePO$v?YZf$R<%1< zs)|O3SS5u+V@gkKXgC4+Of*#OdYZraI0mvb6yogip+fC!G+?RG%nJDwo32rx^t6G! zNK3588~v&ALhVnEM~C(BVWD=c8|BUq;C-7mLqCj3qiqK>YA2iNXFgLQWY~d5hi+DH zF7C&LCdOCh_ToqaI_hT=?MGm}_6~*@p=0>}y zL4ywlN3?3;%=W(Rz;}!hx^Dly)9D=0UEM@}o>bpRM_&IwLVbx}@&UHC_gTJv1uMjE zbtrE_vroNGeg0GPy{%77oLJE>Fe9no`1Gm1W1ZCh&-4BNBb#$HhtPlgsi|r?E>!Ts zf5c*m3R!Iv9S&TIXpm5mL9L3zCkFA)UXz+PG-hKv3$1A@VQO=0RNaSn1lbRz@J>=2 zQO`$}$%|-%N8>Y*$EX9p7`xj*sK$CEL~T5J{_xeao$vSFym-F*WbeuI@87(5x$|)6 z(Ub4LjmHOd`KI{!zdhSD(e-=G8}W{R*Vq3SC;ZLxr%#{%I5*+iczTf}uy8bCF!4m} zZyt1i$#^_~p{S-u#*rc^a4o^L3{IagUp%3%jq|zY%VDs0+VJhGncK;0X`+;$gx19n zW>O*n>%?|ry}${r4#z#!K}D#C8|1^io#d=i_=OE2pU@Wg;Ik03GGn;-n1;sAwqf(Z zGO`iJk~pGnz&Be%Bt@eNx}&(3h`lQ(`8>k17pFr%jp<+;3Da>N)tr%nDYSafJ)cqG z;PeS-cIRc!U>clH?r>?haQexFpPA6l5*DZ#x=FGRy5+{K-xPDqXSi-!0r~eo#&!o0 z8iqTF12sUxL8R^GcKfjX`Q9lpS@;g*He6|aeh203^VZ6EwDP&Bp(_rfa7|yCc#E%F_E!f#K!SOKq@g1x zbq0fNA3m>(YsPWhkpqCa@*9D{VLz1fupHD1SL2Kv`edRq#AwNc)Q=9aw~s24&wO<=Oak>H;pT@p-7A++>M@#7#K7IO%Ciuu88BRCTtC2a=0&RbQg$U7 zx;JhcW42>YJY zv@xi1hzStYAz%bj6Q_bB72*_X=Bjs<$HIQF=aX-n4sIQZnm%`Q{-ADKGd(VhfYehA^yP32gFugMA}Nx zM%^ocgkf;TXKvay;Vd|Z{yD9eeZ;aE=O`QJ!77j+slewAAY{SMB%XJzG2hZozCV?%0ufR3qQRCCFD3H>bbrK*$Lk`y9^>XaQFV z?xX?~1vxgi#?^gsKR2h1lSlViL!0SybM1_qYr?b&Xr2aRTr7>Ah zix;*2aIfQ=4KC68-T?tmb`sboAy)%A+d4>nu=4_qg@ZP%sHGjdVaG(U3v)S7*?Fxp zcRHuC+*+?a)e#+-3(mIo<9e(Kj0PbX(FPk-1vNBSrv~^-0lXtZYC69SuYd!BK+1gh zRF)49M%eHWE_VkybwDaGB)|?AMEI{SpA5jr4pO4CGI>Rscw`VfwIs{uxt~pU) zbFx3-ZdU~eobUz;)!gVQrfDYB`@D4rylZ{V%rtVJk^AyMM&=FH(0NUPI$Llz<_eOq zRY+6QcT+b2C;HX7@+uG>c9Kxt8cxrBHv^5&T9_@OX38lj41L|aV#W9V=U3~XfKDKi zWL7T5iM_3O9Rn?#zO~=Kn2nDW?sQ-#@u;X{F_Lkm2^KI0vv$M*7HAD~pFm$Da}W@G zw1GO`zWZK4>y0DXAVi*~;b_Z~7`Iw|)}F-QM3!hH}t|evp+WE9vFWA{(p2Z zEf9Ueg8P$)%<936Lxf&<9i<{H&h@@L_01Q`)5E6FjkdMml4xZVz#4BOm9zm2m>lCq z4Oy-^z%I%_2pNRsP#~GgfR{?Jp%U&Rh7skBe4-B;6AiK^v*lEeM*jP7 z(ZX~aHEg;p;E!t}9vTGjvT0;{_x-YIQ#k}AVyqovyN))_`i1dS-2NW&W|S{I>Ez4X z4y-n&)6(=M545v-&7!<=)aVp=HCM@yRiAvolCl2OGP z1jg0HvrK9++=zTj#4QhNNPOn1TPxC_k!7JVJsO%<(G3 zY#519%*F^^ECw=ofJLpOb~)fC2B>Aw@Vri6n#^H&QjJ<&P0t?m=86SNit$zTXZ%p6zyQ<$(6 ze{D6wBdW-$1v5*H6L9OnAb^O7qJ!Z+3D;}9)5fKeBo?5rY@(RlPt|ycV;||R&i(~s zAJv3tiGZ}^ZBsx3Uox2%0SOf*3JEvCi#uS}hi(47xpB)veVt;P^O#oH1)Y*?H-8Dk zsYk%FjEnyu6pY*5{4P~+P|7O4<`sz8x#GP z2iY)h=P@0H)J}^H)MFMLC1X5nxt%K!5-bRzKNMlsiAE2mO9SDU`!n4XC~ed%{4`Mv zwey-a!FyAW?+bz*upos-l+$zE%caMVi-l@rNL2#HmFv1mq~5W)*2t<*2c|_Uc5^P; zf$4cW=IlE5)(cG*!w4l{t**9BVQdfa%O9Q|3YR&8=Z|A8ZfD zVkp$~F8bB}5LMolc3l=QPt0#+kFbrq#mC;={nyjt;BN65CHrqaBSP}Q`Y$~Hm_Ki> z|AV4$%ijLyt!XUD3z0I-MaVVRsA zW^H))S-BBHFio&Gp}qsuVqHLK;ADfo zEz`EL`_d!AaGc$U>Mr)w?<6@e0Zqq-%43q;L!P>!mr11n;;d_lTCZPoWloKm(jS|w z(KF~^qpP$^u@&{SjHmo7$MkS|7D2q(>1ggu*sU}1;h0-RC6f)W!A2Hh zR!UC}l8Hzw0X>@sTJnCYb0s1Ev^pkG%Agmx@jVHPt>7S7sb#*Fd>I8mK>+XZ0_`kbnAE|kS57_ zBPxbP|(vWwX*Ax6f65y-iiP}r9x=E3RZXvS5;QnxuU z4cgx>b}{b=b1$UAy!nAf00@J&WMfc^-G}r+MIgo7wz78H0lU$_WqW15q`T4% zv1Fl62Z_VLWqpathkeAn5@E6u@0X^7%K2`!Fn*`KvY7f9X$)TYVHHkCv`E~d?sjID z7sLOuijZt{`b(Mjxy?q!{@B)@P3xa!ClbK=tpW!8^+zFqk;TcZ$L&P?XvK;GvvDN% zi{RI4)#PlHV|hSh2pTYg(1~LV##fi11oW{s#YZ@ZUD?aK`^9T$@4;Q;FjG5AEwK&X zLwtdgOOQBVAlHoj_G!ys+-$`WK&6dyF4D!jX}v*vuK!LE>u#wx*oB`{W~kmq@)`~~ z&)DDG1^JEXU&u7llbn)baZ6;A_~pb6(ZMnD+4+i9>#6dR+mb?A2H}Vj5K=vH@uds0eKz zos>9k=sNuF;aM}Dn<^=&+iF;J_rhyMqH(3f`|#h3eIWGqFCm~dMU4#P>IunlVKw3g zeuSMhCvnW(fw}e~a#2}%79^@k8QZ}&lTzMaPa#L z!v+yTXdK+F&2#KvHhx!*pv@6TSbO3jRMG)n__<(z$DHp!)l;GwHy*yQo%a2?*JN?)dN9hK@BY0$6 zpgbFX5*6j3G$4LcuE?i`EW`%nY$>yz`BkGR^(c~Bmr5)YUB+^-6)vs7bUh(v27KWj zjG_S>k2NF01<6`6NDXsHK_%%kGj~1!i+vs}-d^ceuLvP@uJQZ^3lRf{(qu3F=K0HK zP(XyC5d9%~?;C<7AVG9~K&+HKyPz&fp|OgZG9#jfH-5(*&P*%Z^q4&6E}$`8k{hJ@ z{gC$sO#rviWQWuYwJ?o}d39>=i1He|9!6_2@_YSGhixtgKu3mT`D9%-yE!%gn+dRL zub5vm9gc&?HAeb_fy@44gVKAiYBf zOp;Yt;=wjju!Wt4=MLgykMP$6Nu)ta;{-3kb&%D7A@g5ps4J6Qf9g2^WD+zp3v7QrSPIYDPmG8eHHHrow-BtHgKx%@q~SJ8G5j>^ zB@|{V_fd|$XSbHBpJ+fa6(ESWHe+(ZoRfg)yw8MeN1-p8M-N`Mqz)Ky~e zm18Dewliy2bAMgoTrGHcjuUJmm8?xh`%T{d1PbnrQt z0A3E}yp>EMyinu}NtRsXj2&wIp$K6ktAJV0c%!y5Z+HuT&RQDfx-qcD!4xOy)9^vU zjBe>Gjcc7)UBZ*{$b|rIgs)T=3VwrZmHeCLK1~R<@Ip8>U+8EPwT`1+(%yf{Gdpga+bUV;Ay6k ziqA#GStq>o%S{Y%H6QUeIvuN)c)`;j;IoP&NgT4fi5wwlZ-b9niiNx`cg+=o=oSgY za3{Gkrd6YA_P9Si-45tccdrnYMd;b}E_3og2b2s(4%fM>UJG5_6lB;ULk|0r3kqjB z4?}LT^ni#wj}S-Ak4!K}bswB?VV;NRbdfdCQq;w3h~4(aoetI%+(2%0glZ}K5xkVV zY!Fml+&l1#UMk{UeG6*HdwpY6Mx7%0XDbX|o{OP%SAs$akYdgYlI)#!DpKme zZ4~}HjS|ubV0wuHu-)wCA~Zt4>1=jB?OG0y)(7%v-6f$37CoZCZ>!yPk%224S#3W& z2#JVymKC$k93(px3L^eQ*%s@=BS%cGD1Mk)d}1;_$|d31iOl$T>7YXp6)l$yq1hD> z+rPKD`Pbs!=DjcV&tDD_=YifGfjO4Y!dNye{)6<8&en1TCfgS5_{ymVD*4c)w;VM` zmVe=MDLk$`NjASacn$0N7a28X~6%Zg#WO- zi%K?ztsQ(tC0x&R>N>tLg9GxjtlS!|Phae8y%RBN9}1-FlM6fIMgtCN;vjKE^%Lb?dIgi~UZoLz49WGxb3>-R zkY!KCSN6|PehN_ZVA9}JyYN`;Y#X>Z=lYR$;Bpcqwk@y$sp|30gGW0rcZEsQ%4E=J zXlTaq&~XK(D4Eo0pMVx_!?Md!IE18$`n2sHvtPEWjxWvOTOcEvG7fo%zs`$@|>VSF?wBH&sR0QSA{yCoOjQeBTdWc z#u<5^I30hLY}g~a(HB;FPP)r4rFH}uVC3-^oS4Cw3*|T5BoTAbeRZWyug_Ub3d*J@=@5r)q9aRqIG+KOXByj-Eny~nAhQ9`7<0=V9 zJC5FvEoL6Kt9FM`7&R;SP_3^>A1vI;L{m@>!d18$m0W4fwiPL&NYRCskT&}2MoN*~ zJ7|D90Q~C3OMv#&>1bNXnd8;cW1f&NuhvPc0JwdEC zxp#FRV^3QW8iKRyOkoNPl`NaCb=D_Ilmq}YlyrE3-45WdNueAQLoB?l4?TC8 zJRzEFc+}fIPQW8sL()Krvp}g#09z5drYp&c$7xo0<*Ed>rT6t4QguIZDO@axv z_ydKBRBPplBZ$}^l4@f^bWXVW8bn&CZ9HXC7m=;*1GsR?6jGJwvZp4p?NS#fEZ)>D zgnRjh{5jfO8if$+@o0TnB?{v_mRZZ+HCAC7B$ISEsjtx01J8feDPryh900@-k}x*K zuEGu$Uba8qxO?}D{r~sHK08zUKfCG)8EjTNl~BM9qW3!XD$N3FmS8^(9CCdvhh$S?Uus zkce)n-X`&;DUHkSMgnqt;9QFgTA9Ee3L?wS1?LxuNHN&FL}2lXj_*1&&dX^Gy1;F)ju<u$kw5&2iHedi4{OPs zNo`!;B-g${AFi)+m!=w^Jk`=H519`6D&X7_6@&O5xfP3NSiAw`f(nAqlsk%C5cr)M zTsLSHKasgB!R~7xG}2K{u7~?-7d8>?AgknVsmZG6Zt+i(C~8x=TR4))aaS!OHSXL| zupv)3=*oobuGaw_^_bsiOqd~KBns{7*4Bf`q<@JVWPhR3D9evMpZQekO``x}>P*mt z)m~hZjB!z8Sd9Fv=!F?dhWjRle}*tRO-DxSn2=HS9{7@iAQu46-qj^%8f^AP=d3ii7 z6AO`YvXdcudSpL|=cZp+B3;77yRX+@Zyem|cG??c(3Rz#jU$?*Pg(&*`+53eT>@r2 z0@2B$>p8B;lYLLebe}KG=*5?00r96h48^SO^gt^?FRo)~Ukn1izV+zj)F-e#NB_4D zmj|Z7CdLjz63l0rBWt-V@_1-u;PC)T+ms}?eIkpZbhhM;$!jhNpk_F?bRMtAnyE#> z5dfG(6+8z}#8&6dUj%=O9Vj3n-VIWQa>xymt#yP@{{;+Z|ezU@8&39tRE+OIdt!;q?{z{23C~o5NXFKAH4BfTz~q1;9Ko;YcCNy0N3b?}r^2hkvA*LTYQHx-V2^`wvLd=b}orf27lUg3wo*>FTfxLfE&+d>7RoNb# z$u)zFi2m?th==&}honrlPs4b~pVA-eOC+8r)6#%+ z;rhK?@l?!6yOniiQjeXLtWf>ak(q)(u3S8I4?^IezQJNRWjow4ARykjSq+eH=fEo- zz1$OAw=o}?_Kq#%4j*Ko-cqq{DVkUs`5A(cYQ-{Vc!z2k(|)@5W*ZlQl7RY?-gjdO z*+84AL0da7Up{}?U1>?Rs3(_Jt(hc*1<=MCO>Weu=>UUnCBp;kyg(;F4F}v-%u>qL z2EfBYWq|O+rGmZJvJPa8r^`bLqvn2U9xE$~K34l&2%FW3!io3~WYxaOVJIinTf765 zXHYQ=oo(HXmRx(Ka}7Obo|xcZ)q02lyGGjH}LMjMWe?N}0o6iXEvVGVa?*ZS?v{1d2Evl+q2o$7b|{IIER|C8;cPaZ40;H z4iY)WF4x(TEY2b?t#u21PR{yKzQTIr{~3uJtXc>M_(%+Ff0IombeO(ybzgpdO+0?| zCYUoU>93uG^*DzkeHANB;)b{8Uj&k~j zC2F#KcM8=UpXL=>`WexAd>e>$BfQ)0yC@4{fpk&2ycM`x*)<3oI%`Do5>bf;=oPY~ zT+GYhUd%aEWhM_G@GQu}=_LV<`G!Z|*-@W_{6s3vEp5r|r=OiTvK^~JrEr*}CnEgM z?LX4bpWlDT(lYZD0|v`f+W#=N7e}t8nbZg1Up`x*1d~bIl7A@;tPs_yQ|~DGSLoX8 zaT0U6LaRN*!{!IXk!av5>>Tvn2> ziMXci;^GS7qRC#e_zuUgqlD%i8EnH;(_Yr=?R|15;Ks7tFF86cqds=(wcCGBq{)?5 zsuLKdwi68K1q6yx-zC0ZM-n$XqcNV%&*{%_^t5%c2meIh+FE#yBGB%Pv)U#EoHMMz zxWzsb^cDY{G0B;6?fRn^kSe2z*{9lIYv6b;Z;dA>ugxz18ci6YuzqMCcI)l`=i0#+ zYulEWyl7kg;MSV7CjYsOvXnZ@6vaQXP$l-5UnSqwgB}*}pgf7%WNt-&5_HQu#Vst- z%gKPYCiW>_j0R)hrr|);XQ1-x;Q-2%@YA!WkBRvTU#-*WbL^nIkEfO?RcY{Up~to( z`re|ffjUqd3WsX9zTMdq2o#;KLda(5KiqC_J^pDulyF@xy9>Ll;^V-032TA@mw&wB z!;6W&$h1y|dwq=&Y;Gc(&37axQZGTynDLCQ*}(QZyO@5}BQ_F2yDqu^?*vOKW#8|? z38@8<*ZerO@f4gCU5Ys&Pe^}PgS8%Oo*t(H3IQ1UlSO?>e5*f^m1;K_X znvjE8-Q+5LSegeb{z)%k8 zA7B6mX1IkjTS>i9*yXq=-@bk40#xe&8{Z5zWlzHL79ay&FfHv2rxmHhBjIYdiG!D3 zoY*c8K@5B1BzSM^`O*D}g>ue}+We^36E5J9=bOUJ1EouEmngQL`( zT_-9vks+8?G${}n&ju_*6+zMd4b>#0N(zWd4?p+0W?@=3Oemd5DM{)I$YQ(EapKHG ziGh!y%z6O0QE+{|*&#hC3Qyys0ZtC{(wdFM{xH`NqbQ7gb~$pUNm?}2mu9+=$#vKw4;X!2TLBl$C6hHd@NxB3%v^BHBA ztP;o?T=60SD_VUy*K_Ir8ctdNY>Ws2P^qT7c>ENKF0$|`$Lg_TQjlg5T;%kWIm3Pa z{v?Un!UE!4<%wZ0TgO#79Do7)@deJTM*KjyHrgl)20Jf{zDaTooGIjZzLZnX-M;x! zlA@KZ?bUmV$v1Bv6NYpjy*uRVV2!~h{XsQuDX7-o+b5grb95A-EKxzKZ~P>?=kqYv zRy^pK*dYZRbb#X@lhn8HD8kCnop-c!wwonvLafd1pl>2;YiD#P#L}?o_pMF#aSP>* z!nhQ3nhr9b*J-^RaYV?w7PSgSI7#EimDPX=bi#UlcnU}}Og)N4*x=jPS?QuB1i+pK z|7NOg=;y~7AF-~^_1PI7vYVv4WSV=pr|5ecJQF51BneBtI=0WIb;EWb=HgAszNxB< zm;oD!;js~A45lk>x?)#i*Y?aSHWB3>r5hl!W-dNzCE8Nmj>3&!TZL_L$Qtxkdb0Sb z!c@>|6K&V{IUMn>07n>724@BclnlK3Pz{Gacz84LXk05|_A%-?{1hxBE?T2%cG>30 zh+!KdgvcR2plc!cLh!nm5LBt}saFG9rnmft*dpraP?}~_H|ieqg&{Le{5SgSWMWGE zPP?NBue7iZr$2NG*zM7zU`im3!hfB_g3 zfijxQT6YZ!e+d@ylKoN9vQg$~+}E%6_MU&gK>D71|KgQS*lm6g-yMsETLizxP;f7e z!Rv6iw>Ust!;GiR&|O4;aQ|FTvTx4ULIuZ$9MS36C=*-0P`_tUoZ3|k!B32VHe5Jd zAPHm$s5{c-k-VdGzpx=;0%XG|40w)8+X!S6Zi8FiE1RE~68=he$65BbIlA?SD@cpZ&G8f8fh=+m86 zPnVa#gL&$qMJ&3oPa=HBlv5;G{QDgd?clHV_S0GyoN!egTLL_%HXhq_QvLSYK` z?qvc6#Bmpf=|iS1v)`@UUm3kUK|yqS)trg~Ex(l(?{2Pw78w zN=OFTlt`cT=cXjALsrm)`1$GSSbX355=dR<)4Io}j_J-S@A`^)AIPdN6TIc4PZ~4c zkdm$Pu-$q!dN&$>7_AULU!f%9#T~6cV-00V{v{`KWV1PW-fd8wnpBuD!NmX<|HC-yCPqzvR97vKDL5%B7=P)fHEDr2IsG*B_f6?a^0<_+}jNa~N+FHC^Q zQC)5>Br9*Iye1}D#g^l9=u@+ue+yYn6JgTNvr3~I06JF}RpC>{SI<94R04Bj*Hy$$@ z_Uoq_3|-Q1G0NmmdNx80Qkkw`wn_zuK=i<_rf<_=l{@%v zskB6Ag)R&Cm-Tt4g&Xt9`U5`dvt#No2QTOx+2MNN%VM7Nf;HFtjJQ8jq#(bWS?0A0 zAt7q16ixpac-}PW*^rAAAR*FW9|R9^3=%z;xaSW0gXq$GH6iOwhylvGm#r@W`#ICr z#zvbY!_08{YB5TNHXO#@+>JaX;H7T-eZErxZ#+Dp5opOqVjV_AfKqZzjp)g6dFT52 ziMUWJeRPzJb2c5%p`kq|9id5H&+%1GszKR3rv(JuPNfvail`msndzpssu7Zt3CTT2 zT5;v+t|kOOg$!DgB50*n4^fX-xI$zdkuv zTcWRXaY;3xpE#05Qv{f!t6}6D7ly<;VGjAmJ-nzx=BAE!`KAdEjU|hEhtO6K5+WWk z#4^7oMCGI<7j;ADce)B4Uwl2r{7{YLSupkh+whX0n~H-=NwkkZ-_|-EiA3*|sWDK2 z>GRR>(xMaPGFf6JF6}5N;8hWEm@%gaaF0nksrWaMnGB~B8iAMw8MunGJb04r6og-Y zof{$+2B~jSbx2-^nbd=3F@2z8Goj=KlWEJW!vr6i)tbN#KZETbxRBxSc6cMEr zo;R;+0+(SsPRz`E$(Yg-VoJ=dldvB^NOnIaEg-*dR8ILe->1s&S@Zbm_(M5)$hTM8 zk{xjN_KEM6=*ZD}5A#z`JKC01NXn>VN_@W89do^edP%+&Vy6vH)E$xF}~wLTZ9BF3NBux(}-YJM`4__Z@;f znI8uu?NFRJV@jr4y|;i2w%Dfbt#gtO@L2pn<4lPZ@>)iyi1wuC(l3yMsL%BeNJ*fE<%OzyYl8Q?)_G~8t;sV0kyfqiA2&tpMn=jVYN;i}C&#Y(`ZXLAr{f(y) z`$J#JECV=_?8}}gFB@$`DzOJSxcG$o7JzL(2+I}zr{(eqm^3;6l~#A_@LCTY+JOyn zzoX`_cG6G=wtmGa^ef2kHe%&no`04@<3g@KdTQ46H=Ua}gx6{Lw4?qHJgo!d62r)8 zqF{?}lx0wz!G84RLf_10>!9)qg4+unI5Ui_i`dhJvnB((kAO7X`k(b+>txLf(~zHV zq3{pQ%_t()6DXn`z+Gn!&4|G*`Ub;$yHE#w1rf)4KR6ZrS4MU+j5Z`_HozFaFiq!X zc6ycqK7J(h`A8Icu1d_e|D05zWS#gfCmiQ)-8WMCU8Lc3V#RGrL>W#-Y^?ay_4R5_ zuR>$OXsvqpWEAsKlUjbBll=c%G~BV`nW8bN?hMob9? z5uKo`7<887JUnRVucp|AHNr8*N! z{n@;WRCzz*yGfSn>}S{sa8EMT(tuwX1|kUBFY(k6@oNFUL>&?25aN9S0Zs&RP35N~UFWi3uAU~G`huRK2sd}iMfgenqWWaA;MbRKy<%_pjG`lnO>E3C7_G&6= z&unzlM0Wuso{QoI4A$=26DIQtM{!oQ`&O(r8uq#`c?)aTrwPkJZSd;?v8Xh#b2YP$ z+!-ZhJi%!@B7S>z%DssJu2aN_DGXX^8RH|G&)jp`gt><7&{@e%Y;_QRTI2LPH4G(5 zVpxE#2 zR25O0w~!zn-i@r~XVYH(Nza#ff84an@!#C~Okp_>M+u!;M6ci9+mq)&Is}=%c2GEx#fR3Lcw6jRa7q!`{5{ub1pYmBU|eWt_s**Wa2T+cSEQ*s`+gE zicbv&QB@tv`la_lOMV8WN#vKg7moZ=a7mfL$-6l6Do9{@+GMN4K8Wr)6!8LN9eVe>>{&I&xw3m~TfS zx76at&2K_V2K{Xm^t7c@YQD{;1P<3nE?A+yL#<Sbc#e|MAzlC?0uFC8VG zn*ZTAp_?V6G$^;S4evHS|*F%MvEyhuwf*)fQ!1!kxqtAf9no4uAJs7 z=IFxIw(hqP+3T`GBf`M-%6=8I@vJ}8v;DxlY5#2;FNfByJ5P}7%&*Uk9DG&w{-NfwC{Mvz90ynno(9e^p`YV z)*BIy9uVyO8s7HRP4`NML|G(6nC*(Gz>RrC*2+MuiFPHKSVo)W^2y(We`ZP-iIw@Q zb`}dZ>&Vs2$ZTga87sgiOf9^^7}gBqkTJ|Q2n&{NP_PClfeEi1 zElU=ZLC+fzC1{`yJg_TW2qR>TtIux7Ri@zVR`|vPMkFkq`ZaMT>by5>i!)oXK@P6L zTP)2_Rb&x(5lr1oNW14Y1>x-48lPd+fzQIxOub2!pN7ons!b3dcZKYbvh%l|m)OJ* zflF02{K9uz0UsE$L+mSr&jT)mO(E(^@fSSuwe?B3KIa)MN%qKvx^hQ8Hn3-CIn?h;E>>CMf z?P9eof^4x!Cm;?h%4QK{FxxYB>=sh>k`L7ABT8X4X30w!MF5(D7`;ZwruheY>iCXx z788lpv7=@4USNFItw7A{@exV=%guksprIC#ddQHRYJAnBMSVz1C<=Pt<+fKz#n{4R#)tabMUM*;^RoDht%ZV3;3hu&HY;O7H!DQmOAPt)b0 zIgBPvVHimh)>9osr7(g3Tv>k!;jsw#9#i6BdU2%hG?1{nw@Qh6PfOC(=KxLU%a?!u zE3s~NKfHLUQ=M=gyXzG*d&W2m8Sa4r2N{hT^Sx3qL+c60iRX34Jr0>;Y%4=9iw|=NZj<81>V!GMl(9S6ttqd||TmW9w%1S%%s^-14`eWG|=p1AELyUP- zM?lQ>#wRex+h45F2{0lC?!Co^ot#y2KD;l3Q?tONOZ2Ad>6gs-&p;$LOh2}PsS{Jq z;jR_hAV?zr`pm79YvGaBNjZo~pjdLiNK1XdYn?2@iks~jl6C3GKes)k0` z^}6lJr~3%}nO<(~!#5Q}s$UL;6q58C1kuiW(r*qC$PZp41O5s?AHWTVBm|ZU=D*=z zShxJQTew{M!_=CP08|bb@b%@BL3_TwjGia|476J1-&pQJcs-6>`@9Zm`KzeK`n8sV;}gvc(W zD4l{Jb*w))#(1}`D$Y_RgJNFBYtFVpzPOacW5V}Nu^^#jU9@Bkw!??LE29QL-4|(5 zeDx}^v0l9&`MpfdZW$zE9Z?=-jpt$)E#ea_OjkQU1&sF%J$}~$d?Pqu1WD8m!s3-6 zfNj~9Jddr5)wh0u#;`XY#kLTKW|)>mqP6)oo;K!qF zq>vQ*jVA*`lfr|SUxSaY)i)855vLHyZ{2nee>Pc4%f>#QZ#<8GWa9%wpRx5Q)epfl z@gGiBj5ME1{60b<$zPKMUXBn?JR-zTrjjH=iwXtX1$Zpm1s>VrmkI+3F2;25Pln^e z{!l^cdt%5ImpzrR!GQDpuny8Tc1Sl=ste^&C1=)x7+-g6IP}TD1+*1N&>6OEr#Q`t z`HtgdTN>8@GkgFj;IjOJ$3CbyA2?T^R$EO@`>7#v@jU2pKgjFz8=c+UXcvI1T?S}w z(bLMdD8B6AYG#8j0SE@Av?)<~3>#Bhuv$narj@S1x=B^BVl`GCa#xC|=OkO*X|3qH zh7{$;Fz8iMXq{zpxgLUa`(y;gEsbnu-Ns6M;j!=llldCnnXCeFc&g3^On+i@ zmvm~?^;J?`fuZ043-%xFNvHT}LiF>21a^VTSU{ZZ%GYYir{ds#+^zANb-$LHF0Pyd zB=?raj>ZhU12{UY2oZ~){^h$=g25+dl9lBoV2veA#(N)dQ6DUZN7b{HAG z8=p>)VA^+Al&H|GEGcp7->?D%@s`+E$?lSwbi>3m=IHK*k0{E>>u5kA%GymS3$b{ST?JvhhN~ z4O1xYw66Gg=8>*4Z{93zyOKAKmKVtY(2)EUJL`!&=KH<3wNlge?n)SLg%mnx)0L7~ zCUSsm{pqp)kB7d0*WpPHjkIsSY2SpgoJiXkTsf0Vmtiqpf39!h?pwYFPX*_$%NBXK z;;E~u?H$guQVA&Eo!{rF2ly--K!f4j=Y+?d6D^6qrQN28Y*04NkqN4kLMXPCPgU0n zwmc)Ml|wcbmq0MBr!@?YS$##)(ktEe70LKg;bp{m3GDwRBHW+K+%jLyS^^QHK}} z=WOt(l;vO9rDYa^`r`jVSle?4dcKRf^dn0c{X+XdJm;(Wz;*Gj8^Hvq2%5*Iz5Yd; z4^|ehjyk=suIkPL50x2&z~=XTDE9d9tv)i7B&b(Mb>a4_qmA;Tz7RP@JBP@HhG=%M zUFt;`(A>*5`e%b}|Jf$42!$HRVPjRbVoCPc0V)3bJudWN1+-#5{8h7(^Q!$b(~+GeaNUR+ z0JuEDVRS|=c-094IKG`w6Dh_dFYIgy5_+qhejhK%AgF(Mq2(8}HSeTpCfIN*(FqK}Ve zyVY-HuXXQBu1nKAyudlhCF@>mGb=lXY@k6m3(uem)u>r^K6b4_v5+L&y^x(J_PqbH z+HPUYKb>(+a#$Ygj&^JPAN=S1W6RFRt3);UR&@FE^W$R<9wEYUS@A~%hbxtPs8D9K?=+_z<7(rXKQ>JgyBCTTY?FlL)esqZf{Wy`d? zv=OK1bM7F5#8Zq04^OM%p#6%M>Va?-Lj^qt6f;y9pIYTx(o(DfRC;lE??ps--Wvnj|%)XBURI z-CV^GW(4k}fqg4%cwm{16BahkkpWN8vv}u+*-1hb(}8aNzr+4vIlOyX4v8X}uB@;4 zBInn0~?3CsK0J6<@xgE-HJPgCi0!Pv{X53E@4J5#zKB zkv0!>Cjt7x9(jbk(1+(_YxE82KB*L(MXiK(3YOE(GDJBmh^*2B!9+4Tyt1fB+e-4# z`-AACn>VEOn_k@h{D}uNt+YaTKKyZbQ5Gv=A>q@WJ^_6)$Y?Cm90R;ipCOdq9@o|Y z4^dyTE+_U%c+v>Xdk=_Ge$Q;6ERQN-YE-~Dk`axV#tXCe?Q``dw^sV``w$x|FNTt& zZQ8_q2f||qi-#5Xew`SuZstn~69PO4n+p?4onek#c$v+1VY>g7K)YnRKaVd~$S?o- zYz4NpqFr-)L>Y2IttjSeC0mK0pGK=!F#RuX#|~Ne?*l8_*uHkT8pKOp4u;_VIiuHjBJ%s5m@9it?B9jg;Pz?D zP>h5jE3c%tQRBm;vM3>4?I=R{rVGj`0+IDo@m+bzAM6_mG!MeOO)LmZ;3eJKdiV-+ zAk+dLRYJKc6GmP4@@rZ>01n*YC8R4C;`QtXruq51|ES$VF*5cNu22Ih{-{V_@V_aDl?4x4168;`5SE`i!*x8Xo?vb4(b2 zVvRLMu_hwbxm+6#u@=4p?-LI=EK9O%VL>Gho!hblB&w;fuH9+W(19n7URqm@=-L1c z9w+P&gwbA*5J`&bfIM!i3xK`8UMM0Mp??E&{qH46d!nVO@BRUN-V|kzbW$2Yvihs zg@zWY0o5zcu()ztHdGC9Q2mAD$6=&yt@1vp;-U7F7LO+UMtEmr(xpeshHi(DW2K;+ z@$h~5+!AC?6@jl(a1whKc8a5SbgQD90CsqqUX^>`-D$Z$|H-$q!+n@!oi?TZs^fYCMp*O%1K}dXu zp^NxI!n9jRgOP)P0pqayl*)S-h7F~k8j{J&%X7jhceq_&YdxNWK0p%9CEHl(5L`|& z{h;7>$Zu8q%5{@2LTL>NYmy%0#RT6K+aYySNV0b5>z9gL)qD#Og^q$NaP5Zup7q>nR z1W=a_lg(2wv_Z1QF#9ofp#=(II}?!;%&~fc5nuUmRCm0XYnb8q0&)2t8gnA$M7`md zLy&G8=FW}BXIwP- z`GEkoRB(Yvg2L;82{&8TLKQa_XSOnX*trhVW2Hrt0uBIE;h3Vi7^wS97znj13dHHL3FOM4c?w@UTT$k(r%v2^Jn5! z+Y~x)pzjWwKF7k>)-GY;=pyQ#P8vuy1j+vXw|~?dYi=n9cRa7UDL@R~o{`zO```Kw88zFBc4Q0YYX zzIxH2II17U&fU+K^4!d| z@f=bMqqR5EQZ33xBI?H4=zS~(4 zhH*POU?zigB+k~m8jtGA{xK46#2Lo0M%Q?Wr}rO3vqsK`0J+ZxOL^r#6gt`QAjYfX zk$p&X#?5#fKxVVx8ylD~e`loH4kh!#70VqT3uOVS)*r+sB;iEb6BGdM8$=MdkD#Pl zBai`3DTO^BI35RP?7@~!8&aQqY*kkZ+hNU(#dmzotTn`GYV$}x!mcCg1+R$wC8RwY zR`)OT@0~jx&jh-0%5$wAmE;r1_mUE*ET2YZ8ny7x-*sDgDJM0a2InZAa6$q`%qoqC0>xu>O5mde- z6s-*Y6g#!kIMMA^)!|Z>M_}o$Y?RT+r_3wGGJ*Nwy@IW>$9R|`;RO4Lxy{6)OwCjT zFw1!Jrkp+-4=#q~cGfB!O5O)c$4$MNNp2-IVVoPIc$8J2Th*Ku0Rn25^{5)Pj2EQh z=#n#$4l3WF)>tcqoFE_B6IJag2(!!wYd+>|PvBv1`4mZV)yZ81En^zmP8pXL<}qHF zM_BHHybL+bvW55o^Ql|6Y%L*Z9Y#oCl6}o=Ono82@S^>qk3mfreV!4<(`^%)cXm;P zY!Ur|6�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 ybmy3v6MCg!8|D&&z!Xa>z&?S7ZK62@rW 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 literal 390918 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

4^=g`Sff(E@L(RCtwPq+2STBdj%82Kz6K16l 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 ==iNqSOZ?wRQ<+?o@cctb!))0 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 delta 108389 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 diff --git a/netbox/project-static/netbox-graphiql/package.json b/netbox/project-static/netbox-graphiql/package.json index 27257e34c..c5b2f3077 100644 --- a/netbox/project-static/netbox-graphiql/package.json +++ b/netbox/project-static/netbox-graphiql/package.json @@ -1,13 +1,13 @@ { "name": "netbox-graphiql", - "version": "4.1.0", + "version": "4.2.0", "description": "NetBox GraphiQL Custom Front End", "main": "dist/graphiql.js", "license": "Apache-2.0", "private": true, "dependencies": { - "@graphiql/plugin-explorer": "3.2.2", - "graphiql": "3.7.1", + "@graphiql/plugin-explorer": "3.2.3", + "graphiql": "3.7.2", "graphql": "16.9.0", "js-cookie": "3.0.5", "react": "18.3.1", diff --git a/netbox/project-static/package.json b/netbox/project-static/package.json index 0750f397b..bbc9c6ff7 100644 --- a/netbox/project-static/package.json +++ b/netbox/project-static/package.json @@ -27,11 +27,11 @@ "bootstrap": "5.3.3", "clipboard": "2.0.11", "flatpickr": "4.6.13", - "gridstack": "10.3.1", + "gridstack": "11.1.1", "htmx.org": "1.9.12", "query-string": "9.1.1", - "sass": "1.80.5", - "tom-select": "2.3.1", + "sass": "1.81.0", + "tom-select": "2.4.1", "typeface-inter": "3.18.1", "typeface-roboto-mono": "1.1.13" }, diff --git a/netbox/project-static/src/select/classes/dynamicTomSelect.ts b/netbox/project-static/src/select/classes/dynamicTomSelect.ts index 72c9fe518..8e44ce6a7 100644 --- a/netbox/project-static/src/select/classes/dynamicTomSelect.ts +++ b/netbox/project-static/src/select/classes/dynamicTomSelect.ts @@ -1,18 +1,17 @@ -import { RecursivePartial, TomInput, TomOption, TomSettings } from 'tom-select/dist/types/types'; -import { addClasses } from 'tom-select/src/vanilla' +import { RecursivePartial, TomOption, TomSettings } from 'tom-select/dist/types/types'; +import { TomInput } from 'tom-select/dist/cjs/types/core'; +import { addClasses } from 'tom-select/src/vanilla.ts'; import queryString from 'query-string'; import TomSelect from 'tom-select'; import type { Stringifiable } from 'query-string'; import { DynamicParamsMap } from './dynamicParamsMap'; // Transitional -import { QueryFilter, PathFilter } from '../types' +import { QueryFilter, PathFilter } from '../types'; import { getElement, replaceAll } from '../../util'; - // Extends TomSelect to provide enhanced fetching of options via the REST API export class DynamicTomSelect extends TomSelect { - public readonly nullOption: Nullable = null; // Transitional code from APISelect @@ -25,7 +24,7 @@ export class DynamicTomSelect extends TomSelect { * Overrides */ - constructor( input_arg: string|TomInput, user_settings: RecursivePartial ) { + constructor(input_arg: string | TomInput, user_settings: RecursivePartial) { super(input_arg, user_settings); // Glean the REST API endpoint URL from the