// @ts-check
import { resolve } from 'upath'
-import { addPlugin, defineNuxtModule } from '@nuxt/kit'
+import { addPlugin, defineNuxtModule, resolveModule } from '@nuxt/kit'
export interface PiniaNuxtOptions {
/**
addPlugin({ src: resolve(__dirname, 'plugin') })
+ // Define pinia resolution to ensure plugins register global context successfully
+ nuxt.options.alias['pinia'] =
+ nuxt.options.alias['pinia'] || resolveModule('pinia')
+
// transpile pinia if @vue/composition-api is transpiled because we must use the same instance
if (
!nuxt.options.dev &&
import { defineNuxtPlugin } from '@nuxt/app'
-import { markRaw } from '@nuxt/app/node_modules/@vue/runtime-core'
-import { createPinia, setActivePinia } from 'pinia'
+import { markRaw, isVue2, Vue2 } from 'vue-demi'
+import { createPinia, setActivePinia, PiniaPlugin } from 'pinia'
-const PiniaPlugin = defineNuxtPlugin((nuxt) => {
+if (isVue2) {
+ Vue2(PiniaPlugin)
+}
+
+a._legacyContext
+
+const PiniaNuxtPlugin = defineNuxtPlugin((nuxt) => {
const pinia = createPinia()
- // if Vue 2, simulate new Vue({ pinia })
- nuxt.app.pinia = pinia
+ if (isVue2) {
+ // simulate new Vue({ pinia })
+ nuxt._legacyContext.app.pinia = pinia
+ // nuxt.app.pinia = pinia
+ }
// TODO: handle this once we know how to do it
// add $pinia to the context
if (process.server) {
// beforeNuxt render set nuxtState.pinia = pinia.state.value
+ nuxt.payload.data.pinia = pinia.state.value
} else {
// set pinia.state.value = nuxtState.pinia
+ pinia.state.value = nuxt.payload.data.pinia
}
})
-export default PiniaPlugin
+export default PiniaNuxtPlugin
--- /dev/null
+import '@nuxt/app'
+import 'pinia'
+import { Pinia } from 'pinia'
+
+// declare module '@nuxt/app' {
+// export interface Context {
+// pinia: Pinia
+// $pinia: Pinia
+// }
+// }
+
+declare module 'pinia' {
+ export interface PiniaCustomProperties {
+ $nuxt: Context
+ }
+}