@vercel/flags/next Reference
The reference for the @vercel/flags/next submoduleThe flags pattern and precomputed flags pattern exported from
@vercel/flags/next
are experimental. We are still actively researching and
have further iterations planned. These exports are not covered by semantic
versioning as indicated by the unstable_
prefix.
The @vercel/flags/next
submodule implements the Feature Flags pattern for Next.js App Router.
To learn more about the Flags pattern and the precomputed Flags pattern:
Flags Architectural Patterns
Architectural patterns for working with feature flags
Using Flags in Next.js
Learn how to set up and use the @vercel/flags/next submodule for Next.js.
To install the @vercel/flags
package, see Install and use the @vercel/flags
package.
Description: Declares a feature flag
A feature flag declared this way will automatically respect overrides set by Vercel Toolbar and integrate with Runtime Logs, Web Analytics, and more.
Parameter | Type | Description |
---|---|---|
key | string | Key of the feature flag. |
decide | function | Resolves the value of the feature flag. |
defaultValue (Optional) | any | Fallback value in case the decide function returns undefined or throws an error. |
description (Optional) | string | Description of the feature flag. |
origin (Optional) | string | The URL where this feature flag can be managed. |
options (Optional) | { label?: string, value: any }[] | Possible values a feature flag can resolve to, which are displayed in Vercel Toolbar. |
The key
, description
, origin
, and options
appear in Vercel Toolbar.
import { unstable_flag as flag } from '@vercel/flags/next';
export const showSummerSale = flag<boolean>({
key: 'summer-sale',
async decide() {
return false;
},
origin: 'https://example.com/flags/summer-sale/',
description: 'Show Summer Holiday Sale Banner, 20% off',
defaultValue: false,
options: [
// options are not necessary for boolean flags, but we customize their labels here
{ value: false, label: 'Hide' },
{ value: true, label: 'Show' },
],
});
Description: Turns flags declared using unstable_flag
into Vercel Toolbar compatible definitions.
Parameter | Type | Description |
---|---|---|
flags | Record<string, Flag> | A record where the values are feature flags. The keys are not used. |
These APIs are relevant for precomputing feature flags.
Description: Evaluates multiple feature flags. Returns their values encoded to a single signed string.
This call is a shorthand for calling unstable_evaluate
and unstable_serialize
manually.
Parameter | Type | Description |
---|---|---|
flags | function[] | Flags |
code | string | Precomputation code generated by the original precompute call. |
Description: Evaluates multiple feature flags and returns their values.
Parameter | Type | Description |
---|---|---|
flags | function[] | An array of flags declared using unstable_flag . |
context (Optional) | any | A value which will be made available through unstable_getPrecomputationContext from within a flag's decide function. |
import { unstable_evaluate as evaluate } from '@vercel/flags/next';
const values = await evaluate(precomputeFlags, context);
Description: Turns evaluated feature flags into their serialized representation.
Parameter | Type | Description |
---|---|---|
flags | function[] | Feature Flags to be serialized. |
values | unknown[] | The value each flag declared in flags resolved to. |
secret (Optional) | string | The secret used to sign the returned representation. |
import {
unstable_precompute as precompute,
unstable_serialize as serialize,
} from '@vercel/flags/next';
const values = await precompute(precomputeFlags, context);
const code = await serialize(precomputeFlags, values);
Note that unstable_serialize
compresses to a tiny format, with only two bytes per feature flag and a few bytes overhead for JWS signature.
The underlying algorithm basically has special values for boolean values and null
. If your feature flag can return non-boolean values, it's advised to declare them in options
when declaring the flag using unstable_flag
. That way this serialization can store the index of the matched option instead of its values, which further shortens the emitted.
Description: Retrieves the value of one or multiple feature flags from the precomputation and returns them as an array.
Parameter | Type | Description |
---|---|---|
flag | function | function[] | A flag or an array of flags declared using unstable_flag whose values should be extracted from the precomputation . |
precomputeFlags | function[] | Flags used when precompute was called and created the precomputation code. |
code | string | Precomputation code generated by the original precompute call. |
import {
unstable_getPrecomputed as getPrecomputed,
unstable_precompute as precompute,
} from '@vercel/flags/next';
const precomputeFlags = [
showSummerBannerFlag,
showFreeDeliveryBannerFlag,
countryFlag,
];
const code = await precompute(precomputeFlags);
const [showSummerBanner, showFreeDeliveryBanner] = await getPrecomputed(
[showSummerBannerFlag, showFreeDeliveryBannerFlag],
precomputeFlags,
code,
);
It is recommended to call the feature flag directly, for example:
import {
unstable_flag as flag,
unstable_precompute as precompute,
} from '@vercel/flags/next';
const showSummerSale = flag({
key: 'summer-sale',
decide: () => false,
});
const precomputeFlags = [
showSummerSale,
/*...*/
];
const code = await precompute(precomputeFlags);
// This will not actually invoke `showSummerSale`'s `decide` function, it will just read the result.
const sale = await showSummerSale(code, precomputeFlags);
Description: Retrieves the value of all feature flags and returns them as a record. Keys will be the key
passed to when declaring flags using unstable_flag
. Returns Record<string, unknown>
.
Parameter | Type | Description |
---|---|---|
flags | function[] | Flags |
code | string | Precomputation code generated by the original precompute call. |
Reads the second context supplied by unstable_precompute(flags, context)
or unstable_evaluate(flags, context)
.
When invoking flags using precompute
an optional second argument can be supplied as context. This would typically forward a feature flag client or other information which needs flow from middleware into a feature flag's decide
function.
// middleware.ts
// any context, in this example we're forwarding a customer's plan
import {
unstable_flag as flag,
unstable_getPrecomputationContext as getPrecomputationContext,
unstable_precompute as precompute,
} from '@vercel/flags/next';
const context = { plan: 'pro' };
await precompute(flags, context);
// flags.ts
const plan = flag({
key: 'plan',
decide: () => {
// this function now has access to the context supplied earlier
const context = getPrecomputationContext();
return context.plan;
},
});
Description: Calculates all precomputations of the options of the provided flags.
Parameter | Type | Description |
---|---|---|
flags | function[] | Flags |
filter (Optional) | function | This function is called with every possible precomputation of the flag's options. Return true to keep the option. |
secret (Optional) | string | The secret used to sign the generated code. Defaults to process.env.FLAGS_SECRET |
Example usage in generateStaticParams
:
import { unstable_generatePermutations as generatePermutations } from '@vercel/flags/next';
export async function generateStaticParams() {
const codes = await generatePermutations(precomputeFlags);
return codes.map((code) => ({ code }));
}
Was this helpful?