From e63fe23af859d69c5960095ed812c99f782e5476 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 12 Dec 2024 10:03:19 -0500 Subject: [PATCH] Release v4.1.8 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- docs/release-notes/version-4.1.md | 28 +- .../dist/graphiql/graphiql.min.js | 5568 ++++---- .../project-static/dist/netbox-external.css | Bin 367160 -> 367126 bytes netbox/project-static/dist/netbox.js | Bin 390388 -> 390052 bytes netbox/project-static/dist/netbox.js.map | Bin 527142 -> 524225 bytes .../netbox-graphiql/package.json | 4 +- netbox/project-static/package.json | 8 +- .../src/select/classes/dynamicTomSelect.ts | 39 +- netbox/project-static/tsconfig.json | 4 +- netbox/project-static/yarn.lock | 82 +- netbox/release.yaml | 4 +- netbox/translations/cs/LC_MESSAGES/django.mo | Bin 229328 -> 229001 bytes netbox/translations/cs/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/da/LC_MESSAGES/django.mo | Bin 222153 -> 221815 bytes netbox/translations/da/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/de/LC_MESSAGES/django.mo | Bin 234250 -> 237305 bytes netbox/translations/de/LC_MESSAGES/django.po | 11107 +++++++++------- netbox/translations/es/LC_MESSAGES/django.mo | Bin 235650 -> 235309 bytes netbox/translations/es/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/fr/LC_MESSAGES/django.mo | Bin 237671 -> 237343 bytes netbox/translations/fr/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/it/LC_MESSAGES/django.mo | Bin 233875 -> 233546 bytes netbox/translations/it/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/ja/LC_MESSAGES/django.mo | Bin 251566 -> 251237 bytes netbox/translations/ja/LC_MESSAGES/django.po | 11062 ++++++++------- netbox/translations/nl/LC_MESSAGES/django.mo | Bin 230015 -> 229707 bytes netbox/translations/nl/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/pl/LC_MESSAGES/django.mo | Bin 231612 -> 231288 bytes netbox/translations/pl/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/pt/LC_MESSAGES/django.mo | Bin 232620 -> 232267 bytes netbox/translations/pt/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/ru/LC_MESSAGES/django.mo | Bin 297341 -> 296938 bytes netbox/translations/ru/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/tr/LC_MESSAGES/django.mo | Bin 226285 -> 225979 bytes netbox/translations/tr/LC_MESSAGES/django.po | 11064 ++++++++------- netbox/translations/uk/LC_MESSAGES/django.mo | Bin 298841 -> 299267 bytes netbox/translations/uk/LC_MESSAGES/django.po | 11074 ++++++++------- netbox/translations/zh/LC_MESSAGES/django.mo | Bin 209120 -> 208819 bytes netbox/translations/zh/LC_MESSAGES/django.po | 11062 ++++++++------- requirements.txt | 14 +- 42 files changed, 85736 insertions(+), 74982 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index ec755cd0c..6714d1357 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.1.7 + placeholder: v4.1.8 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 3ae3cbd33..72836017b 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -39,7 +39,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.1.7 + placeholder: v4.1.8 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md index 397741171..06ff12fef 100644 --- a/docs/release-notes/version-4.1.md +++ b/docs/release-notes/version-4.1.md @@ -1,6 +1,32 @@ # NetBox v4.1 -## v4.1.7 (FUTURE) +## v4.1.8 (2024-12-12) + +### Enhancements + +* [#17071](https://github.com/netbox-community/netbox/issues/17071) - Enable OOB IP address designation during bulk import +* [#17465](https://github.com/netbox-community/netbox/issues/17465) - Enable designation of rack type during bulk import & bulk edit +* [#17889](https://github.com/netbox-community/netbox/issues/17889) - Enable designating an IP address as out-of-band for a device upon creation +* [#17960](https://github.com/netbox-community/netbox/issues/17960) - Add L2TP, PPTP, Wireguard, and OpenVPN tunnel types +* [#18021](https://github.com/netbox-community/netbox/issues/18021) - Automatically clear cache on restart when `DEBUG` is enabled +* [#18061](https://github.com/netbox-community/netbox/issues/18061) - Omit stack trace from rendered device/VM configuration when an exception is raised +* [#18065](https://github.com/netbox-community/netbox/issues/18065) - Include status in device details when hovering on rack elevation +* [#18211](https://github.com/netbox-community/netbox/issues/18211) - Enable the dynamic registration of context managers for request processing + +### Bug Fixes + +* [#14044](https://github.com/netbox-community/netbox/issues/14044) - Fix unhandled AttributeError exception when bulk renaming objects +* [#17490](https://github.com/netbox-community/netbox/issues/17490) - Fix dynamic inclusion support for config templates +* [#17810](https://github.com/netbox-community/netbox/issues/17810) - Fix validation of racked device fields when modifying via REST API +* [#17820](https://github.com/netbox-community/netbox/issues/17820) - Ensure default custom field values are populated when creating new modules +* [#18044](https://github.com/netbox-community/netbox/issues/18044) - Show plugin-generated alerts within UI views for custom scripts +* [#18150](https://github.com/netbox-community/netbox/issues/18150) - Fix REST API pagination for low `MAX_PAGE_SIZE` values +* [#18183](https://github.com/netbox-community/netbox/issues/18183) - Omit UI navigation bar when printing +* [#18213](https://github.com/netbox-community/netbox/issues/18213) - Fix searching for ASN ranges by name + +--- + +## v4.1.7 (2024-11-21) ### Enhancements 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-external.css b/netbox/project-static/dist/netbox-external.css index 72d40bc92374a4b76fd8b69e4b8cd7fc29569f34..702520216bbe5e036eeb5e41d8ac1cdff2adfee6 100644 GIT binary patch delta 45 zcmV+|0Mh@sv=)}M7J!5SgaU*Egaot&_imS)Cj}3e*lz_Mmo;w%N0-QN1unO{Zv}lS DmAw%j delta 71 zcmbQXMQq0wv4$4L7N!>F7M3ln-}3}ZiW2jRa}rBZBQ*>S3Mw=erW@w7>P}b5XLZMv L+n$}zx>^eWp?Vm} diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 969d5c73a704424190120ac1a6c96af13085b025..7059ca7ad42e23ffde683766aecf19cce866a1df 100644 GIT binary patch literal 390052 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


jhunFMLxAbbCsXD@^v$hdbsuaG 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 literal 390388 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

&Dq`^L8nsb*g&rMx_t~zaxHM+UW2cxU0-h?`I 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 diff --git a/netbox/project-static/netbox-graphiql/package.json b/netbox/project-static/netbox-graphiql/package.json index 27257e34c..a97eb067e 100644 --- a/netbox/project-static/netbox-graphiql/package.json +++ b/netbox/project-static/netbox-graphiql/package.json @@ -6,8 +6,8 @@ "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..34974fe12 100644 --- a/netbox/project-static/package.json +++ b/netbox/project-static/package.json @@ -1,6 +1,6 @@ { "name": "netbox", - "version": "4.0.0", + "version": "4.1.0", "main": "dist/netbox.js", "license": "Apache-2.0", "private": true, @@ -27,11 +27,11 @@ "bootstrap": "5.3.3", "clipboard": "2.0.11", "flatpickr": "4.6.13", - "gridstack": "10.3.1", + "gridstack": "11.1.2", "htmx.org": "1.9.12", "query-string": "9.1.1", - "sass": "1.80.5", - "tom-select": "2.3.1", + "sass": "1.82.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