From 25c28ab8e4e194e88504313f141570c48c9239eb Mon Sep 17 00:00:00 2001 From: Dylan Kelly Date: Tue, 15 Apr 2025 12:48:24 +1000 Subject: [PATCH 1/2] feat: :construction: wip on adding CSP and embed solution --- examples/nuxt-app/nuxt.config.ts | 4 +- .../nuxt-ripple/components/TideBaseLayout.vue | 16 +- .../composables/use-tide-favicons.ts | 8 +- .../composables/use-tide-hide-alerts.ts | 1 + packages/nuxt-ripple/public/scripts/alerts.js | 35 + .../nuxt-ripple/server/plugins/prefetch.ts | 34 - .../layers/script-loader/nuxt.config.ts | 3 + .../layers/script-loader/pages/embed.vue | 110 +++ packages/ripple-sdp-core/nuxt.config.ts | 44 ++ packages/ripple-sdp-core/package.json | 5 +- .../TideLandingPage/EmbeddedContent.vue | 22 + .../global/TideLandingPage/OpenForms.vue | 18 +- .../mapping/components.ts | 4 +- .../embedded-content/embedded-content.ts | 25 + pnpm-lock.yaml | 703 ++++++------------ 15 files changed, 511 insertions(+), 521 deletions(-) create mode 100644 packages/nuxt-ripple/public/scripts/alerts.js delete mode 100644 packages/nuxt-ripple/server/plugins/prefetch.ts create mode 100644 packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts create mode 100644 packages/ripple-sdp-core/layers/script-loader/pages/embed.vue create mode 100644 packages/ripple-tide-landing-page/components/global/TideLandingPage/EmbeddedContent.vue create mode 100644 packages/ripple-tide-landing-page/mapping/components/embedded-content/embedded-content.ts diff --git a/examples/nuxt-app/nuxt.config.ts b/examples/nuxt-app/nuxt.config.ts index 3b26f940ce..c60bedea0b 100644 --- a/examples/nuxt-app/nuxt.config.ts +++ b/examples/nuxt-app/nuxt.config.ts @@ -19,7 +19,7 @@ export default defineNuxtConfig({ // See https://nuxt.com/docs/getting-started/layers - each content type is a added as a Nuxt layer extends: [ '@dpc-sdp/nuxt-ripple', - '@dpc-sdp/nuxt-ripple-analytics', + // '@dpc-sdp/nuxt-ripple-analytics', '@dpc-sdp/nuxt-ripple-preview', '@dpc-sdp/ripple-sdp-core', // Local layers @@ -47,4 +47,4 @@ export default defineNuxtConfig({ }, compatibilityDate: '2025-03-20' -}) \ No newline at end of file +}) diff --git a/packages/nuxt-ripple/components/TideBaseLayout.vue b/packages/nuxt-ripple/components/TideBaseLayout.vue index b4bda3e804..b38578ca25 100644 --- a/packages/nuxt-ripple/components/TideBaseLayout.vue +++ b/packages/nuxt-ripple/components/TideBaseLayout.vue @@ -176,7 +176,21 @@ const footerNav = computed(() => { await nuxtApp.callHook('tide:page', props) const theme = useTideSiteTheme(props.site) -useTideHideAlerts() + +// useScript( +// { +// src: '/scripts/alerts.js', +// async: false, +// defer: false, +// onLoaded: false, +// onError: false, +// fetchpriority: 'high' +// }, +// { +// trigger: 'server' +// } +// ) + useTideSiteMeta(props, nuxtApp?.$app_origin) useTideFavicons(props.site, theme) diff --git a/packages/nuxt-ripple/composables/use-tide-favicons.ts b/packages/nuxt-ripple/composables/use-tide-favicons.ts index fa7c4a7449..3cc773bcdb 100644 --- a/packages/nuxt-ripple/composables/use-tide-favicons.ts +++ b/packages/nuxt-ripple/composables/use-tide-favicons.ts @@ -34,10 +34,10 @@ export default (site: TideSiteData, theme: { 'rpl-clr-primary'?: string }) => { }) } - link.push({ - rel: 'manifest', - href: `data:application/manifest+json,${encodeURIComponent(JSON.stringify(manifest))}` - }) + // link.push({ + // rel: 'manifest', + // href: `data:application/manifest+json,${encodeURIComponent(JSON.stringify(manifest))}` + // }) if (site.favicon?.src) { link.push({ diff --git a/packages/nuxt-ripple/composables/use-tide-hide-alerts.ts b/packages/nuxt-ripple/composables/use-tide-hide-alerts.ts index add2d8a535..2d18d651f6 100644 --- a/packages/nuxt-ripple/composables/use-tide-hide-alerts.ts +++ b/packages/nuxt-ripple/composables/use-tide-hide-alerts.ts @@ -40,6 +40,7 @@ try { styleSheet.innerText = styles document.head.appendChild(styleSheet) } + console.log('Dismissed alerts') } catch (e) { console.error(e) }` diff --git a/packages/nuxt-ripple/public/scripts/alerts.js b/packages/nuxt-ripple/public/scripts/alerts.js new file mode 100644 index 0000000000..7295346fa1 --- /dev/null +++ b/packages/nuxt-ripple/public/scripts/alerts.js @@ -0,0 +1,35 @@ +;(function () { + console.log('alerts.js loaded') + function getCookie(name) { + const value = `; ${document.cookie}` + const parts = value.split(`; ${name}=`) + if (parts.length === 2) return parts.pop().split(';').shift() + } + + const DISMISSED_ALERTS_COOKIE = 'dismissedAlerts' + const guidRegex = new RegExp( + '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4,5}-[0-9a-f]{4}-[0-9a-f]{12}$' + ) + + try { + const cookieValue = getCookie(DISMISSED_ALERTS_COOKIE) + + if (cookieValue) { + const dismissedIds = JSON.parse(decodeURIComponent(cookieValue)) + + const styles = dismissedIds.reduce((result, id) => { + if (guidRegex.test(id)) { + return `${result} [data-alert-id="${id}"] {display: none;}` + } + + return result + }, '') + + const styleSheet = document.createElement('style') + styleSheet.innerText = styles + document.head.appendChild(styleSheet) + } + } catch (e) { + console.error(e) + } +})() diff --git a/packages/nuxt-ripple/server/plugins/prefetch.ts b/packages/nuxt-ripple/server/plugins/prefetch.ts deleted file mode 100644 index edc060719a..0000000000 --- a/packages/nuxt-ripple/server/plugins/prefetch.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { load } from 'cheerio' -import type { NitroApp } from 'nitropack' - -// fix type stub - See https://github.com/nuxt/nuxt/issues/18556 -export type NitroAppPlugin = (nitro: NitroApp) => void -function defineNitroPlugin(def: NitroAppPlugin): NitroAppPlugin { - return def -} - -export default defineNitroPlugin((nitroApp) => { - nitroApp.hooks.hook('render:html', (html) => { - /** - * @WORKAROUND: remove auto generated tags from the head - * currently it automatically adds prefetch tags for all assets imported in the page - */ - // https://github.com/nuxt/nuxt/issues/18376#issuecomment-1431318970 - // https://github.com/nuxt/nuxt/issues/18376 - - html.head = html.head.map((head) => { - const $ = load(head) - $('link[rel=prefetch]').each(function () { - $(this).remove() - }) - $('link[rel=modulepreload]').each(function () { - $(this).remove() - }) - $('link[rel=preload]').each(function () { - $(this).remove() - }) - - return $.root().find('head').contents() - }) - }) -}) diff --git a/packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts b/packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts new file mode 100644 index 0000000000..f716d9f9da --- /dev/null +++ b/packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts @@ -0,0 +1,3 @@ +import { defineNuxtConfig } from 'nuxt/config' + +export default defineNuxtConfig({}) diff --git a/packages/ripple-sdp-core/layers/script-loader/pages/embed.vue b/packages/ripple-sdp-core/layers/script-loader/pages/embed.vue new file mode 100644 index 0000000000..851c3fadfc --- /dev/null +++ b/packages/ripple-sdp-core/layers/script-loader/pages/embed.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/packages/ripple-sdp-core/nuxt.config.ts b/packages/ripple-sdp-core/nuxt.config.ts index 4d0bb03120..c2965a7ce2 100644 --- a/packages/ripple-sdp-core/nuxt.config.ts +++ b/packages/ripple-sdp-core/nuxt.config.ts @@ -1,7 +1,51 @@ import { defineNuxtConfig } from 'nuxt/config' export default defineNuxtConfig({ + experimental: { + inlineRouteRules: true + }, + modules: ['nuxt-security', '@nuxt/scripts'], + scripts: { + debug: true + }, + security: { + rateLimiter: false, + strict: true, // Enables strict mode for security headers + nonce: true, // Enables HTML nonce support in SSR mode + headers: { + crossOriginEmbedderPolicy: 'unsafe-none', + crossOriginResourcePolicy: 'same-origin', + contentSecurityPolicy: { + 'worker-src': ["'self'", 'blob:'], + 'img-src': ["'self'", 'data:', process.env.NUXT_PUBLIC_TIDE_BASE_URL], + 'style-src': ["'unsafe-inline'", "'self'"], + 'script-src': [ + "'self'", + 'https:', + "'unsafe-inline'", + "'nonce-{{nonce}}'", + "'strict-dynamic'" + ] + } + } + }, + routeRules: { + '/embed': { + security: { + headers: { + permissionsPolicy: { + 'picture-in-picture': [], + geolocation: [] + }, + xFrameOptions: 'SAMEORIGIN', + crossOriginEmbedderPolicy: 'unsafe-none', + contentSecurityPolicy: false + } + } + } + }, extends: [ + './layers/script-loader', '@dpc-sdp/ripple-tide-event', '@dpc-sdp/ripple-tide-topic', '@dpc-sdp/ripple-tide-landing-page', diff --git a/packages/ripple-sdp-core/package.json b/packages/ripple-sdp-core/package.json index 75781da608..4318150fbf 100644 --- a/packages/ripple-sdp-core/package.json +++ b/packages/ripple-sdp-core/package.json @@ -17,6 +17,9 @@ "@dpc-sdp/ripple-tide-publication": "workspace:*", "@dpc-sdp/ripple-tide-search": "workspace:*", "@dpc-sdp/ripple-tide-topic": "workspace:*", - "@dpc-sdp/ripple-tide-webform": "workspace:*" + "@dpc-sdp/ripple-tide-webform": "workspace:*", + "@extractus/oembed-extractor": "^4.0.6", + "@nuxt/scripts": "^0.11.5", + "nuxt-security": "^2.2.0" } } diff --git a/packages/ripple-tide-landing-page/components/global/TideLandingPage/EmbeddedContent.vue b/packages/ripple-tide-landing-page/components/global/TideLandingPage/EmbeddedContent.vue new file mode 100644 index 0000000000..48b639e30f --- /dev/null +++ b/packages/ripple-tide-landing-page/components/global/TideLandingPage/EmbeddedContent.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/packages/ripple-tide-landing-page/components/global/TideLandingPage/OpenForms.vue b/packages/ripple-tide-landing-page/components/global/TideLandingPage/OpenForms.vue index 41111074bb..b8fb37c23e 100644 --- a/packages/ripple-tide-landing-page/components/global/TideLandingPage/OpenForms.vue +++ b/packages/ripple-tide-landing-page/components/global/TideLandingPage/OpenForms.vue @@ -13,13 +13,17 @@ interface Props { withDefaults(defineProps(), {}) -onMounted(() => { - let openFormsEmbedScript = document.createElement('script') - openFormsEmbedScript.setAttribute( - 'src', - 'https://au.openforms.com/Scripts/embed-iframe.js?immediate=true' - ) - document.head.appendChild(openFormsEmbedScript) +// onMounted(() => { +// let openFormsEmbedScript = document.createElement('script') +// openFormsEmbedScript.setAttribute( +// 'src', +// 'https://au.openforms.com/Scripts/embed-iframe.js?immediate=true' +// ) +// document.head.appendChild(openFormsEmbedScript) +// }) + +useScript({ + src: 'https://au.openforms.com/Scripts/embed-iframe.js?immediate=true' }) diff --git a/packages/ripple-tide-landing-page/mapping/components.ts b/packages/ripple-tide-landing-page/mapping/components.ts index 2d69acb17f..99185f06ec 100644 --- a/packages/ripple-tide-landing-page/mapping/components.ts +++ b/packages/ripple-tide-landing-page/mapping/components.ts @@ -21,6 +21,7 @@ import compactCardsMapping from './components/compact-cards/compact-cards-mappin import openFormsMapping from './components/openforms/openforms-mapping' import dataDrivenComponentMapping from './components/data-driven-component/data-driven-component-mapping' import linkListMapping from './components/link-list/link-list-mapping' +import embeddedContent from './components/embedded-content/embedded-content' const mappings: { [key: string]: { @@ -49,7 +50,8 @@ const mappings: { 'paragraph--compact_card_collection': compactCardsMapping, 'paragraph--form_embed_openforms': openFormsMapping, 'paragraph--data_driven_component': dataDrivenComponentMapping, - 'paragraph--link_list': linkListMapping + 'paragraph--link_list': linkListMapping, + 'paragraph--embed_content': embeddedContent } // Add reusable include on whitelisted paragraph types diff --git a/packages/ripple-tide-landing-page/mapping/components/embedded-content/embedded-content.ts b/packages/ripple-tide-landing-page/mapping/components/embedded-content/embedded-content.ts new file mode 100644 index 0000000000..d8ed6813d7 --- /dev/null +++ b/packages/ripple-tide-landing-page/mapping/components/embedded-content/embedded-content.ts @@ -0,0 +1,25 @@ +import { TideDynamicPageComponent } from '@dpc-sdp/ripple-tide-api/types' + +export interface ITideEmeddedContent { + embedUrl: string +} + +export const embdeddedContentMapping = ( + field +): TideDynamicPageComponent => { + return { + component: 'TideLandingPageEmbeddedContent', + id: field.drupal_internal__id.toString(), + props: { + embedUrl: field.field_embed_link.uri + } + } +} + +export const embeddedContentIncludes = [] + +export default { + includes: embeddedContentIncludes, + mapping: embdeddedContentMapping, + contentTypes: ['landing_page'] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b59b4b667..3b344633ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -490,6 +490,15 @@ importers: '@dpc-sdp/ripple-tide-webform': specifier: workspace:* version: link:../ripple-tide-webform + '@extractus/oembed-extractor': + specifier: ^4.0.6 + version: 4.0.6(encoding@0.1.13) + '@nuxt/scripts': + specifier: ^0.11.5 + version: 0.11.5(@unhead/vue@2.0.8(vue@3.5.13(typescript@5.8.3)))(db0@0.3.2(better-sqlite3@11.9.1))(ioredis@5.6.1)(magicast@0.3.5)(nuxt@3.17.2(@parcel/watcher@2.5.1)(@types/node@20.17.24)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.6.1)(magicast@0.3.5)(meow@13.2.0)(optionator@0.9.4)(rollup@4.40.1)(stylelint@15.11.0(typescript@5.0.2))(terser@5.39.0)(tsx@4.19.4)(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.24)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))(yaml@2.7.1))(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) + nuxt-security: + specifier: ^2.2.0 + version: 2.2.0(magicast@0.3.5)(rollup@4.40.1) packages/ripple-storybook: dependencies: @@ -2182,300 +2191,150 @@ packages: peerDependencies: react: '>=16.8.0' - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.3': resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.3': resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.3': resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.3': resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.3': resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.3': resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.3': resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.3': resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.3': resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.3': resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.3': resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.3': resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.3': resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.3': resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.3': resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.3': resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.3': resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.3': resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.3': resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.3': resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.3': resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.3': resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.3': resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.3': resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.3': resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} engines: {node: '>=18'} @@ -2500,6 +2359,10 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@extractus/oembed-extractor@4.0.6': + resolution: {integrity: sha512-2JA5zqO6gMymBsTdA4L4vIE7sXWcexf979Ss1jxrihxgRSTWxSYAeeNw+a7fszu8k2oJcBFY/CvK2QvEgPLpWg==} + engines: {node: '>= 18'} + '@fal-works/esbuild-plugin-global-externals@2.1.2': resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} @@ -3224,6 +3087,25 @@ packages: resolution: {integrity: sha512-DzmvgqcfIoCkNKXrBU6wpGckIXSxHHU+7OTlE68qNq6y0lVYnUA0Akrn0I8j+n/vFdQTIpJXiRD4dAgcomsBAg==} engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/scripts@0.11.5': + resolution: {integrity: sha512-dGoeUh2GTCWffgSbNv8bURHRiLkddU6rZgmWikQViyYBrQ6rN3qHPA1GI50x/KJeZjzQJK2hh1E35Y7EkwU18w==} + peerDependencies: + '@stripe/stripe-js': ^5.10.0 + '@types/google.maps': ^3.58.1 + '@types/vimeo__player': ^2.18.3 + '@types/youtube': ^0.1.0 + '@unhead/vue': ^2.0.0-rc.8 + nuxt: ^3.16.0 + peerDependenciesMeta: + '@stripe/stripe-js': + optional: true + '@types/google.maps': + optional: true + '@types/vimeo__player': + optional: true + '@types/youtube': + optional: true + '@nuxt/telemetry@2.6.6': resolution: {integrity: sha512-Zh4HJLjzvm3Cq9w6sfzIFyH9ozK5ePYVfCUzzUQNiZojFsI2k1QkSBrVI9BGc6ArKXj/O6rkI6w7qQ+ouL8Cag==} engines: {node: '>=18.12.0'} @@ -3992,131 +3874,66 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.36.0': - resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.40.1': resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.36.0': - resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.40.1': resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.36.0': - resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.40.1': resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.36.0': - resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.40.1': resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.36.0': - resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.40.1': resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.36.0': - resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.1': resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': - resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.40.1': resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.36.0': - resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.1': resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.36.0': - resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.1': resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.36.0': - resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.1': resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': - resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.1': resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': - resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.36.0': - resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.1': resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} cpu: [riscv64] @@ -4127,61 +3944,31 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.36.0': - resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.1': resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.36.0': - resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.1': resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.36.0': - resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.1': resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.36.0': - resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.40.1': resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.36.0': - resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.1': resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.36.0': - resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.1': resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} cpu: [x64] @@ -4985,6 +4772,9 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/ws@8.18.0': resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} @@ -5324,6 +5114,11 @@ packages: '@vueuse/core@11.3.0': resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + '@vueuse/core@13.1.0': + resolution: {integrity: sha512-PAauvdRXZvTWXtGLg8cPUFjiZEddTqmogdwYpnn60t08AA5a8Q4hZokBnpTOnVNqySlFlTcRYIC8OqreV4hv3Q==} + peerDependencies: + vue: ^3.5.0 + '@vueuse/core@9.13.0': resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} @@ -5379,6 +5174,9 @@ packages: '@vueuse/metadata@11.3.0': resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + '@vueuse/metadata@13.1.0': + resolution: {integrity: sha512-+TDd7/a78jale5YbHX9KHW3cEDav1lz1JptwDvep2zSG8XjCsVE+9mHIzjTOaPbHUAk5XiE4jXLz51/tS+aKQw==} + '@vueuse/metadata@9.13.0': resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} @@ -5393,6 +5191,11 @@ packages: '@vueuse/shared@11.3.0': resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + '@vueuse/shared@13.1.0': + resolution: {integrity: sha512-IVS/qRRjhPTZ6C2/AM3jieqXACGwFZwWTdw5sNTSKk2m/ZpkuuN+ri+WCVUP8TqaKwJYt/KuMwmXspMAw8E6ew==} + peerDependencies: + vue: ^3.5.0 + '@vueuse/shared@9.13.0': resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} @@ -6880,6 +6683,9 @@ packages: cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -7002,6 +6808,9 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -7690,11 +7499,6 @@ packages: peerDependencies: esbuild: '>=0.25.0' - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.3: resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} engines: {node: '>=18'} @@ -8727,6 +8531,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -8867,10 +8674,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.3: - resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} - engines: {node: '>= 4'} - ignore@7.0.4: resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} engines: {node: '>= 4'} @@ -9795,6 +9598,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkedom@0.16.11: + resolution: {integrity: sha512-WgaTVbj7itjyXTsCvgerpneERXShcnNJF5VIV+/4SLtyRLN+HppPre/WDHRofAr2IpEuujSNgJbCBd5lMl6lRw==} + listhen@1.9.0: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true @@ -10792,6 +10598,13 @@ packages: engines: {node: ^16.10.0 || >=18.0.0} hasBin: true + nuxt-csurf@1.6.5: + resolution: {integrity: sha512-/DMNTON8LIVhntamKbBmAuM879B0QnuSJa7ZAkmkZe+21m+1QGcjVUxtSkizaM48NUvkuAGYOG0ncn+kqEgrzw==} + + nuxt-security@2.2.0: + resolution: {integrity: sha512-bTdgAAAdnvM1R1wAX3zQBbYJh6YNFyvsKJwbT9oVv+0U9J/9+k+mufQlJMFO8AdTefi/EDFHG75in9RTnCpngQ==} + engines: {node: '>=18.0.0'} + nuxt@3.17.2: resolution: {integrity: sha512-zPEGeGlHoMCFf+Y9I7iEZKhdfsRq0Zf2qE8wEEcjP9T6omzm776h9KVzoj3+qPL1v0rGzSyCFslFtxk+Ey6neA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0.0} @@ -11966,7 +11779,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.13.0: @@ -12469,11 +12281,6 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true - rollup@4.36.0: - resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.40.1: resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -13645,6 +13452,9 @@ packages: engines: {node: '>=0.8.0'} hasBin: true + uhyphen@0.2.0: + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} + ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -13655,6 +13465,9 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + uncsrf@1.2.0: + resolution: {integrity: sha512-EyeG1tIx1zisLuqokSXZ5LhndzaUd2WBMS+18IlBUYobJsKSUQMpLIEm6QUfY/Azmhnnz0v2QbkrT6/u2K/Y1g==} + unctx@2.4.1: resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} @@ -13819,6 +13632,9 @@ packages: webpack: optional: true + unplugin-remove@1.0.3: + resolution: {integrity: sha512-BZMt9v8Y/Z27cY7YQv+DpcW928znjP1cqplBXOirbANiFQtM2YCdiyNAJhHCvjppT0lScNn1aDrQnXqnRp32pQ==} + unplugin-utils@0.2.4: resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} engines: {node: '>=18.12.0'} @@ -13835,8 +13651,8 @@ packages: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} - unplugin@2.2.1: - resolution: {integrity: sha512-Q0YDhwViJaSnHf1cxLf+/VKhmfdr/ZAS/RL2GQVO0cAbAfJAVUef2bvNu+veyWcEPNwsTlFmMiFLjf8Xeqog8g==} + unplugin@2.2.2: + resolution: {integrity: sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==} engines: {node: '>=18.12.0'} unplugin@2.3.2: @@ -14099,6 +13915,14 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + valibot@1.0.0: + resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -16232,153 +16056,78 @@ snapshots: dependencies: react: 18.3.1 - '@esbuild/aix-ppc64@0.25.1': - optional: true - '@esbuild/aix-ppc64@0.25.3': optional: true - '@esbuild/android-arm64@0.25.1': - optional: true - '@esbuild/android-arm64@0.25.3': optional: true - '@esbuild/android-arm@0.25.1': - optional: true - '@esbuild/android-arm@0.25.3': optional: true - '@esbuild/android-x64@0.25.1': - optional: true - '@esbuild/android-x64@0.25.3': optional: true - '@esbuild/darwin-arm64@0.25.1': - optional: true - '@esbuild/darwin-arm64@0.25.3': optional: true - '@esbuild/darwin-x64@0.25.1': - optional: true - '@esbuild/darwin-x64@0.25.3': optional: true - '@esbuild/freebsd-arm64@0.25.1': - optional: true - '@esbuild/freebsd-arm64@0.25.3': optional: true - '@esbuild/freebsd-x64@0.25.1': - optional: true - '@esbuild/freebsd-x64@0.25.3': optional: true - '@esbuild/linux-arm64@0.25.1': - optional: true - '@esbuild/linux-arm64@0.25.3': optional: true - '@esbuild/linux-arm@0.25.1': - optional: true - '@esbuild/linux-arm@0.25.3': optional: true - '@esbuild/linux-ia32@0.25.1': - optional: true - '@esbuild/linux-ia32@0.25.3': optional: true - '@esbuild/linux-loong64@0.25.1': - optional: true - '@esbuild/linux-loong64@0.25.3': optional: true - '@esbuild/linux-mips64el@0.25.1': - optional: true - '@esbuild/linux-mips64el@0.25.3': optional: true - '@esbuild/linux-ppc64@0.25.1': - optional: true - '@esbuild/linux-ppc64@0.25.3': optional: true - '@esbuild/linux-riscv64@0.25.1': - optional: true - '@esbuild/linux-riscv64@0.25.3': optional: true - '@esbuild/linux-s390x@0.25.1': - optional: true - '@esbuild/linux-s390x@0.25.3': optional: true - '@esbuild/linux-x64@0.25.1': - optional: true - '@esbuild/linux-x64@0.25.3': optional: true - '@esbuild/netbsd-arm64@0.25.1': - optional: true - '@esbuild/netbsd-arm64@0.25.3': optional: true - '@esbuild/netbsd-x64@0.25.1': - optional: true - '@esbuild/netbsd-x64@0.25.3': optional: true - '@esbuild/openbsd-arm64@0.25.1': - optional: true - '@esbuild/openbsd-arm64@0.25.3': optional: true - '@esbuild/openbsd-x64@0.25.1': - optional: true - '@esbuild/openbsd-x64@0.25.3': optional: true - '@esbuild/sunos-x64@0.25.1': - optional: true - '@esbuild/sunos-x64@0.25.3': optional: true - '@esbuild/win32-arm64@0.25.1': - optional: true - '@esbuild/win32-arm64@0.25.3': optional: true - '@esbuild/win32-ia32@0.25.1': - optional: true - '@esbuild/win32-ia32@0.25.3': optional: true - '@esbuild/win32-x64@0.25.1': - optional: true - '@esbuild/win32-x64@0.25.3': optional: true @@ -16405,6 +16154,13 @@ snapshots: '@eslint/js@8.57.1': {} + '@extractus/oembed-extractor@4.0.6(encoding@0.1.13)': + dependencies: + cross-fetch: 4.1.0(encoding@0.1.13) + linkedom: 0.16.11 + transitivePeerDependencies: + - encoding + '@fal-works/esbuild-plugin-global-externals@2.1.2': {} '@fastify/accept-negotiator@1.1.0': @@ -17767,13 +17523,56 @@ snapshots: pathe: 2.0.3 std-env: 3.9.0 + '@nuxt/scripts@0.11.5(@unhead/vue@2.0.8(vue@3.5.13(typescript@5.8.3)))(db0@0.3.2(better-sqlite3@11.9.1))(ioredis@5.6.1)(magicast@0.3.5)(nuxt@3.17.2(@parcel/watcher@2.5.1)(@types/node@20.17.24)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.6.1)(magicast@0.3.5)(meow@13.2.0)(optionator@0.9.4)(rollup@4.40.1)(stylelint@15.11.0(typescript@5.0.2))(terser@5.39.0)(tsx@4.19.4)(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.24)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))(yaml@2.7.1))(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@nuxt/kit': 3.17.2(magicast@0.3.5) + '@unhead/vue': 2.0.8(vue@3.5.13(typescript@5.8.3)) + '@vueuse/core': 13.1.0(vue@3.5.13(typescript@5.8.3)) + consola: 3.4.2 + defu: 6.1.4 + h3: 1.15.3 + magic-string: 0.30.17 + nuxt: 3.17.2(@parcel/watcher@2.5.1)(@types/node@20.17.24)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.6.1)(magicast@0.3.5)(meow@13.2.0)(optionator@0.9.4)(rollup@4.40.1)(stylelint@15.11.0(typescript@5.0.2))(terser@5.39.0)(tsx@4.19.4)(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.24)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))(yaml@2.7.1) + ofetch: 1.4.1 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.1.0 + sirv: 3.0.1 + std-env: 3.8.1 + ufo: 1.5.4 + unplugin: 2.2.2 + unstorage: 1.16.0(db0@0.3.2(better-sqlite3@11.9.1))(ioredis@5.6.1) + valibot: 1.0.0(typescript@5.8.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - magicast + - typescript + - uploadthing + - vue + '@nuxt/telemetry@2.6.6(magicast@0.3.5)': dependencies: '@nuxt/kit': 3.17.2(magicast@0.3.5) citty: 0.1.6 consola: 3.4.2 destr: 2.0.5 - dotenv: 16.4.7 + dotenv: 16.5.0 git-url-parse: 16.1.0 is-docker: 3.0.0 ofetch: 1.4.1 @@ -18473,120 +18272,63 @@ snapshots: optionalDependencies: rollup: 4.40.1 - '@rollup/rollup-android-arm-eabi@4.36.0': - optional: true - '@rollup/rollup-android-arm-eabi@4.40.1': optional: true - '@rollup/rollup-android-arm64@4.36.0': - optional: true - '@rollup/rollup-android-arm64@4.40.1': optional: true - '@rollup/rollup-darwin-arm64@4.36.0': - optional: true - '@rollup/rollup-darwin-arm64@4.40.1': optional: true - '@rollup/rollup-darwin-x64@4.36.0': - optional: true - '@rollup/rollup-darwin-x64@4.40.1': optional: true - '@rollup/rollup-freebsd-arm64@4.36.0': - optional: true - '@rollup/rollup-freebsd-arm64@4.40.1': optional: true - '@rollup/rollup-freebsd-x64@4.36.0': - optional: true - '@rollup/rollup-freebsd-x64@4.40.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.36.0': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.36.0': - optional: true - '@rollup/rollup-linux-arm64-musl@4.40.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.1': optional: true '@rollup/rollup-linux-riscv64-musl@4.40.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-x64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-x64-musl@4.36.0': - optional: true - '@rollup/rollup-linux-x64-musl@4.40.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.36.0': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.36.0': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.36.0': - optional: true - '@rollup/rollup-win32-x64-msvc@4.40.1': optional: true @@ -19867,6 +19609,8 @@ snapshots: '@types/web-bluetooth@0.0.20': {} + '@types/web-bluetooth@0.0.21': {} + '@types/ws@8.18.0': dependencies: '@types/node': 18.15.10 @@ -20362,7 +20106,7 @@ snapshots: '@vue/babel-plugin-resolve-type@1.4.0(@babel/core@7.26.10)': dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/core': 7.26.10 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.26.5 @@ -20504,6 +20248,13 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/core@13.1.0(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.1.0 + '@vueuse/shared': 13.1.0(vue@3.5.13(typescript@5.8.3)) + vue: 3.5.13(typescript@5.8.3) + '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.3))': dependencies: '@types/web-bluetooth': 0.0.16 @@ -20539,6 +20290,8 @@ snapshots: '@vueuse/metadata@11.3.0': {} + '@vueuse/metadata@13.1.0': {} + '@vueuse/metadata@9.13.0': {} '@vueuse/nuxt@11.3.0(magicast@0.3.5)(nuxt@3.17.2(@parcel/watcher@2.5.1)(@types/node@20.17.24)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.6.1)(magicast@0.3.5)(meow@13.2.0)(optionator@0.9.4)(rollup@4.40.1)(stylelint@15.11.0(typescript@5.0.2))(terser@5.39.0)(tsx@4.19.4)(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.24)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': @@ -20568,6 +20321,10 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/shared@13.1.0(vue@3.5.13(typescript@5.8.3))': + dependencies: + vue: 3.5.13(typescript@5.8.3) + '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.8.3))': dependencies: vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.3)) @@ -21431,8 +21188,8 @@ snapshots: chokidar: 3.6.0 confbox: 0.2.2 defu: 6.1.4 - dotenv: 16.4.7 - exsolve: 1.0.4 + dotenv: 16.5.0 + exsolve: 1.0.5 giget: 2.0.0 jiti: 2.4.2 ohash: 2.0.11 @@ -22289,7 +22046,7 @@ snapshots: cron-parser@4.9.0: dependencies: - luxon: 3.2.1 + luxon: 3.6.1 croner@9.0.0: {} @@ -22299,6 +22056,12 @@ snapshots: transitivePeerDependencies: - encoding + cross-fetch@4.1.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -22397,8 +22160,7 @@ snapshots: cssesc@3.0.0: {} - cssfilter@0.0.10: - optional: true + cssfilter@0.0.10: {} cssnano-preset-default@7.0.6(postcss@8.5.3): dependencies: @@ -22452,6 +22214,8 @@ snapshots: dependencies: css-tree: 2.2.1 + cssom@0.5.0: {} + csstype@3.1.3: {} cwd@0.10.0: @@ -23201,34 +22965,6 @@ snapshots: transitivePeerDependencies: - supports-color - esbuild@0.25.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 - esbuild@0.25.3: optionalDependencies: '@esbuild/aix-ppc64': 0.25.3 @@ -23412,7 +23148,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} @@ -24251,7 +23987,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 7.0.3 + ignore: 7.0.4 path-type: 6.0.0 slash: 5.1.0 unicorn-magic: 0.3.0 @@ -24576,6 +24312,8 @@ snapshots: html-escaper@2.0.2: {} + html-escaper@3.0.3: {} + html-tags@3.3.1: {} html-void-elements@3.0.0: {} @@ -24770,8 +24508,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.3: {} - ignore@7.0.4: {} image-meta@0.2.1: {} @@ -25078,7 +24814,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-regex@1.2.1: dependencies: @@ -25851,7 +25587,7 @@ snapshots: lambda-local@2.2.0: dependencies: commander: 10.0.1 - dotenv: 16.4.7 + dotenv: 16.5.0 winston: 3.17.0 latest-version@7.0.0: @@ -25910,6 +25646,14 @@ snapshots: lines-and-columns@1.2.4: {} + linkedom@0.16.11: + dependencies: + css-select: 5.1.0 + cssom: 0.5.0 + html-escaper: 3.0.3 + htmlparser2: 9.1.0 + uhyphen: 0.2.0 + listhen@1.9.0: dependencies: '@parcel/watcher': 2.5.1 @@ -26743,7 +26487,7 @@ snapshots: acorn: 8.14.1 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.1 mocha@11.2.2: dependencies: @@ -27325,6 +27069,28 @@ snapshots: nuxi@3.23.1: {} + nuxt-csurf@1.6.5(magicast@0.3.5): + dependencies: + '@nuxt/kit': 3.17.2(magicast@0.3.5) + defu: 6.1.4 + uncsrf: 1.2.0 + transitivePeerDependencies: + - magicast + + nuxt-security@2.2.0(magicast@0.3.5)(rollup@4.40.1): + dependencies: + '@nuxt/kit': 3.17.2(magicast@0.3.5) + basic-auth: 2.0.1 + defu: 6.1.4 + nuxt-csurf: 1.6.5(magicast@0.3.5) + pathe: 1.1.2 + unplugin-remove: 1.0.3(rollup@4.40.1) + xss: 1.0.15 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + nuxt@3.17.2(@parcel/watcher@2.5.1)(@types/node@20.17.24)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.6.1)(magicast@0.3.5)(meow@13.2.0)(optionator@0.9.4)(rollup@4.40.1)(stylelint@15.11.0(typescript@5.0.2))(terser@5.39.0)(tsx@4.19.4)(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.24)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1))(yaml@2.7.1): dependencies: '@nuxt/cli': 3.25.0(magicast@0.3.5) @@ -27866,7 +27632,7 @@ snapshots: parse-json@8.1.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 index-to-position: 0.1.2 type-fest: 4.37.0 @@ -29378,31 +29144,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.36.0: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.36.0 - '@rollup/rollup-android-arm64': 4.36.0 - '@rollup/rollup-darwin-arm64': 4.36.0 - '@rollup/rollup-darwin-x64': 4.36.0 - '@rollup/rollup-freebsd-arm64': 4.36.0 - '@rollup/rollup-freebsd-x64': 4.36.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 - '@rollup/rollup-linux-arm-musleabihf': 4.36.0 - '@rollup/rollup-linux-arm64-gnu': 4.36.0 - '@rollup/rollup-linux-arm64-musl': 4.36.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 - '@rollup/rollup-linux-riscv64-gnu': 4.36.0 - '@rollup/rollup-linux-s390x-gnu': 4.36.0 - '@rollup/rollup-linux-x64-gnu': 4.36.0 - '@rollup/rollup-linux-x64-musl': 4.36.0 - '@rollup/rollup-win32-arm64-msvc': 4.36.0 - '@rollup/rollup-win32-ia32-msvc': 4.36.0 - '@rollup/rollup-win32-x64-msvc': 4.36.0 - fsevents: 2.3.3 - rollup@4.40.1: dependencies: '@types/estree': 1.0.7 @@ -30922,6 +30663,8 @@ snapshots: uglify-js@3.19.3: optional: true + uhyphen@0.2.0: {} + ultrahtml@1.6.0: {} unbox-primitive@1.1.0: @@ -30933,12 +30676,14 @@ snapshots: uncrypto@0.1.3: {} + uncsrf@1.2.0: {} + unctx@2.4.1: dependencies: acorn: 8.14.1 estree-walker: 3.0.3 magic-string: 0.30.17 - unplugin: 2.2.1 + unplugin: 2.3.2 undici-types@6.19.8: {} @@ -31115,6 +30860,19 @@ snapshots: vite: 6.3.5(@types/node@18.15.10)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) webpack: 5.98.0(@swc/core@1.11.11(@swc/helpers@0.5.15))(esbuild@0.25.3) + unplugin-remove@1.0.3(rollup@4.40.1): + dependencies: + '@babel/core': 7.26.10 + '@babel/generator': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/traverse': 7.26.10 + '@rollup/pluginutils': 5.1.4(rollup@4.40.1) + magic-string: 0.30.17 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + - supports-color + unplugin-utils@0.2.4: dependencies: pathe: 2.0.3 @@ -31147,7 +30905,7 @@ snapshots: acorn: 8.14.1 webpack-virtual-modules: 0.6.2 - unplugin@2.2.1: + unplugin@2.2.2: dependencies: acorn: 8.14.1 webpack-virtual-modules: 0.6.2 @@ -31333,6 +31091,10 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + valibot@1.0.0(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -31517,11 +31279,11 @@ snapshots: vite@6.3.5(@types/node@18.15.10)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1): dependencies: - esbuild: 0.25.1 + esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.36.0 + rollup: 4.40.1 tinyglobby: 0.2.13 optionalDependencies: '@types/node': 18.15.10 @@ -31533,11 +31295,11 @@ snapshots: vite@6.3.5(@types/node@20.17.24)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1): dependencies: - esbuild: 0.25.1 + esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.36.0 + rollup: 4.40.1 tinyglobby: 0.2.13 optionalDependencies: '@types/node': 20.17.24 @@ -31549,11 +31311,11 @@ snapshots: vite@6.3.5(@types/node@20.5.1)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1): dependencies: - esbuild: 0.25.1 + esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.36.0 + rollup: 4.40.1 tinyglobby: 0.2.13 optionalDependencies: '@types/node': 20.5.1 @@ -32001,7 +31763,6 @@ snapshots: dependencies: commander: 2.20.3 cssfilter: 0.0.10 - optional: true xtend@4.0.2: {} From f00cbfb9b44511a831047a092619bc9ed6ba7aa8 Mon Sep 17 00:00:00 2001 From: Dylan Kelly Date: Fri, 20 Jun 2025 15:03:11 +1000 Subject: [PATCH 2/2] feat(@dpc-sdp/ripple-tide-api): rewrite iframe src to use embed page --- examples/nuxt-app/nuxt.config.ts | 2 +- .../plugins/analytics.ts | 3 +- .../layers/script-loader/nuxt.config.ts | 39 ++++++++++++++++++- .../layers/script-loader/pages/embed.vue | 2 +- packages/ripple-sdp-core/nuxt.config.ts | 10 ++--- .../markup-transpiler/default-plugins.ts | 6 ++- 6 files changed, 50 insertions(+), 12 deletions(-) diff --git a/examples/nuxt-app/nuxt.config.ts b/examples/nuxt-app/nuxt.config.ts index c60bedea0b..aae6f12001 100644 --- a/examples/nuxt-app/nuxt.config.ts +++ b/examples/nuxt-app/nuxt.config.ts @@ -19,7 +19,7 @@ export default defineNuxtConfig({ // See https://nuxt.com/docs/getting-started/layers - each content type is a added as a Nuxt layer extends: [ '@dpc-sdp/nuxt-ripple', - // '@dpc-sdp/nuxt-ripple-analytics', + '@dpc-sdp/nuxt-ripple-analytics', '@dpc-sdp/nuxt-ripple-preview', '@dpc-sdp/ripple-sdp-core', // Local layers diff --git a/packages/nuxt-ripple-analytics/plugins/analytics.ts b/packages/nuxt-ripple-analytics/plugins/analytics.ts index 3b216dc48d..185ddb1949 100644 --- a/packages/nuxt-ripple-analytics/plugins/analytics.ts +++ b/packages/nuxt-ripple-analytics/plugins/analytics.ts @@ -43,7 +43,8 @@ const setupDataLayer = (featureFlags: IRplFeatureFlags) => { const setupGTM = (GTM_ID: string) => { if (GTM_ID) { // Add tracking code to page with loadScript - loadScript(GTM_ID, { defer: true, compatibility: false }) + const nonce = useNonce() + loadScript(GTM_ID, { defer: true, compatibility: false, nonce }) } } diff --git a/packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts b/packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts index f716d9f9da..fa6ec13e48 100644 --- a/packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts +++ b/packages/ripple-sdp-core/layers/script-loader/nuxt.config.ts @@ -1,3 +1,40 @@ import { defineNuxtConfig } from 'nuxt/config' -export default defineNuxtConfig({}) +export default defineNuxtConfig({ + modules: ['nuxt-security', '@nuxt/scripts'], + scripts: { + debug: true + }, + security: { + rateLimiter: false, + strict: true, // Enables strict mode for security headers + nonce: true, // Enables HTML nonce support in SSR mode + headers: { + crossOriginEmbedderPolicy: 'unsafe-none', + crossOriginResourcePolicy: 'same-origin', + contentSecurityPolicy: { + 'worker-src': ["'self'", 'blob:'], + 'img-src': ["'self'", 'data:', process.env.NUXT_PUBLIC_TIDE_BASE_URL], + 'style-src': ["'unsafe-inline'", "'self'"], + 'font-src': [`'self'`, 'data:'], + 'script-src': ["'nonce-{{nonce}}'", "'strict-dynamic'"], + 'connect-src': ["'self'", 'https:'] + } + } + }, + routeRules: { + '/embed': { + security: { + headers: { + permissionsPolicy: { + 'picture-in-picture': [], + geolocation: [] + }, + xFrameOptions: 'SAMEORIGIN', + crossOriginEmbedderPolicy: 'unsafe-none', + contentSecurityPolicy: false + } + } + } + } +}) diff --git a/packages/ripple-sdp-core/layers/script-loader/pages/embed.vue b/packages/ripple-sdp-core/layers/script-loader/pages/embed.vue index 851c3fadfc..5fe836371f 100644 --- a/packages/ripple-sdp-core/layers/script-loader/pages/embed.vue +++ b/packages/ripple-sdp-core/layers/script-loader/pages/embed.vue @@ -95,7 +95,7 @@ const url = computed(() => { defineRouteRules({ security: { headers: { - permissionsPolicy: { 'picture-in-picture': [`'${iframeDomain.value}'`] } + permissionsPolicy: false } } }) diff --git a/packages/ripple-sdp-core/nuxt.config.ts b/packages/ripple-sdp-core/nuxt.config.ts index c2965a7ce2..bc89a1ae18 100644 --- a/packages/ripple-sdp-core/nuxt.config.ts +++ b/packages/ripple-sdp-core/nuxt.config.ts @@ -19,13 +19,9 @@ export default defineNuxtConfig({ 'worker-src': ["'self'", 'blob:'], 'img-src': ["'self'", 'data:', process.env.NUXT_PUBLIC_TIDE_BASE_URL], 'style-src': ["'unsafe-inline'", "'self'"], - 'script-src': [ - "'self'", - 'https:', - "'unsafe-inline'", - "'nonce-{{nonce}}'", - "'strict-dynamic'" - ] + 'font-src': [`'self'`, 'data:'], + 'script-src': ["'nonce-{{nonce}}'", "'strict-dynamic'"], + 'connect-src': ["'self'", 'https:'] } } }, diff --git a/packages/ripple-tide-api/src/utils/markup-transpiler/default-plugins.ts b/packages/ripple-tide-api/src/utils/markup-transpiler/default-plugins.ts index ef5be8e853..aa6c8a0083 100644 --- a/packages/ripple-tide-api/src/utils/markup-transpiler/default-plugins.ts +++ b/packages/ripple-tide-api/src/utils/markup-transpiler/default-plugins.ts @@ -173,7 +173,7 @@ const pluginEmbededVideo = function (this: any) { const iframe = $video.find('iframe') const height = iframe.attr('height') const width = iframe.attr('width') - const source = iframe.attr('src') + const source = `/embed?url=${iframe.attr('src')}` const title = $video.attr('title') || '' const caption = $video.find('figcaption')?.text() const link = $video.find('.field--name-field-media-link a')?.attr('href') @@ -309,6 +309,10 @@ const pluginIFrames = function (this: any) { const $iframe = this.find(el) const wrapperClasses = ['rpl-iframe'] + if (!$iframe.attr('src').startsWith('/embed?url')) { + $iframe.attr('src', `/embed?url=${$iframe.attr('src')}`) + } + // If no height setting from CMS, we give it a default height if (!$iframe.attr('height')) { wrapperClasses.push('rpl-iframe--default')