From b3963dbd65d0f733ea185afc869735d19263fa65 Mon Sep 17 00:00:00 2001 From: Matt Karl Date: Mon, 12 Dec 2022 09:39:01 -0500 Subject: [PATCH] Loose extensions where not getting prioritized correctly (#8961) --- packages/extensions/src/index.ts | 15 ++++++++-- packages/extensions/test/extensions.tests.ts | 31 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/packages/extensions/src/index.ts b/packages/extensions/src/index.ts index aa5399d386..9c8f64d0b0 100644 --- a/packages/extensions/src/index.ts +++ b/packages/extensions/src/index.ts @@ -102,6 +102,16 @@ const normalizeExtension = (ext: ExtensionFormatLoose | any): ExtensionFormat => return ext; }; +/** + * Get the priority for an extension. + * @ignore + * @param ext - Any extension + * @param defaultPriority - Fallback priority if none is defined. + * @returns The priority for the extension. + */ +const normalizePriority = (ext: ExtensionFormatLoose | any, defaultPriority: number): number => + normalizeExtension(ext).priority ?? defaultPriority; + /** * Global registration of all PixiJS extensions. One-stop-shop for extensibility. * @memberof PIXI @@ -222,9 +232,10 @@ const extensions = { * Handle a type, but using a list of extensions. * @param type - Type of extension to handle. * @param list - The list of extensions. + * @param defaultPriority - The default priority to use if none is specified. * @returns {PIXI.extensions} For chaining. */ - handleByList(type: ExtensionType, list: any[]) + handleByList(type: ExtensionType, list: any[], defaultPriority = -1) { return this.handle( type, @@ -236,7 +247,7 @@ const extensions = { } list.push(extension.ref); - list.sort((a, b) => (b.priority ?? -1) - (a.priority ?? -1)); + list.sort((a, b) => normalizePriority(b, defaultPriority) - normalizePriority(a, defaultPriority)); }, (extension) => { diff --git a/packages/extensions/test/extensions.tests.ts b/packages/extensions/test/extensions.tests.ts index f781e40f19..1abe3410b3 100644 --- a/packages/extensions/test/extensions.tests.ts +++ b/packages/extensions/test/extensions.tests.ts @@ -73,6 +73,37 @@ describe('extensions', () => extensions.add(example); expect(list.length).toBe(1); }); + + it('should add extensions in order of priority', () => + { + const ext1 = { + extension: { + priority: 1, + type: exampleType, + }, + }; + const ext2 = { + extension: { + priority: 2, + type: exampleType, + }, + }; + const ext3 = { + extension: { + priority: 0, + type: exampleType, + }, + }; + const list: any[] = []; + + extensions.handleByList(exampleType, list); + extensions.add(ext1); + extensions.add(ext2); + extensions.add(ext3); + expect(list[0]).toBe(ext2); + expect(list[1]).toBe(ext1); + expect(list[2]).toBe(ext3); + }); }); describe('add', () =>