From 9624505f0fa884c2f53b41b2c03864098421a9c1 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 30 Sep 2023 11:56:27 +0200 Subject: [PATCH] Use a standard `export` statement in the `web/pdfjs.js` file This removes the only remaining old and non-standard handling of exports in the `web/`-folder, since some initial attempts at outputting JavaScript modules in the builds have identified this file as a potential problem. While this uses a hard-coded list, for overall simplicity, I don't believe that that's a big problem since: - Generating this file automatically would require a bunch more parsing *every single time* that the library is built. - The official API-surface doesn't change often enough for this to really impede development in any significant way. - The added unit-test helps ensure that this list cannot accidentally become outdated. --- test/unit/pdf_spec.js | 112 +++++++++++++++++++++++++----------------- web/pdfjs.js | 95 +++++++++++++++++++++++++++++++++-- 2 files changed, 158 insertions(+), 49 deletions(-) diff --git a/test/unit/pdf_spec.js b/test/unit/pdf_spec.js index f4668cf6f..c2f20eeb4 100644 --- a/test/unit/pdf_spec.js +++ b/test/unit/pdf_spec.js @@ -23,6 +23,7 @@ import { FeatureTest, ImageKind, InvalidPDFException, + isNodeJS, MissingPDFException, normalizeUnicode, OPS, @@ -66,6 +67,53 @@ import { AnnotationLayer } from "../../src/display/annotation_layer.js"; import { GlobalWorkerOptions } from "../../src/display/worker_options.js"; import { XfaLayer } from "../../src/display/xfa_layer.js"; +const expectedAPI = Object.freeze({ + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + build, + CMapCompressionType, + createValidAbsoluteUrl, + DOMSVGFactory, + FeatureTest, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl, + getXfaPageViewport, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + loadScript, + MissingPDFException, + noContextMenu, + normalizeUnicode, + OPS, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + PromiseCapability, + RenderingCancelledException, + renderTextLayer, + setLayerDimensions, + shadow, + SVGGraphics, + UnexpectedResponseException, + updateTextLayer, + Util, + VerbosityLevel, + version, + XfaLayer, +}); + describe("pdfjs_api", function () { it("checks that the *official* PDF.js API exposes the expected functionality", async function () { // eslint-disable-next-line no-unsanitized/method @@ -77,51 +125,23 @@ describe("pdfjs_api", function () { // The imported Object contains an (automatically) inserted Symbol, // hence we copy the data to allow using a simple comparison below. - expect({ ...pdfjsAPI }).toEqual({ - AbortException, - AnnotationEditorLayer, - AnnotationEditorParamsType, - AnnotationEditorType, - AnnotationEditorUIManager, - AnnotationLayer, - AnnotationMode, - build, - CMapCompressionType, - createValidAbsoluteUrl, - DOMSVGFactory, - FeatureTest, - getDocument, - getFilenameFromUrl, - getPdfFilenameFromUrl, - getXfaPageViewport, - GlobalWorkerOptions, - ImageKind, - InvalidPDFException, - isDataScheme, - isPdfFile, - loadScript, - MissingPDFException, - noContextMenu, - normalizeUnicode, - OPS, - PasswordResponses, - PDFDataRangeTransport, - PDFDateString, - PDFWorker, - PermissionFlag, - PixelsPerInch, - PromiseCapability, - RenderingCancelledException, - renderTextLayer, - setLayerDimensions, - shadow, - SVGGraphics, - UnexpectedResponseException, - updateTextLayer, - Util, - VerbosityLevel, - version, - XfaLayer, - }); + expect({ ...pdfjsAPI }).toEqual(expectedAPI); + }); +}); + +describe("web_pdfjsLib", function () { + it("checks that the viewer re-exports the expected API functionality", async function () { + if (isNodeJS) { + pending("loadScript is not supported in Node.js."); + } + await loadScript( + "../../build/generic/build/pdf.js", + /* removeScriptElement = */ true + ); + const webPdfjsLib = await import("../../web/pdfjs.js"); + + expect(Object.keys(webPdfjsLib).sort()).toEqual( + Object.keys(expectedAPI).sort() + ); }); }); diff --git a/web/pdfjs.js b/web/pdfjs.js index f119f2ef4..489cd0901 100644 --- a/web/pdfjs.js +++ b/web/pdfjs.js @@ -12,8 +12,97 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals module */ -"use strict"; +const { + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + build, + CMapCompressionType, + createValidAbsoluteUrl, + DOMSVGFactory, + FeatureTest, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl, + getXfaPageViewport, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + loadScript, + MissingPDFException, + noContextMenu, + normalizeUnicode, + OPS, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + PromiseCapability, + RenderingCancelledException, + renderTextLayer, + setLayerDimensions, + shadow, + SVGGraphics, + UnexpectedResponseException, + updateTextLayer, + Util, + VerbosityLevel, + version, + XfaLayer, +} = globalThis.pdfjsLib; -module.exports = globalThis.pdfjsLib; +export { + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + build, + CMapCompressionType, + createValidAbsoluteUrl, + DOMSVGFactory, + FeatureTest, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl, + getXfaPageViewport, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + loadScript, + MissingPDFException, + noContextMenu, + normalizeUnicode, + OPS, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + PromiseCapability, + RenderingCancelledException, + renderTextLayer, + setLayerDimensions, + shadow, + SVGGraphics, + UnexpectedResponseException, + updateTextLayer, + Util, + VerbosityLevel, + version, + XfaLayer, +};