diff --git a/examples/self-hosted/README.md b/examples/self-hosted/README.md new file mode 100644 index 0000000..8001b4f --- /dev/null +++ b/examples/self-hosted/README.md @@ -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! diff --git a/examples/package-lock.json b/examples/self-hosted/package-lock.json similarity index 83% rename from examples/package-lock.json rename to examples/self-hosted/package-lock.json index ff4a28f..ea52a70 100644 --- a/examples/package-lock.json +++ b/examples/self-hosted/package-lock.json @@ -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 } } } diff --git a/examples/package.json b/examples/self-hosted/package.json similarity index 58% rename from examples/package.json rename to examples/self-hosted/package.json index dc88d28..fa34584 100644 --- a/examples/package.json +++ b/examples/self-hosted/package.json @@ -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 ", "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" } } diff --git a/examples/PKPass.from.ts b/examples/self-hosted/src/PKPass.from.ts similarity index 93% rename from examples/PKPass.from.ts rename to examples/self-hosted/src/PKPass.from.ts index e180037..ea501f9 100644 --- a/examples/PKPass.from.ts +++ b/examples/self-hosted/src/PKPass.from.ts @@ -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(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(async (resolve) => { ); }); -app.all(async function manageRequest(request, response) { +app.route("/pkpassfrom/:modelName").get(async (request, response) => { const passName = request.params.modelName + "_" + diff --git a/examples/PKPasses.ts b/examples/self-hosted/src/PKPasses.ts similarity index 93% rename from examples/PKPasses.ts rename to examples/self-hosted/src/PKPasses.ts index 1abda08..7bd5992 100644 --- a/examples/PKPasses.ts +++ b/examples/self-hosted/src/PKPasses.ts @@ -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 + "_" + diff --git a/examples/fields.ts b/examples/self-hosted/src/fields.ts similarity index 95% rename from examples/fields.ts rename to examples/self-hosted/src/fields.ts index 2c97ed6..0149b56 100644 --- a/examples/fields.ts +++ b/examples/self-hosted/src/fields.ts @@ -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, diff --git a/examples/self-hosted/src/index.ts b/examples/self-hosted/src/index.ts new file mode 100644 index 0000000..8461e04 --- /dev/null +++ b/examples/self-hosted/src/index.ts @@ -0,0 +1,7 @@ +import "./fields"; +import "./localize"; +import "./PKPass.from"; +import "./PKPasses"; +import "./scratch"; +import "./setBarcodes"; +import "./setExpirationDate"; diff --git a/examples/localize.ts b/examples/self-hosted/src/localize.ts similarity index 89% rename from examples/localize.ts rename to examples/self-hosted/src/localize.ts index e18033b..5d18947 100644 --- a/examples/localize.ts +++ b/examples/self-hosted/src/localize.ts @@ -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, diff --git a/examples/scratch.ts b/examples/self-hosted/src/scratch.ts similarity index 90% rename from examples/scratch.ts rename to examples/self-hosted/src/scratch.ts index f6396dc..c4d0745 100644 --- a/examples/scratch.ts +++ b/examples/self-hosted/src/scratch.ts @@ -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(), ]); diff --git a/examples/setBarcodes.ts b/examples/self-hosted/src/setBarcodes.ts similarity index 90% rename from examples/setBarcodes.ts rename to examples/self-hosted/src/setBarcodes.ts index d7292ef..a184df0 100644 --- a/examples/setBarcodes.ts +++ b/examples/self-hosted/src/setBarcodes.ts @@ -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, diff --git a/examples/setExpirationDate.ts b/examples/self-hosted/src/setExpirationDate.ts similarity index 89% rename from examples/setExpirationDate.ts rename to examples/self-hosted/src/setExpirationDate.ts index a981507..26b530b 100644 --- a/examples/setExpirationDate.ts +++ b/examples/self-hosted/src/setExpirationDate.ts @@ -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( "Generate a voided pass.
Generate a pass with expiration date", @@ -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, diff --git a/examples/self-hosted/src/shared.ts b/examples/self-hosted/src/shared.ts new file mode 100644 index 0000000..274aa32 --- /dev/null +++ b/examples/self-hosted/src/shared.ts @@ -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 { + 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; +} diff --git a/examples/self-hosted/src/webserver.ts b/examples/self-hosted/src/webserver.ts new file mode 100644 index 0000000..4ba0e9c --- /dev/null +++ b/examples/self-hosted/src/webserver.ts @@ -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."); +}); diff --git a/examples/tsconfig.json b/examples/self-hosted/tsconfig.json similarity index 59% rename from examples/tsconfig.json rename to examples/self-hosted/tsconfig.json index 8249de9..c0f1d66 100644 --- a/examples/tsconfig.json +++ b/examples/self-hosted/tsconfig.json @@ -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"] } diff --git a/examples/webserver.ts b/examples/webserver.ts deleted file mode 100644 index 30fd9bf..0000000 --- a/examples/webserver.ts +++ /dev/null @@ -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.
Usage: /gen/modelName", - ); -}); - -export default app.route("/gen/:modelName"); -const certificatesCache: Partial<{ - signerCert: Buffer; - signerKey: Buffer; - wwdr: Buffer; - signerKeyPassphrase: string; -}> = {}; - -export async function getCertificates(): Promise { - 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; -} diff --git a/package.json b/package.json index c748e04..892d480 100644 --- a/package.json +++ b/package.json @@ -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",