UNPKG

@glimmer/compiler

Version:
60 lines (57 loc) 16.7 kB
'use strict'; var _syntax = require('@glimmer/syntax'); var _compiler = require('@glimmer/compiler'); const { test, assert } = QUnit; function actionsEqual(input, expectedActions) { let ast = (0, _syntax.preprocess)(input); let templateVisitor = new _compiler.TemplateVisitor(); templateVisitor.visit(ast); let actualActions = templateVisitor.actions; // Remove the AST node reference from the actions to keep tests leaner for (let i = 0; i < actualActions.length; i++) { actualActions[i][1].shift(); } assert.deepEqual(actualActions, expectedActions); } QUnit.module('[glimmer-compiler] TemplateVisitor'); test('empty', function () { let input = ''; actionsEqual(input, [['startProgram', [0, []]], ['endProgram', [0]]]); }); test('basic', function () { let input = 'foo{{bar}}<div></div>'; actionsEqual(input, [['startProgram', [0, []]], ['text', [0, 3]], ['mustache', [1, 3]], ['openElement', [2, 3, 0, []]], ['closeElement', [2, 3]], ['endProgram', [0]]]); }); test('nested HTML', function () { let input = '<a></a><a><a><a></a></a></a>'; actionsEqual(input, [['startProgram', [0, []]], ['openElement', [0, 2, 0, []]], ['closeElement', [0, 2]], ['openElement', [1, 2, 0, []]], ['openElement', [0, 1, 0, []]], ['openElement', [0, 1, 0, []]], ['closeElement', [0, 1]], ['closeElement', [0, 1]], ['closeElement', [1, 2]], ['endProgram', [0]]]); }); test('mustaches are counted correctly', function () { let input = '<a><a>{{foo}}</a><a {{foo}}><a>{{foo}}</a><a>{{foo}}</a></a></a>'; actionsEqual(input, [['startProgram', [0, []]], ['openElement', [0, 1, 2, []]], ['openElement', [0, 2, 1, []]], ['mustache', [0, 1]], ['closeElement', [0, 2]], ['openElement', [1, 2, 3, []]], ['openElement', [0, 2, 1, []]], ['mustache', [0, 1]], ['closeElement', [0, 2]], ['openElement', [1, 2, 1, []]], ['mustache', [0, 1]], ['closeElement', [1, 2]], ['closeElement', [1, 2]], ['closeElement', [0, 1]], ['endProgram', [0]]]); }); test('empty block', function () { let input = '{{#a}}{{/a}}'; actionsEqual(input, [['startBlock', [0, []]], ['endBlock', [1]], ['startProgram', [1, []]], ['block', [0, 1]], ['endProgram', [0]]]); }); test('block with inverse', function () { let input = '{{#a}}b{{^}}{{/a}}'; actionsEqual(input, [['startBlock', [0, []]], ['endBlock', [1]], ['startBlock', [0, []]], ['text', [0, 1]], ['endBlock', [1]], ['startProgram', [2, []]], ['block', [0, 1]], ['endProgram', [0]]]); }); test('nested blocks', function () { let input = '{{#a}}{{#a}}<b></b>{{/a}}{{#a}}{{b}}{{/a}}{{/a}}{{#a}}b{{/a}}'; actionsEqual(input, [['startBlock', [0, []]], ['text', [0, 1]], ['endBlock', [1]], ['startBlock', [0, []]], ['mustache', [0, 1]], ['endBlock', [2]], ['startBlock', [0, []]], ['openElement', [0, 1, 0, []]], ['closeElement', [0, 1]], ['endBlock', [2]], ['startBlock', [2, []]], ['block', [0, 2]], ['block', [1, 2]], ['endBlock', [1]], ['startProgram', [2, []]], ['block', [0, 2]], ['block', [1, 2]], ['endProgram', [0]]]); }); test('comment', function () { let input = '<!-- some comment -->'; actionsEqual(input, [['startProgram', [0, []]], ['comment', [0, 1]], ['endProgram', [0]]]); }); test('handlebars comment', function () { let input = '{{! some comment }}'; actionsEqual(input, [['startProgram', [0, []]], ['endProgram', [0]]]); }); test('handlebars comment in element space', function () { let input = '<div {{! some comment }}></div>'; actionsEqual(input, [['startProgram', [0, []]], ['openElement', [0, 1, 0, []]], ['closeElement', [0, 1]], ['endProgram', [0]]]); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmlzaXRvci1ub2RlLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9jb21waWxlci90ZXN0L3RlbXBsYXRlLXZpc2l0b3Itbm9kZS10ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsQUFBTyxBQUFFLEFBQVUsQUFBRSxBQUFNLEFBQWlCLEFBQUM7O0FBQzdDLEFBQU8sQUFBRSxBQUFlLEFBQUUsQUFBTSxBQUFtQixBQUFDOztBQUVwRCxNQUFNLEVBQUUsQUFBSSxNQUFFLEFBQU0sQUFBRSxXQUFHLEFBQUssQUFBQztBQUUvQixzQkFBc0IsQUFBYSxPQUFFLEFBQXNCO0FBQ3pELFFBQUksQUFBRyxNQUFHLEFBQVUsd0JBQUMsQUFBSyxBQUFDLEFBQUM7QUFFNUIsUUFBSSxBQUFlLGtCQUFHLEFBQUksQUFBZSxBQUFFLEFBQUM7QUFDNUMsQUFBZSxvQkFBQyxBQUFLLE1BQUMsQUFBRyxBQUFDLEFBQUM7QUFDM0IsUUFBSSxBQUFhLGdCQUFHLEFBQWUsZ0JBQUMsQUFBTyxBQUFDO0FBRTVDLEFBQXNFO0FBQ3RFLFNBQUssSUFBSSxBQUFDLElBQUcsQUFBQyxHQUFFLEFBQUMsSUFBRyxBQUFhLGNBQUMsQUFBTSxRQUFFLEFBQUMsQUFBRSxLQUFFO0FBQzdDLEFBQWEsc0JBQUMsQUFBQyxBQUFDLEdBQUMsQUFBQyxBQUFDLEdBQUMsQUFBSyxBQUFFLEFBQUM7QUFDN0I7QUFFRCxBQUFNLFdBQUMsQUFBUyxVQUFDLEFBQWEsZUFBRSxBQUFlLEFBQUMsQUFBQyxBQUNuRDtBQUFDO0FBRUQsQUFBSyxNQUFDLEFBQU0sT0FBQyxBQUFvQyxBQUFDLEFBQUM7QUFFbkQsQUFBSSxLQUFDLEFBQU8sU0FBRTtBQUNaLFFBQUksQUFBSyxRQUFHLEFBQUUsQUFBQztBQUNmLEFBQVksaUJBQUMsQUFBSyxPQUFFLENBQUMsQ0FBQyxBQUFjLGdCQUFFLENBQUMsQUFBQyxHQUFF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LENBQUMsQUFBQyxBQUFDLEFBQUMsQUFBQyxBQUFDLEFBQUMsQUFDeEU7QUFBQyxBQUFDLEFBQUM7QUFFSCxBQUFJLEtBQUMsQUFBcUMsdUNBQUU7QUFDMUMsUUFBSSxBQUFLLFFBQUcsQUFBaUMsQUFBQztBQUM5QyxBQUFZLGlCQUFDLEFBQUssT0FBRSxDQUNsQixDQUFDLEFBQWMsZ0JBQUUsQ0FBQyxBQUFDLEdBQUUsQUFBRSxBQUFDLEFBQUMsTUFDekIsQ0FBQyxBQUFhLGVBQUUsQ0FBQyxBQUFDLEdBQUUsQUFBQyxHQUFFLEFBQUMsR0FBRSxBQUFFLEFBQUMsQUFBQyxNQUM5QixDQUFDLEFBQWMsZ0JBQUUsQ0FBQyxBQUFDLEdBQUUsQUFBQyxBQUFDLEFBQUMsS0FDeEIsQ0FBQyxBQUFZLGNBQUUsQ0FBQyxBQUFDLEFBQUMsQUFBQyxBQUNwQixBQUFDLEFBQUMsQUFDTDtBQUFDLEFBQUMsQUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByZXByb2Nlc3MgfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuaW1wb3J0IHsgVGVtcGxhdGVWaXNpdG9yIH0gZnJvbSAnQGdsaW1tZXIvY29tcGlsZXInO1xuXG5jb25zdCB7IHRlc3QsIGFzc2VydCB9ID0gUVVuaXQ7XG5cbmZ1bmN0aW9uIGFjdGlvbnNFcXVhbChpbnB1dDogc3RyaW5nLCBleHBlY3RlZEFjdGlvbnM6IGFueVtdKSB7XG4gIGxldCBhc3QgPSBwcmVwcm9jZXNzKGlucHV0KTtcblxuICBsZXQgdGVtcGxhdGVWaXNpdG9yID0gbmV3IFRlbXBsYXRlVmlzaXRvcigpO1xuICB0ZW1wbGF0ZVZpc2l0b3IudmlzaXQoYXN0KTtcbiAgbGV0IGFjdHVhbEFjdGlvbnMgPSB0ZW1wbGF0ZVZpc2l0b3IuYWN0aW9ucztcblxuICAvLyBSZW1vdmUgdGhlIEFTVCBub2RlIHJlZmVyZW5jZSBmcm9tIHRoZSBhY3Rpb25zIHRvIGtlZXAgdGVzdHMgbGVhbmVyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsQWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGFjdHVhbEFjdGlvbnNbaV1bMV0uc2hpZnQoKTtcbiAgfVxuXG4gIGFzc2VydC5kZWVwRXF1YWwoYWN0dWFsQWN0aW9ucywgZXhwZWN0ZWRBY3Rpb25zKTtcbn1cblxuUVVuaXQubW9kdWxlKCdbZ2xpbW1lci1jb21waWxlcl0gVGVtcGxhdGVWaXNpdG9yJyk7XG5cbnRlc3QoJ2VtcHR5JywgZnVuY3Rpb24oKSB7XG4gIGxldCBpbnB1dCA9ICcnO1xuICBhY3Rpb25zRXF1YWwoaW5wdXQsIFtbJ3N0YXJ0UHJvZ3JhbScsIFswLCBbXV1dLCBbJ2VuZFByb2dyYW0nLCBbMF1dXSk7XG59KTtcblxudGVzdCgnYmFzaWMnLCBmdW5jdGlvbigpIHtcbiAgbGV0IGlucHV0ID0gJ2Zvb3t7YmFyfX08ZGl2PjwvZGl2Pic7XG4gIGFjdGlvbnNFcXVhbChpbnB1dCwgW1xuICAgIFsnc3RhcnRQcm9ncmFtJywgWzAsIFtdXV0sXG4gICAgWyd0ZXh0JywgWzAsIDNdXSxcbiAgICBbJ211c3RhY2hlJywgWzEsIDNdXSxcbiAgICBbJ29wZW5FbGVtZW50JywgWzIsIDMsIDAsIFtdXV0sXG4gICAgWydjbG9zZUVsZW1lbnQnLCBbMiwgM11dLFxuICAgIFsnZW5kUHJvZ3JhbScsIFswXV0sXG4gIF0pO1xufSk7XG5cbnRlc3QoJ25lc3RlZCBIVE1MJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpbnB1dCA9ICc8YT48L2E+PGE+PGE+PGE+PC9hPjwvYT48L2E+JztcbiAgYWN0aW9uc0VxdWFsKGlucHV0LCBbXG4gICAgWydzdGFydFByb2dyYW0nLCBbMCwgW11dXSxcbiAgICBbJ29wZW5FbGVtZW50JywgWzAsIDIsIDAsIFtdXV0sXG4gICAgWydjbG9zZUVsZW1lbnQnLCBbMCwgMl1dLFxuICAgIFsnb3BlbkVsZW1lbnQnLCBbMSwgMiwgMCwgW11dXSxcbiAgICBbJ29wZW5FbGVtZW50JywgWzAsIDEsIDAsIFtdXV0sXG4gICAgWydvcGVuRWxlbWVudCcsIFswLCAxLCAwLCBbXV1dLFxuICAgIFsnY2xvc2VFbGVtZW50JywgWzAsIDFdXSxcbiAgICBbJ2Nsb3NlRWxlbWVudCcsIFswLCAxXV0sXG4gICAgWydjbG9zZUVsZW1lbnQnLCBbMSwgMl1dLFxuICAgIFsnZW5kUHJvZ3JhbScsIFswXV0sXG4gIF0pO1xufSk7XG5cbnRlc3QoJ211c3RhY2hlcyBhcmUgY291bnRlZCBjb3JyZWN0bHknLCBmdW5jdGlvbigpIHtcbiAgbGV0IGlucHV0ID0gJzxhPjxhPnt7Zm9vfX08L2E+PGEge3tmb299fT48YT57e2Zvb319PC9hPjxhPnt7Zm9vfX08L2E+PC9hPjwvYT4nO1xuICBhY3Rpb25zRXF1YWwoaW5wdXQsIFtcbiAgICBbJ3N0YXJ0UHJvZ3JhbScsIFswLCBbXV1dLFxuICAgIFsnb3BlbkVsZW1lbnQnLCBbMCwgMSwgMiwgW11dXSxcbiAgICBbJ29wZW5FbGVtZW50JywgWzAsIDIsIDEsIFtdXV0sXG4gICAgWydtdXN0YWNoZScsIFswLCAxXV0sXG4gICAgWydjbG9zZUVsZW1lbnQnLCBbMCwgMl1dLFxuICAgIFsnb3BlbkVsZW1lbnQnLCBbMSwgMiwgMywgW11dXSxcbiAgICBbJ29wZW5FbGVtZW50JywgWzAsIDIsIDEsIFtdXV0sXG4gICAgWydtdXN0YWNoZScsIFswLCAxXV0sXG4gICAgWydjbG9zZUVsZW1lbnQnLCBbMCwgMl1dLFxuICAgIFsnb3BlbkVsZW1lbnQnLCBbMSwgMiwgMSwgW11dXSxcbiAgICBbJ211c3RhY2hlJywgWzAsIDFdXSxcbiAgICBbJ2Nsb3NlRWxlbWVudCcsIFsxLCAyXV0sXG4gICAgWydjbG9zZUVsZW1lbnQnLCBbMSwgMl1dLFxuICAgIFsnY2xvc2VFbGVtZW50JywgWzAsIDFdXSxcbiAgICBbJ2VuZFByb2dyYW0nLCBbMF1dLFxuICBdKTtcbn0pO1xuXG50ZXN0KCdlbXB0eSBibG9jaycsIGZ1bmN0aW9uKCkge1xuICBsZXQgaW5wdXQgPSAne3sjYX19e3svYX19JztcbiAgYWN0aW9uc0VxdWFsKGlucHV0LCBbXG4gICAgWydzdGFydEJsb2NrJywgWzAsIFtdXV0sXG4gICAgWydlbmRCbG9jaycsIFsxXV0sXG4gICAgWydzdGFydFByb2dyYW0nLCBbMSwgW11dXSxcbiAgICBbJ2Jsb2NrJywgWzAsIDFdXSxcbiAgICBbJ2VuZFByb2dyYW0nLCBbMF1dLFxuICBdKTtcbn0pO1xuXG50ZXN0KCdibG9jayB3aXRoIGludmVyc2UnLCBmdW5jdGlvbigpIHtcbiAgbGV0IGlucHV0ID0gJ3t7I2F9fWJ7e159fXt7L2F9fSc7XG4gIGFjdGlvbnNFcXVhbChpbnB1dCwgW1xuICAgIFsnc3RhcnRCbG9jaycsIFswLCBbXV1dLFxuICAgIFsnZW5kQmxvY2snLCBbMV1dLFxuICAgIFsnc3RhcnRCbG9jaycsIFswLCBbXV1dLFxuICAgIFsndGV4dCcsIFswLCAxXV0sXG4gICAgWydlbmRCbG9jaycsIFsxXV0sXG4gICAgWydzdGFydFByb2dyYW0nLCBbMiwgW11dXSxcbiAgICBbJ2Jsb2NrJywgWzAsIDFdXSxcbiAgICBbJ2VuZFByb2dyYW0nLCBbMF1dLFxuICBdKTtcbn0pO1xuXG50ZXN0KCduZXN0ZWQgYmxvY2tzJywgZnVuY3Rpb24oKSB7XG4gIGxldCBpbnB1dCA9ICd7eyNhfX17eyNhfX08Yj48L2I+e3svYX19e3sjYX19e3tifX17ey9hfX17ey9hfX17eyNhfX1ie3svYX19JztcbiAgYWN0aW9uc0VxdWFsKGlucHV0LCBbXG4gICAgWydzdGFydEJsb2NrJywgWzAsIFtdXV0sXG4gICAgWyd0ZXh0JywgWzAsIDFdXSxcbiAgICBbJ2VuZEJsb2NrJywgWzFdXSxcbiAgICBbJ3N0YXJ0QmxvY2snLCBbMCwgW11dXSxcbiAgICBbJ211c3RhY2hlJywgWzAsIDFdXSxcbiAgICBbJ2VuZEJsb2NrJywgWzJdXSxcbiAgICBbJ3N0YXJ0QmxvY2snLCBbMCwgW11dXSxcbiAgICBbJ29wZW5FbGVtZW50JywgWzAsIDEsIDAsIFtdXV0sXG4gICAgWydjbG9zZUVsZW1lbnQnLCBbMCwgMV1dLFxuICAgIFsnZW5kQmxvY2snLCBbMl1dLFxuICAgIFsnc3RhcnRCbG9jaycsIFsyLCBbXV1dLFxuICAgIFsnYmxvY2snLCBbMCwgMl1dLFxuICAgIFsnYmxvY2snLCBbMSwgMl1dLFxuICAgIFsnZW5kQmxvY2snLCBbMV1dLFxuICAgIFsnc3RhcnRQcm9ncmFtJywgWzIsIFtdXV0sXG4gICAgWydibG9jaycsIFswLCAyXV0sXG4gICAgWydibG9jaycsIFsxLCAyXV0sXG4gICAgWydlbmRQcm9ncmFtJywgWzBdXSxcbiAgXSk7XG59KTtcblxudGVzdCgnY29tbWVudCcsIGZ1bmN0aW9uKCkge1xuICBsZXQgaW5wdXQgPSAnPCEtLSBzb21lIGNvbW1lbnQgLS0+JztcbiAgYWN0aW9uc0VxdWFsKGlucHV0LCBbWydzdGFydFByb2dyYW0nLCBbMCwgW11dXSwgWydjb21tZW50JywgWzAsIDFdXSwgWydlbmRQcm9ncmFtJywgWzBdXV0pO1xufSk7XG5cbnRlc3QoJ2hhbmRsZWJhcnMgY29tbWVudCcsIGZ1bmN0aW9uKCkge1xuICBsZXQgaW5wdXQgPSAne3shIHNvbWUgY29tbWVudCB9fSc7XG4gIGFjdGlvbnNFcXVhbChpbnB1dCwgW1snc3RhcnRQcm9ncmFtJywgWzAsIFtdXV0sIFsnZW5kUHJvZ3JhbScsIFswXV1dKTtcbn0pO1xuXG50ZXN0KCdoYW5kbGViYXJzIGNvbW1lbnQgaW4gZWxlbWVudCBzcGFjZScsIGZ1bmN0aW9uKCkge1xuICBsZXQgaW5wdXQgPSAnPGRpdiB7eyEgc29tZSBjb21tZW50IH19PjwvZGl2Pic7XG4gIGFjdGlvbnNFcXVhbChpbnB1dCwgW1xuICAgIFsnc3RhcnRQcm9ncmFtJywgWzAsIFtdXV0sXG4gICAgWydvcGVuRWxlbWVudCcsIFswLCAxLCAwLCBbXV1dLFxuICAgIFsnY2xvc2VFbGVtZW50JywgWzAsIDFdXSxcbiAgICBbJ2VuZFByb2dyYW0nLCBbMF1dLFxuICBdKTtcbn0pO1xuIl19