2017-06-07 06:33:46 +00:00
|
|
|
|
# We usually do not check the actual JS output from the compiler, but since
|
|
|
|
|
# JSX is not natively supported by Node, we do it in this case.
|
|
|
|
|
|
|
|
|
|
test 'self closing', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div />
|
|
|
|
|
''', '''
|
|
|
|
|
<div />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'self closing formatting', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div/>
|
|
|
|
|
''', '''
|
|
|
|
|
<div />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'self closing multiline', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div
|
|
|
|
|
/>
|
|
|
|
|
''', '''
|
|
|
|
|
<div />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'regex attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div x={/>asds/} />
|
|
|
|
|
''', '''
|
|
|
|
|
<div x={/>asds/} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'string attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div x="a" />
|
|
|
|
|
''', '''
|
|
|
|
|
<div x="a" />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'simple attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div x={42} />
|
|
|
|
|
''', '''
|
|
|
|
|
<div x={42} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'assignment attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div x={y = 42} />
|
|
|
|
|
''', '''
|
|
|
|
|
var y;
|
|
|
|
|
|
|
|
|
|
<div x={y = 42} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'object attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div x={{y: 42}} />
|
|
|
|
|
''', '''
|
|
|
|
|
<div x={{
|
|
|
|
|
y: 42
|
|
|
|
|
}} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'attribute without value', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div checked x="hello" />
|
|
|
|
|
''', '''
|
|
|
|
|
<div checked x="hello" />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'paired', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div></div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div></div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'simple content', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div>Hello world</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div>Hello world</div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'content interpolation', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div>Hello {42}</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div>Hello {42}</div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'nested tag', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div><span /></div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div><span /></div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag inside interpolation formatting', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div>Hello {<span />}</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div>Hello <span /></div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag inside interpolation, tags are callable', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div>Hello {<span /> x}</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div>Hello {<span />(x)}</div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tags inside interpolation, tags trigger implicit calls', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div>Hello {f <span />}</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div>Hello {f(<span />)}</div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'regex in interpolation', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div x={/>asds/}><div />{/>asdsad</}</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div x={/>asds/}><div />{/>asdsad</}</div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'interpolation in string attribute value', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div x="Hello #{world}" />
|
|
|
|
|
''', '''
|
|
|
|
|
<div x={`Hello ${world}`} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
# Unlike in `coffee-react-transform`.
|
|
|
|
|
test 'bare numbers not allowed', ->
|
|
|
|
|
throws -> CoffeeScript.compile '<div x=3 />'
|
|
|
|
|
|
|
|
|
|
test 'bare expressions not allowed', ->
|
|
|
|
|
throws -> CoffeeScript.compile '<div x=y />'
|
|
|
|
|
|
|
|
|
|
test 'bare complex expressions not allowed', ->
|
|
|
|
|
throws -> CoffeeScript.compile '<div x=f(3) />'
|
|
|
|
|
|
|
|
|
|
test 'unescaped opening tag angle bracket disallowed', ->
|
|
|
|
|
throws -> CoffeeScript.compile '<Person><<</Person>'
|
|
|
|
|
|
|
|
|
|
test 'space around equal sign', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div popular = "yes" />
|
|
|
|
|
''', '''
|
|
|
|
|
<div popular="yes" />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
# The following tests were adopted from James Friend’s
|
|
|
|
|
# [https://github.com/jsdf/coffee-react-transform](https://github.com/jsdf/coffee-react-transform).
|
|
|
|
|
|
|
|
|
|
test 'ambiguous tag-like expression', ->
|
|
|
|
|
throws -> CoffeeScript.compile 'x = a <b > c'
|
|
|
|
|
|
|
|
|
|
test 'ambiguous tag', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
a <b > c </b>
|
|
|
|
|
''', '''
|
|
|
|
|
a(<b> c </b>);
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'escaped CoffeeScript attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person name={if test() then 'yes' else 'no'} />
|
|
|
|
|
''', '''
|
|
|
|
|
<Person name={test() ? 'yes' : 'no'} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'escaped CoffeeScript attribute over multiple lines', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person name={
|
|
|
|
|
if test()
|
|
|
|
|
'yes'
|
|
|
|
|
else
|
|
|
|
|
'no'
|
|
|
|
|
} />
|
|
|
|
|
''', '''
|
|
|
|
|
<Person name={test() ? 'yes' : 'no'} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'multiple line escaped CoffeeScript with nested CSX', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person name={
|
|
|
|
|
if test()
|
|
|
|
|
'yes'
|
|
|
|
|
else
|
|
|
|
|
'no'
|
|
|
|
|
}>
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
for n in a
|
|
|
|
|
<div> a
|
|
|
|
|
asf
|
|
|
|
|
<li xy={"as"}>{ n+1 }<a /> <a /> </li>
|
|
|
|
|
</div>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</Person>
|
|
|
|
|
''', '''
|
|
|
|
|
var n;
|
|
|
|
|
|
|
|
|
|
<Person name={test() ? 'yes' : 'no'}>
|
|
|
|
|
{(function() {
|
|
|
|
|
var i, len, results;
|
|
|
|
|
results = [];
|
|
|
|
|
for (i = 0, len = a.length; i < len; i++) {
|
|
|
|
|
n = a[i];
|
|
|
|
|
results.push(<div> a
|
|
|
|
|
asf
|
|
|
|
|
<li xy={"as"}>{n + 1}<a /> <a /> </li>
|
|
|
|
|
</div>);
|
|
|
|
|
}
|
|
|
|
|
return results;
|
|
|
|
|
})()}
|
|
|
|
|
|
|
|
|
|
</Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'nested CSX within an attribute, with object attr value', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Company>
|
|
|
|
|
<Person name={<NameComponent attr3={ {'a': {}, b: '{'} } />} />
|
|
|
|
|
</Company>
|
|
|
|
|
''', '''
|
|
|
|
|
<Company>
|
|
|
|
|
<Person name={<NameComponent attr3={{
|
|
|
|
|
'a': {},
|
|
|
|
|
b: '{'
|
|
|
|
|
}} />} />
|
|
|
|
|
</Company>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'complex nesting', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div code={someFunc({a:{b:{}, C:'}{}{'}})} />
|
|
|
|
|
''', '''
|
|
|
|
|
<div code={someFunc({
|
|
|
|
|
a: {
|
|
|
|
|
b: {},
|
|
|
|
|
C: '}{}{'
|
|
|
|
|
}
|
|
|
|
|
})} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'multiline tag with nested CSX within an attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person
|
|
|
|
|
name={
|
|
|
|
|
name = formatName(user.name)
|
|
|
|
|
<NameComponent name={name.toUppercase()} />
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
blah blah blah
|
|
|
|
|
</Person>
|
|
|
|
|
''', '''
|
|
|
|
|
var name;
|
|
|
|
|
|
|
|
|
|
<Person name={name = formatName(user.name), <NameComponent name={name.toUppercase()} />}>
|
|
|
|
|
blah blah blah
|
|
|
|
|
</Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'escaped CoffeeScript with nested object literals', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person>
|
|
|
|
|
blah blah blah {
|
|
|
|
|
{'a' : {}, 'asd': 'asd'}
|
|
|
|
|
}
|
|
|
|
|
</Person>
|
|
|
|
|
''', '''
|
|
|
|
|
<Person>
|
|
|
|
|
blah blah blah {{
|
|
|
|
|
'a': {},
|
|
|
|
|
'asd': 'asd'
|
|
|
|
|
}}
|
|
|
|
|
</Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'multiline tag attributes with escaped CoffeeScript', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person name={if isActive() then 'active' else 'inactive'}
|
|
|
|
|
someattr='on new line' />
|
|
|
|
|
''', '''
|
|
|
|
|
<Person name={isActive() ? 'active' : 'inactive'} someattr='on new line' />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'lots of attributes', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person eyes={2} friends={getFriends()} popular = "yes"
|
|
|
|
|
active={ if isActive() then 'active' else 'inactive' } data-attr='works' checked check={me_out}
|
|
|
|
|
/>
|
|
|
|
|
''', '''
|
|
|
|
|
<Person eyes={2} friends={getFriends()} popular="yes" active={isActive() ? 'active' : 'inactive'} data-attr='works' checked check={me_out} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
# TODO: fix partially indented CSX
|
|
|
|
|
# test 'multiline elements', ->
|
|
|
|
|
# eqJS '''
|
|
|
|
|
# <div something={
|
|
|
|
|
# do ->
|
|
|
|
|
# test = /432/gm # this is a regex
|
|
|
|
|
# 6 /432/gm # this is division
|
|
|
|
|
# }
|
|
|
|
|
# >
|
|
|
|
|
# <div>
|
|
|
|
|
# <div>
|
|
|
|
|
# <div>
|
|
|
|
|
# <article name={ new Date() } number={203}
|
|
|
|
|
# range={getRange()}
|
|
|
|
|
# >
|
|
|
|
|
# </article>
|
|
|
|
|
# </div>
|
|
|
|
|
# </div>
|
|
|
|
|
# </div>
|
|
|
|
|
# </div>
|
|
|
|
|
# ''', '''
|
|
|
|
|
# bla
|
|
|
|
|
# '''
|
|
|
|
|
|
|
|
|
|
test 'complex regex', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person />
|
|
|
|
|
/\\/\\/<Person \\/>\\>\\//
|
|
|
|
|
''', '''
|
|
|
|
|
<Person />;
|
|
|
|
|
|
|
|
|
|
/\\/\\/<Person \\/>\\>\\//;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'heregex', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
test = /432/gm # this is a regex
|
|
|
|
|
6 /432/gm # this is division
|
|
|
|
|
<Tag>
|
|
|
|
|
{test = /<Tag>/} this is a regex containing something which looks like a tag
|
|
|
|
|
</Tag>
|
|
|
|
|
<Person />
|
|
|
|
|
REGEX = /// ^
|
|
|
|
|
(/ (?! [\s=] ) # comment comment <comment>comment</comment>
|
|
|
|
|
[^ [ / \n \\ ]* # comment comment
|
|
|
|
|
(?:
|
|
|
|
|
<Tag />
|
|
|
|
|
(?: \\[\s\S] # comment comment
|
|
|
|
|
| \[ # comment comment
|
|
|
|
|
[^ \] \n \\ ]*
|
|
|
|
|
(?: \\[\s\S] [^ \] \n \\ ]* )*
|
|
|
|
|
<Tag>tag</Tag>
|
|
|
|
|
]
|
|
|
|
|
) [^ [ / \n \\ ]*
|
|
|
|
|
)*
|
|
|
|
|
/) ([imgy]{0,4}) (?!\w)
|
|
|
|
|
///
|
|
|
|
|
<Person />
|
|
|
|
|
''', '''
|
|
|
|
|
var REGEX, test;
|
|
|
|
|
|
[CS2] Comments (#4572)
* Make `addLocationDataFn` more DRY
* Style fixes
* Provide access to full parser inside our custom function running in parser.js; rename the function to lay the groundwork for adding data aside from location data
* Fix style.
* Fix style.
* Label test comments
* Update grammar to remove comment tokens; update DSL to call new helper function that preserves comments through parsing
* New implementation of compiling block comments: the lexer pulls them out of the token stream, attaching them as a property to a token; the rewriter moves the attachment around so it lives on a token that is destined to make it through to compilation (and in a good placement); and the nodes render the block comment. All tests but one pass (commented out).
* If a comment follows a class declaration, move the comment inside the class body
* Style
* Improve indentation of multiline comments
* Fix indentation for block comments, at least in the cases covered by the one failing test
* Don’t reverse the order of unshifted comments
* Simplify rewriter’s handling of comments, generalizing the special case
* Expand the list of tokens we need to avoid for passing comments through the parser; get some literal tokens to have nodes created for them so that the comments pass through
* Improve comments; fix multiline flag
* Prepare HereComments for processing line comments
* Line comments, first draft: the tests pass, but the line comments aren’t indented and sometimes trail previous lines when they shouldn’t; updated compiler output in following commit
* Updated compiler, now with line comments
* `process` doesn’t exist in the browser, so we should check for its existence first
* Update parser output
* Test that proves #4290 is fixed
* Indent line comments, first pass
* Compiled output with indented line comments
* Comments that start a new line shouldn’t trail; don’t skip comments attached to generated tokens; stop looking for indentation once we hit a newline
* Revised output
* Cleanup
* Split “multiline” line comment tokens, shifting them forward or back as appropriate
* Fix comments in module specifiers
* Abstract attaching comments to a node
* Line comments in interpolated strings
* Line comments can’t be multiline anymore
* Improve handling of blank lines and indentation of following comments that start a new line (i.e. don’t trail)
* Make comments compilation more object-oriented
* Remove lots of dead code that we don’t need anymore because a comment is never a node, only a fragment
* Improve eqJS helper
* Fix #4290 definitively, with improved output for arrays with interspersed block comments
* Add support for line comments output interspersed within arrays
* Fix mistake, don’t lose the variable we’re working on
* Remove redundant replacements
* Check for indentation only from the start of the string
* Indentations in generated JS are always multiples of two spaces (never tabs) so just look for 2+ spaces
* Update package versions; run Babel twice, once for each preset, temporarily until a Babili bug is fixed that prevents it from running with the env preset
* Don’t rely on `fragment.type`, which can break when the compiler is minified
* Updated generated docs and browser compiler
* Output block comments after function arguments
* Comments appear above scope `var` declarations; better tracking of generated `JS` tokens created only to shepherd comments through to the output
* Create new FuncGlyph node, to hold comments we want to output near the function parameters
* Block comments between `)` and `->`/`=>` get output between `)` and `{`.
* Fix indentation of comments that are the first line inside a bare mode block
* Updated output
* Full Flow example
* Updated browser compiler
* Abstract and organize comment fragment generation code; store more properties on the comment fragment objects; make `throw` behave like `return`
* Abstract token insertion code
* Add missing locationData to STRING_START token, giving it the locationData of the overall StringWithInterpolations token so that comments attached to STRING_START end up on the StringWithInterpolations node
* Allow `SUPER` tokens to carry comments
* Rescue comments from `Existence` nodes and `If` nodes’ conditions
* Rescue comments after `\` line continuation tokens
* Updated compiled output
* Updated browser compiler
* Output block comments in the same `compileFragments` method as line comments, except for inline block comments
* Comments before splice
* Updated browser compiler
* Track compiledComments as a property of Base, to ensure that it’s not a global variable
* Docs: split up the Usage section
* Docs for type annotations via Flow; updated docs output
* Update regular comments documentation
* Updated browser compiler
* Comments before soak
* Comments before static methods, and probably before `@variable =` (this) assignments generally
* Comments before ‘if exists?’, refactor comment before ‘if this.var’ to be more precise, improve helper methods
* Comments before a method that contains ‘super()’ should output above the method property, not above the ‘super.method()’ call
* Fix missing comments before `if not` (i.e. before a UNARY token)
* Fix comments before ‘for’; add test for comment before assignment if (fixed in earlier commit)
* Comments within heregexes
* Updated browser compiler
* Update description to reflect what’s now happening in compileCommentFragments
* Preserve blank lines between line comments; output “whitespace-only” line comments as blank lines, rather than `//` following by whitespace
* Better future-proof comments tests
* Comments before object destructuring; abstract method for setting comments aside before compilation
* Handle more cases of comments before or after `for` loop declaration lines
* Fix indentation of comments preceding `for` loops
* Fix comment before splat function parameter
* Catch another RegexWithInterpolations comment edge case
* Updated browser compiler
* Change heregex example to one that’s more readable; update output
* Remove a few last references to the defunct HERECOMMENT token
* Abstract location hash creation into a function
* Improved clarity per code review notes
* Updated browser compiler
2017-08-03 02:34:34 +00:00
|
|
|
|
test = /432/gm; // this is a regex
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
[CS2] Comments (#4572)
* Make `addLocationDataFn` more DRY
* Style fixes
* Provide access to full parser inside our custom function running in parser.js; rename the function to lay the groundwork for adding data aside from location data
* Fix style.
* Fix style.
* Label test comments
* Update grammar to remove comment tokens; update DSL to call new helper function that preserves comments through parsing
* New implementation of compiling block comments: the lexer pulls them out of the token stream, attaching them as a property to a token; the rewriter moves the attachment around so it lives on a token that is destined to make it through to compilation (and in a good placement); and the nodes render the block comment. All tests but one pass (commented out).
* If a comment follows a class declaration, move the comment inside the class body
* Style
* Improve indentation of multiline comments
* Fix indentation for block comments, at least in the cases covered by the one failing test
* Don’t reverse the order of unshifted comments
* Simplify rewriter’s handling of comments, generalizing the special case
* Expand the list of tokens we need to avoid for passing comments through the parser; get some literal tokens to have nodes created for them so that the comments pass through
* Improve comments; fix multiline flag
* Prepare HereComments for processing line comments
* Line comments, first draft: the tests pass, but the line comments aren’t indented and sometimes trail previous lines when they shouldn’t; updated compiler output in following commit
* Updated compiler, now with line comments
* `process` doesn’t exist in the browser, so we should check for its existence first
* Update parser output
* Test that proves #4290 is fixed
* Indent line comments, first pass
* Compiled output with indented line comments
* Comments that start a new line shouldn’t trail; don’t skip comments attached to generated tokens; stop looking for indentation once we hit a newline
* Revised output
* Cleanup
* Split “multiline” line comment tokens, shifting them forward or back as appropriate
* Fix comments in module specifiers
* Abstract attaching comments to a node
* Line comments in interpolated strings
* Line comments can’t be multiline anymore
* Improve handling of blank lines and indentation of following comments that start a new line (i.e. don’t trail)
* Make comments compilation more object-oriented
* Remove lots of dead code that we don’t need anymore because a comment is never a node, only a fragment
* Improve eqJS helper
* Fix #4290 definitively, with improved output for arrays with interspersed block comments
* Add support for line comments output interspersed within arrays
* Fix mistake, don’t lose the variable we’re working on
* Remove redundant replacements
* Check for indentation only from the start of the string
* Indentations in generated JS are always multiples of two spaces (never tabs) so just look for 2+ spaces
* Update package versions; run Babel twice, once for each preset, temporarily until a Babili bug is fixed that prevents it from running with the env preset
* Don’t rely on `fragment.type`, which can break when the compiler is minified
* Updated generated docs and browser compiler
* Output block comments after function arguments
* Comments appear above scope `var` declarations; better tracking of generated `JS` tokens created only to shepherd comments through to the output
* Create new FuncGlyph node, to hold comments we want to output near the function parameters
* Block comments between `)` and `->`/`=>` get output between `)` and `{`.
* Fix indentation of comments that are the first line inside a bare mode block
* Updated output
* Full Flow example
* Updated browser compiler
* Abstract and organize comment fragment generation code; store more properties on the comment fragment objects; make `throw` behave like `return`
* Abstract token insertion code
* Add missing locationData to STRING_START token, giving it the locationData of the overall StringWithInterpolations token so that comments attached to STRING_START end up on the StringWithInterpolations node
* Allow `SUPER` tokens to carry comments
* Rescue comments from `Existence` nodes and `If` nodes’ conditions
* Rescue comments after `\` line continuation tokens
* Updated compiled output
* Updated browser compiler
* Output block comments in the same `compileFragments` method as line comments, except for inline block comments
* Comments before splice
* Updated browser compiler
* Track compiledComments as a property of Base, to ensure that it’s not a global variable
* Docs: split up the Usage section
* Docs for type annotations via Flow; updated docs output
* Update regular comments documentation
* Updated browser compiler
* Comments before soak
* Comments before static methods, and probably before `@variable =` (this) assignments generally
* Comments before ‘if exists?’, refactor comment before ‘if this.var’ to be more precise, improve helper methods
* Comments before a method that contains ‘super()’ should output above the method property, not above the ‘super.method()’ call
* Fix missing comments before `if not` (i.e. before a UNARY token)
* Fix comments before ‘for’; add test for comment before assignment if (fixed in earlier commit)
* Comments within heregexes
* Updated browser compiler
* Update description to reflect what’s now happening in compileCommentFragments
* Preserve blank lines between line comments; output “whitespace-only” line comments as blank lines, rather than `//` following by whitespace
* Better future-proof comments tests
* Comments before object destructuring; abstract method for setting comments aside before compilation
* Handle more cases of comments before or after `for` loop declaration lines
* Fix indentation of comments preceding `for` loops
* Fix comment before splat function parameter
* Catch another RegexWithInterpolations comment edge case
* Updated browser compiler
* Change heregex example to one that’s more readable; update output
* Remove a few last references to the defunct HERECOMMENT token
* Abstract location hash creation into a function
* Improved clarity per code review notes
* Updated browser compiler
2017-08-03 02:34:34 +00:00
|
|
|
|
6 / 432 / gm; // this is division
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
|
|
|
|
<Tag>
|
|
|
|
|
{(test = /<Tag>/)} this is a regex containing something which looks like a tag
|
|
|
|
|
</Tag>;
|
|
|
|
|
|
|
|
|
|
<Person />;
|
|
|
|
|
|
[CS2] Comments (#4572)
* Make `addLocationDataFn` more DRY
* Style fixes
* Provide access to full parser inside our custom function running in parser.js; rename the function to lay the groundwork for adding data aside from location data
* Fix style.
* Fix style.
* Label test comments
* Update grammar to remove comment tokens; update DSL to call new helper function that preserves comments through parsing
* New implementation of compiling block comments: the lexer pulls them out of the token stream, attaching them as a property to a token; the rewriter moves the attachment around so it lives on a token that is destined to make it through to compilation (and in a good placement); and the nodes render the block comment. All tests but one pass (commented out).
* If a comment follows a class declaration, move the comment inside the class body
* Style
* Improve indentation of multiline comments
* Fix indentation for block comments, at least in the cases covered by the one failing test
* Don’t reverse the order of unshifted comments
* Simplify rewriter’s handling of comments, generalizing the special case
* Expand the list of tokens we need to avoid for passing comments through the parser; get some literal tokens to have nodes created for them so that the comments pass through
* Improve comments; fix multiline flag
* Prepare HereComments for processing line comments
* Line comments, first draft: the tests pass, but the line comments aren’t indented and sometimes trail previous lines when they shouldn’t; updated compiler output in following commit
* Updated compiler, now with line comments
* `process` doesn’t exist in the browser, so we should check for its existence first
* Update parser output
* Test that proves #4290 is fixed
* Indent line comments, first pass
* Compiled output with indented line comments
* Comments that start a new line shouldn’t trail; don’t skip comments attached to generated tokens; stop looking for indentation once we hit a newline
* Revised output
* Cleanup
* Split “multiline” line comment tokens, shifting them forward or back as appropriate
* Fix comments in module specifiers
* Abstract attaching comments to a node
* Line comments in interpolated strings
* Line comments can’t be multiline anymore
* Improve handling of blank lines and indentation of following comments that start a new line (i.e. don’t trail)
* Make comments compilation more object-oriented
* Remove lots of dead code that we don’t need anymore because a comment is never a node, only a fragment
* Improve eqJS helper
* Fix #4290 definitively, with improved output for arrays with interspersed block comments
* Add support for line comments output interspersed within arrays
* Fix mistake, don’t lose the variable we’re working on
* Remove redundant replacements
* Check for indentation only from the start of the string
* Indentations in generated JS are always multiples of two spaces (never tabs) so just look for 2+ spaces
* Update package versions; run Babel twice, once for each preset, temporarily until a Babili bug is fixed that prevents it from running with the env preset
* Don’t rely on `fragment.type`, which can break when the compiler is minified
* Updated generated docs and browser compiler
* Output block comments after function arguments
* Comments appear above scope `var` declarations; better tracking of generated `JS` tokens created only to shepherd comments through to the output
* Create new FuncGlyph node, to hold comments we want to output near the function parameters
* Block comments between `)` and `->`/`=>` get output between `)` and `{`.
* Fix indentation of comments that are the first line inside a bare mode block
* Updated output
* Full Flow example
* Updated browser compiler
* Abstract and organize comment fragment generation code; store more properties on the comment fragment objects; make `throw` behave like `return`
* Abstract token insertion code
* Add missing locationData to STRING_START token, giving it the locationData of the overall StringWithInterpolations token so that comments attached to STRING_START end up on the StringWithInterpolations node
* Allow `SUPER` tokens to carry comments
* Rescue comments from `Existence` nodes and `If` nodes’ conditions
* Rescue comments after `\` line continuation tokens
* Updated compiled output
* Updated browser compiler
* Output block comments in the same `compileFragments` method as line comments, except for inline block comments
* Comments before splice
* Updated browser compiler
* Track compiledComments as a property of Base, to ensure that it’s not a global variable
* Docs: split up the Usage section
* Docs for type annotations via Flow; updated docs output
* Update regular comments documentation
* Updated browser compiler
* Comments before soak
* Comments before static methods, and probably before `@variable =` (this) assignments generally
* Comments before ‘if exists?’, refactor comment before ‘if this.var’ to be more precise, improve helper methods
* Comments before a method that contains ‘super()’ should output above the method property, not above the ‘super.method()’ call
* Fix missing comments before `if not` (i.e. before a UNARY token)
* Fix comments before ‘for’; add test for comment before assignment if (fixed in earlier commit)
* Comments within heregexes
* Updated browser compiler
* Update description to reflect what’s now happening in compileCommentFragments
* Preserve blank lines between line comments; output “whitespace-only” line comments as blank lines, rather than `//` following by whitespace
* Better future-proof comments tests
* Comments before object destructuring; abstract method for setting comments aside before compilation
* Handle more cases of comments before or after `for` loop declaration lines
* Fix indentation of comments preceding `for` loops
* Fix comment before splat function parameter
* Catch another RegexWithInterpolations comment edge case
* Updated browser compiler
* Change heregex example to one that’s more readable; update output
* Remove a few last references to the defunct HERECOMMENT token
* Abstract location hash creation into a function
* Improved clarity per code review notes
* Updated browser compiler
2017-08-03 02:34:34 +00:00
|
|
|
|
REGEX = /^(\\/(?![s=])[^[\\/ ]*(?:<Tag\\/>(?:\\[sS]|[[^] ]*(?:\\[sS][^] ]*)*<Tag>tag<\\/Tag>])[^[\\/ ]*)*\\/)([imgy]{0,4})(?!w)/; // comment comment <comment>comment</comment>
|
|
|
|
|
// comment comment
|
|
|
|
|
// comment comment
|
|
|
|
|
// comment comment
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
|
|
|
|
<Person />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'comment within CSX is not treated as comment', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person>
|
|
|
|
|
# i am not a comment
|
|
|
|
|
</Person>
|
|
|
|
|
''', '''
|
|
|
|
|
<Person>
|
|
|
|
|
# i am not a comment
|
|
|
|
|
</Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'comment at start of CSX escape', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person>
|
|
|
|
|
{# i am a comment
|
|
|
|
|
"i am a string"
|
|
|
|
|
}
|
|
|
|
|
</Person>
|
|
|
|
|
''', '''
|
|
|
|
|
<Person>
|
[CS2] Comments (#4572)
* Make `addLocationDataFn` more DRY
* Style fixes
* Provide access to full parser inside our custom function running in parser.js; rename the function to lay the groundwork for adding data aside from location data
* Fix style.
* Fix style.
* Label test comments
* Update grammar to remove comment tokens; update DSL to call new helper function that preserves comments through parsing
* New implementation of compiling block comments: the lexer pulls them out of the token stream, attaching them as a property to a token; the rewriter moves the attachment around so it lives on a token that is destined to make it through to compilation (and in a good placement); and the nodes render the block comment. All tests but one pass (commented out).
* If a comment follows a class declaration, move the comment inside the class body
* Style
* Improve indentation of multiline comments
* Fix indentation for block comments, at least in the cases covered by the one failing test
* Don’t reverse the order of unshifted comments
* Simplify rewriter’s handling of comments, generalizing the special case
* Expand the list of tokens we need to avoid for passing comments through the parser; get some literal tokens to have nodes created for them so that the comments pass through
* Improve comments; fix multiline flag
* Prepare HereComments for processing line comments
* Line comments, first draft: the tests pass, but the line comments aren’t indented and sometimes trail previous lines when they shouldn’t; updated compiler output in following commit
* Updated compiler, now with line comments
* `process` doesn’t exist in the browser, so we should check for its existence first
* Update parser output
* Test that proves #4290 is fixed
* Indent line comments, first pass
* Compiled output with indented line comments
* Comments that start a new line shouldn’t trail; don’t skip comments attached to generated tokens; stop looking for indentation once we hit a newline
* Revised output
* Cleanup
* Split “multiline” line comment tokens, shifting them forward or back as appropriate
* Fix comments in module specifiers
* Abstract attaching comments to a node
* Line comments in interpolated strings
* Line comments can’t be multiline anymore
* Improve handling of blank lines and indentation of following comments that start a new line (i.e. don’t trail)
* Make comments compilation more object-oriented
* Remove lots of dead code that we don’t need anymore because a comment is never a node, only a fragment
* Improve eqJS helper
* Fix #4290 definitively, with improved output for arrays with interspersed block comments
* Add support for line comments output interspersed within arrays
* Fix mistake, don’t lose the variable we’re working on
* Remove redundant replacements
* Check for indentation only from the start of the string
* Indentations in generated JS are always multiples of two spaces (never tabs) so just look for 2+ spaces
* Update package versions; run Babel twice, once for each preset, temporarily until a Babili bug is fixed that prevents it from running with the env preset
* Don’t rely on `fragment.type`, which can break when the compiler is minified
* Updated generated docs and browser compiler
* Output block comments after function arguments
* Comments appear above scope `var` declarations; better tracking of generated `JS` tokens created only to shepherd comments through to the output
* Create new FuncGlyph node, to hold comments we want to output near the function parameters
* Block comments between `)` and `->`/`=>` get output between `)` and `{`.
* Fix indentation of comments that are the first line inside a bare mode block
* Updated output
* Full Flow example
* Updated browser compiler
* Abstract and organize comment fragment generation code; store more properties on the comment fragment objects; make `throw` behave like `return`
* Abstract token insertion code
* Add missing locationData to STRING_START token, giving it the locationData of the overall StringWithInterpolations token so that comments attached to STRING_START end up on the StringWithInterpolations node
* Allow `SUPER` tokens to carry comments
* Rescue comments from `Existence` nodes and `If` nodes’ conditions
* Rescue comments after `\` line continuation tokens
* Updated compiled output
* Updated browser compiler
* Output block comments in the same `compileFragments` method as line comments, except for inline block comments
* Comments before splice
* Updated browser compiler
* Track compiledComments as a property of Base, to ensure that it’s not a global variable
* Docs: split up the Usage section
* Docs for type annotations via Flow; updated docs output
* Update regular comments documentation
* Updated browser compiler
* Comments before soak
* Comments before static methods, and probably before `@variable =` (this) assignments generally
* Comments before ‘if exists?’, refactor comment before ‘if this.var’ to be more precise, improve helper methods
* Comments before a method that contains ‘super()’ should output above the method property, not above the ‘super.method()’ call
* Fix missing comments before `if not` (i.e. before a UNARY token)
* Fix comments before ‘for’; add test for comment before assignment if (fixed in earlier commit)
* Comments within heregexes
* Updated browser compiler
* Update description to reflect what’s now happening in compileCommentFragments
* Preserve blank lines between line comments; output “whitespace-only” line comments as blank lines, rather than `//` following by whitespace
* Better future-proof comments tests
* Comments before object destructuring; abstract method for setting comments aside before compilation
* Handle more cases of comments before or after `for` loop declaration lines
* Fix indentation of comments preceding `for` loops
* Fix comment before splat function parameter
* Catch another RegexWithInterpolations comment edge case
* Updated browser compiler
* Change heregex example to one that’s more readable; update output
* Remove a few last references to the defunct HERECOMMENT token
* Abstract location hash creation into a function
* Improved clarity per code review notes
* Updated browser compiler
2017-08-03 02:34:34 +00:00
|
|
|
|
{// i am a comment
|
|
|
|
|
"i am a string"}
|
|
|
|
|
</Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'comment at end of CSX escape', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person>
|
|
|
|
|
{"i am a string"
|
|
|
|
|
# i am a comment
|
|
|
|
|
}
|
|
|
|
|
</Person>
|
|
|
|
|
''', '''
|
|
|
|
|
<Person>
|
|
|
|
|
{"i am a string"
|
|
|
|
|
// i am a comment
|
|
|
|
|
}
|
2017-06-07 06:33:46 +00:00
|
|
|
|
</Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'CSX comment cannot be used inside interpolation', ->
|
|
|
|
|
throws -> CoffeeScript.compile '''
|
|
|
|
|
<Person>
|
|
|
|
|
{# i am a comment}
|
|
|
|
|
</Person>
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'comment syntax cannot be used inline', ->
|
|
|
|
|
throws -> CoffeeScript.compile '''
|
|
|
|
|
<Person>{#comment inline}</Person>
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'string within CSX is ignored', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person> "i am not a string" 'nor am i' </Person>
|
|
|
|
|
''', '''
|
|
|
|
|
<Person> "i am not a string" 'nor am i' </Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'special chars within CSX are ignored', ->
|
|
|
|
|
eqJS """
|
|
|
|
|
<Person> a,/';][' a\''@$%^&˚¬∑˜˚∆å∂¬˚*()*&^%$>> '"''"'''\'\'m' i </Person>
|
|
|
|
|
""", """
|
|
|
|
|
<Person> a,/';][' a''@$%^&˚¬∑˜˚∆å∂¬˚*()*&^%$>> '"''"'''''m' i </Person>;
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
test 'html entities (name, decimal, hex) within CSX', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person> &&&€ € €;; </Person>
|
|
|
|
|
''', '''
|
|
|
|
|
<Person> &&&€ € €;; </Person>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag with {{}}', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Person name={{value: item, key, item}} />
|
|
|
|
|
''', '''
|
|
|
|
|
<Person name={{
|
|
|
|
|
value: item,
|
|
|
|
|
key,
|
|
|
|
|
item
|
|
|
|
|
}} />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag with namespace', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Something.Tag></Something.Tag>
|
|
|
|
|
''', '''
|
|
|
|
|
<Something.Tag></Something.Tag>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag with lowercase namespace', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<something.tag></something.tag>
|
|
|
|
|
''', '''
|
|
|
|
|
<something.tag></something.tag>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'self closing tag with namespace', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Something.Tag />
|
|
|
|
|
''', '''
|
|
|
|
|
<Something.Tag />;
|
|
|
|
|
'''
|
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'self closing tag with spread attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component a={b} {x...} b="c" />
|
|
|
|
|
''', '''
|
|
|
|
|
<Component a={b} {...x} b="c" />;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'complex spread attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component {x...} a={b} {x...} b="c" {$my_xtraCoolVar123...} />
|
|
|
|
|
''', '''
|
|
|
|
|
<Component {...x} a={b} {...x} b="c" {...$my_xtraCoolVar123} />;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'multiline spread attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component {
|
|
|
|
|
x...} a={b} {x...} b="c" {z...}>
|
|
|
|
|
</Component>
|
|
|
|
|
''', '''
|
|
|
|
|
<Component {...x} a={b} {...x} b="c" {...z}>
|
|
|
|
|
</Component>;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'multiline tag with spread attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component
|
|
|
|
|
z="1"
|
|
|
|
|
{x...}
|
|
|
|
|
a={b}
|
|
|
|
|
b="c"
|
|
|
|
|
>
|
|
|
|
|
</Component>
|
|
|
|
|
''', '''
|
|
|
|
|
<Component z="1" {...x} a={b} b="c">
|
|
|
|
|
</Component>;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'multiline tag with spread attribute first', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component
|
|
|
|
|
{x...}
|
|
|
|
|
z="1"
|
|
|
|
|
a={b}
|
|
|
|
|
b="c"
|
|
|
|
|
>
|
|
|
|
|
</Component>
|
|
|
|
|
''', '''
|
|
|
|
|
<Component {...x} z="1" a={b} b="c">
|
|
|
|
|
</Component>;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'complex multiline spread attribute', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component
|
|
|
|
|
{y...
|
|
|
|
|
} a={b} {x...} b="c" {z...}>
|
|
|
|
|
<div code={someFunc({a:{b:{}, C:'}'}})} />
|
|
|
|
|
</Component>
|
|
|
|
|
''', '''
|
|
|
|
|
<Component {...y} a={b} {...x} b="c" {...z}>
|
|
|
|
|
<div code={someFunc({
|
|
|
|
|
a: {
|
|
|
|
|
b: {},
|
|
|
|
|
C: '}'
|
|
|
|
|
}
|
|
|
|
|
})} />
|
|
|
|
|
</Component>;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'self closing spread attribute on single line', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component a="b" c="d" {@props...} />
|
|
|
|
|
''', '''
|
|
|
|
|
<Component a="b" c="d" {...this.props} />;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'self closing spread attribute on new line', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component
|
|
|
|
|
a="b"
|
|
|
|
|
c="d"
|
|
|
|
|
{@props...}
|
|
|
|
|
/>
|
|
|
|
|
''', '''
|
|
|
|
|
<Component a="b" c="d" {...this.props} />;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'self closing spread attribute on same line', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component
|
|
|
|
|
a="b"
|
|
|
|
|
c="d"
|
|
|
|
|
{@props...} />
|
|
|
|
|
''', '''
|
|
|
|
|
<Component a="b" c="d" {...this.props} />;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
test 'self closing spread attribute on next line', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component
|
|
|
|
|
a="b"
|
|
|
|
|
c="d"
|
|
|
|
|
{@props...}
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
2017-08-03 04:00:39 +00:00
|
|
|
|
/>
|
|
|
|
|
''', '''
|
|
|
|
|
<Component a="b" c="d" {...this.props} />;
|
|
|
|
|
'''
|
2017-06-07 06:33:46 +00:00
|
|
|
|
|
|
|
|
|
test 'empty strings are not converted to true', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<Component val="" />
|
|
|
|
|
''', '''
|
|
|
|
|
<Component val="" />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'CoffeeScript @ syntax in tag name', ->
|
|
|
|
|
throws -> CoffeeScript.compile '''
|
|
|
|
|
<@Component>
|
|
|
|
|
<Component />
|
|
|
|
|
</@Component>
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'hyphens in tag names', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<paper-button className="button">{text}</paper-button>
|
|
|
|
|
''', '''
|
|
|
|
|
<paper-button className="button">{text}</paper-button>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'closing tags must be closed', ->
|
|
|
|
|
throws -> CoffeeScript.compile '''
|
|
|
|
|
<a></a
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
# Tests for allowing less than operator without spaces when ther is no CSX
|
|
|
|
|
|
|
|
|
|
test 'unspaced less than without CSX: identifier', ->
|
|
|
|
|
a = 3
|
|
|
|
|
div = 5
|
|
|
|
|
ok a<div
|
|
|
|
|
|
|
|
|
|
test 'unspaced less than without CSX: number', ->
|
|
|
|
|
div = 5
|
|
|
|
|
ok 3<div
|
|
|
|
|
|
|
|
|
|
test 'unspaced less than without CSX: paren', ->
|
|
|
|
|
div = 5
|
|
|
|
|
ok (3)<div
|
|
|
|
|
|
|
|
|
|
test 'unspaced less than without CSX: index', ->
|
|
|
|
|
div = 5
|
|
|
|
|
a = [3]
|
|
|
|
|
ok a[0]<div
|
|
|
|
|
|
|
|
|
|
test 'tag inside CSX works following: identifier', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<span>a<div /></span>
|
|
|
|
|
''', '''
|
|
|
|
|
<span>a<div /></span>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag inside CSX works following: number', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<span>3<div /></span>
|
|
|
|
|
''', '''
|
|
|
|
|
<span>3<div /></span>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag inside CSX works following: paren', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<span>(3)<div /></span>
|
|
|
|
|
''', '''
|
|
|
|
|
<span>(3)<div /></span>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'tag inside CSX works following: square bracket', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<span>]<div /></span>
|
|
|
|
|
''', '''
|
|
|
|
|
<span>]<div /></span>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'unspaced less than inside CSX works but is not encouraged', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
a = 3
|
|
|
|
|
div = 5
|
|
|
|
|
html = <span>{a<div}</span>
|
|
|
|
|
''', '''
|
|
|
|
|
var a, div, html;
|
|
|
|
|
|
|
|
|
|
a = 3;
|
|
|
|
|
|
|
|
|
|
div = 5;
|
|
|
|
|
|
|
|
|
|
html = <span>{a < div}</span>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'unspaced less than before CSX works but is not encouraged', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
div = 5
|
|
|
|
|
res = 2<div
|
|
|
|
|
html = <span />
|
|
|
|
|
''', '''
|
|
|
|
|
var div, html, res;
|
|
|
|
|
|
|
|
|
|
div = 5;
|
|
|
|
|
|
|
|
|
|
res = 2 < div;
|
|
|
|
|
|
|
|
|
|
html = <span />;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'unspaced less than after CSX works but is not encouraged', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
div = 5
|
|
|
|
|
html = <span />
|
|
|
|
|
res = 2<div
|
|
|
|
|
''', '''
|
|
|
|
|
var div, html, res;
|
|
|
|
|
|
|
|
|
|
div = 5;
|
|
|
|
|
|
|
|
|
|
html = <span />;
|
|
|
|
|
|
|
|
|
|
res = 2 < div;
|
|
|
|
|
'''
|
2017-09-16 19:03:33 +00:00
|
|
|
|
|
|
|
|
|
test '#4686: comments inside interpolations that also contain CSX tags', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div>
|
|
|
|
|
{
|
|
|
|
|
# comment
|
|
|
|
|
<div />
|
|
|
|
|
}
|
|
|
|
|
</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div>
|
|
|
|
|
{ // comment
|
|
|
|
|
<div />}
|
|
|
|
|
</div>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test '#4686: comments inside interpolations that also contain CSX attributes', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<div>
|
|
|
|
|
<div anAttr={
|
|
|
|
|
# comment
|
|
|
|
|
"value"
|
|
|
|
|
} />
|
|
|
|
|
</div>
|
|
|
|
|
''', '''
|
|
|
|
|
<div>
|
|
|
|
|
{ // comment
|
|
|
|
|
<div anAttr={"value"} />}
|
|
|
|
|
</div>;
|
|
|
|
|
'''
|
|
|
|
|
|
2017-12-09 06:41:03 +00:00
|
|
|
|
# https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html
|
|
|
|
|
test 'JSX fragments: empty fragment', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<></>
|
|
|
|
|
''', '''
|
|
|
|
|
<></>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'JSX fragments: fragment with text nodes', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
<>
|
|
|
|
|
Some text.
|
|
|
|
|
<h2>A heading</h2>
|
|
|
|
|
More text.
|
|
|
|
|
<h2>Another heading</h2>
|
|
|
|
|
Even more text.
|
|
|
|
|
</>
|
|
|
|
|
''', '''
|
|
|
|
|
<>
|
|
|
|
|
Some text.
|
|
|
|
|
<h2>A heading</h2>
|
|
|
|
|
More text.
|
|
|
|
|
<h2>Another heading</h2>
|
|
|
|
|
Even more text.
|
|
|
|
|
</>;
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
test 'JSX fragments: fragment with component nodes', ->
|
|
|
|
|
eqJS '''
|
|
|
|
|
Component = (props) =>
|
|
|
|
|
<Fragment>
|
|
|
|
|
<OtherComponent />
|
|
|
|
|
<OtherComponent />
|
|
|
|
|
</Fragment>
|
|
|
|
|
''', '''
|
|
|
|
|
var Component;
|
|
|
|
|
|
|
|
|
|
Component = (props) => {
|
|
|
|
|
return <Fragment>
|
|
|
|
|
<OtherComponent />
|
|
|
|
|
<OtherComponent />
|
|
|
|
|
</Fragment>;
|
|
|
|
|
};
|
|
|
|
|
'''
|