npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@contentful/optimization-node

v0.1.0-alpha8

Published

<p align="center"> <a href="https://www.contentful.com/developers/docs/personalization/"> <img alt="Contentful Logo" title="Contentful" src="../../../contentful-icon.png" width="150"> </a> </p>

Readme

Readme · Reference · Contributing

[!WARNING]

The Optimization SDK Suite is currently ALPHA! Breaking changes may be published at any time.

The Optimization Node SDK implements functionality specific to Node environments, based on the Optimization Core Library. This SDK is part of the Contentful Optimization SDK Suite.

Getting Started

Install using an NPM-compatible package manager, pnpm for example:

pnpm install @contentful/optimization-node

Import the Optimization class; both CJS and ESM module systems are supported, ESM preferred:

import Optimization from '@contentful/optimization-node'

Configure and initialize the Optimization Node SDK:

const optimization = new Optimization({ clientId: 'abc123' })

Reference Implementations

Reference implementations illustrate how the SDK may be used under common scenarios, as well as select less-common scenarios, with the most basic example solution possible.

  • Node SSR Only: Example application that uses the Node SDK to render a personalized Web page
  • Node SSR + Web Vanilla: Example application demonstrating simple profile synchronization between the Node and Web SDKs via cookie

Configuration

Top-level Configuration Options

| Option | Required? | Default | Description | | ----------------- | --------- | ----------------------------- | ------------------------------------------------------------------------------ | | analytics | No | See "Analytics Options" | Configuration specific to the Analytics/Insights API | | app | No | undefined | The application definition used to attribute events to a specific consumer app | | clientId | Yes | N/A | The Ninetailed API Key which can be found in the Ninetailed Admin app | | environment | No | 'main' | The Ninetailed environment configured in the Ninetailed Admin app | | eventBuilder | No | See "Event Builder Options" | Event builder configuration (channel/library metadata, etc.) | | fetchOptions | No | See "Fetch Options" | Configuration for Fetch timeout and retry functionality | | logLevel | No | 'error' | Minimum log level for the default console sin | | personalization | No | See "Personalization Options" | Configuration specific to the Personalization/Experience API |

Analytics Options

| Option | Required? | Default | Description | | --------- | --------- | ------------------------------------------ | ----------------------------- | | baseUrl | No | 'https://ingest.insights.ninetailed.co/' | Base URL for the Insights API |

Event Builder Options

Event builder options should only be supplied when building an SDK on top of the Optimization Node SDK or any of its descendent SDKs.

| Option | Required? | Default | Description | | --------- | --------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------- | | channel | No | 'server' | The channel that identifies where events originate from (e.g. 'web', 'mobile') | | library | No | { name: 'Optimization Node API', version: '0.0.0' } | The client library metadata that is attached to all events |

Fetch Options

Fetch options allow for configuration of a Fetch API-compatible fetch method and the retry/timeout logic integrated into the Optimization API Client. Specify the fetchMethod when the host application environment does not offer a fetch method that is compatible with the standard Fetch API in its global scope.

| Option | Required? | Default | Description | | ------------------ | --------- | ----------- | --------------------------------------------------------------------- | | fetchMethod | No | undefined | Signature of a fetch method used by the API clients | | intervalTimeout | No | 0 | Delay (in milliseconds) between retry attempts | | onFailedAttempt | No | undefined | Callback invoked whenever a retry attempt fails | | onRequestTimeout | No | undefined | Callback invoked when a request exceeds the configured timeout | | requestTimeout | No | 3000 | Maximum time (in milliseconds) to wait for a response before aborting | | retries | No | 1 | Maximum number of retry attempts |

Configuration method signatures:

  • fetchMethod: (url: string | URL, init: RequestInit) => Promise<Response>
  • onFailedAttempt and onRequestTimeout: (options: FetchMethodCallbackOptions) => void

Personalization Options

| Option | Required? | Default | Description | | ----------------- | --------- | ------------------------------------- | ------------------------------------------------------------------- | | baseUrl | No | 'https://experience.ninetailed.co/' | Base URL for the Experience API | | enabledFeatures | No | ['ip-enrichment', 'location'] | Enabled features which the API may use for each request | | ip | No | undefined | IP address to override the API behavior for IP analysis | | locale | No | 'en-US' (in API) | Locale used to translate location.city and location.country | | plainText | No | false | Sends performance-critical endpoints in plain text | | preflight | No | false | Instructs the API to aggregate a new profile state but not store it |

Optimization Methods

Arguments marked with an asterisk (*) are always required.

Personalization Data Resolution Methods

getCustomFlag

Get the specified Custom Flag's value from the provided changes array.

Arguments:

  • name*: The name/key of the Custom Flag
  • changes: Changes array

Returns:

  • The resolved value for the specified Custom Flag, or undefined if it cannot be found.

[!NOTE]

If the changes argument is omitted, the method will return undefined.

personalizeEntry

Resolve a baseline Contentful entry to a personalized variant using the provided selected personalizations.

Type arguments:

  • S: Entry skeleton type
  • M: Chain modifiers
  • L: Locale code

Arguments:

  • entry*: The entry to personalize
  • personalizations: Selected personalizations

Returns:

  • The resolved personalized entry variant, or the supplied baseline entry if baseline is the selected variant or a variant cannot be found.

[!NOTE]

If the personalizations argument is omitted, the method will return the baseline entry.

getMergeTagValue

Resolve a "Merge Tag" to a value based on the provided profile. A "Merge Tag" is a special Rich Text fragment supported by Contentful that specifies a profile data member to be injected into the Rich Text when rendered.

Arguments:

  • embeddedNodeEntryTarget*: The merge tag entry node to resolve
  • profile: The user profile

[!NOTE]

If the profile argument is omitted, the method will return the merge tag's fallback value.

Personalization and Analytics Event Methods

Each method except trackFlagView may return an OptimizationData object containing:

  • changes: Currently used for Custom Flags
  • personalizations: Selected personalizations for the profile
  • profile: Profile associated with the evaluated events

identify

Identify the current profile/visitor to associate traits with a profile.

Arguments:

  • payload*: Identify event builder arguments object, including an optional profile property with a PartialProfile value that requires only an id

page

Record a personalization page view.

Arguments:

  • payload*: Page view event builder arguments object, including an optional profile property with a PartialProfile value that requires only an id

track

Record a personalization custom track event.

Arguments:

  • payload*: Track event builder arguments object, including an optional profile property with a PartialProfile value that requires only an id

trackComponentView

Record an analytics component view event. When the payload marks the component as "sticky", an additional personalization component view is recorded. This method only returns OptimizationData when the component is marked as "sticky".

Arguments:

  • payload*: Component view event builder arguments object, including an optional profile property with a PartialProfile value that requires only an id

trackFlagView

Track a feature flag view via analytics. This is functionally the same as a non-sticky component view event.

Arguments:

  • payload*: Component view event builder arguments object, including an optional profile property with a PartialProfile value that requires only an id

Interceptors

Interceptors may be used to read and/or modify data flowing through the Core SDK.

Life-cycle Interceptors

  • event: Intercepts an event's data before it is queued and/or emitted
  • state: Intercepts state data retrieved from an Experience API call before updating the SDK's internal state

Example interceptor usage:

optimization.interceptors.event((event) => {
  event.properties.timestamp = new Date().toISOString()
})

[!WARNING]

Interceptors are intended to enable low-level interoperability; to simply read and react to Optimization SDK events, use the states observables.