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

@azberry/az-simple

v0.2.16

Published

preview

Downloads

86

Readme

Azure-sample

Simple classes to access Azure services.

Use these services from a server only. These services use secrets that should be protected and not passed or exposed on a client.

Services

Bing Search

Bing Search Services

Prerequisites

  • Key
  • Endpoint

Abilities

  • Search - search is based on the endpoint and query parameters
const { BingSearchV7 } = require('@azberry/az-simple');
require('dotenv').config();

const key = process.env.MICROSOFT_BING_SEARCH_V7_KEY;
const endpoint = 'https://api.bing.microsoft.com/v7.0/news/search';

async function mytest() {
  const searchService = new BingSearchV7(key);

  const results = await searchService.searchNews(endpoint, {
    q: `Microsoft Space SDK`,
    count: 5,
    sortBy: `Relevance`,    // or `Date`,
    safeSearch: `Strict`,   // or `Moderate` or `Off`
    mkt: 'en-US',
    freshness: `Month`,     // or `Day` or `Week`
    textFormat: `Raw`       // or `HTML`
  });

  console.log(results);
}

mytest().catch((err) => console.log(err));

Example response:

[
   {
      "name":"Best match",
      "id":"relevance",
      "isSelected":true,
      "url":"https://api.bing.microsoft.com/api/v7/news/search?q=Microsoft+Space+SDK"
   },
   {
      "name":"Most recent",
      "id":"date",
      "isSelected":false,
      "url":"https://api.bing.microsoft.com/api/v7/news/search?q=Microsoft+Space+SDK&sortby=date"
   }
],
"value":[
   {
      "name":"Google Chrome and Android drop TrustCor support following privacy scare",
      "url":"https://www.msn.com/en-us/news/technology/google-chrome-and-android-drop-trustcor-support-following-privacy-scare/ar-AA15xzTx",
      "image":[
         "Object"
      ],
      "description":"Google has announced that it is set to drop TrustCor Systems as a root certificate authority (CA) for its web browser. The tech giant cited a “loss of confidence in its ability to uphold these fundamental principles and to protect and safeguard Chrome's users” in a group discussion.",
      "about":[
         "Array"
      ],
      "mentions":[
         "Array"
      ],
      "provider":[
         "Array"
      ],
      "datePublished":"2022-12-21T21:15:48.0000000Z",
      "category":"ScienceAndTechnology"
   },
   {
      "name":"Yves Pitsch’s Post",
      "url":"https://www.linkedin.com/feed/update/urn:li:share:6999009834809384960/",
      "description":"Today, Microsoft is excited to announce a crucial step towards democratizing access to space development, with the private preview release of the Azure Orbital Space SDK (Software Development Kit).",
      "provider":[
         "Array"
      ],
      "datePublished":"2022-12-21T02:11:00.0000000Z"
   },
   {
      "name":"Kevin Mack’s Post",
      "url":"https://www.linkedin.com/feed/update/urn:li:activity:6999042796934332416/",
      "description":"Today, Microsoft is excited to announce a crucial step towards democratizing access to space development, with the private preview release of the Azure Orbital Space SDK (Software Development Kit).",
      "provider":[
         "Array"
      ],
      "datePublished":"2022-12-17T22:22:00.0000000Z"
   },
   {
      "name":"What will 2023 hold for the telecoms industry?",
      "url":"https://telecoms.com/519116/what-will-2023-hold-for-the-telecoms-industry/",
      "image":[
         "Object"
      ],
      "description":"It’s that time of year again when we ask some leading lights from the industry to gaze into their crystal balls and take a punt on what we’ll be talking about next year in the world of telecoms.",
      "provider":[
         "Array"
      ],
      "datePublished":"2022-12-23T11:59:00.0000000Z",
      "category":"ScienceAndTechnology"
   }
]

Blob Storage

Azure Blob Storage service - without heirarchical namespaces enabled (so no Data Lake)

Prerequisites

  • Key
  • Endpoint

Abilities

  • Containers:
    • Create if not exists
    • Delete (includes all snapshots)
  • Blobs:
    • Get blob

      • As Json
      • As text
      • As Buffer
    • Get blob properties

      • system
      • metadata
      • tags
      const client = new BlobStorage(AZURE_STORAGE_NAME, AZURE_STORAGE_KEY);
      
      return await client.getBlobProperties(blobUrl, {
          system: true,
          metadata: true,
          tags: true
      });

      Example response:

      {
          "system": {
              "lastModified": "2023-01-07T18:16:17.000Z",
              "createdOn": "2023-01-07T18:16:17.000Z",
              "objectReplicationRules": {},
              "blobType": "BlockBlob",
              "leaseState": "available",
              "leaseStatus": "unlocked",
              "contentLength": 202300,
              "contentType": "image/jpeg",
              "etag": "\"0x8DAF0DB4542A49F\"",
              "clientRequestId": "eee498d8-0f25-4307-ac0c-65c0b3869f95",
              "requestId": "8d4c466a-401e-000d-3cce-2264e9000000",
              "version": "2021-10-04",
              "date": "2023-01-07T19:28:47.000Z",
              "acceptRanges": "bytes",
              "isServerEncrypted": true,
              "accessTier": "Hot",
              "accessTierInferred": true,
              "body": true,
              "objectReplicationSourceProperties": []
          },
          "metadata": {},
          "tags": {}
      }
    • Upload blob

      • From local file
      • From readable stream
    • Delete blob

    • List blobs in container by page

      • Delimiter
      • Prefix
        • to search subdirs and files: use string like 's' to search for any that begin with 's'
        • to search subdirs only: use string like 'subdirName/' or 'subdirName/s'
      • Page settings
        • limit results to small number such as 10
        • add continuationToken value to next query if it is returned from current query
          • { maxPageSize: 10, continuationToken: 'abc' }
      import { BlobStorage } from '@azberry/az-simple';
            
      const name = process.env.AZURE_BLOB_STORAGE_ACCOUNT_NAME;
      const key = process.env.AZURE_BLOB_STORAGE_ACCOUNT_KEY;
      
      const containerName = 'test';               // exact container name
      const prefixStr = 's';                      // subdirs and files that start with 's'
      const delimiter = '/';                      //
      const pageSettings = { maxPageSize: 10 };   // don't pass empty `continuationToken`
      
      try {
          const client = new BlobStorage(name, key);
      
          const results = await client.listBlobsInContainer(
          containerName,
          pageSettings,
          prefixStr,
          delimiter
          );
      
          // shape of results as type HierarchicalListingResponse
          // {
          //   serviceEndpoint: string | undefined;
          //   container: string;
          //   prefix: string;
          //   delimiter: string;
          //   pageSettings: PageSettings;
          //   subDirectoryNames: string[] | undefined;
          //   blobNames: string[] | undefined;
          //   error: string | number | undefined | Error;
          // };
      
          return results;
      } catch (err) {
          console.log(JSON.stringify(err));
      }

Computer Vision as AiVision

Azure Cognitive Services Computer Vision

Prerequisites

  • Key
  • Endpoint

Abilities

  • Analyze image

    const { AiVision } = require('@azberry/az-simple');
    require('dotenv').config();
    
    const key = process.env.AZURE_COMPUTER_VISION_KEY;
    const endpoint = process.env.AZURE_COMPUTER_VISION_ENDPOINT;
    
    async function mytest() {
        const aiVision = new AiVision(key, endpoint);
    
        const options = {
            visualFeatures: [
            'Categories',
            'Brands',
            'Adult',
            'Color',
            'Description',
            'Faces',
            'Objects',
            'Tags'
            ],
            language: 'en'
        };
    
        const results = await aiVision.readImage(
            'https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png',
            options
        );
    
        console.log(results);
    }
    
    mytest().catch((err) => console.log(err));

    Example response

    {
    "categories":[
        {
            "name":"animal_dog",
            "score":0.99609375
        }
    ],
    "adult":{
        "isAdultContent":false,
        "isRacyContent":false,
        "isGoryContent":false,
        "adultScore":0.0006656277109868824,
        "racyScore":0.001631653867661953,
        "goreScore":0.0007828648085705936
    },
    "color":{
        "dominantColorForeground":"White",
        "dominantColorBackground":"Grey",
        "dominantColors":[
            "Grey",
            "Green"
        ],
        "accentColor":"A36D28",
        "isBWImg":false,
        "isBwImg":false
    },
    "tags":[
        {
            "name":"grass",
            "confidence":0.9957543611526489
        },
        {
            "name":"dog",
            "confidence":0.9939157962799072
        },
        {
            "name":"mammal",
            "confidence":0.9928356409072876
        },
        {
            "name":"animal",
            "confidence":0.9918001890182495
        },
        {
            "name":"dog breed",
            "confidence":0.9890419244766235
        },
        {
            "name":"pet",
            "confidence":0.974603533744812
        },
        {
            "name":"outdoor",
            "confidence":0.969241738319397
        },
        {
            "name":"companion dog",
            "confidence":0.906731367111206
        },
        {
            "name":"small greek domestic dog",
            "confidence":0.8965123891830444
        },
        {
            "name":"golden retriever",
            "confidence":0.8877675533294678
        },
        {
            "name":"labrador retriever",
            "confidence":0.8746421337127686
        },
        {
            "name":"puppy",
            "confidence":0.872604250907898
        },
        {
            "name":"ancient dog breeds",
            "confidence":0.8508287668228149
        },
        {
            "name":"field",
            "confidence":0.8017748594284058
        },
        {
            "name":"retriever",
            "confidence":0.6837497353553772
        },
        {
            "name":"brown",
            "confidence":0.6581960916519165
        }
    ],
    "description":{
        "tags":[
            "grass",
            "dog",
            "outdoor",
            "animal",
            "mammal",
            "laying",
            "tan"
        ],
        "captions":[
            [
                "Object"
            ]
        ]
    },
    "faces":[
          
    ],
    "objects":[
        {
            "rectangle":[
                "Object"
            ],
            "object":"dog",
            "confidence":0.903,
            "parent":[
                "Object"
            ]
        }
    ],
    "brands":[
          
    ],
    "requestId":"97f1e8cc-f07d-4e5b-b11c-13a7d6ddf607",
    "metadata":{
        "width":1295,
        "height":1155,
        "format":"Png"
    },
    "modelVersion":"2021-05-01"
    }   

Content moderation as AiContentModeration

Azure Cognitive Services Content Moderation

Prerequisites

  • Key
  • Endpoint

Abilities

  • Content moderation for images

    const { AiContentModeration } = require('@azberry/az-simple');
    
    async function main() {
    
        const contentModeratorKey = process.env.AZURE_CONTENT_MODERATION_KEY;
        const contentModeratorEndPoint = process.env.AZURE_CONTENT_MODERATION_ENDPOINT;
    
        const aiContentModeration = new AiContentModeration(
            contentModeratorKey,
            contentModeratorEndPoint
        );
    
        const result = await aiContentModeration.imageModeration(
            "https://moderatorsampleimages.blob.core.windows.net/samples/sample5.png"
        );
        console.log(result);
    }
    
    main();

Example response

```json
{
    "result":false,
    "trackingId":"0ddfff0e-1b4b-4cd7-a0b4-6e44523b41bd",
    "adultClassificationScore":0.001438833656720817,
    "isImageAdultClassified":false,
    "racyClassificationScore":0.004629917559213936,
    "isImageRacyClassified":false,
    "advancedInfo":[
    {
        "key":"ImageDownloadTimeInMs",
        "value":"1099"
    },
    {
        "key":"ImageSizeInBytes",
        "value":"2278902"
    }
    ],
    "status":{
    "code":3000,
    "description":"OK",
    "exception":null
    }
}
```
  • Content moderation for text

    require('dotenv').config();
    
    const { AiContentModeration } = require('@azberry/az-simple');
    
    async function main() {
        const contentModeratorKey = process.env.AZURE_CONTENT_MODERATION_KEY;
        const contentModeratorEndPoint = process.env.AZURE_CONTENT_MODERATION_ENDPOINT;
    
        const aiContentModeration = new AiContentModeration(
            contentModeratorKey,
            contentModeratorEndPoint
        );
    
        const result = await aiContentModeration.textModeration(
            'text/plain',
            'This is a fuck you to the world'
        );
        console.log(result);
    }
    
    main();

    Example response

    {
        "originalText":"This is a fuck you to the world",
        "normalizedText":"   fuck you   world",
        "misrepresentation":null,
        "status":{
        "code":3000,
        "description":"OK",
        "exception":null
        },
        "language":"eng",
        "terms":[
        {
            "index":3,
            "originalIndex":10,
            "listId":0,
            "term":"fuck"
        },
        {
            "index":3,
            "originalIndex":10,
            "listId":0,
            "term":"fuck you"
        }
        ],
        "trackingId":"e60eb47f-262d-496c-90bb-8731fddc9a5b"
    }

Cosmos DB (NoSql)

Azure Cosmos DB NoSql

Prerequisites

  • Key
  • Endpoint

Abilities

  • Create new database & container
  • Get existing container

Event Hubs

Prerequisites

To send:

  • Event hub namespace name
  • Event hub connection string

To receive:

  • Event hub namespace name
  • Event hub connection string
  • Storage connection string
  • Storage container name

Abilities

  • Send bulk messages
  • Receive bulk messages

To send or receive individual messages, use an array of 1 item.

Send
require('dotenv').config();
const { EventHubs } = require('@azberry/az-simple');

async function main() {
    
    const connectionString = process.env.AZURE_EVENT_HUBS_NAMESPACE_CONNECTION_STRING;
    const eventHubName = process.env.AZURE_EVENT_HUB_NAME;
    
    console.log(connectionString);
    console.log(eventHubName);

  const eventHubs = new EventHubs(eventHubName);

  const eventsToSend = [
    { body: 'First event' },
    { body: 'Second event' },
    { body: 'Third event' }
  ];

  await eventHubs.sendBatch(connectionString, eventsToSend);
}

main().catch((err) => console.log(err));

A successful call returns no result.

Receive
require('dotenv').config();
const { EventHubs } = require('@azberry/az-simple');

async function main() {
  const eventHubConnectionString =
    process.env.AZURE_EVENT_HUBS_NAMESPACE_CONNECTION_STRING;
  const eventHubName = process.env.AZURE_EVENT_HUB_NAME;

  const consumerGroup = '$Default';

  const storageConnectionString = process.env.AZURE_STORAGE_CONNECTION_STRING;
  const storageContainerName = process.env.AZURE_STORAGE_CONTAINER_NAME;

  const endProcessingInMilliseconds = 20000;

  const eventHubs = new EventHubs(eventHubName);

  const eventsReturned = await eventHubs.receiveBatch(
    eventHubConnectionString,
    storageConnectionString,
    storageContainerName,
    consumerGroup,
    endProcessingInMilliseconds
  );

  console.log(JSON.stringify(eventsReturned));
}

main().catch((err) => console.log(err));

Example output

[
  {
    "body": "First event",
    "offset": "0",
    "sequenceNumber": 0,
    "enqueuedTimeUtc": "2023-01-05T16:55:17.677Z",
    "systemProperties": {}
  },
  {
    "body": "Second event",
    "offset": "80",
    "sequenceNumber": 1,
    "enqueuedTimeUtc": "2023-01-05T16:55:17.677Z",
    "systemProperties": {}
  },
  {
    "body": "Third event",
    "offset": "160",
    "sequenceNumber": 2,
    "enqueuedTimeUtc": "2023-01-05T16:55:17.677Z",
    "systemProperties": {}
  }
]

Key Vault

Azure Key Vault

Prerequisites

  1. Create an access policy for your key vault that grants secret permissions to your user account with the az keyvault set-policy command.

    az keyvault set-policy --name <your-key-vault-name> --upn [email protected] --secret-permissions delete get list set purge
  2. Configure @azure/identity credential setup.

Authentication

  • DefaultAzureCredential - you must provide environment mechanism to authenticate such as environment variables

Abilities

  • Secrets: Get, set, delete

MongoDb

Use this to access Cosmos DB for Mongo API

Prerequisites

  • Account name
  • Account key

Abilities

  • Get blob as JSON

Azure Cache for Redis

Use this to access Azure Cache for Redis.

Prerequisites

  • Host name: YOUR-AZURE-CACHE-FOR-REDIS-ACCOUNT-NAME.redis.cache.windows.net
  • Password: primary access key
  • Port: (default) 6380
  • Database: optional, 0-15 (16 possible databases)

Abilities

  • Connect
  • Get current client
  • Get status
  • Get key
  • Get client type
  • Get key type
  • Set key
  • Delete key
  • Ping
  • Send command
const { RedisCache } = require('@azberry/az-simple');
const params = {
  host: process.env.AZURE_CACHE_FOR_REDIS_HOST_NAME,
  password: process.env.AZURE_CACHE_FOR_REDIS_ACCESS_KEY,
  port: process.env.AZURE_CACHE_FOR_REDIS_PORT,
  database: 12
};

async function main() {
    const redisCache = new RedisCache(params);
    await redisCache.connect();

    const name1 = 'Dog:001:a';
    const name2 = 'Dog:002:a';
    const name3 = 'Dog:003:a';
    const value = 'Here we go again';

    // PING
    console.log(await redisCache.ping());

    // STATUS: isReady, isOpen, serverTime
    console.log(`status = ${JSON.stringify(await redisCache.status())}`);

    // Set key
    const set1 = await redisCache.set(name1, value);
    console.log(set1);

    // Set Key 
    const set2 = await redisCache.set(name2, value);
    console.log(set2);

    // Get key type: `string`
    const type2 = await redisCache.type(name2);
    console.log(`type: ${type2}`);

    // Set key with short cache time
    const set3 = await redisCache.set(name3, value, 50);
    console.log(set3);

    // DBSize - item count == 3
    const dbSize = await redisCache.sendCommand(['DBSIZE']);
    console.log(`size ${JSON.stringify(dbSize)}`);

    // Delete second item
    const deleteName2 = await redisCache.delete(name2);
    console.log(`delete ${JSON.stringify(deleteName2)}`);

    // DBSize - item count == 2
    const dbSize1 = await redisCache.sendCommand(['DBSIZE']);
    console.log(`size ${JSON.stringify(dbSize1)}`);

    // Get first item: "Here we go again"
    const get1 = await redisCache.get(name1);
    console.log(JSON.stringify(get1));

    // Does first item exist: returns 1
    const doesExist = await redisCache.sendCommand(['EXISTS', name1]);
    console.log(`key 1 exists ${JSON.stringify(doesExist)}`);

    // DBSize - item count - 2
    const dbSize2 = await redisCache.sendCommand(['DBSIZE']);
    console.log(`size ${JSON.stringify(dbSize2)}`);

    // List all keys: ["Dog:001:a","Dog:003:a"]
    const keys = await redisCache.sendCommand(['KEYS', '*']);
    console.log(`list ${JSON.stringify(keys)}`);

    // DBSize - item count - 2 (third item hasn't timed out yet)
    const dbSize3 = await redisCache.sendCommand(['DBSIZE']);
    console.log(`size ${JSON.stringify(dbSize3)}`);

    // Remove keys
    // const flushall = await redisCache.sendCommand(['FLUSHALL']);
    //console.log(`flushall ${JSON.stringify(flushall)}`);

    // Want to do your own thing with redis? 
    const client = redisCache.getCurrentClient();

    // Disconnect with wait
    await redisCache.DisconnectWhenFinished();

    // Disconnect
    await redisCache.disconnectNow();
}

Translator

Azure Cognitive Service Translator Text

Prerequisites

Create the key in the Global region.

  • Key
  • Endpoint

Abilities

  • Get translation - translate array of strings from one language to another