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.
This commit is contained in:
Jonas Jenwald 2023-08-03 12:43:49 +02:00
parent 2747928a54
commit 42e6243ebf

View File

@ -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() {