1.1.3 โ€ข Published 5 months ago

@cloud-push/expo v1.1.3

Weekly downloads
-
License
ISC
Repository
-
Last release
5 months ago

@cloud-push/cloud
@cloud-push/expo
@cloud-push/next
@cloud-push/cli
@cloud-push/utils

Typescript Only, Zero kotlin, Zero Swift, Zero java, Zero Object-C

OTA Update solution compatible with Expo Updates
โ†’ Self-hosted update distribution system

๐Ÿ“š Documentation

You can find the full usage guide and API reference in the
๐Ÿ‘‰ Cloud Push Docs

๐Ÿš€ Motivation

Expo projects are highly customized React Native projects. Because of this, available CodePush solutions are limited.
This project, inspired by hot-updater, offers an alternative way to manage bundles using storage services like S3, Firebase, Supabase, etc.
It follows Expo Updates technical specs and maintains compatibility with Expo Updates.

๐Ÿงช Compatibility

  • โœ… Works with expo run:android --variant release
  • โœ… Works with expo run:ios --configuration Release
  • โœ… Compatible with Expo Managed Workflow

โœจ Key Features

  • ๐Ÿ“ก Self-hosted deployment supported
  • ๐Ÿ“ฆ Flexible storage & DB (S3, Supabase, Firebase, etc.)
  • ๐Ÿ”„ Compatible with Expo Updates APIs
  • ๐Ÿ’พ Web-based bundle version dashboard
  • ๐ŸŒ Supports expo.dev environment variables (via EAS Secrets)
  • ๐ŸชŸ Works on Windows
  • ๐Ÿงช EAS build supported

๐Ÿ›  Configuration Examples

Supabase

import { defineConfig } from "@cloud-push/cli";
import { SupabaseStorageClient, SupabaseDbClient } from "@cloud-push/cloud";

export default defineConfig(() => ({
  loadClients: () => {

    const storageClient = new SupabaseStorageClient({
      bucketName: process.env.SUPABASE_BUCKET_NAME!,
      supabaseUrl: process.env.SUPABASE_URL!,
      supabaseKey: process.env.SUPABASE_KEY!,
    });

    const dbClient = new SupabaseDbClient({
      tableName: process.env.SUPABASE_TABLE_NAME!,
      supabaseUrl: process.env.SUPABASE_URL!,
      supabaseKey: process.env.SUPABASE_KEY!,
    });
    
		return {
			storage: storageClient,
			db: dbClient,
		};
	},
}));

AWS S3 + lowdb

import { defineConfig } from "@cloud-push/cli";
import { AWSS3StorageClient, LowDbClient } from "@cloud-push/cloud";

export default defineConfig(() => ({
  loadClients: () => {
    
    const storageClient = new AWSS3StorageClient({
      accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
      bucketName: process.env.AWS_BUCKET_NAME!,
      region: process.env.AWS_REGION!,
      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
    });

    const dbClient = new LowDbClient({
      downloadJSONFile: () => storageClient.getFile({ key: "cursor.json" }),
      uploadJSONFile: (file: Uint8Array) =>
        storageClient.uploadFile({ key: "cursor.json", file }),
    });

    return {
      storage: storageClient,
      db: dbClient,
    };
  },
}));

Firebase

import { defineConfig } from "@cloud-push/cli";
import { FirebaseStorageClient, FirebaseDbClient } from "@cloud-push/cloud";

export default defineConfig(() => ({
  	loadClients: () => {
		const storageClient = new FirebaseStorageClient({
			credential: process.env.FIREBASE_CREDENTIAL!,
			bucketName: process.env.BUCKET_NAME!,
		});

		const dbClient = new FirebaseDbClient({
			credential: process.env.FIREBASE_CREDENTIAL!,
			databaseId: process.env.FIREBASE_DATABASE_ID!,
		});

		return {
			storage: storageClient,
			db: dbClient,
		};
	},
}));

๐Ÿ“˜ Expo Updates SDK Compatibility

๐Ÿงฑ Constants

ConstantSupported
Updates.channelโœ…
Updates.checkAutomaticallyโœ…
Updates.createdAtโœ…
Updates.emergencyLaunchReasonโณ
Updates.isEmbeddedLaunchโœ…
Updates.isEmergencyLaunchโณ
Updates.isEnabledโœ…
Updates.latestContextโœ…
Updates.launchDurationโœ…
Updates.manifestโœ…
Updates.runtimeVersionโœ…
Updates.updateIdโœ…

๐Ÿงฉ Hooks

HookSupported
useUpdates()โœ…

๐Ÿ›  Methods

MethodSupported
checkForUpdateAsync()โœ…
clearLogEntriesAsync()โœ…
fetchUpdateAsync()โœ…
getExtraParamsAsync()โŒ
readLogEntriesAsync()โœ…
reloadAsync()โœ…
setExtraParamAsync()โŒ