Skip to content

Persistence

XDS provides a built-in persistence plugin that makes it easy to save store state to localStorage, sessionStorage, or any custom storage engine.

Installation

The persistence plugin is provided via the persistence factory function. You can register it globally when installing XDS.

typescript
import { createApp } from 'vue'
import { xds, persistence } from 'xds'

const app = createApp(App)

app.use(
  xds({
    plugins: [
      persistence({
        // Configuration options
        enable: ['counter', 'auth'], // List of store IDs to persist
      }),
    ],
  }),
)

Configuration

The persistence function accepts an options object with the following properties:

enable

  • Type: string[] | ((id: string) => boolean)
  • Description: Determines which stores should be persisted. You can pass an array of store IDs or a function that returns true for stores that should be persisted.

defaultStrategy

  • Type: PersistenceStrategy
  • Description: The default persistence strategy applied to all enabled stores.

strategies

  • Type: Record<string, PersistenceStrategy>
  • Description: Per-store strategy overrides. Keys are store IDs.

Persistence Strategy

A strategy object configures how a specific store is persisted.

typescript
interface PersistenceStrategy {
  key?: string // Storage key (default: store.$id)
  storage?: StorageLike // Storage engine (default: localStorage)
  paths?: string[] // Whitelist: only persist these paths
  omit?: string[] // Blacklist: persist everything except these paths
  serializer?: Serializer // Custom serializer (default: JSON)
  debug?: boolean // Enable debug logs
  version?: number // Data version for migration
  migrate?: (oldState: any, oldVersion: number) => StateTree // Migration function
}

Examples

Basic Usage

Persist the 'counter' store to localStorage.

typescript
app.use(
  xds({
    plugins: [
      persistence({
        enable: ['counter'],
      }),
    ],
  }),
)

Using sessionStorage

typescript
app.use(
  xds({
    plugins: [
      persistence({
        enable: ['session-data'],
        defaultStrategy: {
          storage: sessionStorage,
        },
      }),
    ],
  }),
)

Partial Persistence (Whitelist)

Only persist the token and user fields of the auth store.

typescript
app.use(
  xds({
    plugins: [
      persistence({
        enable: ['auth'],
        strategies: {
          auth: {
            paths: ['token', 'user'],
          },
        },
      }),
    ],
  }),
)

Different Configuration per Store

You can apply different persistence strategies to different stores using the strategies option. For example, persisting only the token for aStore and boken for bStore.

typescript
app.use(
  xds({
    plugins: [
      persistence({
        enable: ['aStore', 'bStore'],
        strategies: {
          aStore: {
            paths: ['token'], // Only persist 'token' for aStore
          },
          bStore: {
            paths: ['boken'], // Only persist 'boken' for bStore
          },
        },
      }),
    ],
  }),
)

Versioning and Migration

Handle state structure changes with versioning.

typescript
app.use(
  xds({
    plugins: [
      persistence({
        enable: ['settings'],
        strategies: {
          settings: {
            version: 2,
            migrate: (state, oldVersion) => {
              if (oldVersion === 1) {
                // Rename 'theme' to 'appearance'
                return { ...state, appearance: state.theme }
              }
              return state
            },
          },
        },
      }),
    ],
  }),
)

Manual Watch (Legacy)

If you prefer full control, you can still use Vue's watch manually.

typescript
import { watch } from 'vue'

watch(
  () => store.$state,
  (state) => {
    localStorage.setItem('myState', JSON.stringify(state))
  },
  { deep: true },
)