From 6242c5f34f251f4d5d7f0ad3d3f51580c51e5218 Mon Sep 17 00:00:00 2001 From: Kristian Mandrup Date: Tue, 22 Nov 2016 15:23:20 +0100 Subject: [PATCH 1/3] updated deps --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 04c8177..6f8e618 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aster-squery", - "version": "0.1.2", + "version": "0.1.3", "description": "Replace nodes with CSS-like selectors in aster.", "author": "Ingvar Stepanyan (https://github.com/RReverser)", "repository": "asterjs/aster-squery", @@ -21,16 +21,16 @@ "test": "mocha" }, "dependencies": { - "es6-map": "^0.1.0", - "estemplate": "^0.1.1", - "estraverse": "^1.5.1", - "grasp-squery": "^0.2.2", - "rx": "^2.3.11" + "es6-map": "^0.1.4", + "estemplate": "^0.5.1", + "estraverse": "estools/estraverse#master", + "grasp-squery": "^0.3.0", + "rx": "^4.1.0" }, "devDependencies": { "chai": "*", - "escodegen": "^1.4.1", - "esprima": "^1.2.2", + "escodegen": "^1.8.1", + "esprima": "^jquery/esprima#master", "mocha": "*" } } From 614dee095886b57ec842ffad771e08b7320bbea0 Mon Sep 17 00:00:00 2001 From: Kristian Mandrup Date: Wed, 23 Nov 2016 22:37:49 +0100 Subject: [PATCH 2/3] add customizable options --- README.md | 8 ++ index.js | 53 +++++--- package.json | 4 +- test/test.js | 13 +- yarn.lock | 373 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 426 insertions(+), 25 deletions(-) create mode 100644 yarn.lock diff --git a/README.md b/README.md index c7a1ef5..8a7bd53 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,14 @@ Type: `String` [estemplate](https://github.com/RReverser/estemplate) string to be used for generating AST. +#### queryMapper + +Custom `queryMapper` RxJS mapper or function that produces such a mapper (when passed `options`). + +#### replaces + +Custom `replaces` ie. `Rx.Observable.fromArray(...)` or a function that produces it. + ## License [MIT License](http://en.wikipedia.org/wiki/MIT_License) diff --git a/index.js b/index.js index 8e435e4..db3b5c0 100644 --- a/index.js +++ b/index.js @@ -6,8 +6,32 @@ var Map = require('es6-map'); var traverse = require('estraverse').replace; var estemplate = require('estemplate'); +function defaultMapper(options) { + return function (files) { + return files.flatMap(function (file) { + return options.replaces + .flatMap(function (replace) { + var handler = replace.handler; + + return Rx.Observable.fromArray(squery.queryParsed(replace.selector, file.program)).map(function (node) { + return [node, handler(node)]; + }); + }) + .filter(function (replace) { return replace[1] !== undefined }) + .toArray() + .map(function (replaces) { + file.program = traverse(file.program, { + leave: Map.prototype.get.bind(new Map(replaces)) + }); + + return file; + }); + }); + } +} + module.exports = function (options) { - var replaces = Rx.Observable.fromArray(Object.keys(options)).map(function (selector) { + var defaultReplaces = Rx.Observable.fromArray(Object.keys(options)).map(function (selector) { var handler = options[selector]; if (typeof handler === 'string') { @@ -45,25 +69,12 @@ module.exports = function (options) { }; }); - return function (files) { - return files.flatMap(function (file) { - return replaces - .flatMap(function (replace) { - var handler = replace.handler; - - return Rx.Observable.fromArray(squery.queryParsed(replace.selector, file.program)).map(function (node) { - return [node, handler(node)]; - }); - }) - .filter(function (replace) { return replace[1] !== undefined }) - .toArray() - .map(function (replaces) { - file.program = traverse(file.program, { - leave: Map.prototype.get.bind(new Map(replaces)) - }); + // note that file is essentially any src AST, which has a .program node + var qMapper = options.queryMapper || defaultMapper + qMapper = typeof qMapper === 'function' ? qMapper(options) : qMapper + var replaces = options.replaces || defaultReplaces + replaces = typeof replaces === 'function' ? replaces(options) : replaces + options.replaces = replaces - return file; - }); - }); - } + return qMapper }; diff --git a/package.json b/package.json index 6f8e618..cf14a11 100644 --- a/package.json +++ b/package.json @@ -23,14 +23,14 @@ "dependencies": { "es6-map": "^0.1.4", "estemplate": "^0.5.1", - "estraverse": "estools/estraverse#master", + "estraverse": "^4.2.0", "grasp-squery": "^0.3.0", "rx": "^4.1.0" }, "devDependencies": { "chai": "*", "escodegen": "^1.8.1", - "esprima": "^jquery/esprima#master", + "esprima": "^3.1.0", "mocha": "*" } } diff --git a/test/test.js b/test/test.js index 874738d..7be3319 100644 --- a/test/test.js +++ b/test/test.js @@ -34,7 +34,11 @@ it('function handler', function (done) { })(Rx.Observable.fromArray(input)) .pluck('program') .map(generate) - .zip(expected, assert.equal) + // .zip(expected, assert.equal) + .do(function (file) { + assert.equal(file, expected[0]); + }) + .subscribe(function () {}, done, done); }); @@ -54,6 +58,11 @@ it('template handler', function (done) { })(Rx.Observable.fromArray(input)) .pluck('program') .map(generate) - .zip(expected, assert.equal) + // .zip(expected, assert.equal) + .do(function (file) { + assert.equal(file, expected[0]); + // assert.equal(file.program.type, 'Program'); + }) + .subscribe(function () {}, done, done); }); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..4b8540c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,373 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +chai@*: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +es5-ext@^0.10.7, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: + version "0.10.12" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" + dependencies: + d "^0.1.1" + es5-ext "^0.10.7" + es6-symbol "3" + +es6-map@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-set "~0.1.3" + es6-symbol "~3.1.0" + event-emitter "~0.3.4" + +es6-set@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-symbol "3" + event-emitter "~0.3.4" + +es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + +escape-string-regexp@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.7.1, esprima@^2.7.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.1.tgz#02dbcc5ac3ece81070377f99158ec742ab5dda06" + +estemplate@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/estemplate/-/estemplate-0.5.1.tgz#1714a9d46190738ac958bcafd49e029cda56a39e" + dependencies: + esprima "^2.7.2" + estraverse "^4.1.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-emitter@~0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.7" + +fast-levenshtein@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +glob@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +grasp-squery@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/grasp-squery/-/grasp-squery-0.3.0.tgz#8114041fdfa878886ba683a7e2abea163d7eb30e" + dependencies: + grasp-syntax-javascript "~0.2.0" + prelude-ls "~1.1.2" + +grasp-syntax-javascript@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/grasp-syntax-javascript/-/grasp-syntax-javascript-0.2.0.tgz#96ba15757ff112f48a7c5c92702944e16ff4ba3e" + dependencies: + prelude-ls "~1.1.2" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +minimatch@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.1.2.tgz#51f93b432bf7e1b175ffc22883ccd0be32dba6b5" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.5" + glob "7.0.5" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + From 2024363301fdafb98e0d40ea9c5dc83cb2c2ce04 Mon Sep 17 00:00:00 2001 From: Kristian Mandrup Date: Wed, 23 Nov 2016 22:52:37 +0100 Subject: [PATCH 3/3] more customizable --- README.md | 12 ++++++++++++ index.js | 21 +++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8a7bd53..57772e4 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,18 @@ Custom `queryMapper` RxJS mapper or function that produces such a mapper (when p Custom `replaces` ie. `Rx.Observable.fromArray(...)` or a function that produces it. +#### squery + +Custom `squery`, by default `require('grasp-squery')` + +#### traverse + +Custom `traverse` replacer, by default `require('estraverse').replace` + +#### estemplate + +Custom `estemplate`, by default `require('estemplate')` + ## License [MIT License](http://en.wikipedia.org/wiki/MIT_License) diff --git a/index.js b/index.js index db3b5c0..771b396 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ var Rx = require('rx'); var squery = require('grasp-squery'); -var Map = require('es6-map'); +var Map = Map || require('es6-map'); var traverse = require('estraverse').replace; var estemplate = require('estemplate'); @@ -13,14 +13,14 @@ function defaultMapper(options) { .flatMap(function (replace) { var handler = replace.handler; - return Rx.Observable.fromArray(squery.queryParsed(replace.selector, file.program)).map(function (node) { + return Rx.Observable.fromArray(options.squery.queryParsed(replace.selector, file.program)).map(function (node) { return [node, handler(node)]; }); }) .filter(function (replace) { return replace[1] !== undefined }) .toArray() .map(function (replaces) { - file.program = traverse(file.program, { + file.program = options.traverse(file.program, { leave: Map.prototype.get.bind(new Map(replaces)) }); @@ -31,12 +31,17 @@ function defaultMapper(options) { } module.exports = function (options) { + options = options || {} + options.squery = options.squery || squery + options.traverse = options.traverse || traverse + options.estemplate = options.estemplate || estemplate + var defaultReplaces = Rx.Observable.fromArray(Object.keys(options)).map(function (selector) { var handler = options[selector]; if (typeof handler === 'string') { var canBeExprStmt = handler.slice(-1) === ';'; - var tmpl = estemplate.compile(handler, {tolerant: true}); + var tmpl = options.estemplate.compile(handler, {tolerant: true}); handler = function (node) { var ast = tmpl(node); @@ -64,17 +69,17 @@ module.exports = function (options) { } return { - selector: squery.parse(selector), + selector: options.squery.parse(selector), handler: handler }; }); - // note that file is essentially any src AST, which has a .program node - var qMapper = options.queryMapper || defaultMapper - qMapper = typeof qMapper === 'function' ? qMapper(options) : qMapper var replaces = options.replaces || defaultReplaces replaces = typeof replaces === 'function' ? replaces(options) : replaces options.replaces = replaces + var qMapper = options.queryMapper || defaultMapper + qMapper = typeof qMapper === 'function' ? qMapper(options) : qMapper + return qMapper };