From 9a63f838a793793c60ab83144c6a0c2dbf7ff98a Mon Sep 17 00:00:00 2001 From: Alexander Cerutti Date: Sat, 25 May 2019 00:34:51 +0200 Subject: [PATCH 1/4] 1.6.4 Changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9270ee..8290b95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ Since every new minor, major or patch version is pushed in the repository with the npm autogenerated commit for version update, a history become needed. The lists won't include the npm autogenerated commit. +___ +## 1.6.4 + +[ [#903192522](/commit/903192522c2646c42a020b5c554ca263315094fc) ] + + Added windows path slash parsing + ___ ## 1.6.1 --> 1.6.3 From ab6af17ee7cc644f98ecca8bb43578707b6b0319 Mon Sep 17 00:00:00 2001 From: Alexander Cerutti Date: Sat, 25 May 2019 00:34:57 +0200 Subject: [PATCH 2/4] 1.6.4 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a8d11c..769667e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "passkit-generator", - "version": "1.6.3", + "version": "1.6.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1cd94f2..e02ef0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "passkit-generator", - "version": "1.6.3", + "version": "1.6.4", "description": "The easiest way to generate custom Apple Wallet passes in Node.js", "main": "index.js", "scripts": { From 0e46d855e43c2fd736aee0e43c5c993fbc41a0b9 Mon Sep 17 00:00:00 2001 From: Ian Bale Date: Fri, 7 Jun 2019 11:14:21 +0100 Subject: [PATCH 3/4] Fixing passes parallel generation (#31) by Ianbale --- src/fieldsArray.js | 37 +++++++++++++++---------------------- src/pass.js | 9 ++++++--- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/fieldsArray.js b/src/fieldsArray.js index e7a8c70..68a4dc2 100644 --- a/src/fieldsArray.js +++ b/src/fieldsArray.js @@ -1,21 +1,18 @@ const schema = require("./schema"); 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 * @see https://apple.co/2wkUBdh */ +const poolSymbol = Symbol("pool"); + class FieldsArray extends Array { - constructor(...items) { - super(...items); + + constructor(pool,...args) { + super(...args); + this[poolSymbol] = pool; } /** @@ -29,12 +26,12 @@ class FieldsArray extends Array { return acc; } - if (acc.some(e => e.key === current.key) || fieldsKeys.has(current.key)) { - debug(`Field with key "${current.key}" discarded: fields must be unique in pass scope.`); - } else { - fieldsKeys.add(current.key); - acc.push(current); - } + if (acc.some(e => e.key === current.key) || this[poolSymbol].has(current.key)) { + debug(`Field with key "${key}" discarded: fields must be unique in pass scope.`); + } + + this[poolSymbol].add(current.key) + acc.push(current) return acc; }, []); @@ -48,8 +45,8 @@ class FieldsArray extends Array { */ pop() { - const element = Array.prototype.pop.call(this); - fieldsKeys.delete(element.key); + const element = Array.prototype.pop.call(this); + this[poolSymbol].delete(element.key) return element; } @@ -60,7 +57,7 @@ class FieldsArray extends Array { splice(start, deleteCount, ...items) { const removeList = this.slice(start, deleteCount+start); - removeList.forEach(item => fieldsKeys.delete(item.key)); + removeList.forEach(item => this[poolSymbol].delete(item.key)); return Array.prototype.splice.call(this, start, deleteCount, items); } @@ -68,10 +65,6 @@ class FieldsArray extends Array { get length() { return this.length; } - - static emptyUnique() { - fieldsKeys.clear(); - } } module.exports = FieldsArray; diff --git a/src/pass.js b/src/pass.js index fd9dc2f..c6a802d 100644 --- a/src/pass.js +++ b/src/pass.js @@ -44,7 +44,12 @@ class Pass { this._fields = ["primaryFields", "secondaryFields", "auxiliaryFields", "backFields", "headerFields"]; - this._fields.forEach(a => this[a] = new FieldsArray()); + this.fieldsKeys = new Set(); + + this._fields.forEach(name => { + this[name] = new FieldsArray(this.fieldsKeys); + }); + this[transitType] = ""; // Assigning model and _props to this @@ -213,8 +218,6 @@ class Pass { archive.pipe(passStream); - FieldsArray.emptyUnique(); - return archive.finalize().then(() => passStream); } catch (err) { if (err.code && err.code === "ENOENT") { From 4ce889d6558678f01a993dcbd3e60b568e787638 Mon Sep 17 00:00:00 2001 From: Ian Bale Date: Fri, 7 Jun 2019 11:42:28 +0100 Subject: [PATCH 4/4] Adding support for native Dates (#32) by Ianbale --- spec/index.js | 16 ++++++++++++++++ src/pass.js | 7 ++++++- src/utils.js | 4 ++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/spec/index.js b/spec/index.js index 3c25872..07d647a 100644 --- a/spec/index.js +++ b/spec/index.js @@ -91,6 +91,14 @@ describe("Node-Passkit-generator", function () { expect(noTimeZoneDateTime).toBe("2021-04-10T00:00:00"); }); + it("A date as a Date object will apply changes", () => { + pass.expiration(new Date(2020,5,1,0,0,0)); + // this is made to avoid problems with winter and summer time: + // we focus only on the date and time for the tests. + let noTimeZoneDateTime = pass._props["expirationDate"].split("+")[0]; + expect(noTimeZoneDateTime).toBe("2020-06-01T00:00:00"); + }); + it("An invalid date, will not apply changes", () => { pass.expiration("32/18/228317"); expect(pass._props["expirationDate"]).toBe(undefined); @@ -125,6 +133,14 @@ describe("Node-Passkit-generator", function () { let noTimeZoneDateTime = pass._props["relevantDate"].split("+")[0]; expect(noTimeZoneDateTime).toBe("2021-04-10T00:00:00"); }); + + it("A date as a Date object will apply changes", () => { + pass.relevance("relevantDate",new Date(2020,5,1,0,0,0)); + // this is made to avoid problems with winter and summer time: + // we focus only on the date and time for the tests. + let noTimeZoneDateTime = pass._props["relevantDate"].split("+")[0]; + expect(noTimeZoneDateTime).toBe("2020-06-01T00:00:00"); + }); }); describe("relevance('maxDistance')", () => { diff --git a/src/pass.js b/src/pass.js index c6a802d..437e852 100644 --- a/src/pass.js +++ b/src/pass.js @@ -259,7 +259,7 @@ class Pass { */ expiration(date, format) { - if (typeof date !== "string") { + if (typeof date !== "string" && !(date instanceof Date)) { return this; } @@ -327,6 +327,11 @@ class Pass { return assignLength(Number(!cond), this); } else if (type === "relevantDate") { + if (typeof data !== "string" && !(data instanceof Date)) { + genericDebug(formatMessage("DATE_FORMAT_UNMATCH", "Relevant Date")); + return this; + } + let dateParse = dateToW3CString(data, relevanceDateFormat); if (!dateParse) { diff --git a/src/utils.js b/src/utils.js index 56a1aeb..61c7504 100644 --- a/src/utils.js +++ b/src/utils.js @@ -34,11 +34,11 @@ function isValidRGB(value) { */ function dateToW3CString(date, format) { - if (typeof date !== "string") { + if (typeof date !== "string" && !(date instanceof Date)) { return ""; } - const parsedDate = moment(date.replace(/\//g, "-"), format || ["MM-DD-YYYY hh:mm:ss", "DD-MM-YYYY hh:mm:ss"]).format(); + const parsedDate = date instanceof Date ? moment(date).format() : moment(date.replace(/\//g, "-"), format || ["MM-DD-YYYY hh:mm:ss", "DD-MM-YYYY hh:mm:ss"]).format(); if (parsedDate === "Invalid date") { return undefined;