From 97e24b611df31d675042f27e56e3003cc09e8ff5 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Mon, 14 Nov 2022 19:07:29 +1100 Subject: [PATCH 01/15] feat(meta): support @vueuse/head v1 only --- packages/nuxt/package.json | 6 +- packages/nuxt/src/head/module.ts | 12 ++ packages/nuxt/src/head/runtime/composables.ts | 22 +-- packages/nuxt/src/head/runtime/index.ts | 6 +- .../head/runtime/lib/vueuse-head.plugin.ts | 60 +++----- packages/nuxt/src/imports/presets.ts | 8 - packages/schema/build.config.ts | 1 - packages/schema/package.json | 2 +- packages/schema/src/types/meta.ts | 74 +-------- pnpm-lock.yaml | 142 ++++++------------ test/basic.test.ts | 2 +- test/bundle.test.ts | 6 +- 12 files changed, 114 insertions(+), 227 deletions(-) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 1db032f8df3..15080133c31 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -44,7 +44,8 @@ "@nuxt/vite-builder": "3.0.0-rc.13", "@vue/reactivity": "^3.2.45", "@vue/shared": "^3.2.45", - "@vueuse/head": "~1.0.0-rc.14", + "@vueuse/head": "^1.0.10", + "@unhead/ssr": "^0.6.5", "chokidar": "^3.5.3", "cookie-es": "^0.5.0", "defu": "^6.1.0", @@ -82,8 +83,7 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/hash-sum": "^1.0.0", - "unbuild": "latest", - "vue-meta": "next" + "unbuild": "latest" }, "engines": { "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" diff --git a/packages/nuxt/src/head/module.ts b/packages/nuxt/src/head/module.ts index 263ced169b3..f0254c1855f 100644 --- a/packages/nuxt/src/head/module.ts +++ b/packages/nuxt/src/head/module.ts @@ -29,6 +29,18 @@ export default defineNuxtModule({ }) } + nuxt.hooks.hook('imports:sources', (sources) => { + sources.push({ + from: '#head', + imports: [ + 'useHead', + 'injectHead', + 'useServerHead', + 'useTagMetaFlat' + ] + }) + }) + // Add mixin plugin addPlugin({ src: resolve(runtimeDir, 'mixin-plugin') }) diff --git a/packages/nuxt/src/head/runtime/composables.ts b/packages/nuxt/src/head/runtime/composables.ts index d404b4f2f09..6092d24dbeb 100644 --- a/packages/nuxt/src/head/runtime/composables.ts +++ b/packages/nuxt/src/head/runtime/composables.ts @@ -1,6 +1,6 @@ -import type { MetaObject } from '@nuxt/schema' -import type { MaybeComputedRef } from '@vueuse/head' -import { useNuxtApp } from '#app' +import type { HeadEntryOptions, UseHeadInput } from '@vueuse/head' +import type { HeadAugmentations } from '@nuxt/schema' +import { useHead as _useHead, useTagMetaFlat as _useTagMetaFlat } from '@vueuse/head' /** * You can pass in a meta object, which has keys corresponding to meta tags: @@ -9,12 +9,16 @@ import { useNuxtApp } from '#app' * Alternatively, for reactive meta state, you can pass in a function * that returns a meta object. */ -export function useHead (meta: MaybeComputedRef) { - useNuxtApp()._useHead(meta) +export function useHead (input: UseHeadInput, options?: HeadEntryOptions) { + return _useHead(input, options) } -// TODO: remove useMeta support when Nuxt 3 is stable -/** @deprecated Please use new `useHead` composable instead */ -export function useMeta (meta: MaybeComputedRef) { - return useHead(meta) +export function useServerHead (input: UseHeadInput) { + if (process.server) { + return _useHead(input, { mode: 'server' }) + } } + +export { injectHead } from '@vueuse/head' + +export const useTagMetaFlat = _useTagMetaFlat diff --git a/packages/nuxt/src/head/runtime/index.ts b/packages/nuxt/src/head/runtime/index.ts index 6c8caa85f6a..a8f5fb9bed3 100644 --- a/packages/nuxt/src/head/runtime/index.ts +++ b/packages/nuxt/src/head/runtime/index.ts @@ -1,2 +1,6 @@ +import type { UseHeadInput } from '@vueuse/head' +import type { HeadAugmentations } from '@nuxt/schema' + export * from './composables' -export type { MetaObject } from '@nuxt/schema' + +export type MetaObject = UseHeadInput diff --git a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts index 1b2c412ffc2..5cdec66238e 100644 --- a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts +++ b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts @@ -1,63 +1,45 @@ -import type { HeadEntryOptions, MaybeComputedRef } from '@vueuse/head' -import { createHead, renderHeadToString } from '@vueuse/head' -import { onBeforeUnmount, getCurrentInstance } from 'vue' -import type { MetaObject } from '@nuxt/schema' -import { defineNuxtPlugin, useRouter } from '#app' +import { createHead, useHead } from '@vueuse/head' +import { defineNuxtPlugin } from '#app' // @ts-expect-error untyped import { appHead } from '#build/nuxt.config.mjs' export default defineNuxtPlugin((nuxtApp) => { const head = createHead() - head.addEntry(appHead, { resolved: true }) + head.push(appHead, { + // for SSR we don't need to hydrate this entry + mode: nuxtApp.ssrContext?.noSSR ? 'all' : 'server' + }) nuxtApp.vueApp.use(head) if (process.client) { // pause dom updates until page is ready and between page transitions let pauseDOMUpdates = true - head.hooks['before:dom'].push(() => !pauseDOMUpdates) - nuxtApp.hooks.hookOnce('app:mounted', () => { + const unpauseDom = () => { pauseDOMUpdates = false - head.updateDOM() - - // start pausing DOM updates when route changes (trigger immediately) - useRouter().beforeEach(() => { - pauseDOMUpdates = true - }) - // watch for new route before unpausing dom updates (triggered after suspense resolved) - useRouter().afterEach(() => { - // only if we have paused (clicking on a link to the current route triggers this) - if (pauseDOMUpdates) { - pauseDOMUpdates = false - head.updateDOM() - } - }) - }) - } - - nuxtApp._useHead = (_meta: MaybeComputedRef, options: HeadEntryOptions) => { - if (process.server) { - head.addEntry(_meta, options) - return + // triggers dom update + head.internalHooks.callHook('entries:updated', head.unhead) } - - const cleanUp = head.addReactiveEntry(_meta, options) - - const vm = getCurrentInstance() - if (!vm) { return } - - onBeforeUnmount(() => { - cleanUp() - head.updateDOM() + head.internalHooks.hook('dom:beforeRender', (context) => { + context.shouldRender = !pauseDOMUpdates }) + nuxtApp.hooks.hook('page:start', () => { pauseDOMUpdates = true }) + // watch for new route before unpausing dom updates (triggered after suspense resolved) + nuxtApp.hooks.hook('page:finish', unpauseDom) + nuxtApp.hooks.hook('app:mounted', unpauseDom) } + // useHead does not depend on a vue component context, we keep it on the nuxtApp for backwards compatibility + nuxtApp._useHead = useHead + if (process.server) { nuxtApp.ssrContext!.renderMeta = async () => { - const meta = await renderHeadToString(head) + const { renderSSRHead } = await import('@unhead/ssr') + const meta = await renderSSRHead(head.unhead) return { ...meta, + bodyScriptsPrepend: meta.bodyTagsOpen, // resolves naming difference with NuxtMeta and @vueuse/head bodyScripts: meta.bodyTags } diff --git a/packages/nuxt/src/imports/presets.ts b/packages/nuxt/src/imports/presets.ts index 5c29c86eeed..338550f8cf8 100644 --- a/packages/nuxt/src/imports/presets.ts +++ b/packages/nuxt/src/imports/presets.ts @@ -1,14 +1,6 @@ import { defineUnimportPreset, InlinePreset } from 'unimport' const commonPresets: InlinePreset[] = [ - // #head - defineUnimportPreset({ - from: '#head', - imports: [ - 'useHead', - 'useMeta' - ] - }), // vue-demi (mocked) defineUnimportPreset({ from: 'vue-demi', diff --git a/packages/schema/build.config.ts b/packages/schema/build.config.ts index 6ae914a75db..cce02acdc64 100644 --- a/packages/schema/build.config.ts +++ b/packages/schema/build.config.ts @@ -19,7 +19,6 @@ export default defineBuildConfig({ ], externals: [ // Type imports - 'vue-meta', 'vue-router', 'vue-bundle-renderer', '@vueuse/head', diff --git a/packages/schema/package.json b/packages/schema/package.json index 21752708542..4d024ca3374 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -17,7 +17,7 @@ "@types/lodash.template": "^4", "@types/semver": "^7", "@vitejs/plugin-vue": "^3.2.0", - "@vueuse/head": "~1.0.0-rc.14", + "@unhead/schema": "^0.6.4", "nitropack": "^0.6.1", "unbuild": "latest", "vite": "~3.2.3" diff --git a/packages/schema/src/types/meta.ts b/packages/schema/src/types/meta.ts index d79bfe55b72..03d0dce13ca 100644 --- a/packages/schema/src/types/meta.ts +++ b/packages/schema/src/types/meta.ts @@ -1,6 +1,6 @@ -import type { HeadObjectPlain, HeadObject } from '@vueuse/head' +import type { Head, MergeHead } from '@unhead/schema' -export interface HeadAugmentations { +export interface HeadAugmentations extends MergeHead { // runtime type modifications base?: {} link?: {} @@ -12,7 +12,8 @@ export interface HeadAugmentations { bodyAttrs?: {} } -export type MetaObjectRaw = HeadObjectPlain +export type MetaObjectRaw = Head +export type MetaObject = MetaObjectRaw export type AppHeadMetaObject = MetaObjectRaw & { /** @@ -29,70 +30,3 @@ export type AppHeadMetaObject = MetaObjectRaw & { */ viewport?: string } - -export interface MetaObject { - /** - * The HTML element defines the document's title that is shown in a browser's title bar or a page's tab. - * It only contains text; tags within the element are ignored. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title - */ - title?: HeadObject<HeadAugmentations>['title'] - /** - * Generate the title from a template. - */ - titleTemplate?: HeadObject<HeadAugmentations>['titleTemplate'] - /** - * The <base> HTML element specifies the base URL to use for all relative URLs in a document. - * There can be only one <base> element in a document. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base - */ - base?: HeadObject<HeadAugmentations>['base'] - /** - * The <link> HTML element specifies relationships between the current document and an external resource. - * This element is most commonly used to link to stylesheets, but is also used to establish site icons - * (both "favicon" style icons and icons for the home screen and apps on mobile devices) among other things. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-as - */ - link?: HeadObject<HeadAugmentations>['link'] - /** - * The <meta> element represents metadata that cannot be expressed in other HTML elements, like <link> or <script>. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta - */ - meta?: HeadObject<HeadAugmentations>['meta'] - /** - * The <style> HTML element contains style information for a document, or part of a document. - * It contains CSS, which is applied to the contents of the document containing the <style> element. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style - */ - style?: HeadObject<HeadAugmentations>['style'] - /** - * The <script> HTML element is used to embed executable code or data; this is typically used to embed or refer to JavaScript code. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script - */ - script?: HeadObject<HeadAugmentations>['script'] - /** - * The <noscript> HTML element defines a section of HTML to be inserted if a script type on the page is unsupported - * or if scripting is currently turned off in the browser. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript - */ - noscript?: HeadObject<HeadAugmentations>['noscript'] - /** - * Attributes for the <html> HTML element. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/html - */ - htmlAttrs?: HeadObject<HeadAugmentations>['htmlAttrs'] - /** - * Attributes for the <body> HTML element. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body - */ - bodyAttrs?: HeadObject<HeadAugmentations>['bodyAttrs'] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3c0db84163..b274cbac5ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -417,9 +417,10 @@ importers: '@nuxt/vite-builder': workspace:* '@types/fs-extra': ^9.0.13 '@types/hash-sum': ^1.0.0 + '@unhead/ssr': ^0.6.5 '@vue/reactivity': ^3.2.45 '@vue/shared': ^3.2.45 - '@vueuse/head': ~1.0.0-rc.14 + '@vueuse/head': ^1.0.10 chokidar: ^3.5.3 cookie-es: ^0.5.0 defu: ^6.1.0 @@ -453,7 +454,6 @@ importers: vue: 3.2.45 vue-bundle-renderer: ^0.5.0 vue-devtools-stub: ^0.1.0 - vue-meta: next vue-router: ^4.1.6 dependencies: '@nuxt/devalue': 2.0.0 @@ -462,9 +462,10 @@ importers: '@nuxt/telemetry': 2.1.6 '@nuxt/ui-templates': 0.4.0 '@nuxt/vite-builder': link:../vite + '@unhead/ssr': 0.6.5 '@vue/reactivity': 3.2.45 '@vue/shared': 3.2.45 - '@vueuse/head': 1.0.0-rc.14_vue@3.2.45 + '@vueuse/head': 1.0.10_vue@3.2.45 chokidar: 3.5.3 cookie-es: 0.5.0 defu: 6.1.0 @@ -502,14 +503,13 @@ importers: '@types/fs-extra': 9.0.13 '@types/hash-sum': 1.0.0 unbuild: 0.9.4 - vue-meta: 3.0.0-alpha.2_vue@3.2.45 packages/schema: specifiers: '@types/lodash.template': ^4 '@types/semver': ^7 + '@unhead/schema': ^0.6.4 '@vitejs/plugin-vue': ^3.2.0 - '@vueuse/head': ~1.0.0-rc.14 c12: ^0.2.13 create-require: ^1.1.1 defu: ^6.1.0 @@ -541,8 +541,8 @@ importers: devDependencies: '@types/lodash.template': 4.5.1 '@types/semver': 7.3.12 + '@unhead/schema': 0.6.4 '@vitejs/plugin-vue': 3.2.0_vite@3.2.3 - '@vueuse/head': 1.0.0-rc.14 nitropack: 0.6.1 unbuild: 0.9.4 vite: 3.2.3 @@ -2083,6 +2083,42 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@unhead/dom/0.6.5: + resolution: {integrity: sha512-WjxjWAaePUQAPzMwSOmO8fTRpmaVmhfoVIxySUHTHD3bOcbkQTNN13q5YB3ljxMmQ56iZfGnuXoaJ+hNYHqscw==} + dependencies: + '@unhead/schema': 0.6.5 + dev: false + + /@unhead/schema/0.6.4: + resolution: {integrity: sha512-PqsqIzxFPXFzsTWU9Rkl3JXJt6yY3V0xKVvUwVM3XhxaiIceb8nKon6MwZAG4tU5dFMrITZlIoaEV4vH8avhiQ==} + dependencies: + '@zhead/schema': 1.0.0-beta.13 + hookable: 5.4.1 + dev: true + + /@unhead/schema/0.6.5: + resolution: {integrity: sha512-a9OQ0yCoT+ej3QfEWlh/GS6hNBBmD0pag0M6JyncrWUYXVGZw1LP8jD8X5zw9tPtN0SLR2hYlsmDj1VH+6rhXA==} + dependencies: + '@zhead/schema': 1.0.0-beta.13 + hookable: 5.4.1 + dev: false + + /@unhead/ssr/0.6.5: + resolution: {integrity: sha512-8KxWD5rxgEuAWJ0dAygE711B87D2aCQqThKtg0D5bLdr5HtxIckfNIH+AuurD7h5z3fOizyCZsQ/BqJpzlknQA==} + dependencies: + '@unhead/schema': 0.6.5 + dev: false + + /@unhead/vue/0.6.5_vue@3.2.45: + resolution: {integrity: sha512-qRLJXG0GkGZhV/o57hEIpBZxbu9QQZ1is3v+lZlhNI44KXeZS3YVfdqsvGK1VHRjEGyo4HAuNzFeDRjVV3M5cQ==} + peerDependencies: + vue: '>=2.7 || >=3' + dependencies: + '@unhead/schema': 0.6.5 + hookable: 5.4.1 + vue: 3.2.45 + dev: false + /@unocss/astro/0.45.25: resolution: {integrity: sha512-TxFxESIvSZtaVIRP/cDyrwnYlHz78mG9ohhAhI0adLGi0v0yBwoGJ1krlqxAuTzhV191InTlwD/C5QevTsf86Q==} dependencies: @@ -2546,29 +2582,16 @@ packages: - vue dev: true - /@vueuse/head/1.0.0-rc.14: - resolution: {integrity: sha512-3DtOfSE1141IKPIq4AR5UXQZPWQFSd7E5f3M+HkBRyxWsyxbNBBmK5hqkSYc2ENoFXa3xPhLYZXJPKuxqfJmiA==} - peerDependencies: - vue: '>=2.7 || >=3' - dependencies: - '@vueuse/shared': 9.4.0 - '@zhead/schema': 0.9.9 - '@zhead/schema-vue': 0.9.9 - transitivePeerDependencies: - - '@vue/composition-api' - dev: true - - /@vueuse/head/1.0.0-rc.14_vue@3.2.45: - resolution: {integrity: sha512-3DtOfSE1141IKPIq4AR5UXQZPWQFSd7E5f3M+HkBRyxWsyxbNBBmK5hqkSYc2ENoFXa3xPhLYZXJPKuxqfJmiA==} + /@vueuse/head/1.0.10_vue@3.2.45: + resolution: {integrity: sha512-fRKhAWv7mpP6vQQ4TOg4hHeSbBptQm26XBAQ2Q4deP/bsaSXaW2GSJyhrmXCV8piRb/FZRXg3xkFQNcYDZwryg==} peerDependencies: vue: '>=2.7 || >=3' dependencies: - '@vueuse/shared': 9.4.0_vue@3.2.45 - '@zhead/schema': 0.9.9 - '@zhead/schema-vue': 0.9.9_vue@3.2.45 + '@unhead/dom': 0.6.5 + '@unhead/schema': 0.6.5 + '@unhead/ssr': 0.6.5 + '@unhead/vue': 0.6.5_vue@3.2.45 vue: 3.2.45 - transitivePeerDependencies: - - '@vue/composition-api' dev: false /@vueuse/integrations/9.3.0_focus-trap@7.0.0: @@ -2644,24 +2667,6 @@ packages: - vue dev: true - /@vueuse/shared/9.4.0: - resolution: {integrity: sha512-fTuem51KwMCnqUKkI8B57qAIMcFovtGgsCtAeqxIzH3i6nE9VYge+gVfneNHAAy7lj8twbkNfqQSygOPJTm4tQ==} - dependencies: - vue-demi: 0.13.11 - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - - /@vueuse/shared/9.4.0_vue@3.2.45: - resolution: {integrity: sha512-fTuem51KwMCnqUKkI8B57qAIMcFovtGgsCtAeqxIzH3i6nE9VYge+gVfneNHAAy7lj8twbkNfqQSygOPJTm4tQ==} - dependencies: - vue-demi: 0.13.11_vue@3.2.45 - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - /@webassemblyjs/ast/1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: @@ -2759,31 +2764,8 @@ packages: /@xtuc/long/4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - /@zhead/schema-vue/0.9.9: - resolution: {integrity: sha512-f7sOPMc1zQJ+tDDWWaksNsGoGGuRv5aHvOdZvsL3dIxbiHVlGVhDi/HZbUUupCtlYAPv2D8E/tUmwWKh/UrbXw==} - peerDependencies: - vue: '>=2.7 || >=3' - dependencies: - '@vueuse/shared': 9.4.0 - '@zhead/schema': 0.9.9 - transitivePeerDependencies: - - '@vue/composition-api' - dev: true - - /@zhead/schema-vue/0.9.9_vue@3.2.45: - resolution: {integrity: sha512-f7sOPMc1zQJ+tDDWWaksNsGoGGuRv5aHvOdZvsL3dIxbiHVlGVhDi/HZbUUupCtlYAPv2D8E/tUmwWKh/UrbXw==} - peerDependencies: - vue: '>=2.7 || >=3' - dependencies: - '@vueuse/shared': 9.4.0_vue@3.2.45 - '@zhead/schema': 0.9.9 - vue: 3.2.45 - transitivePeerDependencies: - - '@vue/composition-api' - dev: false - - /@zhead/schema/0.9.9: - resolution: {integrity: sha512-B/No5zsZB1gz6BT7OKcD0rbyZCGoF6ImeQm2ffupQrgUpYAIv/LGtn3RVNSOcX2R2DB4g79UtuIwK0OxugFjJQ==} + /@zhead/schema/1.0.0-beta.13: + resolution: {integrity: sha512-P1A1vRGFBhITco8Iw4/hvnDYoE/SoVrd71dW1pBFdXJb3vP+pBtoOuhbEKy0ROJGOyzQuqvFibcwzyLlWMqNiQ==} /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -8884,21 +8866,6 @@ packages: optional: true dev: true - /vue-demi/0.13.11_vue@3.2.45: - resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - dependencies: - vue: 3.2.45 - dev: false - /vue-devtools-stub/0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} dev: false @@ -8940,15 +8907,6 @@ packages: webpack: 5.75.0 dev: false - /vue-meta/3.0.0-alpha.2_vue@3.2.45: - resolution: {integrity: sha512-mLDB/vGjn2Q58IFKs5Dtp/STWZ0sEbkdM67u+YXuMreK5EjNHnqhcylQb+xn50pwxCdQD98nGgJlEXkh16Hqug==} - peerDependencies: - '@vue/server-renderer': ^3.0.6 - vue: ^3.0.0 - dependencies: - vue: 3.2.45 - dev: true - /vue-router/4.1.6_vue@3.2.45: resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} peerDependencies: diff --git a/test/basic.test.ts b/test/basic.test.ts index cb91e963803..b66407d5d2d 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -253,7 +253,7 @@ describe('head tags', () => { expect(headHtml).toMatch(/<html[^>]*class="html-attrs-test"/) expect(headHtml).toMatch(/<body[^>]*class="body-attrs-test"/) expect(headHtml).toContain('script>console.log("works with useMeta too")</script>') - expect(headHtml).toContain('<script src="https://a-body-appended-script.com" data-meta-body></script></body>') + expect(headHtml).toContain('<script src="https://a-body-appended-script.com"></script></body>') const indexHtml = await $fetch('/') // should render charset by default diff --git a/test/bundle.test.ts b/test/bundle.test.ts index fa515f9116e..363c271b81b 100644 --- a/test/bundle.test.ts +++ b/test/bundle.test.ts @@ -33,6 +33,7 @@ describe.skipIf(isWindows)('minimal nuxt application', () => { "_nuxt/error-404.js", "_nuxt/error-500.js", "_nuxt/error-component.js", + "_nuxt/index.js", ] `) }) @@ -51,6 +52,9 @@ describe.skipIf(isWindows)('minimal nuxt application', () => { expect(packages).toMatchInlineSnapshot(` [ "@babel/parser", + "@unhead/dom", + "@unhead/ssr", + "@unhead/vue", "@vue/compiler-core", "@vue/compiler-dom", "@vue/compiler-ssr", @@ -59,7 +63,6 @@ describe.skipIf(isWindows)('minimal nuxt application', () => { "@vue/runtime-dom", "@vue/server-renderer", "@vue/shared", - "@vueuse/shared", "buffer-from", "cookie-es", "defu", @@ -81,7 +84,6 @@ describe.skipIf(isWindows)('minimal nuxt application', () => { "unstorage", "vue", "vue-bundle-renderer", - "vue-demi", ] `) }) From c245c8aa437b67c474003e711c700719c979af86 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Mon, 14 Nov 2022 22:40:46 +1100 Subject: [PATCH 02/15] chore: progress commit --- docs/content/3.api/1.composables/use-head.md | 8 ++-- packages/nuxt/package.json | 5 ++- packages/nuxt/src/app/nuxt.ts | 2 + packages/nuxt/src/core/nitro.ts | 8 ++++ .../nuxt/src/core/runtime/nitro/renderer.ts | 5 ++- packages/nuxt/src/head/module.ts | 9 ++-- packages/nuxt/src/head/runtime/composables.ts | 10 +++-- .../src/head/runtime/lib/vue-meta.plugin.ts | 43 ------------------- .../head/runtime/lib/vueuse-head.plugin.ts | 3 ++ packages/nuxt/src/imports/presets.ts | 9 ++++ 10 files changed, 42 insertions(+), 60 deletions(-) delete mode 100644 packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts diff --git a/docs/content/3.api/1.composables/use-head.md b/docs/content/3.api/1.composables/use-head.md index 8fb170a0df2..3a3f03ae590 100644 --- a/docs/content/3.api/1.composables/use-head.md +++ b/docs/content/3.api/1.composables/use-head.md @@ -4,11 +4,9 @@ description: useHead customizes the head properties of individual pages of your # `useHead` -Nuxt provides the `useHead` composable to add and customize the head properties of individual pages of your Nuxt app. It uses [@vueuse/head](https://github.com/vueuse/head) under the hood. +Nuxt provides the `useHead` composable to add and customize the head properties of individual pages of your Nuxt app. -::alert{icon=👉} -`useHead` only works during `setup` or `Lifecycle Hooks`. -:: +`useHead` is powered by [@vueuse/head](https://github.com/vueuse/head), you can find more in-depth documentation [here](https://unhead.harlanzw.com/) ::ReadMore{link="/getting-started/seo-meta"} :: @@ -19,7 +17,7 @@ Nuxt provides the `useHead` composable to add and customize the head properties useHead(meta: MaybeComputedRef<MetaObject>): void ``` -Below are the non-reactive types for `useMeta`. See [zhead](https://github.com/harlan-zw/zhead/tree/main/packages/schema/src) for more detailed types. +Below are the non-reactive types for `useHead`. See [zhead](https://github.com/harlan-zw/zhead/tree/main/packages/schema/src) for more detailed types. ```ts interface MetaObject { diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 15080133c31..f3435c0c5c8 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -44,8 +44,9 @@ "@nuxt/vite-builder": "3.0.0-rc.13", "@vue/reactivity": "^3.2.45", "@vue/shared": "^3.2.45", - "@vueuse/head": "^1.0.10", - "@unhead/ssr": "^0.6.5", + "@vueuse/head": "^1.0.11", + "unhead": "^0.6.6", + "@unhead/ssr": "^0.6.6", "chokidar": "^3.5.3", "cookie-es": "^0.5.0", "defu": "^6.1.0", diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index d7a4d8e5346..2afa16b978f 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -6,6 +6,7 @@ import type { RuntimeConfig, AppConfigInput } from '@nuxt/schema' import { getContext } from 'unctx' import type { SSRContext } from 'vue-bundle-renderer/runtime' import type { H3Event } from 'h3' +import type { HeadTag } from '@vueuse/head' const nuxtAppCtx = getContext<NuxtApp>('nuxt-app') @@ -37,6 +38,7 @@ export interface RuntimeNuxtHooks { 'page:transition:finish': (Component?: VNode) => HookResult 'vue:setup': () => void 'vue:error': (...args: Parameters<Parameters<typeof onErrorCaptured>[0]>) => HookResult + 'head:tags:resolve': (ctx: { tags: HeadTag[] }) => HookResult } export interface NuxtSSRContext extends SSRContext { diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index c075a3efceb..706ff7ef003 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -8,6 +8,8 @@ import defu from 'defu' import fsExtra from 'fs-extra' import { dynamicEventHandler } from 'h3' import type { Plugin } from 'rollup' +import { createHeadCore } from 'unhead' +import { renderSSRHead } from '@unhead/ssr' import { distDir } from '../dirs' import { ImportProtectionPlugin } from './plugins/import-protection' @@ -114,6 +116,12 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { } }) + // Add head chunk for SPA renders + const head = createHeadCore() + head.push(nuxt.options.app.head) + const headChunk = await renderSSRHead(head) + nitroConfig.virtual!['#head-static'] = `export default ${JSON.stringify(headChunk)}` + // Add fallback server for `ssr: false` if (!nuxt.options.ssr) { nitroConfig.virtual!['#build/dist/server/server.mjs'] = 'export default () => {}' diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index 092900d521e..23015b05ad2 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -41,6 +41,9 @@ const getClientManifest: () => Promise<Manifest> = () => import('#build/dist/ser .then(r => r.default || r) .then(r => typeof r === 'function' ? r() : r) as Promise<ClientManifest> +// @ts-ignore +const getStaticRenderedHead = () : Promise<NuxtMeta> => import('#head-static').then(r => r.default || r) + // @ts-ignore const getServerEntry = () => import('#build/dist/server/server.mjs').then(r => r.default || r) @@ -102,7 +105,7 @@ const getSPARenderer = lazyCachedFunction(async () => { data: {}, state: {} } - ssrContext!.renderMeta = ssrContext!.renderMeta ?? (() => ({})) + ssrContext!.renderMeta = ssrContext!.renderMeta ?? getStaticRenderedHead return Promise.resolve(result) } diff --git a/packages/nuxt/src/head/module.ts b/packages/nuxt/src/head/module.ts index f0254c1855f..eaada749bd6 100644 --- a/packages/nuxt/src/head/module.ts +++ b/packages/nuxt/src/head/module.ts @@ -29,14 +29,13 @@ export default defineNuxtModule({ }) } + // add non useHead composables nuxt.hooks.hook('imports:sources', (sources) => { sources.push({ - from: '#head', + from: '@vueuse/head', imports: [ - 'useHead', - 'injectHead', - 'useServerHead', - 'useTagMetaFlat' + 'useSeoMeta', + 'injectHead' ] }) }) diff --git a/packages/nuxt/src/head/runtime/composables.ts b/packages/nuxt/src/head/runtime/composables.ts index 6092d24dbeb..d95db435b9d 100644 --- a/packages/nuxt/src/head/runtime/composables.ts +++ b/packages/nuxt/src/head/runtime/composables.ts @@ -1,6 +1,6 @@ import type { HeadEntryOptions, UseHeadInput } from '@vueuse/head' import type { HeadAugmentations } from '@nuxt/schema' -import { useHead as _useHead, useTagMetaFlat as _useTagMetaFlat } from '@vueuse/head' +import { useHead as _useHead } from '@vueuse/head' /** * You can pass in a meta object, which has keys corresponding to meta tags: @@ -19,6 +19,8 @@ export function useServerHead<T extends HeadAugmentations> (input: UseHeadInput< } } -export { injectHead } from '@vueuse/head' - -export const useTagMetaFlat = _useTagMetaFlat +// TODO: remove useMeta support when Nuxt 3 is stable +/** @deprecated Please use new `useHead` composable instead */ +export function useMeta<T extends HeadAugmentations> (input: UseHeadInput<T>) { + return useHead(input) +} diff --git a/packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts b/packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts deleted file mode 100644 index ecdc4d689ae..00000000000 --- a/packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { createApp } from 'vue' -import { createMetaManager } from 'vue-meta' -import type { MetaObject } from '..' -import { defineNuxtPlugin } from '#app' -// @ts-expect-error untyped -import { appHead } from '#build/nuxt.config.mjs' - -export default defineNuxtPlugin((nuxtApp) => { - // @ts-expect-error missing resolver - const manager = createMetaManager(process.server) - manager.addMeta(appHead) - - nuxtApp.vueApp.use(manager) - - nuxtApp._useHead = (meta: MetaObject) => manager.addMeta(meta) - - if (process.client) { - const teleportTarget = document.createElement('div') - teleportTarget.id = 'head-target' - document.body.appendChild(teleportTarget) - - createApp({ render: () => manager.render({}) }).mount('#head-target') - } - - if (process.server) { - nuxtApp.ssrContext!.renderMeta = async () => { - // @ts-ignore - const { renderMetaToString } = await import('vue-meta/ssr') - nuxtApp.ssrContext!.teleports = nuxtApp.ssrContext!.teleports || {} - - await renderMetaToString(nuxtApp.app, nuxtApp.ssrContext) - - return { - htmlAttrs: nuxtApp.ssrContext!.teleports.htmlAttrs || '', - headAttrs: nuxtApp.ssrContext!.teleports.headAttrs || '', - bodyAttrs: nuxtApp.ssrContext!.teleports.bodyAttrs || '', - headTags: nuxtApp.ssrContext!.teleports.head || '', - bodyScriptsPrepend: nuxtApp.ssrContext!.teleports['body-prepend'] || '', - bodyScripts: nuxtApp.ssrContext!.teleports.body || '' - } - } - } -}) diff --git a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts index 5cdec66238e..c25f154e0c3 100644 --- a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts +++ b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts @@ -30,6 +30,9 @@ export default defineNuxtPlugin((nuxtApp) => { nuxtApp.hooks.hook('app:mounted', unpauseDom) } + // basic support for users to modify tags before render + head.internalHooks.hook('tags:resolve', ctx => nuxtApp.hooks.callHook('head:tags:resolve', ctx)) + // useHead does not depend on a vue component context, we keep it on the nuxtApp for backwards compatibility nuxtApp._useHead = useHead diff --git a/packages/nuxt/src/imports/presets.ts b/packages/nuxt/src/imports/presets.ts index 338550f8cf8..a80a6b164a4 100644 --- a/packages/nuxt/src/imports/presets.ts +++ b/packages/nuxt/src/imports/presets.ts @@ -1,6 +1,15 @@ import { defineUnimportPreset, InlinePreset } from 'unimport' const commonPresets: InlinePreset[] = [ + // #head + defineUnimportPreset({ + from: '#head', + imports: [ + 'useHead', + 'useMeta', + 'useServerHead' + ] + }), // vue-demi (mocked) defineUnimportPreset({ from: 'vue-demi', From 331be2fa977b9835b787429ba06b50d20fb29e98 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Mon, 14 Nov 2022 22:51:15 +1100 Subject: [PATCH 03/15] chore: progress commit --- packages/nuxt/package.json | 3 +- .../src/head/runtime/lib/vue-meta.plugin.ts | 43 +++++++++++ .../head/runtime/lib/vueuse-head.plugin.ts | 1 + packages/schema/build.config.ts | 1 + packages/schema/package.json | 2 +- pnpm-lock.yaml | 75 +++++++++++-------- 6 files changed, 92 insertions(+), 33 deletions(-) create mode 100644 packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index f3435c0c5c8..96ef4496fd1 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -84,7 +84,8 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/hash-sum": "^1.0.0", - "unbuild": "latest" + "unbuild": "latest", + "vue-meta": "next" }, "engines": { "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" diff --git a/packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts b/packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts new file mode 100644 index 00000000000..ecdc4d689ae --- /dev/null +++ b/packages/nuxt/src/head/runtime/lib/vue-meta.plugin.ts @@ -0,0 +1,43 @@ +import { createApp } from 'vue' +import { createMetaManager } from 'vue-meta' +import type { MetaObject } from '..' +import { defineNuxtPlugin } from '#app' +// @ts-expect-error untyped +import { appHead } from '#build/nuxt.config.mjs' + +export default defineNuxtPlugin((nuxtApp) => { + // @ts-expect-error missing resolver + const manager = createMetaManager(process.server) + manager.addMeta(appHead) + + nuxtApp.vueApp.use(manager) + + nuxtApp._useHead = (meta: MetaObject) => manager.addMeta(meta) + + if (process.client) { + const teleportTarget = document.createElement('div') + teleportTarget.id = 'head-target' + document.body.appendChild(teleportTarget) + + createApp({ render: () => manager.render({}) }).mount('#head-target') + } + + if (process.server) { + nuxtApp.ssrContext!.renderMeta = async () => { + // @ts-ignore + const { renderMetaToString } = await import('vue-meta/ssr') + nuxtApp.ssrContext!.teleports = nuxtApp.ssrContext!.teleports || {} + + await renderMetaToString(nuxtApp.app, nuxtApp.ssrContext) + + return { + htmlAttrs: nuxtApp.ssrContext!.teleports.htmlAttrs || '', + headAttrs: nuxtApp.ssrContext!.teleports.headAttrs || '', + bodyAttrs: nuxtApp.ssrContext!.teleports.bodyAttrs || '', + headTags: nuxtApp.ssrContext!.teleports.head || '', + bodyScriptsPrepend: nuxtApp.ssrContext!.teleports['body-prepend'] || '', + bodyScripts: nuxtApp.ssrContext!.teleports.body || '' + } + } + } +}) diff --git a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts index c25f154e0c3..f4abee2f569 100644 --- a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts +++ b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts @@ -8,6 +8,7 @@ export default defineNuxtPlugin((nuxtApp) => { head.push(appHead, { // for SSR we don't need to hydrate this entry + // @todo conditionally skip this for SPA, we are hydrating when we don't need to mode: nuxtApp.ssrContext?.noSSR ? 'all' : 'server' }) diff --git a/packages/schema/build.config.ts b/packages/schema/build.config.ts index cce02acdc64..6ae914a75db 100644 --- a/packages/schema/build.config.ts +++ b/packages/schema/build.config.ts @@ -19,6 +19,7 @@ export default defineBuildConfig({ ], externals: [ // Type imports + 'vue-meta', 'vue-router', 'vue-bundle-renderer', '@vueuse/head', diff --git a/packages/schema/package.json b/packages/schema/package.json index 4d024ca3374..97ca7ce7045 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -17,7 +17,7 @@ "@types/lodash.template": "^4", "@types/semver": "^7", "@vitejs/plugin-vue": "^3.2.0", - "@unhead/schema": "^0.6.4", + "@unhead/schema": "^0.6.6", "nitropack": "^0.6.1", "unbuild": "latest", "vite": "~3.2.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b274cbac5ae..3c603283978 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -417,10 +417,10 @@ importers: '@nuxt/vite-builder': workspace:* '@types/fs-extra': ^9.0.13 '@types/hash-sum': ^1.0.0 - '@unhead/ssr': ^0.6.5 + '@unhead/ssr': ^0.6.6 '@vue/reactivity': ^3.2.45 '@vue/shared': ^3.2.45 - '@vueuse/head': ^1.0.10 + '@vueuse/head': ^1.0.11 chokidar: ^3.5.3 cookie-es: ^0.5.0 defu: ^6.1.0 @@ -448,12 +448,14 @@ importers: unbuild: ^0.9.4 unctx: ^2.0.2 unenv: ^0.6.2 + unhead: ^0.6.6 unimport: ^0.7.0 unplugin: ^0.10.2 untyped: ^0.5.0 vue: 3.2.45 vue-bundle-renderer: ^0.5.0 vue-devtools-stub: ^0.1.0 + vue-meta: next vue-router: ^4.1.6 dependencies: '@nuxt/devalue': 2.0.0 @@ -462,10 +464,10 @@ importers: '@nuxt/telemetry': 2.1.6 '@nuxt/ui-templates': 0.4.0 '@nuxt/vite-builder': link:../vite - '@unhead/ssr': 0.6.5 + '@unhead/ssr': 0.6.6 '@vue/reactivity': 3.2.45 '@vue/shared': 3.2.45 - '@vueuse/head': 1.0.10_vue@3.2.45 + '@vueuse/head': 1.0.11_vue@3.2.45 chokidar: 3.5.3 cookie-es: 0.5.0 defu: 6.1.0 @@ -492,6 +494,7 @@ importers: ultrahtml: 1.0.0 unctx: 2.0.2 unenv: 0.6.2 + unhead: 0.6.6 unimport: 0.7.0 unplugin: 0.10.2 untyped: 0.5.0 @@ -503,12 +506,13 @@ importers: '@types/fs-extra': 9.0.13 '@types/hash-sum': 1.0.0 unbuild: 0.9.4 + vue-meta: 3.0.0-alpha.2_vue@3.2.45 packages/schema: specifiers: '@types/lodash.template': ^4 '@types/semver': ^7 - '@unhead/schema': ^0.6.4 + '@unhead/schema': ^0.6.6 '@vitejs/plugin-vue': ^3.2.0 c12: ^0.2.13 create-require: ^1.1.1 @@ -541,7 +545,7 @@ importers: devDependencies: '@types/lodash.template': 4.5.1 '@types/semver': 7.3.12 - '@unhead/schema': 0.6.4 + '@unhead/schema': 0.6.6 '@vitejs/plugin-vue': 3.2.0_vite@3.2.3 nitropack: 0.6.1 unbuild: 0.9.4 @@ -2083,38 +2087,30 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@unhead/dom/0.6.5: - resolution: {integrity: sha512-WjxjWAaePUQAPzMwSOmO8fTRpmaVmhfoVIxySUHTHD3bOcbkQTNN13q5YB3ljxMmQ56iZfGnuXoaJ+hNYHqscw==} + /@unhead/dom/0.6.6: + resolution: {integrity: sha512-iKKv6s+oRvsvF3EeHE1n5xVf2oKtED1M4q0ECzFmM+oSihGUGzZJAn+UgN5MOcx1ilJQcHxBQQwzO9pppW/3aQ==} dependencies: - '@unhead/schema': 0.6.5 + '@unhead/schema': 0.6.6 dev: false - /@unhead/schema/0.6.4: - resolution: {integrity: sha512-PqsqIzxFPXFzsTWU9Rkl3JXJt6yY3V0xKVvUwVM3XhxaiIceb8nKon6MwZAG4tU5dFMrITZlIoaEV4vH8avhiQ==} + /@unhead/schema/0.6.6: + resolution: {integrity: sha512-hcJLBTW7LlS1KzaUZ4nxBFaQmx3g7SxfJyX37/UET2JlH+8ycQgojFCZbnrHn5QIJz7zU1VcWv9gGfeS9i2lSQ==} dependencies: '@zhead/schema': 1.0.0-beta.13 hookable: 5.4.1 - dev: true - - /@unhead/schema/0.6.5: - resolution: {integrity: sha512-a9OQ0yCoT+ej3QfEWlh/GS6hNBBmD0pag0M6JyncrWUYXVGZw1LP8jD8X5zw9tPtN0SLR2hYlsmDj1VH+6rhXA==} - dependencies: - '@zhead/schema': 1.0.0-beta.13 - hookable: 5.4.1 - dev: false - /@unhead/ssr/0.6.5: - resolution: {integrity: sha512-8KxWD5rxgEuAWJ0dAygE711B87D2aCQqThKtg0D5bLdr5HtxIckfNIH+AuurD7h5z3fOizyCZsQ/BqJpzlknQA==} + /@unhead/ssr/0.6.6: + resolution: {integrity: sha512-Dmt6E5BqJ3HRLh5fSlICCJ1YtYoyijl1jXdJ+D6jXHN8ut21/65qiwGPNPQOXAwBtBLLRRX3yvvDvTtlWN+zLQ==} dependencies: - '@unhead/schema': 0.6.5 + '@unhead/schema': 0.6.6 dev: false - /@unhead/vue/0.6.5_vue@3.2.45: - resolution: {integrity: sha512-qRLJXG0GkGZhV/o57hEIpBZxbu9QQZ1is3v+lZlhNI44KXeZS3YVfdqsvGK1VHRjEGyo4HAuNzFeDRjVV3M5cQ==} + /@unhead/vue/0.6.6_vue@3.2.45: + resolution: {integrity: sha512-oXkWEbW8astq5xhIS7HS+q6Q9vT/HGYM/gaHUpHQlXVFwc2t7KcBcDoFQMONLLw/eEovMudnwUGXRi6/8kwz8Q==} peerDependencies: vue: '>=2.7 || >=3' dependencies: - '@unhead/schema': 0.6.5 + '@unhead/schema': 0.6.6 hookable: 5.4.1 vue: 3.2.45 dev: false @@ -2582,15 +2578,15 @@ packages: - vue dev: true - /@vueuse/head/1.0.10_vue@3.2.45: - resolution: {integrity: sha512-fRKhAWv7mpP6vQQ4TOg4hHeSbBptQm26XBAQ2Q4deP/bsaSXaW2GSJyhrmXCV8piRb/FZRXg3xkFQNcYDZwryg==} + /@vueuse/head/1.0.11_vue@3.2.45: + resolution: {integrity: sha512-0cHoXAS0YsIju6672uGnk7T7MmXcmhUi8mFXuKQhjFykdTqkHM0QhmZtEGyxqtcXHo3nrnt9tUeEhviXOTyAqg==} peerDependencies: vue: '>=2.7 || >=3' dependencies: - '@unhead/dom': 0.6.5 - '@unhead/schema': 0.6.5 - '@unhead/ssr': 0.6.5 - '@unhead/vue': 0.6.5_vue@3.2.45 + '@unhead/dom': 0.6.6 + '@unhead/schema': 0.6.6 + '@unhead/ssr': 0.6.6 + '@unhead/vue': 0.6.6_vue@3.2.45 vue: 3.2.45 dev: false @@ -8429,6 +8425,14 @@ packages: node-fetch-native: 0.1.7 pathe: 0.3.9 + /unhead/0.6.6: + resolution: {integrity: sha512-ohc/5H3nbL0bozRzjkrPqKKDmaZZ8RTUiDRwQgOyjhafK4hN2A08ZeABPg0cya+CUTMfLmkaz5aXw4Di0Q1o0w==} + dependencies: + '@unhead/dom': 0.6.6 + '@unhead/schema': 0.6.6 + hookable: 5.4.1 + dev: false + /unimport/0.7.0: resolution: {integrity: sha512-Cr0whz4toYVid3JHlni/uThwavDVVCk6Zw0Gxnol1c7DprTA+Isr4T+asO6rDGkhkgV7r3vSdSs5Ym8F15JA+w==} dependencies: @@ -8907,6 +8911,15 @@ packages: webpack: 5.75.0 dev: false + /vue-meta/3.0.0-alpha.2_vue@3.2.45: + resolution: {integrity: sha512-mLDB/vGjn2Q58IFKs5Dtp/STWZ0sEbkdM67u+YXuMreK5EjNHnqhcylQb+xn50pwxCdQD98nGgJlEXkh16Hqug==} + peerDependencies: + '@vue/server-renderer': ^3.0.6 + vue: ^3.0.0 + dependencies: + vue: 3.2.45 + dev: true + /vue-router/4.1.6_vue@3.2.45: resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} peerDependencies: From d124c5d1a5c6f45ba41a092c05d6e1267f3c23f7 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Mon, 14 Nov 2022 23:10:29 +1100 Subject: [PATCH 04/15] chore: fix build --- packages/nuxt/package.json | 2 +- packages/nuxt/src/head/runtime/composables.ts | 6 +++--- packages/schema/build.config.ts | 2 +- pnpm-lock.yaml | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 96ef4496fd1..187640f6527 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -44,7 +44,7 @@ "@nuxt/vite-builder": "3.0.0-rc.13", "@vue/reactivity": "^3.2.45", "@vue/shared": "^3.2.45", - "@vueuse/head": "^1.0.11", + "@vueuse/head": "^1.0.12", "unhead": "^0.6.6", "@unhead/ssr": "^0.6.6", "chokidar": "^3.5.3", diff --git a/packages/nuxt/src/head/runtime/composables.ts b/packages/nuxt/src/head/runtime/composables.ts index d95db435b9d..e8105f71617 100644 --- a/packages/nuxt/src/head/runtime/composables.ts +++ b/packages/nuxt/src/head/runtime/composables.ts @@ -1,4 +1,4 @@ -import type { HeadEntryOptions, UseHeadInput } from '@vueuse/head' +import type { HeadEntryOptions, UseHeadInput, ActiveHeadEntry } from '@vueuse/head' import type { HeadAugmentations } from '@nuxt/schema' import { useHead as _useHead } from '@vueuse/head' @@ -9,13 +9,13 @@ import { useHead as _useHead } from '@vueuse/head' * Alternatively, for reactive meta state, you can pass in a function * that returns a meta object. */ -export function useHead<T extends HeadAugmentations> (input: UseHeadInput<T>, options?: HeadEntryOptions) { +export function useHead<T extends HeadAugmentations> (input: UseHeadInput<T>, options?: HeadEntryOptions): ActiveHeadEntry<UseHeadInput<T>> | void { return _useHead(input, options) } export function useServerHead<T extends HeadAugmentations> (input: UseHeadInput<T>) { if (process.server) { - return _useHead(input, { mode: 'server' }) + return useHead(input, { mode: 'server' }) } } diff --git a/packages/schema/build.config.ts b/packages/schema/build.config.ts index 6ae914a75db..7c23363f783 100644 --- a/packages/schema/build.config.ts +++ b/packages/schema/build.config.ts @@ -22,7 +22,7 @@ export default defineBuildConfig({ 'vue-meta', 'vue-router', 'vue-bundle-renderer', - '@vueuse/head', + '@unhead/schema', 'vue', 'hookable', 'nitropack', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c603283978..72fe0801ee5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -420,7 +420,7 @@ importers: '@unhead/ssr': ^0.6.6 '@vue/reactivity': ^3.2.45 '@vue/shared': ^3.2.45 - '@vueuse/head': ^1.0.11 + '@vueuse/head': ^1.0.12 chokidar: ^3.5.3 cookie-es: ^0.5.0 defu: ^6.1.0 @@ -467,7 +467,7 @@ importers: '@unhead/ssr': 0.6.6 '@vue/reactivity': 3.2.45 '@vue/shared': 3.2.45 - '@vueuse/head': 1.0.11_vue@3.2.45 + '@vueuse/head': 1.0.12_vue@3.2.45 chokidar: 3.5.3 cookie-es: 0.5.0 defu: 6.1.0 @@ -2578,8 +2578,8 @@ packages: - vue dev: true - /@vueuse/head/1.0.11_vue@3.2.45: - resolution: {integrity: sha512-0cHoXAS0YsIju6672uGnk7T7MmXcmhUi8mFXuKQhjFykdTqkHM0QhmZtEGyxqtcXHo3nrnt9tUeEhviXOTyAqg==} + /@vueuse/head/1.0.12_vue@3.2.45: + resolution: {integrity: sha512-ra2mnr8doC+ZmlKir3Jv2H0b9zkjxcBlkdb7Hi7kXpjXJ2E5U5S/c3QF3tNyO4WnxTjV/hEw2Is0wkfX924szg==} peerDependencies: vue: '>=2.7 || >=3' dependencies: From 72c6fb614f312308dcdcee3927a15872f0afbf83 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Mon, 14 Nov 2022 23:15:04 +1100 Subject: [PATCH 05/15] chore: fix CI --- docs/content/3.api/1.composables/use-head.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/3.api/1.composables/use-head.md b/docs/content/3.api/1.composables/use-head.md index 3a3f03ae590..4a96f0b8388 100644 --- a/docs/content/3.api/1.composables/use-head.md +++ b/docs/content/3.api/1.composables/use-head.md @@ -4,7 +4,7 @@ description: useHead customizes the head properties of individual pages of your # `useHead` -Nuxt provides the `useHead` composable to add and customize the head properties of individual pages of your Nuxt app. +Nuxt provides the `useHead` composable to add and customize the head properties of individual pages of your Nuxt app. `useHead` is powered by [@vueuse/head](https://github.com/vueuse/head), you can find more in-depth documentation [here](https://unhead.harlanzw.com/) From c2becd86b356f40ab09786b08c6d000544a3445a Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Mon, 14 Nov 2022 23:22:11 +1100 Subject: [PATCH 06/15] chore: fix CI #2 --- test/fixtures/basic/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/fixtures/basic/types.ts b/test/fixtures/basic/types.ts index c5cb34002b3..34e49bbd2e0 100644 --- a/test/fixtures/basic/types.ts +++ b/test/fixtures/basic/types.ts @@ -123,7 +123,6 @@ describe('runtimeConfig', () => { describe('head', () => { it('correctly types nuxt.config options', () => { - // @ts-expect-error defineNuxtConfig({ app: { head: { titleTemplate: () => 'test' } } }) defineNuxtConfig({ app: { From b167e00056323cb67f7107609984d771d968d357 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Mon, 14 Nov 2022 23:34:34 +1100 Subject: [PATCH 07/15] chore: prefer useNuxtApp useHead --- packages/nuxt/src/head/runtime/composables.ts | 4 ++-- packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/head/runtime/composables.ts b/packages/nuxt/src/head/runtime/composables.ts index e8105f71617..a8c6d2808e1 100644 --- a/packages/nuxt/src/head/runtime/composables.ts +++ b/packages/nuxt/src/head/runtime/composables.ts @@ -1,6 +1,6 @@ import type { HeadEntryOptions, UseHeadInput, ActiveHeadEntry } from '@vueuse/head' import type { HeadAugmentations } from '@nuxt/schema' -import { useHead as _useHead } from '@vueuse/head' +import { useNuxtApp } from '#app' /** * You can pass in a meta object, which has keys corresponding to meta tags: @@ -10,7 +10,7 @@ import { useHead as _useHead } from '@vueuse/head' * that returns a meta object. */ export function useHead<T extends HeadAugmentations> (input: UseHeadInput<T>, options?: HeadEntryOptions): ActiveHeadEntry<UseHeadInput<T>> | void { - return _useHead(input, options) + return useNuxtApp()._useHead(input, options) } export function useServerHead<T extends HeadAugmentations> (input: UseHeadInput<T>) { diff --git a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts index f4abee2f569..ed0200acc59 100644 --- a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts +++ b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts @@ -7,8 +7,7 @@ export default defineNuxtPlugin((nuxtApp) => { const head = createHead() head.push(appHead, { - // for SSR we don't need to hydrate this entry - // @todo conditionally skip this for SPA, we are hydrating when we don't need to + // when SSR we don't need to hydrate this entry mode: nuxtApp.ssrContext?.noSSR ? 'all' : 'server' }) From 67d7dc0c5b9356a1605830271656e57dde48506f Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Tue, 15 Nov 2022 01:14:41 +1100 Subject: [PATCH 08/15] chore: rollback non-essential changes --- packages/nuxt/src/app/nuxt.ts | 2 +- packages/nuxt/src/head/module.ts | 11 ----------- packages/nuxt/src/head/runtime/composables.ts | 8 +------- packages/nuxt/src/head/runtime/index.ts | 2 +- .../nuxt/src/head/runtime/lib/vueuse-head.plugin.ts | 9 ++------- packages/nuxt/src/imports/presets.ts | 3 +-- 6 files changed, 6 insertions(+), 29 deletions(-) diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index 2afa16b978f..c15b6e8f804 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -6,7 +6,7 @@ import type { RuntimeConfig, AppConfigInput } from '@nuxt/schema' import { getContext } from 'unctx' import type { SSRContext } from 'vue-bundle-renderer/runtime' import type { H3Event } from 'h3' -import type { HeadTag } from '@vueuse/head' +import type { HeadTag } from '@unhead/vue' const nuxtAppCtx = getContext<NuxtApp>('nuxt-app') diff --git a/packages/nuxt/src/head/module.ts b/packages/nuxt/src/head/module.ts index eaada749bd6..263ced169b3 100644 --- a/packages/nuxt/src/head/module.ts +++ b/packages/nuxt/src/head/module.ts @@ -29,17 +29,6 @@ export default defineNuxtModule({ }) } - // add non useHead composables - nuxt.hooks.hook('imports:sources', (sources) => { - sources.push({ - from: '@vueuse/head', - imports: [ - 'useSeoMeta', - 'injectHead' - ] - }) - }) - // Add mixin plugin addPlugin({ src: resolve(runtimeDir, 'mixin-plugin') }) diff --git a/packages/nuxt/src/head/runtime/composables.ts b/packages/nuxt/src/head/runtime/composables.ts index a8c6d2808e1..98a27b69219 100644 --- a/packages/nuxt/src/head/runtime/composables.ts +++ b/packages/nuxt/src/head/runtime/composables.ts @@ -1,4 +1,4 @@ -import type { HeadEntryOptions, UseHeadInput, ActiveHeadEntry } from '@vueuse/head' +import type { HeadEntryOptions, UseHeadInput, ActiveHeadEntry } from '@unhead/vue' import type { HeadAugmentations } from '@nuxt/schema' import { useNuxtApp } from '#app' @@ -13,12 +13,6 @@ export function useHead<T extends HeadAugmentations> (input: UseHeadInput<T>, op return useNuxtApp()._useHead(input, options) } -export function useServerHead<T extends HeadAugmentations> (input: UseHeadInput<T>) { - if (process.server) { - return useHead(input, { mode: 'server' }) - } -} - // TODO: remove useMeta support when Nuxt 3 is stable /** @deprecated Please use new `useHead` composable instead */ export function useMeta<T extends HeadAugmentations> (input: UseHeadInput<T>) { diff --git a/packages/nuxt/src/head/runtime/index.ts b/packages/nuxt/src/head/runtime/index.ts index a8f5fb9bed3..664fa585103 100644 --- a/packages/nuxt/src/head/runtime/index.ts +++ b/packages/nuxt/src/head/runtime/index.ts @@ -1,4 +1,4 @@ -import type { UseHeadInput } from '@vueuse/head' +import type { UseHeadInput } from '@unhead/vue' import type { HeadAugmentations } from '@nuxt/schema' export * from './composables' diff --git a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts index ed0200acc59..4d913bf0730 100644 --- a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts +++ b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts @@ -21,18 +21,13 @@ export default defineNuxtPlugin((nuxtApp) => { // triggers dom update head.internalHooks.callHook('entries:updated', head.unhead) } - head.internalHooks.hook('dom:beforeRender', (context) => { - context.shouldRender = !pauseDOMUpdates - }) + head.internalHooks.hook('dom:beforeRender', (context) => { context.shouldRender = !pauseDOMUpdates }) nuxtApp.hooks.hook('page:start', () => { pauseDOMUpdates = true }) - // watch for new route before unpausing dom updates (triggered after suspense resolved) + // wait for new page before unpausing dom updates (triggered after suspense resolved) nuxtApp.hooks.hook('page:finish', unpauseDom) nuxtApp.hooks.hook('app:mounted', unpauseDom) } - // basic support for users to modify tags before render - head.internalHooks.hook('tags:resolve', ctx => nuxtApp.hooks.callHook('head:tags:resolve', ctx)) - // useHead does not depend on a vue component context, we keep it on the nuxtApp for backwards compatibility nuxtApp._useHead = useHead diff --git a/packages/nuxt/src/imports/presets.ts b/packages/nuxt/src/imports/presets.ts index a80a6b164a4..5c29c86eeed 100644 --- a/packages/nuxt/src/imports/presets.ts +++ b/packages/nuxt/src/imports/presets.ts @@ -6,8 +6,7 @@ const commonPresets: InlinePreset[] = [ from: '#head', imports: [ 'useHead', - 'useMeta', - 'useServerHead' + 'useMeta' ] }), // vue-demi (mocked) From 1932eca4d88ce8aa8a52ff1aaec2d1ac43d47b91 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Tue, 15 Nov 2022 01:32:45 +1100 Subject: [PATCH 09/15] chore: remove hook type --- packages/nuxt/src/app/nuxt.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index c15b6e8f804..f57998e38cb 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -38,7 +38,6 @@ export interface RuntimeNuxtHooks { 'page:transition:finish': (Component?: VNode) => HookResult 'vue:setup': () => void 'vue:error': (...args: Parameters<Parameters<typeof onErrorCaptured>[0]>) => HookResult - 'head:tags:resolve': (ctx: { tags: HeadTag[] }) => HookResult } export interface NuxtSSRContext extends SSRContext { From fd578dcf2400da126690b9a8a0dddc34bc49c9ec Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Tue, 15 Nov 2022 16:15:47 +1100 Subject: [PATCH 10/15] chore: use safer entry --- packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts index 4d913bf0730..b10708b7907 100644 --- a/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts +++ b/packages/nuxt/src/head/runtime/lib/vueuse-head.plugin.ts @@ -5,11 +5,7 @@ import { appHead } from '#build/nuxt.config.mjs' export default defineNuxtPlugin((nuxtApp) => { const head = createHead() - - head.push(appHead, { - // when SSR we don't need to hydrate this entry - mode: nuxtApp.ssrContext?.noSSR ? 'all' : 'server' - }) + head.push(appHead) nuxtApp.vueApp.use(head) From 0e9958b2a5026c3daade3c645f0f7cc38feb3d10 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Tue, 15 Nov 2022 16:15:57 +1100 Subject: [PATCH 11/15] chore: bump @vueuse/head --- packages/nuxt/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 187640f6527..0721a7e66a9 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -44,7 +44,7 @@ "@nuxt/vite-builder": "3.0.0-rc.13", "@vue/reactivity": "^3.2.45", "@vue/shared": "^3.2.45", - "@vueuse/head": "^1.0.12", + "@vueuse/head": "^1.0.13", "unhead": "^0.6.6", "@unhead/ssr": "^0.6.6", "chokidar": "^3.5.3", From fdf7990deeabd1eed032122ee06005f1e4a9430d Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Tue, 15 Nov 2022 16:17:02 +1100 Subject: [PATCH 12/15] chore: sync lock file --- pnpm-lock.yaml | 88 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 76 insertions(+), 12 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72fe0801ee5..355cbd812fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,7 +121,7 @@ importers: devDependencies: '@nuxt/test-utils': link:../../../packages/test-utils nuxt: link:../../../packages/nuxt - vitest: 0.25.1 + vitest: 0.25.2 examples/app-config: specifiers: @@ -420,7 +420,7 @@ importers: '@unhead/ssr': ^0.6.6 '@vue/reactivity': ^3.2.45 '@vue/shared': ^3.2.45 - '@vueuse/head': ^1.0.12 + '@vueuse/head': ^1.0.13 chokidar: ^3.5.3 cookie-es: ^0.5.0 defu: ^6.1.0 @@ -467,7 +467,7 @@ importers: '@unhead/ssr': 0.6.6 '@vue/reactivity': 3.2.45 '@vue/shared': 3.2.45 - '@vueuse/head': 1.0.12_vue@3.2.45 + '@vueuse/head': 1.0.13_vue@3.2.45 chokidar: 3.5.3 cookie-es: 0.5.0 defu: 6.1.0 @@ -2093,24 +2093,43 @@ packages: '@unhead/schema': 0.6.6 dev: false + /@unhead/dom/0.6.7: + resolution: {integrity: sha512-HUp8ygfQ7VfpEouy26nLsuk6Y5ii5UldoC1NdTuzHSxkYwlq0v4rMpiO1f7T/0i9D7RJDpAp8LdhsHKgcEmRiA==} + dependencies: + '@unhead/schema': 0.6.7 + dev: false + /@unhead/schema/0.6.6: resolution: {integrity: sha512-hcJLBTW7LlS1KzaUZ4nxBFaQmx3g7SxfJyX37/UET2JlH+8ycQgojFCZbnrHn5QIJz7zU1VcWv9gGfeS9i2lSQ==} dependencies: '@zhead/schema': 1.0.0-beta.13 hookable: 5.4.1 + /@unhead/schema/0.6.7: + resolution: {integrity: sha512-wVf3Zu7deua63J/HYKoUXUkG0wZLPnKws1DNpSJkhNrjbpdzvsfI08lPIkW1ISqddQiLFXOgcnbhYrhcD7ZZYw==} + dependencies: + '@zhead/schema': 1.0.0-beta.13 + hookable: 5.4.1 + dev: false + /@unhead/ssr/0.6.6: resolution: {integrity: sha512-Dmt6E5BqJ3HRLh5fSlICCJ1YtYoyijl1jXdJ+D6jXHN8ut21/65qiwGPNPQOXAwBtBLLRRX3yvvDvTtlWN+zLQ==} dependencies: '@unhead/schema': 0.6.6 dev: false - /@unhead/vue/0.6.6_vue@3.2.45: - resolution: {integrity: sha512-oXkWEbW8astq5xhIS7HS+q6Q9vT/HGYM/gaHUpHQlXVFwc2t7KcBcDoFQMONLLw/eEovMudnwUGXRi6/8kwz8Q==} + /@unhead/ssr/0.6.7: + resolution: {integrity: sha512-jvEJER7dMSEtI6u60OrEz4gwhmQDGbo086HXdIYoT7RoaJ/YQa/CUAHRfLTO6F657iYs42VPFM3yRCVUbexZhA==} + dependencies: + '@unhead/schema': 0.6.7 + dev: false + + /@unhead/vue/0.6.7_vue@3.2.45: + resolution: {integrity: sha512-9qQ90WtOoQpXihM/MzDHiLWZ53HcZg9Xynf8PhY+004wLfj9e2cE2jSms1mjdP+BC7wVoeENQ9NCv4fOa6l6MQ==} peerDependencies: vue: '>=2.7 || >=3' dependencies: - '@unhead/schema': 0.6.6 + '@unhead/schema': 0.6.7 hookable: 5.4.1 vue: 3.2.45 dev: false @@ -2578,15 +2597,15 @@ packages: - vue dev: true - /@vueuse/head/1.0.12_vue@3.2.45: - resolution: {integrity: sha512-ra2mnr8doC+ZmlKir3Jv2H0b9zkjxcBlkdb7Hi7kXpjXJ2E5U5S/c3QF3tNyO4WnxTjV/hEw2Is0wkfX924szg==} + /@vueuse/head/1.0.13_vue@3.2.45: + resolution: {integrity: sha512-QJ69f+V0blbroHPuOAYBQZek31kMmFttgUj+QmL+rnXgFUfRXj5rqIDC2chFBSsjHcWl6KfzwPbou5mjCVJAgw==} peerDependencies: vue: '>=2.7 || >=3' dependencies: - '@unhead/dom': 0.6.6 - '@unhead/schema': 0.6.6 - '@unhead/ssr': 0.6.6 - '@unhead/vue': 0.6.6_vue@3.2.45 + '@unhead/dom': 0.6.7 + '@unhead/schema': 0.6.7 + '@unhead/ssr': 0.6.7 + '@unhead/vue': 0.6.7_vue@3.2.45 vue: 3.2.45 dev: false @@ -8811,6 +8830,51 @@ packages: - terser dev: true + /vitest/0.25.2: + resolution: {integrity: sha512-qqkzfzglEFbQY7IGkgSJkdOhoqHjwAao/OrphnHboeYHC5JzsVFoLCaB2lnAy8krhj7sbrFTVRApzpkTOeuDWQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/chai': 4.3.3 + '@types/chai-subset': 1.3.3 + '@types/node': 18.11.9 + acorn: 8.8.0 + acorn-walk: 8.2.0 + chai: 4.3.6 + debug: 4.3.4 + local-pkg: 0.4.2 + source-map: 0.6.1 + strip-literal: 0.4.2 + tinybench: 2.3.1 + tinypool: 0.3.0 + tinyspy: 1.0.2 + vite: 3.2.3_@types+node@18.11.9 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vscode-jsonrpc/6.0.0: resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} engines: {node: '>=8.0.0 || >=10.0.0'} From 32a22d5d61744d98776f4606c01c9ce79c1542a9 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Tue, 15 Nov 2022 16:23:49 +1100 Subject: [PATCH 13/15] chore: fix CI --- packages/nuxt/package.json | 4 ++-- packages/nuxt/src/app/nuxt.ts | 1 - packages/schema/package.json | 2 +- pnpm-lock.yaml | 39 +++++++++-------------------------- test/bundle.test.ts | 1 - 5 files changed, 13 insertions(+), 34 deletions(-) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 0721a7e66a9..8af7e171cde 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -45,8 +45,8 @@ "@vue/reactivity": "^3.2.45", "@vue/shared": "^3.2.45", "@vueuse/head": "^1.0.13", - "unhead": "^0.6.6", - "@unhead/ssr": "^0.6.6", + "unhead": "^0.6.7", + "@unhead/ssr": "^0.6.7", "chokidar": "^3.5.3", "cookie-es": "^0.5.0", "defu": "^6.1.0", diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index f57998e38cb..d7a4d8e5346 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -6,7 +6,6 @@ import type { RuntimeConfig, AppConfigInput } from '@nuxt/schema' import { getContext } from 'unctx' import type { SSRContext } from 'vue-bundle-renderer/runtime' import type { H3Event } from 'h3' -import type { HeadTag } from '@unhead/vue' const nuxtAppCtx = getContext<NuxtApp>('nuxt-app') diff --git a/packages/schema/package.json b/packages/schema/package.json index 97ca7ce7045..00b1fce1a94 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -17,7 +17,7 @@ "@types/lodash.template": "^4", "@types/semver": "^7", "@vitejs/plugin-vue": "^3.2.0", - "@unhead/schema": "^0.6.6", + "@unhead/schema": "^0.6.7", "nitropack": "^0.6.1", "unbuild": "latest", "vite": "~3.2.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 355cbd812fa..659cb8a466c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -417,7 +417,7 @@ importers: '@nuxt/vite-builder': workspace:* '@types/fs-extra': ^9.0.13 '@types/hash-sum': ^1.0.0 - '@unhead/ssr': ^0.6.6 + '@unhead/ssr': ^0.6.7 '@vue/reactivity': ^3.2.45 '@vue/shared': ^3.2.45 '@vueuse/head': ^1.0.13 @@ -448,7 +448,7 @@ importers: unbuild: ^0.9.4 unctx: ^2.0.2 unenv: ^0.6.2 - unhead: ^0.6.6 + unhead: ^0.6.7 unimport: ^0.7.0 unplugin: ^0.10.2 untyped: ^0.5.0 @@ -464,7 +464,7 @@ importers: '@nuxt/telemetry': 2.1.6 '@nuxt/ui-templates': 0.4.0 '@nuxt/vite-builder': link:../vite - '@unhead/ssr': 0.6.6 + '@unhead/ssr': 0.6.7 '@vue/reactivity': 3.2.45 '@vue/shared': 3.2.45 '@vueuse/head': 1.0.13_vue@3.2.45 @@ -494,7 +494,7 @@ importers: ultrahtml: 1.0.0 unctx: 2.0.2 unenv: 0.6.2 - unhead: 0.6.6 + unhead: 0.6.7 unimport: 0.7.0 unplugin: 0.10.2 untyped: 0.5.0 @@ -512,7 +512,7 @@ importers: specifiers: '@types/lodash.template': ^4 '@types/semver': ^7 - '@unhead/schema': ^0.6.6 + '@unhead/schema': ^0.6.7 '@vitejs/plugin-vue': ^3.2.0 c12: ^0.2.13 create-require: ^1.1.1 @@ -545,7 +545,7 @@ importers: devDependencies: '@types/lodash.template': 4.5.1 '@types/semver': 7.3.12 - '@unhead/schema': 0.6.6 + '@unhead/schema': 0.6.7 '@vitejs/plugin-vue': 3.2.0_vite@3.2.3 nitropack: 0.6.1 unbuild: 0.9.4 @@ -2087,36 +2087,17 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@unhead/dom/0.6.6: - resolution: {integrity: sha512-iKKv6s+oRvsvF3EeHE1n5xVf2oKtED1M4q0ECzFmM+oSihGUGzZJAn+UgN5MOcx1ilJQcHxBQQwzO9pppW/3aQ==} - dependencies: - '@unhead/schema': 0.6.6 - dev: false - /@unhead/dom/0.6.7: resolution: {integrity: sha512-HUp8ygfQ7VfpEouy26nLsuk6Y5ii5UldoC1NdTuzHSxkYwlq0v4rMpiO1f7T/0i9D7RJDpAp8LdhsHKgcEmRiA==} dependencies: '@unhead/schema': 0.6.7 dev: false - /@unhead/schema/0.6.6: - resolution: {integrity: sha512-hcJLBTW7LlS1KzaUZ4nxBFaQmx3g7SxfJyX37/UET2JlH+8ycQgojFCZbnrHn5QIJz7zU1VcWv9gGfeS9i2lSQ==} - dependencies: - '@zhead/schema': 1.0.0-beta.13 - hookable: 5.4.1 - /@unhead/schema/0.6.7: resolution: {integrity: sha512-wVf3Zu7deua63J/HYKoUXUkG0wZLPnKws1DNpSJkhNrjbpdzvsfI08lPIkW1ISqddQiLFXOgcnbhYrhcD7ZZYw==} dependencies: '@zhead/schema': 1.0.0-beta.13 hookable: 5.4.1 - dev: false - - /@unhead/ssr/0.6.6: - resolution: {integrity: sha512-Dmt6E5BqJ3HRLh5fSlICCJ1YtYoyijl1jXdJ+D6jXHN8ut21/65qiwGPNPQOXAwBtBLLRRX3yvvDvTtlWN+zLQ==} - dependencies: - '@unhead/schema': 0.6.6 - dev: false /@unhead/ssr/0.6.7: resolution: {integrity: sha512-jvEJER7dMSEtI6u60OrEz4gwhmQDGbo086HXdIYoT7RoaJ/YQa/CUAHRfLTO6F657iYs42VPFM3yRCVUbexZhA==} @@ -8444,11 +8425,11 @@ packages: node-fetch-native: 0.1.7 pathe: 0.3.9 - /unhead/0.6.6: - resolution: {integrity: sha512-ohc/5H3nbL0bozRzjkrPqKKDmaZZ8RTUiDRwQgOyjhafK4hN2A08ZeABPg0cya+CUTMfLmkaz5aXw4Di0Q1o0w==} + /unhead/0.6.7: + resolution: {integrity: sha512-YIVkGHHCUXbh0xFItqvJi08uk390ondXr+ge9lYwDiGQms8ykSGkDUbpMEXDrC8WnwoGXFkwaEZXRPIWx4ZxfA==} dependencies: - '@unhead/dom': 0.6.6 - '@unhead/schema': 0.6.6 + '@unhead/dom': 0.6.7 + '@unhead/schema': 0.6.7 hookable: 5.4.1 dev: false diff --git a/test/bundle.test.ts b/test/bundle.test.ts index 363c271b81b..325ef61f64a 100644 --- a/test/bundle.test.ts +++ b/test/bundle.test.ts @@ -33,7 +33,6 @@ describe.skipIf(isWindows)('minimal nuxt application', () => { "_nuxt/error-404.js", "_nuxt/error-500.js", "_nuxt/error-component.js", - "_nuxt/index.js", ] `) }) From c9c41d6d627d588a1b9440ab3ac3328f5ce5d252 Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Tue, 15 Nov 2022 17:38:15 +1100 Subject: [PATCH 14/15] fix: avoid implicit type deps --- packages/nuxt/src/head/runtime/composables.ts | 2 +- packages/nuxt/src/head/runtime/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nuxt/src/head/runtime/composables.ts b/packages/nuxt/src/head/runtime/composables.ts index 98a27b69219..c38857400f5 100644 --- a/packages/nuxt/src/head/runtime/composables.ts +++ b/packages/nuxt/src/head/runtime/composables.ts @@ -1,4 +1,4 @@ -import type { HeadEntryOptions, UseHeadInput, ActiveHeadEntry } from '@unhead/vue' +import type { HeadEntryOptions, UseHeadInput, ActiveHeadEntry } from '@vueuse/head' import type { HeadAugmentations } from '@nuxt/schema' import { useNuxtApp } from '#app' diff --git a/packages/nuxt/src/head/runtime/index.ts b/packages/nuxt/src/head/runtime/index.ts index 664fa585103..a8f5fb9bed3 100644 --- a/packages/nuxt/src/head/runtime/index.ts +++ b/packages/nuxt/src/head/runtime/index.ts @@ -1,4 +1,4 @@ -import type { UseHeadInput } from '@unhead/vue' +import type { UseHeadInput } from '@vueuse/head' import type { HeadAugmentations } from '@nuxt/schema' export * from './composables' From 18aab25d181efb21b9161cf9eeb26b5d00abd55e Mon Sep 17 00:00:00 2001 From: Harlan Wilton <harlan@harlanzw.com> Date: Wed, 16 Nov 2022 01:53:51 +1100 Subject: [PATCH 15/15] chore: sync lock file --- pnpm-lock.yaml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 836f372b986..e332b50d254 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -447,7 +447,7 @@ importers: ultrahtml: ^1.0.0 unbuild: ^0.9.4 unctx: ^2.0.2 - unenv: ^0.6.2 + unenv: ^1.0.0 unhead: ^0.6.7 unimport: ^1.0.0 unplugin: ^0.10.2 @@ -493,7 +493,7 @@ importers: ufo: 1.0.0 ultrahtml: 1.0.0 unctx: 2.0.2 - unenv: 0.6.2 + unenv: 1.0.0 unhead: 0.6.7 unimport: 1.0.0 unplugin: 0.10.2 @@ -6865,6 +6865,7 @@ packages: /node-fetch-native/0.1.7: resolution: {integrity: sha512-hps7dFJM0IEF056JftDSSjWDAwW9v2clwHoUJiHyYgl+ojoqjKyWybljMlpTmlC1O+864qovNlRLyAIjRxu9Ag==} + dev: true /node-fetch-native/0.1.8: resolution: {integrity: sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==} @@ -8699,15 +8700,6 @@ packages: dependencies: busboy: 1.6.0 - /unenv/0.6.2: - resolution: {integrity: sha512-IdQfYsHsGKDkiBdeOmtU4MjWvPYfMDOC63cvFqZPodAc5aVezvfD9Bwr7FL/G78cAMMCaDm5Jux3vYo+Z8c/Dg==} - dependencies: - defu: 6.1.0 - mime: 3.0.0 - node-fetch-native: 0.1.7 - pathe: 0.3.9 - dev: false - /unenv/1.0.0: resolution: {integrity: sha512-vlyi2Rzj4CNlA1JsEXufX+ItkGr3Z5DfLzKniYEneMlBVtuxS+57f1LwTPj2eiBPSPaGHMUVzEnjSCGE7l8JQg==} dependencies: