From 42e6243ebf8717beb2a186bb040463ceb78bc17a Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Thu, 3 Aug 2023 12:43:49 +0200 Subject: [PATCH] Attempt to expose e.g. `pdfjsLib` globally regardless of how the library is imported (issue 16778) We obviously don't want to re-introduce any `require` usage in e.g. the viewer, since we should strive to only use native `import` statements wherever possible.[1] Hopefully exposing e.g. the library globally in more cases won't break anything, however it's somewhat difficult for me to imagine all the ways in which third-party users may be accessing the PDF.js library. (Given the lack of a runnable test-case in the issue, I also cannot guarantee that this is enough to fully address the problem.) --- [1] Ideally we should probably not rely on e.g. `pdfjsLib` being globally available in the *built* viewer, and rather always `import` the library instead. Unfortunately this would require larger (possibly breaking) changes in the builds that we provide, however note that Firefox only recently got support for `import` in workers and that Webpack still only have *experimental* support for outputting "proper" modules. --- gulpfile.mjs | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/gulpfile.mjs b/gulpfile.mjs index 11243be01..67f9f9831 100644 --- a/gulpfile.mjs +++ b/gulpfile.mjs @@ -398,12 +398,28 @@ function replaceNonWebpackImport() { return replace("__non_webpack_import__", "import"); } -function replaceJSRootName(amdName, jsName) { - // Saving old-style JS module name. - return replace( - 'root["' + amdName + '"] = factory()', - 'root["' + amdName + '"] = root.' + jsName + " = factory()" - ); +function addGlobalExports(amdName, jsName) { + const replacer = [ + `module\\.exports = factory\\(\\);`, + `define\\("${amdName}", \\[\\], factory\\);`, + `exports\\["${amdName}"\\] = factory\\(\\);`, + `root\\["${amdName}"\\] = factory\\(\\);`, + ]; + const regex = new RegExp(`(${replacer.join("|")})`, "gm"); + + return replace(regex, match => { + switch (match) { + case `module.exports = factory();`: + return `module.exports = root.${jsName} = factory();`; + case `define("${amdName}", [], factory);`: + return `define("${amdName}", [], () => { return (root.${jsName} = factory()); });`; + case `exports["${amdName}"] = factory();`: + return `exports["${amdName}"] = root.${jsName} = factory();`; + case `root["${amdName}"] = factory();`: + return `root["${amdName}"] = root.${jsName} = factory();`; + } + return match; + }); } function createMainBundle(defines) { @@ -421,7 +437,7 @@ function createMainBundle(defines) { .pipe(webpack2Stream(mainFileConfig)) .pipe(replaceWebpackRequire()) .pipe(replaceNonWebpackImport()) - .pipe(replaceJSRootName(mainAMDName, "pdfjsLib")); + .pipe(addGlobalExports(mainAMDName, "pdfjsLib")); } function createScriptingBundle(defines, extraOptions = undefined) { @@ -443,12 +459,7 @@ function createScriptingBundle(defines, extraOptions = undefined) { .pipe(webpack2Stream(scriptingFileConfig)) .pipe(replaceWebpackRequire()) .pipe(replaceNonWebpackImport()) - .pipe( - replace( - 'root["' + scriptingAMDName + '"] = factory()', - "root.pdfjsScripting = factory()" - ) - ); + .pipe(addGlobalExports(scriptingAMDName, "pdfjsScripting")); } function createSandboxExternal(defines) { @@ -504,7 +515,7 @@ function createSandboxBundle(defines, extraOptions = undefined) { .pipe(webpack2Stream(sandboxFileConfig)) .pipe(replaceWebpackRequire()) .pipe(replaceNonWebpackImport()) - .pipe(replaceJSRootName(sandboxAMDName, "pdfjsSandbox")); + .pipe(addGlobalExports(sandboxAMDName, "pdfjsSandbox")); } function createWorkerBundle(defines) { @@ -522,7 +533,7 @@ function createWorkerBundle(defines) { .pipe(webpack2Stream(workerFileConfig)) .pipe(replaceWebpackRequire()) .pipe(replaceNonWebpackImport()) - .pipe(replaceJSRootName(workerAMDName, "pdfjsWorker")); + .pipe(addGlobalExports(workerAMDName, "pdfjsWorker")); } function createWebBundle(defines, options) { @@ -577,7 +588,7 @@ function createComponentsBundle(defines) { .pipe(webpack2Stream(componentsFileConfig)) .pipe(replaceWebpackRequire()) .pipe(replaceNonWebpackImport()) - .pipe(replaceJSRootName(componentsAMDName, "pdfjsViewer")); + .pipe(addGlobalExports(componentsAMDName, "pdfjsViewer")); } function createImageDecodersBundle(defines) { @@ -595,7 +606,7 @@ function createImageDecodersBundle(defines) { .pipe(webpack2Stream(componentsFileConfig)) .pipe(replaceWebpackRequire()) .pipe(replaceNonWebpackImport()) - .pipe(replaceJSRootName(imageDecodersAMDName, "pdfjsImageDecoders")); + .pipe(addGlobalExports(imageDecodersAMDName, "pdfjsImageDecoders")); } function createCMapBundle() {