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

nexus-module

v1.0.0-alpha.13

Published

Useful helpers for Nexus Wallet Module developers

Downloads

3

Readme

nexus-module

nexus-module v1.0.0 is built for Nexus Wallet Module v3.1.0

This package will likely be useful for you if you are developing a Nexus Wallet Module.

Usage

Import resources from NEXUS global variable

nexus-module enables you to get resources from NEXUS global variable via import. For example, if you want to get TextField component:

// Without nexus-module
const { TextField } = NEXUS.components

// With nexus-module
import { TextField } from 'nexus-module'

For NEXUS.libraries:

// Without nexus-module
const { React } = NEXUS.libraries

// With nexus-module
import React from 'nexus-module/lib/react'

Import libraries with webpack aliases

Some libraries like react-redux requires libraries that already provided through NEXUS like react as peer dependency. The problem is that if you add react as a direct dependency of your module project, it will be a different instance from the NEXUS.libraries.React instance, which was used to create common components found in NEXUS.components. Therefore, it might cause troubles when you use those common components.

The solution is that you should define webpack aliases on webpack (or whatever bundler that you're using) to map library names to those exported from nexus-module, e.g. mapping 'react' to 'nexus-module/lib/react', so that when a library like react-redux looks for its peer dependencies, it will find the instances that are already provided by NEXUS global variable, not a new one.

nexus-module made webpack aliases ready for you to use. You can just add it to your webpack config:

import { webpackAliases } from 'nexus-module';

const webpackConfig = {
  // ...your other configs
  resolve: {
    alias: {
      ...webpackAliases
      // ...your other aliases
    }
  }
}

Then you can import libraries as if they were direct dependencies of your project:

// Instead of this
import React from 'nexus-module/lib/react';
import styled from 'nexus-module/lib/emotionStyled';

// You can do this
import React from 'react';
import styled from '@emotion/styled';

Configure browserslist targets

nexus-module exports the browserslist query which will be useful in some cases like configuring target browsers for @babel/preset-env.

import { browserslistQuery } from 'nexus-module';

const babelConfig = {
  presets: [
    ['@babel/preset-env', { targets: browserslistQuery }]
  ]
}

Store wallet data into Redux

First you need to add walletDataReducer into your redux reducer, for example:

import { walletDataReducer } from 'nexus-module;

export default combineReducers({
  nexus: walletDataReducer
  // ...other reducers
});

Next, call listenToWalletData to keep wallet data state in Redux updated:

import { listenToWalletData } from 'nexus-module;

listenToWalletData(store)

Then you can retrieve wallet data from Redux state whenever you want

const walletData = useSelector(state => state.nexus)

// walletData shape will look like this
{
  initialized,  // boolean
  theme,        // object
  settings,     // object
  coreInfo,     // object
  userStatus,   // object
  addressBook,  // object
};

Automate updating module state and storage with Redux middlewares

Nexus Wallet provides you with updateState and updateStorage functions so that you can persist some module data as long as the wallet is still running (with updateState), or indefinitely (with updateStorage).

If the data you want to persist is stored inside a Redux store, nexus-module makes the process easier for you with stateMiddleware and storageMiddleware.

import { stateMiddleware, storageMiddleware } from 'nexus-module';

function configureStore() {
  const middlewares = [
    // Automatically save state.settings to disk whenever there's a change
    storageMiddleware((state) => state.settings),
    // Automatically save state.ui to wallet state whenever there's a change
    stateMiddleware((state) => state.ui),
    // ...other middlewares
  ];
  // Use middlewares to create redux store...
}

Remember to repopulate the persisted data to the corresponding state when your module is initialized, for example:

// state.settings reducer
import { INITIALIZE } from 'nexus-module';

const initialState = {}

export default (state = initialState, action) => {
  switch (action.type) {
    case INITIALIZE:
      return action.payload?.storageData || state;

    // ...handle other action types

    default:
      return state;
  }
};

Reduce boilerplate with ModuleWrapper

ModuleWrapper is a component that replaces a few top-level components you most likely need to use in your module.

Instead of this

const emotionCache = createCache({ container: document.head, key: 'emotion' });

function YourModule() {
  const initialized = useSelector((state) => state.nexus.initialized);
  const theme = useSelector((state) => state.nexus.theme);
  if (!initialized) return null;

  return (
    <CacheProvider value={emotionCache}>
      <ThemeController theme={theme}>
        <GlobalStyles />
        {/* Your module content... */}
      </ThemeController>
    </CacheProvider>
  )
}

Now you only need this

function YourModule() {
  const initialized = useSelector((state) => state.nexus.initialized);
  const theme = useSelector((state) => state.nexus.theme);

  return (
    <ModuleWrapper initialized={initialized} theme={theme}>
      {/* Your module content... */}
    </ModuleWrapper>
  );
}

API reference

  • walletVersion: from NEXUS.walletVersion

  • GlobalStyles: from NEXUS.components.GlobalStyles

  • ThemeController: from NEXUS.components.ThemeController

  • Icon: from NEXUS.components.Icon

  • Panel: from NEXUS.components.Panel

  • AutoSuggest: from NEXUS.components.AutoSuggest

  • FieldSet: from NEXUS.components.FieldSet

  • Switch: from NEXUS.components.Switch

  • Modal: from NEXUS.components.Modal

  • Tooltip: from NEXUS.components.Tooltip

  • Select: from NEXUS.components.Select

  • TextField: from NEXUS.components.TextField

  • FormField: from NEXUS.components.FormField

  • Link: from NEXUS.components.Link

  • Arrow: from NEXUS.components.Arrow

  • Tab: from NEXUS.components.Tab

  • Button: from NEXUS.components.Button

  • Dropdown: from NEXUS.components.Dropdown

  • color: from NEXUS.utilities.color

  • copyToClipboard: from NEXUS.utilities.copyToClipboard

  • send: from NEXUS.utilities.send

  • showNotification: from NEXUS.utilities.showNotification

  • showErrorDialog: from NEXUS.utilities.showErrorDialog

  • showSuccessDialog: from NEXUS.utilities.showSuccessDialog

  • showInfoDialog: from NEXUS.utilities.showInfoDialog

  • rpcCall: from NEXUS.utilities.rpcCall

  • apiCall: from NEXUS.utilities.apiCall

  • secureApiCall: from NEXUS.utilities.secureApiCall

  • proxyRequest: from NEXUS.utilities.proxyRequest

  • confirm: from NEXUS.utilities.confirm

  • updateState: from NEXUS.utilities.updateState

  • updateStorage: from NEXUS.utilities.updateStorage

  • onceInitialize: from NEXUS.utilities.onceInitialize

  • onWalletDataUpdated: from NEXUS.utilities.onWalletDataUpdated

  • browserslistQuery: String - Browserslist query that specifies the supported Nexus Wallet's Electron version.

  • webpackAliases: Object - Alias config for webpack. Add this object to resolve.alias webpack config, so that third party libraries from NEXUS.libraries can be imported as if they were direct dependencies of the project.

  • walletDataReducer: (state: Object, action: Object) => state: Object - Redux reducer for wallet data.

  • listenToWalletData: (store: Object) => void - Listen to any changes from wallet data and dispatch Redux actions accordingly.

  • INITIALIZE: String - Redux action type, dispatched when the module is initialized.

  • UPDATE_WALLET_DATA: String - Redux action type, dispatched when the wallet data is updated.

  • stateMiddleware: (getPersistedState: (state: Object) => persistedState: Object) => middleware: Function - Get a Redux middleware that automatically update the specified module state to the wallet so that it's not lost when user navigates away from the module.

  • storageMiddleware: (getStoredData: (state: Object) => storedData: Object) => middleware: Function - Get a Redux middleware that automatically store the data to the disk so that it's not lost when user closes the wallet.

  • ModuleWrapper: React Component - Replaces CacheProvider, ThemeController, and GlobalStyles components at once.