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

@maddevs/mad-radiator

v6.0.9

Published

Script for collect data from analytics and send to slack(webhook) and telegram

Downloads

174

Readme

MAD RADIATOR


Mad radiator is a simple script to collect a part of data from analytics, lighthouse, reddit, quora, glassdoor, and send it in the pretty format as message to slack and/or telegram

How to run

Running as function

To run radiator for your own project you need to do the following steps:

  • Install radiator as a dependency for your project(or for a new project, that's not important)
$ npm install @maddevs/mad-radiator
  • Create a file for running:
$ touch radiator.js

*In the file, you need to import the radiator and pass the configs optionally for each module (see the configuration section):

const { radiator } = require('@maddevs/mad-radiator')

const radiator = new Radiator(baseConfig)
radiator.useAnalytics(analyticsConfig)
radiator.useRedditCountPosts(redditConfig)
radiator.useQuoraService(quora, fireStore)
radiator.useGlassdoorService(glassdoor, fireStore)
radiator.useNewPagesInSite(lighthouseConfig, fireStore)
radiator.usePageAnalytics(pageAnalyticsConfig, fireStore)
radiator.useSlack(slackConfig)
  • Just run the file via nodeJS:
$ node radiator
  • Congrats! Now you just running radiator and it will send messages to your slack/telegram according to provided config
Running as CLI script

Sorry! Running the radiator by CLI script isn't available for now

Technologies stack

Core

It is a list of core technologies that we used to make a business logic

  • node.js
  • axios
  • googleapis
  • node-emoji
  • node-schedule
  • chalk
  • cheerio
  • firebase-admin
  • moment
  • reddit
  • sitemap-stream-parser

Additional

Additional tools for development

  • typescript
  • jest
  • prettier
  • eslint

Configuration

This is a most important part of the documentation. For running radiator you need to create the correct config (* required configs). In this section you can find all available options of the radiator:

Base config *

| name | type | description | | -------------------------|:------------|:--------------------------------------------------------------| | authType | string | Authentication type | | analyticsProjectId | string | ID of your project (it’s available after project creation) | | analyticsPrivateKeyId | string | Private key ID | | analyticsPrivateKey | string | Private key | | analyticsClientEmail | string | Client email | | analyticsClientId | string | Client ID | | analyticsAuthUrl | string | Auth URL | | analyticsTokenUri | string | Token URI | | analyticsProviderCertUrl | string | Provider cert URL | | analyticsClientCertUrl | string | Client cert URL | | googleapisKey | string | Google apis key | | expiryDate | number | Expiry date | | tokenType | string | Token type | | idToken | string | ID token | | websiteUrl | string | Website URL | | range | string | Range | | retryAttempts | number | Retry attempts (Number of radiator restarts) | | nodeEnv | string | Node env |

Analytics config

| name | type | description | | ---------------------------|:------------- |:------------------------------------------------| | totalUsersToEnji | { url: string } | After create a business goal in the enji - we | | | | get endpoint urls to send data from radiator | | analyticsViewId | string | Analytics auth type | | pagesPathForViewsAnalytics | array | List with page paths for analyzing user traffic | | analyticsConversions | array | List of analytics conversions |

Pages path for views analytics

PagesPathForViewsAnalytics array needed to get statistics of views on these page paths

const analyticsConfig = {
  // ...
  "pagesPathForViewsAnalytics": [
    "/customer-university/",
    "/blog/"
  ],
  // ...
};

Analytics Conversions

Analytics conversion array need to collect data from your analytics goals and calculate it. For example, you want to separate your goals by 3 categories: Leads, Contacts and Careers. You can do it using this configuration parameter.

| name | type | description | | ------------- |:------------- |:----------------------------------| | name | string | The name of your conversion group | | emoji | Emoji | Emoji to display your group | | goals | Array | An array of your goals ids |

Example. If you want to collect data for careers from goals 1,2,3 and for leads from 4,5,11 goals:

const analyticsConfig = {
  //...
  analyticsConversions: [
    {
      name: 'Careers',
      emoji: 'zap',
      goals: [1, 2, 3],
    },
    {
      name: 'Leads',
      emoji: 'briefcase',
      goals: [4, 5, 11],
    },
  ]
  //...
}

Lighthouse Config

| name | type | description | | ------------- |:------------- |:---------------------------------| | urlTestRegexp | string | Regular for excluding some pages | | topCount | number | Number of top pages to display | | worstCount | number | Number of worst pages to display |

Example

const lighthouseConfig = {
  "urlTestRegexp": "(\\/blog\\/)|(\\/customer-university\\/)|(\\/ru\\/)[a-zA-Z0-9]{1}",
  "topCount": 3,
  "worstCount": 3
}

Glassdoor config

| name | type | description | | ------------- |:------------- |:-------------------------| | glassdoorUrl | string | The URL of your account |

Example

// ...
"glassdoor": {
  "glassdoorUrl": "https://www.glassdoor.com/Overview/account-url"
},
// ...

Reddit config

The reddit library is used for easy interaction with the API. Data about the number of posts is requested from Reddit.

| name | type | description | | ------------- |:------------- |:---------------------------------------| | redditClientId | string | Reddit client ID from Reddit APP | | redditClientSecret | string | Reddit client secret from Reddit APP | | redditUserName | string | Reddit username account | | redditPassword | string | Reddit password account |

Example

// ...
"redditConfig": {
  "redditClientId": "clientid",
  "redditClientSecret": "clientsecret",
  "redditUsername": "username",
  "redditPassword": "password"
},
// ...

Firestore auth config

| name | type | description | | ------------- |:------------- |:------------------------------| | authType | string | | | firestoreProjectId | string | | | firestorePrivateKeyId | string | | | firestoreClientEmail | string | | | firestoreClientId | string | From Firestore auth JSON file | | firestoreAuthUri | string | | | firestoreTokenUri | string | | | firestoreAuthProviderCertUrl | string | | | firestoreClientCertUrl | string | |

Example

// ...
"fireStoreAuthConfig": {
  "authType": "service_account",
  "firestoreProjectId": "project-id",
  "firestorePrivateKeyId": "private-key-id",
  "firestoreClientEmail": "client-email",
  "firestoreClientId": "1111111111111111",
  "firestoreAuthUri": "https://accounts.google.com/o/oauth2/auth",
  "firestoreTokenUri": "https://oauth2.googleapis.com/token",
  "firestoreAuthProviderCertUrl": "https://www.googleapis.com/oauth2/v1/certs",
  "firestoreClientCertUrl": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-2dolj%client-cert-url"
},
// ...

Slack Config

| name | type | description | | ------------- |:------------- |:-----------------------------| | slackWebhookUrl | string | slack webhook url | | slackChannelId | string | name of your slack channel |

Schedule *

Schedule options is used for set up custom scheduler for your radiator.

If you want to run your radiator manually(when run the script) you don't need to provide the schedule configuration

| name | type | description | | -----------|:------------- |:-------------------------------------------------------------------------| | period | day/week/month | Period for your schedule | | cron | string | A custom cron string(all other arguments will skip) | | time | number | Time to send a message(0-23) | | weekDay | number | Weekday to send a message(0-7, 0 and 7 is Sunday) - only for period=week | | monthDay | number | Monthday to send a message(0-31) - only for period=month |

Example. You want to run your radiator script each day at 10AM. For this you need to use the following configuration:

// ...
"scheduleConfig: {
  "period": "day",
  "cron": '12 15 * * *',
}
// ...

Git commit format

The commit contains the following structural elements, to communicate intent to the consumers of your library:

fix: a commit of the type fix patches a bug in your codebase (this correlates with PATCH in Semantic Versioning).
feat: a commit of the type feat introduces a new feature to the codebase (this correlates with MINOR in Semantic Versioning).
BREAKING CHANGE: a commit that has a footer BREAKING CHANGE:, or appends a ! after the type/scope, introduces a breaking API change (correlating with MAJOR in Semantic Versioning). A BREAKING CHANGE can be part of commits of any type.
types other than fix: and feat: are allowed, for example @commitlint/config-conventional (based on the the Angular convention) recommends build:, chore:, ci:, docs:, style:, refactor:, perf:, test:, and others.
footers other than BREAKING CHANGE: <description> may be provided and follow a convention similar to git trailer format.