Skip to content

Commit

Permalink
fix: worklet detection in production mode
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait committed Jan 23, 2024
2 parents 2d6f5fa + 644cd47 commit f857674
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/dependencies/CommonJsImportsParserPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class CommonJsImportsParserPlugin {

//#region metadata
/**
* @param {TODO} expression expression
* @param {string} expression expression
* @param {() => string[]} getMembers get members
*/
const tapRequireExpression = (expression, getMembers) => {
Expand Down
6 changes: 6 additions & 0 deletions lib/dependencies/WorkerPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@ class WorkerPlugin {
const pattern = item.slice(1, firstDot);
const itemMembers = item.slice(firstDot + 1, -2);

parser.hooks.preDeclarator.tap(PLUGIN_NAME, (decl, statement) => {
if (decl.id.type === "Identifier" && decl.id.name === pattern) {
parser.tagVariable(decl.id.name, WorkerSpecifierTag);
return true;
}
});
parser.hooks.pattern.for(pattern).tap(PLUGIN_NAME, pattern => {
parser.tagVariable(pattern.name, WorkerSpecifierTag);
return true;
Expand Down
24 changes: 24 additions & 0 deletions test/configCases/worker/issue-17489/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
let audioContext = null;

it("should allow to create a paintWorklet worklet", async () => {
if (audioContext === null) {
audioContext = new AudioContext();
}

let pseudoWorklet = await audioContext.audioWorklet.addModule(new URL("./worklet.js", import.meta.url));

pseudoWorklet = new pseudoWorklet();

expect(pseudoWorklet.url).not.toContain("asset-");

pseudoWorklet.postMessage("ok");

const result = await new Promise(resolve => {
pseudoWorklet.onmessage = event => {
resolve(event.data);
};
});
expect(result).toBe("data: OK, thanks");

await pseudoWorklet.terminate();
})
3 changes: 3 additions & 0 deletions test/configCases/worker/issue-17489/module.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function upper(str) {
return str.toUpperCase();
}
22 changes: 22 additions & 0 deletions test/configCases/worker/issue-17489/test.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
let outputDirectory;

module.exports = {
moduleScope(scope) {
const FakeWorker = require("../../../helpers/createFakeWorker")({
outputDirectory
});

// Pseudo code
scope.AudioContext = class AudioContext {
constructor() {
this.audioWorklet = {
addModule: url => Promise.resolve(FakeWorker.bind(null, url))
};
}
};
},
findBundle: function (i, options) {
outputDirectory = options.output.path;
return ["main.js"];
}
};
5 changes: 5 additions & 0 deletions test/configCases/worker/issue-17489/test.filter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
var supportsWorker = require("../../../helpers/supportsWorker");

module.exports = function (config) {
return supportsWorker();
};
20 changes: 20 additions & 0 deletions test/configCases/worker/issue-17489/webpack.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/** @type {import("../../../../").Configuration} */
module.exports = {
output: {
filename: "[name].js"
},
optimization: {
innerGraph: true
},
target: "web",
module: {
rules: [
{
test: /\.[cm]?js$/,
parser: {
worker: ["*audioContext.audioWorklet.addModule()", "..."]
}
}
]
}
};
4 changes: 4 additions & 0 deletions test/configCases/worker/issue-17489/worklet.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
onmessage = async event => {
const { upper } = await import("./module");
postMessage(`data: ${upper(event.data)}, thanks`);
};

0 comments on commit f857674

Please sign in to comment.