83 lines
3.4 KiB
JavaScript
83 lines
3.4 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* strict-local
|
|
* @format
|
|
*/
|
|
'use strict';
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
|
|
|
|
var CompilerContext = require("./GraphQLCompilerContext");
|
|
|
|
var IRTransformer = require("./GraphQLIRTransformer");
|
|
|
|
var getLiteralArgumentValues = require("./getLiteralArgumentValues");
|
|
|
|
var invariant = require("fbjs/lib/invariant");
|
|
|
|
var RELAY = 'relay';
|
|
var SCHEMA_EXTENSION = "\ndirective @relay(\n # Marks a connection field as containing nodes without 'id' fields.\n # This is used to silence the warning when diffing connections.\n isConnectionWithoutNodeID: Boolean,\n\n # Marks a fragment as intended for pattern matching (as opposed to fetching).\n # Used in Classic only.\n pattern: Boolean,\n\n # Marks a fragment as being backed by a GraphQLList.\n plural: Boolean,\n\n # Marks a fragment spread which should be unmasked if provided false\n mask: Boolean = true,\n\n # Selectively pass variables down into a fragment. Only used in Classic.\n variables: [String!],\n) on FRAGMENT_DEFINITION | FRAGMENT_SPREAD | INLINE_FRAGMENT | FIELD\n";
|
|
/**
|
|
* A transform that extracts `@relay(plural: Boolean)` directives and converts
|
|
* them to metadata that can be accessed at runtime.
|
|
*/
|
|
|
|
function relayRelayDirectiveTransform(context) {
|
|
return IRTransformer.transform(context, {
|
|
Fragment: visitRelayMetadata(fragmentMetadata),
|
|
FragmentSpread: visitRelayMetadata(fragmentSpreadMetadata)
|
|
});
|
|
}
|
|
|
|
function visitRelayMetadata(metadataFn) {
|
|
return function (node) {
|
|
var relayDirective = node.directives.find(function (_ref) {
|
|
var name = _ref.name;
|
|
return name === RELAY;
|
|
});
|
|
|
|
if (!relayDirective) {
|
|
return this.traverse(node);
|
|
}
|
|
|
|
var argValues = getLiteralArgumentValues(relayDirective.args);
|
|
var metadata = metadataFn(argValues);
|
|
return this.traverse((0, _objectSpread2["default"])({}, node, {
|
|
directives: node.directives.filter(function (directive) {
|
|
return directive !== relayDirective;
|
|
}),
|
|
metadata: (0, _objectSpread2["default"])({}, node.metadata || {}, metadata)
|
|
}));
|
|
};
|
|
}
|
|
|
|
function fragmentMetadata(_ref2) {
|
|
var mask = _ref2.mask,
|
|
plural = _ref2.plural;
|
|
!(plural === undefined || typeof plural === 'boolean') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayRelayDirectiveTransform: Expected the "plural" argument to @relay ' + 'to be a boolean literal if specified.') : invariant(false) : void 0;
|
|
!(mask === undefined || typeof mask === 'boolean') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayRelayDirectiveTransform: Expected the "mask" argument to @relay ' + 'to be a boolean literal if specified.') : invariant(false) : void 0;
|
|
return {
|
|
mask: mask,
|
|
plural: plural
|
|
};
|
|
}
|
|
|
|
function fragmentSpreadMetadata(_ref3) {
|
|
var mask = _ref3.mask;
|
|
!(mask === undefined || typeof mask === 'boolean') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayRelayDirectiveTransform: Expected the "mask" argument to @relay ' + 'to be a boolean literal if specified.') : invariant(false) : void 0;
|
|
return {
|
|
mask: mask
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
RELAY: RELAY,
|
|
SCHEMA_EXTENSION: SCHEMA_EXTENSION,
|
|
transform: relayRelayDirectiveTransform
|
|
}; |