diff --git a/src/core/render/slugify.js b/src/core/render/slugify.js index 6f1f6a7ee..825011779 100644 --- a/src/core/render/slugify.js +++ b/src/core/render/slugify.js @@ -23,7 +23,7 @@ export function slugify(str) { .replace(/^(\d)/, '_$1'); let count = cache[slug]; - count = Object.keys(cache).includes(slug) ? count + 1 : 0; + count = Object.prototype.hasOwnProperty.call(cache, slug) ? count + 1 : 0; cache[slug] = count; if (count) { diff --git a/test/unit/render-util.test.js b/test/unit/render-util.test.js index 9636c01e6..77cb0c0fd 100644 --- a/test/unit/render-util.test.js +++ b/test/unit/render-util.test.js @@ -167,6 +167,10 @@ describe('core/render/tpl', () => { }); describe('core/render/slugify', () => { + beforeEach(() => { + slugify.clear(); + }); + test('slugify()', () => { const htmlStrippedSlug = slugify( 'Bla bla bla ', @@ -218,4 +222,18 @@ describe('core/render/slugify', () => { ); expect(markdownLinkSlug).toBe('_500-rc4-2026-03-11'); }); + + test('slugify.clear() resets duplicate tracking', () => { + expect(slugify('duplicate')).toBe('duplicate'); + expect(slugify('duplicate')).toBe('duplicate-1'); + + slugify.clear(); + + expect(slugify('duplicate')).toBe('duplicate'); + }); + + test('slugify() handles inherited property names as new slugs', () => { + expect(slugify('constructor')).toBe('constructor'); + expect(slugify('constructor')).toBe('constructor-1'); + }); });