Improved unique fields management;

Changed debug message for discarded fields;
Renamed uniqueKeys to fieldsKeys
This commit is contained in:
Alexander Cerutti
2019-04-24 22:52:37 +02:00
parent e55b8c5d09
commit c559a7f1ce

View File

@@ -1,13 +1,18 @@
const schema = require("./schema"); const schema = require("./schema");
const debug = require("debug")("passkit:fields"); const debug = require("debug")("passkit:fields");
/**
* Pass fields must be unique (for key) in its scope.
* Therefore we use a Set to keep them tracked.
*/
const fieldsKeys = new Set();
/** /**
* Class to represent lower-level keys pass fields * Class to represent lower-level keys pass fields
* @see https://apple.co/2wkUBdh * @see https://apple.co/2wkUBdh
*/ */
const uniqueKeys = new Set();
class FieldsArray extends Array { class FieldsArray extends Array {
constructor(...items) { constructor(...items) {
super(...items); super(...items);
@@ -19,15 +24,15 @@ class FieldsArray extends Array {
*/ */
push(...fieldsData) { push(...fieldsData) {
let validFields = fieldsData.reduce((acc, current) => { const validFields = fieldsData.reduce((acc, current) => {
if (!(typeof current === "object") || !schema.isValid(current, "field")) { if (!(typeof current === "object") || !schema.isValid(current, "field")) {
return acc; return acc;
} }
if (acc.some(e => e.key === current.key) || uniqueKeys.has(current.key)) { if (acc.some(e => e.key === current.key) || fieldsKeys.has(current.key)) {
debug(`UNIQUE field key CONSTRAINT VIOLATED. Fields keys must be unique in pass scope. Field key: "${current.key}"`); debug(`Field with key "${current.key}" discarded: fields must be unique in pass scope.`);
} else { } else {
uniqueKeys.add(current.key); fieldsKeys.add(current.key);
acc.push(current); acc.push(current);
} }
@@ -44,7 +49,7 @@ class FieldsArray extends Array {
pop() { pop() {
const element = Array.prototype.pop.call(this); const element = Array.prototype.pop.call(this);
uniqueKeys.delete(element.key); fieldsKeys.delete(element.key);
return element; return element;
} }
@@ -54,8 +59,8 @@ class FieldsArray extends Array {
*/ */
splice(start, deleteCount, ...items) { splice(start, deleteCount, ...items) {
let removeList = this.slice(start, deleteCount+start); const removeList = this.slice(start, deleteCount+start);
removeList.forEach(item => uniqueKeys.delete(item.key)); removeList.forEach(item => fieldsKeys.delete(item.key));
return Array.prototype.splice.call(this, start, deleteCount, items); return Array.prototype.splice.call(this, start, deleteCount, items);
} }
@@ -65,7 +70,7 @@ class FieldsArray extends Array {
} }
static emptyUnique() { static emptyUnique() {
uniqueKeys.clear(); fieldsKeys.clear();
} }
} }