Add support for modern ECMAScript class features

With ESLint 8 we should now finally be able to start using modern `class` features, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Public_class_fields and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields

However, while both ESLint and Acorn now support this, it unfortunately turns out that Escodegen (which we use during building) still lack the necessary support. Looking at https://github.com/estools/escodegen there's not been any updates since last year, and there's also open PRs adding support for these new `class` features.

To avoid blocking usage of these `class` features in the PDF.js code-base, in particular *private* fields/methods, this patch thus proposes that we (hopefully temporarily) switch to an `escodegen` fork that has the necessary support; please see https://www.npmjs.com/package/@javascript-obfuscator/escodegen

While I have no reason to doubt the security of the `escodegen` fork, this patch nonetheless pins the version number. Furthermore, I've also diffed the output of the two `.js`-files in this forked package against the original files without finding anything that looks immediately "dangerous".
This commit is contained in:
Jonas Jenwald 2021-10-17 13:30:09 +02:00
parent 38e5360533
commit 00f8fab8a5
8 changed files with 35 additions and 35 deletions

View File

@ -1,6 +1,6 @@
{ {
"parserOptions": { "parserOptions": {
"ecmaVersion": 2021, "ecmaVersion": 2022,
"sourceType": "module", "sourceType": "module",
}, },

View File

@ -24,8 +24,8 @@ Feel free to stop by our [Matrix room](https://chat.mozilla.org/#/room/#pdfjs:mo
### Online demo ### Online demo
Please note that the "Modern browsers" version assumes native support for Please note that the "Modern browsers" version assumes native support for
features such as e.g. `async`/`await`, `ReadableStream`, optional chaining, and features such as e.g. `async`/`await`, `ReadableStream`, optional chaining,
nullish coalescing. nullish coalescing, and private `class` fields/methods.
+ Modern browsers: https://mozilla.github.io/pdf.js/web/viewer.html + Modern browsers: https://mozilla.github.io/pdf.js/web/viewer.html

View File

@ -1,14 +1,14 @@
"use strict"; "use strict";
const acorn = require("acorn"); const acorn = require("acorn");
const escodegen = require("escodegen"); const escodegen = require("@javascript-obfuscator/escodegen");
const vm = require("vm"); const vm = require("vm");
const fs = require("fs"); const fs = require("fs");
const path = require("path"); const path = require("path");
const PDFJS_PREPROCESSOR_NAME = "PDFJSDev"; const PDFJS_PREPROCESSOR_NAME = "PDFJSDev";
const ROOT_PREFIX = "$ROOT/"; const ROOT_PREFIX = "$ROOT/";
const ACORN_ECMA_VERSION = 2021; const ACORN_ECMA_VERSION = 2022;
function isLiteral(obj, value) { function isLiteral(obj, value) {
return obj.type === "Literal" && obj.value === value; return obj.type === "Literal" && obj.value === value;

View File

@ -8,7 +8,8 @@ This is a pre-built version of the PDF.js source code. It is automatically
generated by the build scripts. generated by the build scripts.
For usage with older browsers or environments, without support for modern For usage with older browsers or environments, without support for modern
features such as e.g. `async`/`await`, `ReadableStream`, optional chaining, and features such as e.g. `async`/`await`, `ReadableStream`, optional chaining,
nullish coalescing; please see the `legacy` folder. nullish coalescing, and private `class` fields/methods; please see the `legacy`
folder.
See https://github.com/mozilla/pdf.js for learning and contributing. See https://github.com/mozilla/pdf.js for learning and contributing.

View File

@ -1375,7 +1375,7 @@ gulp.task("jsdoc", function (done) {
gulp.task("types", function (done) { gulp.task("types", function (done) {
console.log("### Generating TypeScript definitions using `tsc`"); console.log("### Generating TypeScript definitions using `tsc`");
const args = [ const args = [
"target ES2020", "target ESNext",
"allowJS", "allowJS",
"declaration", "declaration",
`outDir ${TYPES_DIR}`, `outDir ${TYPES_DIR}`,

43
package-lock.json generated
View File

@ -1774,6 +1774,25 @@
"integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
"dev": true "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": { "@mapbox/node-pre-gyp": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz",
@ -4333,27 +4352,6 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true "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": { "eslint": {
"version": "8.0.1", "version": "8.0.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz",
@ -6576,7 +6574,8 @@
}, },
"yargs-parser": { "yargs-parser": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
"integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
"dev": true, "dev": true,
"requires": { "requires": {
"camelcase": "^3.0.0" "camelcase": "^3.0.0"

View File

@ -14,7 +14,7 @@
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"dommatrix": "^0.0.6", "dommatrix": "^0.0.6",
"es-module-shims": "^1.3.0", "es-module-shims": "^1.3.0",
"escodegen": "^2.0.0", "@javascript-obfuscator/escodegen": "2.2.2",
"eslint": "^8.0.1", "eslint": "^8.0.1",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-fetch-options": "^0.0.5", "eslint-plugin-fetch-options": "^0.0.5",

View File

@ -6,14 +6,14 @@
"moduleResolution": "node", "moduleResolution": "node",
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"target": "es5", "target": "ESNext",
"module": "es2015", "module": "ESNext",
"baseUrl": "./", "baseUrl": "./",
"strict": true, "strict": true,
"types": [], "types": [],
"lib": [ "lib": [
"es2017", "ESNext",
"dom" "DOM"
], ],
"paths": { "paths": {
"pdfjs-dist": ["../../build/typestest"], "pdfjs-dist": ["../../build/typestest"],