Vulcan/packages/nova-lib/lib/fragments.js

52 lines
No EOL
2 KiB
JavaScript

import gql from 'graphql-tag';
export const Fragments = {}; // will be populated on startup (see nova:routing)
export const registerFragment = fragmentText => {
// extract name from fragment text
const fragmentName = fragmentText.match(/fragment (.*) on/)[1];
// extract subFragments from text
const matchedSubFragments = fragmentText.match(/\.\.\.(.*)/g) || [];
const subFragments = _.unique(matchedSubFragments.map(f => f.replace('...', '')));
// console.log('// registerFragment: ', fragmentName, subFragments)
// register fragment
Fragments[fragmentName] = {
fragmentText,
subFragments
}
};
// extend a fragment with additional properties
export const extendFragment = (fragmentName, newProperties) => {
const fragment = Fragments[fragmentName];
const fragmentEndPosition = fragment.fragmentText.lastIndexOf('}');
const newFragmentText =[fragment.fragmentText.slice(0, fragmentEndPosition), newProperties, fragment.fragmentText.slice(fragmentEndPosition)].join('');
registerFragment(newFragmentText);
}
// get fragment name from fragment object
export const getFragmentName = fragment => fragment && fragment.definitions[0] && fragment.definitions[0].name.value;
// get fragment
// note: parentFragmentName is used for debugging purposes only
export const getFragment = (fragmentName, parentFragmentName) => {
const fragment = Fragments[fragmentName];
// pad the literals array with line returns for each subFragments
const literals = [fragment.fragmentText, ...fragment.subFragments.map(x => '\n')];
// console.log(`// getFragment: ${parentFragmentName ? parentFragmentName + ' > ' : ''}${fragmentName}`)
// console.log('fragmentText: ', fragment.fragmentText)
// console.log('subFragments:', fragment.subFragments)
// console.log('length:', fragment.subFragments.length)
// the gql function expects an array of literals as first argument, and then sub-fragments as other arguments
const gqlArguments = [literals, ...fragment.subFragments.map(f => getFragment(f, fragmentName))];
return gql.apply(null, gqlArguments);
}