UNPKG

@ardatan/relay-compiler

Version:

A compiler tool for building GraphQL-driven applications.

139 lines (127 loc) 6.78 kB
/** * 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. * * @flow strict-local * @format */ // flowlint ambiguous-object-type:error 'use strict'; const ApplyFragmentArgumentTransform = require('../transforms/ApplyFragmentArgumentTransform'); const ClientExtensionsTransform = require('../transforms/ClientExtensionsTransform'); const ConnectionTransform = require('../transforms/ConnectionTransform'); const DeclarativeConnectionMutationTransform = require('../transforms/DeclarativeConnectionMutationTransform'); const DeferStreamTransform = require('../transforms/DeferStreamTransform'); const DisallowIdAsAlias = require('../transforms/DisallowIdAsAlias'); const DisallowTypenameOnRoot = require('../transforms/DisallowTypenameOnRoot'); const FieldHandleTransform = require('../transforms/FieldHandleTransform'); const FilterCompilerDirectivesTransform = require('../transforms/FilterCompilerDirectivesTransform'); const FilterDirectivesTransform = require('../transforms/FilterDirectivesTransform'); const FlattenTransform = require('../transforms/FlattenTransform'); const GenerateIDFieldTransform = require('../transforms/GenerateIDFieldTransform'); const GenerateTypeNameTransform = require('../transforms/GenerateTypeNameTransform'); const InlineDataFragmentTransform = require('../transforms/InlineDataFragmentTransform'); const InlineFragmentsTransform = require('../transforms/InlineFragmentsTransform'); const MaskTransform = require('../transforms/MaskTransform'); const MatchTransform = require('../transforms/MatchTransform'); const ReactFlightComponentTransform = require('../transforms/ReactFlightComponentTransform'); const RefetchableFragmentTransform = require('../transforms/RefetchableFragmentTransform'); const RelayDirectiveTransform = require('../transforms/RelayDirectiveTransform'); const RelayFlowGenerator = require('../language/javascript/RelayFlowGenerator'); const RequiredFieldTransform = require('../transforms/RequiredFieldTransform'); const SkipClientExtensionsTransform = require('../transforms/SkipClientExtensionsTransform'); const SkipHandleFieldTransform = require('../transforms/SkipHandleFieldTransform'); const SkipRedundantNodesTransform = require('../transforms/SkipRedundantNodesTransform'); const SkipSplitOperationTransform = require('../transforms/SkipSplitOperationTransform'); const SkipUnreachableNodeTransform = require('../transforms/SkipUnreachableNodeTransform'); const SkipUnusedVariablesTransform = require('../transforms/SkipUnusedVariablesTransform'); const SplitModuleImportTransform = require('../transforms/SplitModuleImportTransform'); const TestOperationTransform = require('../transforms/TestOperationTransform'); const ValidateGlobalVariablesTransform = require('../transforms/ValidateGlobalVariablesTransform'); const ValidateRequiredArgumentsTransform = require('../transforms/ValidateRequiredArgumentsTransform'); const ValidateUnusedVariablesTransform = require('../transforms/ValidateUnusedVariablesTransform'); import type {IRTransform} from './CompilerContext'; // Transforms applied to the code used to process a query response. const relaySchemaExtensions: $ReadOnlyArray<string> = [ ConnectionTransform.SCHEMA_EXTENSION, DeclarativeConnectionMutationTransform.SCHEMA_EXTENSION, InlineDataFragmentTransform.SCHEMA_EXTENSION, MatchTransform.SCHEMA_EXTENSION, RequiredFieldTransform.SCHEMA_EXTENSION, RefetchableFragmentTransform.SCHEMA_EXTENSION, RelayDirectiveTransform.SCHEMA_EXTENSION, RelayFlowGenerator.SCHEMA_EXTENSION, TestOperationTransform.SCHEMA_EXTENSION, ValidateUnusedVariablesTransform.SCHEMA_EXTENSION, ]; // Transforms applied to both operations and fragments for both reading and // writing from the store. const relayCommonTransforms: $ReadOnlyArray<IRTransform> = [ DisallowIdAsAlias.transform, ConnectionTransform.transform, RelayDirectiveTransform.transform, MaskTransform.transform, MatchTransform.transform, RefetchableFragmentTransform.transform, DeferStreamTransform.transform, ReactFlightComponentTransform.transform, ]; // Transforms applied to fragments used for reading data from a store const relayFragmentTransforms: $ReadOnlyArray<IRTransform> = [ ClientExtensionsTransform.transform, FieldHandleTransform.transform, InlineDataFragmentTransform.transform, FlattenTransform.transformWithOptions({isForCodegen: true}), RequiredFieldTransform.transform, SkipRedundantNodesTransform.transform, ]; // Transforms applied to queries/mutations/subscriptions that are used for // fetching data from the server and parsing those responses. const relayQueryTransforms: $ReadOnlyArray<IRTransform> = [ SplitModuleImportTransform.transform, DisallowTypenameOnRoot.transform, ValidateUnusedVariablesTransform.transform, ApplyFragmentArgumentTransform.transform, ValidateGlobalVariablesTransform.transform, GenerateIDFieldTransform.transform, DeclarativeConnectionMutationTransform.transform, ]; // Transforms applied to the code used to process a query response. const relayCodegenTransforms: $ReadOnlyArray<IRTransform> = [ FilterCompilerDirectivesTransform.transform, SkipUnreachableNodeTransform.transform, InlineFragmentsTransform.transform, // NOTE: For the codegen context, we make sure to run ClientExtensions // transform after we've inlined fragment spreads (i.e. InlineFragmentsTransform) // This will ensure that we don't generate nested ClientExtension nodes ClientExtensionsTransform.transform, GenerateTypeNameTransform.transform, FlattenTransform.transformWithOptions({isForCodegen: true}), SkipRedundantNodesTransform.transform, TestOperationTransform.transform, ]; // Transforms applied before printing the query sent to the server. const relayPrintTransforms: $ReadOnlyArray<IRTransform> = [ SkipSplitOperationTransform.transform, // NOTE: Skipping client extensions might leave empty selections, which we // skip by running SkipUnreachableNodeTransform immediately after. ClientExtensionsTransform.transform, SkipClientExtensionsTransform.transform, SkipUnreachableNodeTransform.transform, GenerateTypeNameTransform.transform, FlattenTransform.transformWithOptions({}), SkipHandleFieldTransform.transform, FilterDirectivesTransform.transform, SkipUnusedVariablesTransform.transform, ValidateRequiredArgumentsTransform.transform, ]; module.exports = { commonTransforms: relayCommonTransforms, codegenTransforms: relayCodegenTransforms, fragmentTransforms: relayFragmentTransforms, printTransforms: relayPrintTransforms, queryTransforms: relayQueryTransforms, schemaExtensions: relaySchemaExtensions, };