From 9e90679a8e3f31a779a63abb99088cb38794dfaa Mon Sep 17 00:00:00 2001 From: Luca Hagel Date: Tue, 10 Oct 2017 06:45:17 +0200 Subject: [PATCH 01/69] bump react-bootstrap -> 0.31.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8781f530e..e44376c86 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "react": "^15.6.1", "react-addons-pure-render-mixin": "^15.4.1", "react-apollo": "^1.1.1", - "react-bootstrap": "^0.30.7", + "react-bootstrap": "^0.31.3", "react-bootstrap-datetimepicker": "0.0.22", "react-cookie": "^0.4.6", "react-datetime": "^2.3.2", From 48ad632bf337f0b82a3d9e3c3b2a5086396f044e Mon Sep 17 00:00:00 2001 From: Al Pagan Date: Fri, 13 Oct 2017 14:20:20 +0100 Subject: [PATCH 02/69] Add callbacks to vulcan:routing SSR hooks This method allows for access to the SSR app component and associated css in the routing's hook functions without needing to hack core files. This makes it possible, for example, to add MUI wrapper components and inject compiled css with the JSS library (see https://material-ui-1dab0.firebaseapp.com/guides/server-rendering). Here's how I'd implement the callbacks in my own custom module: https://gist.github.com/wayfarerboy/96c0f1d13b3b7d3d2743501a1c7c0187 --- packages/vulcan-routing/lib/server/routing.jsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/vulcan-routing/lib/server/routing.jsx b/packages/vulcan-routing/lib/server/routing.jsx index ef24021de..9b39929aa 100644 --- a/packages/vulcan-routing/lib/server/routing.jsx +++ b/packages/vulcan-routing/lib/server/routing.jsx @@ -1,7 +1,6 @@ import React from 'react'; import Helmet from 'react-helmet'; import { getDataFromTree, ApolloProvider } from 'react-apollo'; -// import styleSheet from 'styled-components/lib/models/StyleSheet'; import { Meteor } from 'meteor/meteor'; @@ -10,7 +9,7 @@ import { addRoute, Routes, populateComponentsApp, populateRoutesApp, initializeFragments, getRenderContext, - dynamicLoader, + runCallbacks, } from 'meteor/vulcan:lib'; import { RouterServer } from './router.jsx'; @@ -42,30 +41,30 @@ Meteor.startup(() => { const options = { historyHook(req, res, newHistory) { - const { history } = getRenderContext(); + let { history } = getRenderContext(); + history = runCallbacks('router.server.history', history, { req, res, newHistory }); return history; }, wrapperHook(req, res, appGenerator) { const { apolloClient, store } = getRenderContext(); store.reload(); store.dispatch({ type: '@@nova/INIT' }) // the first dispatch will generate a newDispatch function from middleware - const app = appGenerator(); + const app = runCallbacks('router.server.wrapper', appGenerator(), { req, res, store, apolloClient }); return {app}; }, preRender(req, res, app) { + runCallbacks('router.server.preRender', { req, res, app }); return Promise.await(getDataFromTree(app)); }, dehydrateHook(req, res) { - const context = getRenderContext(); + const context = runCallbacks('router.server.dehydrate', getRenderContext(), { req, res }); return context.apolloClient.store.getState(); }, postRender(req, res) { - // req.css = styleSheet.sheet ? styleSheet.rules().map(rule => rule.cssText).join('\n') : ''; - // const context = renderContext.get(); - // context.css = req.css; + runCallbacks('router.server.postRender', { req, res }); }, htmlHook(req, res, dynamicHead, dynamicBody) { - const head = Helmet.rewind(); + const head = runCallbacks('router.server.html', Helmet.rewind(), { req, res, dynamicHead, dynamicBody }); return { dynamicHead: `${head.title}${head.meta}${head.link}${head.script}${dynamicHead}`, dynamicBody, From 1c0635db658053d9ae87f708f489905b865dbb28 Mon Sep 17 00:00:00 2001 From: Al Pagan Date: Fri, 13 Oct 2017 14:25:35 +0100 Subject: [PATCH 03/69] Add callbacks to vulcan:routing SSR hooks This method allows for access to the SSR app component and associated css in the routing's hook functions without needing to hack core files. This makes it possible, for example, to add MUI wrapper components and inject compiled css with the JSS library (see https://material-ui-1dab0.firebaseapp.com/guides/server-rendering). Here's how I'd implement the callbacks in my own custom module: https://gist.github.com/wayfarerboy/96c0f1d13b3b7d3d2743501a1c7c0187 --- packages/vulcan-routing/lib/client/routing.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/vulcan-routing/lib/client/routing.jsx b/packages/vulcan-routing/lib/client/routing.jsx index 5d5639d1f..98d8166c2 100644 --- a/packages/vulcan-routing/lib/client/routing.jsx +++ b/packages/vulcan-routing/lib/client/routing.jsx @@ -8,10 +8,8 @@ import { Meteor } from 'meteor/meteor'; import { Components, addRoute, - addReducer, addMiddleware, Routes, populateComponentsApp, populateRoutesApp, runCallbacks, initializeFragments, getRenderContext, - dynamicLoader, } from 'meteor/vulcan:lib'; import { RouterClient } from './router.jsx'; @@ -53,14 +51,16 @@ Meteor.startup(() => { context.addReducer({ apollo: apolloClientReducer }); context.store.reload(); context.store.dispatch({ type: '@@nova/INIT' }) // the first dispatch will generate a newDispatch function from middleware + runCallbacks('router.client.rehydrate', { initialState, store: context.store}); }, historyHook(newHistory) { - const { history } = getRenderContext(); + let { history } = getRenderContext(); + history = runCallbacks('router.client.history', history, { newHistory }); return history; }, wrapperHook(appGenerator) { const { apolloClient, store } = getRenderContext(); - const app = appGenerator({ + const app = runCallbacks('router.client.wrapper', appGenerator({ onUpdate: () => { // the first argument is an item to iterate on, needed by vulcan:lib/callbacks // note: this item is not used in this specific callback: router.onUpdate @@ -70,7 +70,7 @@ Meteor.startup(() => { // if the action is REPLACE, return false so that we don't jump back to top of page return !(nextRouterProps.location.action === 'REPLACE'); })) - }); + })); return {app}; }, }; From 2144ce8a87dae9fce42d1d007d15fb65286181b9 Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Sat, 14 Oct 2017 11:04:26 +0900 Subject: [PATCH 04/69] Add share URLs to post schema --- .../example-forum/lib/modules/posts/schema.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/example-forum/lib/modules/posts/schema.js b/packages/example-forum/lib/modules/posts/schema.js index 0d31ed1ec..d106bcdef 100644 --- a/packages/example-forum/lib/modules/posts/schema.js +++ b/packages/example-forum/lib/modules/posts/schema.js @@ -403,6 +403,39 @@ const schema = { } }, + emailShareUrl: { + type: String, + optional: true, + resolveAs: { + type: 'String', + resolver: (post) => { + return Posts.getEmailShareUrl(post); + } + } + }, + + twitterShareUrl: { + type: String, + optional: true, + resolveAs: { + type: 'String', + resolver: (post) => { + return Posts.getTwitterShareUrl(post); + } + } + }, + + facebookShareUrl: { + type: String, + optional: true, + resolveAs: { + type: 'String', + resolver: (post) => { + return Posts.getFacebookShareUrl(post); + } + } + }, + }; export default schema; From 0af5e365d30fa225bf3fbc270e016b63a13249ba Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Sat, 14 Oct 2017 11:05:36 +0900 Subject: [PATCH 05/69] Add new HeadComponent to make it easier to add permanent head tags --- packages/vulcan-core/lib/modules/components/App.jsx | 1 + .../vulcan-core/lib/modules/components/HeadComponent.jsx | 8 ++++++++ packages/vulcan-core/lib/modules/index.js | 1 + 3 files changed, 10 insertions(+) create mode 100644 packages/vulcan-core/lib/modules/components/HeadComponent.jsx diff --git a/packages/vulcan-core/lib/modules/components/App.jsx b/packages/vulcan-core/lib/modules/components/App.jsx index 803b89d35..f12132518 100644 --- a/packages/vulcan-core/lib/modules/components/App.jsx +++ b/packages/vulcan-core/lib/modules/components/App.jsx @@ -29,6 +29,7 @@ class App extends PureComponent {
+ { this.props.currentUserLoading ? : (this.props.children ? this.props.children : ) } diff --git a/packages/vulcan-core/lib/modules/components/HeadComponent.jsx b/packages/vulcan-core/lib/modules/components/HeadComponent.jsx new file mode 100644 index 000000000..39c3057c3 --- /dev/null +++ b/packages/vulcan-core/lib/modules/components/HeadComponent.jsx @@ -0,0 +1,8 @@ +import { registerComponent } from 'meteor/vulcan:lib'; +import React from 'react'; + +const HeadComponent = () => null; + +HeadComponent.displayName = 'HeadComponent'; + +registerComponent('HeadComponent', HeadComponent); diff --git a/packages/vulcan-core/lib/modules/index.js b/packages/vulcan-core/lib/modules/index.js index 9c4f9dac3..945423d2a 100644 --- a/packages/vulcan-core/lib/modules/index.js +++ b/packages/vulcan-core/lib/modules/index.js @@ -14,6 +14,7 @@ export { default as ShowIf } from "./components/ShowIf.jsx"; export { default as ModalTrigger } from './components/ModalTrigger.jsx'; export { default as Error404 } from './components/Error404.jsx'; export { default as DynamicLoading } from './components/DynamicLoading.jsx'; +export { default as HeadComponent } from './components/HeadComponent.jsx'; export { default as HeadTags } from './components/HeadTags.jsx'; export { default as Avatar } from './components/Avatar.jsx'; export { default as Card } from './components/Card.jsx'; From f5c2d21274fbbe8143b6aa893ee27641676ab67f Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Sat, 14 Oct 2017 11:06:25 +0900 Subject: [PATCH 06/69] Small fixes; Default newsletter to *not* be automatically sent out --- packages/vulcan-core/lib/modules/default_resolvers.js | 5 +++-- packages/vulcan-newsletter/lib/server/cron.js | 2 +- packages/vulcan-subscribe/package.js | 1 - packages/vulcan-users/lib/fragments.js | 1 + packages/vulcan-voting/package.js | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/vulcan-core/lib/modules/default_resolvers.js b/packages/vulcan-core/lib/modules/default_resolvers.js index 3e2232b9f..045ea24b7 100644 --- a/packages/vulcan-core/lib/modules/default_resolvers.js +++ b/packages/vulcan-core/lib/modules/default_resolvers.js @@ -74,11 +74,12 @@ export const getDefaultResolvers = collectionName => ({ Utils.performCheck(collection.checkAccess, currentUser, doc, collection, documentId); } + const restrictedDoc = Users.restrictViewableFields(currentUser, collection, doc); + debug(`//--------------- end ${collectionName} single resolver ---------------//`); - // filter out disallowed properties and return resulting document - return Users.restrictViewableFields(currentUser, collection, doc); + return restrictedDoc; }, }, diff --git a/packages/vulcan-newsletter/lib/server/cron.js b/packages/vulcan-newsletter/lib/server/cron.js index 14342c3b3..c6997c5c3 100644 --- a/packages/vulcan-newsletter/lib/server/cron.js +++ b/packages/vulcan-newsletter/lib/server/cron.js @@ -76,7 +76,7 @@ var addJob = function () { }; Meteor.startup(function () { - if (getSetting('newsletter.enabled', true)) { + if (getSetting('newsletter.enabled', false)) { addJob(); } }); diff --git a/packages/vulcan-subscribe/package.js b/packages/vulcan-subscribe/package.js index 55b84bbac..c99f4a8f2 100644 --- a/packages/vulcan-subscribe/package.js +++ b/packages/vulcan-subscribe/package.js @@ -12,7 +12,6 @@ Package.onUse(function (api) { api.use([ 'vulcan:core@1.8.0', - 'vulcan:notifications@1.8.0', // dependencies on posts, categories are done with nested imports to reduce explicit dependencies ]); diff --git a/packages/vulcan-users/lib/fragments.js b/packages/vulcan-users/lib/fragments.js index 9026da738..bd6922271 100644 --- a/packages/vulcan-users/lib/fragments.js +++ b/packages/vulcan-users/lib/fragments.js @@ -16,5 +16,6 @@ registerFragment(` groups services avatarUrl + pageUrl } `); diff --git a/packages/vulcan-voting/package.js b/packages/vulcan-voting/package.js index ade8efbc6..b1590ab5d 100644 --- a/packages/vulcan-voting/package.js +++ b/packages/vulcan-voting/package.js @@ -10,7 +10,7 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'fourseven:scss', + 'fourseven:scss@4.5.0', 'vulcan:core@1.8.0', 'vulcan:i18n@1.8.0', ], ['client', 'server']); From 8f05de2a2ec49d1993f65eb8f48acde163f1b188 Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Tue, 17 Oct 2017 08:58:58 +0900 Subject: [PATCH 07/69] Update Vulcan version in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8781f530e..5e5c4c948 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Vulcan", - "version": "1.2.0", + "version": "1.8.0", "engines": { "npm": "^3.0" }, From 5d444df3a57d776a31cbf3e51ac07f93184deb0d Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Tue, 17 Oct 2017 10:26:38 +0900 Subject: [PATCH 08/69] Enable adding components to HeadTags outside of Helmet --- packages/vulcan-core/lib/modules/components/App.jsx | 1 - .../lib/modules/components/HeadComponent.jsx | 8 -------- .../vulcan-core/lib/modules/components/HeadTags.jsx | 13 +++++++++++++ packages/vulcan-core/lib/modules/index.js | 1 - packages/vulcan-lib/lib/modules/headtags.js | 1 + 5 files changed, 14 insertions(+), 10 deletions(-) delete mode 100644 packages/vulcan-core/lib/modules/components/HeadComponent.jsx diff --git a/packages/vulcan-core/lib/modules/components/App.jsx b/packages/vulcan-core/lib/modules/components/App.jsx index f12132518..803b89d35 100644 --- a/packages/vulcan-core/lib/modules/components/App.jsx +++ b/packages/vulcan-core/lib/modules/components/App.jsx @@ -29,7 +29,6 @@ class App extends PureComponent {
- { this.props.currentUserLoading ? : (this.props.children ? this.props.children : ) } diff --git a/packages/vulcan-core/lib/modules/components/HeadComponent.jsx b/packages/vulcan-core/lib/modules/components/HeadComponent.jsx deleted file mode 100644 index 39c3057c3..000000000 --- a/packages/vulcan-core/lib/modules/components/HeadComponent.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { registerComponent } from 'meteor/vulcan:lib'; -import React from 'react'; - -const HeadComponent = () => null; - -HeadComponent.displayName = 'HeadComponent'; - -registerComponent('HeadComponent', HeadComponent); diff --git a/packages/vulcan-core/lib/modules/components/HeadTags.jsx b/packages/vulcan-core/lib/modules/components/HeadTags.jsx index 2cb5764cc..431e44c95 100644 --- a/packages/vulcan-core/lib/modules/components/HeadTags.jsx +++ b/packages/vulcan-core/lib/modules/components/HeadTags.jsx @@ -2,6 +2,7 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import Helmet from 'react-helmet'; import { registerComponent, Utils, getSetting, registerSetting, Head } from 'meteor/vulcan:lib'; +import { compose } from 'react-apollo'; registerSetting('logoUrl', null, 'Absolute URL for the logo image'); registerSetting('title', 'My App', 'App title'); @@ -61,6 +62,18 @@ class HeadTags extends PureComponent { {Head.script.map((tag, index) => )} diff --git a/packages/vulcan-core/lib/modules/components/RouterHook.jsx b/packages/vulcan-core/lib/modules/components/RouterHook.jsx new file mode 100644 index 000000000..97964915e --- /dev/null +++ b/packages/vulcan-core/lib/modules/components/RouterHook.jsx @@ -0,0 +1,24 @@ +import React, { PureComponent } from 'react'; +import { registerComponent, runCallbacks } from 'meteor/vulcan:lib'; +import { withApollo } from 'react-apollo'; + +class RouterHook extends PureComponent { + constructor(props) { + super(props); + const { currentRoute, client } = props; + console.log(props) + // the first argument is an item to iterate on, needed by vulcan:lib/callbacks + // note: this item is not used in this specific callback: router.onUpdate + runCallbacks('router.onUpdate', {}, currentRoute, client.store, client); + } + componentWillReceiveProps(nextProps) { + const { currentRoute, client } = nextProps; + // the first argument is an item to iterate on, needed by vulcan:lib/callbacks + // note: this item is not used in this specific callback: router.onUpdate + runCallbacks('router.onUpdate', {}, currentRoute, client.store, client); + } + render() { + return null; + } +} +registerComponent('RouterHook', RouterHook, withApollo); diff --git a/packages/vulcan-core/lib/modules/index.js b/packages/vulcan-core/lib/modules/index.js index ae49d8996..e98cb2d3c 100644 --- a/packages/vulcan-core/lib/modules/index.js +++ b/packages/vulcan-core/lib/modules/index.js @@ -22,6 +22,7 @@ export { default as Datatable } from './components/Datatable.jsx'; export { default as Flash } from './components/Flash.jsx'; export { default as HelloWorld } from './components/HelloWorld.jsx'; export { default as Welcome } from './components/Welcome.jsx'; +export { default as RouterHook } from './components/RouterHook.jsx'; export { default as withMessages } from "./containers/withMessages.js"; export { default as withList } from './containers/withList.js'; diff --git a/packages/vulcan-events-ga/README.md b/packages/vulcan-events-ga/README.md new file mode 100644 index 000000000..70247b7e5 --- /dev/null +++ b/packages/vulcan-events-ga/README.md @@ -0,0 +1 @@ +Vulcan events package, used internally. \ No newline at end of file diff --git a/packages/vulcan-events-ga/lib/client/ga.js b/packages/vulcan-events-ga/lib/client/ga.js new file mode 100644 index 000000000..6eb126937 --- /dev/null +++ b/packages/vulcan-events-ga/lib/client/ga.js @@ -0,0 +1,62 @@ +import { getSetting } from 'meteor/vulcan:core'; +import { addPageFunction, addInitFunction } from 'meteor/vulcan:events'; + +/* + + We provide a special support for Google Analytics. + + If you want to enable GA page viewing / tracking, go to + your settings file and update the 'public > googleAnalytics > apiKey' + field with your GA unique identifier (UA-xxx...). + +*/ + +function googleAnaticsTrackPage() { + if (window && window.ga) { + window.ga('send', 'pageview', { + page: window.location.pathname, + }); + } + return {}; +} + +// add client-side callback: log a ga request on page view +addPageFunction(googleAnaticsTrackPage); + +function googleAnalyticsInit() { + // get the google analytics id from the settings + const googleAnalyticsId = getSetting('googleAnalytics.apiKey'); + + // the google analytics id exists & isn't the placeholder from sample_settings.json + if (googleAnalyticsId && googleAnalyticsId !== 'foo123') { + (function(i, s, o, g, r, a, m) { + i['GoogleAnalyticsObject'] = r; + (i[r] = + i[r] || + function() { + (i[r].q = i[r].q || []).push(arguments); + }), + (i[r].l = 1 * new Date()); + (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m); + })( + window, + document, + 'script', + '//www.google-analytics.com/analytics.js', + 'ga' + ); + + const cookieDomain = document.domain === 'localhost' ? 'none' : 'auto'; + + window.ga('create', googleAnalyticsId, cookieDomain); + + // trigger first request once analytics are initialized + googleAnaticsTrackPage(); + } +} + +// init google analytics on the client module +addInitFunction(googleAnalyticsInit); diff --git a/packages/vulcan-events-ga/lib/client/main.js b/packages/vulcan-events-ga/lib/client/main.js new file mode 100644 index 000000000..bd90865fc --- /dev/null +++ b/packages/vulcan-events-ga/lib/client/main.js @@ -0,0 +1,2 @@ +import './ga.js'; +export * from '../modules/index.js'; \ No newline at end of file diff --git a/packages/vulcan-events-ga/lib/modules/index.js b/packages/vulcan-events-ga/lib/modules/index.js new file mode 100644 index 000000000..29ed8aee7 --- /dev/null +++ b/packages/vulcan-events-ga/lib/modules/index.js @@ -0,0 +1,3 @@ +import { registerSetting } from 'meteor/vulcan:core'; + +registerSetting('googleAnalytics.apiKey', null, 'Google Analytics ID'); diff --git a/packages/vulcan-events-ga/lib/server/main.js b/packages/vulcan-events-ga/lib/server/main.js new file mode 100644 index 000000000..094a9a675 --- /dev/null +++ b/packages/vulcan-events-ga/lib/server/main.js @@ -0,0 +1 @@ +export * from '../modules/index.js'; diff --git a/packages/vulcan-events-ga/package.js b/packages/vulcan-events-ga/package.js new file mode 100644 index 000000000..5fab99d7d --- /dev/null +++ b/packages/vulcan-events-ga/package.js @@ -0,0 +1,19 @@ +Package.describe({ + name: "vulcan:events-ga", + summary: "Vulcan Google Analytics event tracking package", + version: '1.8.0', + git: "https://github.com/VulcanJS/Vulcan.git" +}); + +Package.onUse(function(api) { + + api.versionsFrom('METEOR@1.5.2'); + + api.use([ + 'vulcan:core@1.8.0', + ]); + + api.mainModule("lib/server/main.js", "server"); + api.mainModule('lib/client/main.js', 'client'); + +}); diff --git a/packages/vulcan-events-segment/lib/client/main.js b/packages/vulcan-events-segment/lib/client/main.js new file mode 100644 index 000000000..288be2607 --- /dev/null +++ b/packages/vulcan-events-segment/lib/client/main.js @@ -0,0 +1,3 @@ +export * from '../modules/index'; + +import './segment-client.js'; \ No newline at end of file diff --git a/packages/vulcan-events-segment/lib/client/segment-client.js b/packages/vulcan-events-segment/lib/client/segment-client.js new file mode 100644 index 000000000..7c656e397 --- /dev/null +++ b/packages/vulcan-events-segment/lib/client/segment-client.js @@ -0,0 +1,110 @@ +import { getSetting, addCallback, Utils } from 'meteor/vulcan:core'; +import { + addPageFunction, + addInitFunction, + addIdentifyFunction, + addTrackFunction, +} from 'meteor/vulcan:events'; + +/* + +Track Page + +*/ +function segmentTrackPage(empty, route) { + const { name, path } = route; + const properties = { + url: Utils.getSiteUrl().slice(0, -1) + path, + path, + }; + window.analytics.page(null, name, properties); + return {}; +} +addPageFunction(segmentTrackPage); + +/* + +Identify User + +*/ +function segmentIdentify(currentUser) { + window.analytics.identify(currentUser.userId, { + email: currentUser.email, + pageUrl: currentUser.pageUrl, + }); +} +addIdentifyFunction(segmentIdentify); + +/* + +Track Event + +*/ +function segmentTrack(eventName, eventProperties) { + analytics.track(eventName, eventProperties); +} +addTrackFunction(segmentTrack); + +/* + +Init Snippet + +*/ +function segmentInit() { + !(function() { + var analytics = (window.analytics = window.analytics || []); + if (!analytics.initialize) + if (analytics.invoked) + window.console && + console.error && + console.error('Segment snippet included twice.'); + else { + analytics.invoked = !0; + analytics.methods = [ + 'trackSubmit', + 'trackClick', + 'trackLink', + 'trackForm', + 'pageview', + 'identify', + 'reset', + 'group', + 'track', + 'ready', + 'alias', + 'debug', + 'page', + 'once', + 'off', + 'on', + ]; + analytics.factory = function(t) { + return function() { + var e = Array.prototype.slice.call(arguments); + e.unshift(t); + analytics.push(e); + return analytics; + }; + }; + for (var t = 0; t < analytics.methods.length; t++) { + var e = analytics.methods[t]; + analytics[e] = analytics.factory(e); + } + analytics.load = function(t) { + var e = document.createElement('script'); + e.type = 'text/javascript'; + e.async = !0; + e.src = + ('https:' === document.location.protocol ? 'https://' : 'http://') + + 'cdn.segment.com/analytics.js/v1/' + + t + + '/analytics.min.js'; + var n = document.getElementsByTagName('script')[0]; + n.parentNode.insertBefore(e, n); + }; + analytics.SNIPPET_VERSION = '4.0.0'; + analytics.load(getSetting('segment.clientKey')); + } + })(); +} +addInitFunction(segmentInit); \ No newline at end of file diff --git a/packages/vulcan-events-segment/lib/modules/index.js b/packages/vulcan-events-segment/lib/modules/index.js new file mode 100644 index 000000000..f04e7c61d --- /dev/null +++ b/packages/vulcan-events-segment/lib/modules/index.js @@ -0,0 +1,4 @@ +import { registerSetting } from 'meteor/vulcan:core'; + +registerSetting('segment.clientKey', null, 'Segment client-side API key'); +registerSetting('segment.serverKey', null, 'Segment server-side API key'); diff --git a/packages/vulcan-events-segment/lib/server/main.js b/packages/vulcan-events-segment/lib/server/main.js new file mode 100644 index 000000000..132be3f68 --- /dev/null +++ b/packages/vulcan-events-segment/lib/server/main.js @@ -0,0 +1,3 @@ +// export * from '../modules/index'; + +export * from './segment-server.js'; \ No newline at end of file diff --git a/packages/vulcan-events-segment/lib/server/segment-server.js b/packages/vulcan-events-segment/lib/server/segment-server.js new file mode 100644 index 000000000..fa4fb9e49 --- /dev/null +++ b/packages/vulcan-events-segment/lib/server/segment-server.js @@ -0,0 +1,5 @@ +import Analytics from 'analytics-node'; +import { getSetting } from 'meteor/vulcan:core'; +const analytics = new Analytics(getSetting('segment.serverKey')); + +export default analytics; \ No newline at end of file diff --git a/packages/vulcan-events-segment/package.js b/packages/vulcan-events-segment/package.js new file mode 100644 index 000000000..9718a7444 --- /dev/null +++ b/packages/vulcan-events-segment/package.js @@ -0,0 +1,19 @@ +Package.describe({ + name: "vulcan:events-segment", + summary: "Vulcan Segment", + version: '1.8.0', + git: "https://github.com/VulcanJS/Vulcan.git" +}); + +Package.onUse(function (api) { + + api.versionsFrom('METEOR@1.5.2'); + + api.use([ + 'vulcan:core@1.8.0', + ]); + + api.mainModule('lib/server/main.js', 'server'); + api.mainModule('lib/client/main.js', 'client'); + +}); diff --git a/packages/vulcan-events/lib/callbacks.js b/packages/vulcan-events/lib/callbacks.js deleted file mode 100644 index 75d594d60..000000000 --- a/packages/vulcan-events/lib/callbacks.js +++ /dev/null @@ -1,5 +0,0 @@ -import { addCallback } from 'meteor/vulcan:core'; -import { sendGoogleAnalyticsRequest } from './helpers'; - -// add client-side callback: log a ga request on page view -addCallback('router.onUpdate', sendGoogleAnalyticsRequest); \ No newline at end of file diff --git a/packages/vulcan-events/lib/client.js b/packages/vulcan-events/lib/client.js deleted file mode 100644 index 5f5e7d985..000000000 --- a/packages/vulcan-events/lib/client.js +++ /dev/null @@ -1,8 +0,0 @@ -import Events from './collection.js'; -import { initGoogleAnalytics } from './helpers.js'; -import './callbacks.js'; - -// init google analytics on the client module -initGoogleAnalytics(); - -export default Events; diff --git a/packages/vulcan-events/lib/client/main.js b/packages/vulcan-events/lib/client/main.js new file mode 100644 index 000000000..67d11275b --- /dev/null +++ b/packages/vulcan-events/lib/client/main.js @@ -0,0 +1 @@ +export * from '../modules/index.js'; \ No newline at end of file diff --git a/packages/vulcan-events/lib/collection.js b/packages/vulcan-events/lib/collection.js deleted file mode 100644 index 031492f08..000000000 --- a/packages/vulcan-events/lib/collection.js +++ /dev/null @@ -1,33 +0,0 @@ -import SimpleSchema from 'simpl-schema'; - -const Events = new Mongo.Collection('events'); - -Events.schema = new SimpleSchema({ - createdAt: { - type: Date - }, - name: { - type: String - }, - description: { - type: String, - optional: true - }, - unique: { - type: Boolean, - optional: true - }, - important: { // marking an event as important means it should never be erased - type: Boolean, - optional: true - }, - properties: { - type: Object, - optional: true, - blackbox: true - } -}); - -Events.attachSchema(Events.schema); - -export default Events; diff --git a/packages/vulcan-events/lib/helpers.js b/packages/vulcan-events/lib/helpers.js deleted file mode 100644 index b3355c05c..000000000 --- a/packages/vulcan-events/lib/helpers.js +++ /dev/null @@ -1,60 +0,0 @@ -import { getSetting, registerSetting } from 'meteor/vulcan:core'; -import Events from './collection.js'; - -registerSetting('googleAnalyticsId', null, 'Google Analytics ID'); - -/* - - We provide a special support for Google Analytics. - - If you want to enable GA page viewing / tracking, go to - your settings file and update the 'public > googleAnalyticsId' - field with your GA unique identifier (UA-xxx...). - -*/ - -export function sendGoogleAnalyticsRequest () { - if (window && window.ga) { - window.ga('send', 'pageview', { - 'page': window.location.pathname - }); - } - return {} -} - -export const initGoogleAnalytics = () => { - - // get the google analytics id from the settings - const googleAnalyticsId = getSetting('googleAnalyticsId'); - - // the google analytics id exists & isn't the placeholder from sample_settings.json - if (googleAnalyticsId && googleAnalyticsId !== 'foo123') { - - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - - const cookieDomain = document.domain === 'localhost' ? 'none' : 'auto'; - - window.ga('create', googleAnalyticsId, cookieDomain); - - // trigger first request once analytics are initialized - sendGoogleAnalyticsRequest(); - } -}; - - -// collection based logging -Events.log = function (event) { - - // if event is supposed to be unique, check if it has already been logged - if (!!event.unique && !!Events.findOne({name: event.name})) { - return; - } - - event.createdAt = new Date(); - - Events.insert(event); - -}; diff --git a/packages/vulcan-events/lib/modules/collection.js b/packages/vulcan-events/lib/modules/collection.js new file mode 100644 index 000000000..6204e9ea1 --- /dev/null +++ b/packages/vulcan-events/lib/modules/collection.js @@ -0,0 +1,16 @@ +import { createCollection, getDefaultResolvers } from 'meteor/vulcan:core'; +import schema from './schema.js'; + +const Events = createCollection({ + + collectionName: 'Events', + + typeName: 'Event', + + schema, + + resolvers: getDefaultResolvers('Events'), + +}); + +export default Events; diff --git a/packages/vulcan-events/lib/modules/events.js b/packages/vulcan-events/lib/modules/events.js new file mode 100644 index 000000000..a06acbb00 --- /dev/null +++ b/packages/vulcan-events/lib/modules/events.js @@ -0,0 +1,29 @@ +import { addCallback } from 'meteor/vulcan:core'; + +export const initFunctions = []; + +export const trackFunctions = []; + +export const addInitFunction = func => { + initFunctions.push(func); + // execute init function as soon as possible + func(); +}; + +export const addTrackFunction = func => { + trackFunctions.push(func); +}; + +export const track = (eventName, eventProperties) => { + trackFunctions.forEach(f => { + f(eventName, eventProperties); + }); +} + +export const addIdentifyFunction = func => { + addCallback('events.identify', func); +}; + +export const addPageFunction = func => { + addCallback('router.onUpdate', func); +}; diff --git a/packages/vulcan-events/lib/modules/index.js b/packages/vulcan-events/lib/modules/index.js new file mode 100644 index 000000000..51a9f4c86 --- /dev/null +++ b/packages/vulcan-events/lib/modules/index.js @@ -0,0 +1,2 @@ +export * from './collection.js'; +export * from './events'; \ No newline at end of file diff --git a/packages/vulcan-events/lib/modules/schema.js b/packages/vulcan-events/lib/modules/schema.js new file mode 100644 index 000000000..f2ed665a4 --- /dev/null +++ b/packages/vulcan-events/lib/modules/schema.js @@ -0,0 +1,28 @@ +const schema = { + createdAt: { + type: Date, + }, + name: { + type: String, + }, + description: { + type: String, + optional: true, + }, + unique: { + type: Boolean, + optional: true, + }, + important: { + // marking an event as important means it should never be erased + type: Boolean, + optional: true, + }, + properties: { + type: Object, + optional: true, + blackbox: true, + }, +}; + +export default schema; \ No newline at end of file diff --git a/packages/vulcan-events/lib/mutations.js b/packages/vulcan-events/lib/mutations.js deleted file mode 100644 index 17a92a1aa..000000000 --- a/packages/vulcan-events/lib/mutations.js +++ /dev/null @@ -1,18 +0,0 @@ -// import { GraphQLSchema } from 'meteor/vulcan:core'; -// // import Events from './collection.js'; -// import { requestAnalyticsAsync } from './helpers.js'; - -// GraphQLSchema.addMutation('eventTrack(eventName: String, properties: JSON): JSON'); - -// const resolvers = { -// Mutation: { -// eventTrack: (root, { eventName, properties }, context) => { -// const user = context.currentUser || {_id: 'anonymous'}; - - -// return properties; -// }, -// }, -// }; - -// GraphQLSchema.addResolvers(resolvers); diff --git a/packages/vulcan-events/lib/server.js b/packages/vulcan-events/lib/server.js deleted file mode 100644 index 523fea258..000000000 --- a/packages/vulcan-events/lib/server.js +++ /dev/null @@ -1,5 +0,0 @@ -import Events from './collection.js'; -import './callbacks.js'; -// import './mutations.js'; - -export default Events; diff --git a/packages/vulcan-events/lib/server/main.js b/packages/vulcan-events/lib/server/main.js new file mode 100644 index 000000000..67d11275b --- /dev/null +++ b/packages/vulcan-events/lib/server/main.js @@ -0,0 +1 @@ +export * from '../modules/index.js'; \ No newline at end of file diff --git a/packages/vulcan-events/package.js b/packages/vulcan-events/package.js index 2d14c24b3..fb723f257 100644 --- a/packages/vulcan-events/package.js +++ b/packages/vulcan-events/package.js @@ -13,7 +13,7 @@ Package.onUse(function(api) { 'vulcan:core@1.8.0', ]); - api.mainModule("lib/server.js", "server"); - api.mainModule("lib/client.js", "client"); + api.mainModule("lib/server/main.js", "server"); + api.mainModule('lib/client/main.js', 'client'); }); diff --git a/packages/vulcan-routing/lib/client/routing.jsx b/packages/vulcan-routing/lib/client/routing.jsx index 98d8166c2..135e07075 100644 --- a/packages/vulcan-routing/lib/client/routing.jsx +++ b/packages/vulcan-routing/lib/client/routing.jsx @@ -64,7 +64,7 @@ Meteor.startup(() => { onUpdate: () => { // the first argument is an item to iterate on, needed by vulcan:lib/callbacks // note: this item is not used in this specific callback: router.onUpdate - runCallbacks('router.onUpdate', {}, store, apolloClient); + // runCallbacks('router.onUpdate', {}, store, apolloClient); }, render: applyRouterMiddleware(useScroll((prevRouterProps, nextRouterProps) => { // if the action is REPLACE, return false so that we don't jump back to top of page From 4d55c2f7883132157037c8d5074e821673c7e537 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Sun, 17 Dec 2017 18:00:48 +0900 Subject: [PATCH 54/69] Small fixes --- packages/vulcan-core/lib/modules/components/App.jsx | 2 +- packages/vulcan-events-segment/lib/client/segment-client.js | 2 +- packages/vulcan-events/lib/modules/events.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vulcan-core/lib/modules/components/App.jsx b/packages/vulcan-core/lib/modules/components/App.jsx index 6d39edca4..e47fd659d 100644 --- a/packages/vulcan-core/lib/modules/components/App.jsx +++ b/packages/vulcan-core/lib/modules/components/App.jsx @@ -36,7 +36,7 @@ class App extends PureComponent { } componentWillUpdate(nextProps) { - if (nextProps.currentUser) { + if (!this.props.currentUser && nextProps.currentUser) { runCallbacks('events.identify', nextProps.currentUser); } } diff --git a/packages/vulcan-events-segment/lib/client/segment-client.js b/packages/vulcan-events-segment/lib/client/segment-client.js index 7c656e397..da80fc866 100644 --- a/packages/vulcan-events-segment/lib/client/segment-client.js +++ b/packages/vulcan-events-segment/lib/client/segment-client.js @@ -11,7 +11,7 @@ import { Track Page */ -function segmentTrackPage(empty, route) { +function segmentTrackPage(route) { const { name, path } = route; const properties = { url: Utils.getSiteUrl().slice(0, -1) + path, diff --git a/packages/vulcan-events/lib/modules/events.js b/packages/vulcan-events/lib/modules/events.js index a06acbb00..eb321994c 100644 --- a/packages/vulcan-events/lib/modules/events.js +++ b/packages/vulcan-events/lib/modules/events.js @@ -25,5 +25,5 @@ export const addIdentifyFunction = func => { }; export const addPageFunction = func => { - addCallback('router.onUpdate', func); + addCallback('router.onUpdate', (empty, route) => func(route)); }; From 104b6304489a22a1c2aaa771dda9a76dad56732b Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Sun, 17 Dec 2017 20:59:26 +0900 Subject: [PATCH 55/69] Create new events-internal package to hold internal Mongo event tracking code --- .../lib/modules/components/RouterHook.jsx | 16 +++++++----- packages/vulcan-events-internal/README.md | 1 + .../lib/client/internal.js | 12 +++++++++ .../vulcan-events-internal/lib/client/main.js | 3 +++ .../lib/modules/collection.js | 0 .../lib/modules/index.js | 1 + .../lib/modules/schema.js | 0 .../vulcan-events-internal/lib/server/main.js | 1 + .../lib/server/mutations.js | 0 packages/vulcan-events-internal/package.js | 19 ++++++++++++++ packages/vulcan-events/lib/modules/events.js | 26 ++++++++++++------- packages/vulcan-events/lib/modules/index.js | 1 - packages/vulcan-lib/lib/modules/callbacks.js | 2 +- 13 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 packages/vulcan-events-internal/README.md create mode 100644 packages/vulcan-events-internal/lib/client/internal.js create mode 100644 packages/vulcan-events-internal/lib/client/main.js rename packages/{vulcan-events => vulcan-events-internal}/lib/modules/collection.js (100%) create mode 100644 packages/vulcan-events-internal/lib/modules/index.js rename packages/{vulcan-events => vulcan-events-internal}/lib/modules/schema.js (100%) create mode 100644 packages/vulcan-events-internal/lib/server/main.js create mode 100644 packages/vulcan-events-internal/lib/server/mutations.js create mode 100644 packages/vulcan-events-internal/package.js diff --git a/packages/vulcan-core/lib/modules/components/RouterHook.jsx b/packages/vulcan-core/lib/modules/components/RouterHook.jsx index 97964915e..9b9254043 100644 --- a/packages/vulcan-core/lib/modules/components/RouterHook.jsx +++ b/packages/vulcan-core/lib/modules/components/RouterHook.jsx @@ -5,18 +5,20 @@ import { withApollo } from 'react-apollo'; class RouterHook extends PureComponent { constructor(props) { super(props); - const { currentRoute, client } = props; - console.log(props) - // the first argument is an item to iterate on, needed by vulcan:lib/callbacks - // note: this item is not used in this specific callback: router.onUpdate - runCallbacks('router.onUpdate', {}, currentRoute, client.store, client); + this.runOnUpdateCallback(props); } + componentWillReceiveProps(nextProps) { - const { currentRoute, client } = nextProps; + this.runOnUpdateCallback(nextProps); + } + + runOnUpdateCallback = props => { + const { currentRoute, client } = props; // the first argument is an item to iterate on, needed by vulcan:lib/callbacks // note: this item is not used in this specific callback: router.onUpdate runCallbacks('router.onUpdate', {}, currentRoute, client.store, client); - } + }; + render() { return null; } diff --git a/packages/vulcan-events-internal/README.md b/packages/vulcan-events-internal/README.md new file mode 100644 index 000000000..70247b7e5 --- /dev/null +++ b/packages/vulcan-events-internal/README.md @@ -0,0 +1 @@ +Vulcan events package, used internally. \ No newline at end of file diff --git a/packages/vulcan-events-internal/lib/client/internal.js b/packages/vulcan-events-internal/lib/client/internal.js new file mode 100644 index 000000000..0ef3cce46 --- /dev/null +++ b/packages/vulcan-events-internal/lib/client/internal.js @@ -0,0 +1,12 @@ +import { addTrackFunction } from 'meteor/vulcan:events'; +import { ApolloClient } from 'apollo-client'; +import { getRenderContext } from 'meteor/vulcan:lib'; +import gql from 'graphql-tag'; + +function trackInternal() { + const { apolloClient, store } = getRenderContext(); + console.log(apolloClient) + apolloClient.query({ query: gql`{ hello }` }).then(console.log); +} + +addTrackFunction(trackInternal); diff --git a/packages/vulcan-events-internal/lib/client/main.js b/packages/vulcan-events-internal/lib/client/main.js new file mode 100644 index 000000000..f6d2a5738 --- /dev/null +++ b/packages/vulcan-events-internal/lib/client/main.js @@ -0,0 +1,3 @@ +export * from '../modules/index.js'; + +import './internal.js'; \ No newline at end of file diff --git a/packages/vulcan-events/lib/modules/collection.js b/packages/vulcan-events-internal/lib/modules/collection.js similarity index 100% rename from packages/vulcan-events/lib/modules/collection.js rename to packages/vulcan-events-internal/lib/modules/collection.js diff --git a/packages/vulcan-events-internal/lib/modules/index.js b/packages/vulcan-events-internal/lib/modules/index.js new file mode 100644 index 000000000..d193f1a60 --- /dev/null +++ b/packages/vulcan-events-internal/lib/modules/index.js @@ -0,0 +1 @@ +export * from './collection.js'; \ No newline at end of file diff --git a/packages/vulcan-events/lib/modules/schema.js b/packages/vulcan-events-internal/lib/modules/schema.js similarity index 100% rename from packages/vulcan-events/lib/modules/schema.js rename to packages/vulcan-events-internal/lib/modules/schema.js diff --git a/packages/vulcan-events-internal/lib/server/main.js b/packages/vulcan-events-internal/lib/server/main.js new file mode 100644 index 000000000..67d11275b --- /dev/null +++ b/packages/vulcan-events-internal/lib/server/main.js @@ -0,0 +1 @@ +export * from '../modules/index.js'; \ No newline at end of file diff --git a/packages/vulcan-events-internal/lib/server/mutations.js b/packages/vulcan-events-internal/lib/server/mutations.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/vulcan-events-internal/package.js b/packages/vulcan-events-internal/package.js new file mode 100644 index 000000000..8fa110f8e --- /dev/null +++ b/packages/vulcan-events-internal/package.js @@ -0,0 +1,19 @@ +Package.describe({ + name: "vulcan:events-internal", + summary: "Vulcan internal event tracking package", + version: '1.8.0', + git: "https://github.com/VulcanJS/Vulcan.git" +}); + +Package.onUse(function(api) { + + api.versionsFrom('METEOR@1.5.2'); + + api.use([ + 'vulcan:core@1.8.0', + ]); + + api.mainModule("lib/server/main.js", "server"); + api.mainModule('lib/client/main.js', 'client'); + +}); diff --git a/packages/vulcan-events/lib/modules/events.js b/packages/vulcan-events/lib/modules/events.js index eb321994c..4ac73e92f 100644 --- a/packages/vulcan-events/lib/modules/events.js +++ b/packages/vulcan-events/lib/modules/events.js @@ -4,14 +4,14 @@ export const initFunctions = []; export const trackFunctions = []; -export const addInitFunction = func => { - initFunctions.push(func); +export const addInitFunction = f => { + initFunctions.push(f); // execute init function as soon as possible - func(); + f(); }; -export const addTrackFunction = func => { - trackFunctions.push(func); +export const addTrackFunction = f => { + trackFunctions.push(f); }; export const track = (eventName, eventProperties) => { @@ -20,10 +20,18 @@ export const track = (eventName, eventProperties) => { }); } -export const addIdentifyFunction = func => { - addCallback('events.identify', func); +export const addIdentifyFunction = f => { + addCallback('events.identify', f); }; -export const addPageFunction = func => { - addCallback('router.onUpdate', (empty, route) => func(route)); +export const addPageFunction = f => { + const f2 = (empty, route) => f(route); + + // rename f2 to same name as f + // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty + const descriptor = Object.create(null); // no inherited properties + descriptor.value = f.name; + Object.defineProperty(f2, 'name', descriptor) + + addCallback('router.onUpdate', f2); }; diff --git a/packages/vulcan-events/lib/modules/index.js b/packages/vulcan-events/lib/modules/index.js index 51a9f4c86..099399ac2 100644 --- a/packages/vulcan-events/lib/modules/index.js +++ b/packages/vulcan-events/lib/modules/index.js @@ -1,2 +1 @@ -export * from './collection.js'; export * from './events'; \ No newline at end of file diff --git a/packages/vulcan-lib/lib/modules/callbacks.js b/packages/vulcan-lib/lib/modules/callbacks.js index 26ba1a71a..0360efdc3 100644 --- a/packages/vulcan-lib/lib/modules/callbacks.js +++ b/packages/vulcan-lib/lib/modules/callbacks.js @@ -87,7 +87,7 @@ export const runCallbacks = function () { if (typeof result === 'undefined') { // if result of current iteration is undefined, don't pass it on - console.log(`// Warning: Sync callback [${callback.name}] in hook [${hook}] didn't return a result!`) + debug(`// Warning: Sync callback [${callback.name}] in hook [${hook}] didn't return a result!`) return accumulator } else { return result; From 84c9442ed1f61415edb885551135af15e252d922 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Mon, 18 Dec 2017 09:01:24 +0900 Subject: [PATCH 56/69] Enable inserting events in MongoDB via track() --- .../lib/client/internal.js | 19 ++++++++++++++++--- .../lib/modules/collection.js | 13 ++++++++++++- .../lib/modules/schema.js | 10 ++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/packages/vulcan-events-internal/lib/client/internal.js b/packages/vulcan-events-internal/lib/client/internal.js index 0ef3cce46..3651371b9 100644 --- a/packages/vulcan-events-internal/lib/client/internal.js +++ b/packages/vulcan-events-internal/lib/client/internal.js @@ -3,10 +3,23 @@ import { ApolloClient } from 'apollo-client'; import { getRenderContext } from 'meteor/vulcan:lib'; import gql from 'graphql-tag'; -function trackInternal() { +function trackInternal(eventName, eventProperties) { const { apolloClient, store } = getRenderContext(); - console.log(apolloClient) - apolloClient.query({ query: gql`{ hello }` }).then(console.log); + const mutation = gql` + mutation EventsNew($document: EventsInput) { + EventsNew(document: $document) { + name + createdAt + } + } + `; + const variables = { + document: { + name: eventName, + properties: eventProperties, + }, + }; + apolloClient.mutate({ mutation, variables }); } addTrackFunction(trackInternal); diff --git a/packages/vulcan-events-internal/lib/modules/collection.js b/packages/vulcan-events-internal/lib/modules/collection.js index 6204e9ea1..b8ba51bd6 100644 --- a/packages/vulcan-events-internal/lib/modules/collection.js +++ b/packages/vulcan-events-internal/lib/modules/collection.js @@ -1,5 +1,6 @@ -import { createCollection, getDefaultResolvers } from 'meteor/vulcan:core'; +import { createCollection, getDefaultResolvers, getDefaultMutations } from 'meteor/vulcan:core'; import schema from './schema.js'; +import Users from 'meteor/vulcan:users'; const Events = createCollection({ @@ -11,6 +12,16 @@ const Events = createCollection({ resolvers: getDefaultResolvers('Events'), + mutations: getDefaultMutations('Events', { + newCheck: () => true, + editCheck: () => false, + removeCheck: () => false + }) + }); +Events.checkAccess = (currentUser, doc) => { + return Users.isAdmin(currentUser); +} + export default Events; diff --git a/packages/vulcan-events-internal/lib/modules/schema.js b/packages/vulcan-events-internal/lib/modules/schema.js index f2ed665a4..6f216bb50 100644 --- a/packages/vulcan-events-internal/lib/modules/schema.js +++ b/packages/vulcan-events-internal/lib/modules/schema.js @@ -1,9 +1,18 @@ const schema = { createdAt: { type: Date, + optional: true, + onInsert: () => { + return new Date() + } }, name: { type: String, + insertableBy: ['guests'], + }, + userId: { + type: String, + optional: true, }, description: { type: String, @@ -22,6 +31,7 @@ const schema = { type: Object, optional: true, blackbox: true, + insertableBy: ['guests'], }, }; From 010fff2e2160280c26c74e446232766409f238f9 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Mon, 18 Dec 2017 09:57:17 +0900 Subject: [PATCH 57/69] Implement server-side internal event tracking --- .../lib/modules/default_mutations.js | 2 +- .../lib/modules/callbacks/schema.js | 14 ++++---------- .../{internal.js => internal-client.js} | 0 .../vulcan-events-internal/lib/client/main.js | 2 +- .../lib/server/internal-server.js | 19 +++++++++++++++++++ .../vulcan-events-internal/lib/server/main.js | 4 +++- .../lib/server/mutations.js | 0 packages/vulcan-events/lib/modules/events.js | 14 +++++++------- packages/vulcan-lib/lib/server/mutations.js | 6 +++--- 9 files changed, 38 insertions(+), 23 deletions(-) rename packages/vulcan-events-internal/lib/client/{internal.js => internal-client.js} (100%) create mode 100644 packages/vulcan-events-internal/lib/server/internal-server.js delete mode 100644 packages/vulcan-events-internal/lib/server/mutations.js diff --git a/packages/vulcan-core/lib/modules/default_mutations.js b/packages/vulcan-core/lib/modules/default_mutations.js index ebee4bf45..76bde3cfc 100644 --- a/packages/vulcan-core/lib/modules/default_mutations.js +++ b/packages/vulcan-core/lib/modules/default_mutations.js @@ -186,7 +186,7 @@ const registerCollectionCallbacks = collectionName => { }); registerCallback({ name: `${collectionName}.edit.async`, - arguments: [{newDocument: 'The document after the edit', document: 'The document before the edit'}, {currentUser: 'The current user'}, {collection: 'The collection the document belongs to'}], + arguments: [{newDocument: 'The document after the edit'}, {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.` diff --git a/packages/vulcan-debug/lib/modules/callbacks/schema.js b/packages/vulcan-debug/lib/modules/callbacks/schema.js index 86cc28bbe..52643074c 100644 --- a/packages/vulcan-debug/lib/modules/callbacks/schema.js +++ b/packages/vulcan-debug/lib/modules/callbacks/schema.js @@ -1,7 +1,6 @@ import { Callbacks } from 'meteor/vulcan:lib'; const schema = { - name: { label: 'Name', type: String, @@ -43,21 +42,16 @@ const schema = { viewableBy: ['admins'], resolveAs: { type: '[String]', - resolver: (callback) => { - console.log('// callback') - console.log(callback) - console.log(Callbacks[callback.name]) + resolver: callback => { if (Callbacks[callback.name]) { const callbacks = Callbacks[callback.name].map(f => f.name); - console.log(callbacks) return callbacks; } else { return []; } - } - } - } - + }, + }, + }, }; export default schema; diff --git a/packages/vulcan-events-internal/lib/client/internal.js b/packages/vulcan-events-internal/lib/client/internal-client.js similarity index 100% rename from packages/vulcan-events-internal/lib/client/internal.js rename to packages/vulcan-events-internal/lib/client/internal-client.js diff --git a/packages/vulcan-events-internal/lib/client/main.js b/packages/vulcan-events-internal/lib/client/main.js index f6d2a5738..c24f47e84 100644 --- a/packages/vulcan-events-internal/lib/client/main.js +++ b/packages/vulcan-events-internal/lib/client/main.js @@ -1,3 +1,3 @@ export * from '../modules/index.js'; -import './internal.js'; \ No newline at end of file +import './internal-client.js'; \ No newline at end of file diff --git a/packages/vulcan-events-internal/lib/server/internal-server.js b/packages/vulcan-events-internal/lib/server/internal-server.js new file mode 100644 index 000000000..b966fe0b1 --- /dev/null +++ b/packages/vulcan-events-internal/lib/server/internal-server.js @@ -0,0 +1,19 @@ +import { addTrackFunction } from 'meteor/vulcan:events'; +import { newMutation } from 'meteor/vulcan:lib'; +import Events from '../modules/collection'; + +async function trackInternalServer(eventName, eventProperties, currentUser) { + const document = { + name: eventName, + properties: eventProperties, + }; + return await newMutation({ + collection: Events, + document, + currentUser, + validate: false, + context: {}, + }); +} + +addTrackFunction(trackInternalServer); diff --git a/packages/vulcan-events-internal/lib/server/main.js b/packages/vulcan-events-internal/lib/server/main.js index 67d11275b..e9da5ae82 100644 --- a/packages/vulcan-events-internal/lib/server/main.js +++ b/packages/vulcan-events-internal/lib/server/main.js @@ -1 +1,3 @@ -export * from '../modules/index.js'; \ No newline at end of file +export * from '../modules/index.js'; + +import './internal-server'; diff --git a/packages/vulcan-events-internal/lib/server/mutations.js b/packages/vulcan-events-internal/lib/server/mutations.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/vulcan-events/lib/modules/events.js b/packages/vulcan-events/lib/modules/events.js index 4ac73e92f..2ebc21eed 100644 --- a/packages/vulcan-events/lib/modules/events.js +++ b/packages/vulcan-events/lib/modules/events.js @@ -7,18 +7,18 @@ export const trackFunctions = []; export const addInitFunction = f => { initFunctions.push(f); // execute init function as soon as possible - f(); + f(); }; export const addTrackFunction = f => { trackFunctions.push(f); }; -export const track = (eventName, eventProperties) => { - trackFunctions.forEach(f => { - f(eventName, eventProperties); - }); -} +export const track = async (eventName, eventProperties, currentUser) => { + for (let f of trackFunctions) { + await f(eventName, eventProperties, currentUser); + } +}; export const addIdentifyFunction = f => { addCallback('events.identify', f); @@ -31,7 +31,7 @@ export const addPageFunction = f => { // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty const descriptor = Object.create(null); // no inherited properties descriptor.value = f.name; - Object.defineProperty(f2, 'name', descriptor) + Object.defineProperty(f2, 'name', descriptor); addCallback('router.onUpdate', f2); }; diff --git a/packages/vulcan-lib/lib/server/mutations.js b/packages/vulcan-lib/lib/server/mutations.js index 2e499a74d..99e90b83d 100644 --- a/packages/vulcan-lib/lib/server/mutations.js +++ b/packages/vulcan-lib/lib/server/mutations.js @@ -98,7 +98,7 @@ export const newMutation = async ({ collection, document, currentUser, validate, // run async callbacks // note: query for document to get fresh document with collection-hooks effects applied - runCallbacksAsync(`${collectionName}.new.async`, insertedDocument, currentUser, collection); + await runCallbacksAsync(`${collectionName}.new.async`, insertedDocument, currentUser, collection); debug('// new mutation finished:'); debug(newDocument); @@ -187,7 +187,7 @@ export const editMutation = async ({ collection, documentId, set = {}, unset = { newDocument = await runCallbacks(`${collectionName}.edit.after`, newDocument, document, currentUser); // run async callbacks - runCallbacksAsync(`${collectionName}.edit.async`, newDocument, document, currentUser, collection); + await runCallbacksAsync(`${collectionName}.edit.async`, newDocument, document, currentUser, collection); debug('// edit mutation finished') debug('// modifier: ', modifier) @@ -232,7 +232,7 @@ export const removeMutation = async ({ collection, documentId, currentUser, vali collection.loader.clear(documentId); } - runCallbacksAsync(`${collectionName}.remove.async`, document, currentUser, collection); + await runCallbacksAsync(`${collectionName}.remove.async`, document, currentUser, collection); return document; } From f05c2bcab57a23aef97fcc7edb2b56b8f49744d4 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Mon, 18 Dec 2017 10:13:17 +0900 Subject: [PATCH 58/69] Implement server-side tracking for Segment; add server-side 'events.identify' hook --- .../lib/server/segment-server.js | 34 +++++++++++++++++-- .../vulcan-lib/lib/server/apollo_server.js | 4 +++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/vulcan-events-segment/lib/server/segment-server.js b/packages/vulcan-events-segment/lib/server/segment-server.js index fa4fb9e49..e49c1c0d0 100644 --- a/packages/vulcan-events-segment/lib/server/segment-server.js +++ b/packages/vulcan-events-segment/lib/server/segment-server.js @@ -1,5 +1,35 @@ import Analytics from 'analytics-node'; -import { getSetting } from 'meteor/vulcan:core'; +import { getSetting, addCallback, Utils } from 'meteor/vulcan:core'; +import { addPageFunction, addInitFunction, addIdentifyFunction, addTrackFunction } from 'meteor/vulcan:events'; + const analytics = new Analytics(getSetting('segment.serverKey')); -export default analytics; \ No newline at end of file +/* + +Identify User + +*/ +function segmentIdentifyServer(currentUser) { + analytics.identify({ + userId: currentUser._id, + traits: { + email: currentUser.email, + pageUrl: currentUser.pageUrl, + }, + }); +} +addIdentifyFunction(segmentIdentifyServer); + +/* + +Track Event + +*/ +function segmentTrackServer(eventName, eventProperties, currentUser) { + analytics.track({ + event: eventName, + properties: eventProperties, + userId: currentUser && currentUser._id, + }); +} +addTrackFunction(segmentTrackServer); diff --git a/packages/vulcan-lib/lib/server/apollo_server.js b/packages/vulcan-lib/lib/server/apollo_server.js index c6863335e..ee29eb4b2 100644 --- a/packages/vulcan-lib/lib/server/apollo_server.js +++ b/packages/vulcan-lib/lib/server/apollo_server.js @@ -152,6 +152,10 @@ const createApolloServer = (givenOptions = {}, givenConfig = {}) => { ); if (user) { + + // identify user to any server-side analytics providers + runCallbacks('events.identify', user); + const loginToken = Utils.findWhere(user.services.resume.loginTokens, { hashedToken }); const expiresAt = Accounts._tokenExpiration(loginToken.when); const isExpired = expiresAt < new Date(); From 0a7500ac66fff539b6918a80a730c42796b7c7e7 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 20 Dec 2017 09:43:00 +0900 Subject: [PATCH 59/69] Fix double slashes in site image path --- packages/vulcan-core/lib/modules/components/HeadTags.jsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/vulcan-core/lib/modules/components/HeadTags.jsx b/packages/vulcan-core/lib/modules/components/HeadTags.jsx index 82a331894..da9b49a4b 100644 --- a/packages/vulcan-core/lib/modules/components/HeadTags.jsx +++ b/packages/vulcan-core/lib/modules/components/HeadTags.jsx @@ -28,6 +28,10 @@ class HeadTags extends PureComponent { // add site url base if the image is stored locally if (!!image && image.indexOf('//') === -1) { + // remove starting slash from image path if needed + if (image.charAt(0) === '/') { + image = image.slice(1); + } image = Utils.getSiteUrl() + image; } From 5ed20fe7f5f4782108e89edffd9f0e99c7cb4b94 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 20 Dec 2017 09:43:13 +0900 Subject: [PATCH 60/69] More work on events stuff --- packages/vulcan-events-ga/package.js | 1 + packages/vulcan-events-internal/package.js | 1 + .../lib/server/segment-server.js | 59 ++++++++++--------- packages/vulcan-events-segment/package.js | 1 + 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/packages/vulcan-events-ga/package.js b/packages/vulcan-events-ga/package.js index 5fab99d7d..98f68b942 100644 --- a/packages/vulcan-events-ga/package.js +++ b/packages/vulcan-events-ga/package.js @@ -11,6 +11,7 @@ Package.onUse(function(api) { api.use([ 'vulcan:core@1.8.0', + 'vulcan:events@1.8.0', ]); api.mainModule("lib/server/main.js", "server"); diff --git a/packages/vulcan-events-internal/package.js b/packages/vulcan-events-internal/package.js index 8fa110f8e..8277bb01c 100644 --- a/packages/vulcan-events-internal/package.js +++ b/packages/vulcan-events-internal/package.js @@ -11,6 +11,7 @@ Package.onUse(function(api) { api.use([ 'vulcan:core@1.8.0', + 'vulcan:events@1.8.0', ]); api.mainModule("lib/server/main.js", "server"); diff --git a/packages/vulcan-events-segment/lib/server/segment-server.js b/packages/vulcan-events-segment/lib/server/segment-server.js index e49c1c0d0..6d19e9a6b 100644 --- a/packages/vulcan-events-segment/lib/server/segment-server.js +++ b/packages/vulcan-events-segment/lib/server/segment-server.js @@ -2,34 +2,39 @@ import Analytics from 'analytics-node'; import { getSetting, addCallback, Utils } from 'meteor/vulcan:core'; import { addPageFunction, addInitFunction, addIdentifyFunction, addTrackFunction } from 'meteor/vulcan:events'; -const analytics = new Analytics(getSetting('segment.serverKey')); +const segmentWriteKey = getSetting('segment.serverKey'); -/* +if (segmentWriteKey) { -Identify User + const analytics = new Analytics(segmentWriteKey); -*/ -function segmentIdentifyServer(currentUser) { - analytics.identify({ - userId: currentUser._id, - traits: { - email: currentUser.email, - pageUrl: currentUser.pageUrl, - }, - }); + /* + + Identify User + + */ + function segmentIdentifyServer(currentUser) { + analytics.identify({ + userId: currentUser._id, + traits: { + email: currentUser.email, + pageUrl: currentUser.pageUrl, + }, + }); + } + addIdentifyFunction(segmentIdentifyServer); + + /* + + Track Event + + */ + function segmentTrackServer(eventName, eventProperties, currentUser) { + analytics.track({ + event: eventName, + properties: eventProperties, + userId: currentUser && currentUser._id, + }); + } + addTrackFunction(segmentTrackServer); } -addIdentifyFunction(segmentIdentifyServer); - -/* - -Track Event - -*/ -function segmentTrackServer(eventName, eventProperties, currentUser) { - analytics.track({ - event: eventName, - properties: eventProperties, - userId: currentUser && currentUser._id, - }); -} -addTrackFunction(segmentTrackServer); diff --git a/packages/vulcan-events-segment/package.js b/packages/vulcan-events-segment/package.js index 9718a7444..837a63839 100644 --- a/packages/vulcan-events-segment/package.js +++ b/packages/vulcan-events-segment/package.js @@ -11,6 +11,7 @@ Package.onUse(function (api) { api.use([ 'vulcan:core@1.8.0', + 'vulcan:events@1.8.0', ]); api.mainModule('lib/server/main.js', 'server'); From 3f07f024c817bc2355ebaad9dc22814fa5f61e05 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 20 Dec 2017 09:43:30 +0900 Subject: [PATCH 61/69] Rename users.new.validate.before callback --- packages/vulcan-users/lib/server/on_create_user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vulcan-users/lib/server/on_create_user.js b/packages/vulcan-users/lib/server/on_create_user.js index fc964c82a..929ccd957 100644 --- a/packages/vulcan-users/lib/server/on_create_user.js +++ b/packages/vulcan-users/lib/server/on_create_user.js @@ -8,7 +8,7 @@ function onCreateUserCallback (options, user) { delete options.password; // we don't need to store the password digest delete options.username; // username is already in user object - options = runCallbacks(`users.new.pre_validate`, options); + options = runCallbacks(`users.new.validate.before`, options); // validate options since they can't be trusted Users.simpleSchema().validate(options); From 0fb118b5347d60a83abf4b69d97174e92707c3fb Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 20 Dec 2017 09:43:42 +0900 Subject: [PATCH 62/69] Pass on error data to flash component to help with #1787 --- packages/vulcan-forms/lib/components/Form.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vulcan-forms/lib/components/Form.jsx b/packages/vulcan-forms/lib/components/Form.jsx index 713a8667d..f8527995c 100644 --- a/packages/vulcan-forms/lib/components/Form.jsx +++ b/packages/vulcan-forms/lib/components/Form.jsx @@ -361,7 +361,8 @@ class Form extends Component { message = error.data.errors.map(error => { return { - content: this.getErrorMessage(error) + content: this.getErrorMessage(error), + data: error.data, } }); From 16412207b95dca9639a082559af40130a1409911 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 20 Dec 2017 13:46:03 +0900 Subject: [PATCH 63/69] Use full URL for logoUrl resolver --- packages/vulcan-lib/lib/modules/utils.js | 3 ++- packages/vulcan-lib/lib/server/site.js | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/vulcan-lib/lib/modules/utils.js b/packages/vulcan-lib/lib/modules/utils.js index 7e8ad604b..e5afc4da7 100644 --- a/packages/vulcan-lib/lib/modules/utils.js +++ b/packages/vulcan-lib/lib/modules/utils.js @@ -11,6 +11,7 @@ import sanitizeHtml from 'sanitize-html'; import getSlug from 'speakingurl'; import { getSetting, registerSetting } from './settings.js'; import { Routes } from './routes.js'; +import { isAbsolute } from 'path'; registerSetting('debug', false, 'Enable debug mode (more verbose logging)'); @@ -288,7 +289,7 @@ Utils.getFieldLabel = (fieldName, collection) => { Utils.getLogoUrl = () => { const logoUrl = getSetting('logoUrl'); - if (!!logoUrl) { + if (logoUrl) { const prefix = Utils.getSiteUrl().slice(0,-1); // the logo may be hosted on another website return logoUrl.indexOf('://') > -1 ? logoUrl : prefix + logoUrl; diff --git a/packages/vulcan-lib/lib/server/site.js b/packages/vulcan-lib/lib/server/site.js index d7e9b8367..b4eece7b9 100644 --- a/packages/vulcan-lib/lib/server/site.js +++ b/packages/vulcan-lib/lib/server/site.js @@ -1,4 +1,5 @@ import { addGraphQLSchema, addGraphQLResolvers, addGraphQLQuery } from '../modules/graphql.js'; +import { Utils } from '../modules/utils'; import { getSetting, registerSetting } from '../modules/settings.js'; const siteSchema = ` @@ -14,12 +15,12 @@ const siteResolvers = { Query: { SiteData(root, args, context) { return { - title: getSetting('title'), - url: getSetting('siteUrl', Meteor.absoluteUrl()), - logoUrl: getSetting('logoUrl'), - } - } - } + title: getSetting('title'), + url: getSetting('siteUrl', Meteor.absoluteUrl()), + logoUrl: Utils.getLogoUrl(), + }; + }, + }, }; addGraphQLResolvers(siteResolvers); From a8526f8505705e725fe631d008cc5c6bc6893f92 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Thu, 21 Dec 2017 10:04:16 +0900 Subject: [PATCH 64/69] Fix image deletion bug (see #1788) --- packages/vulcan-forms-upload/lib/Upload.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vulcan-forms-upload/lib/Upload.jsx b/packages/vulcan-forms-upload/lib/Upload.jsx index 14f17c7e1..bc0030af2 100755 --- a/packages/vulcan-forms-upload/lib/Upload.jsx +++ b/packages/vulcan-forms-upload/lib/Upload.jsx @@ -169,15 +169,15 @@ class Upload extends PureComponent { const newValue = this.enableMultiple() ? removeNthItem(this.state.value, index): ''; this.context.addToAutofilledValues({[this.props.name]: newValue}); this.setState({ - preview: newValue, + preview: null, value: newValue, }); } render() { const { uploading, preview, value } = this.state; + // show the actual uploaded image or the preview - const imageData = this.enableMultiple() ? (preview ? value.concat(preview) : value) : value || preview; return ( From 3aeb21165330a41b1b751d225f867779fe86fc25 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Mon, 25 Dec 2017 15:39:22 +0900 Subject: [PATCH 65/69] Enable anonymous insert mutations (for event tracking) --- packages/vulcan-lib/lib/server/mutations.js | 14 ++++++++++---- packages/vulcan-users/lib/permissions.js | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/vulcan-lib/lib/server/mutations.js b/packages/vulcan-lib/lib/server/mutations.js index 99e90b83d..27de03a87 100644 --- a/packages/vulcan-lib/lib/server/mutations.js +++ b/packages/vulcan-lib/lib/server/mutations.js @@ -60,10 +60,12 @@ export const newMutation = async ({ collection, document, currentUser, validate, } - // check if userId field is in the schema and add it to document if needed - const userIdInSchema = Object.keys(schema).find(key => key === 'userId'); - if (!!userIdInSchema && !newDocument.userId) newDocument.userId = currentUser._id; - + // if user is logged in, check if userId field is in the schema and add it to document if needed + if (currentUser) { + const userIdInSchema = Object.keys(schema).find(key => key === 'userId'); + if (!!userIdInSchema && !newDocument.userId) newDocument.userId = currentUser._id; + } + // run onInsert step // note: cannot use forEach with async/await. // See https://stackoverflow.com/a/37576787/649299 @@ -236,3 +238,7 @@ export const removeMutation = async ({ collection, documentId, currentUser, vali return document; } + +export const newMutator = newMutation; +export const editMutator = editMutation; +export const removeMutator = removeMutation; \ No newline at end of file diff --git a/packages/vulcan-users/lib/permissions.js b/packages/vulcan-users/lib/permissions.js index c76c9e7ff..0022f1a62 100644 --- a/packages/vulcan-users/lib/permissions.js +++ b/packages/vulcan-users/lib/permissions.js @@ -251,7 +251,7 @@ Users.restrictViewableFields = function (user, collection, docOrDocs) { * @param {Object} field - The field being edited or inserted */ Users.canInsertField = function (user, field) { - if (user && field.insertableBy) { + if (field.insertableBy) { return typeof field.insertableBy === 'function' ? field.insertableBy(user) : Users.isMemberOf(user, field.insertableBy) } return false; @@ -263,7 +263,7 @@ Users.canInsertField = function (user, field) { * @param {Object} field - The field being edited or inserted */ Users.canEditField = function (user, field, document) { - if (user && field.editableBy) { + if (field.editableBy) { return typeof field.editableBy === 'function' ? field.editableBy(user, document) : Users.isMemberOf(user, field.editableBy) } return false; From 38b1df1fe47e0b51b8a718109bfab538dd5c0f27 Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Tue, 26 Dec 2017 11:16:49 +0900 Subject: [PATCH 66/69] vulcan-intercom -> vulcan-events-intercom --- .../README.md | 0 .../lib/client/intercom-client.js | 103 ++++++++++++++++++ .../vulcan-events-intercom/lib/client/main.js | 3 + .../lib/modules/index.js | 0 .../lib/server/intercom-server.js | 49 +++++++++ .../lib/server/main.js | 0 .../package.js | 5 +- packages/vulcan-intercom/lib/client/main.js | 1 - .../lib/components/IntercomWrapper.js | 23 ---- packages/vulcan-intercom/lib/modules/index.js | 1 - 10 files changed, 158 insertions(+), 27 deletions(-) rename packages/{vulcan-intercom => vulcan-events-intercom}/README.md (100%) create mode 100644 packages/vulcan-events-intercom/lib/client/intercom-client.js create mode 100644 packages/vulcan-events-intercom/lib/client/main.js create mode 100644 packages/vulcan-events-intercom/lib/modules/index.js create mode 100644 packages/vulcan-events-intercom/lib/server/intercom-server.js rename packages/{vulcan-intercom => vulcan-events-intercom}/lib/server/main.js (100%) rename packages/{vulcan-intercom => vulcan-events-intercom}/package.js (79%) delete mode 100644 packages/vulcan-intercom/lib/client/main.js delete mode 100644 packages/vulcan-intercom/lib/components/IntercomWrapper.js delete mode 100644 packages/vulcan-intercom/lib/modules/index.js diff --git a/packages/vulcan-intercom/README.md b/packages/vulcan-events-intercom/README.md similarity index 100% rename from packages/vulcan-intercom/README.md rename to packages/vulcan-events-intercom/README.md diff --git a/packages/vulcan-events-intercom/lib/client/intercom-client.js b/packages/vulcan-events-intercom/lib/client/intercom-client.js new file mode 100644 index 000000000..5767b30f1 --- /dev/null +++ b/packages/vulcan-events-intercom/lib/client/intercom-client.js @@ -0,0 +1,103 @@ +import { getSetting, addCallback, Utils } from 'meteor/vulcan:core'; +import { addPageFunction, addInitFunction, addIdentifyFunction, addTrackFunction } from 'meteor/vulcan:events'; + +/* + +Identify User + +*/ +function intercomIdentify(currentUser) { + intercomSettings = { + app_id: getSetting('intercom.appId'), + name: currentUser.displayName, + email: currentUser.email, + created_at: currentUser.createdAt, + _id: currentUser._id, + pageUrl: currentUser.pageUrl, + }; + (function() { + var w = window; + var ic = w.Intercom; + if (typeof ic === 'function') { + ic('reattach_activator'); + ic('update', intercomSettings); + } else { + var d = document; + var i = function() { + i.c(arguments); + }; + i.q = []; + i.c = function(args) { + i.q.push(args); + }; + w.Intercom = i; + function l() { + var s = d.createElement('script'); + s.type = 'text/javascript'; + s.async = true; + s.src = 'https://widget.intercom.io/widget/icygo7se'; + var x = d.getElementsByTagName('script')[0]; + x.parentNode.insertBefore(s, x); + } + if (w.attachEvent) { + w.attachEvent('onload', l); + } else { + w.addEventListener('load', l, false); + } + } + })(); +} +addIdentifyFunction(intercomIdentify); + +/* + +Track Event + +*/ +// function segmentTrack(eventName, eventProperties) { +// analytics.track(eventName, eventProperties); +// } +// addTrackFunction(segmentTrack); + +/* + +Init Snippet + +*/ +function intercomInit() { + window.intercomSettings = { + app_id: getSetting('intercom.appId'), + }; + (function() { + var w = window; + var ic = w.Intercom; + if (typeof ic === 'function') { + ic('reattach_activator'); + ic('update', intercomSettings); + } else { + var d = document; + var i = function() { + i.c(arguments); + }; + i.q = []; + i.c = function(args) { + i.q.push(args); + }; + w.Intercom = i; + function l() { + var s = d.createElement('script'); + s.type = 'text/javascript'; + s.async = true; + s.src = 'https://widget.intercom.io/widget/icygo7se'; + var x = d.getElementsByTagName('script')[0]; + x.parentNode.insertBefore(s, x); + } + if (w.attachEvent) { + w.attachEvent('onload', l); + } else { + w.addEventListener('load', l, false); + } + } + })(); +} +addInitFunction(intercomInit); diff --git a/packages/vulcan-events-intercom/lib/client/main.js b/packages/vulcan-events-intercom/lib/client/main.js new file mode 100644 index 000000000..e3113bcb6 --- /dev/null +++ b/packages/vulcan-events-intercom/lib/client/main.js @@ -0,0 +1,3 @@ +import './intercom-client.js'; + +export * from '../modules/index.js'; \ No newline at end of file diff --git a/packages/vulcan-events-intercom/lib/modules/index.js b/packages/vulcan-events-intercom/lib/modules/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/vulcan-events-intercom/lib/server/intercom-server.js b/packages/vulcan-events-intercom/lib/server/intercom-server.js new file mode 100644 index 000000000..cc15444f9 --- /dev/null +++ b/packages/vulcan-events-intercom/lib/server/intercom-server.js @@ -0,0 +1,49 @@ +import Intercom from 'intercom-client'; +import { getSetting, addCallback, Utils } from 'meteor/vulcan:core'; +import { addPageFunction, addUserFunction, addInitFunction, addIdentifyFunction, addTrackFunction } from 'meteor/vulcan:events'; + +const token = getSetting('intercom.accessToken'); + +if (!token) { + throw new Error('Please add your Intercom access token in settings.json'); +} else { + + const intercomClient = new Intercom.Client({ token }); + + const getDate = () => new Date().valueOf().toString().substr(0,10); + + /* + + New User + + */ + function intercomNewUser(user) { + intercomClient.users.create({ + email: user.email, + custom_attributes: { + name: user.displayName, + profileUrl: Users.getProfileUrl(user, true), + _id: user._id, + } + }); + } + addUserFunction(intercomNewUser); + + /* + + Track Event + + */ + function intercomTrackServer(eventName, eventProperties, currentUser) { + intercomClient.events.create({ + event_name: eventName, + created_at: getDate(), + email: currentUser.email, + metadata: { + ...eventProperties + } + }); + } + addTrackFunction(intercomTrackServer); + +} diff --git a/packages/vulcan-intercom/lib/server/main.js b/packages/vulcan-events-intercom/lib/server/main.js similarity index 100% rename from packages/vulcan-intercom/lib/server/main.js rename to packages/vulcan-events-intercom/lib/server/main.js diff --git a/packages/vulcan-intercom/package.js b/packages/vulcan-events-intercom/package.js similarity index 79% rename from packages/vulcan-intercom/package.js rename to packages/vulcan-events-intercom/package.js index fdce11f9a..98bd40188 100644 --- a/packages/vulcan-intercom/package.js +++ b/packages/vulcan-events-intercom/package.js @@ -1,5 +1,5 @@ Package.describe({ - name: 'vulcan:intercom', + name: 'vulcan:events-intercom', summary: 'Vulcan Intercom integration package.', version: '1.8.0', git: "https://github.com/VulcanJS/Vulcan.git" @@ -10,7 +10,8 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0' + 'vulcan:core@1.8.0', + 'vulcan:events@1.8.0' ]); api.mainModule("lib/client/main.js", "client"); diff --git a/packages/vulcan-intercom/lib/client/main.js b/packages/vulcan-intercom/lib/client/main.js deleted file mode 100644 index 29c383227..000000000 --- a/packages/vulcan-intercom/lib/client/main.js +++ /dev/null @@ -1 +0,0 @@ -export * from '../modules/index.js' \ No newline at end of file diff --git a/packages/vulcan-intercom/lib/components/IntercomWrapper.js b/packages/vulcan-intercom/lib/components/IntercomWrapper.js deleted file mode 100644 index df46d6022..000000000 --- a/packages/vulcan-intercom/lib/components/IntercomWrapper.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Components, replaceComponent, getSetting, withCurrentUser, Head } from 'meteor/vulcan:core'; -import React from 'react'; -import Intercom from 'react-intercom'; - -const IntercomWrapper = ({ currentUser }) => { - const appId = getSetting('intercom.appId'); - - if (!appId) { - console.warn('Please add intercom.appId to your public settings or disable the vulcan:intercom package.'); - return null; - } - - return currentUser ? : null; - -} - -Head.components.push([IntercomWrapper, withCurrentUser]); diff --git a/packages/vulcan-intercom/lib/modules/index.js b/packages/vulcan-intercom/lib/modules/index.js deleted file mode 100644 index 97609b655..000000000 --- a/packages/vulcan-intercom/lib/modules/index.js +++ /dev/null @@ -1 +0,0 @@ -import '../components/IntercomWrapper.js'; \ No newline at end of file From c75cd475cb4462ee9f5767e600ef779aca5ec52c Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Tue, 26 Dec 2017 11:17:44 +0900 Subject: [PATCH 67/69] Add new addUserFunction event function; make sure site url always has trailing '/'; document charge callbacks --- packages/vulcan-debug/lib/modules/routes.js | 2 +- packages/vulcan-events/lib/modules/events.js | 4 +++ packages/vulcan-lib/lib/modules/utils.js | 8 +++-- .../lib/server/integrations/stripe.js | 32 ++++++++++++++++--- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/packages/vulcan-debug/lib/modules/routes.js b/packages/vulcan-debug/lib/modules/routes.js index 1517f8590..a557289eb 100644 --- a/packages/vulcan-debug/lib/modules/routes.js +++ b/packages/vulcan-debug/lib/modules/routes.js @@ -4,7 +4,7 @@ addRoute([ // {name: 'cheatsheet', path: '/cheatsheet', component: import('./components/Cheatsheet.jsx')}, {name: 'groups', path: '/groups', component: () => getDynamicComponent(import('../components/Groups.jsx'))}, {name: 'settings', path: '/settings', componentName: 'Settings'}, - {name: 'settings', path: '/callbacks', componentName: 'Callbacks'}, + {name: 'callbacks', path: '/callbacks', componentName: 'Callbacks'}, // {name: 'emails', path: '/emails', component: () => getDynamicComponent(import('./components/Emails.jsx'))}, {name: 'emails', path: '/emails', componentName: 'Emails'}, ]); \ No newline at end of file diff --git a/packages/vulcan-events/lib/modules/events.js b/packages/vulcan-events/lib/modules/events.js index 2ebc21eed..c04a37279 100644 --- a/packages/vulcan-events/lib/modules/events.js +++ b/packages/vulcan-events/lib/modules/events.js @@ -20,6 +20,10 @@ export const track = async (eventName, eventProperties, currentUser) => { } }; +export const addUserFunction = f => { + addCallback('users.new.async', f); +}; + export const addIdentifyFunction = f => { addCallback('events.identify', f); }; diff --git a/packages/vulcan-lib/lib/modules/utils.js b/packages/vulcan-lib/lib/modules/utils.js index e5afc4da7..1d7e379fa 100644 --- a/packages/vulcan-lib/lib/modules/utils.js +++ b/packages/vulcan-lib/lib/modules/utils.js @@ -127,10 +127,14 @@ Utils.getDateRange = function(pageNumber) { ////////////////////////// /** - * @summary Returns the user defined site URL or Meteor.absoluteUrl + * @summary Returns the user defined site URL or Meteor.absoluteUrl. Add trailing '/' if missing */ Utils.getSiteUrl = function () { - return getSetting('siteUrl', Meteor.absoluteUrl()); + const url = getSetting('siteUrl', Meteor.absoluteUrl()); + if (url.slice(-1) !== '/') { + url += '/'; + } + return url; }; /** diff --git a/packages/vulcan-payments/lib/server/integrations/stripe.js b/packages/vulcan-payments/lib/server/integrations/stripe.js index 41940ee19..40675b905 100644 --- a/packages/vulcan-payments/lib/server/integrations/stripe.js +++ b/packages/vulcan-payments/lib/server/integrations/stripe.js @@ -1,4 +1,4 @@ -import { getSetting, registerSetting, newMutation, editMutation, Collections, runCallbacks, runCallbacksAsync } from 'meteor/vulcan:core'; +import { getSetting, registerSetting, newMutation, editMutation, Collections, registerCallback, runCallbacks, runCallbacksAsync } from 'meteor/vulcan:core'; import express from 'express'; import Stripe from 'stripe'; import { Picker } from 'meteor/meteorhacks:picker'; @@ -146,7 +146,7 @@ export const createCharge = async ({user, customer, product, collection, documen // create Stripe charge const charge = await stripe.charges.create(chargeData); - return processCharge({collection, document, charge, args}) + return processCharge({collection, document, charge, args, user}) } @@ -155,7 +155,7 @@ export const createCharge = async ({user, customer, product, collection, documen Process charge on Vulcan's side */ -export const processCharge = async ({collection, document, charge, args}) => { +export const processCharge = async ({collection, document, charge, args, user}) => { let returnDocument = {}; @@ -199,7 +199,7 @@ export const processCharge = async ({collection, document, charge, args}) => { } // run collection.charge.sync callbacks - modifier = runCallbacks(`${collection._name}.charge.sync`, modifier, document, chargeDoc); + modifier = runCallbacks(`${collection._name}.charge.sync`, modifier, document, chargeDoc, user); returnDocument = await editMutation({ collection, @@ -213,7 +213,7 @@ export const processCharge = async ({collection, document, charge, args}) => { } - runCallbacksAsync(`${collection._name}.charge.async`, returnDocument, chargeDoc); + runCallbacksAsync(`${collection._name}.charge.async`, returnDocument, chargeDoc, user); return returnDocument; } @@ -431,3 +431,25 @@ webAppConnectHandlersUse(Meteor.bindEnvironment(app), {name: 'stripe_endpoint', // res.end(); // }); + +Meteor.startup(() => { + Collections.forEach(c => { + collectionName = c._name.toLowerCase(); + + registerCallback({ + name: `${collectionName}.charge.sync`, + description: `Modify the modifier used to add charge ids to the charge's associated document.`, + arguments: [{modifier: 'The modifier'}, {document: 'The associated document'}, {charge: 'The charge'}, {currentUser: 'The current user'}], + runs: 'sync', + returns: 'modifier', + }); + + registerCallback({ + name: `${collectionName}.charge.sync`, + description: `Perform operations after the charge has succeeded.`, + arguments: [{document: 'The associated document'}, {charge: 'The charge'}, {currentUser: 'The current user'}], + runs: 'async', + }); + + }) +}) \ No newline at end of file From b7404f88ae41e48c215be286fc259bbe61220b9b Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 27 Dec 2017 09:55:06 +0900 Subject: [PATCH 68/69] Fix segment identify --- packages/vulcan-events-segment/lib/client/segment-client.js | 2 +- packages/vulcan-lib/lib/modules/callbacks.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vulcan-events-segment/lib/client/segment-client.js b/packages/vulcan-events-segment/lib/client/segment-client.js index da80fc866..b733d1e52 100644 --- a/packages/vulcan-events-segment/lib/client/segment-client.js +++ b/packages/vulcan-events-segment/lib/client/segment-client.js @@ -28,7 +28,7 @@ Identify User */ function segmentIdentify(currentUser) { - window.analytics.identify(currentUser.userId, { + window.analytics.identify(currentUser._id, { email: currentUser.email, pageUrl: currentUser.pageUrl, }); diff --git a/packages/vulcan-lib/lib/modules/callbacks.js b/packages/vulcan-lib/lib/modules/callbacks.js index 0360efdc3..b390dd08a 100644 --- a/packages/vulcan-lib/lib/modules/callbacks.js +++ b/packages/vulcan-lib/lib/modules/callbacks.js @@ -87,7 +87,7 @@ export const runCallbacks = function () { if (typeof result === 'undefined') { // if result of current iteration is undefined, don't pass it on - debug(`// Warning: Sync callback [${callback.name}] in hook [${hook}] didn't return a result!`) + // debug(`// Warning: Sync callback [${callback.name}] in hook [${hook}] didn't return a result!`) return accumulator } else { return result; From fc3a5d58b1c442f2af3c181c631ff353e36366dd Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 27 Dec 2017 09:56:49 +0900 Subject: [PATCH 69/69] v1.8.1 --- package.json | 2 +- packages/example-forum/package.js | 8 ++++---- packages/vulcan-accounts/package.js | 4 ++-- packages/vulcan-admin/package.js | 4 ++-- packages/vulcan-cloudinary/package.js | 4 ++-- packages/vulcan-core/package.js | 14 +++++++------- packages/vulcan-debug/package.js | 6 +++--- packages/vulcan-email/package.js | 4 ++-- packages/vulcan-embed/package.js | 4 ++-- packages/vulcan-events-ga/package.js | 6 +++--- packages/vulcan-events-intercom/package.js | 6 +++--- packages/vulcan-events-internal/package.js | 6 +++--- packages/vulcan-events-segment/package.js | 6 +++--- packages/vulcan-events/package.js | 4 ++-- packages/vulcan-forms-tags/package.js | 6 +++--- packages/vulcan-forms-upload/package.js | 6 +++--- packages/vulcan-forms/package.js | 4 ++-- packages/vulcan-i18n-en-us/package.js | 4 ++-- packages/vulcan-i18n/package.js | 4 ++-- packages/vulcan-lib/lib/modules/config.js | 2 +- packages/vulcan-lib/package.js | 2 +- packages/vulcan-newsletter/package.js | 6 +++--- packages/vulcan-payments/package.js | 4 ++-- packages/vulcan-routing/package.js | 4 ++-- packages/vulcan-subscribe/package.js | 10 +++++----- packages/vulcan-users/package.js | 4 ++-- packages/vulcan-voting/package.js | 6 +++--- 27 files changed, 70 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index d01f35d87..89b311a70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Vulcan", - "version": "1.8.0", + "version": "1.8.1", "engines": { "npm": "^3.0" }, diff --git a/packages/example-forum/package.js b/packages/example-forum/package.js index cfd5af0ef..1799a0bbd 100644 --- a/packages/example-forum/package.js +++ b/packages/example-forum/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "example-forum", summary: "Vulcan forum package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -14,11 +14,11 @@ Package.onUse(function (api) { 'fourseven:scss@4.5.0', // vulcan core - 'vulcan:core@1.8.0', + 'vulcan:core@1.8.1', // vulcan packages - 'vulcan:voting@1.8.0', - 'vulcan:accounts@1.8.0', + 'vulcan:voting@1.8.1', + 'vulcan:accounts@1.8.1', 'vulcan:email', 'vulcan:forms', 'vulcan:newsletter', diff --git a/packages/vulcan-accounts/package.js b/packages/vulcan-accounts/package.js index 747b03fa2..78bedfb1e 100755 --- a/packages/vulcan-accounts/package.js +++ b/packages/vulcan-accounts/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'vulcan:accounts', - version: '1.8.0', + version: '1.8.1', summary: 'Accounts UI for React in Meteor 1.3+', git: 'https://github.com/studiointeract/accounts-ui', documentation: 'README.md' @@ -9,7 +9,7 @@ Package.describe({ Package.onUse(function(api) { api.versionsFrom('1.3'); - api.use('vulcan:core@1.8.0'); + api.use('vulcan:core@1.8.1'); api.use('ecmascript'); api.use('tracker'); diff --git a/packages/vulcan-admin/package.js b/packages/vulcan-admin/package.js index 0d421bdef..804f55e4a 100644 --- a/packages/vulcan-admin/package.js +++ b/packages/vulcan-admin/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:admin", summary: "Vulcan components package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -14,7 +14,7 @@ Package.onUse(function (api) { 'fourseven:scss@4.5.0', 'dynamic-import@0.1.1', // Vulcan packages - 'vulcan:core@1.8.0', + 'vulcan:core@1.8.1', ]); diff --git a/packages/vulcan-cloudinary/package.js b/packages/vulcan-cloudinary/package.js index 77522ff65..4213fd5f7 100644 --- a/packages/vulcan-cloudinary/package.js +++ b/packages/vulcan-cloudinary/package.js @@ -1,7 +1,7 @@ Package.describe({ name: 'vulcan:cloudinary', summary: 'Vulcan file upload package.', - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,7 +10,7 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0' + 'vulcan:core@1.8.1' ]); api.mainModule("lib/client/main.js", "client"); diff --git a/packages/vulcan-core/package.js b/packages/vulcan-core/package.js index 6d03391ae..df0552f42 100644 --- a/packages/vulcan-core/package.js +++ b/packages/vulcan-core/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:core", summary: "Vulcan core package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,15 +10,15 @@ Package.onUse(function(api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:lib@1.8.0', - 'vulcan:i18n@1.8.0', - 'vulcan:users@1.8.0', - 'vulcan:routing@1.8.0', - 'vulcan:debug@1.8.0', + 'vulcan:lib@1.8.1', + 'vulcan:i18n@1.8.1', + 'vulcan:users@1.8.1', + 'vulcan:routing@1.8.1', + 'vulcan:debug@1.8.1', ]); api.imply([ - 'vulcan:lib@1.8.0' + 'vulcan:lib@1.8.1' ]); api.mainModule('lib/server/main.js', 'server'); diff --git a/packages/vulcan-debug/package.js b/packages/vulcan-debug/package.js index c14b96fc9..46b2b2abe 100644 --- a/packages/vulcan-debug/package.js +++ b/packages/vulcan-debug/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:debug", summary: "Vulcan debug package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git", debugOnly: true }); @@ -17,8 +17,8 @@ Package.onUse(function (api) { // Vulcan packages - 'vulcan:lib@1.8.0', - 'vulcan:email@1.8.0', + 'vulcan:lib@1.8.1', + 'vulcan:email@1.8.1', ]); diff --git a/packages/vulcan-email/package.js b/packages/vulcan-email/package.js index 8dad243df..1cca49b40 100644 --- a/packages/vulcan-email/package.js +++ b/packages/vulcan-email/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:email", summary: "Vulcan email package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,7 +10,7 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:lib@1.8.0' + 'vulcan:lib@1.8.1' ]); api.mainModule("lib/server.js", "server"); diff --git a/packages/vulcan-embed/package.js b/packages/vulcan-embed/package.js index 9b881c415..3b0c2f4a7 100644 --- a/packages/vulcan-embed/package.js +++ b/packages/vulcan-embed/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:embed", summary: "Vulcan Embed package", - version: '1.8.0', + version: '1.8.1', git: 'https://github.com/VulcanJS/Vulcan.git' }); @@ -10,7 +10,7 @@ Package.onUse( function(api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', + 'vulcan:core@1.8.1', 'fourseven:scss@4.5.0' ]); diff --git a/packages/vulcan-events-ga/package.js b/packages/vulcan-events-ga/package.js index 98f68b942..d98194730 100644 --- a/packages/vulcan-events-ga/package.js +++ b/packages/vulcan-events-ga/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:events-ga", summary: "Vulcan Google Analytics event tracking package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,8 +10,8 @@ Package.onUse(function(api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', - 'vulcan:events@1.8.0', + 'vulcan:core@1.8.1', + 'vulcan:events@1.8.1', ]); api.mainModule("lib/server/main.js", "server"); diff --git a/packages/vulcan-events-intercom/package.js b/packages/vulcan-events-intercom/package.js index 98bd40188..d9bcd25f4 100644 --- a/packages/vulcan-events-intercom/package.js +++ b/packages/vulcan-events-intercom/package.js @@ -1,7 +1,7 @@ Package.describe({ name: 'vulcan:events-intercom', summary: 'Vulcan Intercom integration package.', - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,8 +10,8 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', - 'vulcan:events@1.8.0' + 'vulcan:core@1.8.1', + 'vulcan:events@1.8.1' ]); api.mainModule("lib/client/main.js", "client"); diff --git a/packages/vulcan-events-internal/package.js b/packages/vulcan-events-internal/package.js index 8277bb01c..18231cc12 100644 --- a/packages/vulcan-events-internal/package.js +++ b/packages/vulcan-events-internal/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:events-internal", summary: "Vulcan internal event tracking package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,8 +10,8 @@ Package.onUse(function(api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', - 'vulcan:events@1.8.0', + 'vulcan:core@1.8.1', + 'vulcan:events@1.8.1', ]); api.mainModule("lib/server/main.js", "server"); diff --git a/packages/vulcan-events-segment/package.js b/packages/vulcan-events-segment/package.js index 837a63839..d5544bd57 100644 --- a/packages/vulcan-events-segment/package.js +++ b/packages/vulcan-events-segment/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:events-segment", summary: "Vulcan Segment", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,8 +10,8 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', - 'vulcan:events@1.8.0', + 'vulcan:core@1.8.1', + 'vulcan:events@1.8.1', ]); api.mainModule('lib/server/main.js', 'server'); diff --git a/packages/vulcan-events/package.js b/packages/vulcan-events/package.js index fb723f257..96748fbf1 100644 --- a/packages/vulcan-events/package.js +++ b/packages/vulcan-events/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:events", summary: "Vulcan event tracking package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,7 +10,7 @@ Package.onUse(function(api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', + 'vulcan:core@1.8.1', ]); api.mainModule("lib/server/main.js", "server"); diff --git a/packages/vulcan-forms-tags/package.js b/packages/vulcan-forms-tags/package.js index e5a33244f..9872f60b4 100644 --- a/packages/vulcan-forms-tags/package.js +++ b/packages/vulcan-forms-tags/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:forms-tags", summary: "Vulcan tag input package", - version: '1.8.0', + version: '1.8.1', git: 'https://github.com/VulcanJS/Vulcan.git' }); @@ -10,8 +10,8 @@ Package.onUse( function(api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', - 'vulcan:forms@1.8.0' + 'vulcan:core@1.8.1', + 'vulcan:forms@1.8.1' ]); api.mainModule("lib/export.js", ["client", "server"]); diff --git a/packages/vulcan-forms-upload/package.js b/packages/vulcan-forms-upload/package.js index 734df83c4..62c0d2b7b 100755 --- a/packages/vulcan-forms-upload/package.js +++ b/packages/vulcan-forms-upload/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:forms-upload", summary: "Vulcan package extending vulcan:forms to upload images to Cloudinary from a drop zone.", - version: "1.8.0", + version: "1.8.1", git: 'https://github.com/xavcz/nova-forms-upload.git' }); @@ -10,8 +10,8 @@ Package.onUse( function(api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', - 'vulcan:forms@1.8.0', + 'vulcan:core@1.8.1', + 'vulcan:forms@1.8.1', 'fourseven:scss@4.5.0' ]); diff --git a/packages/vulcan-forms/package.js b/packages/vulcan-forms/package.js index 16b66720f..fc1480b8d 100644 --- a/packages/vulcan-forms/package.js +++ b/packages/vulcan-forms/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:forms", summary: "Form containers for React", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/meteor-utilities/react-form-containers.git" }); @@ -10,7 +10,7 @@ Package.onUse(function(api) { api.versionsFrom("METEOR@1.3"); api.use([ - 'vulcan:core@1.8.0', + 'vulcan:core@1.8.1', 'fourseven:scss@4.5.0' ]); diff --git a/packages/vulcan-i18n-en-us/package.js b/packages/vulcan-i18n-en-us/package.js index 73f0b25a8..7088320a4 100644 --- a/packages/vulcan-i18n-en-us/package.js +++ b/packages/vulcan-i18n-en-us/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:i18n-en-us", summary: "Vulcan i18n package (en_US)", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,7 +10,7 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0' + 'vulcan:core@1.8.1' ]); api.addFiles([ diff --git a/packages/vulcan-i18n/package.js b/packages/vulcan-i18n/package.js index 74ed019af..f93ba0a78 100644 --- a/packages/vulcan-i18n/package.js +++ b/packages/vulcan-i18n/package.js @@ -1,14 +1,14 @@ Package.describe({ name: 'vulcan:i18n', summary: "i18n client polyfill", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan" }); Package.onUse(function (api) { api.use([ - 'vulcan:lib@1.8.0', + 'vulcan:lib@1.8.1', ]); api.mainModule('lib/server/main.js', 'server'); diff --git a/packages/vulcan-lib/lib/modules/config.js b/packages/vulcan-lib/lib/modules/config.js index cc320363e..a4dd21c80 100644 --- a/packages/vulcan-lib/lib/modules/config.js +++ b/packages/vulcan-lib/lib/modules/config.js @@ -7,7 +7,7 @@ import SimpleSchema from 'simpl-schema'; Vulcan = {}; -Vulcan.VERSION = '1.8.0'; +Vulcan.VERSION = '1.8.1'; // ------------------------------------- Schemas -------------------------------- // diff --git a/packages/vulcan-lib/package.js b/packages/vulcan-lib/package.js index 782e669ce..df718f90c 100644 --- a/packages/vulcan-lib/package.js +++ b/packages/vulcan-lib/package.js @@ -1,7 +1,7 @@ Package.describe({ name: 'vulcan:lib', summary: 'Vulcan libraries.', - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); diff --git a/packages/vulcan-newsletter/package.js b/packages/vulcan-newsletter/package.js index c722fe1eb..e2b62c916 100644 --- a/packages/vulcan-newsletter/package.js +++ b/packages/vulcan-newsletter/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:newsletter", summary: "Vulcan email newsletter package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,8 +10,8 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', - 'vulcan:email@1.8.0' + 'vulcan:core@1.8.1', + 'vulcan:email@1.8.1' ]); api.mainModule('lib/server/main.js', 'server'); diff --git a/packages/vulcan-payments/package.js b/packages/vulcan-payments/package.js index 5e3997a1f..031bf29a6 100644 --- a/packages/vulcan-payments/package.js +++ b/packages/vulcan-payments/package.js @@ -1,14 +1,14 @@ Package.describe({ name: 'vulcan:payments', summary: "Vulcan payments package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); Package.onUse(function (api) { api.use([ - 'vulcan:core@1.8.0', + 'vulcan:core@1.8.1', 'fourseven:scss@4.5.4', ]); diff --git a/packages/vulcan-routing/package.js b/packages/vulcan-routing/package.js index 423630959..96875ffa9 100644 --- a/packages/vulcan-routing/package.js +++ b/packages/vulcan-routing/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:routing", summary: "Vulcan router package", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,7 +10,7 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:lib@1.8.0', + 'vulcan:lib@1.8.1', ]); api.mainModule('lib/server/main.js', 'server'); diff --git a/packages/vulcan-subscribe/package.js b/packages/vulcan-subscribe/package.js index c99f4a8f2..249d06393 100644 --- a/packages/vulcan-subscribe/package.js +++ b/packages/vulcan-subscribe/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:subscribe", summary: "Subscribe to posts, users, etc. to be notified of new activity", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -11,14 +11,14 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:core@1.8.0', + 'vulcan:core@1.8.1', // dependencies on posts, categories are done with nested imports to reduce explicit dependencies ]); api.use([ - 'vulcan:posts@1.8.0', - 'vulcan:comments@1.8.0', - 'vulcan:categories@1.8.0', + 'vulcan:posts@1.8.1', + 'vulcan:comments@1.8.1', + 'vulcan:categories@1.8.1', ], {weak: true}); api.mainModule("lib/modules.js", ["client"]); diff --git a/packages/vulcan-users/package.js b/packages/vulcan-users/package.js index ba8d4ff56..7876b5c07 100644 --- a/packages/vulcan-users/package.js +++ b/packages/vulcan-users/package.js @@ -1,7 +1,7 @@ Package.describe({ name: 'vulcan:users', summary: 'Vulcan permissions.', - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -10,7 +10,7 @@ Package.onUse(function (api) { api.versionsFrom('METEOR@1.5.2'); api.use([ - 'vulcan:lib@1.8.0' + 'vulcan:lib@1.8.1' ]); api.mainModule("lib/server.js", "server"); diff --git a/packages/vulcan-voting/package.js b/packages/vulcan-voting/package.js index b1590ab5d..75b77af32 100644 --- a/packages/vulcan-voting/package.js +++ b/packages/vulcan-voting/package.js @@ -1,7 +1,7 @@ Package.describe({ name: "vulcan:voting", summary: "Vulcan scoring package.", - version: '1.8.0', + version: '1.8.1', git: "https://github.com/VulcanJS/Vulcan.git" }); @@ -11,8 +11,8 @@ Package.onUse(function (api) { api.use([ 'fourseven:scss@4.5.0', - 'vulcan:core@1.8.0', - 'vulcan:i18n@1.8.0', + 'vulcan:core@1.8.1', + 'vulcan:i18n@1.8.1', ], ['client', 'server']); api.mainModule("lib/server/main.js", "server");