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": { "dependencies": {
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@tryghost/color-utils": "0.2.2", "@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/limit-service": "1.2.14",
"@tryghost/nql": "0.12.3", "@tryghost/nql": "0.12.3",
"@tryghost/timezone-data": "0.4.3", "@tryghost/timezone-data": "0.4.3",

View File

@ -452,8 +452,6 @@ export default class KoenigLexicalEditor extends Component {
feature: { feature: {
collectionsCard: this.feature.collectionsCard, collectionsCard: this.feature.collectionsCard,
collections: this.feature.collections, collections: this.feature.collections,
internalLinking: this.feature.internalLinking,
internalLinkingAtLinks: this.feature.internalLinking,
contentVisibility: this.feature.contentVisibility contentVisibility: this.feature.contentVisibility
}, },
deprecated: { // todo fix typo deprecated: { // todo fix typo
@ -705,7 +703,7 @@ export default class KoenigLexicalEditor extends Component {
<ErrorHandler config={this.config}> <ErrorHandler config={this.config}>
<Suspense fallback={<p className="koenig-react-editor-loading">Loading editor...</p>}> <Suspense fallback={<p className="koenig-react-editor-loading">Loading editor...</p>}>
<KGEditorComponent /> <KGEditorComponent />
<KGEditorComponent isInitInstance={true} /> <KGEditorComponent isInitInstance={true} />
</Suspense> </Suspense>
</ErrorHandler> </ErrorHandler>
</div> </div>

View File

@ -76,7 +76,6 @@ export default class FeatureService extends Service {
@feature('lexicalIndicators') lexicalIndicators; @feature('lexicalIndicators') lexicalIndicators;
@feature('adminXDemo') adminXDemo; @feature('adminXDemo') adminXDemo;
@feature('ActivityPub') ActivityPub; @feature('ActivityPub') ActivityPub;
@feature('internalLinking') internalLinking;
@feature('editorExcerpt') editorExcerpt; @feature('editorExcerpt') editorExcerpt;
@feature('contentVisibility') contentVisibility; @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 ajax;
@service notifications; @service notifications;
@service store; @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 ajax;
@service notifications; @service notifications;
@service store; @service store;

View File

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

View File

@ -47,9 +47,9 @@
"@tryghost/color-utils": "0.2.2", "@tryghost/color-utils": "0.2.2",
"@tryghost/ember-promise-modals": "2.0.1", "@tryghost/ember-promise-modals": "2.0.1",
"@tryghost/helpers": "1.1.90", "@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/kg-converters": "1.0.5",
"@tryghost/koenig-lexical": "1.3.13", "@tryghost/koenig-lexical": "1.3.14",
"@tryghost/limit-service": "1.2.14", "@tryghost/limit-service": "1.2.14",
"@tryghost/members-csv": "0.0.0", "@tryghost/members-csv": "0.0.0",
"@tryghost/nql": "0.12.3", "@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 {authenticateSession} from 'ember-simple-auth/test-support';
import {click, currentURL, find, findAll, triggerKeyEvent, visit} from '@ember/test-helpers'; import {click, currentURL, find, findAll, triggerKeyEvent, visit} from '@ember/test-helpers';
import {describe, it} from 'mocha'; import {describe, it} from 'mocha';
import {enableLabsFlag} from '../helpers/labs-flag';
import {expect} from 'chai'; import {expect} from 'chai';
import {getPosts} from '../../mirage/config/posts'; import {getPosts} from '../../mirage/config/posts';
import {setupApplicationTest} from 'ember-mocha'; import {setupApplicationTest} from 'ember-mocha';
import {setupMirage} from 'ember-cli-mirage/test-support'; import {setupMirage} from 'ember-cli-mirage/test-support';
import {typeInSearch} from 'ember-power-select/test-support/helpers'; 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 = [{ const suites = [{
name: 'Acceptance: Search', name: 'Acceptance: Search (flex)',
beforeEach() { 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() { 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(); 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 () { it('opens search modal when clicking icon', async function () {
await visit('/dashboard'); await visit('/dashboard');
expect(currentURL(), 'currentURL').to.equal('/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 {describe, it} from 'mocha';
import {enableLabsFlag} from '../../helpers/labs-flag';
import {expect} from 'chai'; import {expect} from 'chai';
import {setupMirage} from 'ember-cli-mirage/test-support'; import {setupMirage} from 'ember-cli-mirage/test-support';
import {setupTest} from 'ember-mocha'; 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 = [{ const suites = [{
name: 'Integration: Service: Search', name: 'Integration: Service: Search (flex)',
beforeEach() { 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() { 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 // eslint-disable-next-line no-unused-vars
let firstUser, firstPost, secondPost, firstPage, firstTag; let firstUser, firstPost, secondPost, firstPage, firstTag;
beforeEach(function () { beforeEach(async function () {
this.server.loadFixtures();
await authenticateSession();
suite.beforeEach.bind(this)(); suite.beforeEach.bind(this)();
const settings = this.owner.lookup('service:settings');
await settings.fetch();
search = this.owner.lookup('service:search'); search = this.owner.lookup('service:search');
// populate store with data we'll be searching // 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'}); 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 () { it('returns urls for search results', async function () {
const results = await search.searchTask.perform('first'); const results = await search.searchTask.perform('first');

View File

@ -19,8 +19,7 @@ const GA_FEATURES = [
'themeErrorsNotification', 'themeErrorsNotification',
'outboundLinkTagging', 'outboundLinkTagging',
'announcementBar', 'announcementBar',
'newEmailAddresses', 'newEmailAddresses'
'internalLinking'
]; ];
// NOTE: this allowlist is meant to be used to filter out any unexpected // 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-card-factory": "5.0.4",
"@tryghost/kg-converters": "1.0.5", "@tryghost/kg-converters": "1.0.5",
"@tryghost/kg-default-atoms": "5.0.3", "@tryghost/kg-default-atoms": "5.0.3",
"@tryghost/kg-default-cards": "10.0.6", "@tryghost/kg-default-cards": "10.0.7",
"@tryghost/kg-default-nodes": "1.1.9", "@tryghost/kg-default-nodes": "1.1.10",
"@tryghost/kg-html-to-lexical": "1.1.10", "@tryghost/kg-html-to-lexical": "1.1.11",
"@tryghost/kg-lexical-html-renderer": "1.1.12", "@tryghost/kg-lexical-html-renderer": "1.1.13",
"@tryghost/kg-mobiledoc-html-renderer": "7.0.4", "@tryghost/kg-mobiledoc-html-renderer": "7.0.5",
"@tryghost/limit-service": "1.2.14", "@tryghost/limit-service": "1.2.14",
"@tryghost/link-redirects": "0.0.0", "@tryghost/link-redirects": "0.0.0",
"@tryghost/link-replacer": "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 { Object {
"access-control-allow-origin": "http://127.0.0.1:2369", "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", "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-type": "application/json; charset=utf-8",
"content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/, "content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/,
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,

View File

@ -29,7 +29,7 @@
"@tryghost/email-events": "0.0.0", "@tryghost/email-events": "0.0.0",
"@tryghost/errors": "1.3.5", "@tryghost/errors": "1.3.5",
"@tryghost/html-to-plaintext": "0.0.0", "@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/logging": "2.4.18",
"@tryghost/tpl": "0.1.32", "@tryghost/tpl": "0.1.32",
"@tryghost/validator": "0.2.14", "@tryghost/validator": "0.2.14",

View File

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