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

@piparotech/subkit-expo

v0.1.19

Published

SubKit Expo IAP SDK with automatic purchase sync.

Readme

@piparotech/subkit-expo

Expo / React Native SDK for SubKit offerings, purchases, restore/sync, CustomerInfo, and entitlement checks. SubKit is the access authority; expo-iap is only the native Store adapter.

Install

Install Expo from the public npm registry with its required Core peer and the optional storage adapters your app uses:

pnpm add @piparotech/subkit-core@^0.1.11 @piparotech/subkit-expo@^0.1.12

Minimal setup

import { configureSubKit } from '@piparotech/subkit-expo'

configureSubKit({
  sdkKey: 'sk_sdk_replace_me',
  installationId: persistentInstallationId,
  persistence: { storage: appJsonStorage, keyPrefix: 'my-app.subkit.v1' },
  appUserId: currentUserId,
})

Mobile apps use only a public app-bound sk_sdk_… key. Keep the installation ID persistent, render package identifiers and native prices from Runtime Offerings, and unlock only from SubKit's Effective Access decision. A pending purchase never grants access.

const access = await client.getAccess('pro')
if (access.state === 'granted') unlockPaidFeatures()

React apps use useSubKitAccess('pro') for recovery/status UI or the fail-closed useSubKitHasAccess('pro') Boolean. Do not combine raw entitlement and device fields in application code.

Public adapters are available at:

  • @piparotech/subkit-expo/expo-iap
  • @piparotech/subkit-expo/expo-secure-store
  • @piparotech/subkit-expo/mmkv
  • @piparotech/subkit-expo/async-storage

Purchase and restore recovery

A durable reconcile job that is still running returns null from restore/sync, not a failed verification or an empty restore. The last known CustomerInfo and identity remain unchanged. Resume with syncPurchases({ force: true, reason: 'queue_retry' }); fetching CustomerInfo alone does not drain the receipt queue.

After the native Store returns a purchase, later transport or verification exceptions return pending. Do not offer another purchase. A terminal verification failure carries error.metadata.purchaseMayHaveCompleted: true; this means the Store purchase needs recovery or support, not that no charge occurred. Ownership conflicts include the server's resolution in error metadata. Neither terminal failures nor pending results grant access.

Documentation

For custom IAP adapters, optional Google trial fallback requires SubKitIapSubscriptionOffer.isBasePlan: true from provider evidence, an exact basePlanId, and an offer token. The built-in adapter reads Google's absent promotional offerId for the matching token. Missing evidence fails closed; never infer a regular base plan from a display identifier alone.