diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 756a93c2d1..db86af612a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -56,6 +56,9 @@ jobs:
- name: Build
run: pnpm build
+ - name: Check types
+ run: pnpm test:attw
+
- name: Cache dist
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
diff --git a/package.json b/package.json
index 07d493c374..c2675cfaf6 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"test:runtime": "vitest -c vitest.nuxt.config.ts",
"test:types": "pnpm --filter './test/fixtures/**' test:types",
"test:unit": "vitest run packages/",
+ "test:attw": "pnpm --filter './packages/**' test:attw",
"typecheck": "tsc --noEmit",
"typecheck:docs": "DOCS_TYPECHECK=true pnpm nuxi prepare && nuxt-content-twoslash verify --content-dir docs --languages html"
},
@@ -62,6 +63,7 @@
"vue": "3.5.13"
},
"devDependencies": {
+ "@arethetypeswrong/cli": "0.17.1",
"@nuxt/eslint-config": "0.7.2",
"@nuxt/kit": "workspace:*",
"@nuxt/rspack-builder": "workspace:*",
diff --git a/packages/kit/.attw.json b/packages/kit/.attw.json
new file mode 100644
index 0000000000..ac2579855e
--- /dev/null
+++ b/packages/kit/.attw.json
@@ -0,0 +1,3 @@
+{
+ "ignoreRules": ["cjs-resolves-to-esm"]
+}
diff --git a/packages/kit/package.json b/packages/kit/package.json
index e55ee2b447..4ab5fe5373 100644
--- a/packages/kit/package.json
+++ b/packages/kit/package.json
@@ -23,7 +23,8 @@
"dist"
],
"scripts": {
- "prepack": "unbuild"
+ "prepack": "unbuild",
+ "test:attw": "attw --pack"
},
"dependencies": {
"@nuxt/schema": "workspace:*",
diff --git a/packages/nuxt/.attw.json b/packages/nuxt/.attw.json
new file mode 100644
index 0000000000..80f18ecbfd
--- /dev/null
+++ b/packages/nuxt/.attw.json
@@ -0,0 +1,3 @@
+{
+ "ignoreRules": ["cjs-resolves-to-esm", "false-esm"]
+}
diff --git a/packages/nuxt/app/defaults.d.ts b/packages/nuxt/app/defaults.d.ts
new file mode 100644
index 0000000000..40999029b6
--- /dev/null
+++ b/packages/nuxt/app/defaults.d.ts
@@ -0,0 +1 @@
+export * from '../dist/app/defaults'
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 1b1cd823ca..50a7835402 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -37,6 +37,10 @@
"types": "./dist/app/index.d.ts",
"import": "./dist/app/index.js"
},
+ "./app/defaults": {
+ "types": "./dist/app/defaults.d.ts",
+ "import": "./dist/app/defaults.js"
+ },
"./package.json": "./package.json"
},
"imports": {
@@ -44,16 +48,13 @@
"types": "./dist/app/index.d.ts",
"import": "./dist/app/index.js"
},
- "#app/defaults": {
- "types": "./dist/app/defaults.d.ts",
- "import": "./dist/app/defaults.js"
- },
"#app/nuxt": {
"types": "./dist/app/nuxt.d.ts",
"import": "./dist/app/nuxt.js"
}
},
"files": [
+ "app/defaults.d.ts",
"app.d.ts",
"bin",
"types.d.ts",
@@ -64,7 +65,8 @@
"schema.*"
],
"scripts": {
- "prepack": "unbuild"
+ "prepack": "unbuild",
+ "test:attw": "attw --pack"
},
"dependencies": {
"@nuxt/devalue": "^2.0.2",
diff --git a/packages/nuxt/src/app/components/nuxt-route-announcer.ts b/packages/nuxt/src/app/components/nuxt-route-announcer.ts
index 035e9e9e50..389ae3be0c 100644
--- a/packages/nuxt/src/app/components/nuxt-route-announcer.ts
+++ b/packages/nuxt/src/app/components/nuxt-route-announcer.ts
@@ -1,5 +1,5 @@
import { defineComponent, h } from 'vue'
-import type { Politeness } from '#app/composables/route-announcer'
+import type { Politeness } from 'nuxt/app'
import { useRouteAnnouncer } from '#app/composables/route-announcer'
export default defineComponent({
diff --git a/packages/nuxt/src/app/composables/asyncData.ts b/packages/nuxt/src/app/composables/asyncData.ts
index 9dc1144424..ef68f6c74f 100644
--- a/packages/nuxt/src/app/composables/asyncData.ts
+++ b/packages/nuxt/src/app/composables/asyncData.ts
@@ -1,5 +1,9 @@
import { computed, getCurrentInstance, getCurrentScope, onBeforeMount, onScopeDispose, onServerPrefetch, onUnmounted, ref, shallowRef, toRef, unref, watch } from 'vue'
import type { MultiWatchSources, Ref } from 'vue'
+
+// TODO: temporary module for backwards compatibility
+import type { DedupeOption, DefaultAsyncDataErrorValue, DefaultAsyncDataValue } from 'nuxt/app/defaults'
+
import type { NuxtApp } from '../nuxt'
import { useNuxtApp } from '../nuxt'
import { toArray } from '../utils'
@@ -10,9 +14,6 @@ import { onNuxtReady } from './ready'
// @ts-expect-error virtual file
import { asyncDataDefaults, resetAsyncDataToUndefined } from '#build/nuxt.config.mjs'
-// TODO: temporary module for backwards compatibility
-import type { DedupeOption, DefaultAsyncDataErrorValue, DefaultAsyncDataValue } from '#app/defaults'
-
export type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error'
export type _Transform = (input: Input) => Output | Promise