passkit-generator
Version:
The easiest way to generate custom Apple Wallet passes in Node.js
356 lines • 21.5 kB
JavaScript
import Joi from "joi";
import * as SemanticTagType from "./SemanticTagType.js";
export const Semantics = Joi.object().keys({
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
admissionLevel: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
admissionLevelAbbreviation: Joi.string(),
airlineCode: Joi.string(),
artistIDs: Joi.array().items(Joi.string()),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
albumIDs: Joi.array().items(Joi.string()),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
airplay: Joi.array().items({
airplayDeviceGroupToken: Joi.string(),
}),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
attendeeName: Joi.string(),
awayTeamAbbreviation: Joi.string(),
awayTeamLocation: Joi.string(),
awayTeamName: Joi.string(),
/**
* @iOSVersion 18
*
* Additional ticket attributes that other tags or keys in the pass don’t include.
* Use this key for any type of event ticket.
*/
additionalTicketAttributes: Joi.string(),
balance: SemanticTagType.CurrencyAmount,
/**
* A group number for boarding.
* Use this key for any type of boarding pass.
*/
boardingGroup: Joi.string(),
/**
* A sequence number for boarding.
* Use this key for any type of boarding pass.
*/
boardingSequenceNumber: Joi.string(),
/**
* @iOSVersion 26
*
* A zone number for boarding. Don't include the word _zone_.
*/
boardingZone: Joi.string(),
/**
* The number of the passenger car.
* A train car is also called a carriage, wagon, coach, or bogie in some countries.
* Use this key only for a train or other rail boarding pass.
*/
carNumber: Joi.string(),
confirmationNumber: Joi.string(),
currentArrivalDate: Joi.string(),
currentBoardingDate: Joi.string(),
currentDepartureDate: Joi.string(),
/**
* The IATA airport code for the departure airport, such as `MPM` or `LHR`.
* Use this key only for airline boarding passes.
*/
departureAirportCode: Joi.string(),
/**
* The full name of the departure airport, such as `Maputo International Airport`.
* Use this key only for airline boarding passes.
*/
departureAirportName: Joi.string(),
/**
* @iOSVersion 26
*
* The name of the departure city to display on the boarding pass, such as London or Shanghai.
*/
departureCityName: Joi.string(),
/**
* The gate number or letters of the departure gate, such as 1A. Don’t include the word gate.
*/
departureGate: Joi.string(),
/**
* An object that represents the geographic coordinates of the transit departure location,
* suitable for display on a map.
* If possible, use precise locations, which are more useful to travelers;
* for example, the specific location of an airport gate.
*
* Use this key for any type of boarding pass.
*/
departureLocation: SemanticTagType.Location,
departureLocationDescription: Joi.string(),
departurePlatform: Joi.string(),
departureStationName: Joi.string(),
departureTerminal: Joi.string(),
/**
* @iOSVersion 26
*
* A list of security programs that exist at the departure location. This only shows in the UI if a program is in `passengerEligibleSecurityPrograms` and at least one of `departureLocationSecurityPrograms` or `destinationLocationSecurityPrograms`
*/
departureLocationSecurityPrograms: Joi.array().items(Joi.string().regex(/(PKTransitSecurityProgramTSAPreCheck|PKTransitSecurityProgramTSAPreCheckTouchlessID|PKTransitSecurityProgramOSS|PKTransitSecurityProgramITI|PKTransitSecurityProgramITD|PKTransitSecurityProgramGlobalEntry|PKTransitSecurityProgramCLEAR)/)),
/**
* @iOSVersion 26
*
* The time zone of the departure location, such as America/Chicago. See the IANA Time Zone Database for the full list of supported time zones.
*/
departureLocationTimeZone: Joi.string(),
destinationAirportCode: Joi.string(),
destinationAirportName: Joi.string(),
/**
* @iOSVersion 26
*
* The name of the destination city to display on the boarding pass, such as London or Shanghai.
*/
destinationCityName: Joi.string(),
destinationGate: Joi.string(),
destinationLocation: SemanticTagType.Location,
destinationLocationDescription: Joi.string(),
destinationPlatform: Joi.string(),
destinationStationName: Joi.string(),
destinationTerminal: Joi.string(),
/**
* @iOSVersion 26
*
* A list of security programs the passenger is eligible for. This only shows in the UI if a program is in passengerEligibleSecurityPrograms and at least one of departureLocationSecurityPrograms or destinationLocationSecurityPrograms.
*/
destinationLocationSecurityPrograms: Joi.array().items(Joi.string().regex(/(PKTransitSecurityProgramTSAPreCheck|PKTransitSecurityProgramTSAPreCheckTouchlessID|PKTransitSecurityProgramOSS|PKTransitSecurityProgramITI|PKTransitSecurityProgramITD|PKTransitSecurityProgramGlobalEntry|PKTransitSecurityProgramCLEAR)/)),
/**
* @iOSVersion 26
*
* The time zone of the destination location, such as America/Los_Angeles. See the IANA Time Zone Database for the full list of supported time zones.
*/
destinationLocationTimeZone: Joi.string(),
duration: Joi.number(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
entranceDescription: Joi.string(),
eventEndDate: Joi.string(),
eventName: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*
* Shows a message in the live activity
* when the activity starts.
*/
eventLiveMessage: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout).
*
* Can be used as an alternative way to
* show show start date, with more control
* on time and timeZone details and as
* a way to show the event guide, both
* instead of `eventStartDate`.
*/
eventStartDateInfo: SemanticTagType.EventDateInfo,
eventStartDate: Joi.string(),
eventType: Joi.string().regex(/(PKEventTypeGeneric|PKEventTypeLivePerformance|PKEventTypeMovie|PKEventTypeSports|PKEventTypeConference|PKEventTypeConvention|PKEventTypeWorkshop|PKEventTypeSocialGathering)/),
flightCode: Joi.string(),
flightNumber: Joi.number(),
genre: Joi.string(),
homeTeamAbbreviation: Joi.string(),
homeTeamLocation: Joi.string(),
homeTeamName: Joi.string(),
/**
* @iOSVersion 26
*
* An optional boolean that indicates whether the passenger's international documents are verified. If set to `true` Wallet displays the badge on the boarding pass with the value from `internationalDocumentsVerifiedDeclarationName`.
*/
internationalDocumentsAreVerified: Joi.boolean(),
/**
* @iOSVersion 26
*
* The name of the declaration given once the passenger's international documents are verified. Examples include `DOCS OK` or `Travel Ready`. If `internationalDocumentsAreVerified` is true, Wallet displays a badge on the boarding pass with this value.
*/
internationalDocumentsVerifiedDeclarationName: Joi.string(),
/**
* The abbreviated league name for a sports event. Use this key only for a sports event ticket.
*/
leagueAbbreviation: Joi.string(),
/**
* The unabbreviated league name for a sports event. Use this key only for a sports event ticket.
*/
leagueName: Joi.string(),
/**
* @iOSVersion 26
*
* The MapKit Place IDs that reference the transit provider lounge locations. For more information, see [Identifying unique locations with Place IDs](https://developer.apple.com/documentation/MapKit/identifying-unique-locations-with-place-ids)
*/
loungePlaceIDs: Joi.array().items(Joi.string()),
/**
* The name of a frequent flyer or loyalty program.
* Use this key for any type of boarding pass.
*/
membershipProgramName: Joi.string(),
/**
* The ticketed passenger’s frequent flyer or loyalty number.
* Use this key for any type of boarding pass.
*/
membershipProgramNumber: Joi.string(),
/**
* @iOSVersion 26
*
* The ticketed passenger’s frequent flyer or loyalty program status.
* Use this key for any type of boarding pass.
*/
membershipProgramStatus: Joi.string(),
originalArrivalDate: Joi.string(),
originalBoardingDate: Joi.string(),
originalDepartureDate: Joi.string(),
/**
* An object that represents the name of the passenger.
* Use this key for any type of boarding pass.
*/
passengerName: SemanticTagType.PersonNameComponents,
/**
* @iOSVersion 26
*
* An array of airline-specific SSRs (Special Service Requests) that apply to the ticketed passenger.
*/
passengerAirlineSSRs: Joi.array().items(Joi.string()),
/**
* @iOSVersion 26
*
* A list of capabilities the passenger has. Only use this key for airline boarding passes.
*/
passengerCapabilities: Joi.array().items(Joi.string().regex(/(PKPassengerCapabilityPreboarding|PKPassengerCapabilityPriorityBoarding|PKPassengerCapabilityCarryon|PKPassengerCapabilityPersonalItem)/)),
/**
* @iOSVersion 26
*
* A list of security programs the passenger is eligible for. This only shows in the UI if a program is in `passengerEligibleSecurityPrograms` and at least one of `departureLocationSecurityPrograms` or `destinationLocationSecurityPrograms`.
*/
passengerEligibleSecurityPrograms: Joi.array().items(Joi.string().regex(/(PKTransitSecurityProgramTSAPreCheck|PKTransitSecurityProgramTSAPreCheckTouchlessID|PKTransitSecurityProgramOSS|PKTransitSecurityProgramITI|PKTransitSecurityProgramITD|PKTransitSecurityProgramGlobalEntry|PKTransitSecurityProgramCLEAR)/)),
/**
* @iOSVersion 26
*
* An array of IATA information SSRs that apply to the ticketed passenger. A comprehensive list of service SSRs can be found in the [IATA Airlines Developer Guide](https://guides.developer.iata.org/docs/21-1_ImplementationGuide.pdf) under A List of Information SSRs.
*/
passengerInformationSSRs: Joi.array().items(Joi.string()),
/**
* @iOSVersion 26
*
* An array of IATA SSRs that apply to the ticketed passenger. A comprehensive list of service SSRs can be found in the [IATA Airlines Developer Guide](https://guides.developer.iata.org/docs/21-1_ImplementationGuide.pdf) under A List of Service SSRs.
*/
passengerServiceSSRs: Joi.array().items(Joi.string()),
performerNames: Joi.array().items(Joi.string()),
/**
* The priority status the ticketed passenger holds, such as `Gold` or `Silver`.
* Use this key for any type of boarding pass.
*/
priorityStatus: Joi.string(),
playlistIDs: Joi.array().items(Joi.string()),
seats: Joi.array().items(SemanticTagType.Seat),
securityScreening: Joi.string(),
silenceRequested: Joi.boolean(),
sportName: Joi.string(),
tailgatingAllowed: Joi.boolean(),
/**
* @iOSVersion 26
*
* A localizable string that denotes the ticket class, such as `Saver`, `Economy`, `First`. This value displays as a badge on the boarding pass.
*/
ticketFareClass: Joi.string(),
totalPrice: SemanticTagType.CurrencyAmount,
/**
* The name of the transit company. Use this key for any type of boarding pass.
*/
transitProvider: Joi.string(),
/**
* A brief description of the current boarding status for the vessel, such as `On Time` or `Delayed`.
* For delayed status, provide `currentBoardingDate`, `currentDepartureDate`, and `currentArrivalDate` where available.
* Use this key for any type of boarding pass.
*/
transitStatus: Joi.string(),
/**
* A brief description that explains the reason for the current transitStatus, such as `Thunderstorms`.
* Use this key for any type of boarding pass.
*/
transitStatusReason: Joi.string(),
vehicleName: Joi.string(),
vehicleNumber: Joi.string(),
vehicleType: Joi.string(),
venueEntrance: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueGatesOpenDate: Joi.string(),
venueLocation: SemanticTagType.Location,
venueName: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueParkingLotsOpenDate: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueBoxOfficeOpenDate: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueDoorsOpenDate: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueFanZoneOpenDate: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueOpenDate: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueCloseDate: Joi.string(),
venuePhoneNumber: Joi.string(),
venueRoom: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueRegionName: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueEntranceGate: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueEntranceDoor: Joi.string(),
/**
* @iOSVersion 18
* @passStyle eventTicket (new layout)
*/
venueEntrancePortal: Joi.string(),
wifiAccess: Joi.array().items(SemanticTagType.WifiNetwork),
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VtYW50aWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NjaGVtYXMvU2VtYW50aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLEtBQUssZUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBbWdCeEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQWEsQ0FBQyxJQUFJLENBQUM7SUFDckQ7OztPQUdHO0lBQ0gsY0FBYyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUU7SUFFNUI7OztPQUdHO0lBQ0gsMEJBQTBCLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRTtJQUV4QyxXQUFXLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRTtJQUN6QixTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFMUM7OztPQUdHO0lBQ0gsUUFBUSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRXpDOzs7T0FHRztJQUNILE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzFCLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUU7S0FDckMsQ0FBQztJQUVGOzs7T0FHRztJQUNILFlBQVksRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFO0lBRTFCLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUU7SUFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRTtJQUM5QixZQUFZLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRTtJQUUxQjs7Ozs7T0FLRztJQUNILDBCQUEwQixFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUU7SUFFeEMsT0FBTyxFQUFFLGVBQWUs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