Cleaned up internalLinking labs flag

closes https://linear.app/tryghost/issue/PLG-15

- removed `internalLinking` GA labs flag
- renamed search providers to `flex` and `basic`
  - keeps old search provider around as it can handle non-English languages unlike the faster flex provider
- updated `search` service to switch from `flex` to `basic` when the site's locale is not english
- bumped Koenig packages to switch from a feature flag for toggling internal linking features to the presence of the `searchLinks` function in card config
- updated tests to correctly switch between flex and basic providers in respective suites
This commit is contained in:
Kevin Ansfield 2024-08-12 11:17:38 +01:00
parent 0412decaec
commit a86f9dbdda
15 changed files with 136 additions and 95 deletions

View File

@ -39,7 +39,7 @@
"dependencies": {
"@codemirror/lang-html": "6.4.9",
"@tryghost/color-utils": "0.2.2",
"@tryghost/kg-unsplash-selector": "0.2.1",
"@tryghost/kg-unsplash-selector": "0.2.2",
"@tryghost/limit-service": "1.2.14",
"@tryghost/nql": "0.12.3",
"@tryghost/timezone-data": "0.4.3",

View File

@ -452,8 +452,6 @@ export default class KoenigLexicalEditor extends Component {
feature: {
collectionsCard: this.feature.collectionsCard,
collections: this.feature.collections,
internalLinking: this.feature.internalLinking,
internalLinkingAtLinks: this.feature.internalLinking,
contentVisibility: this.feature.contentVisibility
},
deprecated: { // todo fix typo

View File

@ -76,7 +76,6 @@ export default class FeatureService extends Service {
@feature('lexicalIndicators') lexicalIndicators;
@feature('adminXDemo') adminXDemo;
@feature('ActivityPub') ActivityPub;
@feature('internalLinking') internalLinking;
@feature('editorExcerpt') editorExcerpt;
@feature('contentVisibility') contentVisibility;

View File

@ -36,7 +36,7 @@ export const SEARCHABLES = [
}
];
export default class SearchProviderService extends Service {
export default class SearchProviderBasicService extends Service {
@service ajax;
@service notifications;
@service store;

View File

@ -45,7 +45,7 @@ export const SEARCHABLES = [
}
];
export default class SearchProviderService extends Service {
export default class SearchProviderFlexService extends Service {
@service ajax;
@service notifications;
@service store;

View File

@ -8,16 +8,16 @@ export default class SearchService extends Service {
@service ajax;
@service feature;
@service notifications;
@service searchProvider;
@service searchProviderBeta;
@service searchProviderBasic;
@service searchProviderFlex;
@service settings;
@service store;
isContentStale = true;
get provider() {
return this.feature.internalLinking
? this.searchProviderBeta
: this.searchProvider;
const isEnglish = this.settings.locale?.toLowerCase().startsWith('en') ?? true;
return isEnglish ? this.searchProviderFlex : this.searchProviderBasic;
}
@action

View File

@ -47,9 +47,9 @@
"@tryghost/color-utils": "0.2.2",
"@tryghost/ember-promise-modals": "2.0.1",
"@tryghost/helpers": "1.1.90",
"@tryghost/kg-clean-basic-html": "4.1.1",
"@tryghost/kg-clean-basic-html": "4.1.2",
"@tryghost/kg-converters": "1.0.5",
"@tryghost/koenig-lexical": "1.3.13",
"@tryghost/koenig-lexical": "1.3.14",
"@tryghost/limit-service": "1.2.14",
"@tryghost/members-csv": "0.0.0",
"@tryghost/nql": "0.12.3",

View File

@ -2,22 +2,34 @@ import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd';
import {authenticateSession} from 'ember-simple-auth/test-support';
import {click, currentURL, find, findAll, triggerKeyEvent, visit} from '@ember/test-helpers';
import {describe, it} from 'mocha';
import {enableLabsFlag} from '../helpers/labs-flag';
import {expect} from 'chai';
import {getPosts} from '../../mirage/config/posts';
import {setupApplicationTest} from 'ember-mocha';
import {setupMirage} from 'ember-cli-mirage/test-support';
import {typeInSearch} from 'ember-power-select/test-support/helpers';
// we have two search providers
// - "flex" which uses the flexsearch engine but is limited to english only
// - "basic" which uses exact string matches in a less performant way but is language agnostic
const suites = [{
name: 'Acceptance: Search',
name: 'Acceptance: Search (flex)',
beforeEach() {
// noop
// noop - default locale is 'en'
},
confirmProvider() {
const searchService = this.owner.lookup('service:search');
expect(searchService.provider.constructor.name, 'provider name').to.equal('SearchProviderFlexService');
}
}, {
name: 'Acceptance: Search (beta)',
name: 'Acceptance: Search (basic)',
beforeEach() {
enableLabsFlag(this.server, 'internalLinking');
this.server.db.settings.update({key: 'locale'}, {value: 'de'});
},
confirmProvider() {
const settingsService = this.owner.lookup('service:settings');
expect(settingsService.locale, 'settings.locale').to.equal('de');
const searchService = this.owner.lookup('service:search');
expect(searchService.provider.constructor.name, 'provider name').to.equal('SearchProviderBasicService');
}
}];
@ -48,6 +60,11 @@ suites.forEach((suite) => {
return await authenticateSession();
});
it('is using correct provider', async function () {
await visit('/dashboard');
suite.confirmProvider.bind(this)();
});
it('opens search modal when clicking icon', async function () {
await visit('/dashboard');
expect(currentURL(), 'currentURL').to.equal('/dashboard');

View File

@ -1,18 +1,31 @@
import {authenticateSession} from 'ember-simple-auth/test-support';
import {describe, it} from 'mocha';
import {enableLabsFlag} from '../../helpers/labs-flag';
import {expect} from 'chai';
import {setupMirage} from 'ember-cli-mirage/test-support';
import {setupTest} from 'ember-mocha';
// we have two search providers
// - "flex" which uses the flexsearch engine but is limited to english only
// - "basic" which uses exact string matches in a less performant way but is language agnostic
const suites = [{
name: 'Integration: Service: Search',
name: 'Integration: Service: Search (flex)',
beforeEach() {
// noop
// noop - default locale is 'en'
},
confirmProvider() {
const searchService = this.owner.lookup('service:search');
expect(searchService.provider.constructor.name, 'provider name').to.equal('SearchProviderFlexService');
}
}, {
name: 'Integration: Service: Search (beta)',
name: 'Integration: Service: Search (basic)',
beforeEach() {
enableLabsFlag(this.server, 'internalLinking');
this.server.db.settings.update({key: 'locale'}, {value: 'de'});
},
confirmProvider() {
const settingsService = this.owner.lookup('service:settings');
expect(settingsService.locale, 'settings.locale').to.equal('de');
const searchService = this.owner.lookup('service:search');
expect(searchService.provider.constructor.name, 'provider name').to.equal('SearchProviderBasicService');
}
}];
@ -25,9 +38,15 @@ suites.forEach((suite) => {
// eslint-disable-next-line no-unused-vars
let firstUser, firstPost, secondPost, firstPage, firstTag;
beforeEach(function () {
beforeEach(async function () {
this.server.loadFixtures();
await authenticateSession();
suite.beforeEach.bind(this)();
const settings = this.owner.lookup('service:settings');
await settings.fetch();
search = this.owner.lookup('service:search');
// populate store with data we'll be searching
@ -37,6 +56,10 @@ suites.forEach((suite) => {
firstTag = this.server.create('tag', {name: 'First tag', slug: 'first-tag'});
});
it('is using correct provider', async function () {
suite.confirmProvider.bind(this)();
});
it('returns urls for search results', async function () {
const results = await search.searchTask.perform('first');

View File

@ -19,8 +19,7 @@ const GA_FEATURES = [
'themeErrorsNotification',
'outboundLinkTagging',
'announcementBar',
'newEmailAddresses',
'internalLinking'
'newEmailAddresses'
];
// NOTE: this allowlist is meant to be used to filter out any unexpected

View File

@ -110,11 +110,11 @@
"@tryghost/kg-card-factory": "5.0.4",
"@tryghost/kg-converters": "1.0.5",
"@tryghost/kg-default-atoms": "5.0.3",
"@tryghost/kg-default-cards": "10.0.6",
"@tryghost/kg-default-nodes": "1.1.9",
"@tryghost/kg-html-to-lexical": "1.1.10",
"@tryghost/kg-lexical-html-renderer": "1.1.12",
"@tryghost/kg-mobiledoc-html-renderer": "7.0.4",
"@tryghost/kg-default-cards": "10.0.7",
"@tryghost/kg-default-nodes": "1.1.10",
"@tryghost/kg-html-to-lexical": "1.1.11",
"@tryghost/kg-lexical-html-renderer": "1.1.13",
"@tryghost/kg-mobiledoc-html-renderer": "7.0.5",
"@tryghost/limit-service": "1.2.14",
"@tryghost/link-redirects": "0.0.0",
"@tryghost/link-replacer": "0.0.0",

View File

@ -1155,7 +1155,7 @@ exports[`Settings API Edit Can edit a setting 2: [headers] 1`] = `
Object {
"access-control-allow-origin": "http://127.0.0.1:2369",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"content-length": "4454",
"content-length": "4429",
"content-type": "application/json; charset=utf-8",
"content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/,
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,

View File

@ -29,7 +29,7 @@
"@tryghost/email-events": "0.0.0",
"@tryghost/errors": "1.3.5",
"@tryghost/html-to-plaintext": "0.0.0",
"@tryghost/kg-default-cards": "10.0.6",
"@tryghost/kg-default-cards": "10.0.7",
"@tryghost/logging": "2.4.18",
"@tryghost/tpl": "0.1.32",
"@tryghost/validator": "0.2.14",

View File

@ -22,7 +22,7 @@
},
"dependencies": {
"@tryghost/debug": "0.1.32",
"@tryghost/kg-default-cards": "10.0.6",
"@tryghost/kg-default-cards": "10.0.7",
"@tryghost/string": "0.2.12",
"lodash": "4.17.21",
"papaparse": "5.3.2",

125
yarn.lock
View File

@ -7817,6 +7817,11 @@
resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-4.1.1.tgz#132a019abc6b6b6a0948c7e2d3e3ce37d18983b7"
integrity sha512-R654qIHRf//FP/1hHLkehTYxZz/Zp5NXomfEuQSezw4uDmOwGn1ME4yZD5TDi5+8ism71tfMeGVVI5XmLOeDLg==
"@tryghost/kg-clean-basic-html@4.1.2":
version "4.1.2"
resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-4.1.2.tgz#05cab6a2ed2de43b4f784e0641bfc301402379e8"
integrity sha512-TCCRU1TVvSrOYXceQDaMbPwHJuBMPfYPSLm/FsRkhDsIZK14Svxswcr4oPW+zgXUsHUPKYQtnH/igln2b5wXgA==
"@tryghost/kg-converters@1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@tryghost/kg-converters/-/kg-converters-1.0.5.tgz#8deb6591b91d0c5e89c529bc39b1f9d0870bec37"
@ -7829,51 +7834,51 @@
resolved "https://registry.yarnpkg.com/@tryghost/kg-default-atoms/-/kg-default-atoms-5.0.3.tgz#7d0e5af2191f2e0c61ae11d1666905bf924f67ac"
integrity sha512-uPE69rKxaiiMEa1vFsEbfX+LCBG2H5D/nqTkuIPAslEGIHYjQUruaXpBfnwtyVHn+dMLuWcO+wDJl5qET8gKEQ==
"@tryghost/kg-default-cards@10.0.6":
version "10.0.6"
resolved "https://registry.yarnpkg.com/@tryghost/kg-default-cards/-/kg-default-cards-10.0.6.tgz#17f10a711814196719c8fa2c6506a7d2ea9f3d7f"
integrity sha512-wOjaqFj8G9hFr6bI85CUAO55aD9B2NoLIVaeqZgzzU6Ix09ZhP4M4abrwQup7hp89PSrGz7noqmac9NTb/Lvxg==
"@tryghost/kg-default-cards@10.0.7":
version "10.0.7"
resolved "https://registry.yarnpkg.com/@tryghost/kg-default-cards/-/kg-default-cards-10.0.7.tgz#73f541155e646988ec3719e8acbbd051958b4d47"
integrity sha512-J5eEsBZm4H0GBWvqqlwKGYuYdQsIoC3lK3dyGfrw6/dOF0RNFYoaN6k90Td2bnMbbW6OxX5cabaOosHdj5uvqg==
dependencies:
"@tryghost/kg-markdown-html-renderer" "7.0.5"
"@tryghost/kg-markdown-html-renderer" "7.0.6"
"@tryghost/string" "0.2.12"
"@tryghost/url-utils" "4.4.8"
handlebars "^4.7.6"
juice "^10.0.0"
lodash "^4.17.21"
luxon "^3.0.0"
luxon "^3.5.0"
"@tryghost/kg-default-nodes@1.1.9":
version "1.1.9"
resolved "https://registry.yarnpkg.com/@tryghost/kg-default-nodes/-/kg-default-nodes-1.1.9.tgz#2f8e0851735ad9daf8ba103fe3d42d9119a366eb"
integrity sha512-xTIkOfusnTHub/pU/Pdw8S5rQ8GLf5ONfS1y8x5v2cqXln1e08lV8wa5gv44WSxuyDzKjVHKKceGkT3rbdVBXg==
"@tryghost/kg-default-nodes@1.1.10":
version "1.1.10"
resolved "https://registry.yarnpkg.com/@tryghost/kg-default-nodes/-/kg-default-nodes-1.1.10.tgz#8cf29a94868b978c31d09b476dbfc70b21460e3f"
integrity sha512-8Yro0F1Y0nN4jkDaK7/0YnKRsZKMwCk6YHuhNoNpICaKwH9EO2Isqen2/0FLaAGo8c0uvlPaYv5AfGjWJ0/ukg==
dependencies:
"@lexical/clipboard" "0.13.1"
"@lexical/rich-text" "0.13.1"
"@lexical/selection" "0.13.1"
"@lexical/utils" "0.13.1"
"@tryghost/kg-clean-basic-html" "4.1.1"
"@tryghost/kg-markdown-html-renderer" "7.0.5"
"@tryghost/kg-clean-basic-html" "4.1.2"
"@tryghost/kg-markdown-html-renderer" "7.0.6"
html-minifier "^4.0.0"
jsdom "^24.0.0"
jsdom "^24.1.0"
lexical "0.13.1"
lodash "^4.17.21"
luxon "^3.3.0"
luxon "^3.5.0"
"@tryghost/kg-default-transforms@1.1.10":
version "1.1.10"
resolved "https://registry.yarnpkg.com/@tryghost/kg-default-transforms/-/kg-default-transforms-1.1.10.tgz#7f4f648e2a8eec8d4af43028111e766feb3975ea"
integrity sha512-T9OZau2npHwtxKw77hXqRWNEErxdM/WKldWtmLKGJiKT7Czx8v9eEpsNmGgJYnXenkyzehJmU1okJlAUqMbcsA==
"@tryghost/kg-default-transforms@1.1.11":
version "1.1.11"
resolved "https://registry.yarnpkg.com/@tryghost/kg-default-transforms/-/kg-default-transforms-1.1.11.tgz#021b18cacabe83bdbe61761027bd87870c110ab5"
integrity sha512-rxxlDTa9Omzr57WscCr+kK/UBGukfGzeoTc6jlR+/eOg6p0hGSk5b64EFPgcwEwNQKDv/IkZ1DZg0UdrX7BIqw==
dependencies:
"@lexical/list" "0.13.1"
"@lexical/rich-text" "0.13.1"
"@lexical/utils" "0.13.1"
"@tryghost/kg-default-nodes" "1.1.9"
"@tryghost/kg-default-nodes" "1.1.10"
lexical "0.13.1"
"@tryghost/kg-html-to-lexical@1.1.10":
version "1.1.10"
resolved "https://registry.yarnpkg.com/@tryghost/kg-html-to-lexical/-/kg-html-to-lexical-1.1.10.tgz#89dcd98e3933485bb0f33ab725dac4080f5a01fe"
integrity sha512-ja0DRLEzQhhOzK4n7HQqUttr0dbDsMaueyXb6+bxovHyog3HFo3A5NYz0DX9UU3qdUhAKBLwrgY5SwrtJ/ysVw==
"@tryghost/kg-html-to-lexical@1.1.11":
version "1.1.11"
resolved "https://registry.yarnpkg.com/@tryghost/kg-html-to-lexical/-/kg-html-to-lexical-1.1.11.tgz#d2569450c891f590be3b8856fb58616435da67cc"
integrity sha512-aVvsuX7cmmMgWqSdS0L9+wHcYESStqVdWUEaJVNOt0xuxkN23NOMmTLB0HVSDZv6WJ7HxsgY768bPDLWIesp9g==
dependencies:
"@lexical/clipboard" "0.13.1"
"@lexical/headless" "0.13.1"
@ -7881,15 +7886,15 @@
"@lexical/link" "0.13.1"
"@lexical/list" "0.13.1"
"@lexical/rich-text" "0.13.1"
"@tryghost/kg-default-nodes" "1.1.9"
"@tryghost/kg-default-transforms" "1.1.10"
jsdom "^24.0.0"
"@tryghost/kg-default-nodes" "1.1.10"
"@tryghost/kg-default-transforms" "1.1.11"
jsdom "^24.1.0"
lexical "0.13.1"
"@tryghost/kg-lexical-html-renderer@1.1.12":
version "1.1.12"
resolved "https://registry.yarnpkg.com/@tryghost/kg-lexical-html-renderer/-/kg-lexical-html-renderer-1.1.12.tgz#3234331f18b0dfe65e52e8b5821ef2bbc4a7909a"
integrity sha512-AEV+A1ZxSSVjTse7YonMz8AF9pqppEpfAHnwKH6BarSTJAVL8Gbvv/zcISO03UVrUqfqCZnnmmXS2h8iOBrbSA==
"@tryghost/kg-lexical-html-renderer@1.1.13":
version "1.1.13"
resolved "https://registry.yarnpkg.com/@tryghost/kg-lexical-html-renderer/-/kg-lexical-html-renderer-1.1.13.tgz#c1c495aa462f17bf55fff8d4546231c49f77261e"
integrity sha512-EzOiWEUR8x6ub9tCHPtoROQFuXvL6rX7LMW9TdqZAMSv+xk9/yD6kgOmlp0aJ4XbuxM2iCrdq6HDHpd86ZYBwg==
dependencies:
"@lexical/clipboard" "0.13.1"
"@lexical/code" "0.13.1"
@ -7897,17 +7902,17 @@
"@lexical/link" "0.13.1"
"@lexical/list" "0.13.1"
"@lexical/rich-text" "0.13.1"
"@tryghost/kg-default-nodes" "1.1.9"
"@tryghost/kg-default-transforms" "1.1.10"
jsdom "^24.0.0"
"@tryghost/kg-default-nodes" "1.1.10"
"@tryghost/kg-default-transforms" "1.1.11"
jsdom "^24.1.0"
lexical "0.13.1"
"@tryghost/kg-markdown-html-renderer@7.0.5":
version "7.0.5"
resolved "https://registry.yarnpkg.com/@tryghost/kg-markdown-html-renderer/-/kg-markdown-html-renderer-7.0.5.tgz#96fb7440291ab9188b1e32c7cc71f6aa5fdec48e"
integrity sha512-Y1f2tKenyfrYIOfOVTI+9/hIVAed2MN/96B5pRBXpn/Bv2/+Sq8RCAFqlLmNwX4o7XeNp51BHZK96Mu+sU/Ltg==
"@tryghost/kg-markdown-html-renderer@7.0.6":
version "7.0.6"
resolved "https://registry.yarnpkg.com/@tryghost/kg-markdown-html-renderer/-/kg-markdown-html-renderer-7.0.6.tgz#6d0cdcd74bc3c87da72fa7c9fb58f44ffee61eb4"
integrity sha512-EkVgUleBCQ8/FAlQ/mxxu4Erhq+CQK+ujqBRLVUsMxGvYiUop1u9q3M0VN8KoAo8t4plueHu7nkaoggLZOgiJw==
dependencies:
"@tryghost/kg-utils" "1.0.26"
"@tryghost/kg-utils" "1.0.27"
markdown-it "^14.0.0"
markdown-it-footnote "^4.0.0"
markdown-it-image-lazy-loading "^2.0.0"
@ -7915,14 +7920,14 @@
markdown-it-mark "^4.0.0"
markdown-it-sub "^2.0.0"
markdown-it-sup "^2.0.0"
semver "^7.3.5"
semver "^7.6.2"
"@tryghost/kg-mobiledoc-html-renderer@7.0.4":
version "7.0.4"
resolved "https://registry.yarnpkg.com/@tryghost/kg-mobiledoc-html-renderer/-/kg-mobiledoc-html-renderer-7.0.4.tgz#d5a433d9ebed76a1e74ff5792cab2d7f4b844e55"
integrity sha512-C0ncnXc5vsLPQmsEw4xfUmdJnJTL9WsoACpI6970R4/jvAWE3h99TVpSFWVnHwrc/asWxaXZlpcKKH4PJs3VzA==
"@tryghost/kg-mobiledoc-html-renderer@7.0.5":
version "7.0.5"
resolved "https://registry.yarnpkg.com/@tryghost/kg-mobiledoc-html-renderer/-/kg-mobiledoc-html-renderer-7.0.5.tgz#5e1801f4280df357020f8ab2f42cfd79abb54d6a"
integrity sha512-PNURuXzP2lO/0b2ugdxGlyqS1+ZScdlZIvnP0lREV9H+66hu8J16xvb3YxUZvVsm14ImbLF92R3cURHOvrXwIw==
dependencies:
"@tryghost/kg-utils" "1.0.26"
"@tryghost/kg-utils" "1.0.27"
mobiledoc-dom-renderer "^0.7.0"
simple-dom "^1.4.0"
@ -7933,22 +7938,22 @@
dependencies:
"@tryghost/kg-clean-basic-html" "4.1.1"
"@tryghost/kg-unsplash-selector@0.2.1":
version "0.2.1"
resolved "https://registry.yarnpkg.com/@tryghost/kg-unsplash-selector/-/kg-unsplash-selector-0.2.1.tgz#c9e1658ed8d9469a26ca78c1aec1848fd7d6007c"
integrity sha512-LzgKE7UJ24bvID0c94teXSCrfbAX2/jo8sKaxEKR9P4E4P8COlCme/aygdOUCTblCBgE4KxyO9a+bD3uYW2Qyg==
"@tryghost/kg-unsplash-selector@0.2.2":
version "0.2.2"
resolved "https://registry.yarnpkg.com/@tryghost/kg-unsplash-selector/-/kg-unsplash-selector-0.2.2.tgz#fcd4445f39c1ac879662b45eb863e2bb8ba95625"
integrity sha512-t0NkercfjQnKFVDs0I4VM8Aksabv4ZB/qYFyN3mLefA4Pt5LK99XZrwuYKmL6LOoWNZLMbKPUvBxuuo1NTW5GA==
"@tryghost/kg-utils@1.0.26":
version "1.0.26"
resolved "https://registry.yarnpkg.com/@tryghost/kg-utils/-/kg-utils-1.0.26.tgz#48e18b05d8bcf2c0d3c94f3d500e9b267d6723e6"
integrity sha512-DXx/qJwMYB6mjyhBk1mOg2hA5sXGNVcP2R0FyhkmHKtdNEwP0WIpV7UZt7DIYDT4c4uWFddya+u6yVpqU9Nhxg==
"@tryghost/kg-utils@1.0.27":
version "1.0.27"
resolved "https://registry.yarnpkg.com/@tryghost/kg-utils/-/kg-utils-1.0.27.tgz#77442c9cce7ee2d0e6fbfa669ef733f52dec7d82"
integrity sha512-pZ9qcuOKijTJx1qTU/Pju3ZJOXTQeGBl1qKmCBMfwoacVepN0qPzn/GierOqgvPzEw5xHexJPrQVn0hE0w9bdA==
dependencies:
semver "^7.3.5"
semver "^7.6.2"
"@tryghost/koenig-lexical@1.3.13":
version "1.3.13"
resolved "https://registry.yarnpkg.com/@tryghost/koenig-lexical/-/koenig-lexical-1.3.13.tgz#7ffa158d1f28f4f75d0fce763c0a884f98a23f13"
integrity sha512-tjLouQMCPPAXdvBYWVtHp4SeDylT3tF5nh0cy3JPOmG0eJRYGdGwxiEabk6jmzOEjjhkD0kwT+6m3G+vv70dcw==
"@tryghost/koenig-lexical@1.3.14":
version "1.3.14"
resolved "https://registry.yarnpkg.com/@tryghost/koenig-lexical/-/koenig-lexical-1.3.14.tgz#bb8cc0cf336821b21500ba24d12e4e555cad340c"
integrity sha512-V5udyPS3WVjX4adOeuW5jXUpYtW+vYKHILS0JMtiyf8oiokRpN8W2m8y0n7w7GfptEgzcSLs9X+Sx0ujTaNURA==
"@tryghost/limit-service@1.2.14":
version "1.2.14"
@ -21410,7 +21415,7 @@ jscodeshift@^0.15.1:
temp "^0.8.4"
write-file-atomic "^2.3.0"
jsdom@24.1.1, jsdom@^24.0.0, jsdom@~24.1.0:
jsdom@24.1.1, jsdom@^24.0.0, jsdom@^24.1.0, jsdom@~24.1.0:
version "24.1.1"
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.1.1.tgz#f41df8f4f3b2fbfa7e1bdc5df62c9804fd14a9d0"
integrity sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==
@ -22752,7 +22757,7 @@ ltgt@^2.1.2:
resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==
luxon@3.5.0, luxon@^3.0.0, luxon@^3.3.0:
luxon@3.5.0, luxon@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20"
integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==
@ -28444,7 +28449,7 @@ semver@7.5.3:
dependencies:
lru-cache "^6.0.0"
semver@7.6.3, semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4:
semver@7.6.3, semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2:
version "7.6.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==