Updated Tiers API data structure (#14795)

refs https://github.com/TryGhost/Team/issues/1575

- Updates the admin-api-schema to reflect new data structure
- Updates members-api to allow Portal to use new data structure
- Data is only mapped at the serialised level to avoid changing the underlying implementation
- Ensure only one version of domain-events present in yarn.lock
This commit is contained in:
Fabien 'egg' O'Carroll 2022-05-16 19:47:18 +01:00 committed by GitHub
parent c14f82fec0
commit d9e6dfe97e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 166 additions and 154 deletions

View File

@ -8,6 +8,41 @@ const forceActiveFilter = (frame) => {
}
};
function convertTierInput(input) {
const converted = {
id: input.id,
name: input.name,
description: input.description,
slug: input.slug,
active: input.active,
type: input.type,
welcome_page_url: input.welcome_page_url,
created_at: input.created_at,
updated_at: input.updated_at,
visibility: input.visibility
};
if (input.monthly_price && input.currency) {
converted.monthly_price = {
amount: input.monthly_price,
currency: input.currency
};
}
if (input.yearly_price && input.currency) {
converted.yearly_price = {
amount: input.yearly_price,
currency: input.currency
};
}
if (input.benefits) {
converted.benefits = input.benefits.map(name => ({name}));
}
return converted;
}
module.exports = {
all(_apiConfig, frame) {
if (!frame.options.withRelated) {
@ -37,17 +72,17 @@ module.exports = {
add(_apiConfig, frame) {
if (frame.data.products) {
frame.data = frame.data.products[0];
frame.data = convertTierInput(frame.data.products[0]);
return;
}
frame.data = frame.data.tiers[0];
frame.data = convertTierInput(frame.data.tiers[0]);
},
edit(_apiConfig, frame) {
if (frame.data.products) {
frame.data = frame.data.products[0];
frame.data = convertTierInput(frame.data.products[0]);
return;
}
frame.data = frame.data.tiers[0];
frame.data = convertTierInput(frame.data.tiers[0]);
}
};

View File

@ -1,6 +1,5 @@
//@ts-check
const debug = require('@tryghost/debug')('api:canary:utils:serializers:output:tiers');
const _ = require('lodash');
const allowedIncludes = ['monthly_price', 'yearly_price'];
const utils = require('../../../../shared/utils');
@ -60,15 +59,12 @@ function singleTier(model, _apiConfig, frame) {
/**
* @param {import('bookshelf').Model} tier
* @param {object} options
* @param {'content'|'admin'} apiType
*
* @returns {SerializedTier}
*/
function serializeTier(tier, options, apiType) {
function serializeTier(tier, options) {
const json = tier.toJSON(options);
const hideStripeData = apiType === 'content';
const serialized = {
id: json.id,
name: json.name,
@ -79,49 +75,25 @@ function serializeTier(tier, options, apiType) {
welcome_page_url: json.welcome_page_url,
created_at: json.created_at,
updated_at: json.updated_at,
stripe_prices: json.stripePrices ? json.stripePrices.map(price => serializeStripePrice(price, hideStripeData)) : null,
monthly_price: serializeStripePrice(json.monthlyPrice, hideStripeData),
yearly_price: serializeStripePrice(json.yearlyPrice, hideStripeData),
benefits: json.benefits || null,
visibility: json.visibility
visibility: json.visibility,
benefits: null
};
if (Array.isArray(json.benefits)) {
serialized.benefits = json.benefits.map(benefit => benefit.name);
} else {
serialized.benefits = null;
}
if (serialized.type === 'paid') {
serialized.currency = json.monthlyPrice?.currency;
serialized.monthly_price = json.monthlyPrice?.amount;
serialized.yearly_price = json.yearlyPrice?.amount;
}
return serialized;
}
/**
* @param {object} data
* @param {boolean} hideStripeData
*
* @returns {StripePrice}
*/
function serializeStripePrice(data, hideStripeData) {
if (_.isEmpty(data)) {
return null;
}
const price = {
id: data.id,
stripe_tier_id: data.stripe_product_id,
stripe_price_id: data.stripe_price_id,
active: data.active,
nickname: data.nickname,
description: data.description,
currency: data.currency,
amount: data.amount,
type: data.type,
interval: data.interval,
created_at: data.created_at,
updated_at: data.updated_at
};
if (hideStripeData) {
delete price.stripe_price_id;
delete price.stripe_tier_id;
}
return price;
}
/**
* @template Data
*
@ -160,7 +132,7 @@ function createSerializer(debugString, serialize) {
}
/**
* @typedef {Object} SerializedTier
* @typedef {Object} FreeTier
* @prop {string} id
* @prop {string} name
* @prop {string} slug
@ -170,34 +142,21 @@ function createSerializer(debugString, serialize) {
* @prop {string} welcome_page_url
* @prop {Date} created_at
* @prop {Date} updated_at
* @prop {StripePrice} [monthly_price]
* @prop {StripePrice} [yearly_price]
* @prop {Benefit[]} [benefits]
* @prop {string[]} [benefits]
*/
/**
* @typedef {object} Benefit
* @prop {string} id
* @prop {string} name
* @prop {string} slug
* @prop {Date} created_at
* @prop {Date} updated_at
*/
/**
* @typedef {object} StripePrice
* @prop {string} id
* @prop {string|null} stripe_tier_id
* @prop {string|null} stripe_price_id
* @prop {boolean} active
* @prop {string} nickname
* @prop {string} description
* @typedef {FreeTier} PaidTier
* @prop {string} currency
* @prop {number} amount
* @prop {'recurring'|'one-time'} type
* @prop {'day'|'week'|'month'|'year'} interval
* @prop {Date} created_at
* @prop {Date} updated_at
* @prop {number} monthly_price
* @prop {number} yearly_price
*/
/**
* @typedef {FreeTier | PaidTier} SerializedTier
* @prop {string} currency
* @prop {number} monthly_price
* @prop {number} yearly_price
*/
/**

View File

@ -57,7 +57,7 @@
"dependencies": {
"@sentry/node": "6.19.7",
"@tryghost/adapter-manager": "0.2.31",
"@tryghost/admin-api-schema": "3.2.3",
"@tryghost/admin-api-schema": "4.0.0",
"@tryghost/api-version-compatibility-service": "0.4.1",
"@tryghost/bookshelf-plugins": "0.4.1",
"@tryghost/bootstrap-socket": "0.2.20",
@ -67,7 +67,7 @@
"@tryghost/custom-theme-settings-service": "0.3.3",
"@tryghost/database-info": "0.3.5",
"@tryghost/debug": "0.1.16",
"@tryghost/domain-events": "0.1.13",
"@tryghost/domain-events": "0.1.14",
"@tryghost/email-analytics-provider-mailgun": "1.0.9",
"@tryghost/email-analytics-service": "1.0.7",
"@tryghost/email-content-generator": "0.1.2",
@ -85,12 +85,12 @@
"@tryghost/logging": "2.1.8",
"@tryghost/magic-link": "1.0.25",
"@tryghost/member-events": "0.4.5",
"@tryghost/members-api": "7.0.2",
"@tryghost/members-events-service": "0.4.2",
"@tryghost/members-api": "8.0.0",
"@tryghost/members-events-service": "0.4.3",
"@tryghost/members-importer": "0.5.13",
"@tryghost/members-offers": "0.11.5",
"@tryghost/members-ssr": "1.0.27",
"@tryghost/members-stripe-service": "0.10.4",
"@tryghost/members-stripe-service": "0.10.5",
"@tryghost/metrics": "1.0.11",
"@tryghost/minifier": "0.1.15",
"@tryghost/mw-api-version-mismatch": "0.2.1",
@ -112,7 +112,7 @@
"@tryghost/update-check-service": "0.3.4",
"@tryghost/url-utils": "4.0.0",
"@tryghost/validator": "0.1.24",
"@tryghost/verification-trigger": "0.2.4",
"@tryghost/verification-trigger": "0.2.5",
"@tryghost/version": "0.1.14",
"@tryghost/vhost-middleware": "1.0.25",
"@tryghost/zip": "1.1.25",

View File

@ -21,7 +21,6 @@ Object {
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"name": "Free",
"slug": "free",
"stripe_prices": null,
"type": "free",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"visibility": "public",
@ -35,7 +34,6 @@ Object {
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"name": "Default Product",
"slug": "default-product",
"stripe_prices": null,
"type": "paid",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000Z/,
"visibility": "public",

View File

@ -35,9 +35,8 @@ describe('Tiers API', function () {
it('Errors when price is non-integer', async function () {
const tier = {
name: 'Blah',
monthly_price: {
amount: 99.99
}
monthly_price: 99.99,
currency: 'usd'
};
await agent
@ -54,9 +53,8 @@ describe('Tiers API', function () {
it('Errors when price is negative', async function () {
const tier = {
name: 'Blah',
monthly_price: {
amount: -100
}
monthly_price: -100,
currency: 'usd'
};
await agent
@ -73,9 +71,8 @@ describe('Tiers API', function () {
it('Errors when price is too large', async function () {
const tier = {
name: 'Blah',
monthly_price: {
amount: Number.MAX_SAFE_INTEGER
}
monthly_price: Number.MAX_SAFE_INTEGER,
currency: 'usd'
};
await agent

View File

@ -15,13 +15,12 @@ Object {
"tiers": Array [
Object {
"active": true,
"benefits": null,
"benefits": Array [],
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}/,
"description": null,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"name": "Free",
"slug": "free",
"stripe_prices": null,
"type": "free",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}/,
"visibility": "public",
@ -29,17 +28,19 @@ Object {
},
Object {
"active": true,
"benefits": null,
"benefits": Array [],
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}/,
"currency": "GBP",
"description": null,
"id": StringMatching /\\[a-f0-9\\]\\{24\\}/,
"monthly_price": 1200,
"name": "Default Product",
"slug": "default-product",
"stripe_prices": null,
"type": "paid",
"updated_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}/,
"visibility": "public",
"welcome_page_url": "/welcome-paid",
"yearly_price": 12000,
},
],
}
@ -49,7 +50,7 @@ exports[`Tiers Content API Can request only active tiers 2: [headers] 1`] = `
Object {
"access-control-allow-origin": "*",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"content-length": "687",
"content-length": "700",
"content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Accept-Encoding",

View File

@ -10,7 +10,7 @@ describe('Tiers Content API', function () {
});
it('Can request only active tiers', async function () {
await agent.get('/tiers/')
await agent.get('/tiers/?include=monthly_price,yearly_price,benefits')
.expectStatus(200)
.matchHeaderSnapshot({
etag: matchers.anyEtag

140
yarn.lock
View File

@ -1430,10 +1430,10 @@
dependencies:
"@tryghost/errors" "^1.2.1"
"@tryghost/admin-api-schema@3.2.3":
version "3.2.3"
resolved "https://registry.yarnpkg.com/@tryghost/admin-api-schema/-/admin-api-schema-3.2.3.tgz#0feae738e7240e38adeb354cd56d0cce3df2ecaa"
integrity sha512-+p4WFSyTiWO2Ift9Cg98Z8xJPd28A1p+ut/FzzvnIIjHhYPZK8KNKOOsIQkb+HU5motjEb0QvVlMZQWMD4Ib7A==
"@tryghost/admin-api-schema@4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@tryghost/admin-api-schema/-/admin-api-schema-4.0.0.tgz#97e528931fab8478d00b6b91e7e3d4a2b4c4c597"
integrity sha512-Yo4nV34aZY8M92dVMp+zEI2ZuHyFDcDHHvQ9yY1ZEOKhqkdKw6DxdR2HcAkQi/PSnM99N7CWk5WBKe9Vnm8+jA==
dependencies:
"@tryghost/errors" "^1.0.0"
ajv "^6.12.6"
@ -1612,10 +1612,10 @@
"@tryghost/root-utils" "^0.3.14"
debug "^4.3.1"
"@tryghost/domain-events@0.1.13", "@tryghost/domain-events@^0.1.13":
version "0.1.13"
resolved "https://registry.yarnpkg.com/@tryghost/domain-events/-/domain-events-0.1.13.tgz#a668cf39e808b51d6a5bc4f0f4e9b681047a4c59"
integrity sha512-0L1UNk4NROfQTqXnBo/LSU2QIUq1jnwGUBLDhkRYeBZ1qXw6wzdmvTt4mTc8J9E4BzG6rHr0ZSwrshwDpS7tSw==
"@tryghost/domain-events@0.1.14", "@tryghost/domain-events@^0.1.14":
version "0.1.14"
resolved "https://registry.yarnpkg.com/@tryghost/domain-events/-/domain-events-0.1.14.tgz#a0206b21981d8e3337dfc0ed56df182d6e7188b3"
integrity sha512-SoJMvrwBXFDciQwjobpuZae0AQ/pVB+RgSj+QEuKNqg6V6CAhNlLrI1rAhkHtXkuKaLDDzH8tKWQEeeApXdBng==
"@tryghost/elasticsearch-bunyan@0.1.1":
version "0.1.1"
@ -1833,7 +1833,7 @@
json-stringify-safe "^5.0.1"
lodash "^4.17.21"
"@tryghost/magic-link@1.0.25", "@tryghost/magic-link@^1.0.25":
"@tryghost/magic-link@1.0.25":
version "1.0.25"
resolved "https://registry.yarnpkg.com/@tryghost/magic-link/-/magic-link-1.0.25.tgz#26e744725b2b745c56967d3b784351029affc093"
integrity sha512-nGntJIpZYaAiajVUez51cmKoawAHa/1SQtGokcXpFl/S/QWMUjue2kDOcMdAs5GOyVlFGeCQQfzabTBhO1jWFg==
@ -1842,46 +1842,60 @@
jsonwebtoken "^8.5.1"
lodash "^4.17.15"
"@tryghost/member-analytics-service@^0.1.15":
version "0.1.15"
resolved "https://registry.yarnpkg.com/@tryghost/member-analytics-service/-/member-analytics-service-0.1.15.tgz#e08711e0119369d88fb0f3677493ba4d9d96ae63"
integrity sha512-xxNq/d9UB1OgAPGscg+Yk9mDaZjyEzCFINQ4OwJeutisVvEDKX+h9cYOqhrubqswvrzEA6I9OszVnb7Wi7qmiQ==
"@tryghost/magic-link@^1.0.26":
version "1.0.26"
resolved "https://registry.yarnpkg.com/@tryghost/magic-link/-/magic-link-1.0.26.tgz#9c87edfe52abc3c628c4052078c5f485396a2fb3"
integrity sha512-Rt/a6VDRzPkdbDQuh2Ah3sYTVOlG2kBcfPl5EpCeRqI7KF/BlsqLgRhDW+aewVhuquNWtjqDKdz+glZbmcJczg==
dependencies:
"@tryghost/domain-events" "^0.1.13"
bluebird "^3.5.5"
jsonwebtoken "^8.5.1"
lodash "^4.17.15"
"@tryghost/member-analytics-service@^0.1.16":
version "0.1.16"
resolved "https://registry.yarnpkg.com/@tryghost/member-analytics-service/-/member-analytics-service-0.1.16.tgz#b013aed7521cd392a2228e5c6c999564c02b1aa7"
integrity sha512-aWS4KfKKDm+1j6+Y2b4jY2sKNnPg5EqVJ/zNswgtC3LCvEDyUuIEnCn4cWC9HeFwalbOuz1303Z+Evyy2Inz4A==
dependencies:
"@tryghost/domain-events" "^0.1.14"
"@tryghost/errors" "^1.0.0"
"@tryghost/member-events" "^0.4.5"
"@tryghost/member-events" "^0.4.6"
"@tryghost/tpl" "^0.1.4"
bson-objectid "^2.0.1"
"@tryghost/member-events@0.4.5", "@tryghost/member-events@^0.4.5":
"@tryghost/member-events@0.4.5":
version "0.4.5"
resolved "https://registry.yarnpkg.com/@tryghost/member-events/-/member-events-0.4.5.tgz#b6929c2a13bf24be5382015975fc3db7f01eede4"
integrity sha512-SOfoHY7ib9jVqtNqXjv6AXHh3hckcce+7RzevXbqD0a4jUyB8Vc9RxJ8vTIJxq5BYxbpecJZulu9rLNuykno2A==
"@tryghost/members-analytics-ingress@^0.1.16":
version "0.1.16"
resolved "https://registry.yarnpkg.com/@tryghost/members-analytics-ingress/-/members-analytics-ingress-0.1.16.tgz#355f11b9fcb229d9e23b52a827ea09758804a703"
integrity sha512-95wS9yPnQ/LCPKhZcU9T3ZSEB+VpMIO5Rtf3eMUQaDNRZT6LpsRaoxPmFXdcQiApBpNOLYTAsgklr3JgIxGfZw==
dependencies:
"@tryghost/domain-events" "^0.1.13"
"@tryghost/member-events" "^0.4.5"
"@tryghost/member-events@^0.4.6":
version "0.4.6"
resolved "https://registry.yarnpkg.com/@tryghost/member-events/-/member-events-0.4.6.tgz#7abe95d38f88c344b2c85249f9b6083c935d6f49"
integrity sha512-wDg9NGsymYvJDZfbv6xmAV6HA7LMs3P01aYUTXwRIAqzDJfyuXjgwmJr0RRNn0yKJ1B1gDq7lps0+Hb3Oxm4Vw==
"@tryghost/members-api@7.0.2":
version "7.0.2"
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-7.0.2.tgz#e920f79f969854b2a0630732bfa20470679625cd"
integrity sha512-ggpfYzcStmJPXnbZ1uwZapMsATUCjf4dEnDFxp6a+nFTPlZ8uUniPHaJfV/5/gxScP+TgNGMwSgYXyCVofE1fw==
"@tryghost/members-analytics-ingress@^0.1.17":
version "0.1.17"
resolved "https://registry.yarnpkg.com/@tryghost/members-analytics-ingress/-/members-analytics-ingress-0.1.17.tgz#92b4162b24c2fcfbc89ccaa37069814433ee6ac5"
integrity sha512-5ACFKOg5TXjYh3P4pmSW0I68CNCaplzhp0bP8KNS3aLFChoTRkyVsAr4EKKInWImgAHw4Ug3O8GLrIljrQxp4g==
dependencies:
"@tryghost/domain-events" "^0.1.14"
"@tryghost/member-events" "^0.4.6"
"@tryghost/members-api@8.0.0":
version "8.0.0"
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-8.0.0.tgz#490e357cf338ae262c7294cfeb318b1fa22b4de3"
integrity sha512-Cv9uzkbmtwaZk7YOTgzTybTVzfZT2z2b+E7F5Mm0UwsVMAAbNbG1iOOAIso0E/QrDfcsENe28QVL+Xk8YW/Ssw==
dependencies:
"@nexes/nql" "^0.6.0"
"@tryghost/debug" "^0.1.2"
"@tryghost/domain-events" "^0.1.13"
"@tryghost/domain-events" "^0.1.14"
"@tryghost/errors" "^1.1.1"
"@tryghost/logging" "^2.0.0"
"@tryghost/magic-link" "^1.0.25"
"@tryghost/member-analytics-service" "^0.1.15"
"@tryghost/member-events" "^0.4.5"
"@tryghost/members-analytics-ingress" "^0.1.16"
"@tryghost/members-payments" "^0.3.5"
"@tryghost/members-stripe-service" "^0.10.4"
"@tryghost/magic-link" "^1.0.26"
"@tryghost/member-analytics-service" "^0.1.16"
"@tryghost/member-events" "^0.4.6"
"@tryghost/members-analytics-ingress" "^0.1.17"
"@tryghost/members-payments" "^0.3.6"
"@tryghost/members-stripe-service" "^0.10.5"
"@tryghost/tpl" "^0.1.2"
"@types/jsonwebtoken" "^8.5.1"
bluebird "^3.5.4"
@ -1905,13 +1919,13 @@
papaparse "^5.3.2"
pump "^3.0.0"
"@tryghost/members-events-service@0.4.2":
version "0.4.2"
resolved "https://registry.yarnpkg.com/@tryghost/members-events-service/-/members-events-service-0.4.2.tgz#434db802e9fc811497b9685198655cd414306a80"
integrity sha512-4vwXFcC3GufyEvolkaK89hsQTkIVhcbZxeFTTwntW9vBJN4E8b8Ip3axNY6vzA+BqrPRSAN5cG05fP93cAXOYw==
"@tryghost/members-events-service@0.4.3":
version "0.4.3"
resolved "https://registry.yarnpkg.com/@tryghost/members-events-service/-/members-events-service-0.4.3.tgz#2fa3699ec6728cae77e12d8260648593323e9c09"
integrity sha512-aLEnISCo8sl/z+RLxw1jj+KuqI72+ACfkadnRIdHe5Jn6CGbp21L0SdnKU/6NQ7KbuZZfYxYdPnJmHpqm1e4rw==
dependencies:
"@tryghost/domain-events" "^0.1.13"
"@tryghost/member-events" "^0.4.5"
"@tryghost/domain-events" "^0.1.14"
"@tryghost/member-events" "^0.4.6"
moment-timezone "^0.5.34"
"@tryghost/members-importer@0.5.13":
@ -1924,7 +1938,7 @@
"@tryghost/tpl" "^0.1.3"
moment-timezone "^0.5.23"
"@tryghost/members-offers@0.11.5", "@tryghost/members-offers@^0.11.5":
"@tryghost/members-offers@0.11.5":
version "0.11.5"
resolved "https://registry.yarnpkg.com/@tryghost/members-offers/-/members-offers-0.11.5.tgz#76da1804ee2e3ee4f0de8e606f41652907c7ddb9"
integrity sha512-lO8Kc4cFrYib0ukhVXFr5i5deAQ2mXYKTWEpRkjjo+qIXPKVwXKMSLd8I7nnlOuCNQfth9yKi29Q9QqUr988cw==
@ -1932,13 +1946,21 @@
"@nexes/mongo-utils" "^0.3.1"
"@tryghost/string" "^0.1.20"
"@tryghost/members-payments@^0.3.5":
version "0.3.5"
resolved "https://registry.yarnpkg.com/@tryghost/members-payments/-/members-payments-0.3.5.tgz#8144c234e9c99c872cbe86dd9a03d21fac0f159c"
integrity sha512-NC1biSgbdaM/yrvq0TJZvRJsHqve5bgbuc1lUM8zt/wyDV6GPDTtTYF5sHUvKZDlz00MaM9NYEsmNScSFUid3g==
"@tryghost/members-offers@^0.11.6":
version "0.11.6"
resolved "https://registry.yarnpkg.com/@tryghost/members-offers/-/members-offers-0.11.6.tgz#b687aef63f7605b1118faf7f4a298f42eb5c60bf"
integrity sha512-nKYinmpDOiJG/UGfaS5kjRDFgdTmrmkTTvOcEF1l50SAvpwPNInJ+0I5xer063OB91KsHbxmnzq8kNWvsqSZrA==
dependencies:
"@tryghost/domain-events" "^0.1.13"
"@tryghost/members-offers" "^0.11.5"
"@nexes/mongo-utils" "^0.3.1"
"@tryghost/string" "^0.1.20"
"@tryghost/members-payments@^0.3.6":
version "0.3.6"
resolved "https://registry.yarnpkg.com/@tryghost/members-payments/-/members-payments-0.3.6.tgz#fbc92746d56be9b21f92e96aeaecd0d53b954f38"
integrity sha512-KR3g+UDxzA3i6MCxw/zrwFNB6q1ixYnvGI7Xe3GMlT1kik2R35r8hH+l5wYnNVP1E1TF1qpTEZJ00EeDSvJ3SQ==
dependencies:
"@tryghost/domain-events" "^0.1.14"
"@tryghost/members-offers" "^0.11.6"
"@tryghost/members-ssr@1.0.27":
version "1.0.27"
@ -1953,16 +1975,16 @@
jsonwebtoken "^8.5.1"
lodash "^4.17.11"
"@tryghost/members-stripe-service@0.10.4", "@tryghost/members-stripe-service@^0.10.4":
version "0.10.4"
resolved "https://registry.yarnpkg.com/@tryghost/members-stripe-service/-/members-stripe-service-0.10.4.tgz#6b3740a99c2136d58d3c17222474c0326d8055bb"
integrity sha512-QFQcvOtLxDmh+XnEpZN226FGQugV99TTUV4LbeRGkcnV+PceZkOuZSbpkYboQzG7PGO2olc5pAQxeJercHrn+A==
"@tryghost/members-stripe-service@0.10.5", "@tryghost/members-stripe-service@^0.10.5":
version "0.10.5"
resolved "https://registry.yarnpkg.com/@tryghost/members-stripe-service/-/members-stripe-service-0.10.5.tgz#17adc845a0c279c14fa0a2d6fc920ce8cdda0c6c"
integrity sha512-MOVquZaZ+WfDVY6DjJUrAyVKQy7cTWXcv8mWMnAcGL+aE526XPX3hrvA8BRilKjwN7hVNI9kBnxoALPsqZHHCw==
dependencies:
"@tryghost/debug" "^0.1.4"
"@tryghost/domain-events" "^0.1.13"
"@tryghost/domain-events" "^0.1.14"
"@tryghost/errors" "^1.2.5"
"@tryghost/logging" "^2.0.5"
"@tryghost/member-events" "^0.4.5"
"@tryghost/member-events" "^0.4.6"
leaky-bucket "^2.2.0"
lodash "^4.17.21"
stripe "^8.174.0"
@ -2234,13 +2256,13 @@
moment-timezone "^0.5.23"
validator "7.2.0"
"@tryghost/verification-trigger@0.2.4":
version "0.2.4"
resolved "https://registry.yarnpkg.com/@tryghost/verification-trigger/-/verification-trigger-0.2.4.tgz#c58ca70f9fdee1675add9e05039662c4c5f0824c"
integrity sha512-94R0zNDFFz73E25ZpY28Fe8lT7BZ2HZ4uRD+9YHUXdSyV+L2Kf1kCteBELjAc7b8gi74CqScm+/dikDRum2pJA==
"@tryghost/verification-trigger@0.2.5":
version "0.2.5"
resolved "https://registry.yarnpkg.com/@tryghost/verification-trigger/-/verification-trigger-0.2.5.tgz#185906ef690ece00264a86ffba2d8809a3e19ad4"
integrity sha512-Zt89BuSs54l2epzyrmmE1Ra+NZt/WYMDdTNW0VRhOYBrvDFPPCY0Ks0gVUPSfuHlnSmqBwG+KWVQanwbEi6J9Q==
dependencies:
"@tryghost/domain-events" "^0.1.13"
"@tryghost/member-events" "^0.4.5"
"@tryghost/domain-events" "^0.1.14"
"@tryghost/member-events" "^0.4.6"
"@tryghost/version-notifications-data-service@^0.2.0":
version "0.2.0"