JAMstack ECommerce Professional provides a way to quickly get up and running with a fully configurable JAMstack E Commerce site.
Out of the box, the site uses completely static data coming from a provider at providers/inventoryProvider.js. You can update this provider to fetch data from any real API by changing the call in the getInventory function.

This project is still in Beta.
$ git clone https://github.com/jamstack-cms/jamstack-ecommerce.git
$ yarn
# or
$ npm install
$ gatsby develop
# or to build
$ gatsby build
This project is styled using Tailwind. To learn more how this works, check out the Tailwind documentation here.
The main files, components, and images you may want to change / modify are:
undefinedLogo - src/images/logo.png
undefinedButtons, Nav, Header - src/components
undefinedForm components - src/components/formComponents
undefinedContext (state) - src/context/mainContext.js
undefinedPages (admin, cart, checkout, index) - src/pages
undefinedTemplates (category view, single item view, inventory views) - src/templates
As it is set up, inventory is fetched from a local hard coded array of inventory items. This can easily be configured to instead be fetched from a remote source like Shopify or another CMS or data source by changing the inventory provider.
Update providers/inventoryProvider.js with your own inventory provider.
If you change the provider to fetch images from a remote source, you may choose to also download the images locally at build time to improve performance. Here is an example of some code that should work for this use case:
import fs from 'fs'
import axios from 'axios'
import path from 'path'
function getImageKey(url) {
const split = url.split('/')
const key = split[split.length - 1]
const keyItems = key.split('?')
const imageKey = keyItems[0]
return imageKey
}
function getPathName(url, pathName = 'downloads') {
let reqPath = path.join(__dirname, '..')
let key = getImageKey(url)
key = key.replace(/%/g, "")
const rawPath = `${reqPath}/public/${pathName}/${key}`
return rawPath
}
async function downloadImage (url) {
return new Promise(async (resolve, reject) => {
const path = getPathName(url)
const writer = fs.createWriteStream(path)
const response = await axios({
url,
method: 'GET',
responseType: 'stream'
})
response.data.pipe(writer)
writer.on('finish', resolve)
writer.on('error', reject)
})
}
export default downloadImage
You can use this function in gatsby-node.esm.js, map over the inventory data after fetching and replace the image paths with a reference to the location of the downloaded images, probably would look something like this:
await Promise.all(
inventory.map(async (item, index) => {
try {
const relativeUrl = `../downloads/${item.image}`
if (!fs.existsSync(`${__dirname}/public/downloads/${item.image}`)) {
await downloadImage(image)
}
inventory[index].image = relativeUrl
} catch (err) {
console.log('error downloading image: ', err)
}
})
)
Update src/pages/admin.js with sign up, sign, in, sign out, and confirm sign in methods.
Update src/templates/ViewInventory.js with methods to interact with the actual inventory API.
Update src/components/formComponents/AddInventory.js with methods to add item to actual inventory API.
Alongside Gatsby, we deploy a function called /api, which can be
used to submit a payment.
The original codebase doesn’t yet make the request to process the payment,
but it should be easy to add with fetch.
Also, consider verifying totals by passing in an array of IDs into the function, calculating the total on the server, then comparing the totals to check and make sure they match.
We use cookies
We use cookies to analyze traffic and improve your experience. You can accept or reject analytics cookies.