Completely refactored examples to run only once and have multiple endpoints

This commit is contained in:
Alexander Cerutti
2021-10-31 20:37:06 +01:00
parent 8552f217ee
commit 64ccacdc13
16 changed files with 389 additions and 105 deletions

View File

@@ -0,0 +1,35 @@
# Examples
This is examples folder. These examples are used to test new features and as sample showcases.
Each example owns an endpoint where a pass can be reached. This project is build upon Express.js, which is required to be installed.
Typescript compilation is done automatically through `ts-node`.
Assuming you already have cloned this repository, installed its dependencies through `npm install` and moved to `examples/self-hosted`, run these commands:
```sh
$ npm install;
$ npm run example;
```
Certificates paths in examples are linked to a folder `certificates` in the root of this project which is not provided.
To make them work, you'll have to edit both certificates and model path.
Every example runs on `0.0.0.0:8080`. Visit `http://localhost:8080/:example/:modelName`, by replacing `:example` with one of the following and `:modelName` with one inside models folder.
Please note that `field.js` example will force you to download `exampleBooking.pass`, no matter what.
| Example name | Endpoint name | Additional notes |
| -------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------- |
| localize | `/localize` | - |
| fields | `/fields` | - |
| expirationDate | `/expirationDate` | Accepts a required parameter in query string `fn`, which can be either `expiration` or `void`, to switch generated example. |
| scratch | `/scratch` | - |
| PKPass.from | pkpassfrom | - |
| barcodes | `/barcodes` | Using `?alt=true` query parameter, will lead to barcode string message usage instead of selected ones |
| pkpasses | `/pkpasses` | - |
---
Every contribution is really appreciated. ❤️ Thank you!

View File

@@ -1,11 +1,11 @@
{
"name": "examples",
"name": "examples-self-hosted",
"version": "0.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "examples",
"name": "examples-self-hosted",
"version": "0.0.0",
"hasInstallScript": true,
"license": "ISC",
@@ -16,12 +16,34 @@
},
"devDependencies": {
"@types/express": "4.17.8",
"ts-node": "^10.4.0",
"typescript": "^4.4.4"
},
"peerDependencies": {
"passkit-generator": "latest"
}
},
"node_modules/@cspotcode/source-map-consumer": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
"dev": true,
"engines": {
"node": ">= 12"
}
},
"node_modules/@cspotcode/source-map-support": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
"integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
"dev": true,
"dependencies": {
"@cspotcode/source-map-consumer": "0.8.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@hapi/hoek": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz",
@@ -58,6 +80,30 @@
"integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
"peer": true
},
"node_modules/@tsconfig/node10": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
"dev": true
},
"node_modules/@tsconfig/node12": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
"dev": true
},
"node_modules/@tsconfig/node14": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
"dev": true
},
"node_modules/@tsconfig/node16": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
"dev": true
},
"node_modules/@types/body-parser": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
@@ -146,6 +192,33 @@
"node": ">= 0.6"
}
},
"node_modules/acorn": {
"version": "8.5.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
"integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"dev": true,
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true
},
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -220,6 +293,12 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true
},
"node_modules/data-uri-to-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
@@ -249,6 +328,15 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true,
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -421,6 +509,12 @@
"@sideway/pinpoint": "^2.0.0"
}
},
"node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -688,6 +782,47 @@
"node": ">=0.6"
}
},
"node_modules/ts-node": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz",
"integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==",
"dev": true,
"dependencies": {
"@cspotcode/source-map-support": "0.7.0",
"@tsconfig/node10": "^1.0.7",
"@tsconfig/node12": "^1.0.7",
"@tsconfig/node14": "^1.0.0",
"@tsconfig/node16": "^1.0.2",
"acorn": "^8.4.1",
"acorn-walk": "^8.1.1",
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"yn": "3.1.1"
},
"bin": {
"ts-node": "dist/bin.js",
"ts-node-cwd": "dist/bin-cwd.js",
"ts-node-script": "dist/bin-script.js",
"ts-node-transpile-only": "dist/bin-transpile.js",
"ts-script": "dist/bin-script-deprecated.js"
},
"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
}
}
},
"node_modules/tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
@@ -758,9 +893,33 @@
"dependencies": {
"buffer-crc32": "~0.2.3"
}
},
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"engines": {
"node": ">=6"
}
}
},
"dependencies": {
"@cspotcode/source-map-consumer": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
"dev": true
},
"@cspotcode/source-map-support": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
"integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
"dev": true,
"requires": {
"@cspotcode/source-map-consumer": "0.8.0"
}
},
"@hapi/hoek": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz",
@@ -797,6 +956,30 @@
"integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
"peer": true
},
"@tsconfig/node10": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
"dev": true
},
"@tsconfig/node12": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
"dev": true
},
"@tsconfig/node14": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
"dev": true
},
"@tsconfig/node16": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
"dev": true
},
"@types/body-parser": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
@@ -882,6 +1065,24 @@
"negotiator": "0.6.2"
}
},
"acorn": {
"version": "8.5.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
"integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
"dev": true
},
"acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"dev": true
},
"arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -938,6 +1139,12 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true
},
"data-uri-to-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
@@ -961,6 +1168,12 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -1093,6 +1306,12 @@
"@sideway/pinpoint": "^2.0.0"
}
},
"make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -1292,6 +1511,26 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"ts-node": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz",
"integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==",
"dev": true,
"requires": {
"@cspotcode/source-map-support": "0.7.0",
"@tsconfig/node10": "^1.0.7",
"@tsconfig/node12": "^1.0.7",
"@tsconfig/node14": "^1.0.0",
"@tsconfig/node16": "^1.0.2",
"acorn": "^8.4.1",
"acorn-walk": "^8.1.1",
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"yn": "3.1.1"
}
},
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
@@ -1340,6 +1579,12 @@
"requires": {
"buffer-crc32": "~0.2.3"
}
},
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true
}
}
}

View File

@@ -1,17 +1,15 @@
{
"name": "examples",
"name": "examples-self-hosted",
"version": "0.0.0",
"private": true,
"description": "Passkit-generator examples",
"description": "Passkit-generator self-hosted examples",
"author": "Alexander P. Cerutti <cerutti.alexander@gmail.com>",
"license": "ISC",
"scripts": {
"preinstall": "npm run clear:deps && npm unlink --no-save passkit-generator",
"postinstall": "cd .. && npm run build && npm link && cd examples && npm link passkit-generator",
"example": "cd build && node",
"example:debug": "cd build && node --inspect-brk",
"build": "npm run build:clear && npm install && npx tsc",
"build:clear": "rm -rf build",
"postinstall": "npm --prefix ../.. run build && npm --prefix ../.. link && npm link passkit-generator",
"example": "npx ts-node src/index.ts",
"example:debug": "node -r ts-node/register --inspect-brk src/index.ts",
"clear:deps": "rm -rf node_modules"
},
"peerDependencies": {
@@ -24,6 +22,7 @@
},
"devDependencies": {
"@types/express": "4.17.8",
"ts-node": "^10.4.0",
"typescript": "^4.4.4"
}
}

View File

@@ -5,7 +5,8 @@
* examples, creation through templates is already shown
*/
import app, { getCertificates } from "./webserver";
import { app } from "./webserver";
import { getCertificates } from "./shared";
import path from "path";
import { promises as fs } from "fs";
import { PKPass } from "passkit-generator";
@@ -75,7 +76,7 @@ async function readDirectory(filePath: string) {
// *************************** //
const passTemplate = new Promise<PKPass>(async (resolve) => {
const modelPath = path.resolve(__dirname, `../models/examplePass.pass`);
const modelPath = path.resolve(__dirname, `../../models/examplePass.pass`);
const [modelFilesList, certificates] = await Promise.all([
fs.readdir(modelPath),
getCertificates(),
@@ -113,7 +114,7 @@ const passTemplate = new Promise<PKPass>(async (resolve) => {
);
});
app.all(async function manageRequest(request, response) {
app.route("/pkpassfrom/:modelName").get(async (request, response) => {
const passName =
request.params.modelName +
"_" +

View File

@@ -26,9 +26,10 @@
* A feedback to Apple have been sent for this.
*/
import app, { getCertificates } from "./webserver";
import path from "path";
import { app } from "./webserver";
import { getCertificates } from "./shared";
import { promises as fs } from "fs";
import path from "path";
import { PKPass } from "passkit-generator";
// *************************** //
@@ -42,7 +43,10 @@ function getRandomColorPart() {
async function generatePass(props: Object) {
const [iconFromModel, certificates] = await Promise.all([
fs.readFile(
path.resolve(__dirname, "../models/exampleBooking.pass/icon.png"),
path.resolve(
__dirname,
"../../models/exampleBooking.pass/icon.png",
),
),
getCertificates(),
]);
@@ -111,7 +115,7 @@ async function generatePass(props: Object) {
return pass;
}
app.all(async function manageRequest(request, response) {
app.route("/pkpasses/:modelName").get(async (request, response) => {
const passName =
request.params.modelName +
"_" +

View File

@@ -9,11 +9,12 @@
* @Author: Alexander P. Cerutti
*/
import app, { getCertificates } from "./webserver";
import { app } from "./webserver";
import { getCertificates } from "./shared";
import path from "path";
import { PKPass } from "passkit-generator";
app.all(async function manageRequest(request, response) {
app.route("/fields/:modelName").get(async (request, response) => {
const passName =
"exampleBooking" +
"_" +
@@ -24,7 +25,7 @@ app.all(async function manageRequest(request, response) {
try {
const pass = await PKPass.from(
{
model: path.resolve(__dirname, "../models/exampleBooking"),
model: path.resolve(__dirname, "../../models/exampleBooking"),
certificates: {
wwdr: certificates.wwdr,
signerCert: certificates.signerCert,

View File

@@ -0,0 +1,7 @@
import "./fields";
import "./localize";
import "./PKPass.from";
import "./PKPasses";
import "./scratch";
import "./setBarcodes";
import "./setExpirationDate";

View File

@@ -4,13 +4,14 @@
* .pkpass file and check for .lproj folders
*/
import app, { getCertificates } from "./webserver";
import { app } from "./webserver";
import { getCertificates } from "./shared";
import path from "path";
import { PKPass } from "passkit-generator";
/** Symbols are exported just for tests and examples. Replicate only if really needed. */
import { localizationSymbol } from "passkit-generator/lib/PKPass";
app.all(async function manageRequest(request, response) {
app.route("/localize/:modelName").get(async (request, response) => {
const passName =
request.params.modelName +
"_" +
@@ -23,7 +24,7 @@ app.all(async function manageRequest(request, response) {
{
model: path.resolve(
__dirname,
`../models/${request.params.modelName}`,
`../../models/${request.params.modelName}`,
),
certificates: {
wwdr: certificates.wwdr,

View File

@@ -3,7 +3,8 @@
* by adding files later and not adding pass.json
*/
import app, { getCertificates } from "./webserver";
import { app } from "./webserver";
import { getCertificates } from "./shared";
import path from "path";
import { promises as fs } from "fs";
import { PKPass } from "passkit-generator";
@@ -12,7 +13,7 @@ function getRandomColorPart() {
return Math.floor(Math.random() * 255);
}
app.all(async function manageRequest(request, response) {
app.route("/scratch/:modelName").get(async (request, response) => {
const passName =
request.params.modelName +
"_" +
@@ -20,7 +21,10 @@ app.all(async function manageRequest(request, response) {
const [iconFromModel, certificates] = await Promise.all([
fs.readFile(
path.resolve(__dirname, "../models/exampleBooking.pass/icon.png"),
path.resolve(
__dirname,
"../../models/exampleBooking.pass/icon.png",
),
),
await getCertificates(),
]);

View File

@@ -8,11 +8,12 @@
* by a string
*/
import app, { getCertificates } from "./webserver";
import { app } from "./webserver";
import { getCertificates } from "./shared";
import { PKPass } from "passkit-generator";
import path from "path";
app.all(async function manageRequest(request, response) {
app.route("/barcodes/:modelName").get(async (request, response) => {
const passName =
request.params.modelName +
"_" +
@@ -25,7 +26,7 @@ app.all(async function manageRequest(request, response) {
{
model: path.resolve(
__dirname,
`../models/${request.params.modelName}`,
`../../models/${request.params.modelName}`,
),
certificates: {
wwdr: certificates.wwdr,

View File

@@ -7,11 +7,12 @@
* have to wait two minutes.
*/
import app, { getCertificates } from "./webserver";
import { app } from "./webserver";
import { getCertificates } from "./shared";
import path from "path";
import { PKPass } from "passkit-generator";
app.all(async function manageRequest(request, response) {
app.route("/expirationDate/:modelName").get(async (request, response) => {
if (!request.query.fn) {
response.send(
"<a href='?fn=void'>Generate a voided pass.</a><br><a href='?fn=expiration'>Generate a pass with expiration date</a>",
@@ -31,7 +32,7 @@ app.all(async function manageRequest(request, response) {
{
model: path.resolve(
__dirname,
`../models/${request.params.modelName}`,
`../../models/${request.params.modelName}`,
),
certificates: {
wwdr: certificates.wwdr,

View File

@@ -0,0 +1,41 @@
import { promises as fs } from "fs";
import path from "path";
const certificatesCache: Partial<{
signerCert: Buffer;
signerKey: Buffer;
wwdr: Buffer;
signerKeyPassphrase: string;
}> = {};
export async function getCertificates(): Promise<typeof certificatesCache> {
if (Object.keys(certificatesCache).length) {
return certificatesCache;
}
const [signerCert, signerKey, wwdr, signerKeyPassphrase] =
await Promise.all([
fs.readFile(
path.resolve(__dirname, "../../../certificates/signerCert.pem"),
"utf-8",
),
fs.readFile(
path.resolve(__dirname, "../../../certificates/signerKey.pem"),
"utf-8",
),
fs.readFile(
path.resolve(__dirname, "../../../certificates/WWDR.pem"),
"utf-8",
),
Promise.resolve("123456"),
]);
Object.assign(certificatesCache, {
signerCert,
signerKey,
wwdr,
signerKeyPassphrase,
});
return certificatesCache;
}

View File

@@ -0,0 +1,14 @@
/*
* Generic webserver instance for the examples
* @Author Alexander P. Cerutti
* Requires express to run
*/
import express from "express";
export const app = express();
app.use(express.json());
app.listen(8080, "0.0.0.0", () => {
console.log("Webserver started.");
});

View File

@@ -1,10 +1,11 @@
{
"extends": "../tsconfig.json",
"extends": "../../tsconfig.json",
"compilerOptions": {
"target": "ESNext",
"module": "CommonJS",
"outDir": "build",
"moduleResolution": "node"
"moduleResolution": "node",
"sourceMap": true
},
"exclude": ["node_modules"]
}

View File

@@ -1,67 +0,0 @@
/*
* Generic webserver instance for the examples
* @Author Alexander P. Cerutti
* Requires express to run
*/
import express from "express";
import { promises as fs } from "fs";
import path from "path";
export const app = express();
app.use(express.json());
app.listen(8080, "0.0.0.0", () => {
console.log("Webserver started.");
});
app.all("/", function (_, response) {
response.redirect("/gen/");
});
app.route("/gen").all((req, res) => {
res.set("Content-Type", "text/html");
res.send(
"Cannot generate a pass. Specify a modelName in the url to continue. <br/>Usage: /gen/<i>modelName</i>",
);
});
export default app.route("/gen/:modelName");
const certificatesCache: Partial<{
signerCert: Buffer;
signerKey: Buffer;
wwdr: Buffer;
signerKeyPassphrase: string;
}> = {};
export async function getCertificates(): Promise<typeof certificatesCache> {
if (Object.keys(certificatesCache).length) {
return certificatesCache;
}
const [signerCert, signerKey, wwdr, signerKeyPassphrase] =
await Promise.all([
fs.readFile(
path.resolve(__dirname, "../../certificates/signerCert.pem"),
"utf-8",
),
fs.readFile(
path.resolve(__dirname, "../../certificates/signerKey.pem"),
"utf-8",
),
fs.readFile(
path.resolve(__dirname, "../../certificates/WWDR.pem"),
"utf-8",
),
Promise.resolve("123456"),
]);
Object.assign(certificatesCache, {
signerCert,
signerKey,
wwdr,
signerKeyPassphrase,
});
return certificatesCache;
}