Repository: alloy-framework/alloy
Pull request #6 (2024-08-14 18:02:19)

Fixup core CI and cleanup tests


Patch:
diff --git a/package.json b/package.json
index 28c5f5c..18d76f7 100644
--- a/package.json
+++ b/package.json
@@ -7,6 +7,7 @@
   "scripts": {
     "build": "pnpm -r --workspace-concurrency=Infinity build",
     "watch": "concurrently --kill-others \"tsc -b --watch\" \"pnpm run --parallel -r watch\"",
+    "clean": "pnpm -r run clean && rimraf **/.temp/",
     "test": "vitest run",
     "format": "pnpm run prettier-exec --write",
     "format:check": "pnpm run prettier-exec --check",
@@ -22,6 +23,7 @@
     "babel-preset-alloy": "workspace:~",
     "concurrently": "^8.2.2",
     "prettier": "^3.3.3",
+    "rimraf": "^6.0.1",
     "vitest": "^2.0.5"
   }
 }
diff --git a/packages/babel-plugin-alloy/package.json b/packages/babel-plugin-alloy/package.json
index 1c8cd9c..88a5939 100644
--- a/packages/babel-plugin-alloy/package.json
+++ b/packages/babel-plugin-alloy/package.json
@@ -5,7 +5,8 @@
   "scripts": {
     "build": "tsc -p .",
     "test": "vitest run",
-    "test:watch": "vitest -w"
+    "test:watch": "vitest -w",
+    "clean": "rimraf dist/ .temp/"
   },
   "keywords": [],
   "author": "Brian Terlson <brian.terlson@microsoft.com>",
diff --git a/packages/core/package.json b/packages/core/package.json
index 0d87b41..86e249b 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -4,12 +4,6 @@
   "description": "",
   "main": "./dist/src/index.js",
   "types": "./dist/src/index.d.ts",
-  "imports": {
-    "#core": {
-      "node": "./dist/src/index.js",
-      "default": "./dist/src/index.js"
-    }
-  },
   "exports": {
     ".": {
       "import": "./dist/src/index.js",
@@ -36,6 +30,7 @@
     "build-src": "babel src -d dist/src --extensions '.ts,.tsx'",
     "build-testing": "babel testing -d dist/testing --extensions '.ts,.tsx'",
     "build": "tsc -p . && npm run build-src && npm run build-testing",
+    "clean": "rimraf dist/ .temp/",
     "test": "vitest run",
     "test:watch": "vitest -w",
     "watch-src": "babel src -d dist/src --extensions '.ts,.tsx' --watch",
diff --git a/packages/core/src/code.ts b/packages/core/src/code.ts
index 63ee18a..60830e8 100644
--- a/packages/core/src/code.ts
+++ b/packages/core/src/code.ts
@@ -1,7 +1,7 @@
 // this code is split into a tokenizer and a parser of sorts because I feel like
 // it should be psosible to share logic between this and the babel transform, but
 // this is an exercise for the future.
-import { Child, Indent } from "#core";
+import { Child, Indent } from "@alloy-js/core";
 
 interface IndentLevelData {
   kind: "indent";
diff --git a/packages/core/src/components/Indent.tsx b/packages/core/src/components/Indent.tsx
index 9d39064..348cc08 100644
--- a/packages/core/src/components/Indent.tsx
+++ b/packages/core/src/components/Indent.tsx
@@ -1,9 +1,6 @@
 import { createContext, useContext } from "../context.js";
 import { Children, getContext } from "@alloy-js/core/jsx-runtime";
-if ((globalThis as any).alloyIndent) {
-  throw "FAIL";
-}
-(globalThis as any).alloyIndent = true;
+
 export const IndentContext = createContext<IndentState>({
   level: 0,
   indent: "  ",
diff --git a/packages/typescript/package.json b/packages/typescript/package.json
index f496394..e07d162 100644
--- a/packages/typescript/package.json
+++ b/packages/typescript/package.json
@@ -16,6 +16,7 @@
     "build-src": "babel src -d dist/src --extensions '.ts,.tsx'",
     "build-tsc": "tsc -p .",
     "build": "npm run build-src && npm run build-tsc",
+    "clean": "rimraf dist/ .temp/",
     "watch-src": "babel src -d dist/src --extensions '.ts,.tsx' --watch",
     "watch-tsc": "tsc -p . --watch",
     "watch": "concurrently --kill-others \"npm run watch-src\" \"npm run watch-tsc\"",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index db9c64c..fff1755 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -23,6 +23,9 @@ importers:
       prettier:
         specifier: ^3.3.3
         version: 3.3.3
+      rimraf:
+        specifier: ^6.0.1
+        version: 6.0.1
       vitest:
         specifier: ^2.0.5
         version: 2.0.5(@types/node@22.2.0)
@@ -522,6 +525,10 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@isaacs/cliui@8.0.2':
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+
   '@jridgewell/gen-mapping@0.3.5':
     resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
     engines: {node: '>=6.0.0'}
@@ -543,6 +550,10 @@ packages:
   '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3':
     resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==}
 
+  '@pkgjs/parseargs@0.11.0':
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+
   '@rollup/plugin-babel@6.0.4':
     resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==}
     engines: {node: '>=14.0.0'}
@@ -719,6 +730,10 @@ packages:
     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
     engines: {node: '>=8'}
 
+  ansi-regex@6.0.1:
+    resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+    engines: {node: '>=12'}
+
   ansi-styles@3.2.1:
     resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
     engines: {node: '>=4'}
@@ -727,6 +742,10 @@ packages:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
 
+  ansi-styles@6.2.1:
+    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+    engines: {node: '>=12'}
+
   anymatch@3.1.3:
     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
     engines: {node: '>= 8'}
@@ -751,6 +770,9 @@ packages:
   brace-expansion@1.1.11:
     resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
 
+  brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
   braces@3.0.3:
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
@@ -854,12 +876,18 @@ packages:
     resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
     engines: {node: '>=0.10.0'}
 
+  eastasianwidth@0.2.0:
+    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
   electron-to-chromium@1.5.6:
     resolution: {integrity: sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==}
 
   emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
 
+  emoji-regex@9.2.2:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
   esbuild@0.23.0:
     resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==}
     engines: {node: '>=18'}
@@ -887,6 +915,10 @@ packages:
     resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
     engines: {node: '>=8'}
 
+  foreground-child@3.3.0:
+    resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+    engines: {node: '>=14'}
+
   fs-readdir-recursive@1.1.0:
     resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==}
 
@@ -920,6 +952,11 @@ packages:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
     engines: {node: '>= 6'}
 
+  glob@11.0.0:
+    resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==}
+    engines: {node: 20 || >=22}
+    hasBin: true
+
   glob@7.2.3:
     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
     deprecated: Glob versions prior to v9 are no longer supported
@@ -992,6 +1029,10 @@ packages:
   isexe@2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
 
+  jackspeak@4.0.1:
+    resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==}
+    engines: {node: 20 || >=22}
+
   js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
@@ -1014,6 +1055,10 @@ packages:
   loupe@3.1.1:
     resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==}
 
+  lru-cache@11.0.0:
+    resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==}
+    engines: {node: 20 || >=22}
+
   lru-cache@5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
 
@@ -1035,9 +1080,17 @@ packages:
     resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
     engines: {node: '>=4'}
 
+  minimatch@10.0.1:
+    resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
+    engines: {node: 20 || >=22}
+
   minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
 
+  minipass@7.1.2:
+    resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
   ms@2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
 
@@ -1064,6 +1117,9 @@ packages:
     resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
     engines: {node: '>=12'}
 
+  package-json-from-dist@1.0.0:
+    resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
+
   path-is-absolute@1.0.1:
     resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
     engines: {node: '>=0.10.0'}
@@ -1079,6 +1135,10 @@ packages:
   path-parse@1.0.7:
     resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
 
+  path-scurry@2.0.0:
+    resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
+    engines: {node: 20 || >=22}
+
   pathe@1.1.2:
     resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
 
@@ -1126,6 +1186,11 @@ packages:
     resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
     hasBin: true
 
+  rimraf@6.0.1:
+    resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
+    engines: {node: 20 || >=22}
+    hasBin: true
+
   rollup@4.20.0:
     resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -1181,10 +1246,18 @@ packages:
     resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
     engines: {node: '>=8'}
 
+  string-width@5.1.2:
+    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+    engines: {node: '>=12'}
+
   strip-ansi@6.0.1:
     resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
     engines: {node: '>=8'}
 
+  strip-ansi@7.1.0:
+    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+    engines: {node: '>=12'}
+
   strip-final-newline@3.0.0:
     resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
     engines: {node: '>=12'}
@@ -1334,6 +1407,10 @@ packages:
     resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
     engines: {node: '>=10'}
 
+  wrap-ansi@8.1.0:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
+
   wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
@@ -1652,6 +1729,15 @@ snapshots:
   '@esbuild/win32-x64@0.23.0':
     optional: true
 
+  '@isaacs/cliui@8.0.2':
+    dependencies:
+      string-width: 5.1.2
+      string-width-cjs: string-width@4.2.3
+      strip-ansi: 7.1.0
+      strip-ansi-cjs: strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: wrap-ansi@7.0.0
+
   '@jridgewell/gen-mapping@0.3.5':
     dependencies:
       '@jridgewell/set-array': 1.2.1
@@ -1672,6 +1758,9 @@ snapshots:
   '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3':
     optional: true
 
+  '@pkgjs/parseargs@0.11.0':
+    optional: true
+
   '@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.20.0)':
     dependencies:
       '@babel/core': 7.25.2
@@ -1832,6 +1921,8 @@ snapshots:
 
   ansi-regex@5.0.1: {}
 
+  ansi-regex@6.0.1: {}
+
   ansi-styles@3.2.1:
     dependencies:
       color-convert: 1.9.3
@@ -1840,6 +1931,8 @@ snapshots:
     dependencies:
       color-convert: 2.0.1
 
+  ansi-styles@6.2.1: {}
+
   anymatch@3.1.3:
     dependencies:
       normalize-path: 3.0.0
@@ -1869,6 +1962,10 @@ snapshots:
       balanced-match: 1.0.2
       concat-map: 0.0.1
 
+  brace-expansion@2.0.1:
+    dependencies:
+      balanced-match: 1.0.2
+
   braces@3.0.3:
     dependencies:
       fill-range: 7.1.1
@@ -1979,10 +2076,14 @@ snapshots:
 
   deepmerge@4.3.1: {}
 
+  eastasianwidth@0.2.0: {}
+
   electron-to-chromium@1.5.6: {}
 
   emoji-regex@8.0.0: {}
 
+  emoji-regex@9.2.2: {}
+
   esbuild@0.23.0:
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.23.0
@@ -2037,6 +2138,11 @@ snapshots:
       to-regex-range: 5.0.1
     optional: true
 
+  foreground-child@3.3.0:
+    dependencies:
+      cross-spawn: 7.0.3
+      signal-exit: 4.1.0
+
   fs-readdir-recursive@1.1.0: {}
 
   fs.realpath@1.0.0: {}
@@ -2059,6 +2165,15 @@ snapshots:
       is-glob: 4.0.3
     optional: true
 
+  glob@11.0.0:
+    dependencies:
+      foreground-child: 3.3.0
+      jackspeak: 4.0.1
+      minimatch: 10.0.1
+      minipass: 7.1.2
+      package-json-from-dist: 1.0.0
+      path-scurry: 2.0.0
+
   glob@7.2.3:
     dependencies:
       fs.realpath: 1.0.0
@@ -2121,6 +2236,12 @@ snapshots:
 
   isexe@2.0.0: {}
 
+  jackspeak@4.0.1:
+    dependencies:
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
+
   js-tokens@4.0.0: {}
 
   jsesc@2.5.2: {}
@@ -2135,6 +2256,8 @@ snapshots:
     dependencies:
       get-func-name: 2.0.2
 
+  lru-cache@11.0.0: {}
+
   lru-cache@5.1.1:
     dependencies:
       yallist: 3.1.1
@@ -2154,10 +2277,16 @@ snapshots:
 
   min-indent@1.0.1: {}
 
+  minimatch@10.0.1:
+    dependencies:
+      brace-expansion: 2.0.1
+
   minimatch@3.1.2:
     dependencies:
       brace-expansion: 1.1.11
 
+  minipass@7.1.2: {}
+
   ms@2.1.2: {}
 
   nanoid@3.3.7: {}
@@ -2179,6 +2308,8 @@ snapshots:
     dependencies:
       mimic-fn: 4.0.0
 
+  package-json-from-dist@1.0.0: {}
+
   path-is-absolute@1.0.1: {}
 
   path-key@3.1.1: {}
@@ -2187,6 +2318,11 @@ snapshots:
 
   path-parse@1.0.7: {}
 
+  path-scurry@2.0.0:
+    dependencies:
+      lru-cache: 11.0.0
+      minipass: 7.1.2
+
   pathe@1.1.2: {}
 
   pathval@2.0.0: {}
@@ -2222,6 +2358,11 @@ snapshots:
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
 
+  rimraf@6.0.1:
+    dependencies:
+      glob: 11.0.0
+      package-json-from-dist: 1.0.0
+
   rollup@4.20.0:
     dependencies:
       '@types/estree': 1.0.5
@@ -2280,10 +2421,20 @@ snapshots:
       is-fullwidth-code-point: 3.0.0
       strip-ansi: 6.0.1
 
+  string-width@5.1.2:
+    dependencies:
+      eastasianwidth: 0.2.0
+      emoji-regex: 9.2.2
+      strip-ansi: 7.1.0
+
   strip-ansi@6.0.1:
     dependencies:
       ansi-regex: 5.0.1
 
+  strip-ansi@7.1.0:
+    dependencies:
+      ansi-regex: 6.0.1
+
   strip-final-newline@3.0.0: {}
 
   strip-indent@3.0.0:
@@ -2473,6 +2624,12 @@ snapshots:
       string-width: 4.2.3
       strip-ansi: 6.0.1
 
+  wrap-ansi@8.1.0:
+    dependencies:
+      ansi-styles: 6.2.1
+      string-width: 5.1.2
+      strip-ansi: 7.1.0
+
   wrappy@1.0.2: {}
 
   y18n@5.0.8: {}


Test patch:
diff --git a/packages/core/test/components/source-file.tsx b/packages/core/test/components/source-file.test.tsx
similarity index 100%
rename from packages/core/test/components/source-file.tsx
rename to packages/core/test/components/source-file.test.tsx
diff --git a/packages/core/test/emitting/basic.tsx b/packages/core/test/emitting/basic.test.tsx
similarity index 100%
rename from packages/core/test/emitting/basic.tsx
rename to packages/core/test/emitting/basic.test.tsx
diff --git a/packages/core/test/name-policy.tsx b/packages/core/test/name-policy.test.tsx
similarity index 100%
rename from packages/core/test/name-policy.tsx
rename to packages/core/test/name-policy.test.tsx
diff --git a/packages/core/test/reactivity/ref-rendering.tsx b/packages/core/test/reactivity/ref-rendering.test.tsx
similarity index 100%
rename from packages/core/test/reactivity/ref-rendering.tsx
rename to packages/core/test/reactivity/ref-rendering.test.tsx
diff --git a/packages/core/test/reactivity/test.tsx b/packages/core/test/reactivity/test.test.tsx
similarity index 100%
rename from packages/core/test/reactivity/test.tsx
rename to packages/core/test/reactivity/test.test.tsx
diff --git a/packages/core/test/refkey.ts b/packages/core/test/refkey.test.ts
similarity index 94%
rename from packages/core/test/refkey.ts
rename to packages/core/test/refkey.test.ts
index 2662564..3737f77 100644
--- a/packages/core/test/refkey.ts
+++ b/packages/core/test/refkey.test.ts
@@ -1,6 +1,6 @@
 import { expect, it } from "vitest";
 import { refkey } from "../src/refkey.js";
-import { renderTree } from "#core";
+import { renderTree } from "@alloy-js/core";
 
 it("is stable when called with same values", () => {
   const obj = {};
diff --git a/packages/core/test/rendering/basic.tsx b/packages/core/test/rendering/basic.test.tsx
similarity index 100%
rename from packages/core/test/rendering/basic.tsx
rename to packages/core/test/rendering/basic.test.tsx
diff --git a/packages/core/test/rendering/code.tsx b/packages/core/test/rendering/code.test.tsx
similarity index 100%
rename from packages/core/test/rendering/code.tsx
rename to packages/core/test/rendering/code.test.tsx
diff --git a/packages/core/test/rendering/indent.tsx b/packages/core/test/rendering/indent.test.tsx
similarity index 100%
rename from packages/core/test/rendering/indent.tsx
rename to packages/core/test/rendering/indent.test.tsx
diff --git a/packages/core/test/rendering/linebreaks.tsx b/packages/core/test/rendering/linebreaks.test.tsx
similarity index 100%
rename from packages/core/test/rendering/linebreaks.tsx
rename to packages/core/test/rendering/linebreaks.test.tsx
diff --git a/packages/core/test/rendering/refkeys.tsx b/packages/core/test/rendering/refkeys.test.tsx
similarity index 94%
rename from packages/core/test/rendering/refkeys.tsx
rename to packages/core/test/rendering/refkeys.test.tsx
index 2e8195a..c5e3b68 100644
--- a/packages/core/test/rendering/refkeys.tsx
+++ b/packages/core/test/rendering/refkeys.test.tsx
@@ -1,6 +1,6 @@
 import { describe, expect, it } from "vitest";
 import "../../testing/extend-expect.js";
-import { refkey, Refkey } from "#core";
+import { refkey, Refkey } from "@alloy-js/core";
 import { SourceFile } from "@alloy-js/core/stc";
 
 it("is rendered properly in the tree", () => {
diff --git a/packages/core/test/stc.tsx b/packages/core/test/stc.test.tsx
similarity index 100%
rename from packages/core/test/stc.tsx
rename to packages/core/test/stc.test.tsx
diff --git a/packages/core/test/symbols.ts b/packages/core/test/symbols.test.ts
similarity index 100%
rename from packages/core/test/symbols.ts
rename to packages/core/test/symbols.test.ts
diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts
index 5032d38..3febf14 100644
--- a/packages/core/vitest.config.ts
+++ b/packages/core/vitest.config.ts
@@ -1,25 +1,26 @@
 import { defineConfig } from "vitest/config";
 import { babel } from "@rollup/plugin-babel";
+import { resolve } from "path";
 
 export default defineConfig({
-  test: {
-    include: ["test/**/*.ts", "test/**/*.tsx"],
-    exclude: ["test/**/*.util.ts", "test/**/*.d.ts"],
-  },
   esbuild: {
     jsx: "preserve",
     sourcemap: "both",
   },
+  resolve: {
+    alias: {
+      "@alloy-js/core/jsx-runtime": resolve(__dirname, "./src/jsx-runtime.ts"),
+      "@alloy-js/core/stc": resolve(__dirname, "./src/components/stc/index.ts"),
+      "@alloy-js/core": resolve(__dirname, "./src/index.ts"),
+    },
+  },
   plugins: [
     babel({
       inputSourceMap: true as any,
       sourceMaps: "both",
       babelHelpers: "bundled",
       extensions: [".ts", ".tsx"],
-      presets: [
-        "@babel/preset-typescript",
-        ["babel-preset-alloy", { alloyModuleName: "#core" }],
-      ],
+      presets: ["@babel/preset-typescript", ["babel-preset-alloy", {}]],
     }),
   ],
 });
diff --git a/packages/typescript/test/array.tsx b/packages/typescript/test/array.test.tsx
similarity index 100%
rename from packages/typescript/test/array.tsx
rename to packages/typescript/test/array.test.tsx
diff --git a/packages/typescript/test/barrel.tsx b/packages/typescript/test/barrel.test.tsx
similarity index 100%
rename from packages/typescript/test/barrel.tsx
rename to packages/typescript/test/barrel.test.tsx
diff --git a/packages/typescript/test/basic.tsx b/packages/typescript/test/basic.test.tsx
similarity index 100%
rename from packages/typescript/test/basic.tsx
rename to packages/typescript/test/basic.test.tsx
diff --git a/packages/typescript/test/externals.tsx b/packages/typescript/test/externals.test.tsx
similarity index 100%
rename from packages/typescript/test/externals.tsx
rename to packages/typescript/test/externals.test.tsx
diff --git a/packages/typescript/test/function-declaration.tsx b/packages/typescript/test/function-declaration.test.tsx
similarity index 100%
rename from packages/typescript/test/function-declaration.tsx
rename to packages/typescript/test/function-declaration.test.tsx
diff --git a/packages/typescript/test/imports.tsx b/packages/typescript/test/imports.test.tsx
similarity index 100%
rename from packages/typescript/test/imports.tsx
rename to packages/typescript/test/imports.test.tsx
diff --git a/packages/typescript/test/interface.tsx b/packages/typescript/test/interface.test.tsx
similarity index 100%
rename from packages/typescript/test/interface.tsx
rename to packages/typescript/test/interface.test.tsx
diff --git a/packages/typescript/test/name-policy.tsx b/packages/typescript/test/name-policy.test.tsx
similarity index 100%
rename from packages/typescript/test/name-policy.tsx
rename to packages/typescript/test/name-policy.test.tsx
diff --git a/packages/typescript/test/package-external.tsx b/packages/typescript/test/package-external.test.tsx
similarity index 100%
rename from packages/typescript/test/package-external.tsx
rename to packages/typescript/test/package-external.test.tsx
diff --git a/packages/typescript/test/package.tsx b/packages/typescript/test/package.test.tsx
similarity index 100%
rename from packages/typescript/test/package.tsx
rename to packages/typescript/test/package.test.tsx
diff --git a/packages/typescript/test/reference.tsx b/packages/typescript/test/reference.test.tsx
similarity index 100%
rename from packages/typescript/test/reference.tsx
rename to packages/typescript/test/reference.test.tsx
diff --git a/packages/typescript/test/values.tsx b/packages/typescript/test/values.test.tsx
similarity index 100%
rename from packages/typescript/test/values.tsx
rename to packages/typescript/test/values.test.tsx
diff --git a/packages/typescript/test/var-declaration.tsx b/packages/typescript/test/var-declaration.test.tsx
similarity index 100%
rename from packages/typescript/test/var-declaration.tsx
rename to packages/typescript/test/var-declaration.test.tsx
diff --git a/packages/typescript/vitest.config.ts b/packages/typescript/vitest.config.ts
index f107f1e..0dfa2ae 100644
--- a/packages/typescript/vitest.config.ts
+++ b/packages/typescript/vitest.config.ts
@@ -2,10 +2,6 @@ import { defineConfig } from "vitest/config";
 import { babel } from "@rollup/plugin-babel";
 
 export default defineConfig({
-  test: {
-    include: ["test/**/*.ts", "test/**/*.tsx"],
-    exclude: ["test/**/*.util.ts", "test/**/utils.tsx", "test/**/*.d.ts"],
-  },
   esbuild: {
     jsx: "preserve",
     sourcemap: "both",