@dargmuesli/nuxt-vio 3.3.1 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,18 +2,12 @@
2
2
  <div :data-is-loading="isLoading" data-testid="is-loading">
3
3
  <NuxtLayout>
4
4
  <!-- `NuxtLayout` can't have mulitple child nodes (https://github.com/nuxt/nuxt/issues/21759) -->
5
- <div>
6
- <NuxtPage :site-description="siteDescriptionProp" />
7
- <CookieControl :locale="locale" />
8
- </div>
5
+ <NuxtPage :site-description="siteDescriptionProp" />
9
6
  </NuxtLayout>
10
7
  </div>
11
8
  </template>
12
9
 
13
10
  <script setup lang="ts">
14
- import type { Locale } from '@dargmuesli/nuxt-cookie-control/dist/runtime/types'
15
- import type { WritableComputedRef } from 'vue'
16
-
17
11
  export interface Props {
18
12
  ogImageAlt: string
19
13
  ogImageComponent?: string
@@ -27,15 +21,12 @@ const ogImageComponentProp = toRef(() => props.ogImageComponent)
27
21
  const siteDescriptionProp = toRef(() => props.siteDescription)
28
22
 
29
23
  const { $dayjs } = useNuxtApp()
30
- const i18n = useI18n()
24
+ const { locale } = useI18n()
31
25
  const cookieControl = useCookieControl()
32
26
  const siteConfig = useSiteConfig()
33
27
 
34
28
  const { loadingIds, indicateLoadingDone } = useLoadingDoneIndicator('app')
35
29
 
36
- // data
37
- const locale = i18n.locale as WritableComputedRef<Locale>
38
-
39
30
  // methods
40
31
  const init = () => {
41
32
  $dayjs.locale(locale.value)
@@ -3,5 +3,16 @@
3
3
  <main>
4
4
  <slot />
5
5
  </main>
6
+ <CookieControl :locale="locale" />
6
7
  </div>
7
8
  </template>
9
+
10
+ <script setup lang="ts">
11
+ import type { Locale } from '@dargmuesli/nuxt-cookie-control/dist/runtime/types'
12
+ import type { WritableComputedRef } from 'vue'
13
+
14
+ const i18n = useI18n()
15
+
16
+ // data
17
+ const locale = i18n.locale as WritableComputedRef<Locale>
18
+ </script>
@@ -2,26 +2,30 @@ export const useAppLayout = () => {
2
2
  const appConfig = useAppConfig()
3
3
  const siteConfig = useSiteConfig()
4
4
 
5
- useHeadSafe({
5
+ useServerHeadSafe({
6
6
  ...useLocaleHead({ addSeoAttributes: true }).value,
7
7
  bodyAttrs: {
8
8
  class:
9
9
  'bg-background-bright dark:bg-background-dark font-sans text-text-dark dark:text-text-bright',
10
10
  },
11
- }) // TODO: use `useServerHeadSafe` (https://github.com/harlan-zw/nuxt-seo-kit/issues/87)
11
+ })
12
12
 
13
+ // TODO: convert to `useServerHeadSafe` (https://github.com/harlan-zw/nuxt-seo-kit/issues/98)
13
14
  useServerSeoMeta({
14
- ...(appConfig.vio.themeColor
15
- ? {
16
- msapplicationTileColor: appConfig.vio.themeColor,
17
- themeColor: appConfig.vio.themeColor,
18
- }
19
- : {}),
20
- titleTemplate: (titleChunk) => {
21
- return titleChunk && titleChunk !== siteConfig.name
22
- ? `${titleChunk} ${siteConfig.titleSeparator} ${siteConfig.name}`
23
- : siteConfig.name
24
- },
25
- ...(appConfig.vio.seoMeta ? appConfig.vio.seoMeta : {}),
15
+ titleTemplate: (title) =>
16
+ title && title !== siteConfig.name
17
+ ? `${title} ${siteConfig.titleSeparator} ${siteConfig.name}`
18
+ : siteConfig.name,
26
19
  })
20
+
21
+ if (appConfig.vio.seoMeta) {
22
+ useServerSeoMeta(appConfig.vio.seoMeta)
23
+ }
24
+
25
+ if (appConfig.vio.themeColor) {
26
+ useServerSeoMeta({
27
+ msapplicationTileColor: appConfig.vio.themeColor,
28
+ themeColor: appConfig.vio.themeColor,
29
+ })
30
+ }
27
31
  }
@@ -1,11 +1,10 @@
1
1
  import { Dayjs } from 'dayjs'
2
2
 
3
3
  export const useDateTime = () => {
4
- const event = useRequestEvent()
5
- const { $dayjs } = useNuxtApp()
4
+ const { $dayjs, ssrContext } = useNuxtApp()
6
5
  const timezoneCookie = useCookie(TIMEZONE_COOKIE_NAME)
7
6
 
8
- const timezoneHeader = event?.node.req.headers[TIMEZONE_HEADER_KEY]
7
+ const timezoneHeader = ssrContext?.event.node.req.headers[TIMEZONE_HEADER_KEY]
9
8
  const timezone =
10
9
  timezoneHeader && !Array.isArray(timezoneHeader)
11
10
  ? timezoneHeader
@@ -1,8 +1,8 @@
1
1
  export const useHost = () => {
2
- if (process.server) {
3
- const event = useRequestEvent()
2
+ const { ssrContext } = useNuxtApp()
4
3
 
5
- return getHost(event.node.req)
4
+ if (ssrContext) {
5
+ return getHost(ssrContext.event)
6
6
  } else {
7
7
  return location.host
8
8
  }
@@ -1,6 +1,9 @@
1
+ import { POLYFILLS } from '../utils/constants'
2
+
1
3
  export const usePolyfills = () => {
2
- const polyfills =
3
- 'https://polyfill.io/v3/polyfill.min.js?features=Promise&flags=gated'
4
+ const polyfills = `https://polyfill.io/v3/polyfill.min.js?features=${POLYFILLS.join(
5
+ '%2C',
6
+ )}&flags=gated`
4
7
 
5
8
  useServerHead({
6
9
  link: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dargmuesli/nuxt-vio",
3
- "version": "3.3.1",
3
+ "version": "3.5.0",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -8,7 +8,7 @@
8
8
  "engines": {
9
9
  "node": "20"
10
10
  },
11
- "packageManager": "pnpm@8.7.0",
11
+ "packageManager": "pnpm@8.7.4",
12
12
  "files": [
13
13
  "assets",
14
14
  "components",
@@ -41,36 +41,36 @@
41
41
  "prepare": "nuxt prepare .playground",
42
42
  "preview": "nuxt preview .playground",
43
43
  "start": "PORT=3001 node .playground/.output/server/index.mjs",
44
- "test:e2e": "playwright test",
45
- "test:e2e:dev": "cross-env NUXT_PUBLIC_IS_TESTING=1 WAIT_ON_TIMEOUT=100000 pnpm test:e2e",
46
- "test:e2e:prod": "cross-env NUXT_PUBLIC_IS_TESTING=1 WAIT_ON_TIMEOUT=10000 NODE_ENV=production pnpm test:e2e",
47
- "test:e2e:docker:build": "docker build -t test-e2e_base --build-arg UID=$(id -u) --build-arg GID=$(id -g) --target test-e2e_base ..",
48
- "test:e2e:docker:run": "docker run --rm -v \"$PWD/..:/srv/app\" -v \"$(pnpm store path):/srv/.pnpm-store\" test-e2e_base",
44
+ "test:e2e:dev": "cross-env NUXT_PUBLIC_IS_TESTING=1 pnpm test:e2e",
49
45
  "test:e2e:docker:br": "pnpm test:e2e:docker:build && pnpm test:e2e:docker:run",
50
- "test:e2e:docker:dev": "pnpm test:e2e:docker:br pnpm --dir src run test:e2e:dev",
46
+ "test:e2e:docker:build": "docker build -t test-e2e_base --build-arg UID=$(id -u) --build-arg GID=$(id -g) --target test-e2e_base ..",
51
47
  "test:e2e:docker:dev:update": "pnpm test:e2e:docker:dev --update-snapshots",
48
+ "test:e2e:docker:dev": "pnpm test:e2e:docker:br pnpm --dir src run test:e2e:dev",
49
+ "test:e2e:docker:prod:update": "pnpm test:e2e:docker:prod --update-snapshots",
52
50
  "test:e2e:docker:prod": "pnpm test:e2e:docker:br pnpm --dir src run test:e2e:prod",
53
- "test:e2e:docker:prod:update": "pnpm test:e2e:docker:prod --update-snapshots"
51
+ "test:e2e:docker:run": "docker run --rm -v \"$PWD/..:/srv/app\" -v \"$(pnpm store path):/srv/.pnpm-store\" test-e2e_base",
52
+ "test:e2e:prod": "cross-env NUXT_PUBLIC_IS_TESTING=1 NODE_ENV=production pnpm test:e2e",
53
+ "test:e2e": "playwright test"
54
54
  },
55
55
  "dependencies": {
56
56
  "@axe-core/playwright": "4.7.3",
57
- "@dargmuesli/nuxt-cookie-control": "6.4.1",
57
+ "@dargmuesli/nuxt-cookie-control": "6.4.2",
58
58
  "@http-util/status-i18n": "0.8.1",
59
59
  "@nuxt/image": "1.0.0-rc.1",
60
60
  "@nuxtjs/color-mode": "3.3.0",
61
61
  "@nuxtjs/html-validator": "1.5.2",
62
- "@nuxtjs/i18n": "8.0.0-rc.3",
62
+ "@nuxtjs/i18n": "8.0.0-rc.4",
63
63
  "@nuxtjs/tailwindcss": "6.8.0",
64
- "@nuxtseo/module": "2.0.0-beta.22",
64
+ "@nuxtseo/module": "2.0.0-beta.26",
65
65
  "@pinia/nuxt": "0.4.11",
66
66
  "@playwright/test": "1.37.1",
67
67
  "@tailwindcss/forms": "0.5.6",
68
- "@tailwindcss/typography": "0.5.9",
69
- "@types/cookie": "0.5.1",
70
- "@types/lodash-es": "4.17.8",
71
- "@urql/core": "4.1.1",
68
+ "@tailwindcss/typography": "0.5.10",
69
+ "@types/cookie": "0.5.2",
70
+ "@types/lodash-es": "4.17.9",
71
+ "@urql/core": "4.1.2",
72
72
  "@urql/devtools": "2.0.3",
73
- "@urql/exchange-graphcache": "6.3.2",
73
+ "@urql/exchange-graphcache": "6.3.3",
74
74
  "@urql/vue": "1.1.2",
75
75
  "@vuelidate/core": "2.0.3",
76
76
  "@vuelidate/validators": "2.0.4",
@@ -78,18 +78,17 @@
78
78
  "cookie": "0.5.0",
79
79
  "dayjs": "2.0.0-alpha.4",
80
80
  "is-https": "4.0.0",
81
- "jose": "4.14.4",
81
+ "jiti": "1.19.3",
82
+ "jose": "4.14.6",
82
83
  "lodash-es": "4.17.21",
83
- "marked": "7.0.5",
84
84
  "pinia": "2.1.6",
85
85
  "sweetalert2": "11.7.27",
86
86
  "vue-gtag": "2.0.1",
87
- "vue-tsc": "1.8.8"
87
+ "vue-tsc": "1.8.10"
88
88
  },
89
89
  "devDependencies": {
90
90
  "@intlify/eslint-plugin-vue-i18n": "3.0.0-next.3",
91
91
  "@nuxtjs/eslint-config-typescript": "12.1.0",
92
- "@types/marked": "5.0.1",
93
92
  "cross-env": "7.0.3",
94
93
  "eslint": "8.48.0",
95
94
  "eslint-config-prettier": "9.0.0",
@@ -98,9 +97,9 @@
98
97
  "eslint-plugin-prettier": "5.0.0",
99
98
  "eslint-plugin-yml": "1.8.0",
100
99
  "lint-staged": "14.0.1",
101
- "nuxt": "3.7.0",
100
+ "nuxt": "3.7.1",
102
101
  "prettier": "3.0.3",
103
- "prettier-plugin-tailwindcss": "0.5.3",
102
+ "prettier-plugin-tailwindcss": "0.5.4",
104
103
  "stylelint": "15.10.3",
105
104
  "stylelint-config-recommended-vue": "1.5.0",
106
105
  "stylelint-config-standard": "34.0.0",
package/utils/auth.ts CHANGED
@@ -69,9 +69,8 @@ export const jwtStore = async ({
69
69
  }
70
70
 
71
71
  export const useJwtStore = () => {
72
- const { $urqlReset } = useNuxtApp()
72
+ const { $urqlReset, ssrContext } = useNuxtApp()
73
73
  const store = useVioAuthStore()
74
- const event = useRequestEvent()
75
74
 
76
75
  if (typeof $urqlReset !== 'function')
77
76
  throw new Error('`$urqlReset` is not a function!')
@@ -81,7 +80,7 @@ export const useJwtStore = () => {
81
80
  await jwtStore({
82
81
  $urqlReset,
83
82
  store,
84
- res: process.server ? event.node.res : undefined,
83
+ res: ssrContext ? ssrContext.event.node.res : undefined,
85
84
  jwt,
86
85
  })
87
86
  },
@@ -99,9 +98,8 @@ export const signOut = async ({
99
98
  }) => await jwtStore({ $urqlReset, store, res })
100
99
 
101
100
  export const useSignOut = () => {
102
- const { $urqlReset } = useNuxtApp()
101
+ const { $urqlReset, ssrContext } = useNuxtApp()
103
102
  const store = useVioAuthStore()
104
- const event = useRequestEvent()
105
103
 
106
104
  if (typeof $urqlReset !== 'function')
107
105
  throw new Error('`$urqlReset` is not a function!')
@@ -111,7 +109,7 @@ export const useSignOut = () => {
111
109
  await signOut({
112
110
  $urqlReset,
113
111
  store,
114
- res: process.server ? event.node.res : undefined,
112
+ res: ssrContext ? ssrContext.event.node.res : undefined,
115
113
  })
116
114
  },
117
115
  }
@@ -40,6 +40,7 @@ export const I18N_VUE_CONFIG = {
40
40
  }
41
41
  export const JWT_NAME = () =>
42
42
  `${process.env.NODE_ENV === 'production' ? '__Secure-' : ''}jwt`
43
+ export const POLYFILLS = ['Promise']
43
44
  export const REGEX_UUID =
44
45
  /^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$/
45
46
  export const TIMEZONE_COOKIE_NAME = [COOKIE_PREFIX, 'tz'].join(COOKIE_SEPARATOR)
@@ -1,5 +1,3 @@
1
- import { IncomingMessage } from 'node:http'
2
-
3
1
  import { CombinedError } from '@urql/core'
4
2
  import { H3Event, getCookie } from 'h3'
5
3
 
@@ -79,10 +77,12 @@ export const getDomainTldPort = (host: string) => {
79
77
  return `${hostParts[hostParts.length - 2]}.${hostParts[hostParts.length - 1]}`
80
78
  }
81
79
 
82
- export const getHost = (req: IncomingMessage) => {
83
- if (!req.headers.host) throw new Error('Host header is not given!')
80
+ export const getHost = (event: H3Event) => {
81
+ const host = event.node.req.headers.host
82
+
83
+ if (!host) throw new Error('Host header is not given!')
84
84
 
85
- return req.headers.host
85
+ return host
86
86
  }
87
87
 
88
88
  export const getServiceHref = ({
package/plugins/marked.ts DELETED
@@ -1,9 +0,0 @@
1
- import { marked } from 'marked'
2
-
3
- export default defineNuxtPlugin((_nuxtApp) => {
4
- return {
5
- provide: {
6
- marked: marked.parse,
7
- },
8
- }
9
- })