From 3e1cb525b6d7dbac40492798848bf93ae86ea295 Mon Sep 17 00:00:00 2001 From: Tan Kian-ting Date: Sun, 28 Apr 2024 20:35:22 +0800 Subject: [PATCH] migrate from pdflib to pdfkit in JS --- package-lock.json | 1339 ++++++++++++++++++++++++++++++++++++++++++--- package.json | 4 +- src/index.js | 126 ++--- src/index.ts | 110 ++-- text.lisp.2.pdf | Bin 0 -> 58041 bytes text.lisp.pdf | Bin 4464 -> 0 bytes 6 files changed, 1387 insertions(+), 192 deletions(-) create mode 100644 text.lisp.2.pdf delete mode 100644 text.lisp.pdf diff --git a/package-lock.json b/package-lock.json index 2331242..71b264b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,13 +13,13 @@ "fontkit": "^2.0.2", "harfbuzzjs": "^0.3.5", "memfs": "^4.8.2", - "pdf-fontkit": "^1.8.9", - "pdf-lib": "^1.17.1", + "pdfkit": "^0.15.0", "typescript-parsec": "^0.3.4" }, "devDependencies": { "@types/fontkit": "^2.0.7", "@types/node": "^20.11.30", + "@types/pdfkit": "^0.13.4", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "typescript": "^5.4.3" @@ -172,22 +172,6 @@ "pako": "^1.0.6" } }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "dependencies": { - "pako": "^1.0.10" - } - }, "node_modules/@swc/helpers": { "version": "0.4.36", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", @@ -226,6 +210,15 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/pdfkit": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.13.4.tgz", + "integrity": "sha512-ixGNDHYJCCKuamY305wbfYSphZ2WPe8FPkjn8oF4fHV+PgPV4V+hecPh2VOS2h4RNtpSB3zQcR4sCpNvvrEb1A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -526,6 +519,21 @@ "dev": true, "peer": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -535,6 +543,20 @@ "node": ">=8" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -591,6 +613,24 @@ "base64-js": "^1.1.2" } }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "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.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -668,6 +708,11 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -685,6 +730,37 @@ } } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -692,6 +768,38 @@ "dev": true, "peer": true }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dfa": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", @@ -722,6 +830,44 @@ "node": ">=6.0.0" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1020,6 +1166,14 @@ "unicode-trie": "^2.0.0" } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1027,6 +1181,40 @@ "dev": true, "peer": true }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1097,6 +1285,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -1108,6 +1307,14 @@ "resolved": "https://registry.npmjs.org/harfbuzzjs/-/harfbuzzjs-0.3.5.tgz", "integrity": "sha512-SbNxmVAyhlUJTHdaxgK5S6Uqy4mXIu80Vl6KDn8d+ctPAF6W3DY2yehB4BwIC24I/Tk5HGLjaQkyny5gY0r41Q==" }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1118,6 +1325,64 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -1172,6 +1437,100 @@ "dev": true, "peer": true }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1193,6 +1552,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1202,6 +1572,20 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1212,6 +1596,105 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1219,6 +1702,11 @@ "dev": true, "peer": true }, + "node_modules/jpeg-exif": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz", + "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1291,6 +1779,23 @@ "node": ">= 0.8.0" } }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1393,6 +1898,54 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1510,25 +2063,52 @@ "node": ">=8" } }, - "node_modules/pdf-fontkit": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/pdf-fontkit/-/pdf-fontkit-1.8.9.tgz", - "integrity": "sha512-TTq+umfhlFjUuQYOq6dCKT/wLslCrX4zVr5gqrIvrGHfo+vJ3ETapZTb4YLOCErohX7pF+HxlXSZuiToSRhNmA==", + "node_modules/pdfkit": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.15.0.tgz", + "integrity": "sha512-Z0dx0sEPKLW2kbThS1SWZ0iSHlRPoFMpP+oSjNrtwRjsfGivwE+r6emyEFwQG/fx1Ri0AGUHmDcGOSMMlLLnSg==", "dependencies": { - "pako": "^1.0.6" + "crypto-js": "^4.2.0", + "fontkit": "^1.8.1", + "jpeg-exif": "^1.1.4", + "linebreak": "^1.0.2", + "png-js": "^1.0.0" } }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "node_modules/pdfkit/node_modules/@swc/helpers": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.3.17.tgz", + "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==", "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" + "tslib": "^2.4.0" + } + }, + "node_modules/pdfkit/node_modules/fontkit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.9.0.tgz", + "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==", + "dependencies": { + "@swc/helpers": "^0.3.13", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "deep-equal": "^2.0.5", + "dfa": "^1.2.0", + "restructure": "^2.0.1", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.3.1", + "unicode-trie": "^2.0.0" } }, + "node_modules/pdfkit/node_modules/restructure": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz", + "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==" + }, + "node_modules/pdfkit/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1541,6 +2121,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1581,6 +2174,23 @@ } ] }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1660,6 +2270,36 @@ "node": ">=10" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1683,6 +2323,23 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1692,6 +2349,17 @@ "node": ">=8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1767,11 +2435,6 @@ "typescript": ">=4.2.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -1871,6 +2534,56 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2006,22 +2719,6 @@ "pako": "^1.0.6" } }, - "@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "requires": { - "pako": "^1.0.6" - } - }, - "@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "requires": { - "pako": "^1.0.10" - } - }, "@swc/helpers": { "version": "0.4.36", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", @@ -2062,6 +2759,15 @@ "undici-types": "~5.26.4" } }, + "@types/pdfkit": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.13.4.tgz", + "integrity": "sha512-ixGNDHYJCCKuamY305wbfYSphZ2WPe8FPkjn8oF4fHV+PgPV4V+hecPh2VOS2h4RNtpSB3zQcR4sCpNvvrEb1A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -2248,12 +2954,29 @@ "dev": true, "peer": true }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2293,6 +3016,18 @@ "base64-js": "^1.1.2" } }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "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.1" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2352,6 +3087,11 @@ "which": "^2.0.1" } }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2361,6 +3101,31 @@ "ms": "2.1.2" } }, + "deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2368,6 +3133,26 @@ "dev": true, "peer": true }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "dfa": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", @@ -2392,6 +3177,35 @@ "esutils": "^2.0.2" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2626,6 +3440,14 @@ "unicode-trie": "^2.0.0" } }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2633,6 +3455,28 @@ "dev": true, "peer": true }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2682,6 +3526,14 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2693,6 +3545,11 @@ "resolved": "https://registry.npmjs.org/harfbuzzjs/-/harfbuzzjs-0.3.5.tgz", "integrity": "sha512-SbNxmVAyhlUJTHdaxgK5S6Uqy4mXIu80Vl6KDn8d+ctPAF6W3DY2yehB4BwIC24I/Tk5HGLjaQkyny5gY0r41Q==" }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2700,6 +3557,40 @@ "dev": true, "peer": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2742,6 +3633,64 @@ "dev": true, "peer": true }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2757,12 +3706,25 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -2770,6 +3732,63 @@ "dev": true, "peer": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "requires": { + "call-bind": "^1.0.7" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2777,6 +3796,11 @@ "dev": true, "peer": true }, + "jpeg-exif": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz", + "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==" + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2844,6 +3868,22 @@ "type-check": "~0.4.0" } }, + "linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "requires": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==" + } + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2923,6 +3963,36 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3010,23 +4080,52 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pdf-fontkit": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/pdf-fontkit/-/pdf-fontkit-1.8.9.tgz", - "integrity": "sha512-TTq+umfhlFjUuQYOq6dCKT/wLslCrX4zVr5gqrIvrGHfo+vJ3ETapZTb4YLOCErohX7pF+HxlXSZuiToSRhNmA==", - "requires": { - "pako": "^1.0.6" - } - }, - "pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "pdfkit": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.15.0.tgz", + "integrity": "sha512-Z0dx0sEPKLW2kbThS1SWZ0iSHlRPoFMpP+oSjNrtwRjsfGivwE+r6emyEFwQG/fx1Ri0AGUHmDcGOSMMlLLnSg==", "requires": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" + "crypto-js": "^4.2.0", + "fontkit": "^1.8.1", + "jpeg-exif": "^1.1.4", + "linebreak": "^1.0.2", + "png-js": "^1.0.0" + }, + "dependencies": { + "@swc/helpers": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.3.17.tgz", + "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==", + "requires": { + "tslib": "^2.4.0" + } + }, + "fontkit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.9.0.tgz", + "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==", + "requires": { + "@swc/helpers": "^0.3.13", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "deep-equal": "^2.0.5", + "dfa": "^1.2.0", + "restructure": "^2.0.1", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.3.1", + "unicode-trie": "^2.0.0" + } + }, + "restructure": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz", + "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==" + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } } }, "picomatch": { @@ -3035,6 +4134,16 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3055,6 +4164,17 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3101,6 +4221,30 @@ "lru-cache": "^6.0.0" } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "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" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3118,12 +4262,31 @@ "dev": true, "peer": true }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3179,11 +4342,6 @@ "dev": true, "requires": {} }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3263,6 +4421,41 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 6651bb3..3c08799 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,13 @@ "fontkit": "^2.0.2", "harfbuzzjs": "^0.3.5", "memfs": "^4.8.2", - "pdf-fontkit": "^1.8.9", - "pdf-lib": "^1.17.1", + "pdfkit": "^0.15.0", "typescript-parsec": "^0.3.4" }, "devDependencies": { "@types/fontkit": "^2.0.7", "@types/node": "^20.11.30", + "@types/pdfkit": "^0.13.4", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "typescript": "^5.4.3" diff --git a/src/index.js b/src/index.js index 9102311..d172d95 100644 --- a/src/index.js +++ b/src/index.js @@ -23,14 +23,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs")); -const pdf_lib_1 = require("pdf-lib"); -const pdf_fontkit_1 = __importDefault(require("pdf-fontkit")); // for pdflib usage -const memfs_1 = require("memfs"); +// import { PDFDocument , RGB, rgb, StandardFonts} from 'pdf-lib'; +const pdfkit_1 = __importDefault(require("pdfkit")); const typescript_parsec_1 = require("typescript-parsec"); const typescript_parsec_2 = require("typescript-parsec"); /** input lisp file */ const filename = "./text.lisp"; -let pdfDoc; +let pdfDocu; var TokenKind; (function (TokenKind) { TokenKind[TokenKind["Id"] = 0] = "Id"; @@ -172,7 +171,7 @@ async function measureWidthPx(inputString, fontFamily, fontSizePt) { var hb = require('harfbuzzjs/hbjs'); hb = hb(wsm.instance); let fontName = (0, child_process_1.spawnSync)('fc-match', ['--format=%{file}', fontFamily]); - let fontPath = fontName.stdout.toString(); + const fontPath = fontName.stdout.toString(); let fontdata = fs.readFileSync(fontPath); var blob = hb.createBlob(fontdata); // Load the font data into something Harfbuzz can use var face = hb.createFace(blob, 0); // Select the first font in the file (there's normally only one!) @@ -402,46 +401,26 @@ function cons(h, t) { return rtnList; } /* PDF manipulation */ -async function drawText(pageIndex, fontFamily, textSize, color, x, y, text) { - let pdfPages = pdfDoc.getPages(); - let currentPage = pdfPages[pageIndex]; - const fcMatch = await (0, child_process_1.spawnSync)('fc-match', ['--format=%{file}', fontFamily]); - const path = fcMatch.stdout.toString(); - pdfDoc.registerFontkit(pdf_fontkit_1.default); - let fontBytes; - // workaround for ttc - if (path.match(/[.]ttc$/)) { - let tmpfs = (0, memfs_1.memfs)(); - let psName = await (0, child_process_1.spawnSync)('fc-match', ['--format=%{postscriptname}', - fontFamily]) - .stdout.toString(); - console.log("===", psName); - let buffer = await fs.readFileSync("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"); - let coll = pdf_fontkit_1.default.create(buffer, "NotoSansCJKtc-Regular"); - //let collection = await (fontkitOrig.openSync(path, psName)); - fontBytes = coll; - // fs.writeFileSync("/tmp/a.ttf", fontBytes); - } - else { - fontBytes = fs.readFileSync(path); - } - const customFont = await pdfDoc.embedFont(fontBytes.stream.buffer, { subset: true }); - const rgbColor = await hexColorToRGB(color); - let _ = await currentPage.drawText(text, { - x: x, - y: y, - size: textSize, - font: customFont, - color: rgbColor, - }); -} -async function hexColorToRGB(hex) { - let rgbHex = /[#]?([\dA-Fa-f]{2})([\dA-Fa-f]{2})([\dA-Fa-f]{2})/.exec(hex); - let r = parseInt(rgbHex[1], 16) / 255.0; - let g = parseInt(rgbHex[2], 16) / 255.0; - let b = parseInt(rgbHex[3], 16) / 255.0; - return (0, pdf_lib_1.rgb)(r, g, b); -} +async function drawText(pdfDocu, fontFamily, textSize, color, x, y, text) { + const fcMatchPath = await (0, child_process_1.spawnSync)('fc-match', ['--format=%{file}', fontFamily]); + const path = fcMatchPath.stdout.toString(); + const fcMatchPSName = await (0, child_process_1.spawnSync)('fc-match', ['--format=%{postscriptname}', fontFamily]); + const postScriptName = fcMatchPSName.stdout.toString(); + await console.log(path, " ", postScriptName); + // const rgbColor = await hexColorToRGB(color); + pdfDocu + .fontSize(textSize) + .fillColor(color) + .font(path, postScriptName) + .text(text, x, y, { baseline: "alphabetic" }); +} +/*async function hexColorToRGB(hex: string): Promise{ + let rgbHex = /[#]?([\dA-Fa-f]{2})([\dA-Fa-f]{2})([\dA-Fa-f]{2})/.exec(hex); + let r = parseInt((rgbHex as RegExpExecArray)[1], 16)/255.0; + let g = parseInt((rgbHex as RegExpExecArray)[2], 16)/255.0; + let b = parseInt((rgbHex as RegExpExecArray)[3], 16)/255.0; + return rgb(r,g,b); +}*/ function listRef(l, i) { const realI = i.int; if (realI >= l.list.length || realI < 0) { @@ -479,7 +458,7 @@ function isItemId(x) { function isClosure(x) { return x.hasOwnProperty('type') && x.hasOwnProperty('vars'); } -async function interp(prog, env) { +async function interp(prog, env, pdfDocu) { if (Array.isArray(prog)) { if (!Array.isArray(prog[0])) { const op = prog[0]; @@ -518,7 +497,7 @@ async function interp(prog, env) { // define manipulation if (op.id === "define") { const vari = prog[1]; - const data = await interp(prog[2], env); + const data = await interp(prog[2], env, pdfDocu); if (prog.length !== 3) { throw invalidLengthException('define', 2); } @@ -564,7 +543,7 @@ async function interp(prog, env) { const vari = binding[0]; if (vari.hasOwnProperty("id")) { const variName = vari.id; - const data = await interp(binding[1], env); + const data = await interp(binding[1], env, pdfDocu); if (op.id === "letrec") { newEnv = extendEnv(newEnv, variName, true, data); } @@ -575,7 +554,7 @@ async function interp(prog, env) { } } const body = prog[2]; - return interp(body, newEnv); + return interp(body, newEnv, pdfDocu); } } // end of let @@ -584,7 +563,7 @@ async function interp(prog, env) { throw invalidLengthException('if', 3); } else { - const cond = await interp(prog[1], env); + const cond = await interp(prog[1], env, pdfDocu); if (Array.isArray(cond)) { throw new Error("cond can't be reduced to a constant"); } @@ -592,18 +571,18 @@ async function interp(prog, env) { throw new Error("type error of cond, not a bool"); } else if (cond.bool === true) { - return interp(prog[2], env); + return interp(prog[2], env, pdfDocu); // if cond is false } else { - return interp(prog[3], env); + return interp(prog[3], env, pdfDocu); } } } else { let argsMapped = []; for (var i = 1; i < prog.length; i++) { - argsMapped.push(await interp(prog[i], env)); + argsMapped.push(await interp(prog[i], env, pdfDocu)); } /* const argsMapped = await Promise.all( prog.slice(1).map(async (x) => { return interp(x, env); @@ -834,7 +813,7 @@ async function interp(prog, env) { // set manipulations else if (op.id === "set!") { const vari = prog[1]; - const replacer = await interp(prog[2], env); + const replacer = await interp(prog[2], env, pdfDocu); if (prog.length !== 3) { throw invalidLengthException('set!', 2); } @@ -856,7 +835,7 @@ async function interp(prog, env) { throw new Error("the arg of addPdfPage should be a empty string '()"); } else { - const page = pdfDoc.addPage(); + const _ = pdfDocu.addPage(); return { type: ItemType.Unit, }; @@ -873,7 +852,7 @@ async function interp(prog, env) { const x = argsMapped[3].flo; const y = argsMapped[4].flo; const text = argsMapped[5].str; - drawText(pdfDoc.getPageCount() - 1, fontFamily, textSize, color, x, y, text); + await drawText(pdfDocu, fontFamily, textSize, color, x, y, text); return { type: ItemType.Unit, }; @@ -906,7 +885,7 @@ async function interp(prog, env) { } // other named function call else { - const caller = await interp(prog[0], env); + const caller = await interp(prog[0], env, pdfDocu); const varArgs = caller.vars; const varArgLen = varArgs.length; const argsMappedLen = argsMapped.length; @@ -933,7 +912,7 @@ async function interp(prog, env) { } newEnv = extendEnv(newEnv, varArgs[i].id, varArgIsRec, argsMapped[i]); } - return interp(fuBody, newEnv); + return interp(fuBody, newEnv, pdfDocu); } } } @@ -946,9 +925,9 @@ async function interp(prog, env) { } else { const argsMapped = await Promise.all(prog.slice(1).map((x) => { - return interp(x, env); + return interp(x, env, pdfDocu); })); - const caller = await interp(prog[0], env); + const caller = await interp(prog[0], env, pdfDocu); const varArgs = caller.vars; const varArgLen = varArgs.length; const argsMappedLen = argsMapped.length; @@ -967,7 +946,7 @@ async function interp(prog, env) { } newEnv = extendEnv(newEnv, varArgs[i].id, varArgIsRec, argsMapped[i]); } - return interp(fuBody, newEnv); + return interp(fuBody, newEnv, pdfDocu); } } } @@ -997,9 +976,9 @@ async function interp(prog, env) { } } } -async function evaluate(expr) { +async function evaluate(expr, pdfDocu) { const input = (0, typescript_parsec_1.expectSingleResult)((0, typescript_parsec_1.expectEOF)(LISP.parse(tokenizer.parse(expr)))); - const interped = await interp(input, emptyEnv); + const interped = await interp(input, emptyEnv, pdfDocu); return astToString(interped); } // evaluate(`(main '((text 12)) [ 快狐跳懶狗\\\\\\\[\\\]\\\(\\\)(italic "fox and dog") (bold [OK])])`) @@ -1013,11 +992,22 @@ const rl = readline.createInterface({ output: process.stdout, }); async function run() { - pdfDoc = await pdf_lib_1.PDFDocument.create(); + pdfDocu = new pdfkit_1.default(); const prog = fs.readFileSync(filename, { encoding: 'utf8' }); - console.log(await evaluate(prog)); - const pdfBytes = await pdfDoc.save(); - fs.writeFileSync(filename + '.pdf', pdfBytes, 'binary'); - (0, node_process_1.exit)(0); + // workaround for pdf saving and exit + let writeStream = fs.createWriteStream(filename + '.2.pdf'); + writeStream.on('finish', async () => { + (0, node_process_1.exit)(); + }); + // end of workaround + pdfDocu.pipe(writeStream); + console.log(await evaluate(prog, pdfDocu)); + pdfDocu.addPage(); + pdfDocu.text('Hello world!', 100, 100); + pdfDocu.fontSize(12) + .fillColor("#00bbcc") + .font("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", "NotoSansCJKtc-Regular") + .text("你好", 3, 3); + pdfDocu.end(); } run(); diff --git a/src/index.ts b/src/index.ts index cfb1c1d..93ae484 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ import * as fs from 'fs'; -import { PDFDocument , RGB, rgb, StandardFonts} from 'pdf-lib'; -import fontkit from '@pdf-lib/fontkit'; +// import { PDFDocument , RGB, rgb, StandardFonts} from 'pdf-lib'; +import PDFDocument from 'pdfkit'; import { Token } from "typescript-parsec"; import { buildLexer, @@ -25,7 +25,7 @@ import {inspect} from "node:util"; /** input lisp file */ const filename = "./text.lisp"; -let pdfDoc : PDFDocument; +let pdfDocu: PDFKit.PDFDocument; enum TokenKind { Id, @@ -517,44 +517,40 @@ function cons(h: AST, t : List) : List { } /* PDF manipulation */ -async function drawText(pageIndex : number, +async function drawText( + pdfDocu: PDFKit.PDFDocument, fontFamily : string, textSize : number, color : string, x : number, y : number, text : string){ - let pdfPages = pdfDoc.getPages(); - let currentPage = pdfPages[pageIndex]; -const fcMatch = await spawnSync('fc-match', ['--format=%{file}', fontFamily]); -const path = fcMatch.stdout.toString(); - pdfDoc.registerFontkit(fontkit); - const fontBytes = fs.readFileSync(path); - const customFont = await pdfDoc.embedFont(fontBytes); +const fcMatchPath = await spawnSync('fc-match', ['--format=%{file}', fontFamily]); +const path = fcMatchPath.stdout.toString(); +const fcMatchPSName = await spawnSync('fc-match', ['--format=%{postscriptname}', fontFamily]); +const postScriptName = fcMatchPSName.stdout.toString(); - const rgbColor = await hexColorToRGB(color); +await console.log(path, " ", postScriptName); + // const rgbColor = await hexColorToRGB(color); + + pdfDocu + .fontSize(textSize) + .fillColor(color) + .font(path, postScriptName) + .text(text, x, y,{baseline: "alphabetic"}); - let _ = await currentPage.drawText(text, { - x: x, - y: y, - size: textSize, - font: customFont, - color: rgbColor, - }); - - } -async function hexColorToRGB(hex: string): Promise{ +/*async function hexColorToRGB(hex: string): Promise{ let rgbHex = /[#]?([\dA-Fa-f]{2})([\dA-Fa-f]{2})([\dA-Fa-f]{2})/.exec(hex); let r = parseInt((rgbHex as RegExpExecArray)[1], 16)/255.0; let g = parseInt((rgbHex as RegExpExecArray)[2], 16)/255.0; let b = parseInt((rgbHex as RegExpExecArray)[3], 16)/255.0; return rgb(r,g,b); -} +}*/ function listRef(l: List, i: ItemInt): AST { const realI = i.int; @@ -600,7 +596,8 @@ function isClosure(x: any): x is Closure { return x.hasOwnProperty('type') && x.hasOwnProperty('vars'); } -async function interp(prog: AST, env: Env): Promise { +async function interp(prog: AST, env: Env, + pdfDocu: PDFKit.PDFDocument): Promise { if (Array.isArray(prog)) { if (!Array.isArray(prog[0])) { const op = prog[0]; @@ -638,7 +635,7 @@ async function interp(prog: AST, env: Env): Promise { // define manipulation if (op.id === "define") { const vari : ItemId = prog[1] as ItemId; - const data = await interp(prog[2], env); + const data = await interp(prog[2], env, pdfDocu); if (prog.length !== 3){ throw invalidLengthException('define', 2); }else if (!isItem(vari) || !isItem(data)){ @@ -679,7 +676,7 @@ async function interp(prog: AST, env: Env): Promise { const vari = binding[0]; if (vari.hasOwnProperty("id")){ const variName = (vari as ItemId).id; - const data = await interp(binding[1], env); + const data = await interp(binding[1], env, pdfDocu); if (op.id === "letrec"){ newEnv = extendEnv(newEnv, variName , true, data); }else{ @@ -689,7 +686,7 @@ async function interp(prog: AST, env: Env): Promise { } } const body = prog[2]; - return interp(body, newEnv); + return interp(body, newEnv, pdfDocu); } } // end of let @@ -697,23 +694,23 @@ async function interp(prog: AST, env: Env): Promise { if (prog.length !== 4){ throw invalidLengthException('if', 3); }else{ - const cond = await interp(prog[1], env); + const cond = await interp(prog[1], env, pdfDocu); if (Array.isArray(cond)){ throw new Error("cond can't be reduced to a constant"); }else if (cond.type !== ItemType.Bool){ throw new Error("type error of cond, not a bool"); }else if (cond.bool === true){ - return interp(prog[2], env); + return interp(prog[2], env, pdfDocu); // if cond is false }else{ - return interp(prog[3], env); + return interp(prog[3], env, pdfDocu); } } } else{ let argsMapped = []; for (var i=1;i { // set manipulations else if (op.id === "set!") { const vari : ItemId = prog[1] as ItemId; - const replacer = await interp(prog[2], env); + const replacer = await interp(prog[2], env, pdfDocu); if (prog.length !== 3){ throw invalidLengthException('set!', 2); }else if (!isItem(vari) || !isItem(replacer) @@ -931,7 +928,7 @@ async function interp(prog: AST, env: Env): Promise { }else if(astToString(argsMapped[0]) !== "'()"){ throw new Error("the arg of addPdfPage should be a empty string '()") }else{ - const page = pdfDoc.addPage(); + const _ = pdfDocu.addPage(); return { type:ItemType.Unit, } @@ -947,8 +944,8 @@ async function interp(prog: AST, env: Env): Promise { const x = (argsMapped[3] as ItemFlo).flo; const y = (argsMapped[4] as ItemFlo).flo; const text = (argsMapped[5] as ItemStr).str; - drawText( - pdfDoc.getPageCount()-1, + await drawText( + pdfDocu, fontFamily, textSize, color, @@ -988,7 +985,7 @@ async function interp(prog: AST, env: Env): Promise { // other named function call else { - const caller = await interp(prog[0],env); + const caller = await interp(prog[0],env, pdfDocu); const varArgs = ((caller as Closure).vars as ItemId[]); @@ -1020,7 +1017,7 @@ async function interp(prog: AST, env: Env): Promise { newEnv = extendEnv(newEnv, varArgs[i].id, varArgIsRec, argsMapped[i]); } - return interp(fuBody, newEnv); + return interp(fuBody, newEnv, pdfDocu); } }} @@ -1031,9 +1028,9 @@ async function interp(prog: AST, env: Env): Promise { // the caller which is a higher-function call } else { const argsMapped = await Promise.all(prog.slice(1).map((x) => { - return interp(x, env); + return interp(x, env, pdfDocu); })); - const caller = await interp(prog[0], env); + const caller = await interp(prog[0], env, pdfDocu); const varArgs = (caller as Closure).vars as ItemId[]; const varArgLen = varArgs.length; @@ -1058,7 +1055,7 @@ async function interp(prog: AST, env: Env): Promise { newEnv = extendEnv(newEnv, varArgs[i].id,varArgIsRec, argsMapped[i]); } - return interp(fuBody, newEnv); + return interp(fuBody, newEnv, pdfDocu); } } } else { @@ -1090,9 +1087,9 @@ async function interp(prog: AST, env: Env): Promise { } } -async function evaluate(expr: string): Promise { +async function evaluate(expr: string, pdfDocu: PDFKit.PDFDocument): Promise { const input = expectSingleResult(expectEOF(LISP.parse(tokenizer.parse(expr)))); - const interped = await interp(input, emptyEnv); + const interped = await interp(input, emptyEnv, pdfDocu); return astToString(interped); } @@ -1111,17 +1108,32 @@ const rl = readline.createInterface({ async function run(){ - pdfDoc = await PDFDocument.create(); - + pdfDocu = new PDFDocument(); + const prog = fs.readFileSync(filename, { encoding: 'utf8' }); - console.log(await evaluate(prog)); - + // workaround for pdf saving and exit + let writeStream = fs.createWriteStream(filename+'.pdf'); + writeStream.on('finish', async () => { + exit(); + }); + // end of workaround + + pdfDocu.pipe(writeStream); + + + console.log(await evaluate(prog, pdfDocu)); + pdfDocu.addPage(); + pdfDocu.text('Hello world!', 100, 100); + pdfDocu.fontSize(12) + .fillColor("#00bbcc") + .font("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", "NotoSansCJKtc-Regular") + .text("你好", 3, 3); + + pdfDocu.end(); - const pdfBytes = await pdfDoc.save(); - fs.writeFileSync(filename+'.pdf', pdfBytes, 'binary'); - exit(0); } + run(); \ No newline at end of file diff --git a/text.lisp.2.pdf b/text.lisp.2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9cf9c7bb02e024464378b4ba417082a4f40d5e1f GIT binary patch literal 58041 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