From bcaeedc2ac17997d4513de1b6e44dac23750bb3d Mon Sep 17 00:00:00 2001
From: Anders Bech Mellson <mellson@icloud.com>
Date: Tue, 14 Nov 2023 16:28:01 +0100
Subject: [PATCH] Fix getting env variables from import.meta.env.SOME_KEY
 (#400)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Fix getting env variables from import.meta.env.SOME_KEY

* remove double comment

* tighten the check using AST tests

---------

Co-authored-by: Mateusz BurzyƄski <mateuszburzynski@gmail.com>
---
 .changeset/nervous-vans-appear.md                   | 5 +++++
 packages/machine-extractor/src/sky/skyConfigNode.ts | 9 ++++++---
 2 files changed, 11 insertions(+), 3 deletions(-)
 create mode 100644 .changeset/nervous-vans-appear.md

diff --git a/.changeset/nervous-vans-appear.md b/.changeset/nervous-vans-appear.md
new file mode 100644
index 00000000..6f5cd697
--- /dev/null
+++ b/.changeset/nervous-vans-appear.md
@@ -0,0 +1,5 @@
+---
+'@xstate/cli': patch
+---
+
+Fix getting env variables from import.meta.env.SOME_KEY
diff --git a/packages/machine-extractor/src/sky/skyConfigNode.ts b/packages/machine-extractor/src/sky/skyConfigNode.ts
index 3d24dde3..4f9e0b16 100644
--- a/packages/machine-extractor/src/sky/skyConfigNode.ts
+++ b/packages/machine-extractor/src/sky/skyConfigNode.ts
@@ -33,10 +33,13 @@ const StringLiteralOrEnvKey = unionType([
             throw new Error("Couldn't find API key in any of the env files");
           }
 
-          // Let's find the last part of the expression (identifier), e.g. `API_KEY` in `process.env.API_KEY`
+          // Let's find the env key, e.g. `API_KEY` in `process.env.API_KEY` or in `import.meta.env.API_KEY`
           const envVariableName =
-            (t.isMetaProperty(node.object) ||
-              t.buildMatchMemberExpression('process.env')(node.object)) &&
+            (t.buildMatchMemberExpression('process.env')(node.object) ||
+              (t.isMemberExpression(node.object) &&
+                t.isMetaProperty(node.object.object) &&
+                t.isIdentifier(node.object.property) &&
+                node.object.property.name === 'env')) &&
             t.isIdentifier(node.property)
               ? node.property.name
               : null;