Merge remote-tracking branch 'origin/3.x' into chore/nitro-v2

This commit is contained in:
Daniel Roe 2024-09-12 20:53:30 +01:00
commit bfae0551ec
No known key found for this signature in database
GPG Key ID: CBC814C393D93268
37 changed files with 498 additions and 508 deletions

View File

@ -1,4 +1,4 @@
FROM node:lts FROM node:lts@sha256:48db4f6ea21d134be744207225753a1730c4bc1b4cdf836d44511c36bf0e34d7
RUN apt-get update && \ RUN apt-get update && \
apt-get install -fy libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdbus-1-3 libdrm2 libxkbcommon0 libatspi2.0-0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 && \ apt-get install -fy libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdbus-1-3 libdrm2 libxkbcommon0 libatspi2.0-0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 && \

10
.github/codeql/codeql-config.yml vendored Normal file
View File

@ -0,0 +1,10 @@
paths:
- 'packages/*/dist/**'
- 'packages/nuxt/bin/**'
- 'packages/schema/schema/**'
paths-ignore:
- 'test/**'
- '**/*.test.js'
- '**/*.test.ts'
- '**/*.test.tsx'
- '**/__tests__/**'

View File

@ -6,6 +6,8 @@ on:
types: types:
- closed - closed
permissions: {}
jobs: jobs:
cleanup: cleanup:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@ -20,14 +22,14 @@ jobs:
gh extension install actions/gh-actions-cache gh extension install actions/gh-actions-cache
echo "Fetching list of cache keys" echo "Fetching list of cache keys"
cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH -L 100 | cut -f 1 ) cacheKeysForPR=$(gh actions-cache list -R "$REPO" -B "$BRANCH" -L 100 | cut -f 1 )
## Setting this to not fail the workflow while deleting cache keys. ## Setting this to not fail the workflow while deleting cache keys.
set +e set +e
echo "Deleting caches..." echo "Deleting caches..."
for cacheKey in $cacheKeysForPR for cacheKey in $cacheKeysForPR
do do
gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm gh actions-cache delete "$cacheKey" -R "$REPO" -B "$BRANCH" --confirm
done done
echo "Done" echo "Done"
env: env:

View File

@ -6,9 +6,7 @@ on:
- main - main
- 3.x - 3.x
permissions: permissions: {}
pull-requests: write
contents: write
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event.number || github.sha }} group: ${{ github.workflow }}-${{ github.event.number || github.sha }}
@ -19,6 +17,10 @@ jobs:
if: github.repository_owner == 'nuxt' && !contains(github.event.head_commit.message, 'v3.') && !contains(github.event.head_commit.message, 'v4.') if: github.repository_owner == 'nuxt' && !contains(github.event.head_commit.message, 'v3.') && !contains(github.event.head_commit.message, 'v4.')
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: write
steps: steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with: with:

View File

@ -70,8 +70,6 @@ jobs:
actions: read actions: read
contents: read contents: read
security-events: write security-events: write
needs:
- build
steps: steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
@ -81,25 +79,26 @@ jobs:
node-version: 20 node-version: 20
cache: "pnpm" cache: "pnpm"
- name: Install dependencies
run: pnpm install
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 uses: github/codeql-action/init@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6
with: with:
languages: javascript config: |
paths:
- 'packages/*/src/**'
- 'packages/nuxt/bin/**'
- 'packages/schema/schema/**'
paths-ignore:
- 'test/**'
- '**/*.spec.ts'
- '**/*.test.ts'
- '**/__snapshots__/**'
languages: javascript-typescript
queries: +security-and-quality queries: +security-and-quality
- name: Restore dist cache
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: dist
path: packages
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 uses: github/codeql-action/analyze@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6
with: with:
category: "/language:javascript" category: "/language:javascript-typescript"
typecheck: typecheck:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}

View File

@ -5,21 +5,22 @@ on:
types: types:
- opened - opened
permissions:
issues: write
jobs: jobs:
add-pr-labels: add-issue-labels:
name: Add labels name: Add labels
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
pull-requests: write
if: github.repository == 'nuxt/nuxt' if: github.repository == 'nuxt/nuxt'
steps: steps:
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with: with:
script: | script: |
# add 'pending triage' label if issue is created with no labels // add 'pending triage' label if issue is created with no labels
if (context.payload.issue.labels.length === 0) { if (context.payload.issue.labels.length === 0) {
github.rest.issues.addLabels({ github.rest.issues.addLabels({
issue_number: pullRequest.number, issue_number: context.payload.issue.number,
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
labels: ['pending triage'] labels: ['pending triage']

View File

@ -8,6 +8,8 @@ on:
- main - main
- 3.x - 3.x
permissions: {}
jobs: jobs:
add-pr-labels: add-pr-labels:
name: Add PR labels name: Add PR labels

View File

@ -26,6 +26,6 @@ jobs:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
# From https://github.com/rhysd/actionlint/blob/main/docs/usage.md#use-actionlint-on-github-actions # From https://github.com/rhysd/actionlint/blob/main/docs/usage.md#use-actionlint-on-github-actions
- name: Check workflow files - name: Check workflow files
run: | uses: docker://rhysd/actionlint:1.7.1@sha256:435ecdb63b1169e80ca3e136290072548c07fc4d76a044cf5541021712f8f344
bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/590d3bd9dde0c91f7a66071d40eb84716526e5a6/scripts/download-actionlint.bash) 1.6.25 with:
./actionlint -color -shellcheck="" args: -color

View File

@ -4,6 +4,9 @@ on:
types: [closed] types: [closed]
paths: paths:
- "packages/nuxt/src/app/composables/**" - "packages/nuxt/src/app/composables/**"
permissions: {}
jobs: jobs:
notify: notify:
if: github.event.pull_request.merged == true if: github.event.pull_request.merged == true

View File

@ -39,7 +39,7 @@ jobs:
GH_REPO: ${{ github.repository }} GH_REPO: ${{ github.repository }}
COMMENT_AT: ${{ github.event.comment.created_at }} COMMENT_AT: ${{ github.event.comment.created_at }}
run: | run: |
pr="$(gh api -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/${GH_REPO}/pulls/${PR_NUMBER})" pr="$(gh api -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/"${GH_REPO}"/pulls/"${PR_NUMBER}")"
head_sha="$(echo "$pr" | jq -r .head.sha)" head_sha="$(echo "$pr" | jq -r .head.sha)"
updated_at="$(echo "$pr" | jq -r .updated_at)" updated_at="$(echo "$pr" | jq -r .updated_at)"
@ -47,7 +47,7 @@ jobs:
exit 1 exit 1
fi fi
echo "head_sha=$head_sha" >> $GITHUB_OUTPUT echo "head_sha=$head_sha" >> "$GITHUB_OUTPUT"
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with: with:
ref: ${{ steps.pr.outputs.head_sha }} ref: ${{ steps.pr.outputs.head_sha }}

View File

@ -7,12 +7,12 @@ on:
- edited - edited
- synchronize - synchronize
permissions: permissions: {}
contents: read
jobs: jobs:
semantic-pr: semantic-pr:
permissions: permissions:
contents: read
pull-requests: read # for amannn/action-semantic-pull-request to analyze PRs pull-requests: read # for amannn/action-semantic-pull-request to analyze PRs
statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR
if: github.repository == 'nuxt/nuxt' && !startsWith(github.head_ref, 'v') if: github.repository == 'nuxt/nuxt' && !startsWith(github.head_ref, 'v')

View File

@ -11,7 +11,7 @@ jobs:
stackblitz: stackblitz:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- uses: huang-julien/reproduire-sur-stackblitz@v1.0.2 - uses: huang-julien/reproduire-sur-stackblitz@9ceccbfbb0f2f9a9a8db2d1f0dd909cf5cfe67aa # v1.0.2
with: with:
reproduction-heading: '### Reproduction' reproduction-heading: '### Reproduction'

View File

@ -46,6 +46,7 @@
"nuxt": "workspace:*", "nuxt": "workspace:*",
"postcss": "8.4.45", "postcss": "8.4.45",
"rollup": "4.21.2", "rollup": "4.21.2",
"send": ">=0.19.0",
"typescript": "5.6.2", "typescript": "5.6.2",
"ufo": "1.5.4", "ufo": "1.5.4",
"vite": "5.4.4", "vite": "5.4.4",

View File

@ -2,6 +2,7 @@ import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
name: 'DevOnly', name: 'DevOnly',
inheritAttrs: false,
setup (_, props) { setup (_, props) {
if (import.meta.dev) { if (import.meta.dev) {
return () => props.slots.default?.() return () => props.slots.default?.()

View File

@ -8,6 +8,7 @@ import { createError } from '../composables/error'
import { islandComponents } from '#build/components.islands.mjs' import { islandComponents } from '#build/components.islands.mjs'
export default defineComponent({ export default defineComponent({
name: 'IslandRenderer',
props: { props: {
context: { context: {
type: Object as () => { name: string, props?: Record<string, any> }, type: Object as () => { name: string, props?: Record<string, any> },

View File

@ -45,6 +45,7 @@ async function loadComponents (source = appBaseURL, paths: NuxtIslandResponse['c
export default defineComponent({ export default defineComponent({
name: 'NuxtIsland', name: 'NuxtIsland',
inheritAttrs: false,
props: { props: {
name: { name: {
type: String, type: String,

View File

@ -18,6 +18,7 @@ export const NuxtTeleportIslandSymbol = Symbol('NuxtTeleportIslandComponent') as
/* @__PURE__ */ /* @__PURE__ */
export default defineComponent({ export default defineComponent({
name: 'NuxtTeleportIslandComponent', name: 'NuxtTeleportIslandComponent',
inheritAttrs: false,
props: { props: {
to: { to: {
type: String, type: String,

View File

@ -9,6 +9,7 @@ import { NuxtTeleportIslandSymbol } from './nuxt-teleport-island-component'
/* @__PURE__ */ /* @__PURE__ */
export default defineComponent({ export default defineComponent({
name: 'NuxtTeleportIslandSlot', name: 'NuxtTeleportIslandSlot',
inheritAttrs: false,
props: { props: {
name: { name: {
type: String, type: String,

View File

@ -7,7 +7,7 @@ import { devRootDir } from '#build/nuxt.config.mjs'
export default (url: string) => defineComponent({ export default (url: string) => defineComponent({
name: 'NuxtTestComponentWrapper', name: 'NuxtTestComponentWrapper',
inheritAttrs: false,
async setup (props, { attrs }) { async setup (props, { attrs }) {
const query = parseQuery(new URL(url, 'http://localhost').search) const query = parseQuery(new URL(url, 'http://localhost').search)
const urlProps = query.props ? destr<Record<string, any>>(query.props as string) : {} const urlProps = query.props ? destr<Record<string, any>>(query.props as string) : {}

View File

@ -20,7 +20,7 @@ import type { LoadingIndicator } from '../app/composables/loading-indicator'
import type { RouteAnnouncer } from '../app/composables/route-announcer' import type { RouteAnnouncer } from '../app/composables/route-announcer'
// @ts-expect-error virtual file // @ts-expect-error virtual file
import { appId, multiApp } from '#build/nuxt.config.mjs' import { appId, chunkErrorEvent, multiApp } from '#build/nuxt.config.mjs'
// TODO: temporary module for backwards compatibility // TODO: temporary module for backwards compatibility
import type { DefaultAsyncDataErrorValue, DefaultErrorValue } from '#app/defaults' import type { DefaultAsyncDataErrorValue, DefaultErrorValue } from '#app/defaults'
@ -375,12 +375,14 @@ export function createNuxtApp (options: CreateOptions) {
defineGetter(nuxtApp.vueApp, '$nuxt', nuxtApp) defineGetter(nuxtApp.vueApp, '$nuxt', nuxtApp)
defineGetter(nuxtApp.vueApp.config.globalProperties, '$nuxt', nuxtApp) defineGetter(nuxtApp.vueApp.config.globalProperties, '$nuxt', nuxtApp)
// Listen to chunk load errors
if (import.meta.client) { if (import.meta.client) {
window.addEventListener('nuxt.preloadError', (event) => { // Listen to chunk load errors
nuxtApp.callHook('app:chunkError', { error: (event as Event & { payload: Error }).payload }) if (chunkErrorEvent) {
}) window.addEventListener(chunkErrorEvent, (event) => {
nuxtApp.callHook('app:chunkError', { error: (event as Event & { payload: Error }).payload })
event.preventDefault()
})
}
window.useNuxtApp = window.useNuxtApp || useNuxtApp window.useNuxtApp = window.useNuxtApp || useNuxtApp
// Log errors captured when running plugins, in the `app:created` and `app:beforeMount` hooks // Log errors captured when running plugins, in the `app:created` and `app:beforeMount` hooks

View File

@ -26,7 +26,7 @@ export default defineNuxtPlugin({
}) })
router.onError((error, to) => { router.onError((error, to) => {
if (chunkErrors.has(error)) { if (chunkErrors.has(error) || error.message.includes('Failed to fetch dynamically imported module')) {
reloadAppAtPath(to) reloadAppAtPath(to)
} }
}) })

View File

@ -24,7 +24,7 @@ interface ComponentChunkOptions {
buildDir: string buildDir: string
} }
const SCRIPT_RE = /<script[^>]*>/g const SCRIPT_RE = /<script[^>]*>/gi
const HAS_SLOT_OR_CLIENT_RE = /<slot[^>]*>|nuxt-client/ const HAS_SLOT_OR_CLIENT_RE = /<slot[^>]*>|nuxt-client/
const TEMPLATE_RE = /<template>([\s\S]*)<\/template>/ const TEMPLATE_RE = /<template>([\s\S]*)<\/template>/
const NUXTCLIENT_ATTR_RE = /\s:?nuxt-client(="[^"]*")?/g const NUXTCLIENT_ATTR_RE = /\s:?nuxt-client(="[^"]*")?/g

View File

@ -51,6 +51,7 @@ export function createTransformPlugin (nuxt: Nuxt, getComponents: getComponentsT
return createUnplugin(() => ({ return createUnplugin(() => ({
name: 'nuxt:components:imports', name: 'nuxt:components:imports',
enforce: 'post',
transformInclude (id) { transformInclude (id) {
id = normalize(id) id = normalize(id)
return id.startsWith('virtual:') || id.startsWith('\0virtual:') || id.startsWith(nuxt.options.buildDir) || !isIgnored(id) return id.startsWith('virtual:') || id.startsWith('\0virtual:') || id.startsWith(nuxt.options.buildDir) || !isIgnored(id)

View File

@ -512,6 +512,7 @@ export const nuxtConfigTemplate: NuxtTemplate = {
`export const appId = ${JSON.stringify(ctx.nuxt.options.appId)}`, `export const appId = ${JSON.stringify(ctx.nuxt.options.appId)}`,
`export const outdatedBuildInterval = ${ctx.nuxt.options.experimental.checkOutdatedBuildInterval}`, `export const outdatedBuildInterval = ${ctx.nuxt.options.experimental.checkOutdatedBuildInterval}`,
`export const multiApp = ${!!ctx.nuxt.options.future.multiApp}`, `export const multiApp = ${!!ctx.nuxt.options.future.multiApp}`,
`export const chunkErrorEvent = ${ctx.nuxt.options.experimental.emitRouteChunkError ? ctx.nuxt.options.builder === '@nuxt/vite-builder' ? '"vite:preloadError"' : '"nuxt:preloadError"' : 'false'}`,
].join('\n\n') ].join('\n\n')
}, },
} }

View File

@ -6,7 +6,7 @@ import type { Plugin } from 'vite'
// @ts-expect-error https://github.com/GoogleChromeLabs/critters/pull/151 // @ts-expect-error https://github.com/GoogleChromeLabs/critters/pull/151
import Critters from 'critters' import Critters from 'critters'
import { genObjectFromRawEntries } from 'knitwork' import { genObjectFromRawEntries } from 'knitwork'
import htmlMinifier from 'html-minifier' import htmlnano from 'htmlnano'
import { glob } from 'tinyglobby' import { glob } from 'tinyglobby'
import { camelCase } from 'scule' import { camelCase } from 'scule'
@ -86,7 +86,7 @@ export const RenderPlugin = () => {
} }
// Minify HTML // Minify HTML
html = htmlMinifier.minify(html, { collapseWhitespace: true }) html = await htmlnano.process(html, { collapseWhitespace: 'aggressive' }).then(r => r.html)
if (!isCompleteHTML) { if (!isCompleteHTML) {
html = html.replace('<html><head></head><body>', '') html = html.replace('<html><head></head><body>', '')

View File

@ -18,12 +18,11 @@
"test": "pnpm lint && pnpm build" "test": "pnpm lint && pnpm build"
}, },
"devDependencies": { "devDependencies": {
"@types/html-minifier": "4.0.5",
"@types/lodash-es": "4.17.12", "@types/lodash-es": "4.17.12",
"@unocss/reset": "0.62.3", "@unocss/reset": "0.62.3",
"critters": "0.0.24", "critters": "0.0.24",
"html-minifier": "4.0.0",
"html-validate": "8.22.0", "html-validate": "8.22.0",
"htmlnano": "2.1.1",
"jiti": "1.21.6", "jiti": "1.21.6",
"knitwork": "1.1.0", "knitwork": "1.1.0",
"lodash-es": "4.17.21", "lodash-es": "4.17.21",

View File

@ -76,7 +76,7 @@
<body class="visual-effects relative overflow-hidden min-h-screen bg-white dark:bg-black flex flex-col justify-center items-center text-center"> <body class="visual-effects relative overflow-hidden min-h-screen bg-white dark:bg-black flex flex-col justify-center items-center text-center">
<div id="mouseLight" class="absolute top-0 rounded-full mouse-gradient transition-opacity h-[200px] w-[200px]"></div> <div id="mouseLight" class="absolute top-0 rounded-full mouse-gradient transition-opacity h-[200px] w-[200px]"></div>
<a href="https://nuxt.com" target="_blank" rel="noopener" class="nuxt-logo z-20" aria-label="Nuxt"> <a href="https://nuxt.com" target="_blank" rel="noopener" class="nuxt-logo z-20" aria-label="Nuxt">
<svg id="nuxtImg" xmlns="http://www.w3.org/2000/svg" width="214" height="53" fill="none" viewBox="0 0 800 200"> <svg class="nuxt-img" xmlns="http://www.w3.org/2000/svg" width="214" height="53" fill="none" viewBox="0 0 800 200">
<path fill="#00DC82" d="M168.303 200h111.522c3.543 0 7.022-.924 10.09-2.679A20.086 20.086 0 0 0 297.3 190a19.855 19.855 0 0 0 2.7-10.001 19.858 19.858 0 0 0-2.709-9.998L222.396 41.429a20.09 20.09 0 0 0-7.384-7.32 20.313 20.313 0 0 0-10.088-2.679c-3.541 0-7.02.925-10.087 2.68a20.082 20.082 0 0 0-7.384 7.32l-19.15 32.896L130.86 9.998a20.086 20.086 0 0 0-7.387-7.32A20.322 20.322 0 0 0 113.384 0c-3.542 0-7.022.924-10.09 2.679a20.091 20.091 0 0 0-7.387 7.319L2.709 170A19.853 19.853 0 0 0 0 179.999c-.002 3.511.93 6.96 2.7 10.001a20.091 20.091 0 0 0 7.385 7.321A20.322 20.322 0 0 0 20.175 200h70.004c27.737 0 48.192-12.075 62.266-35.633l34.171-58.652 18.303-31.389 54.93 94.285h-73.233L168.303 200Zm-79.265-31.421-48.854-.011 73.232-125.706 36.541 62.853-24.466 42.01c-9.347 15.285-19.965 20.854-36.453 20.854Z" /> <path fill="#00DC82" d="M168.303 200h111.522c3.543 0 7.022-.924 10.09-2.679A20.086 20.086 0 0 0 297.3 190a19.855 19.855 0 0 0 2.7-10.001 19.858 19.858 0 0 0-2.709-9.998L222.396 41.429a20.09 20.09 0 0 0-7.384-7.32 20.313 20.313 0 0 0-10.088-2.679c-3.541 0-7.02.925-10.087 2.68a20.082 20.082 0 0 0-7.384 7.32l-19.15 32.896L130.86 9.998a20.086 20.086 0 0 0-7.387-7.32A20.322 20.322 0 0 0 113.384 0c-3.542 0-7.022.924-10.09 2.679a20.091 20.091 0 0 0-7.387 7.319L2.709 170A19.853 19.853 0 0 0 0 179.999c-.002 3.511.93 6.96 2.7 10.001a20.091 20.091 0 0 0 7.385 7.321A20.322 20.322 0 0 0 20.175 200h70.004c27.737 0 48.192-12.075 62.266-35.633l34.171-58.652 18.303-31.389 54.93 94.285h-73.233L168.303 200Zm-79.265-31.421-48.854-.011 73.232-125.706 36.541 62.853-24.466 42.01c-9.347 15.285-19.965 20.854-36.453 20.854Z" />
<path fill="currentColor" d="M377 200a4 4 0 0 0 4-4v-93s5.244 8.286 15 25l38.707 66.961c1.789 3.119 5.084 5.039 8.649 5.039H470V50h-27a4 4 0 0 0-4 4v94l-17-30-36.588-62.98c-1.792-3.108-5.081-5.02-8.639-5.02H350v150h27ZM676.203 143.857 710.551 92h-25.73a9.972 9.972 0 0 0-8.333 4.522L660.757 120.5l-15.731-23.978A9.972 9.972 0 0 0 636.693 92h-25.527l34.348 51.643L608.524 200h24.966a9.969 9.969 0 0 0 8.29-4.458l19.18-28.756 18.981 28.72a9.968 9.968 0 0 0 8.313 4.494h24.736l-36.787-56.143ZM724.598 92h19.714V60.071h28.251V92H800v24.857h-27.437V159.5c0 10.5 5.284 15.429 14.43 15.429H800V200h-16.869c-23.576 0-38.819-14.143-38.819-39.214v-43.929h-19.714V92ZM590 92h-15c-3.489 0-6.218.145-8.5 2.523-2.282 2.246-2.5 3.63-2.5 7.066v52.486c0 8.058-.376 12.962-4 16.925-3.624 3.831-8.619 5-16 5-7.247 0-12.376-1.169-16-5-3.624-3.963-4-8.867-4-16.925v-52.486c0-3.435-.218-4.82-2.5-7.066C519.218 92.145 516.489 92 513 92h-15v62.422c0 14.004 3.892 25.101 11.676 33.292C517.594 195.905 529.103 200 544 200c14.897 0 26.204-4.095 34.123-12.286 7.918-8.191 11.877-19.288 11.877-33.292V92Z" /> <path fill="currentColor" d="M377 200a4 4 0 0 0 4-4v-93s5.244 8.286 15 25l38.707 66.961c1.789 3.119 5.084 5.039 8.649 5.039H470V50h-27a4 4 0 0 0-4 4v94l-17-30-36.588-62.98c-1.792-3.108-5.081-5.02-8.639-5.02H350v150h27ZM676.203 143.857 710.551 92h-25.73a9.972 9.972 0 0 0-8.333 4.522L660.757 120.5l-15.731-23.978A9.972 9.972 0 0 0 636.693 92h-25.527l34.348 51.643L608.524 200h24.966a9.969 9.969 0 0 0 8.29-4.458l19.18-28.756 18.981 28.72a9.968 9.968 0 0 0 8.313 4.494h24.736l-36.787-56.143ZM724.598 92h19.714V60.071h28.251V92H800v24.857h-27.437V159.5c0 10.5 5.284 15.429 14.43 15.429H800V200h-16.869c-23.576 0-38.819-14.143-38.819-39.214v-43.929h-19.714V92ZM590 92h-15c-3.489 0-6.218.145-8.5 2.523-2.282 2.246-2.5 3.63-2.5 7.066v52.486c0 8.058-.376 12.962-4 16.925-3.624 3.831-8.619 5-16 5-7.247 0-12.376-1.169-16-5-3.624-3.963-4-8.867-4-16.925v-52.486c0-3.435-.218-4.82-2.5-7.066C519.218 92.145 516.489 92 513 92h-15v62.422c0 14.004 3.892 25.101 11.676 33.292C517.594 195.905 529.103 200 544 200c14.897 0 26.204-4.095 34.123-12.286 7.918-8.191 11.877-19.288 11.877-33.292V92Z" />
</svg> </svg>
@ -95,7 +95,7 @@
: !isLowPerformance : !isLowPerformance
const mouseLight = window.document.getElementById('mouseLight') const mouseLight = window.document.getElementById('mouseLight')
const nuxtImg = window.document.getElementById('nuxtImg') const nuxtImg = window.document.querySelector('.nuxt-img')
const animationToggle = window.document.getElementById('animation-toggle') const animationToggle = window.document.getElementById('animation-toggle')
const body = window.document.body const body = window.document.body
let bodyRect let bodyRect

View File

@ -11,7 +11,6 @@ import { defu } from 'defu'
import { env, nodeless } from 'unenv' import { env, nodeless } from 'unenv'
import { appendCorsHeaders, appendCorsPreflightHeaders, defineEventHandler } from 'h3' import { appendCorsHeaders, appendCorsPreflightHeaders, defineEventHandler } from 'h3'
import type { ViteConfig } from '@nuxt/schema' import type { ViteConfig } from '@nuxt/schema'
import { chunkErrorPlugin } from './plugins/chunk-error'
import type { ViteBuildContext } from './vite' import type { ViteBuildContext } from './vite'
import { devStyleSSRPlugin } from './plugins/dev-ssr-css' import { devStyleSSRPlugin } from './plugins/dev-ssr-css'
import { runtimePathsPlugin } from './plugins/paths' import { runtimePathsPlugin } from './plugins/paths'
@ -167,11 +166,6 @@ export async function buildClient (ctx: ViteBuildContext) {
clientConfig.server!.hmr = false clientConfig.server!.hmr = false
} }
// Emit chunk errors if the user has opted in to `experimental.emitRouteChunkError`
if (ctx.nuxt.options.experimental.emitRouteChunkError) {
clientConfig.plugins!.push(chunkErrorPlugin({ sourcemap: !!ctx.nuxt.options.sourcemap.client }))
}
// Inject an h3-based CORS handler in preference to vite's // Inject an h3-based CORS handler in preference to vite's
const useViteCors = clientConfig.server?.cors !== undefined const useViteCors = clientConfig.server?.cors !== undefined
if (!useViteCors) { if (!useViteCors) {

View File

@ -1,32 +0,0 @@
import MagicString from 'magic-string'
import type { Plugin } from 'vite'
const vitePreloadHelperId = '\0vite/preload-helper'
// TODO: remove this function when we upgrade to vite 5
export function chunkErrorPlugin (options: { sourcemap?: boolean }): Plugin {
return {
name: 'nuxt:chunk-error',
transform (code, id) {
// Vite 5 has an id with extension
if (!(id === vitePreloadHelperId || id === `${vitePreloadHelperId}.js`) || code.includes('nuxt.preloadError')) { return }
const s = new MagicString(code)
s.replace(/__vitePreload/g, '___vitePreload')
s.append(`
export const __vitePreload = (...args) => ___vitePreload(...args).catch(err => {
const e = new Event("nuxt.preloadError");
e.payload = err;
window.dispatchEvent(e);
throw err;
})`)
return {
code: s.toString(),
map: options.sourcemap
? s.generateMap({ hires: true })
: undefined,
}
},
}
}

View File

@ -43,7 +43,7 @@ export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptio
}, },
transform (code, id) { transform (code, id) {
if (!KEYED_FUNCTIONS_RE.test(code)) { return } if (!KEYED_FUNCTIONS_RE.test(code)) { return }
const { 0: script = code, index: codeIndex = 0 } = code.match(/(?<=<script[^>]*>)[\s\S]*?(?=<\/script>)/) || { index: 0, 0: code } const { 0: script = code, index: codeIndex = 0 } = code.match(/(?<=<script[^>]*>)[\s\S]*?(?=<\/script>)/i) || { index: 0, 0: code }
const s = new MagicString(code) const s = new MagicString(code)
// https://github.com/unjs/unplugin/issues/90 // https://github.com/unjs/unplugin/issues/90
let imports: Set<string> | undefined let imports: Set<string> | undefined

View File

@ -7,11 +7,11 @@ const script = `
if (typeof ${webpack.RuntimeGlobals.require} !== "undefined") { if (typeof ${webpack.RuntimeGlobals.require} !== "undefined") {
var _ensureChunk = ${webpack.RuntimeGlobals.ensureChunk}; var _ensureChunk = ${webpack.RuntimeGlobals.ensureChunk};
${webpack.RuntimeGlobals.ensureChunk} = function (chunkId) { ${webpack.RuntimeGlobals.ensureChunk} = function (chunkId) {
return Promise.resolve(_ensureChunk(chunkId)).catch(err => { return Promise.resolve(_ensureChunk(chunkId)).catch(error => {
const e = new Event("nuxt.preloadError"); const e = new Event('nuxt:preloadError', { cancelable: true })
e.payload = err; e.payload = error
window.dispatchEvent(e); window.dispatchEvent(e)
throw err; throw error
}); });
}; };
};` };`

View File

@ -17,6 +17,7 @@ overrides:
nuxt: workspace:* nuxt: workspace:*
postcss: 8.4.45 postcss: 8.4.45
rollup: 4.21.2 rollup: 4.21.2
send: '>=0.19.0'
typescript: 5.6.2 typescript: 5.6.2
ufo: 1.5.4 ufo: 1.5.4
vite: 5.4.4 vite: 5.4.4
@ -614,9 +615,6 @@ importers:
packages/ui-templates: packages/ui-templates:
devDependencies: devDependencies:
'@types/html-minifier':
specifier: 4.0.5
version: 4.0.5
'@types/lodash-es': '@types/lodash-es':
specifier: 4.17.12 specifier: 4.17.12
version: 4.17.12 version: 4.17.12
@ -626,12 +624,12 @@ importers:
critters: critters:
specifier: 0.0.24 specifier: 0.0.24
version: 0.0.24 version: 0.0.24
html-minifier:
specifier: 4.0.0
version: 4.0.0
html-validate: html-validate:
specifier: 8.22.0 specifier: 8.22.0
version: 8.22.0(vitest@1.6.0(@types/node@20.16.5)(happy-dom@15.7.3)(sass@1.69.4)(terser@5.27.0)) version: 8.22.0(vitest@1.6.0(@types/node@20.16.5)(happy-dom@15.7.3)(sass@1.69.4)(terser@5.27.0))
htmlnano:
specifier: 2.1.1
version: 2.1.1(cssnano@7.0.6(postcss@8.4.45))(postcss@8.4.45)(relateurl@0.2.7)(svgo@3.3.2)(terser@5.27.0)(typescript@5.6.2)
jiti: jiti:
specifier: 1.21.6 specifier: 1.21.6
version: 1.21.6 version: 1.21.6
@ -2252,9 +2250,6 @@ packages:
'@types/aria-query@5.0.4': '@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
'@types/clean-css@4.2.11':
resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==}
'@types/clear@0.1.4': '@types/clear@0.1.4':
resolution: {integrity: sha512-4nJjoilJPTbYF7Q4y5+F7JFDK8QdcwOItzwVv3RDEMWALT9Mx9UzfxCiUfpbFK05REhieXTCvhbNkiDW/Wfejw==} resolution: {integrity: sha512-4nJjoilJPTbYF7Q4y5+F7JFDK8QdcwOItzwVv3RDEMWALT9Mx9UzfxCiUfpbFK05REhieXTCvhbNkiDW/Wfejw==}
@ -2285,9 +2280,6 @@ packages:
'@types/hast@3.0.4': '@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
'@types/html-minifier@4.0.5':
resolution: {integrity: sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew==}
'@types/http-proxy@1.17.15': '@types/http-proxy@1.17.15':
resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==}
@ -2330,9 +2322,6 @@ packages:
'@types/pug@2.0.10': '@types/pug@2.0.10':
resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==}
'@types/relateurl@0.2.33':
resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==}
'@types/resolve@1.20.2': '@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
@ -2700,9 +2689,6 @@ packages:
'@vue/devtools-kit@7.4.5': '@vue/devtools-kit@7.4.5':
resolution: {integrity: sha512-Uuki4Z6Bc/ExvtlPkeDNGSAe4580R+HPcVABfTE9TF7BTz3Nntk7vxIRUyWblZkUEcB/x+wn2uofyt5i2LaUew==} resolution: {integrity: sha512-Uuki4Z6Bc/ExvtlPkeDNGSAe4580R+HPcVABfTE9TF7BTz3Nntk7vxIRUyWblZkUEcB/x+wn2uofyt5i2LaUew==}
'@vue/devtools-shared@7.4.4':
resolution: {integrity: sha512-yeJULXFHOKIm8yL2JFO050a9ztTVqOCKTqN9JHFxGTJN0b+gjtfn6zC+FfyHUgjwCwf6E3hfKrlohtthcqoYqw==}
'@vue/devtools-shared@7.4.5': '@vue/devtools-shared@7.4.5':
resolution: {integrity: sha512-2XgUOkL/7QDmyYI9J7cm+rz/qBhcGv+W5+i1fhwdQ0HQ1RowhdK66F0QBuJSz/5k12opJY8eN6m03/XZMs7imQ==} resolution: {integrity: sha512-2XgUOkL/7QDmyYI9J7cm+rz/qBhcGv+W5+i1fhwdQ0HQ1RowhdK66F0QBuJSz/5k12opJY8eN6m03/XZMs7imQ==}
@ -3122,9 +3108,6 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
camel-case@3.0.0:
resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==}
camelcase@6.3.0: camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -3218,10 +3201,6 @@ packages:
citty@0.1.6: citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
clean-css@4.2.4:
resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==}
engines: {node: '>= 4.0'}
clean-regexp@1.0.0: clean-regexp@1.0.0:
resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -3656,16 +3635,26 @@ packages:
dom-accessibility-api@0.5.16: dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
dom-serializer@2.0.0: dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
domelementtype@2.3.0: domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
domhandler@4.3.1:
resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
engines: {node: '>= 4'}
domhandler@5.0.3: domhandler@5.0.3:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
domutils@3.1.0: domutils@3.1.0:
resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
@ -3725,6 +3714,13 @@ packages:
resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
entities@3.0.1:
resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
engines: {node: '>=0.12'}
entities@4.5.0: entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
@ -4323,11 +4319,6 @@ packages:
html-escaper@2.0.2: html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
html-minifier@4.0.0:
resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==}
engines: {node: '>=6'}
hasBin: true
html-tags@3.3.1: html-tags@3.3.1:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -4354,6 +4345,38 @@ packages:
html-void-elements@3.0.0: html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
htmlnano@2.1.1:
resolution: {integrity: sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==}
peerDependencies:
cssnano: ^7.0.0
postcss: 8.4.45
purgecss: ^6.0.0
relateurl: ^0.2.7
srcset: 5.0.1
svgo: ^3.0.2
terser: ^5.10.0
uncss: ^0.17.3
peerDependenciesMeta:
cssnano:
optional: true
postcss:
optional: true
purgecss:
optional: true
relateurl:
optional: true
srcset:
optional: true
svgo:
optional: true
terser:
optional: true
uncss:
optional: true
htmlparser2@7.2.0:
resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==}
htmlparser2@8.0.2: htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
@ -4548,6 +4571,9 @@ packages:
resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
is-json@2.0.1:
resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==}
is-map@2.0.2: is-map@2.0.2:
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
@ -4875,9 +4901,6 @@ packages:
loupe@3.1.1: loupe@3.1.1:
resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==}
lower-case@1.1.4:
resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==}
lru-cache@10.4.3: lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
@ -5250,9 +5273,6 @@ packages:
xml2js: xml2js:
optional: true optional: true
no-case@2.3.2:
resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==}
node-abort-controller@3.1.1: node-abort-controller@3.1.1:
resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
@ -5437,9 +5457,6 @@ packages:
package-manager-detector@0.2.0: package-manager-detector@0.2.0:
resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==}
param-case@2.1.1:
resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==}
parent-module@1.0.1: parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -5792,6 +5809,18 @@ packages:
resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
posthtml-parser@0.11.0:
resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==}
engines: {node: '>=12'}
posthtml-render@3.0.0:
resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==}
engines: {node: '>=12'}
posthtml@0.16.6:
resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==}
engines: {node: '>=12.0.0'}
prelude-ls@1.2.1: prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@ -6138,8 +6167,8 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
send@0.18.0: send@0.19.0:
resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
serialize-javascript@6.0.2: serialize-javascript@6.0.2:
@ -6484,6 +6513,9 @@ packages:
peerDependencies: peerDependencies:
webpack: '>=4.0.0' webpack: '>=4.0.0'
timsort@0.3.0:
resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==}
tiny-invariant@1.3.1: tiny-invariant@1.3.1:
resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
@ -6624,11 +6656,6 @@ packages:
ufo@1.5.4: ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
uglify-js@3.17.4:
resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
engines: {node: '>=0.8.0'}
hasBin: true
ultrahtml@1.5.3: ultrahtml@1.5.3:
resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==}
@ -6792,9 +6819,6 @@ packages:
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
upper-case@1.1.3:
resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==}
uqr@0.1.2: uqr@0.1.2:
resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==}
@ -8603,11 +8627,6 @@ snapshots:
'@types/aria-query@5.0.4': {} '@types/aria-query@5.0.4': {}
'@types/clean-css@4.2.11':
dependencies:
'@types/node': 20.16.5
source-map: 0.6.1
'@types/clear@0.1.4': {} '@types/clear@0.1.4': {}
'@types/connect@3.4.37': '@types/connect@3.4.37':
@ -8641,12 +8660,6 @@ snapshots:
dependencies: dependencies:
'@types/unist': 3.0.2 '@types/unist': 3.0.2
'@types/html-minifier@4.0.5':
dependencies:
'@types/clean-css': 4.2.11
'@types/relateurl': 0.2.33
'@types/uglify-js': 3.17.3
'@types/http-proxy@1.17.15': '@types/http-proxy@1.17.15':
dependencies: dependencies:
'@types/node': 20.16.5 '@types/node': 20.16.5
@ -8689,8 +8702,6 @@ snapshots:
'@types/pug@2.0.10': {} '@types/pug@2.0.10': {}
'@types/relateurl@0.2.33': {}
'@types/resolve@1.20.2': {} '@types/resolve@1.20.2': {}
'@types/sass-loader@8.0.9': '@types/sass-loader@8.0.9':
@ -9315,8 +9326,8 @@ snapshots:
'@vue/devtools-core@7.4.4(vite@5.4.4(@types/node@20.16.5)(sass@1.69.4)(terser@5.27.0))(vue@3.5.4(typescript@5.6.2))': '@vue/devtools-core@7.4.4(vite@5.4.4(@types/node@20.16.5)(sass@1.69.4)(terser@5.27.0))(vue@3.5.4(typescript@5.6.2))':
dependencies: dependencies:
'@vue/devtools-kit': 7.4.4 '@vue/devtools-kit': 7.4.5
'@vue/devtools-shared': 7.4.4 '@vue/devtools-shared': 7.4.5
mitt: 3.0.1 mitt: 3.0.1
nanoid: 3.3.7 nanoid: 3.3.7
pathe: 1.1.2 pathe: 1.1.2
@ -9327,7 +9338,7 @@ snapshots:
'@vue/devtools-kit@7.4.4': '@vue/devtools-kit@7.4.4':
dependencies: dependencies:
'@vue/devtools-shared': 7.4.4 '@vue/devtools-shared': 7.4.5
birpc: 0.2.17 birpc: 0.2.17
hookable: 5.5.3 hookable: 5.5.3
mitt: 3.0.1 mitt: 3.0.1
@ -9345,10 +9356,6 @@ snapshots:
speakingurl: 14.0.1 speakingurl: 14.0.1
superjson: 2.2.1 superjson: 2.2.1
'@vue/devtools-shared@7.4.4':
dependencies:
rfdc: 1.4.1
'@vue/devtools-shared@7.4.5': '@vue/devtools-shared@7.4.5':
dependencies: dependencies:
rfdc: 1.4.1 rfdc: 1.4.1
@ -9796,11 +9803,6 @@ snapshots:
callsites@3.1.0: {} callsites@3.1.0: {}
camel-case@3.0.0:
dependencies:
no-case: 2.3.2
upper-case: 1.1.3
camelcase@6.3.0: {} camelcase@6.3.0: {}
caniuse-api@3.0.0: caniuse-api@3.0.0:
@ -9913,10 +9915,6 @@ snapshots:
dependencies: dependencies:
consola: 3.2.3 consola: 3.2.3
clean-css@4.2.4:
dependencies:
source-map: 0.6.1
clean-regexp@1.0.0: clean-regexp@1.0.0:
dependencies: dependencies:
escape-string-regexp: 1.0.5 escape-string-regexp: 1.0.5
@ -10303,6 +10301,12 @@ snapshots:
dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.5.16: {}
dom-serializer@1.4.1:
dependencies:
domelementtype: 2.3.0
domhandler: 4.3.1
entities: 2.2.0
dom-serializer@2.0.0: dom-serializer@2.0.0:
dependencies: dependencies:
domelementtype: 2.3.0 domelementtype: 2.3.0
@ -10311,10 +10315,20 @@ snapshots:
domelementtype@2.3.0: {} domelementtype@2.3.0: {}
domhandler@4.3.1:
dependencies:
domelementtype: 2.3.0
domhandler@5.0.3: domhandler@5.0.3:
dependencies: dependencies:
domelementtype: 2.3.0 domelementtype: 2.3.0
domutils@2.8.0:
dependencies:
dom-serializer: 1.4.1
domelementtype: 2.3.0
domhandler: 4.3.1
domutils@3.1.0: domutils@3.1.0:
dependencies: dependencies:
dom-serializer: 2.0.0 dom-serializer: 2.0.0
@ -10370,6 +10384,10 @@ snapshots:
graceful-fs: 4.2.11 graceful-fs: 4.2.11
tapable: 2.2.1 tapable: 2.2.1
entities@2.2.0: {}
entities@3.0.1: {}
entities@4.5.0: {} entities@4.5.0: {}
env-paths@2.2.1: {} env-paths@2.2.1: {}
@ -11179,16 +11197,6 @@ snapshots:
html-escaper@2.0.2: {} html-escaper@2.0.2: {}
html-minifier@4.0.0:
dependencies:
camel-case: 3.0.0
clean-css: 4.2.4
commander: 2.20.3
he: 1.2.0
param-case: 2.1.1
relateurl: 0.2.7
uglify-js: 3.17.4
html-tags@3.3.1: {} html-tags@3.3.1: {}
html-validate@8.22.0(vitest@1.6.0(@types/node@20.16.5)(happy-dom@15.7.3)(sass@1.69.4)(terser@5.27.0)): html-validate@8.22.0(vitest@1.6.0(@types/node@20.16.5)(happy-dom@15.7.3)(sass@1.69.4)(terser@5.27.0)):
@ -11208,6 +11216,27 @@ snapshots:
html-void-elements@3.0.0: {} html-void-elements@3.0.0: {}
htmlnano@2.1.1(cssnano@7.0.6(postcss@8.4.45))(postcss@8.4.45)(relateurl@0.2.7)(svgo@3.3.2)(terser@5.27.0)(typescript@5.6.2):
dependencies:
cosmiconfig: 9.0.0(typescript@5.6.2)
posthtml: 0.16.6
timsort: 0.3.0
optionalDependencies:
cssnano: 7.0.6(postcss@8.4.45)
postcss: 8.4.45
relateurl: 0.2.7
svgo: 3.3.2
terser: 5.27.0
transitivePeerDependencies:
- typescript
htmlparser2@7.2.0:
dependencies:
domelementtype: 2.3.0
domhandler: 4.3.1
domutils: 2.8.0
entities: 3.0.1
htmlparser2@8.0.2: htmlparser2@8.0.2:
dependencies: dependencies:
domelementtype: 2.3.0 domelementtype: 2.3.0
@ -11413,6 +11442,8 @@ snapshots:
global-directory: 4.0.1 global-directory: 4.0.1
is-path-inside: 4.0.0 is-path-inside: 4.0.0
is-json@2.0.1: {}
is-map@2.0.2: {} is-map@2.0.2: {}
is-module@1.0.0: {} is-module@1.0.0: {}
@ -11729,8 +11760,6 @@ snapshots:
dependencies: dependencies:
get-func-name: 2.0.2 get-func-name: 2.0.2
lower-case@1.1.4: {}
lru-cache@10.4.3: {} lru-cache@10.4.3: {}
lru-cache@11.0.0: {} lru-cache@11.0.0: {}
@ -12347,10 +12376,6 @@ snapshots:
- uWebSockets.js - uWebSockets.js
- webpack-sources - webpack-sources
no-case@2.3.2:
dependencies:
lower-case: 1.1.4
node-abort-controller@3.1.1: {} node-abort-controller@3.1.1: {}
node-addon-api@7.0.0: {} node-addon-api@7.0.0: {}
@ -12560,10 +12585,6 @@ snapshots:
package-manager-detector@0.2.0: {} package-manager-detector@0.2.0: {}
param-case@2.1.1:
dependencies:
no-case: 2.3.2
parent-module@1.0.1: parent-module@1.0.1:
dependencies: dependencies:
callsites: 3.1.0 callsites: 3.1.0
@ -12890,6 +12911,19 @@ snapshots:
picocolors: 1.0.1 picocolors: 1.0.1
source-map-js: 1.2.0 source-map-js: 1.2.0
posthtml-parser@0.11.0:
dependencies:
htmlparser2: 7.2.0
posthtml-render@3.0.0:
dependencies:
is-json: 2.0.1
posthtml@0.16.6:
dependencies:
posthtml-parser: 0.11.0
posthtml-render: 3.0.0
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
prettier@3.3.3: {} prettier@3.3.3: {}
@ -13140,7 +13174,8 @@ snapshots:
'@types/hast': 3.0.4 '@types/hast': 3.0.4
unist-util-visit: 5.0.0 unist-util-visit: 5.0.0
relateurl@0.2.7: {} relateurl@0.2.7:
optional: true
remark-emoji@4.0.1: remark-emoji@4.0.1:
dependencies: dependencies:
@ -13334,7 +13369,7 @@ snapshots:
semver@7.6.3: {} semver@7.6.3: {}
send@0.18.0: send@0.19.0:
dependencies: dependencies:
debug: 2.6.9 debug: 2.6.9
depd: 2.0.0 depd: 2.0.0
@ -13365,7 +13400,7 @@ snapshots:
encodeurl: 1.0.2 encodeurl: 1.0.2
escape-html: 1.0.3 escape-html: 1.0.3
parseurl: 1.3.3 parseurl: 1.3.3
send: 0.18.0 send: 0.19.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -13699,6 +13734,8 @@ snapshots:
dependencies: dependencies:
webpack: 5.94.0 webpack: 5.94.0
timsort@0.3.0: {}
tiny-invariant@1.3.1: {} tiny-invariant@1.3.1: {}
tinybench@2.8.0: {} tinybench@2.8.0: {}
@ -13800,8 +13837,6 @@ snapshots:
ufo@1.5.4: {} ufo@1.5.4: {}
uglify-js@3.17.4: {}
ultrahtml@1.5.3: {} ultrahtml@1.5.3: {}
unbuild@2.0.0(sass@1.69.4)(typescript@5.6.2)(vue-tsc@2.1.6(typescript@5.6.2)): unbuild@2.0.0(sass@1.69.4)(typescript@5.6.2)(vue-tsc@2.1.6(typescript@5.6.2)):
@ -14056,8 +14091,6 @@ snapshots:
escalade: 3.1.2 escalade: 3.1.2
picocolors: 1.0.1 picocolors: 1.0.1
upper-case@1.1.3: {}
uqr@0.1.2: {} uqr@0.1.2: {}
uri-js@4.4.1: uri-js@4.4.1:

View File

@ -697,8 +697,8 @@ describe('nuxt composables', () => {
expect(id1).toBeTruthy() expect(id1).toBeTruthy()
const matches = [ const matches = [
html.match(/<script[^>]*>\(\(\)=>\{console.log\(window\)\}\)\(\)<\/script>/), html.match(/<script[^>]*>\(\(\)=>\{console.log\(window\)\}\)\(\)<\/script>/),
html.match(new RegExp(`<script[^>]*>document.querySelectorAll\\('\\[data-prehydrate-id\\*=":${id1}:"]'\\).forEach\\(o=>{console.log\\(o.outerHTML\\)}\\)</script>`)), html.match(new RegExp(`<script[^>]*>document.querySelectorAll\\('\\[data-prehydrate-id\\*=":${id1}:"]'\\).forEach\\(o=>{console.log\\(o.outerHTML\\)}\\)</script>`, 'i')),
html.match(new RegExp(`<script[^>]*>document.querySelectorAll\\('\\[data-prehydrate-id\\*=":${id2}:"]'\\).forEach\\(o=>{console.log\\("other",o.outerHTML\\)}\\)</script>`)), html.match(new RegExp(`<script[^>]*>document.querySelectorAll\\('\\[data-prehydrate-id\\*=":${id2}:"]'\\).forEach\\(o=>{console.log\\("other",o.outerHTML\\)}\\)</script>`, 'i')),
] ]
// This tests we inject all scripts correctly, and only have one occurrence of multiple calls of a composable // This tests we inject all scripts correctly, and only have one occurrence of multiple calls of a composable
@ -1167,14 +1167,15 @@ describe('errors', () => {
}) })
// TODO: need to create test for webpack // TODO: need to create test for webpack
it.runIf(!isDev() && !isWebpack)('should handle chunk loading errors', async () => { it.runIf(!isDev())('should handle chunk loading errors', async () => {
const { page, consoleLogs } = await renderPage('/') const { page, consoleLogs } = await renderPage('/')
await page.getByText('Increment state').click() await page.getByText('Increment state').click()
await page.getByText('Increment state').click() await page.getByText('Increment state').click()
expect(await page.innerText('div')).toContain('Some value: 3') expect(await page.innerText('div')).toContain('Some value: 3')
await page.route(/.*/, route => route.abort('timedout'), { times: 1 })
await page.getByText('Chunk error').click() await page.getByText('Chunk error').click()
await page.waitForURL(url('/chunk-error')) await page.waitForURL(url('/chunk-error'))
expect(consoleLogs.map(c => c.text).join('')).toContain('caught chunk load error') expect(consoleLogs.map(c => c.text).join('')).toContain('Failed to load resource')
expect(await page.innerText('div')).toContain('Chunk error page') expect(await page.innerText('div')).toContain('Chunk error page')
await page.waitForFunction(() => window.useNuxtApp?.()._route.fullPath === '/chunk-error') await page.waitForFunction(() => window.useNuxtApp?.()._route.fullPath === '/chunk-error')
await page.locator('div').getByText('State: 3').waitFor() await page.locator('div').getByText('State: 3').waitFor()

View File

@ -1,14 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
definePageMeta({
async middleware (to, from) {
await new Promise(resolve => setTimeout(resolve, 1))
const nuxtApp = useNuxtApp()
if (import.meta.client && from !== to && !nuxtApp.isHydrating) {
// trigger a loading error when navigated to via client-side navigation
await import(/* webpackIgnore: true */ /* @vite-ignore */ `some-non-exis${''}ting-module`)
}
},
})
const someValue = useState('val', () => 1) const someValue = useState('val', () => 1)
</script> </script>

View File

@ -36,8 +36,8 @@
Immediate remove unmounted Immediate remove unmounted
</NuxtLink> </NuxtLink>
<NuxtLink <NuxtLink
no-prefetch
to="/chunk-error" to="/chunk-error"
:prefetch="false"
> >
Chunk error Chunk error
</NuxtLink> </NuxtLink>

View File

@ -1,5 +0,0 @@
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.hook('app:chunkError', () => {
console.log('caught chunk load error')
})
})