UNPKG

3.4 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * strict-local
8 * @format
9 */
10'use strict';
11
12var _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
13
14var RELAY = 'relay';
15var 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";
16/**
17 * A transform that extracts `@relay(plural: Boolean)` directives and converts
18 * them to metadata that can be accessed at runtime.
19 */
20
21function relayRelayDirectiveTransform(context) {
22 return require("./GraphQLIRTransformer").transform(context, {
23 Fragment: visitRelayMetadata(fragmentMetadata),
24 FragmentSpread: visitRelayMetadata(fragmentSpreadMetadata)
25 });
26}
27
28function visitRelayMetadata(metadataFn) {
29 return function (node) {
30 var relayDirective = node.directives.find(function (_ref) {
31 var name = _ref.name;
32 return name === RELAY;
33 });
34
35 if (!relayDirective) {
36 return this.traverse(node);
37 }
38
39 var argValues = require("./getLiteralArgumentValues")(relayDirective.args);
40
41 var metadata = metadataFn(argValues);
42 return this.traverse((0, _objectSpread2["default"])({}, node, {
43 directives: node.directives.filter(function (directive) {
44 return directive !== relayDirective;
45 }),
46 metadata: (0, _objectSpread2["default"])({}, node.metadata || {}, metadata)
47 }));
48 };
49}
50
51function fragmentMetadata(_ref2) {
52 var mask = _ref2.mask,
53 plural = _ref2.plural;
54 !(plural === undefined || typeof plural === 'boolean') ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRelayDirectiveTransform: Expected the "plural" argument to @relay ' + 'to be a boolean literal if specified.') : require("fbjs/lib/invariant")(false) : void 0;
55 !(mask === undefined || typeof mask === 'boolean') ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRelayDirectiveTransform: Expected the "mask" argument to @relay ' + 'to be a boolean literal if specified.') : require("fbjs/lib/invariant")(false) : void 0;
56 return {
57 mask: mask,
58 plural: plural
59 };
60}
61
62function fragmentSpreadMetadata(_ref3) {
63 var mask = _ref3.mask;
64 !(mask === undefined || typeof mask === 'boolean') ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRelayDirectiveTransform: Expected the "mask" argument to @relay ' + 'to be a boolean literal if specified.') : require("fbjs/lib/invariant")(false) : void 0;
65 return {
66 mask: mask
67 };
68}
69
70module.exports = {
71 RELAY: RELAY,
72 SCHEMA_EXTENSION: SCHEMA_EXTENSION,
73 transform: relayRelayDirectiveTransform
74};
\No newline at end of file