Home
Softono

Nuxt Feature Flags

Open source MIT TypeScript
89
Stars
2
Forks
2
Issues
1
Watchers
3 months
Last Commit

 About Nuxt Feature Flags

A powerful, type-safe feature flag module for Nuxt 3 that enables both static and dynamic feature flag evaluation with server-side support. Perfect for A/B testing, gradual rollouts, and feature management.

Platforms

Web Self-hosted

Languages

TypeScript

Need Help Installing Nuxt Feature Flags?

We provide expert installation service for this software. Our team will install, configure, and secure Nuxt Feature Flags on your server. plans start at just $30.

Nuxt Feature Flags

View on GitHub

nuxt-feature-flags

npm version npm downloads License Nuxt

Nuxt Feature Flags

Type-safe feature flags for Nuxt 3 with runtime evaluation and built-in A/B testing.

Highlights

  • Runtime flag resolution on server requests.
  • Async config support (defineFeatureFlags(async () => ...)).
  • Built-in variant assignment for experiments.
  • Nuxt auto-imports for client and server helpers.
  • Validation and test tooling for safer rollouts.

Installation

npx nuxi module add nuxt-feature-flags

Quick Start

1. Enable the module

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['nuxt-feature-flags'],
  featureFlags: {
    config: './feature-flags.config.ts',
  },
})

2. Define flags

// feature-flags.config.ts
import { defineFeatureFlags } from '#feature-flags/handler'

export default defineFeatureFlags(async () => {
  const remoteFlags = await $fetch('https://api.example.com/flags')

  return {
    newDashboard: true,
    checkoutExperiment: {
      enabled: true,
      value: 'control',
      variants: [
        { name: 'control', weight: 50, value: 'control' },
        { name: 'treatment', weight: 50, value: 'treatment' },
      ],
    },
    ...remoteFlags,
  }
})

3. Use flags in client and server

<script setup lang="ts">
const { flags, isEnabled } = useFeatureFlags()
const { flags: asyncFlags, pending, error } = useAsyncFeatureFlags()
</script>

<template>
  <NewDashboard v-if="isEnabled('newDashboard')" />

  <div v-if="pending">Loading flags...</div>
  <div v-else-if="error">Could not refresh flags</div>
  <CheckoutV2 v-else-if="asyncFlags.checkoutExperiment?.enabled" />
</template>
// server/api/data.ts
import { getFeatureFlags } from '#feature-flags/server/utils'

export default defineEventHandler(async (event) => {
  const { isEnabled, getVariant } = await getFeatureFlags(event)

  if (!isEnabled('newDashboard')) {
    throw createError({ statusCode: 404, statusMessage: 'Feature disabled' })
  }

  return {
    variant: getVariant('checkoutExperiment'),
  }
})

API

Client

  • useFeatureFlags()

    • flags
    • isEnabled(flag)
    • getValue(flag)
    • getVariant(flag)
  • useAsyncFeatureFlags()

    • flags
    • pending
    • error
    • refresh()

Server

  • await getFeatureFlags(event)
    • flags
    • isEnabled(flag)
    • getValue(flag)
    • getVariant(flag)

Directive

<template>
  <div v-feature="'myFlag'">Only when enabled</div>
</template>

Migration Notes (v1 -> v2)

  • Server resolution is async: await getFeatureFlags(event).
  • Async config functions are supported.
  • useAsyncFeatureFlags is available for client refresh states.
  • useFeatureFlags reads already-resolved flags from Nuxt app context.

Testing

Current branch status:

  • npm run lint passes.
  • npm run test passes (208 tests).
  • npx nuxt-module-build build passes (non-blocking builder warnings may appear).

Documentation

License

MIT License (c) 2024