diff --git a/spec/PKPass.ts b/spec/PKPass.ts new file mode 100644 index 0000000..6027e9b --- /dev/null +++ b/spec/PKPass.ts @@ -0,0 +1,48 @@ +import { default as PKPass } from "../lib/PKPass"; + +describe("PKPass", () => { + describe("setBeacons", () => { + it("should reset instance.props['beacons'] if 'null' is passed as value", () => { + const pass = new PKPass({}, {}); + + pass.setBeacons({ + proximityUUID: "0000000000-00000000", + major: 4, + minor: 3, + relevantText: "This is not the Kevin you are looking for.", + }); + + expect(pass.props["beacons"].length).toBe(1); + + pass.setBeacons(null); + + expect(pass.props["beacons"]).toBeUndefined(); + }); + + it("should filter out invalid beacons objects", () => { + const pass = new PKPass({}, {}); + + /** This is invalid, major should be greater than minor */ + pass.setBeacons( + { + proximityUUID: "0000000000-00000000", + major: 2, + minor: 3, + relevantText: "This is not the Kevin you are looking for.", + }, + // @ts-expect-error + { + major: 2, + minor: 3, + }, + { + proximityUUID: "0000000000-00000", + major: 2, + minor: 1, + }, + ); + + expect(pass.props["beacons"].length).toBe(1); + }); + }); +}); diff --git a/src/PKPass.ts b/src/PKPass.ts index 64eef2d..3694af8 100644 --- a/src/PKPass.ts +++ b/src/PKPass.ts @@ -284,15 +284,32 @@ export default class PKPass extends Bundle { * Allows setting some beacons the OS should * react to and show this pass. * + * Pass `null` to remove them at all. + * + * @example + * ```ts + * PKPassInstance.setBeacons(null) + * PKPassInstance.setBeacons({ + * proximityUUID: "00000-000000-0000-00000000000", + * }); + * ``` + * * @param beacons * @returns */ - setBeacons(...beacons: Schemas.Beacon[]): this { - /** - * @TODO implement - * @TODO specify a way to get current ones deleted - */ + setBeacons(beacons: null): this; + setBeacons(...beacons: Schemas.Beacon[]): this; + setBeacons(...beacons: (Schemas.Beacon | null)[]): this { + if (beacons[0] === null) { + delete this[propsSymbol]["beacons"]; + return; + } + + this[propsSymbol]["beacons"] = Schemas.filterValid( + beacons, + Schemas.Beacon, + ); return this; } diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 20c3df9..88fca9e 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -245,3 +245,14 @@ export function getValidated( return validation.value; } + +export function filterValid( + source: T[], + schema: AvailableSchemas, +): T[] { + if (!source) { + return []; + } + + return source.filter((current) => isValid(current, schema)); +}