Conformance tests for JSX

This commit is contained in:
Ryan Cavanaugh
2015-06-18 14:03:43 -07:00
parent 2b44dcac4d
commit bc9b53a6fe
62 changed files with 1295 additions and 0 deletions
@@ -0,0 +1,22 @@
// @jsx: preserve
declare var createElement: any;
class foo {}
var x: any;
x = <any> { test: <any></any> };
x = <any><any></any>;
x = <foo>hello {<foo>{}} </foo>;
x = <foo test={<foo>{}}>hello</foo>;
x = <foo test={<foo>{}}>hello{<foo>{}}</foo>;
x = <foo>x</foo>, x = <foo/>;
<foo>{<foo><foo>{/foo/.test(x) ? <foo><foo></foo> : <foo><foo></foo>}</foo>}</foo>
@@ -0,0 +1,54 @@
// @jsx: preserve
declare var React: any;
declare var ;
declare var AbC_def;
declare var LeftRight;
declare var x;
declare var a;
declare var props;
<a />;
//<n:a n:v />; Namespace unsuported
//<a n:foo="bar"> {value} <b><c /></b></a>; Namespace unsuported
<a b={" "} c=" " d="&amp;" e="id=1&group=2" f="&#123456789" g="&#123*;" h="&#x;" />;
<a b="&notanentity;" />;
<a
/>;
<日本語></日本語>;
<AbC_def
test="&#x0026;&#38;">
bar
baz
</AbC_def>;
<a b={x ? <c /> : <d />} />;
<a>{}</a>;
<a>{/* this is a comment */}</a>;
<div>@test content</div>;
<div><br />7x invalid-js-identifier</div>;
<LeftRight left=<a /> right=<b>monkeys /> gorillas</b> />;
<a.b></a.b>;
<a.b.c></a.b.c>;
(<div />) < x;
<div {...props} />;
<div {...props} post="attribute" />;
<div pre="leading" pre2="attribute" {...props}></div>;
<a> </a>;
@@ -0,0 +1,36 @@
// @jsx: preserve
declare var React: any;
</>;
<a: />;
<:a />;
<a b=d />;
<a>;
<a></b>;
<a foo="bar;
<a:b></b>;
<a:b.c></a:b.c>;
<a.b:c></a.b:c>;
<a.b.c></a>;
<.a></.a>;
<a.></a.>;
<a[foo]></a[foo]>;
<a['foo']></a['foo']>;
<a><a />;
<a b={}>;
var x = <div>one</div><div>two</div>;;
var x = <div>one</div> /* intervening comment */ <div>two</div>;;
<a>{"str";}</a>;
<span className="a", id="b" />;
<div className"app">;
<div {props} />;
<div>stuff</div {...props}>;
<div {...props}>stuff</div {...props}>;
<a>></a>;
<a> ></a>;
<a b=}>;
<a b=<}>;
<a>}</a>;
<a .../*hai*/asdf/>;
@@ -0,0 +1,117 @@
// @jsx: preserve
declare var React: any;
declare var Component:any;
declare var Composite:any;
declare var Composite2:any;
declare var Child:any;
declare var Namespace:any;
declare var foo: any;
declare var bar: any;
declare var y:any;
declare var x:any;
declare var z:any;
declare var hasOwnProperty:any;
<div>text</div>;
<div>
{this.props.children}
</div>;
<div>
<div><br /></div>
<Component>{foo}<br />{bar}</Component>
<br />
</div>;
<Composite>
{this.props.children}
</Composite>;
<Composite>
<Composite2 />
</Composite>;
var x =
<div
attr1={
"foo" + "bar"
}
attr2={
"foo" + "bar" +
"baz" + "bug"
}
attr3={
"foo" + "bar" +
"baz" + "bug"
// Extra line here.
}
attr4="baz">
</div>;
(
<div>
{/* A comment at the beginning */}
{/* A second comment at the beginning */}
<span>
{/* A nested comment */}
</span>
{/* A sandwiched comment */}
<br />
{/* A comment at the end */}
{/* A second comment at the end */}
</div>
);
(
<div
/* a multi-line
comment */
attr1="foo">
<span // a double-slash comment
attr2="bar"
/>
</div>
);
<div>&nbsp;</div>;
<div>&nbsp; </div>;
<hasOwnProperty>testing</hasOwnProperty>;
<Component constructor="foo" />;
<Namespace.Component />;
<Namespace.DeepNamespace.Component />;
<Component { ... x } y
={2 } z />;
<Component
{...this.props} sound="moo" />;
<font-face />;
<Component x={y} />;
<x-component />;
<Component {...x} />;
<Component { ...x } y={2} />;
<Component { ... x } y={2} z />;
<Component x={1} {...y} />;
<Component x={1} y="2" {...z} {...z}><Child /></Component>;
<Component x="1" {...(z = { y: 2 }, z)} z={3}>Text</Component>;
@@ -0,0 +1,26 @@
// @jsx: preserve
declare namespace JSX {
interface Element { }
interface IntrinsicElements {
div: {
text?: string;
width?: number;
}
span: any;
}
}
// Error, number is not assignable to string
<div text={42} />;
// Error, string is not assignable to number
<div width={'foo'} />;
// Error, number is not assignable to string
var attribs = { text: 100 };
<div {...attribs} />;
// No errors here
<span foo='bar' bar={'foo'} />;
@@ -0,0 +1,12 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: { "data-foo"?: string };
}
}
// Invalid names
<test1 32data={32} />;
<test1 -data={32} />;
@@ -0,0 +1,9 @@
/// @jsx: preserve
declare namespace JSX {
interface IntrinsicElements {
x: { y: number; z: string; };
}
}
@@ -0,0 +1,15 @@
// OK
<test1 x={0}/>; // OK
<test1 />; // OK
<test1 data-x={true}/>; // OK
<test2 reqd='true'/>; // OK
<test2 reqd={'true'}/>; // OK
// Errors
<test1 x={'0'}/>; // Error, '0' is not number
<test1 y={0}/>; // Error, no property "y"
<test1 y="foo"/>; // Error, no property "y"
<test1 x="32"/>; // Error, "32" is not number
// TODO attribute 'var' should be parseable
// <test1 var="10" />; // Error, no 'var' property
<test2 />; // Error, missing reqd
<test2 reqd={10}/>; // Error, reqd is not string
@@ -0,0 +1,33 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: Attribs1;
test2: { reqd: string };
}
}
interface Attribs1 {
x?: number;
s?: string;
}
// OK
<test1 x={0} />; // OK
<test1 />; // OK
<test1 data-x={true} />; // OK
<test2 reqd='true' />; // OK
<test2 reqd={'true'} />; // OK
// Errors
<test1 x={'0'} />; // Error, '0' is not number
<test1 y={0} />; // Error, no property "y"
<test1 y="foo" />; // Error, no property "y"
<test1 x="32" />; // Error, "32" is not number
// TODO attribute 'var' should be parseable
// <test1 var="10" />; // Error, no 'var' property
<test2 />; // Error, missing reqd
<test2 reqd={10} />; // Error, reqd is not string
@@ -0,0 +1,5 @@
// OK
<test1 c1={function (x) { return x.length; }}/>; // OK
<test1 data-c1={function (x) { return x.leng; }}/>; // OK
// Errors
<test1 c1={function (x) { return x.leng; }}/>; // Error, no leng on 'string'
@@ -0,0 +1,19 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: Attribs1;
}
}
interface Attribs1 {
c1?: (x: string) => void;
}
// OK
<test1 c1={(x) => x.length} />; // OK
<test1 data-c1={(x) => x.leng} />; // OK
// Errors
<test1 c1={(x) => x.leng} />; // Error, no leng on 'string'
@@ -0,0 +1,21 @@
// OK
var obj1 = { x: 'foo' };
<test1 {...obj1}/>;
// Error, x is not string
var obj2 = { x: 32 };
<test1 {...obj2}/>;
// Error, x is missing
var obj3 = { y: 32 };
<test1 {...obj3}/>;
// OK
var obj4 = { x: 32, y: 32 };
<test1 {...obj4} x="ok"/>;
// Error
var obj5 = { x: 32, y: 32 };
<test1 x="ok" {...obj5}/>;
// OK
var obj6 = { x: 'ok', y: 32, extra: 100 };
<test1 {...obj6}/>;
// Error
var obj7 = { x: 'foo' };
<test1 x={32} {...obj7}/>;
@@ -0,0 +1,41 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: Attribs1;
}
}
interface Attribs1 {
x: string;
y?: number;
z?: string;
}
// OK
var obj1 = { x: 'foo' };
<test1 {...obj1} />
// Error, x is not string
var obj2 = { x: 32 };
<test1 {...obj2} />
// Error, x is missing
var obj3 = { y: 32 };
<test1 {...obj3} />
// OK
var obj4 = { x: 32, y: 32 };
<test1 {...obj4} x="ok" />
// Error
var obj5 = { x: 32, y: 32 };
<test1 x="ok" {...obj5} />
// OK
var obj6 = { x: 'ok', y: 32, extra: 100 };
<test1 {...obj6} />
// Error
var obj7 = { x: 'foo' };
<test1 x={32} {...obj7} />
@@ -0,0 +1,4 @@
// OK
<test1 {...{ x: function (n) { return 0; } }}/>;
// Error, no member 'len' on 'string'
<test1 {...{ x: function (n) { return n.len; } }}/>;
@@ -0,0 +1,17 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: Attribs1;
}
}
interface Attribs1 {
x(n: string): void;
}
// OK
<test1 {... {x: (n) => 0} } />;
// Error, no member 'len' on 'string'
<test1 {... {x: (n) => n.len} } />;
@@ -0,0 +1,11 @@
function make1(obj) {
return <test1 {...obj}/>; // OK
}
function make2(obj) {
return <test1 {...obj}/>; // Error (x is number, not string)
}
function make3(obj) {
return <test1 {...obj}/>; // Error, missing x
}
<test1 {...{}}/>; // Error, missing x
<test2 {...{}}/>; // OK
@@ -0,0 +1,32 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: Attribs1;
test2: Attribs2;
}
}
interface Attribs1 {
x: string;
}
interface Attribs2 {
toString(): string;
}
function make1<T extends {x: string}> (obj: T) {
return <test1 {...obj} />; // OK
}
function make2<T extends {x: number}> (obj: T) {
return <test1 {...obj} />; // Error (x is number, not string)
}
function make3<T extends {y: string}> (obj: T) {
return <test1 {...obj} />; // Error, missing x
}
<test1 {...{}} />; // Error, missing x
<test2 {...{}} />; // OK
@@ -0,0 +1,19 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: { n?: boolean; s?: string};
test2: { n: boolean; };
}
}
// Error
<test1 s />;
<test1 n='true' />;
<test2 />;
// OK
<test1 n />;
<test1 n={false} />;
<test2 n />;
@@ -0,0 +1,16 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
test1: { "data-foo"?: string };
}
}
// Error
<test1 data-foo={32} />;
// OK
<test1 data-foo={'32'} />;
<test1 data-bar={'32'} />;
<test1 data-bar={32} />;
@@ -0,0 +1,25 @@
//@jsx: preserve
declare namespace JSX {
interface IntrinsicElements {
foundFirst: { x: string };
'string_named';
'var';
}
}
class foundFirst { }
class Other {}
module Dotted {
export class Name { }
}
// Should find the intrinsic element, not the class element
var a = <foundFirst x="hello" />;
var b = <string_named />;
// TODO: This should not be a parse error (should
// parse a property name here, not identifier)
// var c = <var />;
var d = <Other />;
var e = <Dotted.Name />;
@@ -0,0 +1,4 @@
// OK
<div />;
// Fail
<span />;
@@ -0,0 +1,14 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
div: any
}
}
// OK
<div />;
// Fail
<span />;
@@ -0,0 +1,21 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface ElementClass {
render: any;
}
interface IntrinsicElements { }
}
interface Obj1type {
new(n: string): { x: number };
}
var Obj1: Obj1type;
<Obj1 x={10} />; // Error, no render member
interface Obj2type {
(n: string): { x: number; render: any; };
}
var Obj2: Obj2type;
<Obj2 x={32} render={100} />; // OK
@@ -0,0 +1,6 @@
var Obj1;
<Obj1 x={10}/>; // OK
var Obj2;
<Obj2 x={10}/>; // Error
var Obj3;
<Obj3 x={10}/>; // OK
@@ -0,0 +1,25 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface ElementAttributesProperty { }
interface IntrinsicElements { }
}
interface Obj1type {
new(n: string): any;
}
var Obj1: Obj1type;
<Obj1 x={10} />; // OK
interface Obj2type {
new(n: string): { q?: number };
}
var Obj2: Obj2type;
<Obj2 x={10} />; // Error
interface Obj3type {
new(n: string): { x: number; };
}
var Obj3: Obj3type;
<Obj3 x={10} />; // OK
@@ -0,0 +1,9 @@
var obj1;
<obj1 x={10}/>; // OK
var obj2;
<obj2 x={10}/>; // OK
var obj3;
<obj3 x={10}/>; // Error
var obj4;
<obj4 x={10}/>; // OK
<obj4 x={'10'}/>; // Error
@@ -0,0 +1,32 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface ElementAttributesProperty { pr: any; }
interface IntrinsicElements { }
}
interface Obj1type {
new(n: string): any;
}
var Obj1: Obj1type;
<Obj1 x={10} />; // OK
interface Obj2type {
new(n: string): { q?: number; pr: any };
}
var obj2: Obj2type;
<Obj2 x={10} />; // OK
interface Obj3type {
new(n: string): { x: number; };
}
var Obj3: Obj3type;
<Obj3 x={10} />; // Error
interface Obj4type {
new(n: string): { x: number; pr: { x: number; } };
}
var Obj4: Obj4type;
<Obj4 x={10} />; // OK
<Obj4 x={'10'} />; // Error
@@ -0,0 +1,2 @@
var obj1;
<obj1 x={10}/>; // Error
@@ -0,0 +1,12 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface ElementAttributesProperty { pr1: any; pr2: any; }
}
interface Obj1 {
new(n: string): any;
}
var obj1: Obj1;
<obj1 x={10} />; // Error
@@ -0,0 +1,2 @@
var obj1;
<obj1 x={10}/>; // OK
@@ -0,0 +1,11 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
}
interface Obj1 {
new(n: string): {};
}
var obj1: Obj1;
<obj1 x={10} />; // OK
@@ -0,0 +1,2 @@
var obj1;
<obj1 x={10}/>; // Error
@@ -0,0 +1,13 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface ElementAttributesProperty { pr1: any; pr2: any; }
interface IntrinsicElements { }
}
interface Obj1type {
new(n: string): {};
}
var Obj1: Obj1type;
<Obj1 x={10} />; // Error
@@ -0,0 +1,2 @@
var obj1;
<obj1 x={10}/>; // Error (JSX.Element is missing)
@@ -0,0 +1,10 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
}
interface Obj1 {
new(n: string): {};
}
var obj1: Obj1;
<obj1 x={10} />; // Error (JSX.Element is missing)
@@ -0,0 +1,27 @@
//@jsx: preserve
//@module: amd
//@filename: file.tsx
declare module JSX {
interface Element { }
interface IntrinsicElements { }
}
declare module 'elements1' {
class MyElement {
}
}
declare module 'elements2' {
class MyElement {
}
}
//@filename: consumer.tsx
///<reference path="file.tsx" />
// Should keep s1 and elide s2
import s1 = require('elements1');
import s2 = require('elements2');
<s1.MyElement />;
@@ -0,0 +1,9 @@
//@jsx: preserve
//@filename: file1.tsx
//@noimplicitany: true
declare module JSX {
interface Element { }
}
// Error under implicit any
<div n='x' />;
@@ -0,0 +1,14 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
[x: string]: any;
}
}
// OK
<div />;
// OK
<span />;
@@ -0,0 +1,14 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
[x: string]: { n: string; };
}
}
// OK
<div n='x' />;
// Error
<span w='err' />;
@@ -0,0 +1,18 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
div: { n: string; };
span: { m: string; };
}
}
// OK
<div n='x' />;
// OK
<span m='ok' />;
// Error
<span q='' />;
@@ -0,0 +1,8 @@
//@jsx: preserve
//@filename: file1.tsx
declare module JSX {
interface Element { }
}
// OK, but implicit any
<div n='x' />;
@@ -0,0 +1,10 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements { }
}
var div: any;
// Still an error
<div n='x' />;
@@ -0,0 +1,14 @@
var my;
(function (my) {
})(my || (my = {}));
// OK
<my.div n='x'/>;
// Error
<my.other />;
var q;
(function (q) {
// OK
<mine.div n='x'/>;
// Error
<mine.non />;
})(q || (q = {}));
@@ -0,0 +1,22 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements { }
}
module my {
export var div: any;
}
// OK
<my.div n='x' />;
// Error
<my.other />;
module q {
import mine = my;
// OK
<mine.div n='x' />;
// Error
<mine.non />;
}
@@ -0,0 +1,15 @@
// Error
var div = 3;
<div />;
// OK
function fact() { return null; }
<fact />;
// Error
function fnum() { return 42; }
<fnum />;
var obj1;
<obj1 />; // OK, prefer construct signatures
var obj2;
<obj2 />; // Error
var obj3;
<obj3 />; // Error
@@ -0,0 +1,36 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements { }
}
// Error
var Div = 3;
<Div />;
// OK
function Fact(): any { return null; }
<Fact />
// Error
function Fnum(): number{ return 42; }
<Fnum />
interface Obj1 {
new(): {};
(): number;
}
var Obj1: Obj1;
<Obj1 />; // OK, prefer construct signatures
interface Obj2 {
(): number;
}
var Obj2: Obj2;
<Obj2 />; // Error
interface Obj3 {
}
var Obj3: Obj3;
<Obj3 />; // Error
@@ -0,0 +1,6 @@
var obj1;
<obj1 />; // Error, return type is not an object type
var obj2;
<obj2 />; // Error, return type is not an object type
var obj3;
<obj3 x={42}/>; // OK
@@ -0,0 +1,27 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements { }
}
interface Obj1 {
new(n: string): { x: number };
new(n: number): { y: string };
}
var Obj1: Obj1;
<Obj1 />; // Error, return type is not an object type
interface Obj2 {
(n: string): { x: number };
(n: number): { y: string };
}
var Obj2: Obj2;
<Obj2 />; // Error, return type is not an object type
interface Obj3 {
(n: string): { x: number };
(n: number): { x: number; y: string };
}
var Obj3: Obj3;
<Obj3 x={42} />; // OK
+34
View File
@@ -0,0 +1,34 @@
var p;
/*
var selfClosed1 = <div />;
var selfClosed2 = <div x="1" />;
var selfClosed3 = <div x='1' />;
var selfClosed4 = <div x="1" y='0' />;
var selfClosed5 = <div x={0} y='0' />;
var selfClosed6 = <div x={"1"} y='0' />;
var selfClosed7 = <div x={p} y='p' />;
var openClosed1 = <div></div>;
var openClosed2 = <div n='m'>foo</div>;
var openClosed3 = <div n='m'>{p}</div>;
var openClosed4 = <div n='m'>{p < p}</div>;
var openClosed5 = <div n='m'>{p > p}</div>;
*/
var SomeClass = (function () {
function SomeClass() {
}
SomeClass.prototype.f = function () {
var _this = this;
var rewrites1 = <div>{function () { return _this; }}</div>;
var rewrites4 = <div a={function () { return _this; }}></div>;
};
return SomeClass;
})();
/*
var q = () => this;
var rewrites2 = <div>{[p, ...p, p]}</div>;
var rewrites3 = <div>{{p}}</div>;
var rewrites5 = <div a={[p, ...p, p]}></div>;
var rewrites6 = <div a={{p}}></div>;
*/
+41
View File
@@ -0,0 +1,41 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
var p;
var selfClosed1 = <div />;
var selfClosed2 = <div x="1" />;
var selfClosed3 = <div x='1' />;
var selfClosed4 = <div x="1" y='0' />;
var selfClosed5 = <div x={0} y='0' />;
var selfClosed6 = <div x={"1"} y='0' />;
var selfClosed7 = <div x={p} y='p' />;
var openClosed1 = <div></div>;
var openClosed2 = <div n='m'>foo</div>;
var openClosed3 = <div n='m'>{p}</div>;
var openClosed4 = <div n='m'>{p < p}</div>;
var openClosed5 = <div n='m'>{p > p}</div>;
class SomeClass {
f() {
var rewrites1 = <div>{() => this}</div>;
var rewrites2 = <div>{[p, ...p, p]}</div>;
var rewrites3 = <div>{{p}}</div>;
var rewrites4 = <div a={() => this}></div>;
var rewrites5 = <div a={[p, ...p, p]}></div>;
var rewrites6 = <div a={{p}}></div>;
}
}
var whitespace1 = <div> </div>;
var whitespace2 = <div> {p} </div>;
var whitespace3 = <div>
{p}
</div>;
+15
View File
@@ -0,0 +1,15 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
var p1, p2, p3;
var spreads1 = <div {...p1}>{p2}</div>;
var spreads2 = <div {...p1}>{p2}</div>;
var spreads3 = <div x={p3} {...p1}>{p2}</div>;
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
+41
View File
@@ -0,0 +1,41 @@
var M;
(function (M) {
var Foo = (function () {
function Foo() {
}
return Foo;
})();
M.Foo = Foo;
var S;
(function (S) {
var Bar = (function () {
function Bar() {
}
return Bar;
})();
S.Bar = Bar;
})(S = M.S || (M.S = {}));
})(M || (M = {}));
var M;
(function (M) {
// Emit M.Foo
M.Foo, <M.Foo />;
var S;
(function (S) {
// Emit M.Foo
M.Foo, <M.Foo />;
// Emit S.Bar
S.Bar, <S.Bar />;
})(S = M.S || (M.S = {}));
})(M || (M = {}));
var M;
(function (M) {
// Emit M.S.Bar
M.S.Bar, <M.S.Bar />;
})(M || (M = {}));
var M;
(function (M_1) {
var M = 100;
// Emit M_1.Foo
M_1.Foo, <M_1.Foo />;
})(M || (M = {}));
+41
View File
@@ -0,0 +1,41 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements { }
}
module M {
export class Foo { constructor() { } }
export module S {
export class Bar { }
// Emit Foo
// Foo, <Foo />;
}
}
module M {
// Emit M.Foo
Foo, <Foo />;
export module S {
// Emit M.Foo
Foo, <Foo />;
// Emit S.Bar
Bar, <Bar />;
}
}
module M {
// Emit M.S.Bar
S.Bar, <S.Bar />;
}
module M {
var M = 100;
// Emit M_1.Foo
Foo, <Foo />;
}
@@ -0,0 +1,28 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { isElement; }
}
var T, T1, T2;
// This is an element
var x1 = <T>() => {}</T>;
x1.isElement;
// This is a generic function
var x2 = <T extends {}>() => {};
x2();
// This is a generic function
var x3 = <T, T1>() => {};
x3();
// This is an element
var x4 = <T extends={true}>() => {}</T>;
x4.isElement;
// This is an element
var x5 = <T extends>() => {}</T>;
x5.isElement;
+3
View File
@@ -0,0 +1,3 @@
//@jsx: preserve
<nope />;
@@ -0,0 +1,8 @@
//@filename: file.tsx
//@jsx: preserve
declare module JSX {
interface Element { }
interface IntrinsicElements { div; span; }
}
var x = <div><div><span><div></div></span></div></div>;
@@ -0,0 +1,41 @@
//@filename: file.tsx
//@jsx: react
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
var p;
var selfClosed1 = <div />;
var selfClosed2 = <div x="1" />;
var selfClosed3 = <div x='1' />;
var selfClosed4 = <div x="1" y='0' />;
var selfClosed5 = <div x={0} y='0' />;
var selfClosed6 = <div x={"1"} y='0' />;
var selfClosed7 = <div x={p} y='p' />;
var openClosed1 = <div></div>;
var openClosed2 = <div n='m'>foo</div>;
var openClosed3 = <div n='m'>{p}</div>;
var openClosed4 = <div n='m'>{p < p}</div>;
var openClosed5 = <div n='m'>{p > p}</div>;
class SomeClass {
f() {
var rewrites1 = <div>{() => this}</div>;
var rewrites2 = <div>{[p, ...p, p]}</div>;
var rewrites3 = <div>{{p}}</div>;
var rewrites4 = <div a={() => this}></div>;
var rewrites5 = <div a={[p, ...p, p]}></div>;
var rewrites6 = <div a={{p}}></div>;
}
}
var whitespace1 = <div> </div>;
var whitespace2 = <div> {p} </div>;
var whitespace3 = <div>
{p}
</div>;
@@ -0,0 +1,15 @@
//@filename: file.tsx
//@jsx: react
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
var p1, p2, p3;
var spreads1 = <div {...p1}>{p2}</div>;
var spreads2 = <div {...p1}>{p2}</div>;
var spreads3 = <div x={p3} {...p1}>{p2}</div>;
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
@@ -0,0 +1,8 @@
//@jsx: react
//@filename: test.tsx
declare module JSX { interface Element { } }
declare var Foo, Bar, baz;
<Foo> <Bar> q </Bar> <Bar/> s <Bar/><Bar/></Foo>;
@@ -0,0 +1,15 @@
//@filename: file.tsx
//@jsx: react
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
var p;
var openClosed1 = <div>
{blah}
</div>;
@@ -0,0 +1,52 @@
//@filename: file.tsx
//@jsx: react
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
// THIS FILE HAS TEST-SIGNIFICANT LEADING/TRAILING
// WHITESPACE, DO NOT RUN 'FORMAT DOCUMENT' ON IT
var p = 0;
// Emit " "
<div> </div>;
// Emit " ", p, " "
<div> {p} </div>;
// Emit only p
<div>
{p}
</div>;
// Emit only p
<div>
{p}
</div>;
// Emit " 3"
<div> 3
</div>;
// Emit " 3 "
<div> 3 </div>;
// Emit "3"
<div>
3
</div>;
// Emit no args
<div>
</div>;
// Emit "foo" + ' ' + "bar"
<div>
foo
bar
</div>;
@@ -0,0 +1,34 @@
//@jsx: preserve
// A built-in element (OK)
var a1 = <div id="foo" />;
// A built-in element with a mistyped property (error)
var a2 = <img srce="foo.jpg" />
// A built-in element with a badly-typed attribute value (error)
var thing = { oops: 100 };
var a3 = <div id={thing} />
// Mistyped html name (error)
var e1 = <imag src="bar.jpg" />
// A custom type
class MyClass {
props: {
pt?: { x: number; y: number; };
name?: string;
reqd: boolean;
}
}
// Let's use it
// TODO: Error on missing 'reqd'
var b1 = <MyClass reqd={true} />;
// Mistyped attribute member
// sample.tsx(23,22): error TS2322: Type '{ x: number; y: string; }' is not assignable to type '{ x: number; y: number; }'.
// Types of property 'y' are incompatible.
// Type 'string' is not assignable to type 'number'.
var b2 = <MyClass pt={{x: 4, y: 'oops'}} />;