diff --git a/.mocharc.js b/.mocharc.js
index 768c03711..77056d59a 100644
--- a/.mocharc.js
+++ b/.mocharc.js
@@ -3,14 +3,14 @@ const args = process.argv.slice(2);
 
 function isFileArg(file) {
   return (
-    /\.(j|t)s$/.test(file) ||
+    /\.(j|t|cj|mj|ct|mt)s$/.test(file) ||
     (fs.existsSync(file) && fs.statSync(file).isDirectory())
   );
 }
 
 const spec = args.some(isFileArg)
   ? args.filter(isFileArg)
-  : 'packages/*/!(integration-tests)/test/{*.{js,ts},**/*.{test,spec}.{js,ts}}';
+  : 'packages/*/!(integration-tests)/test/{*.{js,ts,cts,mts,cjs,mjs},**/*.{test,spec}.{js,ts,mts,cts,cjs,mjs}}';
 
 module.exports = {
   spec,
diff --git a/package.json b/package.json
index d244a88ee..45d52315f 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,7 @@
     "test:js": "yarn test:js:unit && yarn test:integration",
     "test:js:coverage": "yarn nyc yarn test:js:unit",
     "test:js:coverage:report": "yarn nyc report --reporter=html-spa",
-    "test:js:unit": "cross-env NODE_ENV=test mocha --conditions=development --timeout 5000",
+    "test:js:unit": "cross-env NODE_ENV=test mocha --conditions=\"@atlaspack::sources\" --timeout 5000",
     "test:unit": "yarn test:js:unit && cargo test",
     "dev:release": "SKIP_PLUGIN_COMPATIBILITY_CHECK=true lerna publish -y --canary --preid dev --dist-tag=dev --exact --force-publish=* --no-git-tag-version --no-push",
     "canary:release": "SKIP_PLUGIN_COMPATIBILITY_CHECK=true lerna publish -y --canary --preid canary --dist-tag=canary --exact --force-publish=* --no-git-tag-version --no-push",
diff --git a/packages/core/core/package.json b/packages/core/core/package.json
index b75bd4657..2e240bcd6 100644
--- a/packages/core/core/package.json
+++ b/packages/core/core/package.json
@@ -59,7 +59,7 @@
     "./*": "./*",
     ".": "./lib/index.js",
     "./worker": {
-      "development": "./src/worker.js",
+      "@atlaspack::sources": "./src/worker.js",
       "default": "./lib/worker.js"
     }
   },
diff --git a/packages/core/integration-tests/test/bundler.js b/packages/core/integration-tests/test/bundler.js
index bc3099a11..28d47e607 100644
--- a/packages/core/integration-tests/test/bundler.js
+++ b/packages/core/integration-tests/test/bundler.js
@@ -1473,14 +1473,14 @@ describe('bundler', function () {
           {
             "extends": "@atlaspack/config-default",
             "transformers": {
-              "*.js": ["./transformer.js", "..."],
+              "*.js": ["./transformer.cjs", "..."],
             }
           }
 
-        transformer.js:
-          import { Transformer } from '@atlaspack/plugin';
+        transformer.cjs:
+          const { Transformer } = require('@atlaspack/plugin');
 
-          export default new Transformer({
+          module.exports = new Transformer({
             transform({asset}) {
               if (asset.filePath.endsWith('.html')) {
                 asset.isBundleSplittable = false;
diff --git a/packages/core/logger/package.json b/packages/core/logger/package.json
index d7fff5684..b95d149a9 100644
--- a/packages/core/logger/package.json
+++ b/packages/core/logger/package.json
@@ -12,6 +12,12 @@
   },
   "main": "lib/Logger.js",
   "source": "src/Logger.js",
+  "exports": {
+    ".": {
+      "@atlaspack::sources": "./src/Logger.js",
+      "default": "./lib/Logger.js"
+    }
+  },
   "engines": {
     "node": ">= 16.0.0"
   },
diff --git a/packages/core/workers/package.json b/packages/core/workers/package.json
index 7b41b9652..fefd18554 100644
--- a/packages/core/workers/package.json
+++ b/packages/core/workers/package.json
@@ -16,6 +16,20 @@
   "engines": {
     "node": ">= 16.0.0"
   },
+  "exports": {
+    ".": {
+      "types": "./index.d.ts",
+      "@atlaspack::sources": "./src/index.js",
+      "default": "./lib/index.js"
+    }
+  },
+  "imports": {
+    "#atlaspack/workers": {
+      "types": "./index.d.ts",
+      "@atlaspack::sources": "./src/index.js",
+      "default": "./lib/index.js"
+    }
+  },
   "dependencies": {
     "@atlaspack/build-cache": "2.12.0",
     "@atlaspack/diagnostic": "2.12.0",
diff --git a/packages/core/workers/test/integration/workerfarm/console.js b/packages/core/workers/test/integration/workerfarm/console.js
index 9236647f5..d94c6bd87 100644
--- a/packages/core/workers/test/integration/workerfarm/console.js
+++ b/packages/core/workers/test/integration/workerfarm/console.js
@@ -1,4 +1,4 @@
-const WorkerFarm = require('../../../src/WorkerFarm').default;
+const WorkerFarm = require('#atlaspack/workers').default;
 
 function run() {
   if (WorkerFarm.isWorker()) {
diff --git a/packages/core/workers/test/integration/workerfarm/ipc-pid.js b/packages/core/workers/test/integration/workerfarm/ipc-pid.js
index 6b7cc04e3..1907d42cf 100644
--- a/packages/core/workers/test/integration/workerfarm/ipc-pid.js
+++ b/packages/core/workers/test/integration/workerfarm/ipc-pid.js
@@ -1,4 +1,4 @@
-const WorkerFarm = require('../../../src/WorkerFarm').default;
+const WorkerFarm = require('#atlaspack/workers').default;
 
 function run(api) {
   let result = [process.pid];
diff --git a/packages/core/workers/test/integration/workerfarm/ipc.js b/packages/core/workers/test/integration/workerfarm/ipc.js
index cca118219..203bd90a8 100644
--- a/packages/core/workers/test/integration/workerfarm/ipc.js
+++ b/packages/core/workers/test/integration/workerfarm/ipc.js
@@ -1,4 +1,4 @@
-const WorkerFarm = require('../../../src/WorkerFarm').default;
+const WorkerFarm = require('#atlaspack/workers').default;
 
 function run(api, a, b) {
   return api.callMaster({
diff --git a/packages/core/workers/test/integration/workerfarm/logging.js b/packages/core/workers/test/integration/workerfarm/logging.js
index 94410fb82..0e87b75b3 100644
--- a/packages/core/workers/test/integration/workerfarm/logging.js
+++ b/packages/core/workers/test/integration/workerfarm/logging.js
@@ -1,4 +1,4 @@
-const WorkerFarm = require('../../../src/WorkerFarm').default;
+const WorkerFarm = require('#atlaspack/workers').default;
 const Logger = require('@atlaspack/logger').default;
 
 function run() {
diff --git a/packages/core/workers/test/workerfarm.js b/packages/core/workers/test/workerfarm.test.cjs
similarity index 97%
rename from packages/core/workers/test/workerfarm.js
rename to packages/core/workers/test/workerfarm.test.cjs
index 2beec389e..ef4a23463 100644
--- a/packages/core/workers/test/workerfarm.js
+++ b/packages/core/workers/test/workerfarm.test.cjs
@@ -1,7 +1,8 @@
-// @flow
-import Logger from '@atlaspack/logger';
-import assert from 'assert';
-import WorkerFarm from '../src';
+// NOTE: @atlaspack/logger exports object instances from the module.
+// If there are issues, check all imports are using the same module instance/path
+const Logger = require('@atlaspack/logger').default;
+const assert = require('assert');
+const WorkerFarm = require('#atlaspack/workers').default;
 
 describe('WorkerFarm', function () {
   this.timeout(30000);
diff --git a/packages/dev/babel-register/index.js b/packages/dev/babel-register/index.js
index 6ab8e53b4..b461349dd 100644
--- a/packages/dev/babel-register/index.js
+++ b/packages/dev/babel-register/index.js
@@ -1,5 +1,6 @@
 const parcelBabelPreset = require('@atlaspack/babel-preset');
 const path = require('path');
+const fs = require('fs');
 
 require('@babel/register')({
   cwd: path.join(__dirname, '../../..'),
@@ -11,11 +12,21 @@ require('@babel/register')({
     (filepath) =>
       filepath.endsWith('.js') &&
       filepath.includes('/core/integration-tests/test/integration'),
+    // Include tests
+    (filepath) =>
+      filepath.endsWith('.js') &&
+      !fs.readFileSync(filepath, 'utf8').trim().startsWith('// @flow'),
   ],
   only: [path.join(__dirname, '../../..')],
   presets: [parcelBabelPreset],
   plugins: [require('./babel-plugin-module-translate')],
-  extensions: ['.js', '.jsx', '.ts', '.tsx'],
+  extensions: ['.js', '.jsx'],
+});
+
+// This only support transpiling TypeScript to CJS
+// eslint-disable-next-line import/no-extraneous-dependencies
+require('esbuild-register/dist/node').register({
+  extensions: ['.ts', '.cts', '.mts'],
 });
 
 // This adds the registration to the Node args, which are passed
diff --git a/packages/dev/babel-register/package.json b/packages/dev/babel-register/package.json
index c8e493e06..02c0d65f1 100644
--- a/packages/dev/babel-register/package.json
+++ b/packages/dev/babel-register/package.json
@@ -11,7 +11,8 @@
   "dependencies": {
     "@babel/register": "^7.22.5",
     "@atlaspack/babel-preset": "2.12.0",
-    "resolve": "^1.12.0"
+    "resolve": "^1.12.0",
+    "esbuild-register": "^3.5.0"
   },
   "peerDependencies": {
     "@babel/core": "^7.22.11"
diff --git a/packages/runtimes/js/src/helpers/bundle-url-common.ts b/packages/runtimes/js/src/helpers/bundle-url-common.cts
similarity index 100%
rename from packages/runtimes/js/src/helpers/bundle-url-common.ts
rename to packages/runtimes/js/src/helpers/bundle-url-common.cts
diff --git a/packages/runtimes/js/src/helpers/bundle-url-shards.ts b/packages/runtimes/js/src/helpers/bundle-url-shards.cts
similarity index 99%
rename from packages/runtimes/js/src/helpers/bundle-url-shards.ts
rename to packages/runtimes/js/src/helpers/bundle-url-shards.cts
index 23d928a95..ab79740ee 100644
--- a/packages/runtimes/js/src/helpers/bundle-url-shards.ts
+++ b/packages/runtimes/js/src/helpers/bundle-url-shards.cts
@@ -1,4 +1,4 @@
-const {getBaseURL, stackTraceUrlRegexp} = require('./bundle-url-common');
+const {getBaseURL, stackTraceUrlRegexp} = require('./bundle-url-common.cts');
 
 const bundleURL: Record<string, string> = {};
 
diff --git a/packages/runtimes/js/src/helpers/bundle-url.ts b/packages/runtimes/js/src/helpers/bundle-url.cts
similarity index 98%
rename from packages/runtimes/js/src/helpers/bundle-url.ts
rename to packages/runtimes/js/src/helpers/bundle-url.cts
index 48f6fc1a3..679a7a9d5 100644
--- a/packages/runtimes/js/src/helpers/bundle-url.ts
+++ b/packages/runtimes/js/src/helpers/bundle-url.cts
@@ -1,4 +1,4 @@
-const {getBaseURL, stackTraceUrlRegexp} = require('./bundle-url-common');
+const {getBaseURL, stackTraceUrlRegexp} = require('./bundle-url-common.cts');
 
 const bundleURL = {};
 
diff --git a/packages/runtimes/js/test/bundle-url-shards.test.js b/packages/runtimes/js/test/bundle-url-shards.test.js
index cfd6186ed..ff52b1b58 100644
--- a/packages/runtimes/js/test/bundle-url-shards.test.js
+++ b/packages/runtimes/js/test/bundle-url-shards.test.js
@@ -4,7 +4,7 @@ import assert from 'assert';
 import {fsFixture, overlayFS, bundle} from '@atlaspack/test-utils';
 
 // $FlowFixMe importing TypeScript
-import {getShardedBundleURL} from '../src/helpers/bundle-url-shards';
+import {getShardedBundleURL} from '../src/helpers/bundle-url-shards.cts';
 
 const createErrorStack = (url) => {
   // This error stack is copied from a local dev, with a bunch