diff --git a/components/pages/events/Event/index.vue b/components/pages/events/Event/index.vue new file mode 100644 index 0000000..0032315 --- /dev/null +++ b/components/pages/events/Event/index.vue @@ -0,0 +1,35 @@ + + + diff --git a/components/pages/events/index.vue b/components/pages/events/index.vue index b3596f4..1dd4abd 100644 --- a/components/pages/events/index.vue +++ b/components/pages/events/index.vue @@ -2,7 +2,14 @@
-
+ + + + + + +
+
@@ -19,29 +26,11 @@ import auth from "~/utils/auth"; - // import LoadFailed from "./Messages/LoadFailed"; - // import NotViewable from "./Messages/NotViewable"; - // import SubmitFailed from "./Messages/SubmitFailed"; - // import SubmitSuccessful from "./Messages/SubmitSuccessful"; - // import Alerts from "./Alerts"; - // import TopBar from "./TopBar"; - // import PackageSelector from "./PackageSelector"; - // import ProductsForm from "./ProductsForm"; - // import PropertyInfo from "./Info"; - // import RealtorFrame from "./RealtorFrame"; + import Event from "./Event"; export default { components: { - // Alerts, - // LoadFailed, - // NotViewable, - // TopBar, - // PackageSelector, - // ProductsForm, - // PropertyInfo, - // RealtorFrame, - // SubmitFailed, - // SubmitSuccessful + Event }, data() { return { @@ -54,136 +43,7 @@ selectedPackage: undefined, selectedImages: [], submitError: "", - user: undefined, - columns: [ - { - title: 'Datum', - key: 'date' - }, - { - title: 'Tid', - key: 'time' - }, - { - title: 'Band', - render: (h, params) => { - const inner = Array(h('span', ' ' + params.row.band.name + ' ')); - if (this.hasUser) { - inner.push(h('Icon', { - props: { - type: 'ios-eye-off' - }, - attrs: { - title: 'Dölj' - }, - on: { - click: () => { - this.ignoreBand({name: params.row.band.name}) - } - } - }, 'Dölj')); - } - - return h('div', inner); - } - }, - { - title: 'Dansställe', - render: (h, params) => { - const inner = Array(h('span', ' ' + params.row.danceHall.name + ' ')); - if (this.hasUser) { - inner.push(h('Icon', { - props: { - type: 'ios-eye-off' - }, - attrs: { - title: 'Dölj' - }, - on: { - click: () => { - this.ignoreDanceHall({name: params.row.danceHall.name}) - } - } - }, 'Dölj')); - } - - return h('div', inner); - } - }, - { - title: 'Stad', - render: (h, params) => { - const inner = Array(h('span', ' ' + params.row.danceHall.city + ' ')); - if (this.hasUser) { - inner.push(h('Icon', { - props: { - type: 'ios-eye-off' - }, - attrs: { - title: 'Dölj' - }, - on: { - click: () => { - this.ignoreCity({name: params.row.danceHall.city}) - } - } - }, 'Dölj')); - } - - return h('div', inner); - } - }, - { - title: 'Kommun', - render: (h, params) => { - const inner = Array(h('span', ' ' + params.row.danceHall.municipality + ' ')); - if (this.hasUser) { - inner.push(h('Icon', { - props: { - type: 'ios-eye-off' - }, - attrs: { - title: 'Dölj' - }, - on: { - click: () => { - this.ignoreMunicipality({name: params.row.danceHall.municipality}) - } - } - }, 'Dölj')); - } - - return h('div', inner); - } - }, - { - title: 'Län', - render: (h, params) => { - const inner = Array(h('span', ' ' + params.row.danceHall.state + ' ')); - if (this.hasUser) { - inner.push(h('Icon', { - props: { - type: 'ios-eye-off' - }, - attrs: { - title: 'Dölj' - }, - on: { - click: () => { - this.ignoreState({name: params.row.danceHall.state}) - } - } - }, 'Dölj')); - } - - return h('div', inner); - } - }, - { - title: 'Övrigt', - key: 'extraInfo' - } - ] + user: undefined }; }, computed: { @@ -209,7 +69,7 @@ return this.status === "no-packages"; }, hasUser() { - return this.user; + return this.user !== undefined && this.user !== null; } }, mounted() { @@ -237,36 +97,45 @@ fetchUser() { this.user = auth.getUserInfo(); }, - ignoreBand(name) { - ignoreBand(name) - .then(this.ignoreSuccess) - .catch(this.ignoreFailed) + ignore(type, name) { + switch (type) { + case 'band': + ignoreBand({name: name}) + .then(this.ignoreSuccess(name)) + .catch(this.ignoreFailed); + break; + case 'danceHall': + ignoreDanceHall({name: name}) + .then(this.ignoreSuccess(name)) + .catch(this.ignoreFailed); + break; + case 'city': + ignoreCity({name: name}) + .then(this.ignoreSuccess(name)) + .catch(this.ignoreFailed); + break; + case 'municipality': + ignoreMunicipality({name: name} + .then(this.ignoreSuccess(name)) + .catch(this.ignoreFailed)); + break; + case 'state': + ignoreState({name: name}) + .then(this.ignoreSuccess(name)) + .catch(this.ignoreFailed); + break; + } }, - ignoreDanceHall(name) { - ignoreDanceHall(name) - .then(this.ignoreSuccess) - .catch(this.ignoreFailed) + ignoreSuccess(name) { + return () => { + this.$Message.success(`${name} har dolts`); + this.fetchEvents(); + } }, - ignoreCity(name) { - ignoreCity(name) - .then(this.ignoreSuccess) - .catch(this.ignoreFailed) - }, - ignoreMunicipality(name) { - ignoreMunicipality(name) - .then(this.ignoreSuccess) - .catch(this.ignoreFailed) - }, - ignoreState(name) { - ignoreState(name) - .then(this.ignoreSuccess) - .catch(this.ignoreFailed) - }, - ignoreSuccess(response) { - this.fetchEvents() - }, - ignoreFailed() { - + ignoreFailed(name) { + return () => { + this.$Message.error(`${name} kunde inte döljas`); + } } // switchPackage(pack) { // this.selectedPackage = pack; @@ -334,6 +203,10 @@ position: relative; } + .eventRow { + margin-bottom: 1.5rem; + } + @media screen and(max-width: 1200px) { .left { width: 40vw; diff --git a/package.json b/package.json index b19be76..6fd9c3e 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,14 @@ "author": "Joakim Olsson ", "private": true, "dependencies": { - "apollo-fetch": "^0.7.0", + "apollo-link": "^1.2.6", + "apollo-link-error": "^1.1.5", + "apollo-link-http": "^1.5.9", "auth0-js": "^9.9.0", "eslint": "^5.1.0", "eslint-plugin-vue": "^4.5.0", + "graphql": "^14.1.1", + "graphql-tag": "^2.10.1", "iview": "^3.0.0", "lodash": "^4.17.10", "node-sass": "^4.9.0", diff --git a/server/index.js b/server/index.js index 879982f..34e4753 100644 --- a/server/index.js +++ b/server/index.js @@ -23,9 +23,9 @@ if (config.dev) { // Add graphql mocking middleware //addGraphMiddleware(app); -app.use('/graph', proxy('localhost:8081', { +app.use('/graph/', proxy('localhost:8081', { proxyReqPathResolver: function (req) { - return '/graph'; + return '/graph/'; } } ) diff --git a/utils/auth-client/index.js b/utils/auth-client/index.js index 3c6fe1b..9d79899 100644 --- a/utils/auth-client/index.js +++ b/utils/auth-client/index.js @@ -64,6 +64,16 @@ export default class AuthenticationClient { window.location.href = url; } + checkSession(resolve, reject) { + this.webAuth.checkSession({state: {}}, (err, result) => { + if (err) { + return reject(err || 'Re-authentication failed'); + } else { + return this.storeSession(result, resolve, reject); + } + }); + } + storeSession(authResult, resolve, reject) { this.webAuth.client.userInfo(authResult.accessToken, (err, user) => { if (err) { diff --git a/utils/auth.js b/utils/auth.js index 888503b..85b1db9 100644 --- a/utils/auth.js +++ b/utils/auth.js @@ -8,7 +8,7 @@ const auth0Config = { domain: "unbound.eu.auth0.com", clientID: "orQfnvCPUR5C3mJkKoiWLQHOVQsBn60e", redirectUri: getRedirectUri(), - audience: "https://unbound.eu.auth0.com/userinfo", + audience: "http://dancefinder.unbound.se", responseType: "token id_token", scope: "openid profile" }; diff --git a/utils/graph-client/middleware.js b/utils/graph-client/middleware.js index aacf1aa..f9bae9a 100644 --- a/utils/graph-client/middleware.js +++ b/utils/graph-client/middleware.js @@ -1,15 +1,11 @@ +const webAuth = require("../auth").default; + module.exports = { - includeCredentials: (tokenFn) => { - return ({options}, next) => { - if (!options.headers) { - options.headers = {}; // Create the headers object if needed. - } - const token = tokenFn(); - if (token) { - options.headers['Authorization'] = 'Bearer ' + tokenFn(); - } - options.credentials = 'same-origin'; // eslint-disable-line - next(); + includeCredentials: (uri, options) => { + const token = webAuth.idToken(); + if (token) { + options.headers['Authorization'] = 'Bearer ' + token; } - }, + return fetch(uri, options); + } }; diff --git a/utils/graph-client/mutations.js b/utils/graph-client/mutations.js index d7f16e7..49893ee 100644 --- a/utils/graph-client/mutations.js +++ b/utils/graph-client/mutations.js @@ -6,22 +6,21 @@ import { ignoreMunicipalityMutation, ignoreStateMutation, } from './mutationStrings'; -import webAuth from '../auth'; /* eslint-disable max-len */ export const ignoreBand = variables => { - return createQuery(webAuth.idToken, ignoreBandMutation, variables) + return createQuery(ignoreBandMutation, variables) }; export const ignoreDanceHall = variables => { - return createQuery(webAuth.idToken, ignoreDanceHallMutation, variables) + return createQuery(ignoreDanceHallMutation, variables) }; export const ignoreCity = variables => { - return createQuery(webAuth.idToken, ignoreCityMutation, variables) + return createQuery(ignoreCityMutation, variables) }; export const ignoreMunicipality = variables => { - return createQuery(webAuth.idToken, ignoreMunicipalityMutation, variables) + return createQuery(ignoreMunicipalityMutation, variables) }; export const ignoreState = variables => { - return createQuery(webAuth.idToken, ignoreStateMutation, variables) + return createQuery(ignoreStateMutation, variables) }; /* eslint-enable max-len */ diff --git a/utils/graph-client/queries.js b/utils/graph-client/queries.js index 7e41c70..fc94199 100644 --- a/utils/graph-client/queries.js +++ b/utils/graph-client/queries.js @@ -2,9 +2,7 @@ import { createQuery } from './utils'; import { eventQuery, } from './queryStrings'; -import webAuth from '../auth'; - /* eslint-disable max-len */ -export const findEvents = () => createQuery(webAuth.idToken, eventQuery); +export const findEvents = () => createQuery(eventQuery); /* eslint-enable max-len */ diff --git a/utils/graph-client/utils.js b/utils/graph-client/utils.js index e2fa0f2..5676ce4 100644 --- a/utils/graph-client/utils.js +++ b/utils/graph-client/utils.js @@ -1,13 +1,48 @@ -const { createApolloFetch } = require('apollo-fetch'); +import { execute, makePromise, ApolloLink } from 'apollo-link'; +import { HttpLink } from 'apollo-link-http'; +import gql from 'graphql-tag'; const { includeCredentials } = require('./middleware'); +import { onError } from 'apollo-link-error'; +import { default as webAuth} from '../auth'; const defaultGraphUri = '/graph/'; +const httpLink = new HttpLink({ uri: defaultGraphUri, fetch: includeCredentials, credentials: 'same-origin' }); +const errorLink = onError(({ graphQLErrors, networkError, operation, forward }) => { + if (graphQLErrors) { + console.log('GraphQL errors:', graphQLErrors); + // for (let err of graphQLErrors) { + // switch (err.extensions.code) { + // case 'UNAUTHENTICATED': + // // error code is set to UNAUTHENTICATED + // // when AuthenticationError thrown in resolver + // + // // modify the operation context with a new token + // } + // } + } + if (networkError) { + if (networkError.statusCode === 401) { + webAuth.checkSession((response) => { + const oldHeaders = operation.getContext().headers; + operation.setContext({ + headers: { + ...oldHeaders, + authorization: webAuth.idToken(), + }, + }); + return forward(operation); + }, (err) => { + console.log(err); + }); + } + } + } +); -export const createQuery = (tokenFn, query, variables) => { // eslint-disable-line - const apollo = createApolloFetch({ uri: defaultGraphUri }); - - apollo.use(includeCredentials(tokenFn)); - // apollo.useAfter(trackErrors); - - return apollo({ query, variables }); +export const createQuery = (query, variables) => { // eslint-disable-line + const operation = { + query: gql(query), + variables: variables + }; + return makePromise(execute(ApolloLink.from([errorLink, httpLink]), operation)); }; diff --git a/yarn.lock b/yarn.lock index 69a859f..a1820d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1300,12 +1300,43 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -apollo-fetch@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/apollo-fetch/-/apollo-fetch-0.7.0.tgz#63c255a0ccb1b4c473524d8f9b536d72438bd3e7" - integrity sha512-0oHsDW3Zxx+Of1wuqcOXruNj4Kv55WN69tkIjwkCQDEIrgCpgA2scjChFsgflSVMy/1mkTKCY1Mc0TYJhNRzmw== +apollo-link-error@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.5.tgz#1d600dfa75c4e4bf017f50d60da7b375b53047ab" + integrity sha512-gE0P711K+rI3QcTzfYhzRI9axXaiuq/emu8x8Y5NHK9jl9wxh7qmEc3ZTyGpnGFDDTXfhalmX17X5lp3RCVHDQ== dependencies: - cross-fetch "^1.0.0" + apollo-link "^1.2.6" + apollo-link-http-common "^0.2.8" + +apollo-link-http-common@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.8.tgz#c6deedfc2739db8b11013c3c2d2ccd657152941f" + integrity sha512-gGmXZN8mr7e9zjopzKQfZ7IKnh8H12NxBDzvp9nXI3U82aCVb72p+plgoYLcpMY8w6krvoYjgicFmf8LO20TCQ== + dependencies: + apollo-link "^1.2.6" + +apollo-link-http@^1.5.9: + version "1.5.9" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.9.tgz#9046f5640a94c8a8b508a39e0f2c628b781baecc" + integrity sha512-9tJy2zGm4Cm/1ycScDNZJe51dgnTSfKx7pKIgPZmcxkdDpgUY2DZitDH6ZBv4yp9z8MC9Xr9wgwc29s6hcadUQ== + dependencies: + apollo-link "^1.2.6" + apollo-link-http-common "^0.2.8" + +apollo-link@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.6.tgz#d9b5676d79c01eb4e424b95c7171697f6ad2b8da" + integrity sha512-sUNlA20nqIF3gG3F8eyMD+mO80fmf3dPZX+GUOs3MI9oZR8ug09H3F0UsWJMcpEg6h55Yy5wZ+BMmAjrbenF/Q== + dependencies: + apollo-utilities "^1.0.0" + zen-observable-ts "^0.8.13" + +apollo-utilities@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.1.0.tgz#e7603f834b57e4e109be6b450dc1cc1037aac94c" + integrity sha512-D3scmF6vJkCBECMasMEc0J9dNNHVULl6h2d7/oGJxWid1fgcAPHZJN5XLCZisuOfn0Dvvu3Unf/zK00Z3e49Qg== + dependencies: + fast-json-stable-stringify "^2.0.0" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" @@ -2388,14 +2419,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-fetch@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-1.1.1.tgz#dede6865ae30f37eae62ac90ebb7bdac002b05a0" - integrity sha512-+VJE04+UfxxmBfcnmAu/lKor53RUCx/1ilOti4p+JgrnLQ4AZZIRoe2OEd76VaHyWQmQxqKnV+TaqjHC4r0HWw== - dependencies: - node-fetch "1.7.3" - whatwg-fetch "2.0.3" - cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -3034,13 +3057,6 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -3838,6 +3854,18 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graphql-tag@^2.10.1: + version "2.10.1" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02" + integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg== + +graphql@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.1.1.tgz#d5d77df4b19ef41538d7215d1e7a28834619fac0" + integrity sha512-C5zDzLqvfPAgTtP8AUPIt9keDabrdRAqSWjj2OPRKrKxI9Fb65I36s1uCs1UUBFnSWTdO7hyHi7z1ZbwKMKF6Q== + dependencies: + iterall "^1.2.2" + gzip-size@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" @@ -4079,7 +4107,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4472,7 +4500,7 @@ is-resolvable@^1.0.0: resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -4545,6 +4573,11 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +iterall@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" + integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== + iview@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/iview/-/iview-3.2.1.tgz#ea578948408a21f4c74c168dba19ee8fa04bd5e0" @@ -5337,14 +5370,6 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-fetch@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-fetch@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" @@ -8487,11 +8512,6 @@ webpackbar@^3.1.3: text-table "^0.2.0" wrap-ansi "^4.0.0" -whatwg-fetch@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" - integrity sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ= - which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -8643,3 +8663,15 @@ yauzl@2.8.0: dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.0.1" + +zen-observable-ts@^0.8.13: + version "0.8.13" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.13.tgz#ae1fd77c84ef95510188b1f8bca579d7a5448fc2" + integrity sha512-WDb8SM0tHCb6c0l1k60qXWlm1ok3zN9U4VkLdnBKQwIYwUoB9psH7LIFgR+JVCCMmBxUgOjskIid8/N02k/2Bg== + dependencies: + zen-observable "^0.8.0" + +zen-observable@^0.8.0: + version "0.8.11" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.11.tgz#d3415885eeeb42ee5abb9821c95bb518fcd6d199" + integrity sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==