From 9111b4eaba019c2212f08d9178b45c22f3327f9e Mon Sep 17 00:00:00 2001 From: Anton Evzhakov Date: Tue, 18 Oct 2022 15:36:34 +0300 Subject: [PATCH] fix(babel): don't run async prepareForEval if target file is processing (fixes #1054) (#1086) --- .changeset/tasty-falcons-crash.md | 5 +++++ .../src/transform-stages/1-prepare-for-eval.ts | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .changeset/tasty-falcons-crash.md diff --git a/.changeset/tasty-falcons-crash.md b/.changeset/tasty-falcons-crash.md new file mode 100644 index 000000000..bc7a519f5 --- /dev/null +++ b/.changeset/tasty-falcons-crash.md @@ -0,0 +1,5 @@ +--- +'@linaria/babel-preset': patch +--- + +Fix an issue with async resolvers that sometimes leads to attempts to evaluate unprepared code. Fixes #1054. diff --git a/packages/babel/src/transform-stages/1-prepare-for-eval.ts b/packages/babel/src/transform-stages/1-prepare-for-eval.ts index 87b3555c4..550d18e81 100644 --- a/packages/babel/src/transform-stages/1-prepare-for-eval.ts +++ b/packages/babel/src/transform-stages/1-prepare-for-eval.ts @@ -317,6 +317,8 @@ export function prepareForEvalSync( return Array.from(results); } +const mutexes = new Map>(); + /** * Parses the specified file and recursively all its dependencies, * finds tags, applies eval-time replacements, removes dead code. @@ -335,6 +337,11 @@ export default async function prepareForEval( stack: string[] = [] ): Promise { const resolvedFile = await file; + const mutex = resolvedFile ? mutexes.get(resolvedFile.name) : null; + if (mutex) { + await mutex; + } + const processed = processQueueItem(babel, resolvedFile, codeCache, options); if (!processed) return undefined; @@ -397,7 +404,13 @@ export default async function prepareForEval( ); }); - await Promise.all(promises); + const promise = Promise.all(promises).then(() => {}); + + mutexes.set(name, promise); + + await promise; + + mutexes.delete(name); return Array.from(results); }