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

@ivanbogaeb/sakura

v1.0.4

Published

Sakura is a minimal Electron and Node.JS auto-updater, offering developers high flexibility and modularity.

Downloads

64

Readme

What is Sakura?

Sakura is a minimal Electron and Node.JS auto-updater, offering developers high flexibility and modularity to work on from within their own code.

Features:

  • File checks.
  • Splash screen. (Electron only)
  • Automatic updates.
  • Customizable alert (Electron only)
  • Latest version available.
  • Latest version downloader.
  • Private and public repository access.

To-do:

  • [ ] Linux and iOS full support.
  • [ ] Relaunch command on Node.JS apps. (Currently Node.JS apps cannot execute themselves once updated)

Installation:

npm install @ivanbogaeb/sakura

Keep in mind that currently only Windows is fully supported.

Example:

const updated = async () => {
    const Sakura = require('@ivanbogaeb/sakura');
    try {
        let splashProperties = { // Create your own splash screen 👈
            show: true,
            frame: false,
            resizable: false,
            minimizable: false,
            maximizable: false,
            width: 400,
            height: 250,
            center: true,
            webPreferences: { // Sakura works under heavy security
                webSecurity: true,
                contextIsolation: true,
                preload: path.join(app.getAppPath(), './render/scripts/updater.js') // Sakura splash screen code!
            },
            icon: path.join(__dirname, './favicon.ico')
        };
        
        let sakura = new Sakura({
            gitUsername: 'ivanbogaeb',
            gitRepository: 'sakura',
            privateToken: 'ghp_loOVMTQMpXz0K****************************', // If you are using a private repo!
            installationDirectory: path.join(__dirname, '../'), // Your main app directory
            hasExecutable: true, // Toggle on if you are executing EXE files
            executableName: 'steroid.exe',
            isElectron: true, // Sakura works both for Electron and Node.JS
            currentVersion: require('./version.json'), // Load your current version from a file
        });

        // Let sakura auto-updater do the magic! Returns true when done!
        return await sakura.ready(splashProperties, path.join(app.getAppPath(), './render/html/updater.html'));
        
    } catch (error){
        console.log(error);
        return false; // Unable to update
    };
};

if (updated){
    // LOAD MAIN APP
};

Reference:

Import

You can simply import sakura as CommonJS module or ES, it doesn't matter!

  • CommonJS:
    const Sakura = require('@ivanbogaeb/sakura');
  • ES Module:
    import Sakura from '@ivanbogaeb/sakura';

Settings

Sakura is completely customizable, in fact, you can use it's modules independently.

let sakura = new Sakura({
    gitUsername: '', // Github username
    gitRepository: '', // Github repository
    privateToken: '', // ONLY FOR PRIVATE REPOSITORIES
    installationDirectory: path.join(__dirname, '../'), // Your main app directory
    hasExecutable: true/false, // Toggle on if you require to restart your application
    executableName: 'APP-NAME.exe', // Name of your main EXE file
    isElectron: true/false, // Sakura works both for Electron and Node.JS
    messages: {
        splash: 'Loading...', // Initial message
        fetching: 'Checking for updates...', // While looking for updates
        downloading: 'Downloading new update...', // When your app is downloading
        updating: 'Updating...', // While it's updating
        unableToUpdate: 'Unable to update, skipping...' // While it's updating
    },
    currentVersion: require('./version.json'), // Load your current version from a file, variable or string!
});

Functions

With this module you have the options to automate the process or take control on your own!

ready() (Recommended)

Auto-updater function, it does all the process for you.

let isReady = await sakura.ready(); // Returns true once the app has been updated or found it is up to date.
if (isReady){
    // Continue normal process
};

check()

Will check if you are running an update instance. If that's so, it will replace the old version with the new one and execute itself again.

let isNotUpdate = await sakura.check(); // Returns true if it's not an update
if (isNotUpdate){
    // Continue normal process
};

latest()

Returns the latest version available.

let latestVersion = await sakura.latest(); // Returns version string

download()

Creates an "Updates" folder inside your main application and downloads the latest version.

Must be used along latest(). This is because Sakura has a micro internal cache where it stores the current version you are working on and also the latest, including a download URL.

await sakura.latest(); // Returns version string
let download = await sakura.download();
if (download){
    // Do something after it has been downloaded
};

update()

Updates your main application based on the latest version you downloaded.

Must be used along latest() and download().

await sakura.latest(); // Returns version string
let download = await sakura.download();
if (download){
    await sakura.update();
};

splash() (Electron only)

Executes a splash screen of your choice.

let splash = await sakura.splash(windowProperties, HTMLFile);

close() (Electron only)

Closes the splash screen.

await sakura.close();

messenger() (Electron only) (Not recommended to use)

Talks to the splash screen by sending information throught actions.

Types:

  • activate: Window you want to send information to throught webContents.

    Must be used with window type of Payload.

  • message: Sends information to the splash screen.

Payload:

  • window: BrowserWindow you want to connect to display updates information.
  • message: This payload has four properties embed: type, text, loader and percentage.

Message payload:

{
    type: 0, // Type 0 for messages, type 1 for downloads
    text: "This is an important updater message",
    loader: {
        active: false, // You can set a loader bar on and off
        data: 0, // Progress in kb
        total: 0, // Total size in kb
    }
}
let message = await sakura.messenger({
    type: 'message',
    payload: {type: 0, text: "This is an important updater message", loader: {active: false, data: 0, total: 0}}
}); // Prints on the splash screen the text!

let message = await sakura.messenger({
    type: 'message',
    payload: {type: 1, text: "Downloading update...", loader: {active: true, data: 900, total: 1000}}
}); // Prints on the splash screen the text, activates the percentage bar to 90% completed.

Splash Screen

Sakura communicates straight to the splash screen using webContents. This way, you will be able to customize where you want updates information, how and which window.

  • Create your own HTML, CSS and JavaScript files.
  • Inside your JavaScript file, you will have to implement this code:
    const { ipcRenderer } = require('electron');
    window.onload = async () => {
        ipcRenderer.on('SakuraUpdater', (event, message) => {
            /*
                Message contains:
                {
                    text: "Message you sent from sakura",
                    loader: {
                        active: true/false,
                        data: 0,
                        total: 0
                        percentage: 0 to 100
                    }
                }
    
            */
            document.getElementById('download-label').innerText = message.text; // Sakura message updates the download label text
            if (message.loader.active){
                document.getElementById('bar-progress').style.width = message.loader.percentage + '%'; // Progress bar using CSS properties
            };
        });
    };
  • Setup your splash screen settings:
    let splashScreenProperties = {
        show: true,
        frame: false,
        resizable: false,
        minimizable: false,
        maximizable: false,
        width: 400,
        height: 250,
        center: true,
        webPreferences: {
            webSecurity: true, // Always true
            contextIsolation: true, // Always isolate your Window from the rest
            preload: path.join(app.getAppPath(), './render/scripts/updater.js') // Preload your main JS file with required modules
        },
        icon: path.join(__dirname, '../favicon.ico')
    };
  • Create a splash screen executing Splash().

Security notes:

The main reason why Sakura runs only throught webContents is to prevent malicious code injection, malicious activity, bugs or even poor performance or communication between the splash screen and Sakura. It has been noted that allowing Node modules to be executed inside a Window in Electron is not a good practice, and I took it seriously while developing this module.

Changelog:

  • 24 July 2022 - Bug fix - Version 1.0.2
  • 24 July 2022 - First "Release" - Version 1.0.0
  • Read more...

Credits:

License:

CC0 1.0 Universal