Skip to content

Commit

Permalink
Add support for component data-test-* attributes without values
Browse files Browse the repository at this point in the history
This adds support for `{{my-component data-test-foo}}`.

Basically, this adds a handlebars transform that converts the previous
example to `{{my-component data-test-foo=true}}`.
  • Loading branch information
HeroicEric committed Jan 23, 2017
1 parent fa8eaf2 commit fb17788
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 1 deletion.
8 changes: 8 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ module.exports = {
plugin: StripTestSelectorsTransform,
baseDir: function() { return __dirname; }
});
} else {
var TransformTestSelectorParamsToHashPairs = require('./transform-test-selector-params-to-hash-pairs');

registry.add('htmlbars-ast-plugin', {
name: 'transform-test-selector-params-to-hash-pairs',
plugin: TransformTestSelectorParamsToHashPairs,
baseDir: function() { return __dirname; }
});
}
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,8 @@ if (!config.stripTestSelectors) {
assert.equal(find('.test6').find('div[data-non-test]').length, 0, 'data-non-test does not exists');
});

}
test('it binds data-test-* attributes without values on components', function (assert) {
assert.equal(find('.test7').find('div[data-test-without-value]').length, 1, 'data-test-without-value exists');
});

}
2 changes: 2 additions & 0 deletions tests/dummy/app/templates/bind-test.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@
<div class="test5">{{data-test-component data-test="foo"}}</div>

<div class="test6">{{data-test-component data-non-test="foo"}}</div>

<div class="test7">{{data-test-component data-test-without-value}}</div>
42 changes: 42 additions & 0 deletions transform-test-selector-params-to-hash-pairs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/* eslint-env node */
var TEST_SELECTOR_PREFIX = /data-test-.*/;

function TransformTestSelectorParamsToHashPairs() {
this.syntax = null;
}

function isTestSelectorParam(param) {
return param.type === 'PathExpression'
&& TEST_SELECTOR_PREFIX.test(param.original);
}

TransformTestSelectorParamsToHashPairs.prototype.transform = function(ast) {
var b = this.syntax.builders;
var traverse = this.syntax.traverse;

traverse(ast, {
MustacheStatement: function(node) {
var testSelectorParams = [];
var otherParams = [];

node.params.forEach(function(param) {
if (isTestSelectorParam(param)) {
testSelectorParams.push(param);
} else {
otherParams.push(param);
};
});

node.params = otherParams;

testSelectorParams.forEach(function(param) {
var pair = b.pair(param.original, b.boolean(true));
node.hash.pairs.push(pair);
});
}
});

return ast;
};

module.exports = TransformTestSelectorParamsToHashPairs;

0 comments on commit fb17788

Please sign in to comment.