Collections & Knowledge

Bundles

Access the complete dataset of Community Center bundles and Joja Mart restorations with typed item, gold, and Joja bundle data using the chainable BundleQuery API.

Quick Start

import { bundles } from 'stardew-valley-data'

// Get all bundles
const all = bundles().get()

// Get standard (non-remix) bundles
const standard = bundles().standard().get()

// Get bundles in the Pantry room
const pantry = bundles().byRoom('pantry').get()

// Get remix bundle variants
const remix = bundles().remix().get()

// Get Joja Mart bundles
const joja = bundles().jojaBundles().get()

Type Definitions

The Bundle type is a union of three bundle variants:

type Bundle = ItemBundle | GoldBundle | JojaBundle

ItemBundle

FieldTypeDescription
idstringUnique identifier for the bundle.
type'items'Discriminator for item bundles.
namestringDisplay name of the bundle.
roomBundleRoomCommunity Center room the bundle belongs to.
bundleGroupnumberNumeric group within the room.
imagestringPath to the bundle image.
itemsBundleItem[]Array of items that can be donated (see below).
itemsRequirednumberNumber of items needed to complete the bundle.
itemsChosenRandombooleanWhether the available items are randomly selected.
numItemsAvailablenumberTotal number of item slots available.
rewardBundleRewardReward for completing the bundle (see below).
remixBundlebooleanWhether this is a remix variant.

GoldBundle

FieldTypeDescription
idstringUnique identifier for the bundle.
type'gold'Discriminator for gold bundles.
namestringDisplay name of the bundle.
roomBundleRoomCommunity Center room the bundle belongs to.
bundleGroupnumberNumeric group within the room.
imagestringPath to the bundle image.
goldCostnumberGold required to complete the bundle.
rewardBundleRewardReward for completing the bundle.
remixBundlebooleanWhether this is a remix variant.

JojaBundle

FieldTypeDescription
idstringUnique identifier for the bundle.
type'joja mart'Discriminator for Joja bundles.
namestringDisplay name of the Joja restoration project.
descriptionstringDescription of what the project unlocks.
goldCostnumberGold cost to purchase the project.
unlockstringWhat the project unlocks in the game.

BundleItem

FieldTypeDescription
namestringDisplay name of the item.
quantitynumberNumber required.
quality'silver' | 'gold' | 'iridium' | undefinedMinimum quality required, if any.

BundleReward

FieldTypeDescription
namestringDisplay name of the reward item.
quantitynumberNumber of reward items received.

BundleRoom

'crafts-room' | 'pantry' | 'fish-tank' | 'boiler-room' | 'bulletin-board' | 'vault' | 'abandoned-joja-mart'

Query Methods

BundleQuery extends QueryBase and inherits five terminal methods shared by all query builders:

MethodReturnsDescription
get()Bundle[]Return all results as an array.
first()Bundle | undefinedReturn the first result.
find(id)Bundle | undefinedFind a bundle by exact ID.
findByName(name)Bundle | undefinedFind a bundle by name (case-insensitive).
count()numberReturn the number of results.

Filter Methods

MethodReturnsDescription
byRoom(room)BundleQueryFilter to bundles in the given room. Joja bundles are excluded.
remix()BundleQueryReturn the active remix selection: for each bundle group, returns the remix variant if one exists, otherwise falls back to the standard entry. Joja bundles are excluded.
standard()BundleQueryFilter to standard (non-remix) Community Center bundles. Joja bundles are excluded.
itemBundles()BundleQueryFilter to item bundles (type 'items').
goldBundles()BundleQueryFilter to gold bundles (type 'gold').
jojaBundles()BundleQueryFilter to Joja Mart restoration bundles (type 'joja mart').

Sort Methods

MethodReturnsDescription
sortByRoomAndBundleGroup()BundleQuerySort by room order (as they appear in the Community Center), then by bundle group number within each room.
sortByName(order?)BundleQuerySort alphabetically by name. Pass 'asc' (default) or 'desc'.

Examples

List standard bundles by room

import { bundles } from 'stardew-valley-data'

const standard = bundles().standard().sortByRoomAndBundleGroup().get()

standard.forEach((b) => {
  if (b.type === 'items') {
    console.log(`[${b.room}] ${b.name}${b.itemsRequired} items required`)
  } else {
    console.log(`[${b.room}] ${b.name}${b.goldCost}g`)
  }
})

Get remix variants for a room

import { bundles } from 'stardew-valley-data'

const pantryRemix = bundles().remix().byRoom('pantry').get()

pantryRemix.forEach((b) => {
  console.log(`${b.name} (remix: ${b.remixBundle})`)
})

List Joja Mart restoration costs

import { bundles } from 'stardew-valley-data'

const joja = bundles().jojaBundles().get()

joja.forEach((b) => {
  if (b.type === 'joja mart') {
    console.log(`${b.name}: ${b.goldCost}g — Unlocks: ${b.unlock}`)
  }
})

View items required for a specific bundle

import { bundles } from 'stardew-valley-data'

const springForaging = bundles().findByName('Spring Foraging Bundle')

if (springForaging && springForaging.type === 'items') {
  console.log(
    `${springForaging.name} (${springForaging.itemsRequired} of ${springForaging.numItemsAvailable}):`,
  )
  springForaging.items.forEach((item) => {
    const quality = item.quality ? ` (${item.quality})` : ''
    console.log(`  ${item.quantity}x ${item.name}${quality}`)
  })
}

Compare standard vs remix bundle counts

import { bundles } from 'stardew-valley-data'

const standardCount = bundles().standard().count()
const remixCount = bundles().remix().count()

console.log(`Standard bundles: ${standardCount}`)
console.log(`Remix selection: ${remixCount}`)

Wrap a pre-filtered array

You can pass an existing Bundle[] array into the bundles() function to create a new query from it:

import { bundles } from 'stardew-valley-data'

const myList = bundles().byRoom('pantry').get()
const sorted = bundles(myList).sortByName().get()
Previous
Field office