finish new fragments API; add extendFragment

This commit is contained in:
SachaG 2017-02-02 13:24:29 +09:00
parent ebb38cf643
commit d87c13a9a5
4 changed files with 35 additions and 21 deletions

View file

@ -1,11 +1,9 @@
import { registerFragment, getFragment } from 'meteor/nova:lib';
import { extendFragment } from 'meteor/nova:lib';
const CustomPostsListFragment = `
fragment CustomPostsList on Post {
...PostsList
color # new custom property!
}
`;
extendFragment('PostsList', `
color # new custom property!
`);
registerFragment(CustomPostsListFragment, 'PostsList');
registerFragment(CustomPostsListFragment, 'PostsPage');
extendFragment('PostsPage', `
color # new custom property!
`);

View file

@ -1,5 +1,5 @@
// import and re-export
export { Components, registerComponent, replaceComponent, getRawComponent, getComponent, copyHoCs, populateComponentsApp, createCollection, Callbacks, addCallback, removeCallback, runCallbacks, runCallbacksAsync, GraphQLSchema, Routes, addRoute, getRoute, populateRoutesApp, Utils, getSetting, Strings, addStrings, configureStore, getActions, addAction, getReducers, addReducer, getMiddlewares, addMiddleware, Headtags, Fragments, registerFragment, getFragment, getFragmentName } from 'meteor/nova:lib';
export { Components, registerComponent, replaceComponent, getRawComponent, getComponent, copyHoCs, populateComponentsApp, createCollection, Callbacks, addCallback, removeCallback, runCallbacks, runCallbacksAsync, GraphQLSchema, Routes, addRoute, getRoute, populateRoutesApp, Utils, getSetting, Strings, addStrings, configureStore, getActions, addAction, getReducers, addReducer, getMiddlewares, addMiddleware, Headtags, Fragments, registerFragment, getFragment, getFragmentName, extendFragment } from 'meteor/nova:lib';
import './callbacks.js';

View file

@ -3,14 +3,15 @@ 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)
// console.log(fragmentText)
// console.log('// registerFragment: ', fragmentName, subFragments)
// register fragment
Fragments[fragmentName] = {
@ -19,18 +20,33 @@ export const registerFragment = fragmentText => {
}
};
// 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;
export const getFragment = name => {
const fragment = Fragments[name];
const literals = [fragment.fragmentText];
// the gql function expects an array of literals as first argument, and then sub-fragments as other arguments
const gqlArguments = fragment.subFragments ? [literals] : [literals, ...fragment.subFragments.map(getFragment)]
// 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: ', name)
// console.log(`// getFragment: ${parentFragmentName ? parentFragmentName + ' > ' : ''}${fragmentName}`)
// console.log('fragmentText: ', fragment.fragmentText)
// console.log('subFragments:', fragment.subFragments)
console.log(gqlArguments)
// 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);
}

View file

@ -20,6 +20,6 @@ export { getSetting } from './settings.js';
export { Strings, addStrings } from './strings.js';
export { configureStore, getActions, addAction, getReducers, addReducer, getMiddlewares, addMiddleware } from './redux.js';
export { Headtags } from './headtags.js';
export { Fragments, registerFragment, getFragment, getFragmentName } from './fragments.js';
export { Fragments, registerFragment, getFragment, getFragmentName, extendFragment } from './fragments.js';
export default Telescope;