
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
userscript-utils
Advanced tools
Useful tools for developing userscripts - in both CLI and API modes (CLI uses asynchronous calls while API can use either).
.meta.js files (@updateURL)#Installation
npm install -g userscript-utils
Requires node version >=0.12
{lamb} userscript-utils --help
Userscript utilities Usage: userscript-utils <cmd> [options] Pass -h or --help to any command to display command-specific help Commands: get-metablock - Retrieve the entire metadata block get-updateblock - Retrieve a shortened metadata block for .meta.js files
{lamb} userscript-utils get-metablock --help
Retrieve the entire metadata block Usage: userscript-utils get-metablock [options] Options: -h, --help - Display this help -i, --infile - Get contents from a file as opposed to STDIN -o, --outfile - Output result to a file as opposed to STDOUT
{lamb} userscript-utils get-updateblock --help
Retrieve the shortened metadata block required for .meta.js files and @updateURL Usage: userscript-utils get-updateblock [options] Options: -h, --help - Display this help -i, --infile - Get contents from a file as opposed to STDIN -o, --outfile - Output result to a file as opposed to STDOUT -u, --updateurl - Include the @updateURL tag in the output -d, --downloadurl - Include the @downloadURL tag in the output
See generated JSDoc.
Bare minimum:
userscript-utils get-updateblock -i foo.user.js -o foo.meta.js;
#or
userscript-utils get-updateblock -i foo.user.js >> foo.meta.js;
Include @updateURL & @downloadURL:
userscript-utils get-updateblock -i foo.user.js -o foo.meta.js -du;
#or
userscript-utils get-updateblock -i foo.user.js -du >> foo.meta.js;
From STDIN:
cat foo.user.js | userscript-utils get-updateblock -o foo.meta.js;
#or
cat foo.user.js | userscript-utils get-updateblock >> foo.meta.js;
Or simply view the output by omitting the -o and --output options.
Same options/arguments as above with the exception of -d, -u, --downloadurl and --updateurl being invalid:
userscript-utils get-metablock -i foo.user.js -o foo.big.meta.js;
.meta.js metablock and writing it to a new file:var utils = require('userscript-utils').getUpdateMetablock,
fs = require('fs'),
inputFile = "foo.user.js",
outputFile = "foo.meta.js",
//For fs.writeFile
innerCallback = function (e) {
if (e) {
throw e;
}
},
//For userscript-utils
outerCallback = function (e, o) {
if (e) {
throw e;
} else {
fs.writeFile(outputFile, o, 'utf8', innerCallback);
}
};
//Bare minimum
utils.fromFile(inputFile, outerCallback);
//Include @updateURL
utils.fromFile(inputFile, outerCallback, true);
//Include @downloadURL
utils.fromFile(inputFile, outerCallback, false, true);
//Include @updateURL @downloadURL
utils.fromFile(inputFile, outerCallback, true, true);
// For synchronous mode simply omit the callback argument and replate the method with "fromFileSync":
try {
utils.fromFileSync(inputFile);
} catch (e) {
//handle
}
//And you can just as easily do the same if you have the file contents as a string:
utils.fromString(stringContainingFileContents, outerCallback);
try {
utils.fromStringSync(stringContainingFileContents);
} catch (e) {
//handle
}
var utils = require('userscript-utils').getMetablock,
fs = require('fs'),
inputFile = "foo.user.js",
outputFile = "foo.meta.js",
//For fs.writeFile
innerCallback = function (e) {
if (e) {
throw e;
}
},
//For userscript-utils
outerCallback = function (e, o) {
if (e) {
throw e;
} else {
fs.writeFile(outputFile, o, 'utf8', innerCallback);
}
};
//Async
utils.fromFile(inputFile, outerCallback);
// Sync
try {
utils.fromFileSync(inputFile);
} catch (e) {
//handle
}
//And you can just as easily do the same if you have the file contents as a string:
utils.fromString(stringContainingFileContents, outerCallback);
try {
utils.fromStringSync(stringContainingFileContents);
} catch (e) {
//handle
}
var utils = require('userscript-utils'),
minify = require('uglify-js').minify,
fs = require('fs'),
inFile = "foo.user.js",
outFile = "foo.min.user.js";
//Get our metablock
utils.getMetablock.fromFile(inFile, function (e, metablock) {
if (e) {
throw e;
} else {
// Minify the JS
var minified = minify(inFile).code;
//Open our file for writing
fs.open(outFile, 'w', function (e, fd) {
if (e) {
throw e;
} else {
//Write our file
fs.write(fd, metablock + "\n" + minified, function (e) {
try {
if (e) {
throw e;
}
} finally {
fs.close(fd, function (e) {
if (e) {
throw e;
}
});
}
});
}
});
}
});
You'll need grunt-run:
npm i --save-dev grunt-run;
Add a run task to your Gruntfile.js under any name (e.g. foo) containing a CLI command to execute, e.g.:
module.exports = function (grunt) {
// Initializing configuration objects
grunt.initConfig({
run: {
foo: {
exec: 'userscript-utils get-updateblock -i foo.user.js -o foo.meta.js'
}
}
});
grunt.loadNpmTasks('grunt-run');
};
Run the task:
grunt run:foo;
If you cloned this repository and want to run tests be sure to run npm link beforehand otherwise you'll get errors!
FAQs
Useful tools for developing userscripts
The npm package userscript-utils receives a total of 0 weekly downloads. As such, userscript-utils popularity was classified as not popular.
We found that userscript-utils demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.