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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@buildinams/contentful-rest

v0.2.1

Published

Contentful REST API

Downloads

18

Readme

contentful-rest

NPM version Actions Status PR Welcome

Contentful REST API

Introduction

import { ContentfulFetcher } from "@buildinams/contentful-rest";

export const cfClient = new ContentfulFetcher();

Installation

Install this package with npm.

npm i @buildinams/contentful-rest

Usage

import {
	ContentfulFetcher,
	ContentfulAdaptor,
} from "@buildinams/contentful-rest";

const Adaptor = new ContentfulAdaptor({});

export const cfClient = new ContentfulFetcher({
	config: { spaceId, accessToken, previewToken, environment },
	adaptor: Adaptor,
	isPreview: IS_DEVELOPMENT,
});

const fetchData = async (args: DataTypeArgs) => {
	const data = await cfClient.getEntries({ query, options });
};

ContentfulFetcher

import { createClient } from "@buildinams/contentful-rest";

export const cfClient = new ContentfulFetcher({
	config: { spaceId, accessToken, previewToken, environment },
	adaptor: Adaptor,
	isPreview: IS_DEVELOPMENT,
});

Create client creates a helper function that is able to send GraphQL queries to your Contentful space. The expected arguments are;

  • config.accessToken - Access token of your Contentful space
  • config.previewToken - Preview token to be able to query draft data
  • config.spaceId - Space to get data from
  • config.environment - Optional; Environment to query, default to; "master"
  • adaptor - Optional; Modify data to match the structure required for your application
  • isPreview - Optional; Flag to fetch all data as preview, convenient for development environments

ContentfulAdaptor

import { ContentfulAdaptor } from "@buildinams/contentful-rest";
const Adaptor = new ContentfulAdaptor({
	fieldAdaptors: {
		Asset: assetAdaptor,
	},
	contentAdaptors: {
		BlockMedia: blockMediaAdaptor,
	},
	pageAdaptors: {
		Homepage: homepageAdaptor,
	},
});

This generates a JavaScript class that gives you the option to adapt the data. Expected arguments;

  • fieldAdaptors - Adaptors to run on the specific fields, for example the "Asset" field.
  • contentAdaptors - Content adaptors run recursively over the provided data. When an object matches the pattern: { __typename: {key} } it will run the adaptor with the matching {key}.
  • pageAdaptors - Page adaptors only run top level. These can be used if you want to format the initial data but you don't want to run to run them when they are referenced. Example; we want a pageLayout to contain all data but when referenced in a cta we don't want the page adaptor.

Adaptors

The concept of adaptors are generics that modifiy certain data by content type (__typename). Often these can follow the structure below;

const blockMediaAdaptor = (data: ContentfulQueryResponse) => {
	return {
		type: data.file.fileType,
		src: data.src,
		ratio: data.height / data.width,
	};
};

export type BlockMedia = ReturnType<typeof blockMediaAdaptor>;

Within your application you can then use the BlockMedia type to link back to the type of data you expect to receive.

getIndicatorProps

import { getIndicatorProps } from "@buildinams/contentful-rest/getIndicatorProps";
<h1 {...getIndicatorProps({ entryId: entry.sys.id, fieldId: "title" })}>
  {entry.title}
</h1>;

A small helper function to get indicator mode in Contentful preview mode. Expected arugments;

  • entryId - ID of the linked content entry, usually entry.sys.id
  • fieldId - Name of the field that's displayed
  • locale - Optional; Locale of the displayed entry

Requests and Contributing

Found an issue? Want a new feature? Get involved! Please contribute using our guideline here.