mirror of
https://github.com/vale981/Vulcan
synced 2025-03-06 01:51:40 -05:00
finish new fragments API; add extendFragment
This commit is contained in:
parent
ebb38cf643
commit
d87c13a9a5
4 changed files with 35 additions and 21 deletions
|
@ -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!
|
||||
`);
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue