gkz / grasp

JavaScript structural search, replace, and refactor
http://graspjs.com
MIT License
1.28k stars 33 forks source link

deleting property #95

Open ainthek opened 8 years ago

ainthek commented 8 years ago

echo "var x={a:10,b:20}" | grasp -s "prop[key=#b]" -R '' var x={a:10,}

leaves unexpected ,

any ideas ?

gkz commented 8 years ago

It's being very literal. The text for property "b" does not include the comma in between, so it does not replace the comma.

ainthek commented 8 years ago

solved somehow: getting object and reconstructing from properties except deleted ones:

// sample: echo "var x={id:10,b:20,c:30}" | node _tools/delete-properties.js "b,id"
// parse original args
var args = require('grasp/lib/options.js').parse(process.argv);
// store for replacer
var toDelete = args._[0].split(",");
// transform to s-query for object search (narrow the query)
args._[0] = 'obj!>prop[key=(' + toDelete.map(function(p) {
    return "#" + p;
}).join(",") + ')]';
// set custom replacer (using toDelete)
args.replaceFunc = function(getRaw, node, query, named) {
    var ps = query(".properties");
    var raw = ps.filter(function(p) {
        return !~toDelete.indexOf(p.key.name);
    }).map(function(p) {
        return getRaw(p);
    }).join(",\n");
    return "{" + raw + "}";
}

//
require('grasp')({
    args: args,
    exit: process.exit,
    stdin: process.stdin,
    callback: console.log,
    error: console.error
});
kristianmandrup commented 7 years ago

What are you doing here? I'd like to be able to delete a certain named function from an ES6 class. Does grasp/acorn support classes and other such ES6 contstructs??