passkit-generator
Version:
The easiest way to generate custom Apple Wallet passes in Node.js
125 lines • 5.44 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.filterValid = exports.validate = exports.assertValidity = exports.Template = exports.PassProps = exports.OverridablePassProps = exports.PassType = exports.PassKindsProps = exports.PassPropsFromMethods = void 0;
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./Barcode"), exports);
tslib_1.__exportStar(require("./Beacon"), exports);
tslib_1.__exportStar(require("./Location"), exports);
tslib_1.__exportStar(require("./Field"), exports);
tslib_1.__exportStar(require("./NFC"), exports);
tslib_1.__exportStar(require("./Semantics"), exports);
tslib_1.__exportStar(require("./PassFields"), exports);
tslib_1.__exportStar(require("./Personalize"), exports);
tslib_1.__exportStar(require("./Certificates"), exports);
const joi_1 = tslib_1.__importDefault(require("joi"));
const Barcode_1 = require("./Barcode");
const Location_1 = require("./Location");
const Beacon_1 = require("./Beacon");
const NFC_1 = require("./NFC");
const PassFields_1 = require("./PassFields");
const Semantics_1 = require("./Semantics");
const Messages = tslib_1.__importStar(require("../messages"));
const RGB_COLOR_REGEX = /rgb\(\s*(?:[01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\s*,\s*(?:[01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\s*,\s*(?:[01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\s*\)/;
exports.PassPropsFromMethods = joi_1.default.object({
nfc: NFC_1.NFC,
beacons: joi_1.default.array().items(Beacon_1.Beacon),
barcodes: joi_1.default.array().items(Barcode_1.Barcode),
relevantDate: joi_1.default.string().isoDate(),
expirationDate: joi_1.default.string().isoDate(),
locations: joi_1.default.array().items(Location_1.Location),
});
exports.PassKindsProps = joi_1.default.object({
coupon: PassFields_1.PassFields.disallow("transitType"),
generic: PassFields_1.PassFields.disallow("transitType"),
storeCard: PassFields_1.PassFields.disallow("transitType"),
eventTicket: PassFields_1.PassFields.disallow("transitType"),
boardingPass: PassFields_1.PassFields,
});
exports.PassType = joi_1.default.string().regex(/(boardingPass|coupon|eventTicket|storeCard|generic)/);
exports.OverridablePassProps = joi_1.default.object({
formatVersion: joi_1.default.number().default(1),
semantics: Semantics_1.Semantics,
voided: joi_1.default.boolean(),
logoText: joi_1.default.string(),
description: joi_1.default.string(),
serialNumber: joi_1.default.string(),
appLaunchURL: joi_1.default.string(),
teamIdentifier: joi_1.default.string(),
organizationName: joi_1.default.string(),
passTypeIdentifier: joi_1.default.string(),
sharingProhibited: joi_1.default.boolean(),
groupingIdentifier: joi_1.default.string(),
suppressStripShine: joi_1.default.boolean(),
maxDistance: joi_1.default.number().positive(),
authenticationToken: joi_1.default.string().min(16),
labelColor: joi_1.default.string().regex(RGB_COLOR_REGEX),
backgroundColor: joi_1.default.string().regex(RGB_COLOR_REGEX),
foregroundColor: joi_1.default.string().regex(RGB_COLOR_REGEX),
associatedStoreIdentifiers: joi_1.default.array().items(joi_1.default.number()),
userInfo: joi_1.default.alternatives(joi_1.default.object().unknown(), joi_1.default.array()),
// parsing url as set of words and nums followed by dots, optional port and any possible path after
webServiceURL: joi_1.default.string().regex(/https?:\/\/(?:[a-z0-9]+\.?)+(?::\d{2,})?(?:\/[\S]+)*/),
}).with("webServiceURL", "authenticationToken");
exports.PassProps = joi_1.default.object()
.concat(exports.OverridablePassProps)
.concat(exports.PassKindsProps)
.concat(exports.PassPropsFromMethods);
exports.Template = joi_1.default.object({
model: joi_1.default.string().required(),
certificates: joi_1.default.object().required(),
});
// --------- UTILITIES ---------- //
/**
* Performs validation of a schema on an object.
* If it fails, will throw an error.
*
* @param schema
* @param data
*/
function assertValidity(schema, data, customErrorMessage) {
const validation = schema.validate(data);
if (validation.error) {
if (customErrorMessage) {
console.warn(validation.error);
throw new TypeError(`${validation.error.name} happened. ${Messages.format(customErrorMessage, validation.error.message)}`);
}
throw new TypeError(validation.error.message);
}
}
exports.assertValidity = assertValidity;
/**
* Performs validation and throws the error if there's one.
* Otherwise returns a (possibly patched) version of the specified
* options (it depends on the schema)
*
* @param schema
* @param options
* @returns
*/
function validate(schema, options) {
const validationResult = schema.validate(options, {
stripUnknown: true,
abortEarly: true,
});
if (validationResult.error) {
throw validationResult.error;
}
return validationResult.value;
}
exports.validate = validate;
function filterValid(schema, source) {
if (!source) {
return [];
}
return source.reduce((acc, current) => {
try {
return [...acc, validate(schema, current)];
}
catch (err) {
console.warn(Messages.format(Messages.FILTER_VALID.INVALID, err));
return [...acc];
}
}, []);
}
exports.filterValid = filterValid;
//# sourceMappingURL=index.js.map