Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.

Commit bf75388

Browse files
alloykastermester
authored andcommitted
[example] Use all available typings thus far and able to launch server.
1 parent d3f1ae4 commit bf75388

18 files changed

+286
-104
lines changed

example/README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,36 @@
33
## Installation
44

55
```
6-
npm install
6+
yarn install
77
```
88

99
## Running
1010

1111
Set up generated files:
1212

1313
```
14-
npm run update-schema
15-
npm run build
14+
yarn update-schema
15+
yarn build
1616
```
1717

1818
Start a local server:
1919

2020
```
21-
npm start
21+
yarn start
2222
```
2323

2424
## Developing
2525

26-
Any changes you make to files in the `js/` directory will cause the server to
26+
Any changes you make to files in the `ts/` directory will cause the server to
2727
automatically rebuild the app and refresh your browser.
2828

2929
If at any time you make changes to `data/schema.js`, stop the server,
3030
regenerate `data/schema.graphql`, and restart the server:
3131

3232
```
33-
npm run update-schema
34-
npm run build
35-
npm start
33+
yarn update-schema
34+
yarn build
35+
yarn start
3636
```
3737

3838
## License

example/package.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
"start": "babel-node ./server.js",
55
"build": "relay-compiler --src ./ts/ --schema ./data/schema.graphql --language typescript",
66
"update-schema": "babel-node ./scripts/updateSchema.js",
7-
"lint": "eslint ./js"
7+
"lint": "eslint ./js",
8+
"type-check": "tsc --noEmit --pretty"
89
},
910
"resolutions": {
10-
"relay-compiler-language-typescript": "file:../relay-compiler-language-typescript-1.0.0-alpha.1.tgz",
11+
"relay-compiler-language-typescript": "file:../relay-compiler-language-typescript-1.0.0-alpha.2.tgz",
1112
"relay-compiler": "file:../../relay/dist/relay-compiler/relay-compiler-1.4.1-plugin.3.tgz",
1213
"relay-runtime": "file:../../relay/dist/relay-runtime/relay-runtime-1.4.1-plugin.3.tgz",
1314
"babel-plugin-relay": "file:../../relay/dist/babel-plugin-relay/babel-plugin-relay-1.4.1-plugin.3.tgz",
@@ -39,15 +40,21 @@
3940
"whatwg-fetch": "2.0.3"
4041
},
4142
"devDependencies": {
43+
"@types/prop-types": "^15.5.2",
44+
"@types/react": "^16.0.34",
45+
"@types/react-dom": "^16.0.3",
46+
"@types/react-relay": "^1.3.1",
47+
"@types/relay-runtime": "^1.3.1",
4248
"babel-cli": "^6.26.0",
4349
"babel-eslint": "6.1.2",
4450
"eslint": "3.19.0",
4551
"eslint-config-fbjs": "1.1.1",
4652
"eslint-plugin-babel": "3.3.0",
4753
"eslint-plugin-flowtype": "2.15.0",
4854
"eslint-plugin-react": "5.2.2",
55+
"fork-ts-checker-webpack-plugin": "^0.3.0",
4956
"relay-compiler": "file:../../relay/dist/relay-compiler/relay-compiler-1.4.1-plugin.3.tgz",
50-
"relay-compiler-language-typescript": "file:../relay-compiler-language-typescript-1.0.0-alpha.1.tgz",
57+
"relay-compiler-language-typescript": "file:../relay-compiler-language-typescript-1.0.0-alpha.2.tgz",
5158
"ts-loader": "^3.2.0",
5259
"typescript": "^2.6.2"
5360
}

example/server.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import path from 'path';
1616
import webpack from 'webpack';
1717
import WebpackDevServer from 'webpack-dev-server';
1818
import {schema} from './data/schema';
19+
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
1920

2021
const APP_PORT = 3000;
2122
const GRAPHQL_PORT = 8080;
@@ -29,19 +30,25 @@ graphQLServer.listen(GRAPHQL_PORT, () => console.log(
2930

3031
// Serve the Relay app
3132
const compiler = webpack({
32-
entry: ['whatwg-fetch', path.resolve(__dirname, 'ts', 'app.ts')],
33+
entry: ['whatwg-fetch', path.resolve(__dirname, 'ts', 'app.tsx')],
34+
resolve: {
35+
extensions: ['.ts', '.tsx', '.js'],
36+
},
3337
module: {
3438
rules: [
3539
{
3640
test: /\.tsx?$/,
3741
exclude: /node_modules/,
3842
use: [
3943
{ loader: 'babel-loader' },
40-
{ loader: 'ts-loader' },
44+
{ loader: 'ts-loader', options: { transpileOnly: true } },
4145
],
4246
},
4347
],
4448
},
49+
plugins: [
50+
new ForkTsCheckerWebpackPlugin(),
51+
],
4552
output: {filename: 'app.js', path: '/'},
4653
});
4754
const app = new WebpackDevServer(compiler, {

example/ts/app.ts renamed to example/ts/app.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
import 'todomvc-common';
1414

15-
import React from 'react';
16-
import ReactDOM from 'react-dom';
15+
import * as React from 'react';
16+
import * as ReactDOM from 'react-dom';
1717

1818
import {installRelayDevTools} from 'relay-devtools';
1919

@@ -36,8 +36,8 @@ installRelayDevTools();
3636
const mountNode = document.getElementById('root');
3737

3838
function fetchQuery(
39-
operation,
40-
variables,
39+
operation: any,
40+
variables: any,
4141
) {
4242
return fetch('/graphql', {
4343
method: 'POST',

example/ts/components/Todo.tsx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,34 @@ import RemoveTodoMutation from '../mutations/RemoveTodoMutation';
1515
import RenameTodoMutation from '../mutations/RenameTodoMutation';
1616
import TodoTextInput from './TodoTextInput';
1717

18-
import React from 'react';
18+
import * as React from 'react';
1919
import {
2020
createFragmentContainer,
2121
graphql,
22+
RelayProp,
2223
} from 'react-relay';
24+
2325
import classnames from 'classnames';
2426

25-
class Todo extends React.Component {
27+
import { Todo_todo } from './__generated__/Todo_todo.graphql';
28+
import { Todo_viewer } from './__generated__/Todo_viewer.graphql';
29+
import { ChangeEvent } from 'react';
30+
import { Environment } from 'relay-runtime';
31+
32+
interface Props {
33+
relay: RelayProp
34+
todo: Todo_todo
35+
viewer: Todo_viewer
36+
}
37+
38+
class Todo extends React.Component<Props> {
2639
state = {
2740
isEditing: false,
2841
};
29-
_handleCompleteChange = (e) => {
42+
_handleCompleteChange = (e: ChangeEvent<HTMLInputElement>) => {
3043
const complete = e.target.checked;
3144
ChangeTodoStatusMutation.commit(
32-
this.props.relay.environment,
45+
(this.props.relay && this.props.relay.environment) as Environment,
3346
complete,
3447
this.props.todo,
3548
this.props.viewer,
@@ -48,22 +61,22 @@ class Todo extends React.Component {
4861
this._setEditMode(false);
4962
this._removeTodo();
5063
};
51-
_handleTextInputSave = (text) => {
64+
_handleTextInputSave = (text: string) => {
5265
this._setEditMode(false);
5366
RenameTodoMutation.commit(
54-
this.props.relay.environment,
67+
(this.props.relay && this.props.relay.environment) as Environment,
5568
text,
5669
this.props.todo,
5770
);
5871
};
5972
_removeTodo() {
6073
RemoveTodoMutation.commit(
61-
this.props.relay.environment,
74+
(this.props.relay && this.props.relay.environment) as Environment,
6275
this.props.todo,
6376
this.props.viewer,
6477
);
6578
}
66-
_setEditMode = (shouldEdit) => {
79+
_setEditMode = (shouldEdit: boolean) => {
6780
this.setState({isEditing: shouldEdit});
6881
};
6982
renderTextInput() {
@@ -87,7 +100,7 @@ class Todo extends React.Component {
87100
})}>
88101
<div className="view">
89102
<input
90-
checked={this.props.todo.complete}
103+
checked={!!this.props.todo.complete}
91104
className="toggle"
92105
onChange={this._handleCompleteChange}
93106
type="checkbox"

example/ts/components/TodoApp.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,30 @@ import TodoList from './TodoList';
1515
import TodoListFooter from './TodoListFooter';
1616
import TodoTextInput from './TodoTextInput';
1717

18-
import React from 'react';
18+
import * as React from 'react';
1919
import {
2020
createFragmentContainer,
2121
graphql,
22+
RelayProp,
2223
} from 'react-relay';
2324

24-
class TodoApp extends React.Component {
25-
_handleTextInputSave = (text) => {
25+
import { TodoApp_viewer } from './__generated__/TodoApp_viewer.graphql';
26+
27+
interface Props {
28+
relay: RelayProp
29+
viewer: TodoApp_viewer
30+
}
31+
32+
class TodoApp extends React.Component<Props> {
33+
_handleTextInputSave = (text: string) => {
2634
AddTodoMutation.commit(
2735
this.props.relay.environment,
2836
text,
2937
this.props.viewer,
3038
);
3139
};
3240
render() {
33-
const hasTodos = this.props.viewer.totalCount > 0;
41+
const hasTodos = (this.props.viewer.totalCount || 0) > 0;
3442
return (
3543
<div>
3644
<section className="todoapp">
@@ -46,12 +54,7 @@ class TodoApp extends React.Component {
4654
/>
4755
</header>
4856
<TodoList viewer={this.props.viewer} />
49-
{hasTodos &&
50-
<TodoListFooter
51-
todos={this.props.viewer.todos}
52-
viewer={this.props.viewer}
53-
/>
54-
}
57+
{hasTodos && <TodoListFooter viewer={this.props.viewer} />}
5558
</section>
5659
<footer className="info">
5760
<p>

example/ts/components/TodoList.tsx

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,23 @@
1313
import MarkAllTodosMutation from '../mutations/MarkAllTodosMutation';
1414
import Todo from './Todo';
1515

16-
import React from 'react';
16+
import * as React from 'react';
1717
import {
1818
createFragmentContainer,
1919
graphql,
20+
RelayProp,
2021
} from 'react-relay';
2122

22-
class TodoList extends React.Component {
23-
_handleMarkAllChange = (e) => {
23+
import { TodoList_viewer } from './__generated__/TodoList_viewer.graphql';
24+
import { ChangeEvent } from 'react';
25+
26+
interface Props {
27+
relay: RelayProp,
28+
viewer: TodoList_viewer
29+
}
30+
31+
class TodoList extends React.Component<Props> {
32+
_handleMarkAllChange = (e: ChangeEvent<HTMLInputElement>) => {
2433
const complete = e.target.checked;
2534
MarkAllTodosMutation.commit(
2635
this.props.relay.environment,
@@ -30,13 +39,18 @@ class TodoList extends React.Component {
3039
);
3140
};
3241
renderTodos() {
33-
return this.props.viewer.todos.edges.map(edge =>
34-
<Todo
35-
key={edge.node.id}
36-
todo={edge.node}
42+
if (!this.props.viewer.todos || !this.props.viewer.todos.edges) {
43+
throw new Error('assertion failed');
44+
}
45+
return this.props.viewer.todos.edges.map(edge => {
46+
const node = edge && edge.node;
47+
if (!node) throw new Error('assertion failed');
48+
return <Todo
49+
key={node.id}
50+
todo={node}
3751
viewer={this.props.viewer}
3852
/>
39-
);
53+
});
4054
}
4155
render() {
4256
const numTodos = this.props.viewer.totalCount;

example/ts/components/TodoListFooter.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,22 @@
1212

1313
import RemoveCompletedTodosMutation from '../mutations/RemoveCompletedTodosMutation';
1414

15-
import React from 'react';
15+
import * as React from 'react';
1616
import {
1717
graphql,
1818
createFragmentContainer,
19+
RelayProp,
1920
} from 'react-relay';
2021

21-
class TodoListFooter extends React.Component {
22+
import { TodoListFooter_viewer } from './__generated__/TodoListFooter_viewer.graphql'
23+
import { Environment } from 'relay-runtime';
24+
25+
interface Props {
26+
relay: RelayProp
27+
viewer: TodoListFooter_viewer
28+
}
29+
30+
class TodoListFooter extends React.Component<Props> {
2231
_handleRemoveCompletedTodosClick = () => {
2332
RemoveCompletedTodosMutation.commit(
2433
this.props.relay.environment,
@@ -27,8 +36,8 @@ class TodoListFooter extends React.Component {
2736
);
2837
};
2938
render() {
30-
const numCompletedTodos = this.props.viewer.completedCount;
31-
const numRemainingTodos = this.props.viewer.totalCount - numCompletedTodos;
39+
const numCompletedTodos = this.props.viewer.completedCount || 0;
40+
const numRemainingTodos = (this.props.viewer.totalCount || 0) - numCompletedTodos;
3241
return (
3342
<footer className="footer">
3443
<span className="todo-count">

0 commit comments

Comments
 (0)