Using Plugins
Plugin Overview
Extend UDL with plugins to connect to your data sources
What Are Plugins?
Plugins extend Universal Data Layer by connecting to external data sources like Contentful, Shopify, or your own APIs. Each plugin:
- Fetches data from its source
- Creates GraphQL nodes in the UDL schema
- Handles caching and data transformation
Available Official Plugins
| Plugin | Description | Package |
|---|---|---|
| Contentful | Source content from Contentful CMS | @universal-data-layer/plugin-source-contentful |
Installing Plugins
Install plugins from npm:
Terminal
npm install @universal-data-layer/plugin-source-contentful
Registering Plugins
Register plugins in your udl.config.ts file. Use the defineConfig helper for TypeScript support:
udl.config.ts
import { defineConfig } from 'universal-data-layer';
export const config = defineConfig({
plugins: [
{
name: '@universal-data-layer/plugin-source-contentful',
options: {
spaceId: process.env['CONTENTFUL_SPACE_ID'],
accessToken: process.env['CONTENTFUL_ACCESS_TOKEN'],
environment: 'master',
},
},
],
});
Registration Methods
String Shorthand
For plugins with no configuration:
udl.config.ts
import { defineConfig } from 'universal-data-layer';
export const config = defineConfig({
plugins: ['my-simple-plugin'],
});
Object with Options
Pass configuration to the plugin:
udl.config.ts
import { defineConfig } from 'universal-data-layer';
export const config = defineConfig({
plugins: [
{
name: '@universal-data-layer/plugin-source-contentful',
options: {
spaceId: 'your-space-id',
accessToken: 'your-token',
},
},
],
});
Local File Path
Use a local plugin during development:
udl.config.ts
import { defineConfig } from 'universal-data-layer';
export const config = defineConfig({
plugins: [
'./plugins/my-local-plugin',
{
name: './plugins/my-configured-plugin',
options: {
customSetting: 'value',
},
},
],
});
Environment Variables
Store sensitive credentials in environment variables:
.env
CONTENTFUL_SPACE_ID=your-space-id
CONTENTFUL_ACCESS_TOKEN=your-access-token
CONTENTFUL_ENVIRONMENT=master
udl.config.ts
import { defineConfig } from 'universal-data-layer';
export const config = defineConfig({
plugins: [
{
name: '@universal-data-layer/plugin-source-contentful',
options: {
spaceId: process.env['CONTENTFUL_SPACE_ID'],
accessToken: process.env['CONTENTFUL_ACCESS_TOKEN'],
environment: process.env['CONTENTFUL_ENVIRONMENT'] || 'master',
},
},
],
});
Plugin Loading Order
Plugins load in the order they appear in the array:
udl.config.ts
import { defineConfig } from 'universal-data-layer';
export const config = defineConfig({
plugins: [
'plugin-one', // Loads first
'plugin-two', // Loads second
'plugin-three', // Loads third
],
});
This matters when plugins depend on each other.
Conditional Loading
Load plugins based on environment:
udl.config.ts
import { defineConfig } from 'universal-data-layer';
const isDev = process.env['NODE_ENV'] === 'development';
export const config = defineConfig({
plugins: [
'@universal-data-layer/plugin-source-contentful',
...(isDev ? ['./plugins/dev-logger'] : []),
],
});
Next Steps
- Contentful Plugin - Connect to Contentful CMS
- Querying Data - Learn how to query your data
- Creating Plugins - Build your own plugin