UNPKG

passkit-generator

Version:

The easiest way to generate custom Apple Wallet passes in Node.js

356 lines 21.5 kB
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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