diff --git a/src/FieldsArray.ts b/src/FieldsArray.ts index ab08494..f0aa40e 100644 --- a/src/FieldsArray.ts +++ b/src/FieldsArray.ts @@ -1,4 +1,7 @@ +import PKPass from "./PKPass"; +import { fieldKeysPoolSymbol } from "./PKPass"; import * as Schemas from "./schemas"; +import * as Utils from "./utils"; import formatMessage, * as Messages from "./messages"; /** @@ -6,14 +9,17 @@ import formatMessage, * as Messages from "./messages"; * @see https://apple.co/2wkUBdh */ -const poolSymbol = Symbol("pool"); +const passInstanceSymbol = Symbol("passInstance"); export default class FieldsArray extends Array { - private [poolSymbol]: Set; + private [passInstanceSymbol]: InstanceType; - constructor(pool: Set, ...args: Schemas.Field[]) { + constructor( + passInstance: InstanceType, + ...args: Schemas.Field[] + ) { super(...args); - this[poolSymbol] = pool; + this[passInstanceSymbol] = passInstance; } /** @@ -22,6 +28,8 @@ export default class FieldsArray extends Array { */ push(...fieldsData: Schemas.Field[]): number { + Utils.assertUnfrozen(this[passInstanceSymbol]); + const validFields = fieldsData.reduce( (acc: Schemas.Field[], current: Schemas.Field) => { try { @@ -35,7 +43,9 @@ export default class FieldsArray extends Array { return acc; } - if (this[poolSymbol].has(current.key)) { + const pool = this[passInstanceSymbol][fieldKeysPoolSymbol]; + + if (pool.has(current.key)) { console.warn( formatMessage( Messages.FIELDS.REPEATED_KEY, @@ -45,7 +55,7 @@ export default class FieldsArray extends Array { return acc; } - this[poolSymbol].add(current.key); + pool.add(current.key); return [...acc, current]; }, [], @@ -60,8 +70,10 @@ export default class FieldsArray extends Array { */ pop(): Schemas.Field { + Utils.assertUnfrozen(this[passInstanceSymbol]); + const element: Schemas.Field = super.pop(); - this[poolSymbol].delete(element.key); + this[passInstanceSymbol][fieldKeysPoolSymbol].delete(element.key); return element; } @@ -75,8 +87,12 @@ export default class FieldsArray extends Array { deleteCount: number, ...items: Schemas.Field[] ): Schemas.Field[] { + Utils.assertUnfrozen(this[passInstanceSymbol]); + const removeList = this.slice(start, deleteCount + start); - removeList.forEach((item) => this[poolSymbol].delete(item.key)); + removeList.forEach((item) => + this[passInstanceSymbol][fieldKeysPoolSymbol].delete(item.key), + ); return super.splice(start, deleteCount, ...items); } diff --git a/src/PKPass.ts b/src/PKPass.ts index 081ae9b..c0e464f 100644 --- a/src/PKPass.ts +++ b/src/PKPass.ts @@ -305,11 +305,11 @@ export default class PKPass extends Bundle { this[passTypeSymbol] = type; this[propsSymbol][this[passTypeSymbol]] = { - headerFields /******/: new FieldsArray(this[fieldKeysPoolSymbol]), - primaryFields /*****/: new FieldsArray(this[fieldKeysPoolSymbol]), - secondaryFields /***/: new FieldsArray(this[fieldKeysPoolSymbol]), - auxiliaryFields /***/: new FieldsArray(this[fieldKeysPoolSymbol]), - backFields /********/: new FieldsArray(this[fieldKeysPoolSymbol]), + headerFields /******/: new FieldsArray(this), + primaryFields /*****/: new FieldsArray(this), + secondaryFields /***/: new FieldsArray(this), + auxiliaryFields /***/: new FieldsArray(this), + backFields /********/: new FieldsArray(this), transitType: undefined, }; } diff --git a/src/utils.ts b/src/utils.ts index 6636a9d..d15e9d3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,3 +1,6 @@ +import * as Messages from "./messages"; +import type Bundle from "./Bundle"; + /** * Acts as a wrapper for converting date to W3C string * @param date @@ -105,3 +108,9 @@ export function cloneRecursive(object: Object) { return objectCopy; } + +export function assertUnfrozen(instance: InstanceType) { + if (instance.isFrozen) { + throw new Error(Messages.BUNDLE.CLOSED); + } +}