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

ducktape.js

v0.1.0

Published

A proxy server for modifying/patching live sites.

Downloads

3

Readme

ducktappe.js

Ducktape.js is a specialized proxy server that can be used to patch/modify a live site into something else.

Usage scenarios

  • Creating usable prototypes for new layouts or design changes
  • Testing frontend optimization scenarios
  • Test a bug fixes directly on production servers

Installation

npm install ducktape

Usage

First create a proxy server. The proxy server is created with [node-http-proxy|https://github.com/nodejitsu/node-http-proxy] :

var ducktape = require("./ducktape");
var JDM = ducktape({
    host: "www.journaldemontreal.com",
    port: "80"
});

The add routes for the url you want to capture. Any uncaught url's will be simply proxyed. The router used is created with [Director|https://github.com/flatiron/director] :

JDM.router.get("/sports", function () {
    ...
});

Helpers

Inside each route handlers you have access to the request, the response and a few helpers making modifications.

this.pass

The .pass() helper will simply pass on the request to the proxy. This can be usefull for simple changes headers or logging. When using .pass you must also tell director to stream the request:

JDM.router.get("/sports", { stream: true }, function () {
    this.pass();
});

this.patch

The .patch() handler return the body of the page as a string for you to modify and send back.

JDM.router.get("/sports", function () {
    console.log("Remplacement des URLs");
    this.patch(function (err, body) {
        // Replace all occurence of the domain name
        newBody = body.replace(/http:\/\/www.journaldemontreal.com\//g, "http://localhost:8080/").trim();
        // Write a "success" header
        this.res.writeHead(200)
        // Send back the new content to the browser
        this.res.end(newBody);
    });
});

this.patchDOM

The .patchDOM() will return a JSDOM instance with jQuery already loaded in the dom. This allows you to transform the page as if you we're in a browser.

You are still reponsible for sending back the request.

JDM.router.get("/sports", function () {
    this.patchDOM(function (err, window) {
        console.log("Removing all scripts");

        // Remove all scripts and stylesheets
        window.$("script").remove();
        window.$("link[rel='stylesheet']").remove();
        // Read the modified html source from the dom
        var newHTML = window.document.innerHTML;
        // Add back the doctype lost by JSDOM
        newHTML = "<!DOCTYPE html>" + newHTML;
        // Write a "success" header
        this.res.writeHead(200)
        // Send back the new content to the browser
        this.res.end(newHTML);
    });
});

Without helpers

You can also handle the request and response without any helpers:

JDM.router.get("/custom", function () {
    this.res.write("Some custom page!!!");
    this.res.end();
})

Feature Roadmap

  • Helper to return the content
  • Helper to path to local files
  • Better handling of mimetypes
  • Automatic re-use of Doctype when using .patchDOM
  • Use helpers to create routes instead of using the router directly.

Credits and License

Mathieu Sylvain, http://nurun.com BDS!