diff --git a/.eslintrc b/.eslintrc index d1744b65f..b81591cdb 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,6 +1,6 @@ { "parserOptions": { - "ecmaVersion": 2021, + "ecmaVersion": 2022, "sourceType": "module", }, diff --git a/README.md b/README.md index fcaeb91d7..cea47bd43 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ Feel free to stop by our [Matrix room](https://chat.mozilla.org/#/room/#pdfjs:mo ### Online demo Please note that the "Modern browsers" version assumes native support for -features such as e.g. `async`/`await`, `ReadableStream`, optional chaining, and -nullish coalescing. +features such as e.g. `async`/`await`, `ReadableStream`, optional chaining, +nullish coalescing, and private `class` fields/methods. + Modern browsers: https://mozilla.github.io/pdf.js/web/viewer.html diff --git a/external/builder/preprocessor2.js b/external/builder/preprocessor2.js index b918b1df2..8a0b46ec4 100644 --- a/external/builder/preprocessor2.js +++ b/external/builder/preprocessor2.js @@ -1,14 +1,14 @@ "use strict"; const acorn = require("acorn"); -const escodegen = require("escodegen"); +const escodegen = require("@javascript-obfuscator/escodegen"); const vm = require("vm"); const fs = require("fs"); const path = require("path"); const PDFJS_PREPROCESSOR_NAME = "PDFJSDev"; const ROOT_PREFIX = "$ROOT/"; -const ACORN_ECMA_VERSION = 2021; +const ACORN_ECMA_VERSION = 2022; function isLiteral(obj, value) { return obj.type === "Literal" && obj.value === value; diff --git a/external/dist/README.md b/external/dist/README.md index c812ab36e..3af42efd8 100644 --- a/external/dist/README.md +++ b/external/dist/README.md @@ -8,7 +8,8 @@ This is a pre-built version of the PDF.js source code. It is automatically generated by the build scripts. For usage with older browsers or environments, without support for modern -features such as e.g. `async`/`await`, `ReadableStream`, optional chaining, and -nullish coalescing; please see the `legacy` folder. +features such as e.g. `async`/`await`, `ReadableStream`, optional chaining, +nullish coalescing, and private `class` fields/methods; please see the `legacy` +folder. See https://github.com/mozilla/pdf.js for learning and contributing. diff --git a/gulpfile.js b/gulpfile.js index 186e99884..6f6311044 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1375,7 +1375,7 @@ gulp.task("jsdoc", function (done) { gulp.task("types", function (done) { console.log("### Generating TypeScript definitions using `tsc`"); const args = [ - "target ES2020", + "target ESNext", "allowJS", "declaration", `outDir ${TYPES_DIR}`, diff --git a/package-lock.json b/package-lock.json index f13ced802..9062262d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1774,6 +1774,25 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@javascript-obfuscator/escodegen": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.2.2.tgz", + "integrity": "sha512-0VoGJun/lpGEPv8J8R8fpwt1iAGyctUjHTQoYoCbKY2rcGc6d+NycrqSMo61vRXhZiTnHgud1UF8dOI7UAPdTw==", + "dev": true, + "requires": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "@javascript-obfuscator/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-SxIFtV5/wlXYS7G3zLVj7CddLolX8Bm/hr68fiyNL3MyG2k4FwF9B5Z5GTpVLhw2EELYNwyoYBvFlR4gGnQPdw==", + "dev": true + }, "@mapbox/node-pre-gyp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", @@ -4315,27 +4334,6 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, "eslint": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", diff --git a/package.json b/package.json index 8c6cc1bdf..fb55a5526 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "cross-env": "^7.0.3", "dommatrix": "^0.0.6", "es-module-shims": "^1.3.0", - "escodegen": "^2.0.0", + "@javascript-obfuscator/escodegen": "2.2.2", "eslint": "^8.0.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-fetch-options": "^0.0.5", diff --git a/src/display/metadata.js b/src/display/metadata.js index 48b1fdc7a..9c62bed94 100644 --- a/src/display/metadata.js +++ b/src/display/metadata.js @@ -16,25 +16,29 @@ import { objectFromMap } from "../shared/util.js"; class Metadata { + #metadataMap; + + #data; + constructor({ parsedData, rawData }) { - this._metadataMap = parsedData; - this._data = rawData; + this.#metadataMap = parsedData; + this.#data = rawData; } getRaw() { - return this._data; + return this.#data; } get(name) { - return this._metadataMap.get(name) ?? null; + return this.#metadataMap.get(name) ?? null; } getAll() { - return objectFromMap(this._metadataMap); + return objectFromMap(this.#metadataMap); } has(name) { - return this._metadataMap.has(name); + return this.#metadataMap.has(name); } } diff --git a/test/types/tsconfig.json b/test/types/tsconfig.json index 2cae7886b..532627c64 100644 --- a/test/types/tsconfig.json +++ b/test/types/tsconfig.json @@ -6,14 +6,14 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "target": "es5", - "module": "es2015", + "target": "ESNext", + "module": "ESNext", "baseUrl": "./", "strict": true, "types": [], "lib": [ - "es2017", - "dom" + "ESNext", + "DOM" ], "paths": { "pdfjs-dist": ["../../build/typestest"], diff --git a/web/pdf_thumbnail_view.js b/web/pdf_thumbnail_view.js index 4b43d26f1..0df790e90 100644 --- a/web/pdf_thumbnail_view.js +++ b/web/pdf_thumbnail_view.js @@ -36,48 +36,42 @@ const THUMBNAIL_WIDTH = 98; // px * @property {IL10n} l10n - Localization service. */ -const TempImageFactory = (function TempImageFactoryClosure() { - let tempCanvasCache = null; +class TempImageFactory { + static #tempCanvas = null; - return { - getCanvas(width, height) { - let tempCanvas = tempCanvasCache; - if (!tempCanvas) { - tempCanvas = document.createElement("canvas"); - tempCanvasCache = tempCanvas; - } - tempCanvas.width = width; - tempCanvas.height = height; + static getCanvas(width, height) { + const tempCanvas = (this.#tempCanvas ||= document.createElement("canvas")); + tempCanvas.width = width; + tempCanvas.height = height; - // Since this is a temporary canvas, we need to fill it with a white - // background ourselves. `_getPageDrawContext` uses CSS rules for this. - if ( - typeof PDFJSDev === "undefined" || - PDFJSDev.test("MOZCENTRAL || GENERIC") - ) { - tempCanvas.mozOpaque = true; - } + // Since this is a temporary canvas, we need to fill it with a white + // background ourselves. `_getPageDrawContext` uses CSS rules for this. + if ( + typeof PDFJSDev === "undefined" || + PDFJSDev.test("MOZCENTRAL || GENERIC") + ) { + tempCanvas.mozOpaque = true; + } - const ctx = tempCanvas.getContext("2d", { alpha: false }); - ctx.save(); - ctx.fillStyle = "rgb(255, 255, 255)"; - ctx.fillRect(0, 0, width, height); - ctx.restore(); - return [tempCanvas, tempCanvas.getContext("2d")]; - }, + const ctx = tempCanvas.getContext("2d", { alpha: false }); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return [tempCanvas, tempCanvas.getContext("2d")]; + } - destroyCanvas() { - const tempCanvas = tempCanvasCache; - if (tempCanvas) { - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - tempCanvas.width = 0; - tempCanvas.height = 0; - } - tempCanvasCache = null; - }, - }; -})(); + static destroyCanvas() { + const tempCanvas = this.#tempCanvas; + if (tempCanvas) { + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + tempCanvas.width = 0; + tempCanvas.height = 0; + } + this.#tempCanvas = null; + } +} /** * @implements {IRenderableView}