A grunt plugin that accepts a single line JavaScript file to be URI encoded and prepended with a protocol (eg, javascript:) for output.

npm install js2uri
32 downloads in the last week
54 downloads in the last month


Build Status

grunt plugin to convert a JavaScript file to a URI, such as a javascript: bookmarklet or an iOS app protocol scheme link.


Version 1.3.0 begins grunt 0.4.0 compatibility and ends compatibility with earlier versions of grunt. Use js2uri 1.2.0 if you require grunt 0.3.x compatibility.


The code

alert("Hello. The current URL is: " + location.href);



Note that the "0" in void'0' can be used to embed a custom version number in a bookmarklet.

Getting Started


Install this grunt plugin next to your project's Gruntfile.js gruntfile with: npm install js2uri --save. The --save options will add js2uri to the dependencies section of your project's package.json file.

Edit Gruntfile.js

Add the following to the grunt.initConfig section of your project's Gruntfile.js file:

js2uri:  {
  'dist/uriVersionOflintedAndMinifiedFile.js': ['dist/lintedAndMinifiedFile.js']

Edit the values for the dist/uriVersion... (destination) and dist/linted... (source) as appropriate.

Below the grunt.initConfig section, add this line to your project's Gruntfile.js.

// load external task

Finally, ensure that jshint and uglify tasks are called before js2uri, such as here:

// default task
grunt.registerTask('default', [ "jshint", "uglify", "js2uri"] );


An elaborated Gruntfile.js follows below to clarify expectations and options relating to js2uri. Note that as of js2uri v1.3.0 the grunt 0.4.x target data formats are supported for specifying files. See gruntjs wiki - Inside Multi Tasks: this.file.

// if meta object exists js2uri will tempt to use version as options.customVersion value
meta: {
  version: '1.6.1'
// note critical jshint options for strict, scripturl, & browser
jshint: {
  files: ['Gruntfile.js', 'src/*.js'],
  options: {
  strict: false,
  scripturl: true,
  browser: true
  globals: {}
// note compact file spec-- 'destinationfile': ['sourcefile'],
uglify: {
  'dist/lintedAndMinifiedFile.js': ['src/*.js'],
  options: {
    mangle: {toplevel: true},
    squeeze: {sequences: false, conditionals: false, hoist_vars: true},
    codegen: {quote_keys: false}
// js2uri default options are shown
// note use of compact form of grunt 0.4.x files spec-- 'destinationfile': ['sourcefile'],
js2uri:  {
  'dist/uriVersionOflintedAndMinifiedFile.js': ['dist/lintedAndMinifiedFile.js'],
  options: {
    protocol: 'javascript:',
    useNewlineEOL: true,
    useSingleQuote: true,
    appendVoid: true,
    customVersion: '', // use this if set, ELSE use version from meta above (if available)
    appendVersion: false,
    noLastSemicolon: true,
    forceLastSemicolon: false,
    entityEncode: false

// Load "jshint" plugin

// Load "uglify" plugin

// Load "js2uri" plugin

// Default task
grunt.registerTask('default', [ "jshint", "uglify", "js2uri"] );


In lieu of a formal style guide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using grunt.

Release History

1.3.10: March 26, 2014 - update to grunt-contrib-jshint 0.9.x; grunt-contrib-nodeunit to 0.3.x

1.3.9: December 27, 2013 - update to grunt-contrib-jshint 0.8.x and streamline dependencies

1.3.8: December 9, 2013 - update to grunt-contrib-jshint 0.7.x and integrate Travis CI

1.3.7: July 28, 2013 - update to grunt-contrib-jshint 0.6.x and grunt-contrib-nodeunit 0.2.x

1.3.6: July 12, 2013 - update to require node 0.10.x, and more current grunt-contrib utils

1.3.5: May 20, 2013 - update license URL in package.json

1.3.4: May 19, 2013 - package.json repository.url uses https:// instead of git:// and devDependencies updated for jshint (>=0.1.2 <0.5.0)

1.3.3: March 12, 2013 - Update package.json for node 0.10.0 (ie node>=0.8.0)

1.3.2: February 28, 2013 - Better jshint options in Gruntfile.js; package.json updates

1.3.1: February 19, 2013 - Change references to grunt.js to Gruntfile.js, replace directives

1.3.0: February 18, 2013 - Update for compatibility to grunt v0.4.x, improved package.json, update README

1.2.0 January 9, 2013 - add more tests, add entityEncode: option for encoding '<', '>' and '&'.

1.1.2 January 8, 2013 - add more tests, resolve issues with appendVersion:false and customVersion:.

1.1.1 January 7, 2013 - fix issue reading/setting noLastSemicolon: and forceLastSemicolon:.

1.1.0 January 6, 2013 - adds new options for protocol:, customVersion:, and forceLastSemicolon:.

1.0.0 December 31, 2012 - initial release


Copyright (c) 2012, 2013, 2014 Tom King Licensed under the MIT license.

npm loves you