mirror of
https://github.com/marcogll/passkit-generator.git
synced 2026-03-15 19:25:23 +00:00
Completely refactored examples to run only once and have multiple endpoints
This commit is contained in:
35
examples/self-hosted/README.md
Normal file
35
examples/self-hosted/README.md
Normal 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!
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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 +
|
||||
"_" +
|
||||
@@ -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 +
|
||||
"_" +
|
||||
@@ -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,
|
||||
7
examples/self-hosted/src/index.ts
Normal file
7
examples/self-hosted/src/index.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import "./fields";
|
||||
import "./localize";
|
||||
import "./PKPass.from";
|
||||
import "./PKPasses";
|
||||
import "./scratch";
|
||||
import "./setBarcodes";
|
||||
import "./setExpirationDate";
|
||||
@@ -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,
|
||||
@@ -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(),
|
||||
]);
|
||||
@@ -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,
|
||||
@@ -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,
|
||||
41
examples/self-hosted/src/shared.ts
Normal file
41
examples/self-hosted/src/shared.ts
Normal 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;
|
||||
}
|
||||
14
examples/self-hosted/src/webserver.ts
Normal file
14
examples/self-hosted/src/webserver.ts
Normal 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.");
|
||||
});
|
||||
@@ -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"]
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -9,11 +9,7 @@
|
||||
"build:src": "rimraf lib && npx tsc -p tsconfig.dist.json",
|
||||
"build:spec": "rimraf \"./spec/*.!(ts)\" && npx tsc -p tsconfig.spec.json",
|
||||
"prepublishOnly": "npm run build",
|
||||
"test": "npm run build:spec && npx jasmine",
|
||||
"example": "npm run build:src && npm --prefix examples run example",
|
||||
"example:install": "npm --prefix examples install",
|
||||
"example:build": "npm --prefix examples run build",
|
||||
"example:debug": "npm run build:src && npm --prefix examples run example:debug"
|
||||
"test": "npm run build:spec && npx jasmine"
|
||||
},
|
||||
"author": "Alexander Patrick Cerutti",
|
||||
"license": "MIT",
|
||||
|
||||
Reference in New Issue
Block a user