diff --git a/CHANGELOG.md b/CHANGELOG.md index 61d2dd88..45f79581 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Breaking Changes -- +- `ex.Util.extend()` is removed, modern js spread operator `{...someobject, ...someotherobject}` handles this better. ### Deprecated diff --git a/src/engine/Trigger.ts b/src/engine/Trigger.ts index 57b1725a..183ce666 100644 --- a/src/engine/Trigger.ts +++ b/src/engine/Trigger.ts @@ -3,7 +3,6 @@ import { Engine } from './Engine'; import { EventDispatcher } from './EventDispatcher'; import { Vector } from './Math/vector'; import { ExitTriggerEvent, EnterTriggerEvent, CollisionEndEvent, CollisionStartEvent } from './Events'; -import * as Util from './Util/Util'; import { CollisionType } from './Collision/CollisionType'; import { Entity } from './EntityComponentSystem'; import { Actor } from './Actor'; @@ -71,7 +70,10 @@ export class Trigger extends Actor { */ constructor(opts: Partial) { super({ x: opts.pos.x, y: opts.pos.y, width: opts.width, height: opts.height }); - opts = Util.extend({}, triggerDefaults, opts); + opts = { + ...triggerDefaults, + ...opts + }; this.filter = opts.filter || this.filter; this.repeat = opts.repeat || this.repeat; diff --git a/src/engine/Util/Decorators.ts b/src/engine/Util/Decorators.ts index 5e266919..41bca5ed 100644 --- a/src/engine/Util/Decorators.ts +++ b/src/engine/Util/Decorators.ts @@ -1,6 +1,5 @@ import { Flags } from '../Flags'; import { Logger } from './Log'; -import { extend } from './Util'; /** * Obsolete decorator options @@ -41,15 +40,12 @@ const logMessage = (message: string, options: ObsoleteOptions) => { * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js */ export function obsolete(options?: ObsoleteOptions): any { - options = extend( - {}, - { - message: 'This feature will be removed in future versions of Excalibur.', - alternateMethod: null, - showStackTrack: false - }, - options - ); + options = { + message: 'This feature will be removed in future versions of Excalibur.', + alternateMethod: null, + showStackTrace: false, + ...options + }; return function (target: any, property: string, descriptor: PropertyDescriptor): any { if ( diff --git a/src/engine/Util/Util.ts b/src/engine/Util/Util.ts index 315bbd0d..fedeb806 100644 --- a/src/engine/Util/Util.ts +++ b/src/engine/Util/Util.ts @@ -7,94 +7,6 @@ import { Side } from '../Collision/Side'; */ export const TwoPI: number = Math.PI * 2; -/** - * Merges one or more objects into a single target object - * - * @param deep Whether or not to do a deep clone - * @param target The target object to attach properties on - * @param objects The objects whose properties to merge - * @returns Merged object with properties from other objects - */ -export function extend(deep: boolean, target: any, ...objects: any[]): any; - -/** - * Merges one or more objects into a single target object - * - * @param target The target object to attach properties on - * @param object2 The second object whose properties to merge - * @returns Merged object with properties from other objects - */ -export function extend(target: T1, object2: T2): T1 & T2; - -/** - * Merges one or more objects into a single target object - * - * @param target The target object to attach properties on - * @param object2 The second object whose properties to merge - * @param object3 The third object whose properties to merge - * @returns Merged object with properties from other objects - */ -export function extend(target: T1, object2: T2, object3: T3): T1 & T2 & T3; - -/** - * Merges one or more objects into a single target object - * - * @param target The target object to attach properties on - * @param objects The objects whose properties to merge - * @returns Merged object with properties from other objects - */ -export function extend(target: any, ...objects: any[]): any; - -/** - * Merges one or more objects into a single target object - * - * @returns Merged object with properties from other objects - * @credit https://gomakethings.com/vanilla-javascript-version-of-jquery-extend/ - */ -export function extend() { - const extended: { [key: string]: any } = {}; - let deep = false; - let i = 0; - const length = arguments.length; - - // Check if a deep merge - if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') { - deep = arguments[0]; - i++; - } - - // Merge the object into the extended object - const assignExists = typeof (Object).assign === 'function'; - let merge = null; - if (!assignExists) { - merge = function (obj: any) { - for (const prop in obj) { - if (Object.prototype.hasOwnProperty.call(obj, prop)) { - // If deep merge and property is an object, merge properties - if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') { - extended[prop] = extend(true, extended[prop], obj[prop]); - } else { - extended[prop] = obj[prop]; - } - } - } - }; - } else { - merge = (Object).assign; - } - - // Loop through each object and conduct a merge - for (; i < length; i++) { - const obj = arguments[i]; - if (!assignExists) { - merge(obj); - } else { - merge(extended, obj); - } - } - - return extended; -} /** * Encode a string in base64 diff --git a/src/spec/UtilSpec.ts b/src/spec/UtilSpec.ts index 7b4f6139..2ed23ddd 100644 --- a/src/spec/UtilSpec.ts +++ b/src/spec/UtilSpec.ts @@ -56,35 +56,4 @@ describe('Utility functions', () => { expect(value).toBe('value'); }); }); - - describe('extend', () => { - it('should assign simple objects', () => { - const obj1 = { foo: true }; - const obj2 = { bar: true }; - expect(ex.Util.extend({}, obj1, obj2)).toEqual({ - ...obj1, - ...obj2 - }); - }); - - it('should assign complex objects', () => { - const obj1 = { foo: true, deep: { switch: false, donotswitch: true } }; - const obj2 = { bar: true, deep: { switch: true } }; - expect(ex.Util.extend({}, obj1, obj2)).toEqual({ - ...obj1, - ...obj2 - }); - }); - - xit('todo: should deeply extend complex objects', () => { - const obj1 = { deep: { overwrite: false, preserve: true } }; - const obj2 = { deep: { overwrite: true } }; - expect(ex.Util.extend(true, {}, obj1, obj2)).toEqual({ - deep: { - overwrite: true, - preserve: true - } - }); - }); - }); }); diff --git a/src/spec/util/TestUtils.ts b/src/spec/util/TestUtils.ts index dd9acd0e..2839e77c 100644 --- a/src/spec/util/TestUtils.ts +++ b/src/spec/util/TestUtils.ts @@ -9,21 +9,18 @@ export namespace TestUtils { 'use-legacy-drawing', 'use-canvas-context', 'suppress-obsolete-message']): ex.Engine { - options = ex.Util.extend( - false, - { - width: 500, - height: 500, - suppressConsoleBootMessage: true, - enableCanvasTransparency: true, - suppressMinimumBrowserFeatureDetection: true, - suppressHiDPIScaling: true, - suppressPlayButton: true, - displayMode: ex.DisplayMode.Position, - position: 'top' - }, - options - ); + options = { + width: 500, + height: 500, + suppressConsoleBootMessage: true, + enableCanvasTransparency: true, + suppressMinimumBrowserFeatureDetection: true, + suppressHiDPIScaling: true, + suppressPlayButton: true, + displayMode: ex.DisplayMode.Position, + position: 'top', + ...options + }; ex.Flags._reset(); ex.Flags.enable('suppress-obsolete-message'); flags.forEach(f => ex.Flags.enable(f));