Skip to content

Commit

Permalink
feat: JSX Support (#3038)
Browse files Browse the repository at this point in the history
  • Loading branch information
keroxp authored and ry committed Oct 2, 2019
1 parent a646c2a commit d32f39f
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 9 deletions.
18 changes: 18 additions & 0 deletions cli/file_fetcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -481,7 +481,9 @@ fn map_file_extension(path: &Path) -> msg::MediaType {
None => msg::MediaType::Unknown,
Some(os_str) => match os_str.to_str() {
Some("ts") => msg::MediaType::TypeScript,
Some("tsx") => msg::MediaType::TSX,
Some("js") => msg::MediaType::JavaScript,
Some("jsx") => msg::MediaType::JSX,
Some("mjs") => msg::MediaType::JavaScript,
Some("json") => msg::MediaType::Json,
_ => msg::MediaType::Unknown,
Expand Down Expand Up @@ -1342,6 +1344,10 @@ mod tests {
map_file_extension(Path::new("foo/bar.ts")),
msg::MediaType::TypeScript
);
assert_eq!(
map_file_extension(Path::new("foo/bar.tsx")),
msg::MediaType::TSX
);
assert_eq!(
map_file_extension(Path::new("foo/bar.d.ts")),
msg::MediaType::TypeScript
Expand All @@ -1350,6 +1356,10 @@ mod tests {
map_file_extension(Path::new("foo/bar.js")),
msg::MediaType::JavaScript
);
assert_eq!(
map_file_extension(Path::new("foo/bar.jsx")),
msg::MediaType::JSX
);
assert_eq!(
map_file_extension(Path::new("foo/bar.json")),
msg::MediaType::Json
Expand All @@ -1371,6 +1381,10 @@ mod tests {
map_content_type(Path::new("foo/bar.ts"), None),
msg::MediaType::TypeScript
);
assert_eq!(
map_content_type(Path::new("foo/bar.tsx"), None),
msg::MediaType::TSX
);
assert_eq!(
map_content_type(Path::new("foo/bar.d.ts"), None),
msg::MediaType::TypeScript
Expand All @@ -1379,6 +1393,10 @@ mod tests {
map_content_type(Path::new("foo/bar.js"), None),
msg::MediaType::JavaScript
);
assert_eq!(
map_content_type(Path::new("foo/bar.jsx"), None),
msg::MediaType::JSX
);
assert_eq!(
map_content_type(Path::new("foo/bar.json"), None),
msg::MediaType::Json
Expand Down
10 changes: 7 additions & 3 deletions cli/msg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,19 @@ pub enum ErrorKind {
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum MediaType {
JavaScript = 0,
TypeScript = 1,
Json = 2,
Unknown = 3,
JSX = 1,
TypeScript = 2,
TSX = 3,
Json = 4,
Unknown = 5,
}

pub fn enum_name_media_type(mt: MediaType) -> &'static str {
match mt {
MediaType::JavaScript => "JavaScript",
MediaType::JSX => "JSX",
MediaType::TypeScript => "TypeScript",
MediaType::TSX => "TSX",
MediaType::Json => "Json",
MediaType::Unknown => "Unknown",
}
Expand Down
4 changes: 3 additions & 1 deletion cli/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,9 @@ impl ThreadSafeState {
msg::MediaType::Json => {
state_.json_compiler.compile_async(state_.clone(), &out)
}
msg::MediaType::TypeScript => {
msg::MediaType::TypeScript
| msg::MediaType::TSX
| msg::MediaType::JSX => {
state_.ts_compiler.compile_async(state_.clone(), &out)
}
msg::MediaType::JavaScript => {
Expand Down
9 changes: 9 additions & 0 deletions cli/tests/046_jsx_test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const React = {
createElement(factory: any, props: any, ...children: any[]) {
return {factory, props, children}
}
}
const View = () => (
<div class="deno">land</div>
)
console.log(<View />)
1 change: 1 addition & 0 deletions cli/tests/046_jsx_test.tsx.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ factory: [Function: View], props: null, children: [] }
9 changes: 9 additions & 0 deletions cli/tests/047_jsx_test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const React = {
createElement(factory, props, ...children) {
return {factory, props, children}
}
}
const View = () => (
<div class="deno">land</div>
)
console.log(<View />)
1 change: 1 addition & 0 deletions cli/tests/047_jsx_test.jsx.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ factory: [Function: View], props: null, children: [] }
10 changes: 10 additions & 0 deletions cli/tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,16 @@ itest!(_045_proxy {
output: "045_proxy_test.ts.out",
});

itest!(_046_tsx {
args: "run --reload 046_jsx_test.tsx",
output: "046_jsx_test.tsx.out",
});

itest!(_047_jsx {
args: "run --reload 047_jsx_test.jsx",
output: "047_jsx_test.jsx.out",
});

itest!(async_error {
exit_code: 1,
args: "run --reload async_error.ts",
Expand Down
16 changes: 11 additions & 5 deletions js/compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@ import { writeFileSync } from "./write_file.ts";
// Update carefully!
enum MediaType {
JavaScript = 0,
TypeScript = 1,
Json = 2,
Unknown = 3
JSX = 1,
TypeScript = 2,
TSX = 3,
Json = 4,
Unknown = 5
}

// Startup boilerplate. This is necessary because the compiler has its own
Expand Down Expand Up @@ -198,8 +200,12 @@ function getExtension(fileName: string, mediaType: MediaType): ts.Extension {
switch (mediaType) {
case MediaType.JavaScript:
return ts.Extension.Js;
case MediaType.JSX:
return ts.Extension.Jsx;
case MediaType.TypeScript:
return fileName.endsWith(".d.ts") ? ts.Extension.Dts : ts.Extension.Ts;
case MediaType.TSX:
return ts.Extension.Tsx;
case MediaType.Json:
return ts.Extension.Json;
case MediaType.Unknown:
Expand All @@ -221,7 +227,8 @@ class Host implements ts.CompilerHost {
resolveJsonModule: true,
sourceMap: true,
stripComments: true,
target: ts.ScriptTarget.ESNext
target: ts.ScriptTarget.ESNext,
jsx: ts.JsxEmit.React
};

private _sourceFileCache: Record<string, SourceFile> = {};
Expand Down Expand Up @@ -511,7 +518,6 @@ window.compilerMain = function compilerMain(): void {
window.onmessage = ({ data }: { data: CompilerReq }): void => {
const { rootNames, configPath, config, bundle } = data;
const host = new Host(bundle);

let emitSkipped = true;
let diagnostics: ts.Diagnostic[] | undefined;

Expand Down
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"sourceMap": true,
"strict": true,
"target": "esnext",
"jsx": "react",
"types": []
},
"files": [
Expand Down

0 comments on commit d32f39f

Please sign in to comment.