Merge pull request #225 from alexandercerutti/feature/iOS18-changes
Changes for v3.2.0
2
.git-blame-ignore-revs
Normal file
@@ -0,0 +1,2 @@
|
||||
# Prettier rewrite
|
||||
0827730d410d0491bd271afa4381b52176166c0f
|
||||
11
.github/workflows/run-tests.yml
vendored
@@ -20,12 +20,15 @@ jobs:
|
||||
WWDR: ${{ secrets.WWDR }}
|
||||
SIGNER_KEY_PASSPHRASE: ${{ secrets.SIGNER_KEY_PASSPHRASE }}
|
||||
steps:
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 9
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: "14.x"
|
||||
node-version: "20.x"
|
||||
check-latest: true
|
||||
- run: |
|
||||
npm install
|
||||
npm run build
|
||||
npm run test
|
||||
pnpm install
|
||||
pnpm build
|
||||
pnpm test
|
||||
|
||||
2
.vscode/settings.json
vendored
@@ -5,5 +5,5 @@
|
||||
"editor.smoothScrolling": true,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
|
||||
"jest.jestCommandLine": "node --no-warnings ./node_modules/.bin/jest -c jest.config.cjs --runInBand --silent"
|
||||
"jest.jestCommandLine": "NODE_OPTIONS=\"--warnings\" pnpm jest -c jest.config.cjs --runInBand --silent"
|
||||
}
|
||||
|
||||
14233
examples/firebase/functions/package-lock.json
generated
@@ -2,15 +2,15 @@
|
||||
"name": "functions",
|
||||
"description": "Cloud Functions for Firebase",
|
||||
"scripts": {
|
||||
"serve": "npm run build && npx firebase emulators:start --only functions",
|
||||
"shell": "npm run build && npx firebase functions:shell",
|
||||
"deploy": "npx firebase deploy --only functions",
|
||||
"logs": "npx firebase functions:log",
|
||||
"service:link-pg": "cd ../../.. && npm run build && npm link",
|
||||
"predev:install": "npm run clear:deps",
|
||||
"dev:install": "npm run service:link-pg && npm link passkit-generator",
|
||||
"serve": "pnpm build && pnpm firebase emulators:start --only functions",
|
||||
"shell": "pnpm build && pnpm firebase functions:shell",
|
||||
"deploy": "pnpm firebase deploy --only functions",
|
||||
"logs": "pnpm firebase functions:log",
|
||||
"service:link-pg": "cd ../../.. && pnpm build && pnpm link",
|
||||
"predev:install": "pnpm clear:deps",
|
||||
"dev:install": "pnpm service:link-pg && pnpm link passkit-generator",
|
||||
"clear:deps": "rm -rf node_modules",
|
||||
"build": "rm -rf lib && npx tsc"
|
||||
"build": "rm -rf lib && pnpm tsc"
|
||||
},
|
||||
"engines": {
|
||||
"node": "16"
|
||||
@@ -18,16 +18,16 @@
|
||||
"type": "module",
|
||||
"main": "lib/index.js",
|
||||
"dependencies": {
|
||||
"firebase-admin": "^11.10.1",
|
||||
"firebase-functions": "^4.4.1",
|
||||
"tslib": "^2.6.1"
|
||||
"firebase-admin": "^11.11.1",
|
||||
"firebase-functions": "^4.9.0",
|
||||
"tslib": "^2.7.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"passkit-generator": "latest"
|
||||
},
|
||||
"devDependencies": {
|
||||
"firebase-functions-test": "^0.2.3",
|
||||
"firebase-tools": "^12.4.6"
|
||||
"firebase-tools": "^12.9.1"
|
||||
},
|
||||
"private": true
|
||||
}
|
||||
|
||||
4616
examples/firebase/functions/pnpm-lock.yaml
generated
Normal file
@@ -10,7 +10,7 @@ import os from "node:os";
|
||||
// Please note this is experimental in NodeJS as
|
||||
// it is marked as Stage 3 in TC39
|
||||
// Should probably not be used in production
|
||||
import startData from "./startData.json" assert { "type": "json" };
|
||||
import startData from "./startData.json" assert { type: "json" };
|
||||
|
||||
const PKPass = passkit.PKPass;
|
||||
|
||||
|
||||
BIN
examples/models/glowTime.pass/artwork.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
examples/models/glowTime.pass/artwork@2x.png
Normal file
|
After Width: | Height: | Size: 296 KiB |
BIN
examples/models/glowTime.pass/artwork@3x.png
Normal file
|
After Width: | Height: | Size: 603 KiB |
BIN
examples/models/glowTime.pass/icon.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
examples/models/glowTime.pass/icon@2x.png
Normal file
|
After Width: | Height: | Size: 370 KiB |
BIN
examples/models/glowTime.pass/logo.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
examples/models/glowTime.pass/logo@2x.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
83
examples/models/glowTime.pass/pass.json
Normal file
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"serialNumber": "<serial number>",
|
||||
"passTypeIdentifier": "pass.com.passkitgenerator",
|
||||
"teamIdentifier": "F53WB8AE67",
|
||||
"description": "Apple Event",
|
||||
"organizationName": "Apple Inc.",
|
||||
"foregroundColor": "#ffffff",
|
||||
"backgroundColor": "#1595d7",
|
||||
"labelColor": "#ffffff",
|
||||
"voided": false,
|
||||
"sharingProhibited": false,
|
||||
"beacons": [
|
||||
{
|
||||
"proximityUUID": "B7FA1C44-B5B2-436D-AD33-C26651C498BB",
|
||||
"relevantText": "Prepare to check in."
|
||||
}
|
||||
],
|
||||
"locations": [{ "latitude": 37.3349, "longitude": -122.00902 }],
|
||||
"barcode": {
|
||||
"message": "<nfc message>",
|
||||
"format": "PKBarcodeFormatQR",
|
||||
"messageEncoding": "iso-8859-1",
|
||||
"altText": "Special Apple Event"
|
||||
},
|
||||
"nfc": {
|
||||
"message": "<nfc message>",
|
||||
"encryptionPublicKey": "MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADrCFAKUbtUh7oAnm5drhZKj5+CHO+B5Q0VdF4QTkd17I="
|
||||
},
|
||||
"eventTicket": {
|
||||
"headerFields": [
|
||||
{ "key": "eventDateTime", "label": "DATE", "value": "Sep 09, 2024" }
|
||||
],
|
||||
"primaryFields": [
|
||||
{ "key": "eventGuest", "label": "Guest", "value": "<guest name>" }
|
||||
],
|
||||
"secondaryFields": [
|
||||
{
|
||||
"key": "eventVenue",
|
||||
"label": "Venue",
|
||||
"value": "Steve Jobs Theater"
|
||||
}
|
||||
],
|
||||
"backFields": [
|
||||
{
|
||||
"key": "eventBackInformation",
|
||||
"label": "Event Information",
|
||||
"value": "A government-issued photo ID will be required at check-in.\n\nPasses are unique, non-transferable, and can only be used once.\n\nYour confirmation email contains details regarding arrival and event location.\n\nPhoto & Video Release:\nPhotographs, audio and/or video taken at the event by Apple, or others on behalf of Apple, may include your voice, image or likeness. You agree that Apple may use such photographs, audio and/or video, including those that may contain your voice, image or likeness, for any purpose on a worldwide basis in perpetuity, without any compensation to you, and you release Apple from all liability related thereto."
|
||||
},
|
||||
{
|
||||
"key": "eventBackLocation",
|
||||
"label": "EVENT LOCATION",
|
||||
"value": "Steve Jobs Theater\n10600 N. Tantau Avenue\nCupertino, CA 95014"
|
||||
}
|
||||
]
|
||||
},
|
||||
"suppressStripShine": false,
|
||||
"passLastModDate": "2024-08-21T00:00:00.000Z",
|
||||
"semantics": {
|
||||
"eventType": "PKEventTypeGeneric",
|
||||
"eventName": "Special Apple Event",
|
||||
"venueName": "Steve Jobs Theater",
|
||||
"entranceDescription": "Apple Park Visitor Center",
|
||||
"attendeeName": "<attendee name>",
|
||||
"eventStartDate": "2024-10-04T17:00:00+00:00",
|
||||
"eventEndDate": "2024-10-05T19:00:00+00:00",
|
||||
"venueLocation": { "latitude": 37.3349, "longitude": -122.00902 },
|
||||
"playlistIDs": []
|
||||
},
|
||||
"relevantDates": [
|
||||
{
|
||||
"startDate": "2024-10-03T17:00:00+00:00",
|
||||
"endDate": "2024-10-03T23:00:00+00:00"
|
||||
},
|
||||
{
|
||||
"startDate": "2024-10-04T17:00:00+00:00",
|
||||
"endDate": "2024-10-04T19:00:00+00:00"
|
||||
}
|
||||
],
|
||||
"directionsInformationURL": "https://apple.co/mapsapvc",
|
||||
"contactVenueEmail": "rsvp_events@apple.com",
|
||||
"preferredStyleSchemes": ["posterEventTicket", "eventTicket"]
|
||||
}
|
||||
BIN
examples/models/glowTime.pass/secondaryLogo.png
Normal file
|
After Width: | Height: | Size: 519 B |
BIN
examples/models/glowTime.pass/secondaryLogo@2x.png
Normal file
|
After Width: | Height: | Size: 519 B |
|
After Width: | Height: | Size: 109 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"passTypeIdentifier": "pass.com.passkitgenerator",
|
||||
"teamIdentifier": "F53WB8AE67",
|
||||
"groupingIdentifier": "ticket-demo",
|
||||
"description": "Description",
|
||||
"organizationName": "Something",
|
||||
"backgroundColor": "rgb(255, 255, 255)",
|
||||
"foregroundColor": "rgb(0, 0, 0)",
|
||||
"labelColor": "rgb(0, 0, 0)",
|
||||
"logoText": "iOS18 EventTicket Demo",
|
||||
"preferredStyleSchemes": ["posterEventTicket", "eventTicket"],
|
||||
"eventTicket": {
|
||||
"headerFields": [
|
||||
{
|
||||
"key": "event_date",
|
||||
"label": "event-date",
|
||||
"value": "26.09.2024"
|
||||
}
|
||||
]
|
||||
},
|
||||
"semantics": {
|
||||
"venueParkingLotsOpenDate": "2024-10-04T09:00:00+00:00",
|
||||
"venueGatesOpenDate": "2024-10-06T20:00:00+00:00",
|
||||
"eventType": "PKEventTypeLivePerformance",
|
||||
"eventName": "Secret meeting place",
|
||||
"admissionLevel": "VIP Access",
|
||||
"venueRegionName": "Undisclosed location",
|
||||
"performerNames": ["Lady Gaga"],
|
||||
"venueBoxOfficeOpenDate": "2024-10-06T20:15:00+00:00",
|
||||
"venueCloseDate": "2024-10-06T23:59:59+00:00",
|
||||
"venueDoorsOpenDate": "2024-10-06T20:00:00+00:00",
|
||||
"venueFanZoneOpenDate": "2024-10-06T19:30:00+00:00",
|
||||
"updatedEventStartDate": "2024-10-06T21:30:00+00:00",
|
||||
"updatedEventEndDate": "2024-10-07T01:30:00+00:00",
|
||||
"admissionLevelAbbreviation": "VIP A.",
|
||||
"venueEntranceDoor": "15A",
|
||||
"venueEntrancePortal": "7B",
|
||||
"albumIDs": ["1440818588"],
|
||||
"additionalTicketAttributes": "3,4,5",
|
||||
"entranceDescription": "Event at The Stadium",
|
||||
"venueLocation": {
|
||||
"latitude": 51.555557,
|
||||
"longitude": 0.238041
|
||||
}
|
||||
},
|
||||
"parkingInformationURL": "https://www.southbayjazzfestival.com/parking",
|
||||
"directionsInformationURL": "https://apple.co/mapsapvc",
|
||||
"contactVenueEmail": "rsvp_events@apple.com",
|
||||
"relevantDates": [
|
||||
{
|
||||
"startDate": "2024-10-03T17:00:00+01:00",
|
||||
"endDate": "2024-10-03T23:00:00+01:00"
|
||||
},
|
||||
{
|
||||
"startDate": "2024-10-06T00:00:00+00:00",
|
||||
"endDate": "2024-10-06T19:00:00+01:00"
|
||||
}
|
||||
],
|
||||
"nfc": {
|
||||
"message": "message",
|
||||
"encryptionPublicKey": "MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADwKMBv29ByaSLiGF0FctuyB+Hs2oZ1kDIYhTVllPexNE="
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
BIN
examples/models/posterEventTicketWithNewSeats.pass/artwork.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
|
After Width: | Height: | Size: 49 KiB |
BIN
examples/models/posterEventTicketWithNewSeats.pass/icon.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
examples/models/posterEventTicketWithNewSeats.pass/logo.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
96
examples/models/posterEventTicketWithNewSeats.pass/pass.json
Normal file
@@ -0,0 +1,96 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"passTypeIdentifier": "pass.com.passkitgenerator",
|
||||
"teamIdentifier": "F53WB8AE67",
|
||||
"groupingIdentifier": "ticket-demo",
|
||||
"description": "Description",
|
||||
"organizationName": "A some kind of event happening tomorrow",
|
||||
"backgroundColor": "#ffffff",
|
||||
"foregroundColor": "#000000",
|
||||
"labelColor": "#FF0000",
|
||||
"logoText": "Demo",
|
||||
"preferredStyleSchemes": ["posterEventTicket", "eventTicket"],
|
||||
"eventTicket": {
|
||||
"headerFields": [
|
||||
{
|
||||
"key": "event_date",
|
||||
"label": "event-date",
|
||||
"value": "26.09.2024"
|
||||
}
|
||||
],
|
||||
"primaryFields": [
|
||||
{ "key": "event_name", "label": "event-name", "value": "Dune" }
|
||||
],
|
||||
"additionalInfoFields": [
|
||||
{
|
||||
"key": "additionalInfo-1",
|
||||
"label": "Additional Info 1",
|
||||
"value": "The text to show"
|
||||
},
|
||||
{
|
||||
"key": "additionalInfo-2",
|
||||
"label": "Additional Info 2",
|
||||
"value": "The text to show 2"
|
||||
},
|
||||
{
|
||||
"key": "lineItem3",
|
||||
"label": "Emergency Contact",
|
||||
"value": "+1 8716 12736131",
|
||||
"dataDetectorTypes": ["PKDataDetectorTypePhoneNumber"]
|
||||
},
|
||||
{
|
||||
"key": "lineItem4",
|
||||
"label": "Test link",
|
||||
"value": "https://apple.com",
|
||||
"dataDetectorTypes": ["PKDataDetectorTypeLink"],
|
||||
"attributedValue": "<a href=\"https://apple.com\">Used literally on iPhone, used correctly on Watch</a>"
|
||||
}
|
||||
]
|
||||
},
|
||||
"semantics": {
|
||||
"venueParkingLotsOpenDate": "2024-10-09T04:00:00+00:00",
|
||||
"venueGatesOpenDate": "2024-10-09T06:00:00+00:00",
|
||||
"eventLiveMessage": "This event is going to start soon! Try to relax your anus (cit.)",
|
||||
"eventType": "PKEventTypeLivePerformance",
|
||||
"eventName": "South Bay Jazz Festival",
|
||||
"entranceDescription": "Event at The Stadium",
|
||||
"venueLocation": {
|
||||
"latitude": 51.555557,
|
||||
"longitude": 0.238041
|
||||
},
|
||||
"venueName": "The Stadium",
|
||||
"performerNames": ["Lady Gaga"],
|
||||
"eventStartDate": "2024-10-08T22:00:00+00:00",
|
||||
"eventEndDate": "2024-10-09T23:59:59+00:00",
|
||||
"tailgatingAllowed": true,
|
||||
"seats": [
|
||||
{
|
||||
"seatNumber": "5",
|
||||
"seatRow": "3",
|
||||
"seatSection": "100",
|
||||
"seatSectionColor": "#FFD700"
|
||||
}
|
||||
],
|
||||
"artistIDs": ["984117861"]
|
||||
},
|
||||
"directionsInformationURL": "https://www.displaysomeinfoexample.com",
|
||||
"contactVenueWebsite": "https://www.venueexample.com",
|
||||
"relevantDates": [
|
||||
{
|
||||
"startDate": "2024-10-09T17:00:00+01:00",
|
||||
"endDate": "2024-10-09T23:59:59+01:00"
|
||||
},
|
||||
{
|
||||
"startDate": "2024-10-10T17:00:00+00:00",
|
||||
"endDate": "2024-10-10T19:00:00+00:00"
|
||||
},
|
||||
{
|
||||
"startDate": "2024-10-11T17:00:00+00:00",
|
||||
"endDate": "2024-10-11T19:00:00+00:00"
|
||||
}
|
||||
],
|
||||
"nfc": {
|
||||
"message": "message",
|
||||
"encryptionPublicKey": "MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADwKMBv29ByaSLiGF0FctuyB+Hs2oZ1kDIYhTVllPexNE="
|
||||
}
|
||||
}
|
||||
BIN
examples/models/posterEventTicketWithNewSeats.pass/strip@3x.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
examples/models/posterEventTicketWithNewSeats.pass/venueMap.png
Normal file
|
After Width: | Height: | Size: 419 KiB |
1605
examples/self-hosted/package-lock.json
generated
@@ -6,24 +6,24 @@
|
||||
"author": "Alexander P. Cerutti <cerutti.alexander@gmail.com>",
|
||||
"license": "ISC",
|
||||
"scripts": {
|
||||
"service:link-pg": "cd ../.. && npm run build && npm link",
|
||||
"preinstall": "npm run clear:deps",
|
||||
"postinstall": "npm run service:link-pg && npm link passkit-generator",
|
||||
"service:link-pg": "cd ../.. && pnpm build && pnpm link",
|
||||
"preinstall": "pnpm clear:deps",
|
||||
"postinstall": "pnpm service:link-pg && pnpm link passkit-generator",
|
||||
"clear:deps": "rm -rf node_modules",
|
||||
"example": "npx ts-node src/index.ts",
|
||||
"example": "pnpm ts-node src/index.ts",
|
||||
"example:debug": "node -r ts-node/register --inspect-brk src/index.ts"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"passkit-generator": "latest"
|
||||
},
|
||||
"dependencies": {
|
||||
"express": "^4.17.3",
|
||||
"express": "^4.21.1",
|
||||
"node-fetch": "^3.2.3",
|
||||
"tslib": "^2.3.1"
|
||||
"tslib": "^2.7.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/express": "4.17.13",
|
||||
"ts-node": "^10.7.0",
|
||||
"typescript": "^4.6.3"
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.6.3"
|
||||
}
|
||||
}
|
||||
|
||||
764
examples/self-hosted/pnpm-lock.yaml
generated
Normal file
@@ -0,0 +1,764 @@
|
||||
lockfileVersion: '6.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
dependencies:
|
||||
express:
|
||||
specifier: ^4.21.1
|
||||
version: 4.21.1
|
||||
node-fetch:
|
||||
specifier: ^3.2.3
|
||||
version: 3.2.3
|
||||
passkit-generator:
|
||||
specifier: latest
|
||||
version: 3.1.11
|
||||
tslib:
|
||||
specifier: ^2.7.0
|
||||
version: 2.7.0
|
||||
|
||||
devDependencies:
|
||||
'@types/express':
|
||||
specifier: 4.17.13
|
||||
version: 4.17.13
|
||||
ts-node:
|
||||
specifier: ^10.9.2
|
||||
version: 10.9.2(@types/node@17.0.15)(typescript@5.6.3)
|
||||
typescript:
|
||||
specifier: ^5.6.3
|
||||
version: 5.6.3
|
||||
|
||||
packages:
|
||||
|
||||
/@cspotcode/source-map-support@0.8.1:
|
||||
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
'@jridgewell/trace-mapping': 0.3.9
|
||||
dev: true
|
||||
|
||||
/@hapi/hoek@9.2.1:
|
||||
resolution: {integrity: sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==}
|
||||
dev: false
|
||||
|
||||
/@hapi/topo@5.1.0:
|
||||
resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
|
||||
dependencies:
|
||||
'@hapi/hoek': 9.2.1
|
||||
dev: false
|
||||
|
||||
/@jridgewell/resolve-uri@3.1.2:
|
||||
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
dev: true
|
||||
|
||||
/@jridgewell/sourcemap-codec@1.5.0:
|
||||
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
|
||||
dev: true
|
||||
|
||||
/@jridgewell/trace-mapping@0.3.9:
|
||||
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
|
||||
dependencies:
|
||||
'@jridgewell/resolve-uri': 3.1.2
|
||||
'@jridgewell/sourcemap-codec': 1.5.0
|
||||
dev: true
|
||||
|
||||
/@sideway/address@4.1.3:
|
||||
resolution: {integrity: sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==}
|
||||
dependencies:
|
||||
'@hapi/hoek': 9.2.1
|
||||
dev: false
|
||||
|
||||
/@sideway/formula@3.0.0:
|
||||
resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==}
|
||||
dev: false
|
||||
|
||||
/@sideway/pinpoint@2.0.0:
|
||||
resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
|
||||
dev: false
|
||||
|
||||
/@tsconfig/node10@1.0.8:
|
||||
resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==}
|
||||
dev: true
|
||||
|
||||
/@tsconfig/node12@1.0.9:
|
||||
resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==}
|
||||
dev: true
|
||||
|
||||
/@tsconfig/node14@1.0.1:
|
||||
resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==}
|
||||
dev: true
|
||||
|
||||
/@tsconfig/node16@1.0.2:
|
||||
resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==}
|
||||
dev: true
|
||||
|
||||
/@types/body-parser@1.19.2:
|
||||
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
|
||||
dependencies:
|
||||
'@types/connect': 3.4.35
|
||||
'@types/node': 17.0.15
|
||||
dev: true
|
||||
|
||||
/@types/connect@3.4.35:
|
||||
resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
|
||||
dependencies:
|
||||
'@types/node': 17.0.15
|
||||
dev: true
|
||||
|
||||
/@types/express-serve-static-core@4.17.28:
|
||||
resolution: {integrity: sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==}
|
||||
dependencies:
|
||||
'@types/node': 17.0.15
|
||||
'@types/qs': 6.9.7
|
||||
'@types/range-parser': 1.2.4
|
||||
dev: true
|
||||
|
||||
/@types/express@4.17.13:
|
||||
resolution: {integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==}
|
||||
dependencies:
|
||||
'@types/body-parser': 1.19.2
|
||||
'@types/express-serve-static-core': 4.17.28
|
||||
'@types/qs': 6.9.7
|
||||
'@types/serve-static': 1.13.10
|
||||
dev: true
|
||||
|
||||
/@types/mime@1.3.2:
|
||||
resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==}
|
||||
dev: true
|
||||
|
||||
/@types/node@17.0.15:
|
||||
resolution: {integrity: sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA==}
|
||||
dev: true
|
||||
|
||||
/@types/qs@6.9.7:
|
||||
resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==}
|
||||
dev: true
|
||||
|
||||
/@types/range-parser@1.2.4:
|
||||
resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==}
|
||||
dev: true
|
||||
|
||||
/@types/serve-static@1.13.10:
|
||||
resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==}
|
||||
dependencies:
|
||||
'@types/mime': 1.3.2
|
||||
'@types/node': 17.0.15
|
||||
dev: true
|
||||
|
||||
/accepts@1.3.8:
|
||||
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dependencies:
|
||||
mime-types: 2.1.34
|
||||
negotiator: 0.6.3
|
||||
dev: false
|
||||
|
||||
/acorn-walk@8.2.0:
|
||||
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
dev: true
|
||||
|
||||
/acorn@8.7.0:
|
||||
resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
/arg@4.1.3:
|
||||
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
|
||||
dev: true
|
||||
|
||||
/array-flatten@1.1.1:
|
||||
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
|
||||
dev: false
|
||||
|
||||
/body-parser@1.20.3:
|
||||
resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
|
||||
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
||||
dependencies:
|
||||
bytes: 3.1.2
|
||||
content-type: 1.0.5
|
||||
debug: 2.6.9
|
||||
depd: 2.0.0
|
||||
destroy: 1.2.0
|
||||
http-errors: 2.0.0
|
||||
iconv-lite: 0.4.24
|
||||
on-finished: 2.4.1
|
||||
qs: 6.13.0
|
||||
raw-body: 2.5.2
|
||||
type-is: 1.6.18
|
||||
unpipe: 1.0.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/bytes@3.1.2:
|
||||
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/call-bind@1.0.7:
|
||||
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
es-define-property: 1.0.0
|
||||
es-errors: 1.3.0
|
||||
function-bind: 1.1.2
|
||||
get-intrinsic: 1.2.4
|
||||
set-function-length: 1.2.2
|
||||
dev: false
|
||||
|
||||
/content-disposition@0.5.4:
|
||||
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
dev: false
|
||||
|
||||
/content-type@1.0.4:
|
||||
resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/content-type@1.0.5:
|
||||
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/cookie-signature@1.0.6:
|
||||
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
|
||||
dev: false
|
||||
|
||||
/cookie@0.7.1:
|
||||
resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/create-require@1.1.1:
|
||||
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
|
||||
dev: true
|
||||
|
||||
/data-uri-to-buffer@4.0.0:
|
||||
resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==}
|
||||
engines: {node: '>= 12'}
|
||||
dev: false
|
||||
|
||||
/debug@2.6.9:
|
||||
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
||||
peerDependencies:
|
||||
supports-color: '*'
|
||||
peerDependenciesMeta:
|
||||
supports-color:
|
||||
optional: true
|
||||
dependencies:
|
||||
ms: 2.0.0
|
||||
dev: false
|
||||
|
||||
/define-data-property@1.1.4:
|
||||
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
es-define-property: 1.0.0
|
||||
es-errors: 1.3.0
|
||||
gopd: 1.0.1
|
||||
dev: false
|
||||
|
||||
/depd@2.0.0:
|
||||
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/destroy@1.2.0:
|
||||
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
|
||||
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
||||
dev: false
|
||||
|
||||
/diff@4.0.2:
|
||||
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
|
||||
engines: {node: '>=0.3.1'}
|
||||
dev: true
|
||||
|
||||
/do-not-zip@1.0.0:
|
||||
resolution: {integrity: sha512-Pgd81ET43bhAGaN2Hq1zluSX1FmD7kl7KcV9ER/lawiLsRUB9pRA5y8r6us29Xk6BrINZETO8TjhYwtwafWUww==}
|
||||
dev: false
|
||||
|
||||
/ee-first@1.1.1:
|
||||
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
|
||||
dev: false
|
||||
|
||||
/encodeurl@1.0.2:
|
||||
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/encodeurl@2.0.0:
|
||||
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/es-define-property@1.0.0:
|
||||
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
get-intrinsic: 1.2.4
|
||||
dev: false
|
||||
|
||||
/es-errors@1.3.0:
|
||||
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dev: false
|
||||
|
||||
/escape-html@1.0.3:
|
||||
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
|
||||
dev: false
|
||||
|
||||
/etag@1.8.1:
|
||||
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/express@4.21.1:
|
||||
resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
|
||||
engines: {node: '>= 0.10.0'}
|
||||
dependencies:
|
||||
accepts: 1.3.8
|
||||
array-flatten: 1.1.1
|
||||
body-parser: 1.20.3
|
||||
content-disposition: 0.5.4
|
||||
content-type: 1.0.4
|
||||
cookie: 0.7.1
|
||||
cookie-signature: 1.0.6
|
||||
debug: 2.6.9
|
||||
depd: 2.0.0
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
etag: 1.8.1
|
||||
finalhandler: 1.3.1
|
||||
fresh: 0.5.2
|
||||
http-errors: 2.0.0
|
||||
merge-descriptors: 1.0.3
|
||||
methods: 1.1.2
|
||||
on-finished: 2.4.1
|
||||
parseurl: 1.3.3
|
||||
path-to-regexp: 0.1.10
|
||||
proxy-addr: 2.0.7
|
||||
qs: 6.13.0
|
||||
range-parser: 1.2.1
|
||||
safe-buffer: 5.2.1
|
||||
send: 0.19.0
|
||||
serve-static: 1.16.2
|
||||
setprototypeof: 1.2.0
|
||||
statuses: 2.0.1
|
||||
type-is: 1.6.18
|
||||
utils-merge: 1.0.1
|
||||
vary: 1.1.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/fetch-blob@3.1.4:
|
||||
resolution: {integrity: sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA==}
|
||||
engines: {node: ^12.20 || >= 14.13}
|
||||
dependencies:
|
||||
node-domexception: 1.0.0
|
||||
web-streams-polyfill: 3.2.0
|
||||
dev: false
|
||||
|
||||
/finalhandler@1.3.1:
|
||||
resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dependencies:
|
||||
debug: 2.6.9
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
on-finished: 2.4.1
|
||||
parseurl: 1.3.3
|
||||
statuses: 2.0.1
|
||||
unpipe: 1.0.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/formdata-polyfill@4.0.10:
|
||||
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
|
||||
engines: {node: '>=12.20.0'}
|
||||
dependencies:
|
||||
fetch-blob: 3.1.4
|
||||
dev: false
|
||||
|
||||
/forwarded@0.2.0:
|
||||
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/fresh@0.5.2:
|
||||
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/function-bind@1.1.2:
|
||||
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
|
||||
dev: false
|
||||
|
||||
/get-intrinsic@1.2.4:
|
||||
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
function-bind: 1.1.2
|
||||
has-proto: 1.0.3
|
||||
has-symbols: 1.0.3
|
||||
hasown: 2.0.2
|
||||
dev: false
|
||||
|
||||
/gopd@1.0.1:
|
||||
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
|
||||
dependencies:
|
||||
get-intrinsic: 1.2.4
|
||||
dev: false
|
||||
|
||||
/has-property-descriptors@1.0.2:
|
||||
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
|
||||
dependencies:
|
||||
es-define-property: 1.0.0
|
||||
dev: false
|
||||
|
||||
/has-proto@1.0.3:
|
||||
resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dev: false
|
||||
|
||||
/has-symbols@1.0.3:
|
||||
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dev: false
|
||||
|
||||
/hasown@2.0.2:
|
||||
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
function-bind: 1.1.2
|
||||
dev: false
|
||||
|
||||
/http-errors@2.0.0:
|
||||
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dependencies:
|
||||
depd: 2.0.0
|
||||
inherits: 2.0.4
|
||||
setprototypeof: 1.2.0
|
||||
statuses: 2.0.1
|
||||
toidentifier: 1.0.1
|
||||
dev: false
|
||||
|
||||
/iconv-lite@0.4.24:
|
||||
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
safer-buffer: 2.1.2
|
||||
dev: false
|
||||
|
||||
/inherits@2.0.4:
|
||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||
dev: false
|
||||
|
||||
/ipaddr.js@1.9.1:
|
||||
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
|
||||
engines: {node: '>= 0.10'}
|
||||
dev: false
|
||||
|
||||
/joi@17.4.2:
|
||||
resolution: {integrity: sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==}
|
||||
dependencies:
|
||||
'@hapi/hoek': 9.2.1
|
||||
'@hapi/topo': 5.1.0
|
||||
'@sideway/address': 4.1.3
|
||||
'@sideway/formula': 3.0.0
|
||||
'@sideway/pinpoint': 2.0.0
|
||||
dev: false
|
||||
|
||||
/make-error@1.3.6:
|
||||
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
|
||||
dev: true
|
||||
|
||||
/media-typer@0.3.0:
|
||||
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/merge-descriptors@1.0.3:
|
||||
resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
|
||||
dev: false
|
||||
|
||||
/methods@1.1.2:
|
||||
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/mime-db@1.51.0:
|
||||
resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/mime-types@2.1.34:
|
||||
resolution: {integrity: sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dependencies:
|
||||
mime-db: 1.51.0
|
||||
dev: false
|
||||
|
||||
/mime@1.6.0:
|
||||
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
|
||||
engines: {node: '>=4'}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/ms@2.0.0:
|
||||
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
|
||||
dev: false
|
||||
|
||||
/ms@2.1.3:
|
||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||
dev: false
|
||||
|
||||
/negotiator@0.6.3:
|
||||
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/node-domexception@1.0.0:
|
||||
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
|
||||
engines: {node: '>=10.5.0'}
|
||||
dev: false
|
||||
|
||||
/node-fetch@3.2.3:
|
||||
resolution: {integrity: sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
dependencies:
|
||||
data-uri-to-buffer: 4.0.0
|
||||
fetch-blob: 3.1.4
|
||||
formdata-polyfill: 4.0.10
|
||||
dev: false
|
||||
|
||||
/node-forge@1.3.1:
|
||||
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
|
||||
engines: {node: '>= 6.13.0'}
|
||||
dev: false
|
||||
|
||||
/object-inspect@1.13.2:
|
||||
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dev: false
|
||||
|
||||
/on-finished@2.4.1:
|
||||
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dependencies:
|
||||
ee-first: 1.1.1
|
||||
dev: false
|
||||
|
||||
/parseurl@1.3.3:
|
||||
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/passkit-generator@3.1.11:
|
||||
resolution: {integrity: sha512-R6xSkkbzojouvJOPt/F1sRBgSawrIetd4XVHaIhYxRxX7pNHbbdpwwQMwPIuKRgmTzUAi4hFiFlN4CTCd0NAZg==}
|
||||
engines: {node: '>=14.18.1'}
|
||||
dependencies:
|
||||
do-not-zip: 1.0.0
|
||||
joi: 17.4.2
|
||||
node-forge: 1.3.1
|
||||
tslib: 2.7.0
|
||||
dev: false
|
||||
|
||||
/path-to-regexp@0.1.10:
|
||||
resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
|
||||
dev: false
|
||||
|
||||
/proxy-addr@2.0.7:
|
||||
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
||||
engines: {node: '>= 0.10'}
|
||||
dependencies:
|
||||
forwarded: 0.2.0
|
||||
ipaddr.js: 1.9.1
|
||||
dev: false
|
||||
|
||||
/qs@6.13.0:
|
||||
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
|
||||
engines: {node: '>=0.6'}
|
||||
dependencies:
|
||||
side-channel: 1.0.6
|
||||
dev: false
|
||||
|
||||
/range-parser@1.2.1:
|
||||
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dev: false
|
||||
|
||||
/raw-body@2.5.2:
|
||||
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dependencies:
|
||||
bytes: 3.1.2
|
||||
http-errors: 2.0.0
|
||||
iconv-lite: 0.4.24
|
||||
unpipe: 1.0.0
|
||||
dev: false
|
||||
|
||||
/safe-buffer@5.2.1:
|
||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||
dev: false
|
||||
|
||||
/safer-buffer@2.1.2:
|
||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
||||
dev: false
|
||||
|
||||
/send@0.19.0:
|
||||
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
dependencies:
|
||||
debug: 2.6.9
|
||||
depd: 2.0.0
|
||||
destroy: 1.2.0
|
||||
encodeurl: 1.0.2
|
||||
escape-html: 1.0.3
|
||||
etag: 1.8.1
|
||||
fresh: 0.5.2
|
||||
http-errors: 2.0.0
|
||||
mime: 1.6.0
|
||||
ms: 2.1.3
|
||||
on-finished: 2.4.1
|
||||
range-parser: 1.2.1
|
||||
statuses: 2.0.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/serve-static@1.16.2:
|
||||
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
dependencies:
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
parseurl: 1.3.3
|
||||
send: 0.19.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/set-function-length@1.2.2:
|
||||
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
define-data-property: 1.1.4
|
||||
es-errors: 1.3.0
|
||||
function-bind: 1.1.2
|
||||
get-intrinsic: 1.2.4
|
||||
gopd: 1.0.1
|
||||
has-property-descriptors: 1.0.2
|
||||
dev: false
|
||||
|
||||
/setprototypeof@1.2.0:
|
||||
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
||||
dev: false
|
||||
|
||||
/side-channel@1.0.6:
|
||||
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
call-bind: 1.0.7
|
||||
es-errors: 1.3.0
|
||||
get-intrinsic: 1.2.4
|
||||
object-inspect: 1.13.2
|
||||
dev: false
|
||||
|
||||
/statuses@2.0.1:
|
||||
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/toidentifier@1.0.1:
|
||||
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
|
||||
engines: {node: '>=0.6'}
|
||||
dev: false
|
||||
|
||||
/ts-node@10.9.2(@types/node@17.0.15)(typescript@5.6.3):
|
||||
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
'@swc/core': '>=1.2.50'
|
||||
'@swc/wasm': '>=1.2.50'
|
||||
'@types/node': '*'
|
||||
typescript: '>=2.7'
|
||||
peerDependenciesMeta:
|
||||
'@swc/core':
|
||||
optional: true
|
||||
'@swc/wasm':
|
||||
optional: true
|
||||
dependencies:
|
||||
'@cspotcode/source-map-support': 0.8.1
|
||||
'@tsconfig/node10': 1.0.8
|
||||
'@tsconfig/node12': 1.0.9
|
||||
'@tsconfig/node14': 1.0.1
|
||||
'@tsconfig/node16': 1.0.2
|
||||
'@types/node': 17.0.15
|
||||
acorn: 8.7.0
|
||||
acorn-walk: 8.2.0
|
||||
arg: 4.1.3
|
||||
create-require: 1.1.1
|
||||
diff: 4.0.2
|
||||
make-error: 1.3.6
|
||||
typescript: 5.6.3
|
||||
v8-compile-cache-lib: 3.0.1
|
||||
yn: 3.1.1
|
||||
dev: true
|
||||
|
||||
/tslib@2.7.0:
|
||||
resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
|
||||
dev: false
|
||||
|
||||
/type-is@1.6.18:
|
||||
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
|
||||
engines: {node: '>= 0.6'}
|
||||
dependencies:
|
||||
media-typer: 0.3.0
|
||||
mime-types: 2.1.34
|
||||
dev: false
|
||||
|
||||
/typescript@5.6.3:
|
||||
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
/unpipe@1.0.0:
|
||||
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/utils-merge@1.0.1:
|
||||
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
|
||||
engines: {node: '>= 0.4.0'}
|
||||
dev: false
|
||||
|
||||
/v8-compile-cache-lib@3.0.1:
|
||||
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
|
||||
dev: true
|
||||
|
||||
/vary@1.1.2:
|
||||
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
dev: false
|
||||
|
||||
/web-streams-polyfill@3.2.0:
|
||||
resolution: {integrity: sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==}
|
||||
engines: {node: '>= 8'}
|
||||
dev: false
|
||||
|
||||
/yn@3.1.1:
|
||||
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
import { app } from "./webserver";
|
||||
import { getCertificates } from "./shared";
|
||||
import path from "path";
|
||||
import { promises as fs } from "fs";
|
||||
import path from "node:path";
|
||||
import { promises as fs } from "node:fs";
|
||||
import { PKPass } from "passkit-generator";
|
||||
|
||||
import * as Utils from "passkit-generator/lib/utils";
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
|
||||
import { app } from "./webserver";
|
||||
import { getCertificates } from "./shared";
|
||||
import { promises as fs } from "fs";
|
||||
import path from "path";
|
||||
import { promises as fs } from "node:fs";
|
||||
import path from "node:path";
|
||||
import { PKPass } from "passkit-generator";
|
||||
|
||||
// *************************** //
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
import { app } from "./webserver";
|
||||
import { getCertificates } from "./shared";
|
||||
import path from "path";
|
||||
import path from "node:path";
|
||||
import { PKPass } from "passkit-generator";
|
||||
|
||||
app.route("/fields/:modelName").get(async (request, response) => {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
import { app } from "./webserver";
|
||||
import { getCertificates } from "./shared";
|
||||
import path from "path";
|
||||
import path from "node:path";
|
||||
import { PKPass } from "passkit-generator";
|
||||
|
||||
app.route("/localize/:modelName").get(async (request, response) => {
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
|
||||
import { app } from "./webserver";
|
||||
import { getCertificates } from "./shared";
|
||||
import path from "path";
|
||||
import { promises as fs } from "fs";
|
||||
import path from "node:path";
|
||||
import { promises as fs } from "node:fs";
|
||||
import { PKPass } from "passkit-generator";
|
||||
|
||||
function getRandomColorPart() {
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
import { app } from "./webserver";
|
||||
import { getCertificates } from "./shared";
|
||||
import { PKPass } from "passkit-generator";
|
||||
import path from "path";
|
||||
import path from "node:path";
|
||||
|
||||
app.route("/barcodes/:modelName").get(async (request, response) => {
|
||||
const passName =
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
import { app } from "./webserver";
|
||||
import { getCertificates } from "./shared";
|
||||
import path from "path";
|
||||
import path from "node:path";
|
||||
import { PKPass } from "passkit-generator";
|
||||
|
||||
app.route("/expirationDate/:modelName").get(async (request, response) => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { promises as fs } from "fs";
|
||||
import path from "path";
|
||||
import fs from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
|
||||
interface Cache {
|
||||
certificates:
|
||||
|
||||
19098
examples/serverless/package-lock.json
generated
@@ -7,21 +7,21 @@
|
||||
"license": "ISC",
|
||||
"main": "src/index.js",
|
||||
"scripts": {
|
||||
"service:link-pg": "cd ../.. && npm run build && npm link",
|
||||
"preinstall": "npm run clear:deps",
|
||||
"postinstall": "npm run service:link-pg && npm link passkit-generator",
|
||||
"service:link-pg": "cd ../.. && pnpm build && pnpm link",
|
||||
"preinstall": "pnpm clear:deps",
|
||||
"postinstall": "pnpm service:link-pg && pnpm link passkit-generator",
|
||||
"clear:deps": "rm -rf node_modules",
|
||||
"example": "npx serverless@3 offline --host 0.0.0.0; :'specifying host due to WSL limits'"
|
||||
"example": "pnpm serverless@3 offline --host 0.0.0.0; :'specifying host due to WSL limits'"
|
||||
},
|
||||
"dependencies": {
|
||||
"aws-sdk": "^2.1092.0",
|
||||
"tslib": "^2.3.1"
|
||||
"aws-sdk": "^2.1691.0",
|
||||
"tslib": "^2.7.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/aws-lambda": "^8.10.93",
|
||||
"serverless-offline": "^8.5.0",
|
||||
"serverless-plugin-typescript": "^2.1.1",
|
||||
"serverless-s3-local": "^0.6.22",
|
||||
"typescript": "^4.6.3"
|
||||
"@types/aws-lambda": "^8.10.145",
|
||||
"serverless-offline": "^8.8.1",
|
||||
"serverless-plugin-typescript": "^2.1.5",
|
||||
"serverless-s3-local": "^0.8.5",
|
||||
"typescript": "^5.6.3"
|
||||
}
|
||||
}
|
||||
|
||||
8401
examples/serverless/pnpm-lock.yaml
generated
Normal file
@@ -1,8 +1,8 @@
|
||||
import { ALBEvent, ALBResult } from "aws-lambda";
|
||||
import AWS from "aws-sdk";
|
||||
import { promises as fs } from "fs";
|
||||
import path from "path";
|
||||
import { Buffer } from "buffer";
|
||||
import fs from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import { Buffer } from "node:buffer";
|
||||
import config from "../config.json";
|
||||
import { PKPass } from "passkit-generator";
|
||||
|
||||
|
||||
6282
package-lock.json
generated
32
package.json
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"name": "passkit-generator",
|
||||
"version": "3.1.11",
|
||||
"version": "3.2.0-alpha.2",
|
||||
"description": "The easiest way to generate custom Apple Wallet passes in Node.js",
|
||||
"main": "lib/index.js",
|
||||
"scripts": {
|
||||
"build": "npm run build:src",
|
||||
"build:all": "npm run build:src && npm run build:examples",
|
||||
"build:src": "rimraf lib && npx tsc -p tsconfig.dist.json",
|
||||
"prepublishOnly": "npm run build && npm run test",
|
||||
"test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest -c jest.config.cjs --silent"
|
||||
"build": "pnpm build:src",
|
||||
"build:all": "pnpm build:src && pnpm build:examples",
|
||||
"build:src": "pnpm rimraf lib && pnpm tsc -p tsconfig.dist.json",
|
||||
"prepublishOnly": "pnpm build && pnpm test",
|
||||
"test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" pnpm jest -c jest.config.cjs --silent"
|
||||
},
|
||||
"author": "Alexander Patrick Cerutti",
|
||||
"license": "MIT",
|
||||
@@ -23,23 +23,23 @@
|
||||
"dependencies": {
|
||||
"do-not-zip": "^1.0.0",
|
||||
"joi": "17.4.2",
|
||||
"node-forge": "^1.3.0",
|
||||
"tslib": "^2.3.1"
|
||||
"node-forge": "^1.3.1",
|
||||
"tslib": "^2.7.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.18.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/do-not-zip": "^1.0.0",
|
||||
"@types/do-not-zip": "^1.0.2",
|
||||
"@types/node": "^16.11.26",
|
||||
"@types/node-forge": "^1.0.1",
|
||||
"jest": "^29.5.0",
|
||||
"jest-environment-node": "^29.5.0",
|
||||
"prettier": "^2.5.1",
|
||||
"rimraf": "^3.0.2",
|
||||
"typescript": "^5.0.4"
|
||||
"@types/node-forge": "^1.3.11",
|
||||
"jest": "^29.7.0",
|
||||
"jest-environment-node": "^29.7.0",
|
||||
"prettier": "^3.3.3",
|
||||
"rimraf": "^4.4.1",
|
||||
"typescript": "^5.6.3"
|
||||
},
|
||||
"files": [
|
||||
"lib/**/*.+(js|d.ts)!(*.map)"
|
||||
"lib/**/*.+(js|d.ts)"
|
||||
]
|
||||
}
|
||||
|
||||
2397
pnpm-lock.yaml
generated
Normal file
@@ -8,19 +8,72 @@ const {
|
||||
} = require("@jest/globals");
|
||||
const fs = require("node:fs");
|
||||
const path = require("node:path");
|
||||
const forge = require("node-forge");
|
||||
const { default: PKPass } = require("../lib/PKPass");
|
||||
|
||||
/**
|
||||
* @returns {[cert: Buffer, key: Buffer]}
|
||||
*/
|
||||
|
||||
function generateCertificateAndPrivateKey() {
|
||||
const keys = forge.pki.rsa.generateKeyPair(2048);
|
||||
const cert = forge.pki.createCertificate();
|
||||
|
||||
cert.publicKey = keys.publicKey;
|
||||
|
||||
cert.serialNumber = "01";
|
||||
cert.validity.notBefore = new Date();
|
||||
cert.validity.notAfter = new Date();
|
||||
cert.validity.notAfter.setFullYear(
|
||||
cert.validity.notBefore.getFullYear() + 1,
|
||||
);
|
||||
|
||||
const attrs = [
|
||||
{
|
||||
name: "commonName",
|
||||
value: "example.org",
|
||||
},
|
||||
{
|
||||
name: "countryName",
|
||||
value: "TS",
|
||||
},
|
||||
{
|
||||
shortName: "ST",
|
||||
value: "Test",
|
||||
},
|
||||
{
|
||||
name: "localityName",
|
||||
value: "Test",
|
||||
},
|
||||
{
|
||||
name: "organizationName",
|
||||
value: "Test",
|
||||
},
|
||||
{
|
||||
shortName: "OU",
|
||||
value: "Test",
|
||||
},
|
||||
];
|
||||
|
||||
cert.setIssuer(attrs);
|
||||
cert.setSubject(attrs);
|
||||
cert.sign(keys.privateKey);
|
||||
|
||||
return [
|
||||
Buffer.from(forge.pki.certificateToPem(cert)),
|
||||
Buffer.from(forge.pki.privateKeyToPem(keys.privateKey)),
|
||||
];
|
||||
}
|
||||
|
||||
const [signerCertBuffer, privateKeyBuffer] = generateCertificateAndPrivateKey();
|
||||
|
||||
/**
|
||||
* SIGNER_CERT, SIGNER_KEY, WWDR and SIGNER_KEY_PASSPHRASE are also set
|
||||
* as secrets in Github for run tests on Github Actions
|
||||
*/
|
||||
|
||||
const SIGNER_CERT =
|
||||
process.env.SIGNER_CERT ||
|
||||
fs.readFileSync(path.resolve(__dirname, "../certificates/signerCert.pem"));
|
||||
const SIGNER_KEY =
|
||||
process.env.SIGNER_KEY ||
|
||||
fs.readFileSync(path.resolve(__dirname, "../certificates/signerKey.pem"));
|
||||
const SIGNER_CERT = process.env.SIGNER_CERT || signerCertBuffer;
|
||||
const SIGNER_KEY = process.env.SIGNER_KEY || privateKeyBuffer;
|
||||
const WWDR =
|
||||
process.env.WWDR ||
|
||||
fs.readFileSync(path.resolve(__dirname, "../certificates/WWDR.pem"));
|
||||
@@ -1148,4 +1201,99 @@ describe("PKPass", () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("eventTicket new layout", () => {
|
||||
it("should contain preferredStyleSchemes if coming from an imported pass json", () => {
|
||||
const passjson = modelFiles["pass.json"];
|
||||
const changedPassJson = Buffer.from(
|
||||
JSON.stringify(
|
||||
Object.assign({}, JSON.parse(passjson.toString("utf-8")), {
|
||||
preferredStyleSchemes: [
|
||||
"posterEventTicket",
|
||||
"eventTicket",
|
||||
],
|
||||
eventTicket: {},
|
||||
}),
|
||||
),
|
||||
"utf-8",
|
||||
);
|
||||
|
||||
pkpass = new PKPass(
|
||||
Object.assign({}, modelFiles, { "pass.json": changedPassJson }),
|
||||
{
|
||||
signerCert: SIGNER_CERT,
|
||||
signerKey: SIGNER_KEY,
|
||||
wwdr: WWDR,
|
||||
signerKeyPassphrase: SIGNER_KEY_PASSPHRASE,
|
||||
},
|
||||
);
|
||||
|
||||
expect(pkpass.preferredStyleSchemes).toEqual([
|
||||
"posterEventTicket",
|
||||
"eventTicket",
|
||||
]);
|
||||
|
||||
const passjsonGenerated = getGeneratedPassJson(pkpass);
|
||||
|
||||
expect(passjsonGenerated.preferredStyleSchemes).not.toBeUndefined();
|
||||
expect(passjsonGenerated.preferredStyleSchemes).toEqual([
|
||||
"posterEventTicket",
|
||||
"eventTicket",
|
||||
]);
|
||||
});
|
||||
|
||||
it("should contain preferredStyleSchemes if coming from the setter (legacy order)", () => {
|
||||
pkpass.type = "eventTicket";
|
||||
|
||||
pkpass.preferredStyleSchemes = ["eventTicket", "posterEventTicket"];
|
||||
|
||||
expect(pkpass.preferredStyleSchemes).toEqual([
|
||||
"eventTicket",
|
||||
"posterEventTicket",
|
||||
]);
|
||||
|
||||
const passjsonGenerated = getGeneratedPassJson(pkpass);
|
||||
|
||||
expect(passjsonGenerated.preferredStyleSchemes).not.toBeUndefined();
|
||||
expect(passjsonGenerated.preferredStyleSchemes).toEqual([
|
||||
"eventTicket",
|
||||
"posterEventTicket",
|
||||
]);
|
||||
});
|
||||
|
||||
it("should contain preferredStyleSchemes if coming from the setter (new order)", () => {
|
||||
pkpass.type = "eventTicket";
|
||||
|
||||
pkpass.preferredStyleSchemes = ["posterEventTicket", "eventTicket"];
|
||||
|
||||
expect(pkpass.preferredStyleSchemes).toEqual([
|
||||
"posterEventTicket",
|
||||
"eventTicket",
|
||||
]);
|
||||
|
||||
const passjsonGenerated = getGeneratedPassJson(pkpass);
|
||||
|
||||
expect(passjsonGenerated.preferredStyleSchemes).not.toBeUndefined();
|
||||
expect(passjsonGenerated.preferredStyleSchemes).toEqual([
|
||||
"posterEventTicket",
|
||||
"eventTicket",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
it("preferredStyleSchemes setter should throw if pass is not an eventTicket", () => {
|
||||
pkpass.type = "boardingPass";
|
||||
|
||||
expect(() => {
|
||||
pkpass.preferredStyleSchemes = ["posterEventTicket", "eventTicket"];
|
||||
}).toThrowError();
|
||||
});
|
||||
|
||||
it("preferredStyleSchemes getter should throw if pass is not an eventTicket", () => {
|
||||
pkpass.type = "boardingPass";
|
||||
|
||||
expect(() => {
|
||||
pkpass.preferredStyleSchemes;
|
||||
}).toThrowError();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Readable, Stream } from "stream";
|
||||
import { Readable, Stream } from "node:stream";
|
||||
import * as Messages from "./messages";
|
||||
import * as zip from "do-not-zip";
|
||||
import { toArray as zipToArray } from "do-not-zip";
|
||||
import { Buffer } from "node:buffer";
|
||||
|
||||
export const filesSymbol = Symbol("bundleFiles");
|
||||
export const freezeSymbol = Symbol("bundleFreeze");
|
||||
@@ -128,7 +129,7 @@ export default class Bundle {
|
||||
|
||||
public getAsBuffer(): Buffer {
|
||||
this[freezeSymbol]();
|
||||
return zip.toBuffer(createZipFilesMap(this[filesSymbol]));
|
||||
return Buffer.from(zipToArray(createZipFilesMap(this[filesSymbol])));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -142,7 +143,7 @@ export default class Bundle {
|
||||
public getAsStream(): Stream {
|
||||
this[freezeSymbol]();
|
||||
return Readable.from(
|
||||
zip.toBuffer(createZipFilesMap(this[filesSymbol])),
|
||||
Buffer.from(zipToArray(createZipFilesMap(this[filesSymbol]))),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Stream } from "stream";
|
||||
import { Buffer } from "buffer";
|
||||
import path from "path";
|
||||
import { Stream } from "node:stream";
|
||||
import { Buffer } from "node:buffer";
|
||||
import path from "node:path";
|
||||
import FieldsArray from "./FieldsArray";
|
||||
import Bundle, { filesSymbol } from "./Bundle";
|
||||
import getModelFolderContents from "./getModelFolderContents";
|
||||
@@ -216,6 +216,49 @@ export default class PKPass extends Bundle {
|
||||
return Utils.cloneRecursive(this[propsSymbol]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows accessing to iOS 18 new Event Ticket
|
||||
* property `preferredStyleSchemes`.
|
||||
*
|
||||
* @throws if current type is not "eventTicket".
|
||||
*/
|
||||
|
||||
public get preferredStyleSchemes(): Schemas.PreferredStyleSchemes {
|
||||
if (this.type !== "eventTicket") {
|
||||
throw new TypeError(
|
||||
Messages.PREFERRED_STYLE_SCHEMES.UNEXPECTED_PASS_TYPE_GET,
|
||||
);
|
||||
}
|
||||
|
||||
return this[propsSymbol].preferredStyleSchemes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows setting a preferredStyleSchemes property
|
||||
* for a eventTicket.
|
||||
*
|
||||
* @throws if current type is not "eventTicket".
|
||||
* @param value
|
||||
*/
|
||||
|
||||
public set preferredStyleSchemes(value: Schemas.PreferredStyleSchemes) {
|
||||
Utils.assertUnfrozen(this);
|
||||
|
||||
if (this.type !== "eventTicket") {
|
||||
throw new TypeError(
|
||||
Messages.PREFERRED_STYLE_SCHEMES.UNEXPECTED_PASS_TYPE_SET,
|
||||
);
|
||||
}
|
||||
|
||||
Schemas.assertValidity(
|
||||
Schemas.PreferredStyleSchemes,
|
||||
value,
|
||||
Messages.PREFERRED_STYLE_SCHEMES.INVALID,
|
||||
);
|
||||
|
||||
this[propsSymbol].preferredStyleSchemes = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows setting a transitType property
|
||||
* for a boardingPass.
|
||||
@@ -316,6 +359,19 @@ export default class PKPass extends Bundle {
|
||||
return this[propsSymbol][this.type].backFields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows accessing to new iOS 18
|
||||
* event ticket additional fields
|
||||
*
|
||||
* @throws (automatically) if no valid pass.json
|
||||
* has been parsed yet or, anyway, if current
|
||||
* type is not "eventTicket".
|
||||
*/
|
||||
|
||||
public get additionalInfoFields(): Schemas.Field[] {
|
||||
return this[propsSymbol]["eventTicket"].additionalInfoFields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows setting a pass type.
|
||||
*
|
||||
@@ -345,6 +401,7 @@ export default class PKPass extends Bundle {
|
||||
*/
|
||||
|
||||
this[propsSymbol][this.type] = undefined;
|
||||
this[propsSymbol].preferredStyleSchemes = undefined;
|
||||
}
|
||||
|
||||
const sharedKeysPool = new Set<string>();
|
||||
@@ -376,6 +433,11 @@ export default class PKPass extends Bundle {
|
||||
sharedKeysPool,
|
||||
Schemas.Field,
|
||||
),
|
||||
additionalInfoFields: new FieldsArray(
|
||||
this,
|
||||
sharedKeysPool,
|
||||
Schemas.Field,
|
||||
),
|
||||
transitType: undefined,
|
||||
};
|
||||
}
|
||||
@@ -545,6 +607,7 @@ export default class PKPass extends Bundle {
|
||||
auxiliaryFields = [],
|
||||
backFields = [],
|
||||
transitType,
|
||||
additionalInfoFields = [],
|
||||
} = data[type] || {};
|
||||
|
||||
this.headerFields.push(...headerFields);
|
||||
@@ -556,6 +619,10 @@ export default class PKPass extends Bundle {
|
||||
if (this.type === "boardingPass") {
|
||||
this.transitType = transitType;
|
||||
}
|
||||
|
||||
if (this.type === "eventTicket") {
|
||||
this.additionalInfoFields.push(...additionalInfoFields);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import forge from "node-forge";
|
||||
import type * as Schemas from "./schemas";
|
||||
import { Buffer } from "buffer";
|
||||
import { Buffer } from "node:buffer";
|
||||
|
||||
/**
|
||||
* Creates an hash for a buffer. Used by manifest
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { EOL } from "os";
|
||||
import { Buffer } from "buffer";
|
||||
import { EOL } from "node:os";
|
||||
import { Buffer } from "node:buffer";
|
||||
|
||||
// ************************************ //
|
||||
// *** UTILS FOR PASS.STRINGS FILES *** //
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import * as path from "path";
|
||||
import * as path from "node:path";
|
||||
import * as Utils from "./utils";
|
||||
import * as Messages from "./messages";
|
||||
import { promises as fs } from "fs";
|
||||
import type { Buffer } from "buffer";
|
||||
import { promises as fs } from "node:fs";
|
||||
import type { Buffer } from "node:buffer";
|
||||
|
||||
/**
|
||||
* Reads the model folder contents
|
||||
|
||||
@@ -15,6 +15,15 @@ export const TRANSIT_TYPE = {
|
||||
"Cannot set transitType because not compliant with Apple specifications. Refer to https://apple.co/3DHuAG4 for more - %s",
|
||||
} as const;
|
||||
|
||||
export const PREFERRED_STYLE_SCHEMES = {
|
||||
UNEXPECTED_PASS_TYPE_SET:
|
||||
"Cannot set preferredStyleSchemes on a pass with type different from eventTicket.",
|
||||
UNEXPECTED_PASS_TYPE_GET:
|
||||
"Cannot get preferredStyleSchemes on a pass with type different from eventTicket.",
|
||||
INVALID:
|
||||
"Cannot set preferredStyleSchemes because not compliant with Apple specifications - %s",
|
||||
} as const;
|
||||
|
||||
export const PASS_TYPE = {
|
||||
INVALID:
|
||||
"Cannot set type because not compliant with Apple specifications. Refer to https://apple.co/3aFpSfg for a list of valid props - %s",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Buffer } from "buffer";
|
||||
import { Buffer } from "node:buffer";
|
||||
import Joi from "joi";
|
||||
|
||||
export interface CertificatesSchema {
|
||||
|
||||
@@ -42,7 +42,7 @@ export interface Field {
|
||||
dateStyle?: PKDateStyleType;
|
||||
ignoresTimeZone?: boolean;
|
||||
isRelative?: boolean;
|
||||
timeStyle?: string;
|
||||
timeStyle?: PKDateStyleType;
|
||||
currencyCode?: string;
|
||||
numberStyle?: PKNumberStyleType;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ export interface PassFields {
|
||||
primaryFields: Field[];
|
||||
secondaryFields: Field[];
|
||||
transitType?: TransitType;
|
||||
additionalInfoFields?: Field[];
|
||||
}
|
||||
|
||||
export const PassFields = Joi.object<PassFields>().keys({
|
||||
@@ -28,4 +29,5 @@ export const PassFields = Joi.object<PassFields>().keys({
|
||||
primaryFields: Joi.array().items(Field),
|
||||
secondaryFields: Joi.array().items(Field),
|
||||
transitType: TransitType,
|
||||
additionalInfoFields: Joi.array().items(Field),
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import Joi from "joi";
|
||||
import { RGB_HEX_COLOR_REGEX } from "./regexps";
|
||||
|
||||
/**
|
||||
* For a better description of every single field,
|
||||
@@ -39,6 +40,24 @@ declare namespace SemanticTagType {
|
||||
seatIdentifier?: string;
|
||||
seatType?: string;
|
||||
seatDescription?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
seatAisle?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
seatLevel?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
seatSectionColor?: string;
|
||||
}
|
||||
|
||||
interface WifiNetwork {
|
||||
@@ -63,16 +82,34 @@ const PersonNameComponent =
|
||||
phoneticRepresentation: Joi.string(),
|
||||
});
|
||||
|
||||
const seat = Joi.object<SemanticTagType.Seat>().keys({
|
||||
const SeatSemantics = Joi.object<SemanticTagType.Seat>().keys({
|
||||
seatSection: Joi.string(),
|
||||
seatRow: Joi.string(),
|
||||
seatNumber: Joi.string(),
|
||||
seatIdentifier: Joi.string(),
|
||||
seatType: Joi.string(),
|
||||
seatDescription: Joi.string(),
|
||||
|
||||
/**
|
||||
* Newly-introduced in iOS 18
|
||||
* Used in poster event tickets
|
||||
*/
|
||||
seatAisle: Joi.string(),
|
||||
|
||||
/**
|
||||
* Newly-introduced in iOS 18
|
||||
* Used in poster event tickets
|
||||
*/
|
||||
seatLevel: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
seatSectionColor: Joi.string().regex(RGB_HEX_COLOR_REGEX),
|
||||
});
|
||||
|
||||
const location = Joi.object<SemanticTagType.Location>().keys({
|
||||
const LocationSemantics = Joi.object<SemanticTagType.Location>().keys({
|
||||
latitude: Joi.number().required(),
|
||||
longitude: Joi.number().required(),
|
||||
});
|
||||
@@ -88,12 +125,51 @@ const WifiNetwork = Joi.object<SemanticTagType.WifiNetwork>().keys({
|
||||
*/
|
||||
|
||||
export interface Semantics {
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
admissionLevel?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
admissionLevelAbbreviation?: string;
|
||||
|
||||
airlineCode?: string;
|
||||
artistIDs?: string[];
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
albumIDs?: string[];
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
airplay?: {
|
||||
airPlayDeviceGroupToken: string;
|
||||
}[];
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
attendeeName?: string;
|
||||
|
||||
awayTeamAbbreviation?: string;
|
||||
awayTeamLocation?: string;
|
||||
awayTeamName?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
additionalTicketAttributes?: string;
|
||||
|
||||
balance?: SemanticTagType.CurrencyAmount;
|
||||
boardingGroup?: string;
|
||||
boardingSequenceNumber?: string;
|
||||
@@ -122,7 +198,23 @@ export interface Semantics {
|
||||
destinationTerminal?: string;
|
||||
duration?: number;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
entranceDescription?: string;
|
||||
|
||||
eventEndDate?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*
|
||||
* This seem to exists but it is not
|
||||
* known yet what it does...
|
||||
*/
|
||||
eventLiveMessage?: string;
|
||||
|
||||
eventName?: string;
|
||||
eventStartDate?: string;
|
||||
eventType?:
|
||||
@@ -157,11 +249,23 @@ export interface Semantics {
|
||||
performerNames?: string[];
|
||||
priorityStatus?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
playlistIDs?: string[];
|
||||
|
||||
seats?: SemanticTagType.Seat[];
|
||||
securityScreening?: string;
|
||||
silenceRequested?: boolean;
|
||||
sportName?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
tailgatingAllowed?: boolean;
|
||||
|
||||
totalPrice?: SemanticTagType.CurrencyAmount;
|
||||
transitProvider?: string;
|
||||
transitStatus?: string;
|
||||
@@ -170,22 +274,120 @@ export interface Semantics {
|
||||
vehicleName?: string;
|
||||
vehicleNumber?: string;
|
||||
vehicleType?: string;
|
||||
|
||||
venueEntrance?: string;
|
||||
venueLocation?: SemanticTagType.Location;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueGatesOpenDate?: string;
|
||||
|
||||
venueName?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueParkingLotsOpenDate?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueBoxOfficeOpenDate?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueDoorsOpenDate?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueFanZoneOpenDate?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueCloseDate?: string;
|
||||
|
||||
venuePhoneNumber?: string;
|
||||
venueRoom?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueRegionName?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueEntranceGate?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueEntranceDoor?: string;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueEntrancePortal?: string;
|
||||
|
||||
wifiAccess?: SemanticTagType.WifiNetwork[];
|
||||
}
|
||||
|
||||
export const Semantics = Joi.object<Semantics>().keys({
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
admissionLevel: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
admissionLevelAbbreviation: Joi.string(),
|
||||
|
||||
airlineCode: Joi.string(),
|
||||
artistIDs: Joi.array().items(Joi.string()),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
albumIDs: Joi.array().items(Joi.string()),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
airplay: Joi.array().items({
|
||||
airplayDeviceGroupToken: Joi.string(),
|
||||
}),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
attendeeName: Joi.string(),
|
||||
|
||||
awayTeamAbbreviation: Joi.string(),
|
||||
awayTeamLocation: Joi.string(),
|
||||
awayTeamName: Joi.string(),
|
||||
|
||||
additionalTicketAttributes: Joi.string(),
|
||||
|
||||
balance: CurrencyAmount,
|
||||
boardingGroup: Joi.string(),
|
||||
boardingSequenceNumber: Joi.string(),
|
||||
@@ -199,7 +401,7 @@ export const Semantics = Joi.object<Semantics>().keys({
|
||||
departureAirportCode: Joi.string(),
|
||||
departureAirportName: Joi.string(),
|
||||
departureGate: Joi.string(),
|
||||
departureLocation: location,
|
||||
departureLocation: LocationSemantics,
|
||||
departureLocationDescription: Joi.string(),
|
||||
departurePlatform: Joi.string(),
|
||||
departureStationName: Joi.string(),
|
||||
@@ -207,15 +409,31 @@ export const Semantics = Joi.object<Semantics>().keys({
|
||||
destinationAirportCode: Joi.string(),
|
||||
destinationAirportName: Joi.string(),
|
||||
destinationGate: Joi.string(),
|
||||
destinationLocation: location,
|
||||
destinationLocation: LocationSemantics,
|
||||
destinationLocationDescription: Joi.string(),
|
||||
destinationPlatform: Joi.string(),
|
||||
destinationStationName: Joi.string(),
|
||||
destinationTerminal: Joi.string(),
|
||||
duration: Joi.number(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
entranceDescription: Joi.string(),
|
||||
|
||||
eventEndDate: Joi.string(),
|
||||
eventName: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*
|
||||
* This seem to exists but it is not
|
||||
* known yet what it does...
|
||||
*/
|
||||
eventLiveMessage: Joi.string(),
|
||||
|
||||
eventStartDate: Joi.string(),
|
||||
eventType: Joi.string().regex(
|
||||
/(PKEventTypeGeneric|PKEventTypeLivePerformance|PKEventTypeMovie|PKEventTypeSports|PKEventTypeConference|PKEventTypeConvention|PKEventTypeWorkshop|PKEventTypeSocialGathering)/,
|
||||
@@ -243,11 +461,15 @@ export const Semantics = Joi.object<Semantics>().keys({
|
||||
performerNames: Joi.array().items(Joi.string()),
|
||||
priorityStatus: Joi.string(),
|
||||
|
||||
seats: Joi.array().items(seat),
|
||||
playlistIDs: Joi.array().items(Joi.string()),
|
||||
|
||||
seats: Joi.array().items(SeatSemantics),
|
||||
securityScreening: Joi.string(),
|
||||
silenceRequested: Joi.boolean(),
|
||||
sportName: Joi.string(),
|
||||
|
||||
tailgatingAllowed: Joi.boolean(),
|
||||
|
||||
totalPrice: CurrencyAmount,
|
||||
transitProvider: Joi.string(),
|
||||
transitStatus: Joi.string(),
|
||||
@@ -256,11 +478,74 @@ export const Semantics = Joi.object<Semantics>().keys({
|
||||
vehicleName: Joi.string(),
|
||||
vehicleNumber: Joi.string(),
|
||||
vehicleType: Joi.string(),
|
||||
|
||||
venueEntrance: Joi.string(),
|
||||
venueLocation: location,
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueGatesOpenDate: Joi.string(),
|
||||
|
||||
venueLocation: LocationSemantics,
|
||||
venueName: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueParkingLotsOpenDate: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueBoxOfficeOpenDate: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueDoorsOpenDate: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueFanZoneOpenDate: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueCloseDate: Joi.string(),
|
||||
|
||||
venuePhoneNumber: Joi.string(),
|
||||
venueRoom: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueRegionName: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueEntranceGate: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueEntranceDoor: Joi.string(),
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
venueEntrancePortal: Joi.string(),
|
||||
|
||||
wifiAccess: Joi.array().items(WifiNetwork),
|
||||
});
|
||||
|
||||
@@ -9,7 +9,7 @@ export * from "./Personalize";
|
||||
export * from "./Certificates";
|
||||
|
||||
import Joi from "joi";
|
||||
import { Buffer } from "buffer";
|
||||
import type { Buffer } from "node:buffer";
|
||||
|
||||
import { Barcode } from "./Barcode";
|
||||
import { Location } from "./Location";
|
||||
@@ -20,9 +20,33 @@ import { Semantics } from "./Semantics";
|
||||
import { CertificatesSchema } from "./Certificates";
|
||||
|
||||
import * as Messages from "../messages";
|
||||
import { RGB_HEX_COLOR_REGEX, URL_REGEX } from "./regexps";
|
||||
|
||||
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*\)/;
|
||||
export type PreferredStyleSchemes = ("posterEventTicket" | "eventTicket")[];
|
||||
|
||||
export const PreferredStyleSchemes = Joi.array().items(
|
||||
"posterEventTicket",
|
||||
"eventTicket",
|
||||
) satisfies Joi.Schema<PreferredStyleSchemes>;
|
||||
|
||||
/**
|
||||
* For newly-introduced event tickets
|
||||
* in iOS 18
|
||||
*/
|
||||
|
||||
interface RelevantDate {
|
||||
startDate: string;
|
||||
endDate: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Minimum supported version: iOS 18
|
||||
*/
|
||||
|
||||
const RelevantDate = Joi.object<RelevantDate>().keys({
|
||||
startDate: Joi.string().required(),
|
||||
endDate: Joi.string().required(),
|
||||
});
|
||||
|
||||
export interface FileBuffers {
|
||||
[key: string]: Buffer;
|
||||
@@ -57,6 +81,9 @@ export interface PassProps {
|
||||
beacons?: Beacon[];
|
||||
barcodes?: Barcode[];
|
||||
relevantDate?: string;
|
||||
|
||||
relevantDates?: RelevantDate[];
|
||||
|
||||
expirationDate?: string;
|
||||
locations?: Location[];
|
||||
|
||||
@@ -65,6 +92,144 @@ export interface PassProps {
|
||||
coupon?: PassFields;
|
||||
generic?: PassFields;
|
||||
storeCard?: PassFields;
|
||||
|
||||
/**
|
||||
* New field for iOS 18
|
||||
* Event Ticket
|
||||
*/
|
||||
preferredStyleSchemes?: PreferredStyleSchemes;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
bagPolicyURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
orderFoodURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
parkingInformationURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
directionsInformationURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
contactVenueEmail?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
contactVenuePhoneNumber?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
contactVenueWebsite?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
purchaseParkingURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
merchandiseURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
transitInformationURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
accessibilityURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
addOnURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* Will add a button among options near "share"
|
||||
*/
|
||||
transferURL?: string;
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* Will add a button among options near "share"
|
||||
*/
|
||||
sellURL?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -77,8 +242,10 @@ type PassMethodsProps =
|
||||
| "beacons"
|
||||
| "barcodes"
|
||||
| "relevantDate"
|
||||
| "relevantDates"
|
||||
| "expirationDate"
|
||||
| "locations";
|
||||
| "locations"
|
||||
| "preferredStyleSchemes";
|
||||
|
||||
export type PassTypesProps =
|
||||
| "boardingPass"
|
||||
@@ -104,8 +271,10 @@ export const PassPropsFromMethods = Joi.object<PassPropsFromMethods>({
|
||||
beacons: Joi.array().items(Beacon),
|
||||
barcodes: Joi.array().items(Barcode),
|
||||
relevantDate: Joi.string().isoDate(),
|
||||
relevantDates: Joi.array().items(RelevantDate),
|
||||
expirationDate: Joi.string().isoDate(),
|
||||
locations: Joi.array().items(Location),
|
||||
preferredStyleSchemes: PreferredStyleSchemes,
|
||||
});
|
||||
|
||||
export const PassKindsProps = Joi.object<PassKindsProps>({
|
||||
@@ -136,15 +305,144 @@ export const OverridablePassProps = Joi.object<OverridablePassProps>({
|
||||
suppressStripShine: Joi.boolean(),
|
||||
maxDistance: Joi.number().positive(),
|
||||
authenticationToken: Joi.string().min(16),
|
||||
labelColor: Joi.string().regex(RGB_COLOR_REGEX),
|
||||
backgroundColor: Joi.string().regex(RGB_COLOR_REGEX),
|
||||
foregroundColor: Joi.string().regex(RGB_COLOR_REGEX),
|
||||
labelColor: Joi.string().regex(RGB_HEX_COLOR_REGEX),
|
||||
backgroundColor: Joi.string().regex(RGB_HEX_COLOR_REGEX),
|
||||
foregroundColor: Joi.string().regex(RGB_HEX_COLOR_REGEX),
|
||||
associatedStoreIdentifiers: Joi.array().items(Joi.number()),
|
||||
userInfo: Joi.alternatives(Joi.object().unknown(), Joi.array()),
|
||||
// parsing url as set of words and nums followed by dots, optional port and any possible path after
|
||||
webServiceURL: Joi.string().regex(
|
||||
/https?:\/\/(?:[a-z0-9]+\.?)+(?::\d{2,})?(?:\/[\S]+)*/,
|
||||
),
|
||||
webServiceURL: Joi.string().regex(URL_REGEX),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
bagPolicyURL: Joi.string().regex(URL_REGEX),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
orderFoodURL: Joi.string().regex(URL_REGEX),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
parkingInformationURL: Joi.string().regex(URL_REGEX),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
directionsInformationURL: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
contactVenueEmail: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
contactVenuePhoneNumber: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
contactVenueWebsite: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
purchaseParkingURL: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
merchandiseURL: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
transitInformationURL: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
accessibilityURL: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* @domain event guide
|
||||
*
|
||||
* To show buttons in the event guide,
|
||||
* at least two among those marked with
|
||||
* "@domain event guide" must be used.
|
||||
*/
|
||||
addOnURL: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* Will add a button among options near "share"
|
||||
*/
|
||||
transferURL: Joi.string(),
|
||||
|
||||
/**
|
||||
* New field for iOS 18 Event Ticket.
|
||||
* Will add a button among options near "share"
|
||||
*/
|
||||
sellURL: Joi.string(),
|
||||
}).with("webServiceURL", "authenticationToken");
|
||||
|
||||
export const PassProps = Joi.object<
|
||||
@@ -175,7 +473,7 @@ export const Template = Joi.object<Template>({
|
||||
*/
|
||||
|
||||
export function assertValidity<T>(
|
||||
schema: Joi.ObjectSchema<T> | Joi.StringSchema,
|
||||
schema: Joi.ObjectSchema<T> | Joi.StringSchema | Joi.Schema<T>,
|
||||
data: T,
|
||||
customErrorMessage?: string,
|
||||
): void {
|
||||
|
||||
3
src/schemas/regexps.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export const RGB_HEX_COLOR_REGEX =
|
||||
/(?:\#[a-fA-F0-9]{3,6}|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*\))/;
|
||||
export const URL_REGEX = /https?:\/\/(?:[a-z0-9]+\.?)+(?::\d{2,})?(?:\/[\S]+)*/;
|
||||
@@ -3,7 +3,7 @@
|
||||
"compilerOptions": {
|
||||
"outDir": "lib",
|
||||
"declaration": true,
|
||||
"sourceMap": true,
|
||||
"inlineSourceMap": true,
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
|
||||