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

@grconrad/vscode-extension-feedback

v1.0.0

Published

Timing based feedback gathering for VS Code extensions

Downloads

1

Readme

@grconrad/vscode-extension-feedback

Gather feedback from users of your VS Code extension, using an external form hosted on the web.

Prompt

Make a single API call from your extension's activate entry point.

Control the timing and text of the feedback prompts.

Usage

Create a publicly accessible survey form (Google form, Surveymonkey, etc.)

From your activate entry point, invoke scheduleFeedbackChecks. The result is a Disposable you can add to your extension context subscriptions to ensure the scheduled checks get cancelled when your extension deactivates.

Example where the feedback survey is specified in an extension's package.json feedbackFormUrl field:

import { window, Disposable, ExtensionContext, OutputChannel } from "vscode";

import { scheduleFeedbackChecks } from "@grconrad/vscode-extension-feedback";

const { feedbackFormUrl } = require("../package.json");

export async function activate(context: ExtensionContext): Promise<void> {
  // ...
  const channel = window.createOutputChannel("My Extension");
  // ...
  scheduleFeedbackChecks(
    {
      memento: context.globalState,
      logFn: (text: string) => {
        channel.appendLine(text);
      }
    },
    {
      feedbackFormUrl,
      // Use default timings
      // Use default text
    }
  ).then((disposable: Disposable) => {
    context.subscriptions.push(disposable);
  }).catch((reason: any) => {
    channel.appendLine(`Failed to schedule feedback checks: reason=${reason}`);
  });
  // ...

Notes

Timings to control the feedback checking are customizable. By default:

  • Checking occurs once per day
  • The first prompt occurs 7 days after the extension first begins its scheduled feedback checking
  • Reminders occur 7 days after the last prompt

The time of the last prompt, and information about whether the user has provided feedback or said "Don't ask again", are persisted to disk using context.globalState so that they can survive reboots of VS Code.

Text in the prompts is customizable. By default:

  • The prompt is "Enjoying this extension? We'd love your feedback!"
  • Choices (buttons) from left to right are: "Give feedback", "Not now" and "Don't ask again"

The second parameter to scheduleFeedbackChecks is an object where you can specify timings, if you're unhappy with the defaults:

  scheduleFeedbackChecks(
    {
      memento: context.globalState,
      logFn: (text: string) => {
        channel.appendLine(text);
      }
    },
    {
      feedbackFormUrl,
      // Override default timings (fast enough for manual testing)
      timings: {
        checkInterval: 15 * 1000,    // 15 seconds
        firstAskInterval: 60 * 1000, // 1 minute
        reminderInterval: 30 * 1000, // 30 seconds
      },
      // Override default text
      localizedText: {
        promptText: "Liking this extension?",
        giveFeedbackText: "Tell us",
        notNowText: "Later",
        dontAskAgainText: "Stop asking"
      }
    }
  ).then((disposable: Disposable) => {
    context.subscriptions.push(disposable);
  }).catch((reason: any) => {
    channel.appendLine(`Failed to schedule feedback checks: reason=${reason}`);
  });
  // ...