diff --git a/package.json b/package.json index f0b9c332a..48c55178b 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "start": "meteor --settings settings.json", "visualizer": "meteor --extra-packages bundle-visualizer --production --settings settings.json", "lint": "eslint --cache --ext .jsx,js packages", + "lintfix": "eslint --cache --ext .jsx,js packages --fix", "test-unit": "TEST_WATCH=1 meteor test-packages ./packages/* --port 3002 --driver-package meteortesting:mocha --raw-logs", "test": "npm run test-unit", "prettier": "node ./.vulcan/prettier/index.js write-changed", diff --git a/packages/vulcan-core/lib/client/components/AppGenerator.jsx b/packages/vulcan-core/lib/client/components/AppGenerator.jsx index 2ab13aa33..bfbe78d21 100644 --- a/packages/vulcan-core/lib/client/components/AppGenerator.jsx +++ b/packages/vulcan-core/lib/client/components/AppGenerator.jsx @@ -3,11 +3,11 @@ */ import React from 'react'; import { ApolloProvider } from 'react-apollo'; -import { runCallbacks } from '../../modules' +import { runCallbacks } from '../../modules'; -import { Components } from 'meteor/vulcan:lib' +import { Components } from 'meteor/vulcan:lib'; import { CookiesProvider } from 'react-cookie'; -import { BrowserRouter } from 'react-router-dom' +import { BrowserRouter } from 'react-router-dom'; const AppGenerator = ({ apolloClient }) => { const App = ( diff --git a/packages/vulcan-core/lib/client/start.jsx b/packages/vulcan-core/lib/client/start.jsx index c30d30b8a..7bbd084bb 100644 --- a/packages/vulcan-core/lib/client/start.jsx +++ b/packages/vulcan-core/lib/client/start.jsx @@ -1,7 +1,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { onPageLoad } from 'meteor/server-render'; -import AppGenerator from './components/AppGenerator' +import AppGenerator from './components/AppGenerator'; import { createApolloClient, diff --git a/packages/vulcan-core/lib/modules/callbacks.js b/packages/vulcan-core/lib/modules/callbacks.js index 8f2d84a44..bd317b87d 100644 --- a/packages/vulcan-core/lib/modules/callbacks.js +++ b/packages/vulcan-core/lib/modules/callbacks.js @@ -1,4 +1,4 @@ -import {addCallback, getActions} from 'meteor/vulcan:lib'; +import { addCallback, getActions } from 'meteor/vulcan:lib'; /* diff --git a/packages/vulcan-core/lib/modules/components/App.jsx b/packages/vulcan-core/lib/modules/components/App.jsx index 1a71f3ca5..c845498c7 100644 --- a/packages/vulcan-core/lib/modules/components/App.jsx +++ b/packages/vulcan-core/lib/modules/components/App.jsx @@ -42,7 +42,7 @@ const RouteWithLayout = ({ layoutName, component, currentRoute, ...rest }) => { return React.createElement(layout, layoutProps, {React.createElement(component, childComponentProps)}); }} /> -)}; +);}; class App extends PureComponent { constructor(props) { diff --git a/packages/vulcan-core/lib/modules/containers/withMessages.js b/packages/vulcan-core/lib/modules/containers/withMessages.js index c7af17acb..989379665 100644 --- a/packages/vulcan-core/lib/modules/containers/withMessages.js +++ b/packages/vulcan-core/lib/modules/containers/withMessages.js @@ -6,11 +6,8 @@ HoC that provides access to flash messages stored in Redux state and actions to of the apollo-link-state mutation patterns */ -import { - registerStateLinkMutation, - registerStateLinkDefault, -} from 'meteor/vulcan:lib'; -import {graphql, compose} from 'react-apollo'; +import { registerStateLinkMutation, registerStateLinkDefault } from 'meteor/vulcan:lib'; +import { graphql, compose } from 'react-apollo'; import gql from 'graphql-tag'; // 1. Define the queries // the @client tag tells graphQL that we fetch data from the cache @@ -53,13 +50,12 @@ registerStateLinkMutation({ name: 'flashMessagesFlash', mutation: (obj, args, context, info) => { // get relevant values from args - const {cache} = context; - const {content} = args; + const { cache } = context; + const { content } = args; // retrieve current state - const currentFlashMessages = cache.readData({query: getMessagesQuery}); + const currentFlashMessages = cache.readData({ query: getMessagesQuery }); // transform content - const flashType = - content && typeof content.type !== 'undefined' ? content.type : 'error'; + const flashType = content && typeof content.type !== 'undefined' ? content.type : 'error'; const _id = currentFlashMessages.length; const flashMessage = { _id, @@ -75,50 +71,50 @@ registerStateLinkMutation({ const data = { flashMessages: [...currentFlashMessages, flashMessage], }; - cache.writeData({data}); + cache.writeData({ data }); return null; }, }); registerStateLinkMutation({ name: 'flashMessagesMarkAsSeen', mutation: (obj, args, context) => { - const {cache} = context; - const {i} = args; - const currentFlashMessages = cache.readData({query: getMessagesQuery}); - currentFlashMessages[i] = {...currentFlashMessages[i], seen: true}; + const { cache } = context; + const { i } = args; + const currentFlashMessages = cache.readData({ query: getMessagesQuery }); + currentFlashMessages[i] = { ...currentFlashMessages[i], seen: true }; const data = { flashMessages: currentFlashMessages, }; - cache.writeData({data}); + cache.writeData({ data }); return null; }, }); registerStateLinkMutation({ name: 'flashMessagesClear', mutation: (obj, args, context) => { - const {cache} = context; - const {i} = args; - const currentFlashMessages = cache.readData({query: getMessagesQuery}); - currentFlashMessages[i] = {...currentFlashMessages[i], show: false}; + const { cache } = context; + const { i } = args; + const currentFlashMessages = cache.readData({ query: getMessagesQuery }); + currentFlashMessages[i] = { ...currentFlashMessages[i], show: false }; const data = { flashMessages: currentFlashMessages, }; - cache.writeData({data}); + cache.writeData({ data }); return null; }, }); registerStateLinkMutation({ name: 'flashMessagesClearSeen', mutation: (obj, args, context) => { - const {cache} = context; - const currentFlashMessages = cache.readData({query: getMessagesQuery}); + const { cache } = context; + const currentFlashMessages = cache.readData({ query: getMessagesQuery }); const newValue = currentFlashMessages.map(message => - message.seen ? {...message, show: false} : message + message.seen ? { ...message, show: false } : message ); const data = { flashMessages: newValue, }; - cache.writeData({data}); + cache.writeData({ data }); return null; }, }); @@ -140,9 +136,9 @@ const withMessages = compose( // equivalent to mapStateToProps (map the graphql query to the component props) graphql(getMessagesQuery, { - props: ({ownProps, data /*: { flashMessages }*/}) => { - const {flashMessages} = data; - return {...ownProps, messages: flashMessages}; + props: ({ ownProps, data /*: { flashMessages }*/ }) => { + const { flashMessages } = data; + return { ...ownProps, messages: flashMessages }; }, }) ); diff --git a/packages/vulcan-core/lib/modules/containers/withMulti.js b/packages/vulcan-core/lib/modules/containers/withMulti.js index abbc8b483..81d41a353 100644 --- a/packages/vulcan-core/lib/modules/containers/withMulti.js +++ b/packages/vulcan-core/lib/modules/containers/withMulti.js @@ -34,7 +34,7 @@ Terms object can have the following properties: */ -import {withApollo, graphql} from 'react-apollo'; +import { withApollo, graphql } from 'react-apollo'; import gql from 'graphql-tag'; import update from 'immutability-helper'; import { @@ -63,15 +63,15 @@ export default function withMulti(options) { // see https://github.com/apollographql/apollo-client/issues/1704#issuecomment-322995855 pollInterval = typeof window === 'undefined' ? null : pollInterval; - const {collectionName, collection} = extractCollectionInfo(options); - const {fragmentName, fragment} = extractFragmentInfo(options, collectionName); + const { collectionName, collection } = extractCollectionInfo(options); + const { fragmentName, fragment } = extractFragmentInfo(options, collectionName); const typeName = collection.options.typeName; const resolverName = collection.options.multiResolverName; // build graphql query from options const query = gql` - ${multiClientTemplate({typeName, fragmentName, extraQueries})} + ${multiClientTemplate({ typeName, fragmentName, extraQueries })} ${fragment} `; @@ -99,9 +99,9 @@ export default function withMulti(options) { alias: `with${Utils.pluralize(typeName)}`, // graphql query options - options({terms, paginationTerms, client: apolloClient, currentUser}) { + options({ terms, paginationTerms, client: apolloClient, currentUser }) { // get terms from options, then props, then pagination - const mergedTerms = {...options.terms, ...terms, ...paginationTerms}; + const mergedTerms = { ...options.terms, ...terms, ...paginationTerms }; const graphQLOptions = { variables: { @@ -121,8 +121,7 @@ export default function withMulti(options) { // set to true if running into https://github.com/apollographql/apollo-client/issues/1186 if (options.notifyOnNetworkStatusChange) { - graphQLOptions.notifyOnNetworkStatusChange = - options.notifyOnNetworkStatusChange; + graphQLOptions.notifyOnNetworkStatusChange = options.notifyOnNetworkStatusChange; } return graphQLOptions; @@ -133,10 +132,8 @@ export default function withMulti(options) { // see https://github.com/apollographql/apollo-client/blob/master/packages/apollo-client/src/core/networkStatus.ts const refetch = props.data.refetch, // results = Utils.convertDates(collection, props.data[listResolverName]), - results = - props.data[resolverName] && props.data[resolverName].results, - totalCount = - props.data[resolverName] && props.data[resolverName].totalCount, + results = props.data[resolverName] && props.data[resolverName].results, + totalCount = props.data[resolverName] && props.data[resolverName].totalCount, networkStatus = props.data.networkStatus, loadingInitial = props.data.networkStatus === 1, loading = props.data.networkStatus === 1, @@ -168,11 +165,8 @@ export default function withMulti(options) { const newTerms = typeof providedTerms === 'undefined' ? { - /*...props.ownProps.terms,*/ ...props.ownProps - .paginationTerms, - limit: - results.length + - props.ownProps.paginationTerms.itemsPerPage, + /*...props.ownProps.terms,*/ ...props.ownProps.paginationTerms, + limit: results.length + props.ownProps.paginationTerms.itemsPerPage, } : providedTerms; @@ -193,8 +187,8 @@ export default function withMulti(options) { : providedTerms; return props.data.fetchMore({ - variables: {input: {terms: newTerms}}, // ??? not sure about 'terms: newTerms' - updateQuery(previousResults, {fetchMoreResult}) { + variables: { input: { terms: newTerms } }, // ??? not sure about 'terms: newTerms' + updateQuery(previousResults, { fetchMoreResult }) { // no more post to fetch if (!fetchMoreResult.data) { return previousResults; @@ -205,7 +199,7 @@ export default function withMulti(options) { ...fetchMoreResult.data[resolverName], ]; // return the previous results "augmented" with more - return {...previousResults, ...newResults}; + return { ...previousResults, ...newResults }; }, }); }, diff --git a/packages/vulcan-core/lib/modules/default_mutations.js b/packages/vulcan-core/lib/modules/default_mutations.js index fa94d9582..5c3215828 100644 --- a/packages/vulcan-core/lib/modules/default_mutations.js +++ b/packages/vulcan-core/lib/modules/default_mutations.js @@ -25,7 +25,7 @@ import { import Users from 'meteor/vulcan:users'; import isEmpty from 'lodash/isEmpty'; -const defaultOptions = {create: true, update: true, upsert: true, delete: true}; +const defaultOptions = { create: true, update: true, upsert: true, delete: true }; export function getDefaultMutations(options) { let typeName, collectionName, mutationOptions; @@ -34,12 +34,12 @@ export function getDefaultMutations(options) { // new single-argument API typeName = arguments[0].typeName; collectionName = arguments[0].collectionName || getCollectionName(typeName); - mutationOptions = {...defaultOptions, ...arguments[0].options}; + mutationOptions = { ...defaultOptions, ...arguments[0].options }; } else { // OpenCRUD backwards compatibility collectionName = arguments[0]; typeName = getTypeName(collectionName); - mutationOptions = {...defaultOptions, ...arguments[1]}; + mutationOptions = { ...defaultOptions, ...arguments[1] }; } // register callbacks for documentation purposes @@ -72,7 +72,7 @@ export function getDefaultMutations(options) { ]); }, - async mutation(root, {data}, context) { + async mutation(root, { data }, context) { const collection = context[collectionName]; // check if current user can pass check function; else throw error @@ -105,44 +105,34 @@ export function getDefaultMutations(options) { */ if (Meteor.isClient) { - registerWatchedMutation( - mutationName, - multiQueryName, - ({mutation, query}) => { - // get mongo selector and options objects based on current terms - const terms = query.variables.input.terms; - const collection = Collections.find(c => c.typeName === typeName); - const parameters = collection.getParameters(terms /* apolloClient */); - const {selector, options} = parameters; - let results = query.result; - const document = mutation.result.data[mutationName].data; + registerWatchedMutation(mutationName, multiQueryName, ({ mutation, query }) => { + // get mongo selector and options objects based on current terms + const terms = query.variables.input.terms; + const collection = Collections.find(c => c.typeName === typeName); + const parameters = collection.getParameters(terms /* apolloClient */); + const { selector, options } = parameters; + let results = query.result; + const document = mutation.result.data[mutationName].data; - if (belongsToSet(document, selector)) { - if (!isInSet(results[multiResolverName], document)) { - // make sure document hasn't been already added as this may be called several times - results[multiResolverName] = addToSet( - results[multiResolverName], - document - ); - } - results[multiResolverName] = reorderSet( - results[multiResolverName], - options.sort - ); + if (belongsToSet(document, selector)) { + if (!isInSet(results[multiResolverName], document)) { + // make sure document hasn't been already added as this may be called several times + results[multiResolverName] = addToSet(results[multiResolverName], document); } - - results[multiResolverName].__typename = `Multi${typeName}Output`; - - // console.log('// create'); - // console.log(mutation); - // console.log(query); - // console.log(collection); - // console.log(parameters); - // console.log(results); - - return results; + results[multiResolverName] = reorderSet(results[multiResolverName], options.sort); } - ); + + results[multiResolverName].__typename = `Multi${typeName}Output`; + + // console.log('// create'); + // console.log(mutation); + // console.log(query); + // console.log(collection); + // console.log(parameters); + // console.log(results); + + return results; + }); } } @@ -178,7 +168,7 @@ export function getDefaultMutations(options) { ]); }, - async mutation(root, {selector, data}, context) { + async mutation(root, { selector, data }, context) { const collection = context[collectionName]; if (isEmpty(selector)) { @@ -190,9 +180,7 @@ export function getDefaultMutations(options) { if (!document) { throw new Error( - `Could not find document to update for selector: ${JSON.stringify( - selector - )}` + `Could not find document to update for selector: ${JSON.stringify(selector)}` ); } @@ -229,57 +217,44 @@ export function getDefaultMutations(options) { */ if (Meteor.isClient) { - registerWatchedMutation( - mutationName, - multiQueryName, - ({mutation, query}) => { - // get mongo selector and options objects based on current terms - const terms = query.variables.input.terms; - const collection = Collections.find(c => c.typeName === typeName); - const parameters = collection.getParameters(terms /* apolloClient */); - const {selector, options} = parameters; - let results = query.result; - const document = mutation.result.data[mutationName].data; + registerWatchedMutation(mutationName, multiQueryName, ({ mutation, query }) => { + // get mongo selector and options objects based on current terms + const terms = query.variables.input.terms; + const collection = Collections.find(c => c.typeName === typeName); + const parameters = collection.getParameters(terms /* apolloClient */); + const { selector, options } = parameters; + let results = query.result; + const document = mutation.result.data[mutationName].data; - if (belongsToSet(document, selector)) { - // edited document belongs to the list - if (!isInSet(results[multiResolverName], document)) { - // if document wasn't already in list, add it - results[multiResolverName] = addToSet( - results[multiResolverName], - document - ); - } else { - // if document was already in the list, update it - results[multiResolverName] = updateInSet( - results[multiResolverName], - document - ); - } - results[multiResolverName] = reorderSet( - results[multiResolverName], - options.sort, - selector - ); + if (belongsToSet(document, selector)) { + // edited document belongs to the list + if (!isInSet(results[multiResolverName], document)) { + // if document wasn't already in list, add it + results[multiResolverName] = addToSet(results[multiResolverName], document); } else { - // if edited doesn't belong to current list anymore (based on view selector), remove it - results[multiResolverName] = removeFromSet( - results[multiResolverName], - document - ); + // if document was already in the list, update it + results[multiResolverName] = updateInSet(results[multiResolverName], document); } - - results[multiResolverName].__typename = `Multi${typeName}Output`; - - // console.log('// update'); - // console.log(mutation); - // console.log(query); - // console.log(parameters); - // console.log(results); - - return results; + results[multiResolverName] = reorderSet( + results[multiResolverName], + options.sort, + selector + ); + } else { + // if edited doesn't belong to current list anymore (based on view selector), remove it + results[multiResolverName] = removeFromSet(results[multiResolverName], document); } - ); + + results[multiResolverName].__typename = `Multi${typeName}Output`; + + // console.log('// update'); + // console.log(mutation); + // console.log(query); + // console.log(parameters); + // console.log(results); + + return results; + }); } } if (mutationOptions.upsert) { @@ -287,26 +262,22 @@ export function getDefaultMutations(options) { mutations.upsert = { description: `Mutation for upserting a ${typeName} document`, - async mutation(root, {selector, data}, context) { + async mutation(root, { selector, data }, context) { const collection = context[collectionName]; // check if document exists already const existingDocument = await Connectors.get(collection, selector, { - fields: {_id: 1}, + fields: { _id: 1 }, }); if (existingDocument) { return await collection.options.mutations.update.mutation( root, - {selector, data}, + { selector, data }, context ); } else { - return await collection.options.mutations.create.mutation( - root, - {data}, - context - ); + return await collection.options.mutations.create.mutation(root, { data }, context); } }, }; @@ -321,8 +292,7 @@ export function getDefaultMutations(options) { check(user, document) { // OpenCRUD backwards compatibility - const check = - mutationOptions.deleteCheck || mutationOptions.removeCheck; + const check = mutationOptions.deleteCheck || mutationOptions.removeCheck; if (check) { return check(user, document); } @@ -340,7 +310,7 @@ export function getDefaultMutations(options) { ]); }, - async mutation(root, {selector}, context) { + async mutation(root, { selector }, context) { const collection = context[collectionName]; if (isEmpty(selector)) { @@ -351,9 +321,7 @@ export function getDefaultMutations(options) { if (!document) { throw new Error( - `Could not find document to delete for selector: ${JSON.stringify( - selector - )}` + `Could not find document to delete for selector: ${JSON.stringify(selector)}` ); } @@ -388,25 +356,18 @@ export function getDefaultMutations(options) { */ if (Meteor.isClient) { - registerWatchedMutation( - mutationName, - multiQueryName, - ({mutation, query}) => { - let results = query.result; - const document = mutation.result.data[mutationName].data; - results[multiResolverName] = removeFromSet( - results[multiResolverName], - document - ); - results[multiResolverName].__typename = `Multi${typeName}Output`; - // console.log('// delete') - // console.log(mutation); - // console.log(query); - // console.log(parameters); - // console.log(results); - return results; - } - ); + registerWatchedMutation(mutationName, multiQueryName, ({ mutation, query }) => { + let results = query.result; + const document = mutation.result.data[mutationName].data; + results[multiResolverName] = removeFromSet(results[multiResolverName], document); + results[multiResolverName].__typename = `Multi${typeName}Output`; + // console.log('// delete') + // console.log(mutation); + // console.log(query); + // console.log(parameters); + // console.log(results); + return results; + }); } } @@ -424,7 +385,7 @@ const registerCollectionCallbacks = (typeName, options) => { { document: 'The document being inserted' }, { currentUser: 'The current user' }, { collection: 'The collection the document belongs to' }, - { context: 'The context of the mutation'}, + { context: 'The context of the mutation' }, ], runs: 'sync', returns: 'document', @@ -433,33 +394,32 @@ const registerCollectionCallbacks = (typeName, options) => { }); registerCallback({ name: `${typeName}.create.before`, - iterator: {document: 'The document being inserted'}, - properties: [{currentUser: 'The current user'}], + iterator: { document: 'The document being inserted' }, + properties: [{ currentUser: 'The current user' }], runs: 'sync', returns: 'document', - description: - "Perform operations on a new document before it's inserted in the database.", + description: 'Perform operations on a new document before it\'s inserted in the database.', }); registerCallback({ name: `${typeName}.create.after`, - iterator: {document: 'The document being inserted'}, - properties: [{currentUser: 'The current user'}], + iterator: { document: 'The document being inserted' }, + properties: [{ currentUser: 'The current user' }], runs: 'sync', returns: 'document', description: - "Perform operations on a new document after it's inserted in the database but *before* the mutation returns it.", + 'Perform operations on a new document after it\'s inserted in the database but *before* the mutation returns it.', }); registerCallback({ name: `${typeName}.create.async`, - iterator: {document: 'The document being inserted'}, + iterator: { document: 'The document being inserted' }, properties: [ - {currentUser: 'The current user'}, - {collection: 'The collection the document belongs to'}, + { currentUser: 'The current user' }, + { collection: 'The collection the document belongs to' }, ], runs: 'async', returns: null, description: - "Perform operations on a new document after it's inserted in the database asynchronously.", + 'Perform operations on a new document after it\'s inserted in the database asynchronously.', }); } if (options.update) { @@ -471,7 +431,7 @@ const registerCollectionCallbacks = (typeName, options) => { { data: 'The client data' }, { currentUser: 'The current user' }, { collection: 'The collection the document belongs to' }, - { context: 'The context of the mutation'}, + { context: 'The context of the mutation' }, ], runs: 'sync', returns: 'modifier', @@ -480,40 +440,33 @@ const registerCollectionCallbacks = (typeName, options) => { }); registerCallback({ name: `${typeName}.update.before`, - iterator: {data: 'The client data'}, - properties: [ - {document: 'The document being edited'}, - {currentUser: 'The current user'}, - ], + iterator: { data: 'The client data' }, + properties: [{ document: 'The document being edited' }, { currentUser: 'The current user' }], runs: 'sync', returns: 'modifier', - description: - "Perform operations on a document before it's updated in the database.", + description: 'Perform operations on a document before it\'s updated in the database.', }); registerCallback({ name: `${typeName}.update.after`, - iterator: {newDocument: 'The document after the update'}, - properties: [ - {document: 'The document being edited'}, - {currentUser: 'The current user'}, - ], + iterator: { newDocument: 'The document after the update' }, + properties: [{ document: 'The document being edited' }, { currentUser: 'The current user' }], runs: 'sync', returns: 'document', description: - "Perform operations on a document after it's updated in the database but *before* the mutation returns it.", + 'Perform operations on a document after it\'s updated in the database but *before* the mutation returns it.', }); registerCallback({ name: `${typeName}.update.async`, - iterator: {newDocument: 'The document after the edit'}, + iterator: { newDocument: 'The document after the edit' }, properties: [ - {document: 'The document before the edit'}, - {currentUser: 'The current user'}, - {collection: 'The collection the document belongs to'}, + { document: 'The document before the edit' }, + { currentUser: 'The current user' }, + { collection: 'The collection the document belongs to' }, ], runs: 'async', returns: null, description: - "Perform operations on a document after it's updated in the database asynchronously.", + 'Perform operations on a document after it\'s updated in the database asynchronously.', }); } if (options.delete) { @@ -523,8 +476,8 @@ const registerCollectionCallbacks = (typeName, options) => { properties: [ { currentUser: 'The current user' }, { document: 'The document being removed' }, - { collection: 'The collection the document belongs to'}, - { context: 'The context of this mutation'} + { collection: 'The collection the document belongs to' }, + { context: 'The context of this mutation' }, ], runs: 'sync', returns: 'document', @@ -533,24 +486,23 @@ const registerCollectionCallbacks = (typeName, options) => { }); registerCallback({ name: `${typeName}.delete.before`, - iterator: {document: 'The document being removed'}, - properties: [{currentUser: 'The current user'}], + iterator: { document: 'The document being removed' }, + properties: [{ currentUser: 'The current user' }], runs: 'sync', returns: null, - description: - "Perform operations on a document before it's removed from the database.", + description: 'Perform operations on a document before it\'s removed from the database.', }); registerCallback({ name: `${typeName}.delete.async`, properties: [ - {document: 'The document being removed'}, - {currentUser: 'The current user'}, - {collection: 'The collection the document belongs to'}, + { document: 'The document being removed' }, + { currentUser: 'The current user' }, + { collection: 'The collection the document belongs to' }, ], runs: 'async', returns: null, description: - "Perform operations on a document after it's removed from the database asynchronously.", + 'Perform operations on a document after it\'s removed from the database asynchronously.', }); } }; diff --git a/packages/vulcan-core/lib/modules/default_resolvers.js b/packages/vulcan-core/lib/modules/default_resolvers.js index 723f1145f..f9e59cf15 100644 --- a/packages/vulcan-core/lib/modules/default_resolvers.js +++ b/packages/vulcan-core/lib/modules/default_resolvers.js @@ -26,12 +26,12 @@ export function getDefaultResolvers(options) { // new single-argument API typeName = arguments[0].typeName; collectionName = arguments[0].collectionName || getCollectionName(typeName); - resolverOptions = {...defaultOptions, ...arguments[0].options}; + resolverOptions = { ...defaultOptions, ...arguments[0].options }; } else { // OpenCRUD backwards compatibility collectionName = arguments[0]; typeName = getTypeName(collectionName); - resolverOptions = {...defaultOptions, ...arguments[1]}; + resolverOptions = { ...defaultOptions, ...arguments[1] }; } return { @@ -40,8 +40,8 @@ export function getDefaultResolvers(options) { multi: { description: `A list of ${typeName} documents matching a set of query terms`, - async resolver(root, {input = {}}, context, {cacheControl}) { - const {terms = {}, enableCache = false, enableTotal = true} = input; + async resolver(root, { input = {} }, context, { cacheControl }) { + const { terms = {}, enableCache = false, enableTotal = true } = input; debug(''); debugGroup( @@ -51,27 +51,22 @@ export function getDefaultResolvers(options) { debug(`Terms: ${JSON.stringify(terms)}`); if (cacheControl && enableCache) { - const maxAge = - resolverOptions.cacheMaxAge || defaultOptions.cacheMaxAge; - cacheControl.setCacheHint({maxAge}); + const maxAge = resolverOptions.cacheMaxAge || defaultOptions.cacheMaxAge; + cacheControl.setCacheHint({ maxAge }); } // get currentUser and Users collection from context - const {currentUser, Users} = context; + const { currentUser, Users } = context; // get collection based on collectionName argument const collection = context[collectionName]; // get selector and options from terms and perform Mongo query - let {selector, options} = await collection.getParameters( - terms, - {}, - context - ); + let { selector, options } = await collection.getParameters(terms, {}, context); options.skip = terms.offset; - debug({selector, options}); + debug({ selector, options }); const docs = await Connectors.find(collection, selector, options); @@ -81,23 +76,17 @@ export function getDefaultResolvers(options) { : docs; // take the remaining documents and remove any fields that shouldn't be accessible - const restrictedDocs = Users.restrictViewableFields( - currentUser, - collection, - viewableDocs - ); + const restrictedDocs = Users.restrictViewableFields(currentUser, collection, viewableDocs); // prime the cache restrictedDocs.forEach(doc => collection.loader.prime(doc._id, doc)); debug(`\x1b[33m=> ${restrictedDocs.length} documents returned\x1b[0m`); debugGroupEnd(); - debug( - `--------------- end \x1b[35m${typeName} Multi Resolver\x1b[0m ---------------` - ); + debug(`--------------- end \x1b[35m${typeName} Multi Resolver\x1b[0m ---------------`); debug(''); - const data = {results: restrictedDocs}; + const data = { results: restrictedDocs }; if (enableTotal) { // get total count of documents matching the selector @@ -114,8 +103,8 @@ export function getDefaultResolvers(options) { single: { description: `A single ${typeName} document fetched by ID or slug`, - async resolver(root, {input = {}}, context, {cacheControl}) { - const {selector = {}, enableCache = false, allowNull = false} = input; + async resolver(root, { input = {} }, context, { cacheControl }) { + const { selector = {}, enableCache = false, allowNull = false } = input; debug(''); debugGroup( @@ -125,12 +114,11 @@ export function getDefaultResolvers(options) { debug(`Selector: ${JSON.stringify(selector)}`); if (cacheControl && enableCache) { - const maxAge = - resolverOptions.cacheMaxAge || defaultOptions.cacheMaxAge; - cacheControl.setCacheHint({maxAge}); + const maxAge = resolverOptions.cacheMaxAge || defaultOptions.cacheMaxAge; + cacheControl.setCacheHint({ maxAge }); } - const {currentUser, Users} = context; + const { currentUser, Users } = context; const collection = context[collectionName]; // use Dataloader if doc is selected by documentId/_id @@ -141,11 +129,11 @@ export function getDefaultResolvers(options) { if (!doc) { if (allowNull) { - return {result: null}; + return { result: null }; } else { throwError({ id: 'app.missing_document', - data: {documentId, selector}, + data: { documentId, selector }, }); } } @@ -164,20 +152,14 @@ export function getDefaultResolvers(options) { ); } - const restrictedDoc = Users.restrictViewableFields( - currentUser, - collection, - doc - ); + const restrictedDoc = Users.restrictViewableFields(currentUser, collection, doc); debugGroupEnd(); - debug( - `--------------- end \x1b[35m${typeName} Single Resolver\x1b[0m ---------------` - ); + debug(`--------------- end \x1b[35m${typeName} Single Resolver\x1b[0m ---------------`); debug(''); // filter out disallowed properties and return resulting document - return {result: restrictedDoc}; + return { result: restrictedDoc }; }, }, }; diff --git a/packages/vulcan-core/lib/modules/index.js b/packages/vulcan-core/lib/modules/index.js index 6320d84f0..7e3a7b0c2 100644 --- a/packages/vulcan-core/lib/modules/index.js +++ b/packages/vulcan-core/lib/modules/index.js @@ -39,11 +39,11 @@ export { default as withMutation } from './containers/withMutation.js'; export { default as withUpsert } from './containers/withUpsert.js'; export { default as withSiteData } from './containers/withSiteData.js'; -export {default as withComponents} from './containers/withComponents'; +export { default as withComponents } from './containers/withComponents'; // OpenCRUD backwards compatibility -export {default as withNew} from './containers/withCreate.js'; -export {default as withEdit} from './containers/withUpdate.js'; -export {default as withRemove} from './containers/withDelete.js'; -export {default as withList} from './containers/withMulti.js'; -export {default as withDocument} from './containers/withSingle.js'; +export { default as withNew } from './containers/withCreate.js'; +export { default as withEdit } from './containers/withUpdate.js'; +export { default as withRemove } from './containers/withDelete.js'; +export { default as withList } from './containers/withMulti.js'; +export { default as withDocument } from './containers/withSingle.js'; diff --git a/packages/vulcan-core/test/containers.test.js b/packages/vulcan-core/test/containers.test.js index 116f16701..75484d0eb 100644 --- a/packages/vulcan-core/test/containers.test.js +++ b/packages/vulcan-core/test/containers.test.js @@ -2,10 +2,10 @@ import 'jsdom-global/register'; import React from 'react'; import expect from 'expect'; -import {shallow} from 'enzyme'; -import {Components} from 'meteor/vulcan:core'; -import {initComponentTest} from 'meteor/vulcan:test'; -import {withComponents} from '../lib/modules'; +import { shallow } from 'enzyme'; +import { Components } from 'meteor/vulcan:core'; +import { initComponentTest } from 'meteor/vulcan:test'; +import { withComponents } from '../lib/modules'; // we must import all the other components, so that "registerComponent" is called import '../lib/modules'; @@ -18,60 +18,51 @@ describe('vulcan-core/containers', function() { // replace any component for testing purpose const firstComponentName = Components[Object.keys(Components)[0]]; const FooComponent = () => 'FOO'; - const components = {[firstComponentName]: FooComponent}; - const MyComponent = withComponents(({Components}) => - Components[firstComponentName]() - ); + const components = { [firstComponentName]: FooComponent }; + const MyComponent = withComponents(({ Components }) => Components[firstComponentName]()); const wrapper = shallow(); expect(wrapper.prop('Components')).toBeDefined(); - expect(wrapper.prop('Components')[firstComponentName]).toEqual( - FooComponent - ); + expect(wrapper.prop('Components')[firstComponentName]).toEqual(FooComponent); expect(wrapper.html()).toEqual('FOO'); }); }); describe('handleOptions', function() { const expectedCollectionName = 'COLLECTION_NAME'; - const collectionNameOptions = {collectionName: expectedCollectionName}; - const expectedCollection = {options: collectionNameOptions}; + const collectionNameOptions = { collectionName: expectedCollectionName }; + const expectedCollection = { options: collectionNameOptions }; it('get collectionName from collection', function() { - const options = {collection: expectedCollection}; - const {collection, collectionName} = extractCollectionInfo(options); + const options = { collection: expectedCollection }; + const { collection, collectionName } = extractCollectionInfo(options); expect(collection).toEqual(expectedCollection); expect(collectionName).toEqual(expectedCollectionName); }); it('get collection from collectioName', function() { // MOCK getCollection - const {collection, collectionName} = extractCollectionInfo( - collectionNameOptions - ); + const { collection, collectionName } = extractCollectionInfo(collectionNameOptions); expect(collection).toEqual(expectedCollection); expect(collectionName).toEqual(expectedCollectionName); }); const expectedFragmentName = 'FRAGMENT_NAME'; const expectedFragment = { - definitions: [{name: {value: expectedFragmentName}}], + definitions: [{ name: { value: expectedFragmentName } }], }; it('get fragment from fragmentName', function() { // MOCK getCollection - const options = {fragmentName: expectedFragmentName}; - const {fragment, fragmentName} = extractFragmentInfo(options); + const options = { fragmentName: expectedFragmentName }; + const { fragment, fragmentName } = extractFragmentInfo(options); expect(fragment).toEqual(expectedFragment); expect(fragmentName).toEqual(expectedFragmentName); }); it('get fragmentName from fragment', function() { - const options = {fragment: expectedFragment}; - const {fragment, fragmentName} = extractFragmentInfo(options); + const options = { fragment: expectedFragment }; + const { fragment, fragmentName } = extractFragmentInfo(options); expect(fragment).toEqual(expectedFragment); expect(fragmentName).toEqual(expectedFragmentName); }); it('get fragmentName and fragment from collectionName', function() { // if options does not contain fragment, we get the collection default fragment based on its name const options = {}; - const {fragment, fragmentName} = extractFragmentInfo( - options, - expectedCollectionName - ); + const { fragment, fragmentName } = extractFragmentInfo(options, expectedCollectionName); expect(fragment).toEqual(expectedFragment); expect(fragmentName).toEqual(expectedFragmentName); }); diff --git a/packages/vulcan-events-internal/lib/client/internal-client.js b/packages/vulcan-events-internal/lib/client/internal-client.js index 2935f3c72..51b765ce0 100644 --- a/packages/vulcan-events-internal/lib/client/internal-client.js +++ b/packages/vulcan-events-internal/lib/client/internal-client.js @@ -1,9 +1,5 @@ -import {addTrackFunction} from 'meteor/vulcan:events'; -import { - getApolloClient, - getFragment, - createClientTemplate, -} from 'meteor/vulcan:lib'; +import { addTrackFunction } from 'meteor/vulcan:events'; +import { getApolloClient, getFragment, createClientTemplate } from 'meteor/vulcan:lib'; import gql from 'graphql-tag'; function trackInternal(eventName, eventProperties) { @@ -13,7 +9,7 @@ function trackInternal(eventName, eventProperties) { const fragment = getFragment(fragmentName); const mutation = gql` - ${createClientTemplate({typeName: 'AnalyticsEvent', fragmentName})} + ${createClientTemplate({ typeName: 'AnalyticsEvent', fragmentName })} ${fragment} `; @@ -23,7 +19,7 @@ function trackInternal(eventName, eventProperties) { properties: eventProperties, }, }; - apolloClient.mutate({mutation, variables}); + apolloClient.mutate({ mutation, variables }); } addTrackFunction(trackInternal); diff --git a/packages/vulcan-lib/lib/client/apollo-client/apolloClient.js b/packages/vulcan-lib/lib/client/apollo-client/apolloClient.js index 076e62d46..7de1da23f 100644 --- a/packages/vulcan-lib/lib/client/apollo-client/apolloClient.js +++ b/packages/vulcan-lib/lib/client/apollo-client/apolloClient.js @@ -1,23 +1,18 @@ -import {ApolloClient} from 'apollo-client'; -import {ApolloLink} from 'apollo-link'; +import { ApolloClient } from 'apollo-client'; +import { ApolloLink } from 'apollo-link'; import watchedMutationLink from './links/watchedMutation'; import httpLink from './links/http'; import meteorAccountsLink from './links/meteor'; import errorLink from './links/error'; -import {createStateLink} from '../../modules/apollo-common'; +import { createStateLink } from '../../modules/apollo-common'; import cache from './cache'; // these links do not change once created -const staticLinks = [ - watchedMutationLink, - errorLink, - meteorAccountsLink, - httpLink, -]; +const staticLinks = [watchedMutationLink, errorLink, meteorAccountsLink, httpLink]; let apolloClient; export const createApolloClient = () => { - const stateLink = createStateLink({cache}); + const stateLink = createStateLink({ cache }); const newClient = new ApolloClient({ link: ApolloLink.from([stateLink, ...staticLinks]), cache, diff --git a/packages/vulcan-lib/lib/client/apollo-client/cache.js b/packages/vulcan-lib/lib/client/apollo-client/cache.js index 194897e6b..b5d6d9483 100644 --- a/packages/vulcan-lib/lib/client/apollo-client/cache.js +++ b/packages/vulcan-lib/lib/client/apollo-client/cache.js @@ -1,4 +1,4 @@ -import {InMemoryCache} from 'apollo-cache-inmemory'; +import { InMemoryCache } from 'apollo-cache-inmemory'; const cache = new InMemoryCache() //ssr diff --git a/packages/vulcan-lib/lib/client/apollo-client/links/error.js b/packages/vulcan-lib/lib/client/apollo-client/links/error.js index 9d742045f..5b2620577 100644 --- a/packages/vulcan-lib/lib/client/apollo-client/links/error.js +++ b/packages/vulcan-lib/lib/client/apollo-client/links/error.js @@ -1,11 +1,9 @@ -import {onError} from 'apollo-link-error'; +import { onError } from 'apollo-link-error'; -const errorLink = onError(({graphQLErrors, networkError}) => { +const errorLink = onError(({ graphQLErrors, networkError }) => { if (graphQLErrors) - graphQLErrors.map(({message, locations, path}) => - console.log( - `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}` - ) + graphQLErrors.map(({ message, locations, path }) => + console.log(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`) ); if (networkError) console.log(`[Network error]: ${networkError}`); }); diff --git a/packages/vulcan-lib/lib/client/apollo-client/links/http.js b/packages/vulcan-lib/lib/client/apollo-client/links/http.js index 57b1a2523..24b95e369 100644 --- a/packages/vulcan-lib/lib/client/apollo-client/links/http.js +++ b/packages/vulcan-lib/lib/client/apollo-client/links/http.js @@ -1,4 +1,4 @@ -import {HttpLink} from 'apollo-link-http'; +import { HttpLink } from 'apollo-link-http'; const httpLink = new HttpLink({ uri: '/graphql', diff --git a/packages/vulcan-lib/lib/client/apollo-client/links/meteor.js b/packages/vulcan-lib/lib/client/apollo-client/links/meteor.js index 114b04008..635e54bb1 100644 --- a/packages/vulcan-lib/lib/client/apollo-client/links/meteor.js +++ b/packages/vulcan-lib/lib/client/apollo-client/links/meteor.js @@ -1,4 +1,4 @@ -import {MeteorAccountsLink} from 'meteor/apollo'; +import { MeteorAccountsLink } from 'meteor/apollo'; const meteorAccountsLink = new MeteorAccountsLink(); export default meteorAccountsLink; diff --git a/packages/vulcan-lib/lib/client/apollo-client/links/watchedMutation.js b/packages/vulcan-lib/lib/client/apollo-client/links/watchedMutation.js index 8cb6d59af..1cdb15ff2 100644 --- a/packages/vulcan-lib/lib/client/apollo-client/links/watchedMutation.js +++ b/packages/vulcan-lib/lib/client/apollo-client/links/watchedMutation.js @@ -4,7 +4,7 @@ * @see https://github.com/haytko/apollo-link-watched-mutation */ import WatchedMutationLink from 'apollo-link-watched-mutation'; -import {WatchedMutations} from '../updates'; +import { WatchedMutations } from '../updates'; import cache from '../cache'; const watchedMutationLink = new WatchedMutationLink(cache, WatchedMutations); diff --git a/packages/vulcan-lib/lib/client/apollo-client/updates.js b/packages/vulcan-lib/lib/client/apollo-client/updates.js index 600adb465..141cfe4e3 100644 --- a/packages/vulcan-lib/lib/client/apollo-client/updates.js +++ b/packages/vulcan-lib/lib/client/apollo-client/updates.js @@ -5,11 +5,7 @@ import Mingo from 'mingo'; export const WatchedMutations = {}; -export const registerWatchedMutation = ( - mutationName, - queryName, - updateFunction -) => { +export const registerWatchedMutation = (mutationName, queryName, updateFunction) => { WatchedMutations[mutationName] = { [queryName]: updateFunction, }; @@ -30,8 +26,7 @@ export const belongsToSet = (document, selector) => { Test if a document is already in a result set */ -export const isInSet = (data, document) => - data.results.find(item => item._id === document._id); +export const isInSet = (data, document) => data.results.find(item => item._id === document._id); /* @@ -53,9 +48,9 @@ Update a document in a set of results */ export const updateInSet = (queryData, document) => { const oldDocument = queryData.results.find(item => item._id === document._id); - const newDocument = {...oldDocument, ...document}; + const newDocument = { ...oldDocument, ...document }; const index = queryData.results.findIndex(item => item._id === document._id); - const newData = {results: [...queryData.results]}; // clone + const newData = { results: [...queryData.results] }; // clone newData.results[index] = newDocument; return newData; }; diff --git a/packages/vulcan-lib/lib/client/auth.js b/packages/vulcan-lib/lib/client/auth.js index 2b3ce4a85..b4d45828c 100644 --- a/packages/vulcan-lib/lib/client/auth.js +++ b/packages/vulcan-lib/lib/client/auth.js @@ -7,7 +7,7 @@ */ import Cookies from 'universal-cookie'; -import {Meteor} from 'meteor/meteor'; +import { Meteor } from 'meteor/meteor'; const cookie = new Cookies(); @@ -26,9 +26,7 @@ function setToken(loginToken, expires) { function initToken() { const loginToken = global.localStorage['Meteor.loginToken']; - const loginTokenExpires = new Date( - global.localStorage['Meteor.loginTokenExpires'] - ); + const loginTokenExpires = new Date(global.localStorage['Meteor.loginTokenExpires']); if (loginToken) { setToken(loginToken, loginTokenExpires); diff --git a/packages/vulcan-lib/lib/modules/apollo-common/links/state.js b/packages/vulcan-lib/lib/modules/apollo-common/links/state.js index 75ec30541..1f197e079 100644 --- a/packages/vulcan-lib/lib/modules/apollo-common/links/state.js +++ b/packages/vulcan-lib/lib/modules/apollo-common/links/state.js @@ -11,17 +11,12 @@ * Example * @see https://hackernoon.com/storing-local-state-in-react-with-apollo-link-state-738f6ca45569 */ -import {withClientState} from 'apollo-link-state'; +import { withClientState } from 'apollo-link-state'; /** * Create a state link */ -export const createStateLink = ({ - cache, - resolvers, - defaults, - ...otherOptions -}) => { +export const createStateLink = ({ cache, resolvers, defaults, ...otherOptions }) => { const stateLink = withClientState({ cache, defaults: defaults || getStateLinkDefaults(), @@ -36,11 +31,7 @@ const registeredDefaults = {}; /** * Defaults are default response to queries */ -export const registerStateLinkDefault = ({ - name, - defaultValue, - options = {}, -}) => { +export const registerStateLinkDefault = ({ name, defaultValue, options = {} }) => { registeredDefaults[name] = defaultValue; return registeredDefaults; }; @@ -49,7 +40,7 @@ export const getStateLinkDefaults = () => registeredDefaults; // Mutation are equivalent to a Redux Action + Reducer // except it uses GraphQL to retrieve/update data in the cache const registeredMutations = {}; -export const registerStateLinkMutation = ({name, mutation, options = {}}) => { +export const registerStateLinkMutation = ({ name, mutation, options = {} }) => { registeredMutations[name] = mutation; return registeredMutations; }; diff --git a/packages/vulcan-lib/lib/modules/graphql.js b/packages/vulcan-lib/lib/modules/graphql.js index 1bada770a..7db859324 100644 --- a/packages/vulcan-lib/lib/modules/graphql.js +++ b/packages/vulcan-lib/lib/modules/graphql.js @@ -10,9 +10,9 @@ import deepmerge from 'deepmerge'; import GraphQLJSON from 'graphql-type-json'; import GraphQLDate from 'graphql-date'; import Vulcan from './config.js'; // used for global export -import {Utils} from './utils.js'; -import {disableFragmentWarnings} from 'graphql-tag'; -import {isIntlField} from './intl.js'; +import { Utils } from './utils.js'; +import { disableFragmentWarnings } from 'graphql-tag'; +import { isIntlField } from './intl.js'; import { selectorInputTemplate, mainTypeTemplate, @@ -44,11 +44,7 @@ const getGraphQLType = (schema, fieldName, isInput = false) => { const field = schema[fieldName]; const type = field.type.singleType; const typeName = - typeof type === 'object' - ? 'Object' - : typeof type === 'function' - ? type.name - : type; + typeof type === 'object' ? 'Object' : typeof type === 'function' ? type.name : type; if (field.isIntlData) { return isInput ? '[IntlValueInput]' : '[IntlValue]'; @@ -119,13 +115,13 @@ export const GraphQLSchema = { // queries queries: [], addQuery(query, description) { - this.queries.push({query, description}); + this.queries.push({ query, description }); }, // mutations mutations: [], addMutation(mutation, description) { - this.mutations.push({mutation, description}); + this.mutations.push({ mutation, description }); }, // add resolvers @@ -182,9 +178,7 @@ export const GraphQLSchema = { ) { const fieldDescription = field.description; const fieldDirective = isIntlField(field) ? '@intl' : ''; - const fieldArguments = isIntlField(field) - ? [{name: 'locale', type: 'String'}] - : []; + const fieldArguments = isIntlField(field) ? [{ name: 'locale', type: 'String' }] : []; // if field has a resolveAs, push it to schema if (field.resolveAs) { @@ -208,13 +202,9 @@ export const GraphQLSchema = { const resolver = { [typeName]: { [resolverName]: (document, args, context, info) => { - const {Users, currentUser} = context; + const { Users, currentUser } = context; // check that current user has permission to access the original non-resolved field - const canReadField = Users.canReadField( - currentUser, - field, - document - ); + const canReadField = Users.canReadField(currentUser, field, document); return canReadField ? field.resolveAs.resolver(document, args, context, info) : null; @@ -316,80 +306,61 @@ export const GraphQLSchema = { const fields = this.getFields(schema, typeName); - const {interfaces = [], resolvers, mutations} = collection.options; + const { interfaces = [], resolvers, mutations } = collection.options; const description = collection.options.description ? collection.options.description : `Type for ${collectionName}`; - const { - mainType, - create, - update, - selector, - selectorUnique, - orderBy, - } = fields; + const { mainType, create, update, selector, selectorUnique, orderBy } = fields; if (mainType.length) { schemaFragments.push( - mainTypeTemplate({typeName, description, interfaces, fields: mainType}) + mainTypeTemplate({ typeName, description, interfaces, fields: mainType }) ); - schemaFragments.push(deleteInputTemplate({typeName})); - schemaFragments.push(singleInputTemplate({typeName})); - schemaFragments.push(multiInputTemplate({typeName})); - schemaFragments.push(singleOutputTemplate({typeName})); - schemaFragments.push(multiOutputTemplate({typeName})); - schemaFragments.push(mutationOutputTemplate({typeName})); + schemaFragments.push(deleteInputTemplate({ typeName })); + schemaFragments.push(singleInputTemplate({ typeName })); + schemaFragments.push(multiInputTemplate({ typeName })); + schemaFragments.push(singleOutputTemplate({ typeName })); + schemaFragments.push(multiOutputTemplate({ typeName })); + schemaFragments.push(mutationOutputTemplate({ typeName })); if (create.length) { - schemaFragments.push(createInputTemplate({typeName})); - schemaFragments.push( - createDataInputTemplate({typeName, fields: create}) - ); + schemaFragments.push(createInputTemplate({ typeName })); + schemaFragments.push(createDataInputTemplate({ typeName, fields: create })); } if (update.length) { - schemaFragments.push(updateInputTemplate({typeName})); - schemaFragments.push(upsertInputTemplate({typeName})); - schemaFragments.push( - updateDataInputTemplate({typeName, fields: update}) - ); + schemaFragments.push(updateInputTemplate({ typeName })); + schemaFragments.push(upsertInputTemplate({ typeName })); + schemaFragments.push(updateDataInputTemplate({ typeName, fields: update })); } - schemaFragments.push(selectorInputTemplate({typeName, fields: selector})); + schemaFragments.push(selectorInputTemplate({ typeName, fields: selector })); - schemaFragments.push( - selectorUniqueInputTemplate({typeName, fields: selectorUnique}) - ); + schemaFragments.push(selectorUniqueInputTemplate({ typeName, fields: selectorUnique })); - schemaFragments.push(orderByInputTemplate({typeName, fields: orderBy})); + schemaFragments.push(orderByInputTemplate({ typeName, fields: orderBy })); if (!_.isEmpty(resolvers)) { const queryResolvers = {}; // single if (resolvers.single) { - addGraphQLQuery( - singleQueryTemplate({typeName}), - resolvers.single.description + addGraphQLQuery(singleQueryTemplate({ typeName }), resolvers.single.description); + queryResolvers[Utils.camelCaseify(typeName)] = resolvers.single.resolver.bind( + resolvers.single ); - queryResolvers[ - Utils.camelCaseify(typeName) - ] = resolvers.single.resolver.bind(resolvers.single); } // multi if (resolvers.multi) { - addGraphQLQuery( - multiQueryTemplate({typeName}), - resolvers.multi.description - ); + addGraphQLQuery(multiQueryTemplate({ typeName }), resolvers.multi.description); queryResolvers[ Utils.camelCaseify(Utils.pluralize(typeName)) ] = resolvers.multi.resolver.bind(resolvers.multi); } - addGraphQLResolvers({Query: {...queryResolvers}}); + addGraphQLResolvers({ Query: { ...queryResolvers } }); } if (!_.isEmpty(mutations)) { @@ -403,13 +374,10 @@ export const GraphQLSchema = { `// Warning: you defined a "create" mutation for collection ${collectionName}, but it doesn't have any mutable fields, so no corresponding mutation types can be generated. Remove the "create" mutation or define a "canCreate" property on a field to disable this warning` ); } else { - addGraphQLMutation( - createMutationTemplate({typeName}), - mutations.create.description + addGraphQLMutation(createMutationTemplate({ typeName }), mutations.create.description); + mutationResolvers[`create${typeName}`] = mutations.create.mutation.bind( + mutations.create ); - mutationResolvers[ - `create${typeName}` - ] = mutations.create.mutation.bind(mutations.create); } } // update @@ -421,13 +389,10 @@ export const GraphQLSchema = { `// Warning: you defined an "update" mutation for collection ${collectionName}, but it doesn't have any mutable fields, so no corresponding mutation types can be generated. Remove the "update" mutation or define a "canUpdate" property on a field to disable this warning` ); } else { - addGraphQLMutation( - updateMutationTemplate({typeName}), - mutations.update.description + addGraphQLMutation(updateMutationTemplate({ typeName }), mutations.update.description); + mutationResolvers[`update${typeName}`] = mutations.update.mutation.bind( + mutations.update ); - mutationResolvers[ - `update${typeName}` - ] = mutations.update.mutation.bind(mutations.update); } } // upsert @@ -439,27 +404,19 @@ export const GraphQLSchema = { `// Warning: you defined an "upsert" mutation for collection ${collectionName}, but it doesn't have any mutable fields, so no corresponding mutation types can be generated. Remove the "upsert" mutation or define a "canUpdate" property on a field to disable this warning` ); } else { - addGraphQLMutation( - upsertMutationTemplate({typeName}), - mutations.upsert.description + addGraphQLMutation(upsertMutationTemplate({ typeName }), mutations.upsert.description); + mutationResolvers[`upsert${typeName}`] = mutations.upsert.mutation.bind( + mutations.upsert ); - mutationResolvers[ - `upsert${typeName}` - ] = mutations.upsert.mutation.bind(mutations.upsert); } } // delete if (mutations.delete) { // e.g. "deleteMovie(input: DeleteMovieInput) : Movie" - addGraphQLMutation( - deleteMutationTemplate({typeName}), - mutations.delete.description - ); - mutationResolvers[ - `delete${typeName}` - ] = mutations.delete.mutation.bind(mutations.delete); + addGraphQLMutation(deleteMutationTemplate({ typeName }), mutations.delete.description); + mutationResolvers[`delete${typeName}`] = mutations.delete.mutation.bind(mutations.delete); } - addGraphQLResolvers({Mutation: {...mutationResolvers}}); + addGraphQLResolvers({ Mutation: { ...mutationResolvers } }); } graphQLSchema = schemaFragments.join('\n\n') + '\n\n\n'; } else { @@ -475,9 +432,7 @@ export const GraphQLSchema = { // getters getSchema() { if (!(this.finalSchema && this.finalSchema.length)) { - throw new Error( - 'Warning: trying to access schema before it has been created by the server.' - ); + throw new Error('Warning: trying to access schema before it has been created by the server.'); } return this.finalSchema[0]; }, @@ -503,21 +458,11 @@ Vulcan.getGraphQLSchema = () => { return schema; }; -export const addGraphQLCollection = GraphQLSchema.addCollection.bind( - GraphQLSchema -); +export const addGraphQLCollection = GraphQLSchema.addCollection.bind(GraphQLSchema); export const addGraphQLSchema = GraphQLSchema.addSchema.bind(GraphQLSchema); export const addGraphQLQuery = GraphQLSchema.addQuery.bind(GraphQLSchema); export const addGraphQLMutation = GraphQLSchema.addMutation.bind(GraphQLSchema); -export const addGraphQLResolvers = GraphQLSchema.addResolvers.bind( - GraphQLSchema -); -export const removeGraphQLResolver = GraphQLSchema.removeResolver.bind( - GraphQLSchema -); -export const addToGraphQLContext = GraphQLSchema.addToContext.bind( - GraphQLSchema -); -export const addGraphQLDirective = GraphQLSchema.addDirective.bind( - GraphQLSchema -); +export const addGraphQLResolvers = GraphQLSchema.addResolvers.bind(GraphQLSchema); +export const removeGraphQLResolver = GraphQLSchema.removeResolver.bind(GraphQLSchema); +export const addToGraphQLContext = GraphQLSchema.addToContext.bind(GraphQLSchema); +export const addGraphQLDirective = GraphQLSchema.addDirective.bind(GraphQLSchema); diff --git a/packages/vulcan-lib/lib/server/apollo-server/apollo_server2.js b/packages/vulcan-lib/lib/server/apollo-server/apollo_server2.js index e6ddad9a3..f2467ec9a 100644 --- a/packages/vulcan-lib/lib/server/apollo-server/apollo_server2.js +++ b/packages/vulcan-lib/lib/server/apollo-server/apollo_server2.js @@ -6,44 +6,37 @@ // Meteor WebApp use a Connect server, so we need to // use apollo-server-express integration //import express from 'express'; -import {ApolloServer} from 'apollo-server-express'; +import { ApolloServer } from 'apollo-server-express'; -import {Meteor} from 'meteor/meteor'; +import { Meteor } from 'meteor/meteor'; -import {WebApp} from 'meteor/webapp'; +import { WebApp } from 'meteor/webapp'; import bodyParser from 'body-parser'; // import cookiesMiddleware from 'universal-cookie-express'; // import Cookies from 'universal-cookie'; import voyagerMiddleware from 'graphql-voyager/middleware/express'; import getVoyagerConfig from './voyager'; -import {graphiqlMiddleware, getGraphiqlConfig} from './graphiql'; +import { graphiqlMiddleware, getGraphiqlConfig } from './graphiql'; import getPlaygroundConfig from './playground'; import initGraphQL from './initGraphQL'; import './settings'; -import {engineConfig} from './engine'; -import {initContext, computeContextFromReq} from './context.js'; +import { engineConfig } from './engine'; +import { initContext, computeContextFromReq } from './context.js'; -import {GraphQLSchema} from '../../modules/graphql.js'; +import { GraphQLSchema } from '../../modules/graphql.js'; -import {enableSSR} from '../apollo-ssr'; +import { enableSSR } from '../apollo-ssr'; import universalCookiesMiddleware from 'universal-cookie-express'; -import { - getApolloApplyMiddlewareOptions, - getApolloServerOptions, -} from './settings'; +import { getApolloApplyMiddlewareOptions, getApolloServerOptions } from './settings'; -import {getSetting} from '../../modules/settings.js'; -import {formatError} from 'apollo-errors'; +import { getSetting } from '../../modules/settings.js'; +import { formatError } from 'apollo-errors'; -export const setupGraphQLMiddlewares = ( - apolloServer, - config, - apolloApplyMiddlewareOptions -) => { +export const setupGraphQLMiddlewares = (apolloServer, config, apolloApplyMiddlewareOptions) => { // IMPORTANT: order matters ! // 1 - Add request parsing middleware // 2 - Add apollo specific middlewares @@ -59,12 +52,9 @@ export const setupGraphQLMiddlewares = ( // parse request (order matters) WebApp.connectHandlers.use( config.path, - bodyParser.json({limit: getSetting('apolloServer.jsonParserOptions.limit')}) - ); - WebApp.connectHandlers.use( - config.path, - bodyParser.text({type: 'application/graphql'}) + bodyParser.json({ limit: getSetting('apolloServer.jsonParserOptions.limit') }) ); + WebApp.connectHandlers.use(config.path, bodyParser.text({ type: 'application/graphql' })); // Provide the Meteor WebApp Connect server instance to Apollo // Apollo will use it instead of its own HTTP server when handling requests @@ -88,15 +78,9 @@ export const setupGraphQLMiddlewares = ( export const setupToolsMiddlewares = config => { // Voyager is a GraphQL schema visual explorer // available on /voyager as a default - WebApp.connectHandlers.use( - config.voyagerPath, - voyagerMiddleware(getVoyagerConfig(config)) - ); + WebApp.connectHandlers.use(config.voyagerPath, voyagerMiddleware(getVoyagerConfig(config))); // Setup GraphiQL - WebApp.connectHandlers.use( - config.graphiqlPath, - graphiqlMiddleware(getGraphiqlConfig(config)) - ); + WebApp.connectHandlers.use(config.graphiqlPath, graphiqlMiddleware(getGraphiqlConfig(config))); }; /** @@ -158,7 +142,7 @@ export const onStart = () => { formatError, tracing: getSetting('apolloTracing', Meteor.isDevelopment), cacheControl: true, - context: ({req}) => context(req), + context: ({ req }) => context(req), ...getApolloServerOptions(), }, }); @@ -170,7 +154,7 @@ export const onStart = () => { setupToolsMiddlewares(config); } // ssr - enableSSR({computeContext: context}); + enableSSR({ computeContext: context }); }; // createApolloServer when server startup Meteor.startup(onStart); diff --git a/packages/vulcan-lib/lib/server/apollo-server/context.js b/packages/vulcan-lib/lib/server/apollo-server/context.js index 80f3ddbcb..6debec4da 100644 --- a/packages/vulcan-lib/lib/server/apollo-server/context.js +++ b/packages/vulcan-lib/lib/server/apollo-server/context.js @@ -12,14 +12,14 @@ //import deepmerge from 'deepmerge'; import DataLoader from 'dataloader'; -import {Collections} from '../../modules/collections.js'; -import {runCallbacks} from '../../modules/callbacks.js'; +import { Collections } from '../../modules/collections.js'; +import { runCallbacks } from '../../modules/callbacks.js'; import findByIds from '../../modules/findbyids.js'; -import {GraphQLSchema} from '../../modules/graphql.js'; +import { GraphQLSchema } from '../../modules/graphql.js'; import _merge from 'lodash/merge'; -import {getUser} from 'meteor/apollo'; -import {getHeaderLocale} from '../intl.js'; -import {getSetting} from '../../modules/settings.js'; +import { getUser } from 'meteor/apollo'; +import { getHeaderLocale } from '../intl.js'; +import { getSetting } from '../../modules/settings.js'; /** * Called once on server creation @@ -28,7 +28,7 @@ import {getSetting} from '../../modules/settings.js'; export const initContext = currentContext => { let context; if (currentContext) { - context = {...currentContext}; + context = { ...currentContext }; } else { context = {}; } @@ -52,10 +52,7 @@ import Cookies from 'universal-cookie'; // initial request will get the login token from a cookie, subsequent requests from // the header const getAuthToken = req => { - return ( - req.headers.authorization || - new Cookies(req.cookies).get('meteor_login_token') - ); + return req.headers.authorization || new Cookies(req.cookies).get('meteor_login_token'); }; // @see https://www.apollographql.com/docs/react/recipes/meteor#Server const setupAuthToken = async (context, req) => { @@ -75,8 +72,8 @@ export const computeContextFromReq = (currentContext, customContextFromReq) => { // givenOptions can be either a function of the request or an object const getBaseContext = req => customContextFromReq - ? {...currentContext, ...customContextFromReq(req)} - : {...currentContext}; + ? { ...currentContext, ...customContextFromReq(req) } + : { ...currentContext }; // Previous implementation // Now meteor/apollo already provide this // Get the token from the header @@ -127,7 +124,7 @@ export const computeContextFromReq = (currentContext, customContextFromReq) => { // console.log('// apollo_server.js locale:', req.headers.locale); // if apiKey is present, assign "fake" currentUser with admin rights - if (headers.apikey && (headers.apikey === getSetting('vulcan.apiKey'))) { + if (headers.apikey && headers.apikey === getSetting('vulcan.apiKey')) { context.currentUser = { isAdmin: true, isApiUser: true }; } diff --git a/packages/vulcan-lib/lib/server/apollo-server/engine.js b/packages/vulcan-lib/lib/server/apollo-server/engine.js index 6b1810256..26a028b0e 100644 --- a/packages/vulcan-lib/lib/server/apollo-server/engine.js +++ b/packages/vulcan-lib/lib/server/apollo-server/engine.js @@ -1,7 +1,6 @@ -import {getSetting} from '../../modules/settings.js'; +import { getSetting } from '../../modules/settings.js'; // see https://github.com/apollographql/apollo-cache-control -export const engineApiKey = - process.env.ENGINE_API_KEY || getSetting('apolloEngine.apiKey'); +export const engineApiKey = process.env.ENGINE_API_KEY || getSetting('apolloEngine.apiKey'); // options now available: // @see https://www.apollographql.com/docs/apollo-server/api/apollo-server.html#EngineReportingOptions export const engineConfig = engineApiKey diff --git a/packages/vulcan-lib/lib/server/apollo-server/graphiql.js b/packages/vulcan-lib/lib/server/apollo-server/graphiql.js index 144b1ab0e..3f527ef76 100644 --- a/packages/vulcan-lib/lib/server/apollo-server/graphiql.js +++ b/packages/vulcan-lib/lib/server/apollo-server/graphiql.js @@ -42,18 +42,14 @@ function safeSerialize(data) { export function renderGraphiQL(data) { const endpointURL = data.endpointURL; - const endpointWs = - endpointURL.startsWith('ws://') || endpointURL.startsWith('wss://'); + const endpointWs = endpointURL.startsWith('ws://') || endpointURL.startsWith('wss://'); const subscriptionsEndpoint = data.subscriptionsEndpoint; const usingHttp = !endpointWs; const usingWs = endpointWs || !!subscriptionsEndpoint; - const endpointURLWs = - usingWs && (endpointWs ? endpointURL : subscriptionsEndpoint); + const endpointURLWs = usingWs && (endpointWs ? endpointURL : subscriptionsEndpoint); const queryString = data.query; - const variablesString = data.variables - ? JSON.stringify(data.variables, null, 2) - : null; + const variablesString = data.variables ? JSON.stringify(data.variables, null, 2) : null; const resultString = null; const operationName = data.operationName; const passHeader = data.passHeader ? data.passHeader : ''; @@ -87,11 +83,7 @@ export function renderGraphiQL(data) { ? `` : '' } - ${ - usingHttp - ? '' - : '' - } + ${usingHttp ? '' : ''} ${ usingWs ? `` @@ -263,8 +255,7 @@ function createGraphiQLData(params, options) { endpointURL: options.endpointURL, subscriptionsEndpoint: options.subscriptionsEndpoint, query: params.query || options.query, - variables: - (params.variables && JSON.parse(params.variables)) || options.variables, + variables: (params.variables && JSON.parse(params.variables)) || options.variables, operationName: params.operationName || options.operationName, passHeader: options.passHeader, editorTheme: options.editorTheme, diff --git a/packages/vulcan-lib/lib/server/apollo-server/index.js b/packages/vulcan-lib/lib/server/apollo-server/index.js index b686ff831..502f69a5a 100644 --- a/packages/vulcan-lib/lib/server/apollo-server/index.js +++ b/packages/vulcan-lib/lib/server/apollo-server/index.js @@ -1,4 +1,4 @@ export * from './apollo_server2'; export * from './settings'; -export {default as initGraphQL} from './initGraphQL'; +export { default as initGraphQL } from './initGraphQL'; diff --git a/packages/vulcan-lib/lib/server/apollo-server/initGraphQL.js b/packages/vulcan-lib/lib/server/apollo-server/initGraphQL.js index 41c74a4b0..5693ca344 100644 --- a/packages/vulcan-lib/lib/server/apollo-server/initGraphQL.js +++ b/packages/vulcan-lib/lib/server/apollo-server/initGraphQL.js @@ -2,9 +2,9 @@ * Init the graphQL schema */ -import {makeExecutableSchema} from 'apollo-server'; -import {GraphQLSchema} from '../../modules/graphql.js'; -import {runCallbacks} from '../../modules/callbacks.js'; +import { makeExecutableSchema } from 'apollo-server'; +import { GraphQLSchema } from '../../modules/graphql.js'; +import { runCallbacks } from '../../modules/callbacks.js'; const getQueries = () => `type Query { diff --git a/packages/vulcan-lib/lib/server/apollo-server/settings.js b/packages/vulcan-lib/lib/server/apollo-server/settings.js index 536159521..2eb0dfc5e 100644 --- a/packages/vulcan-lib/lib/server/apollo-server/settings.js +++ b/packages/vulcan-lib/lib/server/apollo-server/settings.js @@ -27,5 +27,4 @@ let apolloApplyMiddlewareOptions = {}; export const registerApolloApplyMiddlewareOptions = options => { apolloApplyMiddlewareOptions = _merge(apolloApplyMiddlewareOptions, options); }; -export const getApolloApplyMiddlewareOptions = () => - apolloApplyMiddlewareOptions; +export const getApolloApplyMiddlewareOptions = () => apolloApplyMiddlewareOptions; diff --git a/packages/vulcan-lib/lib/server/apollo-ssr/apolloClient.js b/packages/vulcan-lib/lib/server/apollo-ssr/apolloClient.js index 8139bf543..97161238e 100644 --- a/packages/vulcan-lib/lib/server/apollo-ssr/apolloClient.js +++ b/packages/vulcan-lib/lib/server/apollo-ssr/apolloClient.js @@ -5,29 +5,29 @@ * /!\ It must be recreated on every request */ -import {ApolloClient} from 'apollo-client'; -import {InMemoryCache} from 'apollo-cache-inmemory'; +import { ApolloClient } from 'apollo-client'; +import { InMemoryCache } from 'apollo-cache-inmemory'; -import {SchemaLink} from 'apollo-link-schema'; -import {GraphQLSchema} from '../../modules/graphql.js'; +import { SchemaLink } from 'apollo-link-schema'; +import { GraphQLSchema } from '../../modules/graphql.js'; -import {createStateLink} from '../../modules/apollo-common'; -import {ApolloLink} from 'apollo-link'; +import { createStateLink } from '../../modules/apollo-common'; +import { ApolloLink } from 'apollo-link'; // @see https://www.apollographql.com/docs/react/features/server-side-rendering.html#local-queries // import { createHttpLink } from 'apollo-link-http'; // import fetch from 'node-fetch' -export const createClient = async ({req, computeContext}) => { +export const createClient = async ({ req, computeContext }) => { // init // stateLink will init the client internal state const cache = new InMemoryCache(); - const stateLink = createStateLink({cache}); + const stateLink = createStateLink({ cache }); // schemaLink will fetch data directly based on the executable schema const schema = GraphQLSchema.getExecutableSchema(); // this is the resolver context const context = await computeContext(req); - const schemaLink = new SchemaLink({schema, context}); + const schemaLink = new SchemaLink({ schema, context }); const client = new ApolloClient({ ssrMode: true, link: ApolloLink.from([stateLink, schemaLink]), diff --git a/packages/vulcan-lib/lib/server/apollo-ssr/components/AppGenerator.jsx b/packages/vulcan-lib/lib/server/apollo-ssr/components/AppGenerator.jsx index ef94bae71..536ed3c69 100644 --- a/packages/vulcan-lib/lib/server/apollo-ssr/components/AppGenerator.jsx +++ b/packages/vulcan-lib/lib/server/apollo-ssr/components/AppGenerator.jsx @@ -5,7 +5,7 @@ import React from 'react'; import { ApolloProvider } from 'react-apollo'; import { StaticRouter } from 'react-router'; -import { Components } from 'meteor/vulcan:lib' +import { Components } from 'meteor/vulcan:lib'; import { CookiesProvider } from 'react-cookie'; @@ -16,7 +16,7 @@ import Cookies from 'universal-cookie'; const AppGenerator = ({ req, apolloClient, context }) => { // TODO: universalCookies should be defined here, but it isn't // @see https://github.com/meteor/meteor-feature-requests/issues/174#issuecomment-441047495 - const cookies = new Cookies(req.cookies) // req.universalCookies; + const cookies = new Cookies(req.cookies); // req.universalCookies; const App = ( @@ -26,6 +26,6 @@ const AppGenerator = ({ req, apolloClient, context }) => { ); - return App + return App; }; export default AppGenerator; diff --git a/packages/vulcan-lib/lib/server/apollo-ssr/enableSSR.js b/packages/vulcan-lib/lib/server/apollo-ssr/enableSSR.js index 3746089a1..f960b9a0f 100644 --- a/packages/vulcan-lib/lib/server/apollo-ssr/enableSSR.js +++ b/packages/vulcan-lib/lib/server/apollo-ssr/enableSSR.js @@ -2,25 +2,21 @@ * Actually enable SSR */ -import { - populateComponentsApp, - populateRoutesApp, - initializeFragments, -} from 'meteor/vulcan:lib'; +import { populateComponentsApp, populateRoutesApp, initializeFragments } from 'meteor/vulcan:lib'; // onPageLoad is mostly equivalent to an Express middleware // excepts it is tailored to handle Meteor server side rendering -import {onPageLoad} from 'meteor/server-render'; +import { onPageLoad } from 'meteor/server-render'; import makePageRenderer from './renderPage'; -const enableSSR = ({computeContext}) => { +const enableSSR = ({ computeContext }) => { Meteor.startup(() => { // init the application components and routes, including components & routes from 3rd-party packages initializeFragments(); populateComponentsApp(); populateRoutesApp(); // render the page - onPageLoad(makePageRenderer({computeContext})); + onPageLoad(makePageRenderer({ computeContext })); }); }; diff --git a/packages/vulcan-lib/lib/server/apollo-ssr/index.js b/packages/vulcan-lib/lib/server/apollo-ssr/index.js index b77a23790..fd0d75038 100644 --- a/packages/vulcan-lib/lib/server/apollo-ssr/index.js +++ b/packages/vulcan-lib/lib/server/apollo-ssr/index.js @@ -1 +1 @@ -export {default as enableSSR} from './enableSSR'; +export { default as enableSSR } from './enableSSR'; diff --git a/packages/vulcan-lib/lib/server/apollo-ssr/renderPage.js b/packages/vulcan-lib/lib/server/apollo-ssr/renderPage.js index 78ff5ded3..7e8a15395 100644 --- a/packages/vulcan-lib/lib/server/apollo-ssr/renderPage.js +++ b/packages/vulcan-lib/lib/server/apollo-ssr/renderPage.js @@ -6,22 +6,22 @@ */ import React from 'react'; import ReactDOM from 'react-dom/server'; -import {renderToStringWithData} from 'react-apollo'; +import { renderToStringWithData } from 'react-apollo'; -import {runCallbacks} from '../../modules/callbacks'; -import {createClient} from './apolloClient'; +import { runCallbacks } from '../../modules/callbacks'; +import { createClient } from './apolloClient'; import Head from './components/Head'; import ApolloState from './components/ApolloState'; import AppGenerator from './components/AppGenerator'; -const makePageRenderer = ({computeContext}) => { +const makePageRenderer = ({ computeContext }) => { // onPageLoad callback const renderPage = async sink => { const req = sink.request; // according to the Apollo doc, client needs to be recreated on every request // this avoids caching server side - const client = await createClient({req, computeContext}); + const client = await createClient({ req, computeContext }); // Used by callbacks to handle side effects // E.g storing the stylesheet generated by styled-components @@ -31,15 +31,13 @@ const makePageRenderer = ({computeContext}) => { // middlewares at this point // @see https://github.com/meteor/meteor-feature-requests/issues/174#issuecomment-441047495 - const App = ( - - ); + const App = ; // run user registered callbacks that wraps the React app const WrappedApp = runCallbacks({ name: 'router.server.wrapper', iterator: App, - properties: {req, context, apolloClient: client}, + properties: { req, context, apolloClient: client }, }); // equivalent to calling getDataFromTree and then renderToStringWithData @@ -67,7 +65,7 @@ const makePageRenderer = ({computeContext}) => { runCallbacks({ name: 'router.server.postRender', iterator: sink, - properties: {context}, + properties: { context }, }); }; return renderPage; diff --git a/packages/vulcan-lib/lib/server/intl.js b/packages/vulcan-lib/lib/server/intl.js index e4a7d33ab..e0eeac578 100644 --- a/packages/vulcan-lib/lib/server/intl.js +++ b/packages/vulcan-lib/lib/server/intl.js @@ -1,14 +1,14 @@ // see https://github.com/apollographql/graphql-tools/blob/master/docs/source/schema-directives.md#marking-strings-for-internationalization -import {addGraphQLDirective, addGraphQLSchema} from '../modules/graphql'; -import {SchemaDirectiveVisitor} from 'graphql-tools'; -import {defaultFieldResolver} from 'graphql'; -import {Collections} from '../modules/collections'; -import {getSetting} from '../modules/settings'; -import {debug} from '../modules/debug'; +import { addGraphQLDirective, addGraphQLSchema } from '../modules/graphql'; +import { SchemaDirectiveVisitor } from 'graphql-tools'; +import { defaultFieldResolver } from 'graphql'; +import { Collections } from '../modules/collections'; +import { getSetting } from '../modules/settings'; +import { debug } from '../modules/debug'; import Vulcan from '../modules/config'; -import {isIntlField} from '../modules/intl'; -import {Connectors} from './connectors'; +import { isIntlField } from '../modules/intl'; +import { Connectors } from './connectors'; import pickBy from 'lodash/pickBy'; /* @@ -32,16 +32,11 @@ Take an array of translations, a locale, and a default locale, and return a matc */ const getLocaleString = (translations, locale, defaultLocale) => { - const localeObject = translations.find( - translation => translation.locale === locale - ); + const localeObject = translations.find(translation => translation.locale === locale); const defaultLocaleObject = translations.find( translation => translation.locale === defaultLocale ); - return ( - (localeObject && localeObject.value) || - (defaultLocaleObject && defaultLocaleObject.value) - ); + return (localeObject && localeObject.value) || (defaultLocaleObject && defaultLocaleObject.value); }; /* @@ -59,15 +54,12 @@ class IntlDirective extends SchemaDirectiveVisitor { const defaultLocale = getSetting('locale'); const intlField = doc[`${name}_intl`]; // Return string in requested or default language, or else field's original value - return ( - (intlField && getLocaleString(intlField, locale, defaultLocale)) || - fieldValue - ); + return (intlField && getLocaleString(intlField, locale, defaultLocale)) || fieldValue; }; } } -addGraphQLDirective({intl: IntlDirective}); +addGraphQLDirective({ intl: IntlDirective }); addGraphQLSchema('directive @intl on FIELD_DEFINITION'); @@ -79,7 +71,7 @@ Migration function const migrateIntlFields = async defaultLocale => { if (!defaultLocale) { throw new Error( - "Please pass the id of the locale to which to migrate your current content (e.g. migrateIntlFields('en'))" + 'Please pass the id of the locale to which to migrate your current content (e.g. migrateIntlFields(\'en\'))' ); } @@ -101,31 +93,22 @@ const migrateIntlFields = async defaultLocale => { const selector = { $or: intlFieldsNames.map(f => { return { - $and: [ - {[`${f}`]: {$exists: true}}, - {[`${f}_intl`]: {$exists: false}}, - ], + $and: [{ [`${f}`]: { $exists: true } }, { [`${f}_intl`]: { $exists: false } }], }; }), }; const documentsToMigrate = await Connectors.find(collection, selector); if (documentsToMigrate.length) { - console.log( - `-> found ${documentsToMigrate.length} documents to migrate \n` - ); // eslint-disable-line no-console + console.log(`-> found ${documentsToMigrate.length} documents to migrate \n`); // eslint-disable-line no-console for (const doc of documentsToMigrate) { console.log(`// Migrating document ${doc._id}`); // eslint-disable-line no-console - const modifier = {$push: {}}; + const modifier = { $push: {} }; intlFieldsNames.forEach(f => { if (doc[f] && !doc[`${f}_intl`]) { - const translationObject = {locale: defaultLocale, value: doc[f]}; - console.log( - `-> Adding field ${f}_intl: ${JSON.stringify( - translationObject - )} ` - ); // eslint-disable-line no-console + const translationObject = { locale: defaultLocale, value: doc[f] }; + console.log(`-> Adding field ${f}_intl: ${JSON.stringify(translationObject)} `); // eslint-disable-line no-console modifier.$push[`${f}_intl`] = translationObject; } }); @@ -133,11 +116,7 @@ const migrateIntlFields = async defaultLocale => { if (!_.isEmpty(modifier.$push)) { // update document // eslint-disable-next-line no-await-in-loop - const n = await Connectors.update( - collection, - {_id: doc._id}, - modifier - ); + const n = await Connectors.update(collection, { _id: doc._id }, modifier); console.log(`-> migrated ${n} documents \n`); // eslint-disable-line no-console } console.log('\n'); // eslint-disable-line no-console @@ -173,9 +152,7 @@ export const getHeaderLocale = (headers, userLocale) => { // get locale from accepted-language header if (headers['accept-language']) { - const acceptedLanguages = headers['accept-language'] - .split(',') - .map(l => l.split(';')[0]); + const acceptedLanguages = headers['accept-language'].split(',').map(l => l.split(';')[0]); acceptedLocale = acceptedLanguages[0]; // for now only use the highest-priority accepted language } diff --git a/packages/vulcan-lib/lib/server/query.js b/packages/vulcan-lib/lib/server/query.js index f62fbbfab..15f60eb0e 100644 --- a/packages/vulcan-lib/lib/server/query.js +++ b/packages/vulcan-lib/lib/server/query.js @@ -3,8 +3,8 @@ Run a GraphQL request from the server with the proper context */ -import {graphql} from 'graphql'; -import {Collections} from '../modules/collections.js'; +import { graphql } from 'graphql'; +import { Collections } from '../modules/collections.js'; import DataLoader from 'dataloader'; import findByIds from '../modules/findbyids.js'; import { @@ -12,16 +12,16 @@ import { extractFragmentName, getFragmentText, } from '../modules/fragments.js'; -import {getSetting} from '../modules/settings'; +import { getSetting } from '../modules/settings'; import merge from 'lodash/merge'; -import {singleClientTemplate} from '../modules/graphql_templates'; -import {Utils} from './utils'; -import {GraphQLSchema} from '../modules/graphql'; +import { singleClientTemplate } from '../modules/graphql_templates'; +import { Utils } from './utils'; +import { GraphQLSchema } from '../modules/graphql'; // note: if no context is passed, default to running requests with full admin privileges export const runGraphQL = async (query, variables = {}, context) => { const defaultContext = { - currentUser: {isAdmin: true}, + currentUser: { isAdmin: true }, locale: getSetting('locale'), }; const queryContext = merge(defaultContext, context); @@ -30,21 +30,14 @@ export const runGraphQL = async (query, variables = {}, context) => { // within the scope of this specific request, // decorate each collection with a new Dataloader object and add it to context Collections.forEach(collection => { - collection.loader = new DataLoader( - ids => findByIds(collection, ids, queryContext), - {cache: true} - ); + collection.loader = new DataLoader(ids => findByIds(collection, ids, queryContext), { + cache: true, + }); queryContext[collection.options.collectionName] = collection; }); // see http://graphql.org/graphql-js/graphql/#graphql - const result = await graphql( - executableSchema, - query, - {}, - queryContext, - variables - ); + const result = await graphql(executableSchema, query, {}, queryContext, variables); if (result.errors) { // eslint-disable-next-line no-console @@ -65,7 +58,7 @@ Given a collection and a fragment, build a query to fetch one document. If no fragment is passed, default to default fragment */ -export const buildQuery = (collection, {fragmentName, fragmentText}) => { +export const buildQuery = (collection, { fragmentName, fragmentText }) => { const collectionName = collection.options.collectionName; const typeName = collection.options.typeName; @@ -100,16 +93,9 @@ Meteor.startup(() => { Collections.forEach(collection => { const typeName = collection.options.typeName; - collection.queryOne = async ( - documentId, - {fragmentName, fragmentText, context} - ) => { - const query = buildQuery(collection, {fragmentName, fragmentText}); - const result = await runQuery( - query, - {input: {selector: {documentId}}}, - context - ); + collection.queryOne = async (documentId, { fragmentName, fragmentText, context }) => { + const query = buildQuery(collection, { fragmentName, fragmentText }); + const result = await runQuery(query, { input: { selector: { documentId } } }, context); return result.data[Utils.camelCaseify(typeName)].result; }; }); diff --git a/packages/vulcan-lib/package.js b/packages/vulcan-lib/package.js index 6a6e327bc..4b61733f4 100644 --- a/packages/vulcan-lib/package.js +++ b/packages/vulcan-lib/package.js @@ -9,7 +9,7 @@ Package.onUse(function(api) { api.versionsFrom('1.6.1'); // note: if used, accounts-base should be loaded before vulcan:lib - api.use('accounts-base', {weak: true}); + api.use('accounts-base', { weak: true }); var packages = [ 'buffer@0.0.0', // see https://github.com/meteor/meteor/issues/8645 diff --git a/packages/vulcan-lib/test/server/apollo-server.test.js b/packages/vulcan-lib/test/server/apollo-server.test.js index a50be4eea..74f286d62 100644 --- a/packages/vulcan-lib/test/server/apollo-server.test.js +++ b/packages/vulcan-lib/test/server/apollo-server.test.js @@ -6,9 +6,9 @@ import { initContext, computeContextFromReq, } from '../../lib/server/apollo-server'; -import {GraphQLSchema} from '../../lib/modules/graphql'; +import { GraphQLSchema } from '../../lib/modules/graphql'; import expect from 'expect'; -import {executableSchema} from './fixtures/minimalSchema'; +import { executableSchema } from './fixtures/minimalSchema'; const test = it; // TODO: just before we switch to jest // @see https://www.apollographql.com/docs/apollo-server/features/testing.html diff --git a/packages/vulcan-lib/test/server/fixtures/minimalSchema.js b/packages/vulcan-lib/test/server/fixtures/minimalSchema.js index a34b9fdf7..4932e065d 100644 --- a/packages/vulcan-lib/test/server/fixtures/minimalSchema.js +++ b/packages/vulcan-lib/test/server/fixtures/minimalSchema.js @@ -1,7 +1,7 @@ // blatantly stolen from https://www.apollographql.com/docs/graphql-tools/generate-schema.html import find from 'lodash/find'; import filter from 'lodash/filter'; -import {makeExecutableSchema} from 'graphql-tools'; +import { makeExecutableSchema } from 'graphql-tools'; const typeDefs = ` type Author { @@ -34,27 +34,27 @@ const typeDefs = ` // example data const authors = [ - {id: 1, firstName: 'Tom', lastName: 'Coleman'}, - {id: 2, firstName: 'Sashko', lastName: 'Stubailo'}, - {id: 3, firstName: 'Mikhail', lastName: 'Novikov'}, + { id: 1, firstName: 'Tom', lastName: 'Coleman' }, + { id: 2, firstName: 'Sashko', lastName: 'Stubailo' }, + { id: 3, firstName: 'Mikhail', lastName: 'Novikov' }, ]; const posts = [ - {id: 1, authorId: 1, title: 'Introduction to GraphQL', votes: 2}, - {id: 2, authorId: 2, title: 'Welcome to Meteor', votes: 3}, - {id: 3, authorId: 2, title: 'Advanced GraphQL', votes: 1}, - {id: 4, authorId: 3, title: 'Launchpad is Cool', votes: 7}, + { id: 1, authorId: 1, title: 'Introduction to GraphQL', votes: 2 }, + { id: 2, authorId: 2, title: 'Welcome to Meteor', votes: 3 }, + { id: 3, authorId: 2, title: 'Advanced GraphQL', votes: 1 }, + { id: 4, authorId: 3, title: 'Launchpad is Cool', votes: 7 }, ]; const resolvers = { Query: { posts: () => posts, - author: (_, {id}) => find(authors, {id}), + author: (_, { id }) => find(authors, { id }), }, Mutation: { - upvotePost: (_, {postId}) => { - const post = find(posts, {id: postId}); + upvotePost: (_, { postId }) => { + const post = find(posts, { id: postId }); if (!post) { throw new Error(`Couldn't find post with id ${postId}`); } @@ -64,11 +64,11 @@ const resolvers = { }, Author: { - posts: author => filter(posts, {authorId: author.id}), + posts: author => filter(posts, { authorId: author.id }), }, Post: { - author: post => find(authors, {id: post.authorId}), + author: post => find(authors, { id: post.authorId }), }, }; diff --git a/packages/vulcan-lib/test/server/graphql.test.js b/packages/vulcan-lib/test/server/graphql.test.js index 3d7bfec58..bf954a3b0 100644 --- a/packages/vulcan-lib/test/server/graphql.test.js +++ b/packages/vulcan-lib/test/server/graphql.test.js @@ -1,6 +1,6 @@ import expect from 'expect'; -import {GraphQLSchema} from '../../lib/modules/graphql'; +import { GraphQLSchema } from '../../lib/modules/graphql'; import initGraphQL from '../../lib/server/apollo-server/initGraphQL'; describe('vulcan:lib/graphql', function() { diff --git a/packages/vulcan-payments/lib/server/integrations/stripe.js b/packages/vulcan-payments/lib/server/integrations/stripe.js index ab8e2cb05..c9e42cec8 100644 --- a/packages/vulcan-payments/lib/server/integrations/stripe.js +++ b/packages/vulcan-payments/lib/server/integrations/stripe.js @@ -55,26 +55,16 @@ import express from 'express'; import Stripe from 'stripe'; import Charges from '../../modules/charges/collection.js'; import Users from 'meteor/vulcan:users'; -import {Products} from '../../modules/products.js'; -import {Promise} from 'meteor/promise'; +import { Products } from '../../modules/products.js'; +import { Promise } from 'meteor/promise'; registerSetting('stripe', null, 'Stripe settings'); registerSetting('stripe.publishableKey', null, 'Publishable key', true); -registerSetting( - 'stripe.publishableKeyTest', - null, - 'Publishable key (test)', - true -); +registerSetting('stripe.publishableKeyTest', null, 'Publishable key (test)', true); registerSetting('stripe.secretKey', null, 'Secret key'); registerSetting('stripe.secretKeyTest', null, 'Secret key (test)'); registerSetting('stripe.endpointSecret', null, 'Endpoint secret for webhook'); -registerSetting( - 'stripe.alwaysUseTest', - false, - 'Always use test keys in all environments', - true -); +registerSetting('stripe.alwaysUseTest', false, 'Always use test keys in all environments', true); const stripeSettings = getSetting('stripe'); @@ -102,13 +92,7 @@ export const receiveAction = async args => { document, returnDocument = {}; - const { - userId, - productKey, - associatedCollection, - associatedId, - properties, - } = args; + const { userId, productKey, associatedCollection, associatedId, properties } = args; if (!stripeSettings) { throw new Error('Please fill in your Stripe settings'); @@ -117,7 +101,7 @@ export const receiveAction = async args => { // if an associated collection name and document id have been provided, // get the associated collection and document if (associatedCollection && associatedId) { - collection = _.findWhere(Collections, {_name: associatedCollection}); + collection = _.findWhere(Collections, { _name: associatedCollection }); document = await Connectors.get(collection, associatedId); } @@ -193,7 +177,7 @@ Retrieve or create a Stripe customer */ export const getCustomer = async (user, token) => { - const {id} = token; + const { id } = token; let customer; @@ -203,7 +187,7 @@ export const getCustomer = async (user, token) => { } catch (error) { // if user doesn't have a stripeCustomerId; or if id doesn't match up with Stripe // create new customer object - const customerOptions = {email: user.email}; + const customerOptions = { email: user.email }; if (id) { customerOptions.source = id; } @@ -213,7 +197,7 @@ export const getCustomer = async (user, token) => { await updateMutator({ collection: Users, documentId: user._id, - data: {stripeCustomerId: customer.id}, + data: { stripeCustomerId: customer.id }, validate: false, }); } @@ -226,18 +210,8 @@ export const getCustomer = async (user, token) => { Create one-time charge. */ -export const createCharge = async ({ - user, - product, - collection, - document, - metadata, - args, -}) => { - const { - token, - /* userId, productKey, associatedId, properties, */ coupon, - } = args; +export const createCharge = async ({ user, product, collection, document, metadata, args }) => { + const { token, /* userId, productKey, associatedId, properties, */ coupon } = args; const customer = await getCustomer(user, token); @@ -314,7 +288,7 @@ export const createSubscription = async ({ // eslint-disable-next-line no-unused-vars const subscription = await stripe.subscriptions.create({ customer: customer.id, - items: [{plan: product.plan}], + items: [{ plan: product.plan }], metadata, ...product.subscriptionProperties, }); @@ -410,9 +384,7 @@ const createOrRetrievePlan = async planObject => { if (error.statusCode === 404) { // eslint-disable-next-line no-console console.log( - `Creating subscription plan ${ - planObject.plan - } for ${(planObject.amount && + `Creating subscription plan ${planObject.plan} for ${(planObject.amount && (planObject.amount / 100).toLocaleString('en-US', { style: 'currency', currency: planObject.currency, @@ -435,17 +407,9 @@ export const createOrRetrieveSubscriptionPlan = async maybePlanObject => Process charges, subscriptions, etc. on Vulcan's side */ -export const processAction = async ({ - collection, - document, - stripeObject, - args, - user, -}) => { +export const processAction = async ({ collection, document, stripeObject, args, user }) => { debug(''); - debugGroup( - '--------------- start\x1b[35m processAction \x1b[0m ---------------' - ); + debugGroup('--------------- start\x1b[35m processAction \x1b[0m ---------------'); debug(`Collection: ${collection.options.collectionName}`); debug(`documentId: ${document._id}`); debug(`Charge: ${stripeObject}`); @@ -462,9 +426,7 @@ export const processAction = async ({ if (existingCharge) { // eslint-disable-next-line no-console console.log( - `// Charge with Stripe id ${ - stripeObject.id - } already exists in db; aborting processAction` + `// Charge with Stripe id ${stripeObject.id} already exists in db; aborting processAction` ); return collection && document ? document : {}; } @@ -514,13 +476,13 @@ export const processAction = async ({ ? [...document.chargeIds, chargeSaved._id] : [chargeSaved._id]; - let data = {chargeIds}; + let data = { chargeIds }; // run collection.charge.sync callbacks data = await runCallbacks({ name: 'stripe.process.sync', iterator: data, - properties: {collection, document, chargeDoc, user}, + properties: { collection, document, chargeDoc, user }, }); const updateResult = await updateMutator({ @@ -583,11 +545,7 @@ app.post('/stripe', addRawBody, async function(req, res) { const sig = req.headers['stripe-signature']; try { - const event = stripe.webhooks.constructEvent( - req.rawBody, - sig, - stripeSettings.endpointSecret - ); + const event = stripe.webhooks.constructEvent(req.rawBody, sig, stripeSettings.endpointSecret); // eslint-disable-next-line no-console console.log('event ///////////////////'); @@ -615,20 +573,13 @@ app.post('/stripe', addRawBody, async function(req, res) { console.log(invoice); // look up corresponding subscription - const subscription = await stripe.subscriptions.retrieve( - invoice.subscription - ); + const subscription = await stripe.subscriptions.retrieve(invoice.subscription); // eslint-disable-next-line no-console console.log('////// subscription'); // eslint-disable-next-line no-console console.log(subscription); - const { - userId, - productKey, - associatedCollection, - associatedId, - } = subscription.metadata; + const { userId, productKey, associatedCollection, associatedId } = subscription.metadata; if (associatedCollection && associatedId) { const collection = _.findWhere(Collections, { @@ -653,7 +604,7 @@ app.post('/stripe', addRawBody, async function(req, res) { livemode: subscription.livemode, }; - processAction({collection, document, stripeObject: charge, args}); + processAction({ collection, document, stripeObject: charge, args }); } } catch (error) { // eslint-disable-next-line no-console @@ -762,14 +713,14 @@ webAppConnectHandlersUse(Meteor.bindEnvironment(app), { Meteor.startup(() => { registerCallback({ name: 'stripe.receive.sync', - description: "Modify any metadata before calling Stripe's API", + description: 'Modify any metadata before calling Stripe\'s API', arguments: [ - {metadata: 'Metadata about the action'}, - {user: 'The user'}, - {product: 'Product created with addProduct'}, - {collection: 'Associated collection of the charge'}, - {document: 'Associated document in collection to the charge'}, - {args: 'Original mutation arguments'}, + { metadata: 'Metadata about the action' }, + { user: 'The user' }, + { product: 'Product created with addProduct' }, + { collection: 'Associated collection of the charge' }, + { document: 'Associated document in collection to the charge' }, + { args: 'Original mutation arguments' }, ], runs: 'sync', newSyntax: true, @@ -778,14 +729,14 @@ Meteor.startup(() => { registerCallback({ name: 'stripe.receive.async', - description: "Run after calling Stripe's API", + description: 'Run after calling Stripe\'s API', arguments: [ - {metadata: 'Metadata about the charge'}, - {user: 'The user'}, - {product: 'Product created with addProduct'}, - {collection: 'Associated collection of the charge'}, - {document: 'Associated document in collection to the charge'}, - {args: 'Original mutation arguments'}, + { metadata: 'Metadata about the charge' }, + { user: 'The user' }, + { product: 'Product created with addProduct' }, + { collection: 'Associated collection of the charge' }, + { document: 'Associated document in collection to the charge' }, + { args: 'Original mutation arguments' }, ], runs: 'sync', newSyntax: true, @@ -793,14 +744,13 @@ Meteor.startup(() => { registerCallback({ name: 'stripe.charge.async', - description: - 'Perform operations immediately after the stripe subscription has completed', + description: 'Perform operations immediately after the stripe subscription has completed', arguments: [ - {charge: 'The charge'}, - {collection: 'Associated collection of the subscription'}, - {document: 'Associated document in collection to the charge'}, - {args: 'Original mutation arguments'}, - {user: 'The user'}, + { charge: 'The charge' }, + { collection: 'Associated collection of the subscription' }, + { document: 'Associated document in collection to the charge' }, + { args: 'Original mutation arguments' }, + { user: 'The user' }, ], runs: 'async', newSyntax: true, @@ -808,14 +758,13 @@ Meteor.startup(() => { registerCallback({ name: 'stripe.subscribe.async', - description: - 'Perform operations immediately after the stripe subscription has completed', + description: 'Perform operations immediately after the stripe subscription has completed', arguments: [ - {subscription: 'The subscription'}, - {collection: 'Associated collection of the subscription'}, - {document: 'Associated document in collection to the charge'}, - {args: 'Original mutation arguments'}, - {user: 'The user'}, + { subscription: 'The subscription' }, + { collection: 'Associated collection of the subscription' }, + { document: 'Associated document in collection to the charge' }, + { args: 'Original mutation arguments' }, + { user: 'The user' }, ], runs: 'async', newSyntax: true, @@ -826,13 +775,12 @@ Meteor.startup(() => { description: 'Modify any metadata before sending the charge to stripe', arguments: [ { - modifier: - 'The modifier object used to update the associated collection', + modifier: 'The modifier object used to update the associated collection', }, - {collection: 'Collection associated to the product'}, - {document: 'Associated document'}, - {chargeDoc: "Charge document returned by Stripe's API"}, - {user: 'The user'}, + { collection: 'Collection associated to the product' }, + { document: 'Associated document' }, + { chargeDoc: 'Charge document returned by Stripe\'s API' }, + { user: 'The user' }, ], runs: 'sync', returns: 'The modified arguments to be sent to stripe', @@ -842,10 +790,10 @@ Meteor.startup(() => { name: 'stripe.process.async', description: 'Modify any metadata before sending the charge to stripe', arguments: [ - {collection: 'Collection associated to the product'}, - {document: 'Associated document'}, - {chargeDoc: "Charge document returned by Stripe's API"}, - {user: 'The user'}, + { collection: 'Collection associated to the product' }, + { document: 'Associated document' }, + { chargeDoc: 'Charge document returned by Stripe\'s API' }, + { user: 'The user' }, ], runs: 'async', returns: 'The modified arguments to be sent to stripe', @@ -858,11 +806,7 @@ Meteor.startup(() => { Promise.awaitAll( Object.keys(Products) // Filter out function type products and those without a plan defined (non-subscription) - .filter( - productKey => - typeof Products[productKey] === 'object' && - Products[productKey].plan - ) + .filter(productKey => typeof Products[productKey] === 'object' && Products[productKey].plan) .map(productKey => createOrRetrievePlan(Products[productKey])) ); // eslint-disable-next-line no-console diff --git a/packages/vulcan-redux/lib/client/setupRedux.js b/packages/vulcan-redux/lib/client/setupRedux.js index a4e6f230f..dfac96a16 100644 --- a/packages/vulcan-redux/lib/client/setupRedux.js +++ b/packages/vulcan-redux/lib/client/setupRedux.js @@ -1,7 +1,7 @@ import React from 'react'; -import {Provider} from 'react-redux'; -import {addCallback} from 'meteor/vulcan:core'; -import {initStore} from '../modules/redux'; +import { Provider } from 'react-redux'; +import { addCallback } from 'meteor/vulcan:core'; +import { initStore } from '../modules/redux'; const setupRedux = () => { const store = initStore(); diff --git a/packages/vulcan-redux/lib/modules/redux.js b/packages/vulcan-redux/lib/modules/redux.js index d4f71cc7d..d8ba23920 100644 --- a/packages/vulcan-redux/lib/modules/redux.js +++ b/packages/vulcan-redux/lib/modules/redux.js @@ -1,4 +1,4 @@ -import {createStore, applyMiddleware, compose, combineReducers} from 'redux'; +import { createStore, applyMiddleware, compose, combineReducers } from 'redux'; import _isEmpty from 'lodash/isEmpty'; // TODO: now we should add some callback call to add the store to // Apollo SSR + client side too @@ -48,9 +48,7 @@ export const configureStore = ( } if (options.reducers) { reducers = - typeof options.reducers === 'object' - ? combineReducers(options.reducers) - : options.reducers; + typeof options.reducers === 'object' ? combineReducers(options.reducers) : options.reducers; } this.replaceReducer(reducers); return store; @@ -63,7 +61,7 @@ export const configureStore = ( // **Notes: server side, addAction to server share with every req** let actions = {}; export const addAction = addedAction => { - actions = {...actions, ...addedAction}; + actions = { ...actions, ...addedAction }; return actions; }; export const getActions = () => actions; @@ -73,7 +71,7 @@ export const getActions = () => actions; let reducers = {}; export const addReducer = addedReducer => { - reducers = {...reducers, ...addedReducer}; + reducers = { ...reducers, ...addedReducer }; return reducers; }; export const getReducers = () => reducers; diff --git a/packages/vulcan-redux/lib/server/setupRedux.js b/packages/vulcan-redux/lib/server/setupRedux.js index d2e70ef99..3fd779d0f 100644 --- a/packages/vulcan-redux/lib/server/setupRedux.js +++ b/packages/vulcan-redux/lib/server/setupRedux.js @@ -1,7 +1,7 @@ import React from 'react'; -import {Provider} from 'react-redux'; -import {addCallback} from 'meteor/vulcan:core'; -import {initStore} from '../modules/redux'; +import { Provider } from 'react-redux'; +import { addCallback } from 'meteor/vulcan:core'; +import { initStore } from '../modules/redux'; const setupRedux = () => { const store = initStore(); diff --git a/packages/vulcan-styled-components/lib/server/setupStyledComponents.js b/packages/vulcan-styled-components/lib/server/setupStyledComponents.js index 3f26398d0..5eef6265c 100644 --- a/packages/vulcan-styled-components/lib/server/setupStyledComponents.js +++ b/packages/vulcan-styled-components/lib/server/setupStyledComponents.js @@ -1,9 +1,9 @@ // Setup SSR -import {ServerStyleSheet} from 'styled-components'; -import {addCallback} from 'meteor/vulcan:core'; +import { ServerStyleSheet } from 'styled-components'; +import { addCallback } from 'meteor/vulcan:core'; const setupStyledComponents = () => { - addCallback('router.server.wrapper', function collectStyles(app, {context}) { + addCallback('router.server.wrapper', function collectStyles(app, { context }) { const stylesheet = new ServerStyleSheet(); // @see https://www.styled-components.com/docs/advanced/#example const wrappedApp = stylesheet.collectStyles(app); @@ -12,10 +12,7 @@ const setupStyledComponents = () => { return wrappedApp; }); - addCallback('router.server.postRender', function appendStyleTags( - sink, - {context} - ) { + addCallback('router.server.postRender', function appendStyleTags(sink, { context }) { sink.appendToHead(context.stylesheet.getStyleTags()); return sink; }); diff --git a/packages/vulcan-test/lib/modules/initComponentTest.js b/packages/vulcan-test/lib/modules/initComponentTest.js index a9016c589..25cd50f03 100644 --- a/packages/vulcan-test/lib/modules/initComponentTest.js +++ b/packages/vulcan-test/lib/modules/initComponentTest.js @@ -9,9 +9,9 @@ import Adapter from 'enzyme-adapter-react-16.3'; const initComponentTest = () => { // setup enzyme - Enzyme.configure({adapter: new Adapter()}); + Enzyme.configure({ adapter: new Adapter() }); // and then load them in the app so that is defined - import {populateComponentsApp, initializeFragments} from 'meteor/vulcan:lib'; + import { populateComponentsApp, initializeFragments } from 'meteor/vulcan:lib'; // we need registered fragments to be initialized because populateComponentsApp will run // hocs, like withUpdate, that rely on fragments initializeFragments(); diff --git a/packages/vulcan-users/lib/modules/helpers.js b/packages/vulcan-users/lib/modules/helpers.js index eb7e4454d..f5b8cad60 100644 --- a/packages/vulcan-users/lib/modules/helpers.js +++ b/packages/vulcan-users/lib/modules/helpers.js @@ -1,4 +1,4 @@ -import {Utils} from 'meteor/vulcan:lib'; +import { Utils } from 'meteor/vulcan:lib'; import Users from './collection.js'; import moment from 'moment'; import _ from 'underscore'; @@ -32,12 +32,7 @@ Users.getUser = function(userOrUserId) { Users.getUserName = function(user) { try { if (user.username) return user.username; - if ( - user && - user.services && - user.services.twitter && - user.services.twitter.screenName - ) + if (user && user.services && user.services.twitter && user.services.twitter.screenName) return user.services.twitter.screenName; } catch (error) { console.log(error); // eslint-disable-line @@ -189,7 +184,7 @@ Users.hasCompletedProfile = function(user) { /////////////////// Users.findLast = function(user, collection) { - return collection.findOne({userId: user._id}, {sort: {createdAt: -1}}); + return collection.findOne({ userId: user._id }, { sort: { createdAt: -1 } }); }; Users.timeSinceLast = function(user, collection) { @@ -263,5 +258,5 @@ Users.getRequiredFields = function() { // }; Users.findByEmail = function(email) { - return Users.findOne({email: email}); + return Users.findOne({ email: email }); }; diff --git a/packages/vulcan-users/lib/modules/resolvers.js b/packages/vulcan-users/lib/modules/resolvers.js index 484fa8527..876dfc8d9 100644 --- a/packages/vulcan-users/lib/modules/resolvers.js +++ b/packages/vulcan-users/lib/modules/resolvers.js @@ -1,4 +1,4 @@ -import {addGraphQLResolvers, Connectors} from 'meteor/vulcan:lib'; +import { addGraphQLResolvers, Connectors } from 'meteor/vulcan:lib'; const specificResolvers = { Query: { @@ -26,30 +26,26 @@ const defaultOptions = { const resolvers = { multi: { - async resolver(root, {input = {}}, {currentUser, Users}, {cacheControl}) { - const {terms = {}, enableCache = false, enableTotal = true} = input; + async resolver(root, { input = {} }, { currentUser, Users }, { cacheControl }) { + const { terms = {}, enableCache = false, enableTotal = true } = input; if (cacheControl && enableCache) { const maxAge = defaultOptions.cacheMaxAge; - cacheControl.setCacheHint({maxAge}); + cacheControl.setCacheHint({ maxAge }); } // get selector and options from terms and perform Mongo query - let {selector, options} = await Users.getParameters(terms); + let { selector, options } = await Users.getParameters(terms); options.skip = terms.offset; const users = await Connectors.find(Users, selector, options); // restrict documents fields - const restrictedUsers = Users.restrictViewableFields( - currentUser, - Users, - users - ); + const restrictedUsers = Users.restrictViewableFields(currentUser, Users, users); // prime the cache restrictedUsers.forEach(user => Users.loader.prime(user._id, user)); - const data = {results: restrictedUsers}; + const data = { results: restrictedUsers }; if (enableTotal) { // get total count of documents matching the selector @@ -61,22 +57,22 @@ const resolvers = { }, single: { - async resolver(root, {input = {}}, {currentUser, Users}, {cacheControl}) { - const {selector = {}, enableCache = false} = input; - const {documentId, slug} = selector; + async resolver(root, { input = {} }, { currentUser, Users }, { cacheControl }) { + const { selector = {}, enableCache = false } = input; + const { documentId, slug } = selector; if (cacheControl && enableCache) { const maxAge = defaultOptions.cacheMaxAge; - cacheControl.setCacheHint({maxAge}); + cacheControl.setCacheHint({ maxAge }); } // don't use Dataloader if user is selected by slug const user = documentId ? await Users.loader.load(documentId) : slug - ? await Connectors.get(Users, {slug}) + ? await Connectors.get(Users, { slug }) : await Connectors.get(Users); - return {result: Users.restrictViewableFields(currentUser, Users, user)}; + return { result: Users.restrictViewableFields(currentUser, Users, user) }; }, }, };