From 796d24db3d2f8b129341431c216f43b736f4cb3e Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Mon, 2 Jul 2018 19:13:13 -0300
Subject: [PATCH 01/31] Use pagination container
---
.../lib/relay/withPaginationContainer.ts | 15 ++-
src/core/client/stream/components/App.tsx | 12 +-
.../stream/components/PostCommentForm.css | 7 +-
.../stream/components/PostCommentForm.tsx | 12 +-
src/core/client/stream/components/Stream.tsx | 22 +++-
.../client/stream/containers/AppContainer.tsx | 6 +-
.../containers/PostCommentFormContainer.tsx | 2 +
.../stream/containers/StreamContainer.tsx | 108 +++++++++++++++---
.../server/graph/tenant/schema/schema.graphql | 5 +-
src/core/server/models/comment.ts | 1 +
src/core/server/models/connection.ts | 1 +
11 files changed, 148 insertions(+), 43 deletions(-)
diff --git a/src/core/client/framework/lib/relay/withPaginationContainer.ts b/src/core/client/framework/lib/relay/withPaginationContainer.ts
index 5f768c0a7..9c669123b 100644
--- a/src/core/client/framework/lib/relay/withPaginationContainer.ts
+++ b/src/core/client/framework/lib/relay/withPaginationContainer.ts
@@ -1,10 +1,23 @@
import {
- ConnectionConfig,
+ ConnectionConfig as OrigConnectionConfig,
createPaginationContainer,
GraphQLTaggedNode,
+ PageInfo,
RelayPaginationProp,
} from "react-relay";
import { InferableComponentEnhancerWithProps } from "recompose";
+import { Overwrite } from "talk-framework/types";
+
+// TODO: (cvle) Fix this type definition upstream.
+interface ConnectionData {
+ edges?: Readonly;
+ pageInfo?: PageInfo;
+}
+
+type ConnectionConfig = Overwrite<
+ OrigConnectionConfig,
+ { getConnectionFromProps?(props: T): ConnectionData | undefined | null }
+>;
/**
* withPaginationContainer is a curried version of `createPaginationContainers`
diff --git a/src/core/client/stream/components/App.tsx b/src/core/client/stream/components/App.tsx
index dde8e386c..3e2dc2692 100644
--- a/src/core/client/stream/components/App.tsx
+++ b/src/core/client/stream/components/App.tsx
@@ -4,17 +4,11 @@ import { StatelessComponent } from "react";
import { Center } from "talk-ui/components";
import AssetListContainer from "../containers/AssetListContainer";
-import PostCommentFormContainer from "../containers/PostCommentFormContainer";
import StreamContainer from "../containers/StreamContainer";
-import Logo from "./Logo";
export interface AppProps {
assets?: any | null;
- asset?: {
- id: string;
- isClosed: boolean;
- comments: any | null;
- } | null;
+ asset?: {} | null;
}
const App: StatelessComponent = props => {
@@ -24,9 +18,7 @@ const App: StatelessComponent = props => {
if (props.asset) {
return (
-
-
-
+
);
}
diff --git a/src/core/client/stream/components/PostCommentForm.css b/src/core/client/stream/components/PostCommentForm.css
index a536dcc8b..c776ca7c8 100644
--- a/src/core/client/stream/components/PostCommentForm.css
+++ b/src/core/client/stream/components/PostCommentForm.css
@@ -7,6 +7,7 @@
margin-bottom: calc(2px * $spacing-unit);
}
-.postButton {
- float: right;
-}
+.postButtonContainer {
+ display: flex;
+ justify-content: flex-end;
+}
\ No newline at end of file
diff --git a/src/core/client/stream/components/PostCommentForm.tsx b/src/core/client/stream/components/PostCommentForm.tsx
index 2187994be..018cc71dd 100644
--- a/src/core/client/stream/components/PostCommentForm.tsx
+++ b/src/core/client/stream/components/PostCommentForm.tsx
@@ -39,11 +39,13 @@ const PostCommentForm: StatelessComponent = props => (
)}
-
+
+
+
)}
diff --git a/src/core/client/stream/components/Stream.tsx b/src/core/client/stream/components/Stream.tsx
index c42bb21b3..ccda84eea 100644
--- a/src/core/client/stream/components/Stream.tsx
+++ b/src/core/client/stream/components/Stream.tsx
@@ -1,18 +1,36 @@
import * as React from "react";
import { StatelessComponent } from "react";
-import CommentContainer from "../containers/CommentContainer";
+import Logo from "talk-stream/components/Logo";
+import CommentContainer from "talk-stream/containers/CommentContainer";
+import PostCommentFormContainer from "talk-stream/containers/PostCommentFormContainer";
+import { Button } from "talk-ui/components";
export interface StreamProps {
- comments: ReadonlyArray<{ id: string }>;
+ id: string;
+ isClosed: boolean;
+ comments: ReadonlyArray<{ id: string }> | null;
+ onLoadMore: () => void;
+ hasMore: boolean;
}
const Stream: StatelessComponent = props => {
+ if (props.comments === null) {
+ // TODO: (@cvle) What's the reason for this being null?
+ return Comments unavailable
;
+ }
return (
+
+
{props.comments.map(comment => (
))}
+ {props.hasMore && (
+
+ Load More
+
+ )}
);
};
diff --git a/src/core/client/stream/containers/AppContainer.tsx b/src/core/client/stream/containers/AppContainer.tsx
index 02abbf314..256d860b4 100644
--- a/src/core/client/stream/containers/AppContainer.tsx
+++ b/src/core/client/stream/containers/AppContainer.tsx
@@ -26,11 +26,7 @@ const enhanced = withFragmentContainer<{ data: Data }>(
...AssetListContainer_assets
}
asset(id: $assetID) @skip(if: $showAssetList) {
- id
- isClosed
- comments {
- ...StreamContainer_comments
- }
+ ...StreamContainer_asset
}
}
`
diff --git a/src/core/client/stream/containers/PostCommentFormContainer.tsx b/src/core/client/stream/containers/PostCommentFormContainer.tsx
index d2da26f64..bf4ab8cf9 100644
--- a/src/core/client/stream/containers/PostCommentFormContainer.tsx
+++ b/src/core/client/stream/containers/PostCommentFormContainer.tsx
@@ -25,6 +25,8 @@ class PostCommentFormContainer extends Component {
if (error instanceof BadUserInputError) {
return error.invalidArgsLocalized;
}
+ // tslint:disable-next-line:no-console
+ console.error(error);
}
return undefined;
};
diff --git a/src/core/client/stream/containers/StreamContainer.tsx b/src/core/client/stream/containers/StreamContainer.tsx
index 771c25efa..8660dc7bb 100644
--- a/src/core/client/stream/containers/StreamContainer.tsx
+++ b/src/core/client/stream/containers/StreamContainer.tsx
@@ -1,32 +1,108 @@
-import React, { StatelessComponent } from "react";
-import { graphql } from "react-relay";
+import React from "react";
+import { graphql, RelayPaginationProp } from "react-relay";
-import { withFragmentContainer } from "talk-framework/lib/relay";
+import { withPaginationContainer } from "talk-framework/lib/relay";
import { PropTypesOf } from "talk-framework/types";
-import { StreamContainer_comments as Data } from "talk-stream/__generated__/StreamContainer_comments.graphql";
+import { StreamContainer_asset as Data } from "talk-stream/__generated__/StreamContainer_asset.graphql";
import Stream from "../components/Stream";
interface InnerProps {
- comments: Data;
+ asset: Data;
+ relay: RelayPaginationProp;
}
-const StreamContainer: StatelessComponent = props => {
- const comments = props.comments.edges.map(edge => edge.node);
- return ;
-};
+class StreamContainer extends React.Component {
+ public render() {
+ const comments = this.props.asset.comments
+ ? this.props.asset.comments.edges.map(edge => edge.node)
+ : null;
+ return (
+
+ );
+ }
-const enhanced = withFragmentContainer<{ comments: Data }>(
+ private loadMore = () => {
+ if (!this.props.relay.hasMore() || this.props.relay.isLoading()) {
+ return;
+ }
+
+ this.props.relay.loadMore(
+ 10, // Fetch the next 10 feed items
+ error => {
+ if (error) {
+ // tslint:disable-next-line:no-console
+ console.error(error);
+ }
+ }
+ );
+ };
+}
+
+const enhanced = withPaginationContainer<{ asset: Data }, InnerProps>(
graphql`
- fragment StreamContainer_comments on CommentsConnection {
- edges {
- node {
- id
- ...CommentContainer
+ fragment StreamContainer_asset on Asset
+ @argumentDefinitions(
+ count: { type: "Int", defaultValue: 5 }
+ cursor: { type: "Cursor" }
+ orderBy: { type: "COMMENT_SORT", defaultValue: CREATED_AT_DESC }
+ ) {
+ id
+ isClosed
+ comments(first: $count, after: $cursor, orderBy: $orderBy)
+ @connection(key: "Stream_comments") {
+ edges {
+ node {
+ id
+ ...CommentContainer
+ }
}
}
}
- `
+ `,
+ {
+ direction: "forward",
+ getConnectionFromProps(props) {
+ return props.asset && props.asset.comments;
+ },
+ // This is also the default implementation of `getFragmentVariables` if it isn't provided.
+ getFragmentVariables(prevVars, totalCount) {
+ return {
+ ...prevVars,
+ count: totalCount,
+ };
+ },
+ getVariables(props, { count, cursor }, fragmentVariables) {
+ return {
+ count,
+ cursor,
+ orderBy: fragmentVariables.orderBy,
+ // assetID isn't specified as an @argument for the fragment, but it should be a
+ // variable available for the fragment under the query root.
+ assetID: props.asset.id,
+ };
+ },
+ query: graphql`
+ # Pagination query to be fetched upon calling 'loadMore'.
+ # Notice that we re-use our fragment, and the shape of this query matches our fragment spec.
+ query StreamContainerPaginationQuery(
+ $count: Int!
+ $cursor: Cursor
+ $orderBy: COMMENT_SORT!
+ $assetID: ID!
+ ) {
+ asset(id: $assetID) {
+ ...StreamContainer_asset
+ @arguments(count: $count, cursor: $cursor, orderBy: $orderBy)
+ }
+ }
+ `,
+ }
)(StreamContainer);
export type StreamContainerProps = PropTypesOf;
diff --git a/src/core/server/graph/tenant/schema/schema.graphql b/src/core/server/graph/tenant/schema/schema.graphql
index eb060b6a4..b3bfb94eb 100644
--- a/src/core/server/graph/tenant/schema/schema.graphql
+++ b/src/core/server/graph/tenant/schema/schema.graphql
@@ -232,7 +232,10 @@ type PageInfo {
"""
Indicates that there are more nodes after this subset.
"""
- hasNextPage: Boolean!
+ hasNextPage: Boolean
+ hasPreviousPage: Boolean
+ startCursor: Cursor
+ endCursor: Cursor
}
"""
diff --git a/src/core/server/models/comment.ts b/src/core/server/models/comment.ts
index 81d046159..ca20647a5 100644
--- a/src/core/server/models/comment.ts
+++ b/src/core/server/models/comment.ts
@@ -280,6 +280,7 @@ async function retrieveConnection(
edges,
pageInfo: {
hasNextPage,
+ endCursor: (nodes.length && nodes[nodes.length - 1].created_at) || null,
},
};
diff --git a/src/core/server/models/connection.ts b/src/core/server/models/connection.ts
index 9ed8cac2b..cc69d1f2c 100644
--- a/src/core/server/models/connection.ts
+++ b/src/core/server/models/connection.ts
@@ -7,6 +7,7 @@ export interface Edge {
export interface PageInfo {
hasNextPage: boolean;
+ endCursor: Cursor;
}
export interface Connection {
From 9f79ee1c6da9e9f5d1acce21111bc34d8e6dbe37 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Wed, 4 Jul 2018 15:01:47 -0300
Subject: [PATCH 02/31] Better relay types
---
.../lib/relay/withFragmentContainer.ts | 2 +-
.../lib/relay/withLocalStateContainer.tsx | 11 ++++--
.../lib/relay/withPaginationContainer.ts | 2 +-
.../lib/relay/withRefetchContainer.ts | 2 +-
.../client/stream/containers/AppContainer.tsx | 8 ++---
.../stream/containers/AssetListContainer.tsx | 8 ++---
.../stream/containers/CommentContainer.tsx | 8 ++---
.../stream/containers/StreamContainer.tsx | 36 ++++++++++---------
8 files changed, 42 insertions(+), 35 deletions(-)
diff --git a/src/core/client/framework/lib/relay/withFragmentContainer.ts b/src/core/client/framework/lib/relay/withFragmentContainer.ts
index c4636fe3c..2541b2001 100644
--- a/src/core/client/framework/lib/relay/withFragmentContainer.ts
+++ b/src/core/client/framework/lib/relay/withFragmentContainer.ts
@@ -6,7 +6,7 @@ import { InferableComponentEnhancerWithProps } from "recompose";
* from Relay.
*/
export default (
- fragmentSpec: GraphQLTaggedNode
+ fragmentSpec: { [P in keyof T]: GraphQLTaggedNode }
): InferableComponentEnhancerWithProps => (
component: React.ComponentType
) => createFragmentContainer(component, fragmentSpec) as any;
diff --git a/src/core/client/framework/lib/relay/withLocalStateContainer.tsx b/src/core/client/framework/lib/relay/withLocalStateContainer.tsx
index d08aa5d55..9de4180bb 100644
--- a/src/core/client/framework/lib/relay/withLocalStateContainer.tsx
+++ b/src/core/client/framework/lib/relay/withLocalStateContainer.tsx
@@ -1,6 +1,11 @@
import * as React from "react";
import { compose, hoistStatics, InferableComponentEnhancer } from "recompose";
-import { CSelector, CSnapshot, Environment } from "relay-runtime";
+import {
+ CSelector,
+ CSnapshot,
+ Environment,
+ GraphQLTaggedNode,
+} from "relay-runtime";
import { withContext } from "../bootstrap";
@@ -25,7 +30,7 @@ export const LOCAL_ID = "client:root.local";
* must have the `LOCAL_ID`.
*/
function withLocalStateContainer(
- fragmentSpec: any
+ fragmentSpec: GraphQLTaggedNode
): InferableComponentEnhancer<{ local: T }> {
return compose(
withContext(({ relayEnvironment }) => ({ relayEnvironment })),
@@ -33,7 +38,7 @@ function withLocalStateContainer(
class LocalStateContainer extends React.Component {
constructor(props: Props) {
super(props);
- const fragment = fragmentSpec.data().default;
+ const fragment = (fragmentSpec as any).data().default;
if (fragment.kind !== "Fragment") {
throw new Error("Expected fragment");
}
diff --git a/src/core/client/framework/lib/relay/withPaginationContainer.ts b/src/core/client/framework/lib/relay/withPaginationContainer.ts
index 9c669123b..a5d8e1231 100644
--- a/src/core/client/framework/lib/relay/withPaginationContainer.ts
+++ b/src/core/client/framework/lib/relay/withPaginationContainer.ts
@@ -24,7 +24,7 @@ type ConnectionConfig = Overwrite<
* from Relay.
*/
export default (
- fragmentSpec: GraphQLTaggedNode,
+ fragmentSpec: { [P in keyof T]: GraphQLTaggedNode },
connectionConfig: ConnectionConfig
): InferableComponentEnhancerWithProps<
T & { relay: RelayPaginationProp },
diff --git a/src/core/client/framework/lib/relay/withRefetchContainer.ts b/src/core/client/framework/lib/relay/withRefetchContainer.ts
index 7d11e0e16..9e9989758 100644
--- a/src/core/client/framework/lib/relay/withRefetchContainer.ts
+++ b/src/core/client/framework/lib/relay/withRefetchContainer.ts
@@ -10,7 +10,7 @@ import { InferableComponentEnhancerWithProps } from "recompose";
* from Relay.
*/
export default (
- fragmentSpec: GraphQLTaggedNode,
+ fragmentSpec: { [P in keyof T]: GraphQLTaggedNode },
refetchQuery: GraphQLTaggedNode
): InferableComponentEnhancerWithProps<
T & { relay: RelayRefetchProp },
diff --git a/src/core/client/stream/containers/AppContainer.tsx b/src/core/client/stream/containers/AppContainer.tsx
index 256d860b4..89acdea38 100644
--- a/src/core/client/stream/containers/AppContainer.tsx
+++ b/src/core/client/stream/containers/AppContainer.tsx
@@ -15,8 +15,8 @@ const AppContainer: StatelessComponent = props => {
return ;
};
-const enhanced = withFragmentContainer<{ data: Data }>(
- graphql`
+const enhanced = withFragmentContainer<{ data: Data }>({
+ data: graphql`
fragment AppContainer on Query
@argumentDefinitions(
assetID: { type: "ID!" }
@@ -29,8 +29,8 @@ const enhanced = withFragmentContainer<{ data: Data }>(
...StreamContainer_asset
}
}
- `
-)(AppContainer);
+ `,
+})(AppContainer);
export type AppContainerProps = PropTypesOf;
export default enhanced;
diff --git a/src/core/client/stream/containers/AssetListContainer.tsx b/src/core/client/stream/containers/AssetListContainer.tsx
index 6e441f00e..42345cc16 100644
--- a/src/core/client/stream/containers/AssetListContainer.tsx
+++ b/src/core/client/stream/containers/AssetListContainer.tsx
@@ -16,8 +16,8 @@ const AssetListContainer: StatelessComponent = props => {
return ;
};
-const enhanced = withFragmentContainer<{ assets: Data }>(
- graphql`
+const enhanced = withFragmentContainer<{ assets: Data }>({
+ assets: graphql`
fragment AssetListContainer_assets on AssetsConnection {
edges {
node {
@@ -26,8 +26,8 @@ const enhanced = withFragmentContainer<{ assets: Data }>(
}
}
}
- `
-)(AssetListContainer);
+ `,
+})(AssetListContainer);
export type AssetListContainerProps = PropTypesOf;
export default enhanced;
diff --git a/src/core/client/stream/containers/CommentContainer.tsx b/src/core/client/stream/containers/CommentContainer.tsx
index 9a4d03cd8..e80793e49 100644
--- a/src/core/client/stream/containers/CommentContainer.tsx
+++ b/src/core/client/stream/containers/CommentContainer.tsx
@@ -14,16 +14,16 @@ const CommentContainer: StatelessComponent = props => {
return ;
};
-const enhanced = withFragmentContainer<{ data: Data }>(
- graphql`
+const enhanced = withFragmentContainer<{ data: Data }>({
+ data: graphql`
fragment CommentContainer on Comment {
author {
username
}
body
}
- `
-)(CommentContainer);
+ `,
+})(CommentContainer);
export type CommentContainerProps = PropTypesOf;
export default enhanced;
diff --git a/src/core/client/stream/containers/StreamContainer.tsx b/src/core/client/stream/containers/StreamContainer.tsx
index 8660dc7bb..2ef8d72b5 100644
--- a/src/core/client/stream/containers/StreamContainer.tsx
+++ b/src/core/client/stream/containers/StreamContainer.tsx
@@ -45,26 +45,28 @@ class StreamContainer extends React.Component {
}
const enhanced = withPaginationContainer<{ asset: Data }, InnerProps>(
- graphql`
- fragment StreamContainer_asset on Asset
- @argumentDefinitions(
- count: { type: "Int", defaultValue: 5 }
- cursor: { type: "Cursor" }
- orderBy: { type: "COMMENT_SORT", defaultValue: CREATED_AT_DESC }
- ) {
- id
- isClosed
- comments(first: $count, after: $cursor, orderBy: $orderBy)
- @connection(key: "Stream_comments") {
- edges {
- node {
- id
- ...CommentContainer
+ {
+ asset: graphql`
+ fragment StreamContainer_asset on Asset
+ @argumentDefinitions(
+ count: { type: "Int", defaultValue: 5 }
+ cursor: { type: "Cursor" }
+ orderBy: { type: "COMMENT_SORT", defaultValue: CREATED_AT_DESC }
+ ) {
+ id
+ isClosed
+ comments(first: $count, after: $cursor, orderBy: $orderBy)
+ @connection(key: "Stream_comments") {
+ edges {
+ node {
+ id
+ ...CommentContainer
+ }
}
}
}
- }
- `,
+ `,
+ },
{
direction: "forward",
getConnectionFromProps(props) {
From 94588951d3ed5efda25e2950350effb7442a2922 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Wed, 4 Jul 2018 17:16:51 -0300
Subject: [PATCH 03/31] Cleanup Relay Types
---
package-lock.json | 11 ++------
package.json | 2 +-
.../framework/lib/relay/QueryRenderer.tsx | 28 ++++++++-----------
.../lib/relay/withPaginationContainer.ts | 15 +---------
.../stream/containers/StreamContainer.tsx | 4 +--
src/core/client/stream/queries/AppQuery.tsx | 2 +-
6 files changed, 19 insertions(+), 43 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 6038504da..ad599b648 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1628,14 +1628,9 @@
}
},
"@types/react-relay": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/@types/react-relay/-/react-relay-1.3.6.tgz",
- "integrity": "sha512-X0qv3nGlE4TStFLLKxgj+6MgHZEExB1N/RDcVcyCauAojV5byD0c6VhuqAluYaTKaL2FBuxdtDL405IhIIjEbQ==",
- "dev": true,
- "requires": {
- "@types/react": "*",
- "@types/relay-runtime": "*"
- }
+ "version": "github:coralproject/patched#ba4c8d01bb737e5f073534b32d870294e39cc5a8",
+ "from": "github:coralproject/patched#types/react-relay",
+ "dev": true
},
"@types/recompose": {
"version": "0.26.1",
diff --git a/package.json b/package.json
index 707d65836..c6f02b53d 100644
--- a/package.json
+++ b/package.json
@@ -72,7 +72,7 @@
"@types/passport": "^0.4.5",
"@types/query-string": "^6.1.0",
"@types/react-dom": "^16.0.6",
- "@types/react-relay": "^1.3.6",
+ "@types/react-relay": "github:coralproject/patched#types/react-relay",
"@types/recompose": "^0.26.1",
"@types/relay-runtime": "github:coralproject/patched#types/relay-runtime",
"@types/uuid": "^3.4.3",
diff --git a/src/core/client/framework/lib/relay/QueryRenderer.tsx b/src/core/client/framework/lib/relay/QueryRenderer.tsx
index 30a42dbe0..a5845c0b6 100644
--- a/src/core/client/framework/lib/relay/QueryRenderer.tsx
+++ b/src/core/client/framework/lib/relay/QueryRenderer.tsx
@@ -1,24 +1,18 @@
import React, { Component } from "react";
-import { QueryRenderer } from "react-relay";
-import { CacheConfig, GraphQLTaggedNode, RerunParam } from "relay-runtime";
+import {
+ QueryRenderer,
+ QueryRendererProps as QueryRendererPropsOrig,
+} from "react-relay";
+
+import { Omit } from "talk-framework/types";
import { TalkContextConsumer } from "../bootstrap/TalkContext";
-// Taken from relay types and added Generic support for Variables and Response
-export interface QueryRendererProps {
- cacheConfig?: CacheConfig;
- query?: GraphQLTaggedNode | null;
- render(readyState: ReadyState): React.ReactElement | undefined | null;
- variables: V;
- rerunParamExperimental?: RerunParam;
-}
-
-// Taken from relay types and added Generic support for Variables and Response
-export interface ReadyState {
- error: Error | undefined | null;
- props: R | undefined | null;
- retry?(): void;
-}
+// Omit environment as we are passing this from the context.
+export type QueryRendererProps = Omit<
+ QueryRendererPropsOrig,
+ "environment"
+>;
/**
* TalkQueryRenderer is a wrappper around Relay's `QueryRenderer`.
diff --git a/src/core/client/framework/lib/relay/withPaginationContainer.ts b/src/core/client/framework/lib/relay/withPaginationContainer.ts
index a5d8e1231..0d01887b5 100644
--- a/src/core/client/framework/lib/relay/withPaginationContainer.ts
+++ b/src/core/client/framework/lib/relay/withPaginationContainer.ts
@@ -1,23 +1,10 @@
import {
- ConnectionConfig as OrigConnectionConfig,
+ ConnectionConfig,
createPaginationContainer,
GraphQLTaggedNode,
- PageInfo,
RelayPaginationProp,
} from "react-relay";
import { InferableComponentEnhancerWithProps } from "recompose";
-import { Overwrite } from "talk-framework/types";
-
-// TODO: (cvle) Fix this type definition upstream.
-interface ConnectionData {
- edges?: Readonly;
- pageInfo?: PageInfo;
-}
-
-type ConnectionConfig = Overwrite<
- OrigConnectionConfig,
- { getConnectionFromProps?(props: T): ConnectionData | undefined | null }
->;
/**
* withPaginationContainer is a curried version of `createPaginationContainers`
diff --git a/src/core/client/stream/containers/StreamContainer.tsx b/src/core/client/stream/containers/StreamContainer.tsx
index 2ef8d72b5..63920a410 100644
--- a/src/core/client/stream/containers/StreamContainer.tsx
+++ b/src/core/client/stream/containers/StreamContainer.tsx
@@ -49,9 +49,9 @@ const enhanced = withPaginationContainer<{ asset: Data }, InnerProps>(
asset: graphql`
fragment StreamContainer_asset on Asset
@argumentDefinitions(
- count: { type: "Int", defaultValue: 5 }
+ count: { type: "Int!", defaultValue: 5 }
cursor: { type: "Cursor" }
- orderBy: { type: "COMMENT_SORT", defaultValue: CREATED_AT_DESC }
+ orderBy: { type: "COMMENT_SORT!", defaultValue: CREATED_AT_DESC }
) {
id
isClosed
diff --git a/src/core/client/stream/queries/AppQuery.tsx b/src/core/client/stream/queries/AppQuery.tsx
index 4dc61115c..96d260568 100644
--- a/src/core/client/stream/queries/AppQuery.tsx
+++ b/src/core/client/stream/queries/AppQuery.tsx
@@ -1,10 +1,10 @@
import * as React from "react";
import { StatelessComponent } from "react";
+import { ReadyState } from "react-relay";
import {
graphql,
QueryRenderer,
- ReadyState,
withLocalStateContainer,
} from "talk-framework/lib/relay";
import {
From 67790ac9e1ac1fe84f4dc453c1c7d130b44979a3 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Wed, 4 Jul 2018 17:24:05 -0300
Subject: [PATCH 04/31] Strict typing for pagination container
---
.../lib/relay/withPaginationContainer.ts | 8 ++++++--
.../stream/containers/StreamContainer.tsx | 18 +++++++++++++++++-
2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/src/core/client/framework/lib/relay/withPaginationContainer.ts b/src/core/client/framework/lib/relay/withPaginationContainer.ts
index 0d01887b5..bb2740d01 100644
--- a/src/core/client/framework/lib/relay/withPaginationContainer.ts
+++ b/src/core/client/framework/lib/relay/withPaginationContainer.ts
@@ -10,9 +10,13 @@ import { InferableComponentEnhancerWithProps } from "recompose";
* withPaginationContainer is a curried version of `createPaginationContainers`
* from Relay.
*/
-export default (
+export default (
fragmentSpec: { [P in keyof T]: GraphQLTaggedNode },
- connectionConfig: ConnectionConfig
+ connectionConfig: ConnectionConfig<
+ InnerProps,
+ FragmentVariables,
+ QueryVariables
+ >
): InferableComponentEnhancerWithProps<
T & { relay: RelayPaginationProp },
{ [P in keyof T]: any }
diff --git a/src/core/client/stream/containers/StreamContainer.tsx b/src/core/client/stream/containers/StreamContainer.tsx
index 63920a410..0a169ad3a 100644
--- a/src/core/client/stream/containers/StreamContainer.tsx
+++ b/src/core/client/stream/containers/StreamContainer.tsx
@@ -4,6 +4,10 @@ import { graphql, RelayPaginationProp } from "react-relay";
import { withPaginationContainer } from "talk-framework/lib/relay";
import { PropTypesOf } from "talk-framework/types";
import { StreamContainer_asset as Data } from "talk-stream/__generated__/StreamContainer_asset.graphql";
+import {
+ COMMENT_SORT,
+ StreamContainerPaginationQueryVariables,
+} from "talk-stream/__generated__/StreamContainerPaginationQuery.graphql";
import Stream from "../components/Stream";
@@ -44,7 +48,19 @@ class StreamContainer extends React.Component {
};
}
-const enhanced = withPaginationContainer<{ asset: Data }, InnerProps>(
+// TODO: (cvle) This should be autogenerated.
+interface FragmentVariables {
+ count: number;
+ cursor?: string;
+ orderBy: COMMENT_SORT;
+}
+
+const enhanced = withPaginationContainer<
+ { asset: Data },
+ InnerProps,
+ FragmentVariables,
+ StreamContainerPaginationQueryVariables
+>(
{
asset: graphql`
fragment StreamContainer_asset on Asset
From bdd4702a8f7b9d0d591f36b5f2af396ef623f39d Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Wed, 4 Jul 2018 17:26:37 -0300
Subject: [PATCH 05/31] Invert and full width
---
src/core/client/stream/components/Stream.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/core/client/stream/components/Stream.tsx b/src/core/client/stream/components/Stream.tsx
index ccda84eea..454b1f38f 100644
--- a/src/core/client/stream/components/Stream.tsx
+++ b/src/core/client/stream/components/Stream.tsx
@@ -27,7 +27,7 @@ const Stream: StatelessComponent = props => {
))}
{props.hasMore && (
-
+
Load More
)}
From ea6eaee0d74b90470f7709fe28f7c9174e94d47d Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Wed, 4 Jul 2018 19:02:03 -0300
Subject: [PATCH 06/31] Make jest testing work with custom path and css modules
---
config/jest.config.js | 9 +-
config/jest/cssTransform.js | 96 ++++++++++++++--
package-lock.json | 224 ++++++++++++++++++++----------------
package.json | 4 +-
4 files changed, 226 insertions(+), 107 deletions(-)
diff --git a/config/jest.config.js b/config/jest.config.js
index 682a2c8a4..ed9b641ae 100644
--- a/config/jest.config.js
+++ b/config/jest.config.js
@@ -8,7 +8,7 @@ module.exports = {
setupFiles: ["/config/polyfills.js"],
testMatch: [
"**/__tests__/**/*.{js,jsx,mjs,ts,tsx}",
- "**/*.(spec|test).{js,jsx,mjs,ts,tsx}",
+ "**/*.spec.{js,jsx,mjs,ts,tsx}",
],
testEnvironment: "node",
testURL: "http://localhost",
@@ -22,7 +22,12 @@ module.exports = {
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs|ts|tsx)$",
],
moduleNameMapper: {
- "^react-native$": "react-native-web",
+ "^talk-admin/(.*)$": "/src/core/client/admin/$1",
+ "^talk-ui/(.*)$": "/src/core/client/ui/$1",
+ "^talk-stream/(.*)$": "/src/core/client/stream/$1",
+ "^talk-framework/(.*)$": "/src/core/client/framework/$1",
+ "^talk-common/(.*)$": "/src/core/common/$1",
+ "^talk-server/(.*)$": "/src/core/server/$1",
},
moduleFileExtensions: [
"web.js",
diff --git a/config/jest/cssTransform.js b/config/jest/cssTransform.js
index 606cc276b..da313e9ea 100644
--- a/config/jest/cssTransform.js
+++ b/config/jest/cssTransform.js
@@ -1,14 +1,94 @@
"use strict";
-// This is a custom Jest transformer turning style imports into empty objects.
-// http://facebook.github.io/jest/docs/en/webpack.html
+// Adapted version of https://github.com/Connormiha/jest-css-modules-transform
+// Copyright https://github.com/Connormiha/jest-css-modules-transform/graphs/contributors
+// This oututs `module.exports = cssObject` instead of `module.defaults = cssObject`;
+
+const { sep: pathSep, resolve } = require("path");
+const postcss = require("postcss");
+const postcssNested = postcss([require("postcss-nested")]);
+
+const REG_EXP_NAME_BREAK_CHAR = /[\s,.{/#[:]/;
+
+const getCSSSelectors = (css, path) => {
+ const end = css.length;
+ let i = 0;
+ let char;
+ let bracketsCount = 0;
+ const result = {};
+
+ while (i < end) {
+ if (i === -1) {
+ throw Error(`Parse error ${path}`);
+ }
+ if (css.indexOf("/*", i) === i) {
+ i = css.indexOf("*/", i + 2);
+ // Unclosed comment. Break to avoid infinity loop
+ if (i === -1) {
+ // Don't parse, but save collected result
+ return result;
+ }
+ continue;
+ }
+ char = css[i];
+ if (char === "{") {
+ bracketsCount++;
+ i++;
+ continue;
+ }
+ if (char === "}") {
+ bracketsCount--;
+ i++;
+ continue;
+ }
+ if (char === '"' || char === "'") {
+ do {
+ i = css.indexOf(char, i + 1);
+ // Syntax error since this line. Don't parse, but save collected result
+ if (i === -1) {
+ return result;
+ }
+ } while (css[i - 1] === "\\");
+ i++;
+ continue;
+ }
+ if (bracketsCount > 0) {
+ i++;
+ continue;
+ }
+ if (char === "." || char === "#") {
+ i++;
+ const startWord = i;
+ while (!REG_EXP_NAME_BREAK_CHAR.test(css[i])) {
+ i++;
+ }
+ const word = css.slice(startWord, i);
+ result[word] = word;
+ continue;
+ }
+ if (css.indexOf("@keyframes", i) === i) {
+ i += 10;
+ while (REG_EXP_NAME_BREAK_CHAR.test(css[i])) {
+ i++;
+ }
+ const startWord = i;
+ while (!REG_EXP_NAME_BREAK_CHAR.test(css[i])) {
+ i++;
+ }
+ const word = css.slice(startWord, i);
+ result[word] = word;
+ continue;
+ }
+ i++;
+ }
+ return result;
+};
module.exports = {
- process() {
- return "module.exports = {};";
- },
- getCacheKey() {
- // The output is always the same.
- return "cssTransform";
+ process(src, path, config) {
+ const filename = path.slice(path.lastIndexOf(pathSep) + 1);
+ const textCSS = postcssNested.process(src).css;
+ const exprt = JSON.stringify(getCSSSelectors(textCSS, path));
+ return `module.exports = ${exprt}`;
},
};
diff --git a/package-lock.json b/package-lock.json
index ad599b648..c6dd91c93 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1632,6 +1632,15 @@
"from": "github:coralproject/patched#types/react-relay",
"dev": true
},
+ "@types/react-test-renderer": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.0.1.tgz",
+ "integrity": "sha512-kmNh8g67Ck/y/vp6KX+4JTJXiTGLZBylNhu+R7sm7zcvsrnIGVO6J1zew5inVg428j9f8yHpl68RcYOZXVborQ==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
"@types/recompose": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/@types/recompose/-/recompose-0.26.1.tgz",
@@ -7630,17 +7639,17 @@
}
},
"expect": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-23.2.0.tgz",
- "integrity": "sha1-U6fhNeNv4n51hnsReP8IqqzCsN0=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-23.3.0.tgz",
+ "integrity": "sha1-7LBRrcvcQKxNtXbBYGfxL9sTzGE=",
"dev": true,
"requires": {
"ansi-styles": "^3.2.0",
"jest-diff": "^23.2.0",
"jest-get-type": "^22.1.0",
"jest-matcher-utils": "^23.2.0",
- "jest-message-util": "^23.2.0",
- "jest-regex-util": "^23.0.0"
+ "jest-message-util": "^23.3.0",
+ "jest-regex-util": "^23.3.0"
},
"dependencies": {
"ansi-styles": {
@@ -10830,13 +10839,13 @@
"dev": true
},
"jest": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-23.2.0.tgz",
- "integrity": "sha1-govzGgltRdzwaCTR6gMBOve8/CA=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-23.3.0.tgz",
+ "integrity": "sha1-E1XNeS84zyD7pNoC3dt8oU2UhLU=",
"dev": true,
"requires": {
"import-local": "^1.0.0",
- "jest-cli": "^23.2.0"
+ "jest-cli": "^23.3.0"
},
"dependencies": {
"ansi-regex": {
@@ -10860,9 +10869,9 @@
}
},
"jest-cli": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.2.0.tgz",
- "integrity": "sha1-O1Q6PaUUXdiTeTEBcoI3n8aWxFs=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.3.0.tgz",
+ "integrity": "sha1-MH6b53M0Q7eJqCedaUBU0FGp5eI=",
"dev": true,
"requires": {
"ansi-escapes": "^3.0.0",
@@ -10877,18 +10886,18 @@
"istanbul-lib-instrument": "^1.10.1",
"istanbul-lib-source-maps": "^1.2.4",
"jest-changed-files": "^23.2.0",
- "jest-config": "^23.2.0",
- "jest-environment-jsdom": "^23.2.0",
+ "jest-config": "^23.3.0",
+ "jest-environment-jsdom": "^23.3.0",
"jest-get-type": "^22.1.0",
"jest-haste-map": "^23.2.0",
- "jest-message-util": "^23.2.0",
- "jest-regex-util": "^23.0.0",
- "jest-resolve-dependencies": "^23.2.0",
- "jest-runner": "^23.2.0",
- "jest-runtime": "^23.2.0",
- "jest-snapshot": "^23.2.0",
- "jest-util": "^23.2.0",
- "jest-validate": "^23.2.0",
+ "jest-message-util": "^23.3.0",
+ "jest-regex-util": "^23.3.0",
+ "jest-resolve-dependencies": "^23.3.0",
+ "jest-runner": "^23.3.0",
+ "jest-runtime": "^23.3.0",
+ "jest-snapshot": "^23.3.0",
+ "jest-util": "^23.3.0",
+ "jest-validate": "^23.3.0",
"jest-watcher": "^23.2.0",
"jest-worker": "^23.2.0",
"micromatch": "^3.1.10",
@@ -10933,23 +10942,23 @@
}
},
"jest-config": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.2.0.tgz",
- "integrity": "sha1-0vtVb9WioZw561bROdzKXa0qHIg=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.3.0.tgz",
+ "integrity": "sha1-u01Ttw+VAPr933GNImq7U7E7gyM=",
"dev": true,
"requires": {
"babel-core": "^6.0.0",
"babel-jest": "^23.2.0",
"chalk": "^2.0.1",
"glob": "^7.1.1",
- "jest-environment-jsdom": "^23.2.0",
- "jest-environment-node": "^23.2.0",
+ "jest-environment-jsdom": "^23.3.0",
+ "jest-environment-node": "^23.3.0",
"jest-get-type": "^22.1.0",
- "jest-jasmine2": "^23.2.0",
- "jest-regex-util": "^23.0.0",
+ "jest-jasmine2": "^23.3.0",
+ "jest-regex-util": "^23.3.0",
"jest-resolve": "^23.2.0",
- "jest-util": "^23.2.0",
- "jest-validate": "^23.2.0",
+ "jest-util": "^23.3.0",
+ "jest-validate": "^23.3.0",
"pretty-format": "^23.2.0"
},
"dependencies": {
@@ -10998,24 +11007,24 @@
}
},
"jest-environment-jsdom": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.2.0.tgz",
- "integrity": "sha1-NjRgOgipdbDKimWDIPVqVKjgRVg=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.3.0.tgz",
+ "integrity": "sha1-GQRX+RyeYVRUxBhgVgZdtu16Tio=",
"dev": true,
"requires": {
"jest-mock": "^23.2.0",
- "jest-util": "^23.2.0",
+ "jest-util": "^23.3.0",
"jsdom": "^11.5.1"
}
},
"jest-environment-node": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.2.0.tgz",
- "integrity": "sha1-tv5BNy44IJO7bz2b32wcTsClDxg=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.3.0.tgz",
+ "integrity": "sha1-Ho3yHIR6pdA7dlc/DcFvzeUDTDI=",
"dev": true,
"requires": {
"jest-mock": "^23.2.0",
- "jest-util": "^23.2.0"
+ "jest-util": "^23.3.0"
}
},
"jest-get-type": {
@@ -11051,21 +11060,21 @@
}
},
"jest-jasmine2": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.2.0.tgz",
- "integrity": "sha1-qmcM2x5NX47HdMlN2l4QX+M9i7Q=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.3.0.tgz",
+ "integrity": "sha1-qHBrqsI8ihMNWqjvVGSp1JCW0bU=",
"dev": true,
"requires": {
"chalk": "^2.0.1",
"co": "^4.6.0",
- "expect": "^23.2.0",
+ "expect": "^23.3.0",
"is-generator-fn": "^1.0.0",
"jest-diff": "^23.2.0",
"jest-each": "^23.2.0",
"jest-matcher-utils": "^23.2.0",
- "jest-message-util": "^23.2.0",
- "jest-snapshot": "^23.2.0",
- "jest-util": "^23.2.0",
+ "jest-message-util": "^23.3.0",
+ "jest-snapshot": "^23.3.0",
+ "jest-util": "^23.3.0",
"pretty-format": "^23.2.0"
}
},
@@ -11090,9 +11099,9 @@
}
},
"jest-message-util": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.2.0.tgz",
- "integrity": "sha1-WR6BSP/2nPibBBSAnHIXVuvv50Q=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.3.0.tgz",
+ "integrity": "sha1-vAexHOxpcftd2d4t+2DrwiFQwWA=",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0-beta.35",
@@ -11109,9 +11118,9 @@
"dev": true
},
"jest-regex-util": {
- "version": "23.0.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.0.0.tgz",
- "integrity": "sha1-3Vwf3gxG9DcTFM8Q96dRoj9Oj3Y=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz",
+ "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=",
"dev": true
},
"jest-resolve": {
@@ -11126,31 +11135,31 @@
}
},
"jest-resolve-dependencies": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.2.0.tgz",
- "integrity": "sha1-bfjVcJxkBmOc0H9Uv/B04BtcBFg=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.3.0.tgz",
+ "integrity": "sha1-hETTsLEoi4CGTYgB/1C0Sk1pXR0=",
"dev": true,
"requires": {
- "jest-regex-util": "^23.0.0",
- "jest-snapshot": "^23.2.0"
+ "jest-regex-util": "^23.3.0",
+ "jest-snapshot": "^23.3.0"
}
},
"jest-runner": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.2.0.tgz",
- "integrity": "sha1-DZGWfqgvcrDHBZEJJghtIFXOda8=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.3.0.tgz",
+ "integrity": "sha1-BMfkWKYXUBpIddsNf/vg48vUO/s=",
"dev": true,
"requires": {
"exit": "^0.1.2",
"graceful-fs": "^4.1.11",
- "jest-config": "^23.2.0",
+ "jest-config": "^23.3.0",
"jest-docblock": "^23.2.0",
"jest-haste-map": "^23.2.0",
- "jest-jasmine2": "^23.2.0",
+ "jest-jasmine2": "^23.3.0",
"jest-leak-detector": "^23.2.0",
- "jest-message-util": "^23.2.0",
- "jest-runtime": "^23.2.0",
- "jest-util": "^23.2.0",
+ "jest-message-util": "^23.3.0",
+ "jest-runtime": "^23.3.0",
+ "jest-util": "^23.3.0",
"jest-worker": "^23.2.0",
"source-map-support": "^0.5.6",
"throat": "^4.0.0"
@@ -11168,9 +11177,9 @@
}
},
"jest-runtime": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.2.0.tgz",
- "integrity": "sha1-YtywF2ahxMZGltwJAgnnbOGq3Lw=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.3.0.tgz",
+ "integrity": "sha1-SGWqtM7/gvnOxjNf164UIswd598=",
"dev": true,
"requires": {
"babel-core": "^6.0.0",
@@ -11180,14 +11189,14 @@
"exit": "^0.1.2",
"fast-json-stable-stringify": "^2.0.0",
"graceful-fs": "^4.1.11",
- "jest-config": "^23.2.0",
+ "jest-config": "^23.3.0",
"jest-haste-map": "^23.2.0",
- "jest-message-util": "^23.2.0",
- "jest-regex-util": "^23.0.0",
+ "jest-message-util": "^23.3.0",
+ "jest-regex-util": "^23.3.0",
"jest-resolve": "^23.2.0",
- "jest-snapshot": "^23.2.0",
- "jest-util": "^23.2.0",
- "jest-validate": "^23.2.0",
+ "jest-snapshot": "^23.3.0",
+ "jest-util": "^23.3.0",
+ "jest-validate": "^23.3.0",
"micromatch": "^3.1.10",
"realpath-native": "^1.0.0",
"slash": "^1.0.0",
@@ -11203,30 +11212,35 @@
"dev": true
},
"jest-snapshot": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.2.0.tgz",
- "integrity": "sha1-x6PQFxd7utYMillYac+QqHguan4=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.3.0.tgz",
+ "integrity": "sha1-/E6fgeRUMtEFB+J/ULzmD0TYFCQ=",
"dev": true,
"requires": {
+ "babel-traverse": "^6.0.0",
+ "babel-types": "^6.0.0",
"chalk": "^2.0.1",
"jest-diff": "^23.2.0",
"jest-matcher-utils": "^23.2.0",
+ "jest-message-util": "^23.3.0",
+ "jest-resolve": "^23.2.0",
"mkdirp": "^0.5.1",
"natural-compare": "^1.4.0",
- "pretty-format": "^23.2.0"
+ "pretty-format": "^23.2.0",
+ "semver": "^5.5.0"
}
},
"jest-util": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.2.0.tgz",
- "integrity": "sha1-YrdwdXaW2W4JSgS48cNzylClqy4=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.3.0.tgz",
+ "integrity": "sha1-efNbsMMBAO9hHZY+5riPjthzqB0=",
"dev": true,
"requires": {
"callsites": "^2.0.0",
"chalk": "^2.0.1",
"graceful-fs": "^4.1.11",
"is-ci": "^1.0.10",
- "jest-message-util": "^23.2.0",
+ "jest-message-util": "^23.3.0",
"mkdirp": "^0.5.1",
"slash": "^1.0.0",
"source-map": "^0.6.0"
@@ -11241,9 +11255,9 @@
}
},
"jest-validate": {
- "version": "23.2.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.2.0.tgz",
- "integrity": "sha1-Z8i5CeEa8XAXZSOIlMZ6wykbGV4=",
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.3.0.tgz",
+ "integrity": "sha1-1Jvqaq2YwwrNLLtUJDR5igzBP3Y=",
"dev": true,
"requires": {
"chalk": "^2.0.1",
@@ -15826,13 +15840,13 @@
"dev": true
},
"prompts": {
- "version": "0.1.9",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.9.tgz",
- "integrity": "sha512-RMRvwAUDVUMhP/z3YfDW6igMwT0UnL+w3XCUUNxxHjgwJnVEdHWYJVjM7hQMPub8HCk12xZYAqWlbgLBnqebwg==",
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.10.tgz",
+ "integrity": "sha512-/MPwms6+g/m6fvXZlQyOL4m4ziDim2+Wc6CdWVjp+nVCkzEkK2N4rR74m/bbGf+dkta+/SBpo1FfES8Wgrk/Fw==",
"dev": true,
"requires": {
- "clorox": "^1.0.1",
- "sisteransi": "^0.1.0"
+ "clorox": "^1.0.3",
+ "sisteransi": "^0.1.1"
}
},
"prop-types": {
@@ -16355,6 +16369,12 @@
"shallowequal": "^1.0.2"
}
},
+ "react-is": {
+ "version": "16.4.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz",
+ "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==",
+ "dev": true
+ },
"react-lifecycles-compat": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
@@ -16455,6 +16475,18 @@
}
}
},
+ "react-test-renderer": {
+ "version": "16.4.1",
+ "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.4.1.tgz",
+ "integrity": "sha512-wyyiPxRZOTpKnNIgUBOB6xPLTpIzwcQMIURhZvzUqZzezvHjaGNsDPBhMac5fIY3Jf5NuKxoGvV64zDSOECPPQ==",
+ "dev": true,
+ "requires": {
+ "fbjs": "^0.8.16",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.0",
+ "react-is": "^16.4.1"
+ }
+ },
"read-pkg": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
@@ -16504,9 +16536,9 @@
}
},
"realpath-native": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz",
- "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.1.tgz",
+ "integrity": "sha512-W14EcXuqUvKP8dkWkD7B95iMy77lpMnlFXbbk409bQtNCbeu0kvRE5reo+yIZ3JXxg6frbGsz2DLQ39lrCB40g==",
"dev": true,
"requires": {
"util.promisify": "^1.0.0"
@@ -17750,9 +17782,9 @@
}
},
"sisteransi": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.0.tgz",
- "integrity": "sha512-kHXcIr0Z9FM6d7pwFDDIMQKGndIEtIF1oBSMXWtItpx4mrH1jhANVNT35GVekBekXl6J+5i7lJMIGq3Gm7pIdA==",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz",
+ "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==",
"dev": true
},
"slash": {
diff --git a/package.json b/package.json
index c6f02b53d..03d25cacd 100644
--- a/package.json
+++ b/package.json
@@ -73,6 +73,7 @@
"@types/query-string": "^6.1.0",
"@types/react-dom": "^16.0.6",
"@types/react-relay": "github:coralproject/patched#types/react-relay",
+ "@types/react-test-renderer": "^16.0.1",
"@types/recompose": "^0.26.1",
"@types/relay-runtime": "github:coralproject/patched#types/relay-runtime",
"@types/uuid": "^3.4.3",
@@ -100,7 +101,7 @@
"fluent-react": "^0.7.0",
"graphql-playground-middleware-express": "^1.7.0",
"html-webpack-plugin": "^3.2.0",
- "jest": "^23.2.0",
+ "jest": "^23.3.0",
"loader-utils": "^1.1.0",
"npm-run-all": "^4.1.3",
"postcss-flexbugs-fixes": "^3.3.1",
@@ -115,6 +116,7 @@
"react-dom": "^16.4.0",
"react-final-form": "^3.6.0",
"react-relay": "github:coralproject/patched#react-relay",
+ "react-test-renderer": "^16.4.1",
"recompose": "^0.27.1",
"relay-compiler": "github:coralproject/patched#relay-compiler",
"relay-compiler-language-typescript": "github:coralproject/patched#relay-compiler-language-typescript",
From e1cf3a06f3f43b616583413f6842ee1e2b95eae8 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Wed, 4 Jul 2018 19:04:12 -0300
Subject: [PATCH 07/31] Add first tests
---
.../client/stream/components/Comment.spec.tsx | 28 +++++++++++++
.../__snapshots__/Comment.spec.tsx.snap | 33 +++++++++++++++
src/core/client/tsconfig.json | 42 ++++---------------
src/tsconfig.json | 25 +++--------
4 files changed, 76 insertions(+), 52 deletions(-)
create mode 100644 src/core/client/stream/components/Comment.spec.tsx
create mode 100644 src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
diff --git a/src/core/client/stream/components/Comment.spec.tsx b/src/core/client/stream/components/Comment.spec.tsx
new file mode 100644
index 000000000..6008bfc3b
--- /dev/null
+++ b/src/core/client/stream/components/Comment.spec.tsx
@@ -0,0 +1,28 @@
+import React from "react";
+import { createRenderer } from "react-test-renderer/shallow";
+import Comment from "./Comment";
+
+it("renders username and body", () => {
+ const props = {
+ author: {
+ username: "Marvin",
+ },
+ body: "Woof",
+ };
+ const renderer = createRenderer();
+ renderer.render( );
+ expect(renderer.getRenderOutput()).toMatchSnapshot();
+});
+
+it("renders with gutterBottom", () => {
+ const props = {
+ author: {
+ username: "Marvin",
+ },
+ body: "Woof",
+ gutterBottom: true,
+ };
+ const renderer = createRenderer();
+ renderer.render( );
+ expect(renderer.getRenderOutput()).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap b/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
new file mode 100644
index 000000000..4b009e257
--- /dev/null
+++ b/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
@@ -0,0 +1,33 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders username and body 1`] = `
+
+
+ Marvin
+
+
+ Woof
+
+
+`;
+
+exports[`renders with gutterBottom 1`] = `
+
+
+ Marvin
+
+
+ Woof
+
+
+`;
diff --git a/src/core/client/tsconfig.json b/src/core/client/tsconfig.json
index ffb2142b6..a62cea6c5 100644
--- a/src/core/client/tsconfig.json
+++ b/src/core/client/tsconfig.json
@@ -5,40 +5,16 @@
"module": "esnext",
"jsx": "preserve",
"allowJs": false,
- "lib": [
- "dom",
- "es7",
- "scripthost",
- "es2015",
- "esnext.asynciterable"
- ],
+ "lib": ["dom", "es7", "scripthost", "es2015", "esnext.asynciterable"],
"baseUrl": "./",
"paths": {
- "talk-admin/*": [
- "./admin/*"
- ],
- "talk-stream/*": [
- "./stream/*"
- ],
- "talk-framework/*": [
- "./framework/*"
- ],
- "talk-ui/*": [
- "./ui/*"
- ],
- "talk-common/*": [
- "../common/*"
- ],
- "talk-locales/*": [
- "../../locales/*"
- ]
+ "talk-admin/*": ["./admin/*"],
+ "talk-stream/*": ["./stream/*"],
+ "talk-framework/*": ["./framework/*"],
+ "talk-ui/*": ["./ui/*"],
+ "talk-common/*": ["../common/*"]
}
},
- "include": [
- "./**/*",
- "../../types/**/*.d.ts"
- ],
- "exclude": [
- "node_modules"
- ]
-}
\ No newline at end of file
+ "include": ["./**/*", "../../types/**/*.d.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/src/tsconfig.json b/src/tsconfig.json
index eddf98d29..857892f4d 100644
--- a/src/tsconfig.json
+++ b/src/tsconfig.json
@@ -9,26 +9,13 @@
"outDir": "../dist",
// See https://github.com/prismagraphql/graphql-request/issues/26 for why we
// have to include "dom" here.
- "lib": [
- "es6",
- "esnext.asynciterable",
- "dom"
- ],
+ "lib": ["es6", "esnext.asynciterable", "dom"],
"baseUrl": "./",
"paths": {
- "talk-server/*": [
- "./core/server/*"
- ],
- "talk-common/*": [
- "./core/common/*"
- ]
+ "talk-server/*": ["./core/server/*"],
+ "talk-common/*": ["./core/common/*"]
}
},
- "include": [
- "./**/*"
- ],
- "exclude": [
- "node_modules",
- "./core/client"
- ]
-}
\ No newline at end of file
+ "include": ["./**/*"],
+ "exclude": ["node_modules", "./core/client"]
+}
From 2c3e53e573ed1de67c9910585aaa3e521c240022 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Thu, 5 Jul 2018 19:11:32 -0300
Subject: [PATCH 08/31] Make Jest work with Relay!
---
config/jest.config.js | 7 +
config/jest/cssTransform.js | 4 -
config/tsconfig.jest.json | 7 +
package-lock.json | 573 +++++++++++------------------
package.json | 3 +-
src/core/client/.babelrc.js | 3 +
src/core/client/stream/.babelrc.js | 1 -
7 files changed, 227 insertions(+), 371 deletions(-)
create mode 100644 config/tsconfig.jest.json
diff --git a/config/jest.config.js b/config/jest.config.js
index ed9b641ae..5cc40eed3 100644
--- a/config/jest.config.js
+++ b/config/jest.config.js
@@ -1,3 +1,4 @@
+const path = require("path");
const paths = require("./paths");
module.exports = {
@@ -40,4 +41,10 @@ module.exports = {
"ts",
"tsx",
],
+ globals: {
+ "ts-jest": {
+ useBabelrc: true,
+ tsConfigFile: path.resolve(__dirname, "tsconfig.jest.json"),
+ },
+ },
};
diff --git a/config/jest/cssTransform.js b/config/jest/cssTransform.js
index 4962e94f9..90b6bfa63 100644
--- a/config/jest/cssTransform.js
+++ b/config/jest/cssTransform.js
@@ -2,11 +2,7 @@
// Adapted version of https://github.com/Connormiha/jest-css-modules-transform
// Copyright https://github.com/Connormiha/jest-css-modules-transform/graphs/contributors
-<<<<<<< HEAD
-// This oututs `module.exports = cssObject` instead of `module.defaults = cssObject`;
-=======
// This oututs `module.exports = cssObject` instead of `module.exports = { default: cssObject }`;
->>>>>>> next
const { sep: pathSep, resolve } = require("path");
const postcss = require("postcss");
diff --git a/config/tsconfig.jest.json b/config/tsconfig.jest.json
new file mode 100644
index 000000000..d457255e7
--- /dev/null
+++ b/config/tsconfig.jest.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "target": "es2015",
+ "module": "es2015"
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index c6dd91c93..11321c310 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2528,45 +2528,10 @@
}
},
"babel-core": {
- "version": "6.26.3",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.1",
- "debug": "^2.6.9",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.8",
- "slash": "^1.0.0",
- "source-map": "^0.5.7"
- },
- "dependencies": {
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- }
- }
+ "version": "7.0.0-bridge.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
+ "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
+ "dev": true
},
"babel-generator": {
"version": "6.26.1",
@@ -4151,6 +4116,45 @@
"source-map-support": "^0.4.15"
},
"dependencies": {
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-generator": "^6.26.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "convert-source-map": "^1.5.1",
+ "debug": "^2.6.9",
+ "json5": "^0.5.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.4",
+ "path-is-absolute": "^1.0.1",
+ "private": "^0.1.8",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.7"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
"source-map-support": {
"version": "0.4.18",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
@@ -10962,6 +10966,39 @@
"pretty-format": "^23.2.0"
},
"dependencies": {
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-generator": "^6.26.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "convert-source-map": "^1.5.1",
+ "debug": "^2.6.9",
+ "json5": "^0.5.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.4",
+ "path-is-absolute": "^1.0.1",
+ "private": "^0.1.8",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.7"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
@@ -10975,6 +11012,12 @@
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
}
}
},
@@ -11203,6 +11246,47 @@
"strip-bom": "3.0.0",
"write-file-atomic": "^2.1.0",
"yargs": "^11.0.0"
+ },
+ "dependencies": {
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-generator": "^6.26.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "convert-source-map": "^1.5.1",
+ "debug": "^2.6.9",
+ "json5": "^0.5.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.4",
+ "path-is-absolute": "^1.0.1",
+ "private": "^0.1.8",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.7"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ }
}
},
"jest-serializer": {
@@ -18833,357 +18917,110 @@
"dev": true
},
"ts-jest": {
- "version": "22.4.6",
- "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-22.4.6.tgz",
- "integrity": "sha512-kYQ6g1G1AU+bOO9rv+SSQXg4WTcni6Wx3AM48iHni0nP1vIuhdNRjKTE9Cxx36Ix/IOV7L85iKu07dgXJzH2pQ==",
+ "version": "23.0.0",
+ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.0.0.tgz",
+ "integrity": "sha512-drIjGaoIfXgNi0UUxu963M57kgf+NE2xw386UmD/Ai2hmVpKPCcF2xRwnNMobnVfLQw4v6HSblTKuBg6v+pEBQ==",
"dev": true,
"requires": {
- "babel-core": "^6.26.3",
"babel-plugin-istanbul": "^4.1.6",
- "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
- "babel-preset-jest": "^22.4.3",
+ "babel-preset-jest": "^23.0.0",
"cpx": "^1.5.0",
- "fs-extra": "6.0.0",
- "jest-config": "^22.4.3",
+ "fs-extra": "6.0.1",
+ "jest-config": "^23.0.0",
"lodash": "^4.17.10",
- "pkg-dir": "^2.0.0",
- "source-map-support": "^0.5.5",
- "yargs": "^11.0.0"
+ "pkg-dir": "^3.0.0",
+ "yargs": "^12.0.1"
},
"dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "arr-diff": {
+ "decamelize": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
+ "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
"dev": true,
"requires": {
- "arr-flatten": "^1.0.1"
+ "xregexp": "4.0.0"
}
},
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
"dev": true
},
- "babel-plugin-jest-hoist": {
- "version": "22.4.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz",
- "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==",
- "dev": true
- },
- "babel-preset-jest": {
- "version": "22.4.4",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz",
- "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==",
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
"dev": true,
"requires": {
- "babel-plugin-jest-hoist": "^22.4.4",
- "babel-plugin-syntax-object-rest-spread": "^6.13.0"
+ "find-up": "^3.0.0"
}
},
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "yargs": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz",
+ "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==",
"dev": true,
"requires": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
+ "cliui": "^4.0.0",
+ "decamelize": "^2.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^2.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1 || ^4.0.0",
+ "yargs-parser": "^10.1.0"
}
},
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "yargs-parser": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
"dev": true,
"requires": {
- "is-posix-bracket": "^0.1.0"
+ "camelcase": "^4.1.0"
}
- },
- "expect": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz",
- "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "jest-diff": "^22.4.3",
- "jest-get-type": "^22.4.3",
- "jest-matcher-utils": "^22.4.3",
- "jest-message-util": "^22.4.3",
- "jest-regex-util": "^22.4.3"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "fs-extra": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.0.tgz",
- "integrity": "sha512-lk2cUCo8QzbiEWEbt7Cw3m27WMiRG321xsssbcIpfMhpRjrlC08WBOVQqj1/nQYYNnPtyIhP1oqLO3QwT2tPCw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "jest-config": {
- "version": "22.4.4",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz",
- "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "glob": "^7.1.1",
- "jest-environment-jsdom": "^22.4.1",
- "jest-environment-node": "^22.4.1",
- "jest-get-type": "^22.1.0",
- "jest-jasmine2": "^22.4.4",
- "jest-regex-util": "^22.1.0",
- "jest-resolve": "^22.4.2",
- "jest-util": "^22.4.1",
- "jest-validate": "^22.4.4",
- "pretty-format": "^22.4.0"
- }
- },
- "jest-diff": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz",
- "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "diff": "^3.2.0",
- "jest-get-type": "^22.4.3",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-environment-jsdom": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz",
- "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==",
- "dev": true,
- "requires": {
- "jest-mock": "^22.4.3",
- "jest-util": "^22.4.3",
- "jsdom": "^11.5.1"
- }
- },
- "jest-environment-node": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz",
- "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==",
- "dev": true,
- "requires": {
- "jest-mock": "^22.4.3",
- "jest-util": "^22.4.3"
- }
- },
- "jest-jasmine2": {
- "version": "22.4.4",
- "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz",
- "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "co": "^4.6.0",
- "expect": "^22.4.0",
- "graceful-fs": "^4.1.11",
- "is-generator-fn": "^1.0.0",
- "jest-diff": "^22.4.0",
- "jest-matcher-utils": "^22.4.0",
- "jest-message-util": "^22.4.0",
- "jest-snapshot": "^22.4.0",
- "jest-util": "^22.4.1",
- "source-map-support": "^0.5.0"
- }
- },
- "jest-matcher-utils": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz",
- "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-get-type": "^22.4.3",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-message-util": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz",
- "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0-beta.35",
- "chalk": "^2.0.1",
- "micromatch": "^2.3.11",
- "slash": "^1.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "jest-mock": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz",
- "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==",
- "dev": true
- },
- "jest-regex-util": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz",
- "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==",
- "dev": true
- },
- "jest-resolve": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz",
- "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==",
- "dev": true,
- "requires": {
- "browser-resolve": "^1.11.2",
- "chalk": "^2.0.1"
- }
- },
- "jest-snapshot": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz",
- "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^22.4.3",
- "jest-matcher-utils": "^22.4.3",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^22.4.3"
- }
- },
- "jest-util": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz",
- "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==",
- "dev": true,
- "requires": {
- "callsites": "^2.0.0",
- "chalk": "^2.0.1",
- "graceful-fs": "^4.1.11",
- "is-ci": "^1.0.10",
- "jest-message-util": "^22.4.3",
- "mkdirp": "^0.5.1",
- "source-map": "^0.6.0"
- }
- },
- "jest-validate": {
- "version": "22.4.4",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz",
- "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-config": "^22.4.4",
- "jest-get-type": "^22.1.0",
- "leven": "^2.1.0",
- "pretty-format": "^22.4.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true,
- "requires": {
- "arr-diff": "^2.0.0",
- "array-unique": "^0.2.1",
- "braces": "^1.8.2",
- "expand-brackets": "^0.1.4",
- "extglob": "^0.3.1",
- "filename-regex": "^2.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.1",
- "kind-of": "^3.0.2",
- "normalize-path": "^2.0.1",
- "object.omit": "^2.0.0",
- "parse-glob": "^3.0.4",
- "regex-cache": "^0.4.2"
- }
- },
- "pretty-format": {
- "version": "22.4.3",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz",
- "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0",
- "ansi-styles": "^3.2.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
}
}
},
@@ -20955,6 +20792,12 @@
"integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
"dev": true
},
+ "xregexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
+ "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
+ "dev": true
+ },
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
diff --git a/package.json b/package.json
index 820605d35..7b2e0e0dc 100644
--- a/package.json
+++ b/package.json
@@ -80,6 +80,7 @@
"@types/uuid": "^3.4.3",
"@types/ws": "^5.1.2",
"autoprefixer": "^8.6.0",
+ "babel-core": "^7.0.0-bridge.0",
"babel-loader": "^8.0.0-beta",
"babel-plugin-relay": "github:coralproject/patched#babel-plugin-relay",
"babel-preset-react-optimize": "^1.0.1",
@@ -124,7 +125,7 @@
"relay-runtime": "github:coralproject/patched#relay-runtime",
"relay-test-utils": "github:coralproject/patched#relay-test-utils",
"style-loader": "^0.21.0",
- "ts-jest": "^22.4.6",
+ "ts-jest": "^23.0.0",
"ts-loader": "^4.3.1",
"ts-node": "^6.1.0",
"tsconfig-paths": "^3.4.0",
diff --git a/src/core/client/.babelrc.js b/src/core/client/.babelrc.js
index 6650ad9c9..1217f3a01 100644
--- a/src/core/client/.babelrc.js
+++ b/src/core/client/.babelrc.js
@@ -8,5 +8,8 @@ module.exports = {
production: {
plugins: [],
},
+ test: {
+ plugins: ["transform-es2015-modules-commonjs"],
+ },
},
};
diff --git a/src/core/client/stream/.babelrc.js b/src/core/client/stream/.babelrc.js
index d2601c757..11bf9a670 100644
--- a/src/core/client/stream/.babelrc.js
+++ b/src/core/client/stream/.babelrc.js
@@ -1,5 +1,4 @@
const path = require("path");
-
module.exports = {
extends: "../.babelrc.js",
plugins: [
From 4a9e620eaf94b9d41756ea285bb2a453b49c02a5 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Fri, 6 Jul 2018 15:38:20 -0300
Subject: [PATCH 09/31] Adapt files.exclude
---
.prettierignore | 1 +
.vscode/settings.json | 8 +++-----
2 files changed, 4 insertions(+), 5 deletions(-)
create mode 100644 .prettierignore
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 000000000..3c3629e64
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+node_modules
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 195b73de5..4dd5d1b72 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,12 +9,10 @@
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
- "node_modules": true,
- "dist": true,
- ".vscode": true,
- "package-lock.json": true
+ ".vs": true
},
+ "tslint.exclude": "**/node_modules/**",
"tslint.autoFixOnSave": true,
"tslint.jsEnable": true,
"typescript.tsdk": "node_modules/typescript/lib"
-}
\ No newline at end of file
+}
From f7a6b974a315d77d28bab49504e420c24a6dd224 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Fri, 6 Jul 2018 16:10:20 -0300
Subject: [PATCH 10/31] Support Enzyme and Relay in Jest
---
config/jest.config.js | 8 +-
package-lock.json | 568 +++++++++++++++++-
package.json | 11 +-
src/core/client/.babelrc.js | 2 +-
.../client/stream/components/Comment.spec.tsx | 13 +-
test/.babelrc.js | 6 +
test/jestsetup.ts | 5 +
tsconfig.json | 12 +-
8 files changed, 580 insertions(+), 45 deletions(-)
create mode 100644 test/.babelrc.js
create mode 100644 test/jestsetup.ts
diff --git a/config/jest.config.js b/config/jest.config.js
index 5cc40eed3..86dbd2149 100644
--- a/config/jest.config.js
+++ b/config/jest.config.js
@@ -6,11 +6,8 @@ module.exports = {
roots: ["/src", "/scripts"],
collectCoverageFrom: ["src/**/*.{js,jsx,mjs,ts,tsx}"],
coveragePathIgnorePatterns: ["/node_modules/"],
- setupFiles: ["/config/polyfills.js"],
- testMatch: [
- "**/__tests__/**/*.{js,jsx,mjs,ts,tsx}",
- "**/*.spec.{js,jsx,mjs,ts,tsx}",
- ],
+ setupFiles: ["/config/polyfills.js", "/test/jestsetup.ts"],
+ testMatch: ["**/*.spec.{js,jsx,mjs,ts,tsx}"],
testEnvironment: "node",
testURL: "http://localhost",
transform: {
@@ -41,6 +38,7 @@ module.exports = {
"ts",
"tsx",
],
+ snapshotSerializers: ["enzyme-to-json/serializer"],
globals: {
"ts-jest": {
useBabelrc: true,
diff --git a/package-lock.json b/package-lock.json
index 11321c310..358458c8f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -773,14 +773,115 @@
}
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.49.tgz",
- "integrity": "sha1-Cfs0XVknwro72J582xOlUGftOaA=",
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.52.tgz",
+ "integrity": "sha1-AQTvGDzcL9Q9CGAhHMzOee8YAX4=",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "7.0.0-beta.49",
- "@babel/helper-plugin-utils": "7.0.0-beta.49",
- "@babel/helper-simple-access": "7.0.0-beta.49"
+ "@babel/helper-module-transforms": "7.0.0-beta.52",
+ "@babel/helper-plugin-utils": "7.0.0-beta.52",
+ "@babel/helper-simple-access": "7.0.0-beta.52"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.52.tgz",
+ "integrity": "sha1-GSSDv6DR5GfBAVccIQKcy3SvKAE=",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "7.0.0-beta.52"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.52.tgz",
+ "integrity": "sha1-cIQOg66JH5RwLGxhN4fEjuPJZbs=",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.52",
+ "lodash": "^4.17.5"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.52.tgz",
+ "integrity": "sha1-vIRE6tJSo3LJKJlq4XM96vOwjJA=",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "7.0.0-beta.52",
+ "@babel/helper-simple-access": "7.0.0-beta.52",
+ "@babel/helper-split-export-declaration": "7.0.0-beta.52",
+ "@babel/template": "7.0.0-beta.52",
+ "@babel/types": "7.0.0-beta.52",
+ "lodash": "^4.17.5"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.52.tgz",
+ "integrity": "sha1-LwWMX3w6X+S8IZA2sueOEb3et60=",
+ "dev": true
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.52.tgz",
+ "integrity": "sha1-0plc6cTJ8D/nKvkiNzZ3qOtkJO4=",
+ "dev": true,
+ "requires": {
+ "@babel/template": "7.0.0-beta.52",
+ "@babel/types": "7.0.0-beta.52",
+ "lodash": "^4.17.5"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.52.tgz",
+ "integrity": "sha1-SqxPMOpjhK82duBLUkZydjLkYN8=",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.52"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.52.tgz",
+ "integrity": "sha1-7ySTFDLwYVXnvDnNuKaze0oos9A=",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.52.tgz",
+ "integrity": "sha1-TpNbYs2b+HK9N7zx9j2C/nsCN6I=",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.52.tgz",
+ "integrity": "sha1-ROGPrDglH1f5JRHWdI8JWrAvmW4=",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.52",
+ "@babel/parser": "7.0.0-beta.52",
+ "@babel/types": "7.0.0-beta.52",
+ "lodash": "^4.17.5"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.52",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.52.tgz",
+ "integrity": "sha1-o+ViCxU0slOlCrzyIitSDiOxbaI=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.5",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
}
},
"@babel/plugin-transform-modules-systemjs": {
@@ -1090,6 +1191,19 @@
"browserslist": "^3.0.0",
"invariant": "^2.2.2",
"semver": "^5.3.0"
+ },
+ "dependencies": {
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.49.tgz",
+ "integrity": "sha1-Cfs0XVknwro72J582xOlUGftOaA=",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "7.0.0-beta.49",
+ "@babel/helper-plugin-utils": "7.0.0-beta.49",
+ "@babel/helper-simple-access": "7.0.0-beta.49"
+ }
+ }
}
},
"@babel/preset-flow": {
@@ -1403,6 +1517,15 @@
"lodash.deburr": "^4.1.0"
}
},
+ "@sinonjs/formatio": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
+ "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==",
+ "dev": true,
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
"@types/bluebird": {
"version": "3.5.20",
"resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz",
@@ -1438,6 +1561,12 @@
"@types/node": "*"
}
},
+ "@types/cheerio": {
+ "version": "0.22.8",
+ "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.8.tgz",
+ "integrity": "sha512-LzF540VOFabhS2TR2yYFz2Mu/fTfkA+5AwYddtJbOJGwnYrr2e7fHadT7/Z3jNGJJdCRlO3ySxmW26NgRdwhNA==",
+ "dev": true
+ },
"@types/chokidar": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-1.7.5.tgz",
@@ -1496,6 +1625,25 @@
"@types/node": "*"
}
},
+ "@types/enzyme": {
+ "version": "3.1.11",
+ "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.1.11.tgz",
+ "integrity": "sha512-abPTpLuveNVd2ibafCjwoZT9MerzgnBKd6ijNKdtlfJREGKXk5dxzKAXGoY9IuiYarH2YXTc197WeyIVQUFjQg==",
+ "dev": true,
+ "requires": {
+ "@types/cheerio": "*",
+ "@types/react": "*"
+ }
+ },
+ "@types/enzyme-adapter-react-16": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.2.tgz",
+ "integrity": "sha512-/oEtlwJyFIT9metXC2A90XnjfHwBDYxhFoJwqNjNDG5K2CCqp7xneQbAp4u5j280bOmalFYUDjfmmxNQG3S4Og==",
+ "dev": true,
+ "requires": {
+ "@types/enzyme": "*"
+ }
+ },
"@types/events": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
@@ -1632,15 +1780,6 @@
"from": "github:coralproject/patched#types/react-relay",
"dev": true
},
- "@types/react-test-renderer": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.0.1.tgz",
- "integrity": "sha512-kmNh8g67Ck/y/vp6KX+4JTJXiTGLZBylNhu+R7sm7zcvsrnIGVO6J1zew5inVg428j9f8yHpl68RcYOZXVborQ==",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
"@types/recompose": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/@types/recompose/-/recompose-0.26.1.tgz",
@@ -1665,6 +1804,12 @@
"@types/mime": "*"
}
},
+ "@types/sinon": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-5.0.1.tgz",
+ "integrity": "sha512-yxzBCIjE3lp9lYjfBbIK/LRCoXgCLLbIIBIje7eNCcUIIR2CZZtyX5uto2hVoMSMqLrsRrT6mwwUEd0yFgOwpA==",
+ "dev": true
+ },
"@types/uuid": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
@@ -4978,6 +5123,54 @@
"integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
"dev": true
},
+ "cheerio": {
+ "version": "1.0.0-rc.2",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
+ "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
+ "dev": true,
+ "requires": {
+ "css-select": "~1.2.0",
+ "dom-serializer": "~0.1.0",
+ "entities": "~1.1.1",
+ "htmlparser2": "^3.9.1",
+ "lodash": "^4.15.0",
+ "parse5": "^3.0.1"
+ },
+ "dependencies": {
+ "domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "htmlparser2": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^1.3.0",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "parse5": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
+ "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ }
+ }
+ },
"chokidar": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
@@ -6619,6 +6812,12 @@
"is-woff2": "^1.0.0"
}
},
+ "discontinuous-range": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
+ "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=",
+ "dev": true
+ },
"dns-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
@@ -7268,6 +7467,65 @@
"integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
"dev": true
},
+ "enzyme": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz",
+ "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==",
+ "dev": true,
+ "requires": {
+ "cheerio": "^1.0.0-rc.2",
+ "function.prototype.name": "^1.0.3",
+ "has": "^1.0.1",
+ "is-boolean-object": "^1.0.0",
+ "is-callable": "^1.1.3",
+ "is-number-object": "^1.0.3",
+ "is-string": "^1.0.4",
+ "is-subset": "^0.1.1",
+ "lodash": "^4.17.4",
+ "object-inspect": "^1.5.0",
+ "object-is": "^1.0.1",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.0.4",
+ "object.values": "^1.0.4",
+ "raf": "^3.4.0",
+ "rst-selector-parser": "^2.2.3"
+ }
+ },
+ "enzyme-adapter-react-16": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz",
+ "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==",
+ "dev": true,
+ "requires": {
+ "enzyme-adapter-utils": "^1.3.0",
+ "lodash": "^4.17.4",
+ "object.assign": "^4.0.4",
+ "object.values": "^1.0.4",
+ "prop-types": "^15.6.0",
+ "react-reconciler": "^0.7.0",
+ "react-test-renderer": "^16.0.0-0"
+ }
+ },
+ "enzyme-adapter-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.3.0.tgz",
+ "integrity": "sha512-vVXSt6uDv230DIv+ebCG66T1Pm36Kv+m74L1TrF4kaE7e1V7Q/LcxO0QRkajk5cA6R3uu9wJf5h13wOTezTbjA==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.4",
+ "object.assign": "^4.0.4",
+ "prop-types": "^15.6.0"
+ }
+ },
+ "enzyme-to-json": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.4.tgz",
+ "integrity": "sha1-Z8YEDpMRgvGDQYry659DIyWKp38=",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.4"
+ }
+ },
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -8331,12 +8589,14 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -8351,17 +8611,20 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -8478,7 +8741,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -8490,6 +8754,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -8504,6 +8769,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -8511,12 +8777,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -8535,6 +8803,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -8615,7 +8884,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -8627,6 +8897,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -8748,6 +9019,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -8825,6 +9097,17 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "function.prototype.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz",
+ "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "is-callable": "^1.1.3"
+ }
+ },
"get-caller-file": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
@@ -10230,6 +10513,12 @@
"binary-extensions": "^1.0.0"
}
},
+ "is-boolean-object": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz",
+ "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=",
+ "dev": true
+ },
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
@@ -10434,6 +10723,12 @@
}
}
},
+ "is-number-object": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz",
+ "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=",
+ "dev": true
+ },
"is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
@@ -10556,6 +10851,18 @@
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
"dev": true
},
+ "is-string": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz",
+ "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=",
+ "dev": true
+ },
+ "is-subset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
+ "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
+ "dev": true
+ },
"is-svg": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
@@ -11524,6 +11831,12 @@
"verror": "1.10.0"
}
},
+ "just-extend": {
+ "version": "1.1.27",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz",
+ "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==",
+ "dev": true
+ },
"keygrip": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.2.tgz",
@@ -11972,6 +12285,12 @@
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
},
+ "lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
+ "dev": true
+ },
"lodash.foreach": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
@@ -12112,6 +12431,12 @@
"object.assign": "^4.1.0"
}
},
+ "lolex": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz",
+ "integrity": "sha512-Oo2Si3RMKV3+lV5MsSWplDQFoTClz/24S0MMHYcgGWWmFXr6TMlqcqk/l1GtH+d5wLBwNRiqGnwDRMirtFalJw==",
+ "dev": true
+ },
"long": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
@@ -12762,6 +13087,18 @@
"integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
"optional": true
},
+ "nearley": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.13.0.tgz",
+ "integrity": "sha512-ioYYogSaZhFlCpRizQgY3UT3G1qFXmHGY/5ozoFE3dMfiCRAeJfh+IPE3/eh9gCZvqLhPCWb4bLt7Bqzo+1mLQ==",
+ "dev": true,
+ "requires": {
+ "nomnom": "~1.6.2",
+ "railroad-diagrams": "^1.0.0",
+ "randexp": "0.4.6",
+ "semver": "^5.4.1"
+ }
+ },
"negotiator": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
@@ -12785,6 +13122,36 @@
"integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
"dev": true
},
+ "nise": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.2.tgz",
+ "integrity": "sha512-BxH/DxoQYYdhKgVAfqVy4pzXRZELHOIewzoesxpjYvpU+7YOalQhGNPf7wAx8pLrTNPrHRDlLOkAl8UI0ZpXjw==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/formatio": "^2.0.0",
+ "just-extend": "^1.1.27",
+ "lolex": "^2.3.2",
+ "path-to-regexp": "^1.7.0",
+ "text-encoding": "^0.6.4"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ }
+ }
+ },
"no-case": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
@@ -12877,6 +13244,24 @@
"which": "^1.3.0"
}
},
+ "nomnom": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz",
+ "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=",
+ "dev": true,
+ "requires": {
+ "colors": "0.5.x",
+ "underscore": "~1.4.4"
+ },
+ "dependencies": {
+ "colors": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz",
+ "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=",
+ "dev": true
+ }
+ }
+ },
"nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
@@ -13057,6 +13442,18 @@
}
}
},
+ "object-inspect": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
+ "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
+ "dev": true
+ },
+ "object-is": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz",
+ "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=",
+ "dev": true
+ },
"object-keys": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
@@ -13084,6 +13481,18 @@
"object-keys": "^1.0.11"
}
},
+ "object.entries": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz",
+ "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.6.1",
+ "function-bind": "^1.1.0",
+ "has": "^1.0.1"
+ }
+ },
"object.getownpropertydescriptors": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
@@ -13113,6 +13522,18 @@
"isobject": "^3.0.1"
}
},
+ "object.values": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz",
+ "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.6.1",
+ "function-bind": "^1.1.0",
+ "has": "^1.0.1"
+ }
+ },
"obuf": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
@@ -16071,6 +16492,31 @@
"integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
"dev": true
},
+ "raf": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz",
+ "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==",
+ "dev": true,
+ "requires": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "railroad-diagrams": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
+ "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=",
+ "dev": true
+ },
+ "randexp": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
+ "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
+ "dev": true,
+ "requires": {
+ "discontinuous-range": "1.0.0",
+ "ret": "~0.1.10"
+ }
+ },
"randomatic": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
@@ -16477,6 +16923,18 @@
"integrity": "sha512-2bBoBaulpNnmXvM4nTQL3KKdsyzcufHI9ebpzoWlFZAplM0gn7Z0cBOcw2H8FFHGI38OMzo8CSpKYJaOJ8e/KA==",
"dev": true
},
+ "react-reconciler": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz",
+ "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==",
+ "dev": true,
+ "requires": {
+ "fbjs": "^0.8.16",
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.0"
+ }
+ },
"react-relay": {
"version": "github:coralproject/patched#aad037f8cbcd9c14d5f6fd96cfafb24c39eab937",
"from": "github:coralproject/patched#react-relay",
@@ -17087,6 +17545,12 @@
"invariant": "^2.2.2"
}
},
+ "relay-local-schema": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/relay-local-schema/-/relay-local-schema-0.7.0.tgz",
+ "integrity": "sha1-onxxcMYUi5Fu0PhNbDAAm6MyoOQ=",
+ "dev": true
+ },
"relay-runtime": {
"version": "github:coralproject/patched#9dda7718393cb3aa6647bd3badf574c025f79d12",
"from": "github:coralproject/patched#relay-runtime",
@@ -17521,6 +17985,16 @@
"inherits": "^2.0.1"
}
},
+ "rst-selector-parser": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz",
+ "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=",
+ "dev": true,
+ "requires": {
+ "lodash.flattendeep": "^4.4.0",
+ "nearley": "^2.7.10"
+ }
+ },
"rsvp": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz",
@@ -17603,6 +18077,12 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
"sane": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz",
@@ -17865,6 +18345,32 @@
}
}
},
+ "sinon": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-6.1.2.tgz",
+ "integrity": "sha512-MPa7kfV44XgzlXthSI28QgJUAjNQ2LdafqYFQnwXv1d5bCJXrVyYH7PLFk8PpAFhRN5Tgy8PbJFJbrvDsTss8g==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/formatio": "^2.0.0",
+ "diff": "^3.5.0",
+ "lodash.get": "^4.4.2",
+ "lolex": "^2.4.2",
+ "nise": "^1.3.3",
+ "supports-color": "^5.4.0",
+ "type-detect": "^4.0.8"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
"sisteransi": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz",
@@ -18660,6 +19166,12 @@
}
}
},
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
+ "dev": true
+ },
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -19195,6 +19707,12 @@
"prelude-ls": "~1.1.2"
}
},
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
"type-is": {
"version": "1.6.16",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
@@ -19480,6 +19998,12 @@
"integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==",
"dev": true
},
+ "underscore": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz",
+ "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=",
+ "dev": true
+ },
"unherit": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz",
diff --git a/package.json b/package.json
index 7b2e0e0dc..32b86487d 100644
--- a/package.json
+++ b/package.json
@@ -51,6 +51,7 @@
"devDependencies": {
"@babel/core": "7.0.0-beta.49",
"@babel/plugin-syntax-dynamic-import": "7.0.0-beta.49",
+ "@babel/plugin-transform-modules-commonjs": "^7.0.0-beta.52",
"@babel/polyfill": "7.0.0-beta.49",
"@babel/preset-env": "7.0.0-beta.49",
"@babel/preset-react": "7.0.0-beta.49",
@@ -61,6 +62,8 @@
"@types/convict": "^4.2.0",
"@types/cross-spawn": "^6.0.0",
"@types/dotenv": "^4.0.3",
+ "@types/enzyme": "^3.1.11",
+ "@types/enzyme-adapter-react-16": "^1.0.2",
"@types/express": "^4.16.0",
"@types/graphql": "^0.13.1",
"@types/ioredis": "^3.2.8",
@@ -74,9 +77,9 @@
"@types/query-string": "^6.1.0",
"@types/react-dom": "^16.0.6",
"@types/react-relay": "github:coralproject/patched#types/react-relay",
- "@types/react-test-renderer": "^16.0.1",
"@types/recompose": "^0.26.1",
"@types/relay-runtime": "github:coralproject/patched#types/relay-runtime",
+ "@types/sinon": "^5.0.1",
"@types/uuid": "^3.4.3",
"@types/ws": "^5.1.2",
"autoprefixer": "^8.6.0",
@@ -94,6 +97,9 @@
"css-loader": "^0.28.11",
"docz": "^0.2.6",
"docz-theme-default": "^0.2.10",
+ "enzyme": "^3.3.0",
+ "enzyme-adapter-react-16": "^1.1.1",
+ "enzyme-to-json": "^3.3.4",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"final-form": "^4.8.1",
"flat": "^4.0.0",
@@ -118,12 +124,13 @@
"react-dom": "^16.4.0",
"react-final-form": "^3.6.0",
"react-relay": "github:coralproject/patched#react-relay",
- "react-test-renderer": "^16.4.1",
"recompose": "^0.27.1",
"relay-compiler": "github:coralproject/patched#relay-compiler",
"relay-compiler-language-typescript": "github:coralproject/patched#relay-compiler-language-typescript",
+ "relay-local-schema": "^0.7.0",
"relay-runtime": "github:coralproject/patched#relay-runtime",
"relay-test-utils": "github:coralproject/patched#relay-test-utils",
+ "sinon": "^6.1.2",
"style-loader": "^0.21.0",
"ts-jest": "^23.0.0",
"ts-loader": "^4.3.1",
diff --git a/src/core/client/.babelrc.js b/src/core/client/.babelrc.js
index 1217f3a01..02fdffd71 100644
--- a/src/core/client/.babelrc.js
+++ b/src/core/client/.babelrc.js
@@ -9,7 +9,7 @@ module.exports = {
plugins: [],
},
test: {
- plugins: ["transform-es2015-modules-commonjs"],
+ plugins: ["@babel/transform-modules-commonjs"],
},
},
};
diff --git a/src/core/client/stream/components/Comment.spec.tsx b/src/core/client/stream/components/Comment.spec.tsx
index 6008bfc3b..a73e04730 100644
--- a/src/core/client/stream/components/Comment.spec.tsx
+++ b/src/core/client/stream/components/Comment.spec.tsx
@@ -1,5 +1,6 @@
+import { shallow } from "enzyme";
import React from "react";
-import { createRenderer } from "react-test-renderer/shallow";
+
import Comment from "./Comment";
it("renders username and body", () => {
@@ -9,9 +10,8 @@ it("renders username and body", () => {
},
body: "Woof",
};
- const renderer = createRenderer();
- renderer.render( );
- expect(renderer.getRenderOutput()).toMatchSnapshot();
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
});
it("renders with gutterBottom", () => {
@@ -22,7 +22,6 @@ it("renders with gutterBottom", () => {
body: "Woof",
gutterBottom: true,
};
- const renderer = createRenderer();
- renderer.render( );
- expect(renderer.getRenderOutput()).toMatchSnapshot();
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
});
diff --git a/test/.babelrc.js b/test/.babelrc.js
new file mode 100644
index 000000000..260a43f69
--- /dev/null
+++ b/test/.babelrc.js
@@ -0,0 +1,6 @@
+module.exports = {
+ presets: [
+ ["@babel/env", { targets: "last 2 versions, ie 11", modules: "commonjs" }],
+ "@babel/react",
+ ],
+};
diff --git a/test/jestsetup.ts b/test/jestsetup.ts
new file mode 100644
index 000000000..7884768e1
--- /dev/null
+++ b/test/jestsetup.ts
@@ -0,0 +1,5 @@
+import Enzyme from "enzyme";
+import Adapter from "enzyme-adapter-react-16";
+
+// React 16 Enzyme adapter
+Enzyme.configure({ adapter: new Adapter() });
diff --git a/tsconfig.json b/tsconfig.json
index 8e15c0223..dbb50ebf7 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -13,18 +13,14 @@
"noImplicitAny": true,
"strictNullChecks": true,
"noErrorTruncation": true,
- "lib": [
- "es6",
- "esnext.asynciterable"
- ]
+ "lib": ["es6", "esnext.asynciterable"]
},
"include": [
"./src/**/.*.js",
"./scripts/**/*",
"./config/**/*",
+ "./test/**/*",
"*.js"
],
- "exclude": [
- "node_modules"
- ]
-}
\ No newline at end of file
+ "exclude": ["node_modules"]
+}
From b83dabc6163bf2788f40ee129b7ba6641b33f55f Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Fri, 6 Jul 2018 16:11:05 -0300
Subject: [PATCH 11/31] Add unit tests
---
.../framework/lib/bootstrap/withContext.tsx | 22 ++++--
.../lib/relay/createMutationContainer.tsx | 12 ++-
.../client/stream/components/Stream.spec.tsx | 50 +++++++++++++
src/core/client/stream/components/Stream.tsx | 8 +-
.../__snapshots__/Stream.spec.tsx.snap | 74 +++++++++++++++++++
.../containers/CommentContainer.spec.tsx | 18 +++++
.../stream/containers/CommentContainer.tsx | 2 +-
.../containers/StreamContainer.spec.tsx | 23 ++++++
.../stream/containers/StreamContainer.tsx | 4 +-
.../CommentContainer.spec.tsx.snap | 12 +++
.../StreamContainer.spec.tsx.snap | 19 +++++
.../client/stream/queries/AppQuery.spec.tsx | 31 ++++++++
src/core/client/stream/queries/AppQuery.tsx | 2 +-
.../__snapshots__/AppQuery.spec.tsx.snap | 19 +++++
14 files changed, 284 insertions(+), 12 deletions(-)
create mode 100644 src/core/client/stream/components/Stream.spec.tsx
create mode 100644 src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap
create mode 100644 src/core/client/stream/containers/CommentContainer.spec.tsx
create mode 100644 src/core/client/stream/containers/StreamContainer.spec.tsx
create mode 100644 src/core/client/stream/containers/__snapshots__/CommentContainer.spec.tsx.snap
create mode 100644 src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap
create mode 100644 src/core/client/stream/queries/AppQuery.spec.tsx
create mode 100644 src/core/client/stream/queries/__snapshots__/AppQuery.spec.tsx.snap
diff --git a/src/core/client/framework/lib/bootstrap/withContext.tsx b/src/core/client/framework/lib/bootstrap/withContext.tsx
index 82ae2695f..677da236a 100644
--- a/src/core/client/framework/lib/bootstrap/withContext.tsx
+++ b/src/core/client/framework/lib/bootstrap/withContext.tsx
@@ -1,5 +1,9 @@
import * as React from "react";
-import { hoistStatics, InferableComponentEnhancer } from "recompose";
+import {
+ hoistStatics,
+ InferableComponentEnhancer,
+ wrapDisplayName,
+} from "recompose";
import { TalkContext, TalkContextConsumer } from "./TalkContext";
@@ -12,11 +16,17 @@ function withContext(
propsCallback: (context: TalkContext) => T
): InferableComponentEnhancer {
return hoistStatics(
- (WrappedComponent: React.ComponentType) => (props: any) => (
-
- {context => }
-
- )
+ (WrappedComponent: React.ComponentType) => {
+ const Component: React.StatelessComponent = props => (
+
+ {context => (
+
+ )}
+
+ );
+ Component.displayName = wrapDisplayName(WrappedComponent, "withContext");
+ return Component;
+ }
);
}
diff --git a/src/core/client/framework/lib/relay/createMutationContainer.tsx b/src/core/client/framework/lib/relay/createMutationContainer.tsx
index 3e3d8bf60..d0a91e92d 100644
--- a/src/core/client/framework/lib/relay/createMutationContainer.tsx
+++ b/src/core/client/framework/lib/relay/createMutationContainer.tsx
@@ -1,5 +1,10 @@
import * as React from "react";
-import { compose, hoistStatics, InferableComponentEnhancer } from "recompose";
+import {
+ compose,
+ hoistStatics,
+ InferableComponentEnhancer,
+ wrapDisplayName,
+} from "recompose";
import { Environment } from "relay-runtime";
import { withContext } from "../bootstrap";
@@ -19,6 +24,11 @@ function createMutationContainer(
withContext(({ relayEnvironment }) => ({ relayEnvironment })),
hoistStatics((WrappedComponent: React.ComponentType) => {
class CreateMutationContainer extends React.Component {
+ public static displayName = wrapDisplayName(
+ WrappedComponent,
+ "createMutationContainer"
+ );
+
private commit = (input: I) => {
return commit(this.props.relayEnvironment, input);
};
diff --git a/src/core/client/stream/components/Stream.spec.tsx b/src/core/client/stream/components/Stream.spec.tsx
new file mode 100644
index 000000000..0cfa2044b
--- /dev/null
+++ b/src/core/client/stream/components/Stream.spec.tsx
@@ -0,0 +1,50 @@
+import { shallow } from "enzyme";
+import { noop } from "lodash";
+import React from "react";
+import sinon from "sinon";
+
+import Stream from "./Stream";
+
+it("renders correctly", () => {
+ const props = {
+ id: "asset-id",
+ isClosed: false,
+ comments: [{ id: "comment-1" }, { id: "comment-2" }],
+ onLoadMore: noop,
+ hasMore: false,
+ };
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
+
+it("renders when comments is null", () => {
+ const props = {
+ id: "asset-id",
+ isClosed: false,
+ comments: null,
+ onLoadMore: noop,
+ hasMore: false,
+ };
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
+
+describe("when there is more", () => {
+ const props = {
+ id: "asset-id",
+ isClosed: false,
+ comments: [{ id: "comment-1" }, { id: "comment-2" }],
+ onLoadMore: sinon.spy(),
+ hasMore: true,
+ };
+
+ const wrapper = shallow( );
+ it("renders a load more button", () => {
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("calls onLoadMore", () => {
+ wrapper.find(".talk-stream--loadmore").simulate("click");
+ expect(props.onLoadMore.calledOnce).toBe(true);
+ });
+});
diff --git a/src/core/client/stream/components/Stream.tsx b/src/core/client/stream/components/Stream.tsx
index 454b1f38f..fc547b822 100644
--- a/src/core/client/stream/components/Stream.tsx
+++ b/src/core/client/stream/components/Stream.tsx
@@ -27,7 +27,13 @@ const Stream: StatelessComponent = props => {
))}
{props.hasMore && (
-
+
Load More
)}
diff --git a/src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap b/src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap
new file mode 100644
index 000000000..1cd7703f7
--- /dev/null
+++ b/src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap
@@ -0,0 +1,74 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders correctly 1`] = `
+
+
+
+
+
+
+`;
+
+exports[`renders when comments is null 1`] = `
+
+ Comments unavailable
+
+`;
+
+exports[`when there is more renders a load more button 1`] = `
+
+
+
+
+
+
+ Load More
+
+
+`;
diff --git a/src/core/client/stream/containers/CommentContainer.spec.tsx b/src/core/client/stream/containers/CommentContainer.spec.tsx
new file mode 100644
index 000000000..94ffb7392
--- /dev/null
+++ b/src/core/client/stream/containers/CommentContainer.spec.tsx
@@ -0,0 +1,18 @@
+import { shallow } from "enzyme";
+import React from "react";
+
+import { CommentContainer } from "./CommentContainer";
+
+it("renders username and body", () => {
+ const props = {
+ data: {
+ author: {
+ username: "Marvin",
+ },
+ body: "Woof",
+ },
+ };
+
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/containers/CommentContainer.tsx b/src/core/client/stream/containers/CommentContainer.tsx
index e80793e49..4735d44ca 100644
--- a/src/core/client/stream/containers/CommentContainer.tsx
+++ b/src/core/client/stream/containers/CommentContainer.tsx
@@ -9,7 +9,7 @@ import Comment, { CommentProps } from "../components/Comment";
type InnerProps = { data: Data } & Omit;
-const CommentContainer: StatelessComponent = props => {
+export const CommentContainer: StatelessComponent = props => {
const { data, ...rest } = props;
return ;
};
diff --git a/src/core/client/stream/containers/StreamContainer.spec.tsx b/src/core/client/stream/containers/StreamContainer.spec.tsx
new file mode 100644
index 000000000..9e3bfebce
--- /dev/null
+++ b/src/core/client/stream/containers/StreamContainer.spec.tsx
@@ -0,0 +1,23 @@
+import { shallow } from "enzyme";
+import { noop } from "lodash";
+import React from "react";
+
+import { StreamContainer } from "./StreamContainer";
+
+it("renders username and body", () => {
+ const props: any = {
+ asset: {
+ id: "asset-id",
+ isClosed: false,
+ comments: {
+ edges: [{ node: { id: "comment-1" } }, { node: { id: "comment-2" } }],
+ },
+ },
+ relay: {
+ hasMore: noop,
+ isLoading: noop,
+ },
+ };
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/containers/StreamContainer.tsx b/src/core/client/stream/containers/StreamContainer.tsx
index 0a169ad3a..c948c5d84 100644
--- a/src/core/client/stream/containers/StreamContainer.tsx
+++ b/src/core/client/stream/containers/StreamContainer.tsx
@@ -11,12 +11,12 @@ import {
import Stream from "../components/Stream";
-interface InnerProps {
+export interface InnerProps {
asset: Data;
relay: RelayPaginationProp;
}
-class StreamContainer extends React.Component {
+export class StreamContainer extends React.Component {
public render() {
const comments = this.props.asset.comments
? this.props.asset.comments.edges.map(edge => edge.node)
diff --git a/src/core/client/stream/containers/__snapshots__/CommentContainer.spec.tsx.snap b/src/core/client/stream/containers/__snapshots__/CommentContainer.spec.tsx.snap
new file mode 100644
index 000000000..6ce053179
--- /dev/null
+++ b/src/core/client/stream/containers/__snapshots__/CommentContainer.spec.tsx.snap
@@ -0,0 +1,12 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders username and body 1`] = `
+
+`;
diff --git a/src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap b/src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap
new file mode 100644
index 000000000..5f9e72622
--- /dev/null
+++ b/src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap
@@ -0,0 +1,19 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders username and body 1`] = `
+
+`;
diff --git a/src/core/client/stream/queries/AppQuery.spec.tsx b/src/core/client/stream/queries/AppQuery.spec.tsx
new file mode 100644
index 000000000..a301a76b7
--- /dev/null
+++ b/src/core/client/stream/queries/AppQuery.spec.tsx
@@ -0,0 +1,31 @@
+import { shallow } from "enzyme";
+import React from "react";
+
+import { render } from "./AppQuery";
+
+it("renders app", () => {
+ const data = {
+ props: {} as any,
+ error: null,
+ };
+ const wrapper = shallow(React.createElement(() => render(data)));
+ expect(wrapper).toMatchSnapshot();
+});
+
+it("renders loading", () => {
+ const data = {
+ props: null,
+ error: null,
+ };
+ const wrapper = shallow(React.createElement(() => render(data)));
+ expect(wrapper).toMatchSnapshot();
+});
+
+it("renders error", () => {
+ const data = {
+ props: null,
+ error: new Error("error"),
+ };
+ const wrapper = shallow(React.createElement(() => render(data)));
+ expect(wrapper).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/queries/AppQuery.tsx b/src/core/client/stream/queries/AppQuery.tsx
index 96d260568..424a11dd6 100644
--- a/src/core/client/stream/queries/AppQuery.tsx
+++ b/src/core/client/stream/queries/AppQuery.tsx
@@ -15,7 +15,7 @@ import { AppQueryLocal as Local } from "talk-stream/__generated__/AppQueryLocal.
import AppContainer from "../containers/AppContainer";
-const render = ({ error, props }: ReadyState) => {
+export const render = ({ error, props }: ReadyState) => {
if (error) {
return {error.message}
;
}
diff --git a/src/core/client/stream/queries/__snapshots__/AppQuery.spec.tsx.snap b/src/core/client/stream/queries/__snapshots__/AppQuery.spec.tsx.snap
new file mode 100644
index 000000000..dbd2ad45a
--- /dev/null
+++ b/src/core/client/stream/queries/__snapshots__/AppQuery.spec.tsx.snap
@@ -0,0 +1,19 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders app 1`] = `
+
+`;
+
+exports[`renders error 1`] = `
+
+ error
+
+`;
+
+exports[`renders loading 1`] = `
+
+ Loading
+
+`;
From 041e2e9cda6294f8965e204622fe3c5e8f9c7f6e Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Fri, 6 Jul 2018 16:22:29 -0300
Subject: [PATCH 12/31] Update package-lock.json
---
package-lock.json | 28 +++++++---------------------
1 file changed, 7 insertions(+), 21 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 358458c8f..632029e84 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8589,14 +8589,12 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -8611,20 +8609,17 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"core-util-is": {
"version": "1.0.2",
@@ -8741,8 +8736,7 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"ini": {
"version": "1.3.5",
@@ -8754,7 +8748,6 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -8769,7 +8762,6 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -8777,14 +8769,12 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -8803,7 +8793,6 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -8884,8 +8873,7 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true,
- "optional": true
+ "dev": true
},
"object-assign": {
"version": "4.1.1",
@@ -8897,7 +8885,6 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"wrappy": "1"
}
@@ -9019,7 +9006,6 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
From 84dd673c2ed5389c86111d109d3306346f114a8f Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Fri, 6 Jul 2018 21:19:49 -0300
Subject: [PATCH 13/31] Add integration tests!
---
config/jest.config.js | 2 +-
package-lock.json | 218 +++++++-----------
package.json | 4 +
src/core/client/framework/lib/relay/index.ts | 1 +
.../lib/relay/wrapFetchWithLogger.ts | 25 ++
.../client/stream/components/Stream.spec.tsx | 2 +-
src/core/client/stream/components/Stream.tsx | 2 +-
.../__snapshots__/Stream.spec.tsx.snap | 2 +-
.../test/__snapshots__/loadMore.spec.tsx.snap | 161 +++++++++++++
.../__snapshots__/renderStream.spec.tsx.snap | 69 ++++++
.../client/stream/test/createEnvironment.ts | 50 ++++
src/core/client/stream/test/fixtures.ts | 51 ++++
src/core/client/stream/test/loadMore.spec.tsx | 91 ++++++++
.../client/stream/test/renderStream.spec.tsx | 42 ++++
src/core/common/.babelrc.js | 5 +
src/core/common/graphql/index.ts | 1 +
.../index.ts => common/graphql/loadSchema.ts} | 0
src/core/common/utils/index.ts | 1 +
src/core/common/utils/timeout.ts | 4 +
.../server/graph/management/schema/index.ts | 2 +-
src/core/server/graph/tenant/schema/index.ts | 2 +-
src/types/relay-local-schema.d.ts | 16 ++
test/{jestsetup.ts => enzyme.ts} | 0
test/jsdom.ts | 27 +++
test/setupjest.ts | 24 ++
25 files changed, 657 insertions(+), 145 deletions(-)
create mode 100644 src/core/client/framework/lib/relay/wrapFetchWithLogger.ts
create mode 100644 src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
create mode 100644 src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
create mode 100644 src/core/client/stream/test/createEnvironment.ts
create mode 100644 src/core/client/stream/test/fixtures.ts
create mode 100644 src/core/client/stream/test/loadMore.spec.tsx
create mode 100644 src/core/client/stream/test/renderStream.spec.tsx
create mode 100644 src/core/common/.babelrc.js
create mode 100644 src/core/common/graphql/index.ts
rename src/core/{server/graph/common/schema/index.ts => common/graphql/loadSchema.ts} (100%)
create mode 100644 src/core/common/utils/index.ts
create mode 100644 src/core/common/utils/timeout.ts
create mode 100644 src/types/relay-local-schema.d.ts
rename test/{jestsetup.ts => enzyme.ts} (100%)
create mode 100644 test/jsdom.ts
create mode 100644 test/setupjest.ts
diff --git a/config/jest.config.js b/config/jest.config.js
index 86dbd2149..d2f436f94 100644
--- a/config/jest.config.js
+++ b/config/jest.config.js
@@ -6,7 +6,7 @@ module.exports = {
roots: ["/src", "/scripts"],
collectCoverageFrom: ["src/**/*.{js,jsx,mjs,ts,tsx}"],
coveragePathIgnorePatterns: ["/node_modules/"],
- setupFiles: ["/config/polyfills.js", "/test/jestsetup.ts"],
+ setupFiles: ["/config/polyfills.js", "/test/setupjest.ts"],
testMatch: ["**/*.spec.{js,jsx,mjs,ts,tsx}"],
testEnvironment: "node",
testURL: "http://localhost",
diff --git a/package-lock.json b/package-lock.json
index 632029e84..c97722cdb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1647,8 +1647,7 @@
"@types/events": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
- "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
- "dev": true
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA=="
},
"@types/express": {
"version": "4.16.0",
@@ -1700,6 +1699,17 @@
"integrity": "sha512-nOnsbHvoo5DsQEh8VGlbQlfg9+/iFSxE5RQKLNkAODIqyupdEkBCZf6RCNxR+9X0egMIkJ43NnwkEJKxLogsIA==",
"dev": true
},
+ "@types/jsdom": {
+ "version": "11.0.6",
+ "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-11.0.6.tgz",
+ "integrity": "sha512-6sw9iNdXak3Dk4iN1osdZeZcV8cTe2SNIVwbnt8MjFFAI8+nBWDNcDfjUgZZqycF3Twlr7xXlKntnOrruxNRvg==",
+ "requires": {
+ "@types/events": "*",
+ "@types/node": "*",
+ "@types/tough-cookie": "*",
+ "parse5": "^4.0.0"
+ }
+ },
"@types/lodash": {
"version": "4.14.109",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.109.tgz",
@@ -1732,8 +1742,7 @@
"@types/node": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.1.tgz",
- "integrity": "sha512-IsX9aDHDzJohkm3VCDB8tkzl5RQ34E/PFA29TQk6uDGb7Oc869ZBtmdKVDBzY3+h9GnXB8ssrRXEPVZrlIOPOw==",
- "dev": true
+ "integrity": "sha512-IsX9aDHDzJohkm3VCDB8tkzl5RQ34E/PFA29TQk6uDGb7Oc869ZBtmdKVDBzY3+h9GnXB8ssrRXEPVZrlIOPOw=="
},
"@types/passport": {
"version": "0.4.5",
@@ -1780,6 +1789,15 @@
"from": "github:coralproject/patched#types/react-relay",
"dev": true
},
+ "@types/react-test-renderer": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.0.1.tgz",
+ "integrity": "sha512-kmNh8g67Ck/y/vp6KX+4JTJXiTGLZBylNhu+R7sm7zcvsrnIGVO6J1zew5inVg428j9f8yHpl68RcYOZXVborQ==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
"@types/recompose": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/@types/recompose/-/recompose-0.26.1.tgz",
@@ -1810,6 +1828,11 @@
"integrity": "sha512-yxzBCIjE3lp9lYjfBbIK/LRCoXgCLLbIIBIje7eNCcUIIR2CZZtyX5uto2hVoMSMqLrsRrT6mwwUEd0yFgOwpA==",
"dev": true
},
+ "@types/tough-cookie": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz",
+ "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ=="
+ },
"@types/uuid": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
@@ -2153,8 +2176,7 @@
"abab": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
- "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
- "dev": true
+ "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4="
},
"abbrev": {
"version": "1.1.1",
@@ -2174,8 +2196,7 @@
"acorn": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
- "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==",
- "dev": true
+ "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ=="
},
"acorn-dynamic-import": {
"version": "3.0.0",
@@ -2190,7 +2211,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
"integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
- "dev": true,
"requires": {
"acorn": "^5.0.0"
}
@@ -2423,8 +2443,7 @@
"array-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
- "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
- "dev": true
+ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
},
"array-filter": {
"version": "0.0.1",
@@ -2518,8 +2537,7 @@
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
- "dev": true
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
},
"asn1.js": {
"version": "4.10.1",
@@ -2561,8 +2579,7 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"assign-symbols": {
"version": "1.0.0",
@@ -2605,8 +2622,7 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"atob": {
"version": "2.1.1",
@@ -2631,14 +2647,12 @@
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
- "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
- "dev": true
+ "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
},
"b3b": {
"version": "0.0.1",
@@ -4483,10 +4497,9 @@
"dev": true
},
"bcrypt-pbkdf": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
- "dev": true,
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"optional": true,
"requires": {
"tweetnacl": "^0.14.3"
@@ -4705,8 +4718,7 @@
"browser-process-hrtime": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz",
- "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=",
- "dev": true
+ "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44="
},
"browser-resolve": {
"version": "1.11.3",
@@ -5036,8 +5048,7 @@
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"ccount": {
"version": "1.0.3",
@@ -5453,8 +5464,7 @@
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
- "dev": true
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
},
"coa": {
"version": "1.0.4",
@@ -5543,7 +5553,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
- "dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
@@ -5786,8 +5795,7 @@
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cosmiconfig": {
"version": "3.1.0",
@@ -6428,16 +6436,14 @@
}
},
"cssom": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
- "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=",
- "dev": true
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
+ "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog=="
},
"cssstyle": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz",
"integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==",
- "dev": true,
"requires": {
"cssom": "0.3.x"
}
@@ -6476,7 +6482,6 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
@@ -6485,7 +6490,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz",
"integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==",
- "dev": true,
"requires": {
"abab": "^1.0.4",
"whatwg-mimetype": "^2.0.0",
@@ -6556,8 +6560,7 @@
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
},
"deepmerge": {
"version": "2.1.1",
@@ -6685,8 +6688,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"delegate": {
"version": "3.2.0",
@@ -7279,7 +7281,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
"integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
- "dev": true,
"requires": {
"webidl-conversions": "^4.0.2"
}
@@ -7364,7 +7365,6 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
"integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
- "dev": true,
"optional": true,
"requires": {
"jsbn": "~0.1.0"
@@ -7636,7 +7636,6 @@
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz",
"integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==",
- "dev": true,
"requires": {
"esprima": "^3.1.3",
"estraverse": "^4.2.0",
@@ -7648,14 +7647,12 @@
"esprima": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
- "dev": true
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
"optional": true
}
}
@@ -7703,14 +7700,12 @@
"estraverse": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
- "dev": true
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
},
"esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
},
"etag": {
"version": "1.8.1",
@@ -7973,8 +7968,7 @@
"extend": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
- "dev": true
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
},
"extend-shallow": {
"version": "3.0.2",
@@ -8088,8 +8082,7 @@
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "2.0.1",
@@ -8125,8 +8118,7 @@
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
},
"fastparse": {
"version": "1.1.1",
@@ -8439,14 +8431,12 @@
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
- "dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "1.0.6",
@@ -9128,7 +9118,6 @@
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
@@ -9623,14 +9612,12 @@
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
"integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
- "dev": true,
"requires": {
"ajv": "^5.1.0",
"har-schema": "^2.0.0"
@@ -9640,7 +9627,6 @@
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
- "dev": true,
"requires": {
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
@@ -9651,14 +9637,12 @@
"fast-deep-equal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
- "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
- "dev": true
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
},
"json-schema-traverse": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
- "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
- "dev": true
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
}
}
},
@@ -9861,7 +9845,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
"integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
- "dev": true,
"requires": {
"whatwg-encoding": "^1.0.1"
}
@@ -10037,7 +10020,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
@@ -10882,8 +10864,7 @@
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-utf8": {
"version": "0.2.1",
@@ -10978,8 +10959,7 @@
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"istanbul-api": {
"version": "1.3.1",
@@ -11698,14 +11678,12 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true,
"optional": true
},
"jsdom": {
"version": "11.11.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz",
"integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==",
- "dev": true,
"requires": {
"abab": "^1.0.4",
"acorn": "^5.3.0",
@@ -11739,7 +11717,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz",
"integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==",
- "dev": true,
"requires": {
"async-limiter": "~1.0.0",
"safe-buffer": "~5.1.0"
@@ -11762,8 +11739,7 @@
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -11774,8 +11750,7 @@
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"json3": {
"version": "3.3.2",
@@ -11809,7 +11784,6 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "dev": true,
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
@@ -12063,8 +12037,7 @@
"left-pad": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
- "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
- "dev": true
+ "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA=="
},
"leven": {
"version": "2.1.0",
@@ -12076,7 +12049,6 @@
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true,
"requires": {
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2"
@@ -12348,8 +12320,7 @@
"lodash.sortby": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
- "dev": true
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
},
"lodash.template": {
"version": "4.4.0",
@@ -13382,14 +13353,12 @@
"nwsapi": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.4.tgz",
- "integrity": "sha512-Zt6HRR6RcJkuj5/N9zeE7FN6YitRW//hK2wTOwX274IBphbY3Zf5+yn5mZ9v/SzAOTMjQNxZf9KkmPLWn0cV4g==",
- "dev": true
+ "integrity": "sha512-Zt6HRR6RcJkuj5/N9zeE7FN6YitRW//hK2wTOwX274IBphbY3Zf5+yn5mZ9v/SzAOTMjQNxZf9KkmPLWn0cV4g=="
},
"oauth-sign": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
- "dev": true
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
},
"object-assign": {
"version": "4.1.1",
@@ -13600,7 +13569,6 @@
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
"integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "dev": true,
"requires": {
"deep-is": "~0.1.3",
"fast-levenshtein": "~2.0.4",
@@ -13796,8 +13764,7 @@
"parse5": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
- "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
- "dev": true
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA=="
},
"parseurl": {
"version": "1.3.2",
@@ -13963,8 +13930,7 @@
"pn": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
- "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
- "dev": true
+ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
},
"portfinder": {
"version": "1.0.13",
@@ -16212,8 +16178,7 @@
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
},
"prepend-http": {
"version": "1.0.4",
@@ -16383,8 +16348,7 @@
"psl": {
"version": "1.1.28",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.28.tgz",
- "integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw==",
- "dev": true
+ "integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw=="
},
"public-encrypt": {
"version": "4.0.2",
@@ -17770,7 +17734,6 @@
"version": "2.87.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
"integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
- "dev": true,
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.6.0",
@@ -17797,14 +17760,12 @@
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
},
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
- "dev": true,
"requires": {
"punycode": "^1.4.1"
}
@@ -17815,7 +17776,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
"integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
- "dev": true,
"requires": {
"lodash": "^4.13.1"
}
@@ -17824,7 +17784,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
"integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
- "dev": true,
"requires": {
"request-promise-core": "1.1.1",
"stealthy-require": "^1.1.0",
@@ -18060,8 +18019,7 @@
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"samsam": {
"version": "1.3.0",
@@ -18089,8 +18047,7 @@
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"schema-utils": {
"version": "0.4.5",
@@ -18664,7 +18621,6 @@
"version": "1.14.2",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
"integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
- "dev": true,
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
@@ -18742,8 +18698,7 @@
"stealthy-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
- "dev": true
+ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
"stream-browserify": {
"version": "2.0.1",
@@ -19011,8 +18966,7 @@
"symbol-tree": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
- "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
- "dev": true
+ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
},
"table": {
"version": "4.0.3",
@@ -19355,7 +19309,6 @@
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
- "dev": true,
"requires": {
"psl": "^1.1.24",
"punycode": "^1.4.1"
@@ -19364,8 +19317,7 @@
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
}
}
},
@@ -19373,7 +19325,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
- "dev": true,
"requires": {
"punycode": "^2.1.0"
}
@@ -19672,7 +19623,6 @@
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true,
"requires": {
"safe-buffer": "^5.0.1"
}
@@ -19681,14 +19631,12 @@
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true,
"optional": true
},
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true,
"requires": {
"prelude-ls": "~1.1.2"
}
@@ -20508,7 +20456,6 @@
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
@@ -20555,7 +20502,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
"integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
- "dev": true,
"requires": {
"browser-process-hrtime": "^0.1.2"
}
@@ -20617,8 +20563,7 @@
"webidl-conversions": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "dev": true
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
},
"webpack": {
"version": "4.12.0",
@@ -21154,7 +21099,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
"integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
- "dev": true,
"requires": {
"iconv-lite": "0.4.19"
}
@@ -21167,14 +21111,12 @@
"whatwg-mimetype": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz",
- "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==",
- "dev": true
+ "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew=="
},
"whatwg-url": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
"integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
- "dev": true,
"requires": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
@@ -21221,8 +21163,7 @@
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "dev": true
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
},
"worker-farm": {
"version": "1.6.0",
@@ -21299,8 +21240,7 @@
"xml-name-validator": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
- "dev": true
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
},
"xregexp": {
"version": "4.0.0",
diff --git a/package.json b/package.json
index 32b86487d..5627196ec 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
"author": "",
"license": "Apache-2.0",
"dependencies": {
+ "@types/jsdom": "^11.0.6",
"apollo-server-express": "^1.3.6",
"bunyan": "^1.8.12",
"convict": "^4.3.0",
@@ -40,6 +41,7 @@
"graphql-tools": "^3.0.2",
"ioredis": "^3.2.2",
"joi": "^13.4.0",
+ "jsdom": "^11.11.0",
"lodash": "^4.17.10",
"luxon": "^1.2.1",
"mongodb": "^3.0.10",
@@ -77,6 +79,7 @@
"@types/query-string": "^6.1.0",
"@types/react-dom": "^16.0.6",
"@types/react-relay": "github:coralproject/patched#types/react-relay",
+ "@types/react-test-renderer": "^16.0.1",
"@types/recompose": "^0.26.1",
"@types/relay-runtime": "github:coralproject/patched#types/relay-runtime",
"@types/sinon": "^5.0.1",
@@ -124,6 +127,7 @@
"react-dom": "^16.4.0",
"react-final-form": "^3.6.0",
"react-relay": "github:coralproject/patched#react-relay",
+ "react-test-renderer": "^16.4.1",
"recompose": "^0.27.1",
"relay-compiler": "github:coralproject/patched#relay-compiler",
"relay-compiler-language-typescript": "github:coralproject/patched#relay-compiler-language-typescript",
diff --git a/src/core/client/framework/lib/relay/index.ts b/src/core/client/framework/lib/relay/index.ts
index e55279f7c..43dca5178 100644
--- a/src/core/client/framework/lib/relay/index.ts
+++ b/src/core/client/framework/lib/relay/index.ts
@@ -7,6 +7,7 @@ export { default as QueryRenderer } from "./QueryRenderer";
export * from "./QueryRenderer";
export { default as createMutationContainer } from "./createMutationContainer";
export { default as createAndRetain } from "./createAndRetain";
+export { default as wrapFetchWithLogger } from "./wrapFetchWithLogger";
export {
commitMutationPromise,
commitMutationPromiseNormalized,
diff --git a/src/core/client/framework/lib/relay/wrapFetchWithLogger.ts b/src/core/client/framework/lib/relay/wrapFetchWithLogger.ts
new file mode 100644
index 000000000..d320e8ab0
--- /dev/null
+++ b/src/core/client/framework/lib/relay/wrapFetchWithLogger.ts
@@ -0,0 +1,25 @@
+import { FetchFunction } from "relay-runtime";
+
+/**
+ * Decorates the fetch function with error logging.
+ * Intended for testing purposes.
+ */
+export default function wrapFetchWithLogger(
+ fetch: FetchFunction,
+ logResult?: boolean
+): FetchFunction {
+ return async (...args: any[]) => {
+ try {
+ const result = await (fetch as any)(...args);
+ if (logResult) {
+ // tslint:disable-next-line:no-console
+ console.log(JSON.stringify(result));
+ }
+ return result;
+ } catch (err) {
+ // tslint:disable-next-line:no-console
+ console.error(err);
+ throw err;
+ }
+ };
+}
diff --git a/src/core/client/stream/components/Stream.spec.tsx b/src/core/client/stream/components/Stream.spec.tsx
index 0cfa2044b..0c632d661 100644
--- a/src/core/client/stream/components/Stream.spec.tsx
+++ b/src/core/client/stream/components/Stream.spec.tsx
@@ -44,7 +44,7 @@ describe("when there is more", () => {
});
it("calls onLoadMore", () => {
- wrapper.find(".talk-stream--loadmore").simulate("click");
+ wrapper.find("#talk-stream--loadmore").simulate("click");
expect(props.onLoadMore.calledOnce).toBe(true);
});
});
diff --git a/src/core/client/stream/components/Stream.tsx b/src/core/client/stream/components/Stream.tsx
index fc547b822..e884cacc2 100644
--- a/src/core/client/stream/components/Stream.tsx
+++ b/src/core/client/stream/components/Stream.tsx
@@ -28,7 +28,7 @@ const Stream: StatelessComponent = props => {
))}
{props.hasMore && (
+
+
+ Talk NEO
+
+
+
+
+ Markus
+
+
+ Joining Too
+
+
+
+
+ Lukas
+
+
+ What's up?
+
+
+
+
+ Isabelle
+
+
+ Hey!
+
+
+
+
+`;
+
+exports[`renders comment stream 1`] = `
+
+
+
+ Talk NEO
+
+
+
+
+
+
+
+ Post
+
+
+
+
+
+ Markus
+
+
+ Joining Too
+
+
+
+
+ Lukas
+
+
+ What's up?
+
+
+
+ Load More
+
+
+
+`;
diff --git a/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
new file mode 100644
index 000000000..20b7f7b83
--- /dev/null
+++ b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
@@ -0,0 +1,69 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders comment stream 1`] = `
+
+
+
+ Talk NEO
+
+
+
+
+
+
+
+ Post
+
+
+
+
+
+ Markus
+
+
+ Joining Too
+
+
+
+
+ Lukas
+
+
+ What's up?
+
+
+
+
+`;
diff --git a/src/core/client/stream/test/createEnvironment.ts b/src/core/client/stream/test/createEnvironment.ts
new file mode 100644
index 000000000..7ad42d9eb
--- /dev/null
+++ b/src/core/client/stream/test/createEnvironment.ts
@@ -0,0 +1,50 @@
+import { IResolvers } from "graphql-tools";
+import { createFetch } from "relay-local-schema";
+import {
+ commitLocalUpdate,
+ Environment,
+ FetchFunction,
+ Network,
+ RecordProxy,
+ RecordSource,
+ Store,
+} from "relay-runtime";
+
+import { loadSchema } from "talk-common/graphql";
+import {
+ createAndRetain,
+ LOCAL_ID,
+ LOCAL_TYPE,
+ wrapFetchWithLogger,
+} from "talk-framework/lib/relay";
+
+export interface CreateEnvironmentParams {
+ /** graphql resolvers */
+ resolvers: IResolvers;
+ /** Allows to set initial state for Local state */
+ initLocalState?: (local: RecordProxy) => void;
+ /** If enabled, graphql responses will be logged to the console */
+ logNetwork?: boolean;
+}
+
+/**
+ * create Relay environment for integration tests.
+ */
+export default function createEnvironment(params: CreateEnvironmentParams) {
+ const schema = loadSchema("tenant", params.resolvers);
+ const environment = new Environment({
+ network: Network.create(
+ wrapFetchWithLogger(createFetch({ schema }), params.logNetwork)
+ ),
+ store: new Store(new RecordSource()),
+ });
+ if (params.initLocalState) {
+ commitLocalUpdate(environment, s => {
+ const root = s.getRoot();
+ const localRecord = createAndRetain(environment, s, LOCAL_ID, LOCAL_TYPE);
+ root.setLinkedRecord(localRecord, "local");
+ params.initLocalState!(localRecord);
+ });
+ }
+ return environment;
+}
diff --git a/src/core/client/stream/test/fixtures.ts b/src/core/client/stream/test/fixtures.ts
new file mode 100644
index 000000000..059f8f716
--- /dev/null
+++ b/src/core/client/stream/test/fixtures.ts
@@ -0,0 +1,51 @@
+export const users = [
+ {
+ id: "user-0",
+ username: "Markus",
+ },
+ {
+ id: "user-1",
+ username: "Lukas",
+ },
+ {
+ id: "user-2",
+ username: "Isabelle",
+ },
+];
+
+export const comments = [
+ {
+ id: "comment-0",
+ author: users[0],
+ body: "Joining Too",
+ createdAt: "2018-07-06T18:24:00",
+ },
+ {
+ id: "comment-1",
+ author: users[1],
+ body: "What's up?",
+ createdAt: "2018-07-06T18:20:00",
+ },
+ {
+ id: "comment-2",
+ author: users[2],
+ body: "Hey!",
+ createdAt: "2018-07-06T18:14:00",
+ },
+];
+
+export const assets = [
+ {
+ id: "asset-1",
+ isClosed: false,
+ comments: {
+ edges: [
+ { node: comments[0], cursor: comments[0].createdAt },
+ { node: comments[1], cursor: comments[1].createdAt },
+ ],
+ pageInfo: {
+ hasNextPage: false,
+ },
+ },
+ },
+];
diff --git a/src/core/client/stream/test/loadMore.spec.tsx b/src/core/client/stream/test/loadMore.spec.tsx
new file mode 100644
index 000000000..9221643a3
--- /dev/null
+++ b/src/core/client/stream/test/loadMore.spec.tsx
@@ -0,0 +1,91 @@
+import React from "react";
+import TestRenderer from "react-test-renderer";
+import { RecordProxy } from "relay-runtime";
+import sinon from "sinon";
+
+import { timeout } from "talk-common/utils";
+import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap";
+import AppQuery from "talk-stream/queries/AppQuery";
+
+import createEnvironment from "./createEnvironment";
+import { assets, comments } from "./fixtures";
+
+const assetStub = {
+ ...assets[0],
+ comments: {
+ edges: sinon
+ .stub()
+ .onFirstCall()
+ .returns([
+ {
+ node: comments[0],
+ cursor: comments[0].createdAt,
+ },
+ {
+ node: comments[1],
+ cursor: comments[1].createdAt,
+ },
+ ])
+ .onSecondCall()
+ .returns([
+ {
+ node: comments[2],
+ cursor: comments[2].createdAt,
+ },
+ ]),
+ pageInfo: sinon
+ .stub()
+ .onFirstCall()
+ .returns({
+ endCursor: comments[1].createdAt,
+ hasNextPage: true,
+ })
+ .onSecondCall()
+ .returns({
+ endCursor: comments[2].createdAt,
+ hasNextPage: false,
+ }),
+ },
+};
+
+const resolvers = {
+ Query: {
+ asset: () => assetStub,
+ },
+};
+
+const environment = createEnvironment({
+ // Set this to true, to see graphql responses.
+ logNetwork: false,
+ resolvers,
+ initLocalState: (localRecord: RecordProxy) => {
+ localRecord.setValue(assetStub.id, "assetID");
+ },
+});
+
+const context: TalkContext = {
+ relayEnvironment: environment,
+ localeMessages: [],
+};
+
+const testRenderer = TestRenderer.create(
+
+
+
+);
+
+it("renders comment stream", async () => {
+ // Wait for loading.
+ await timeout();
+ expect(testRenderer.toJSON()).toMatchSnapshot();
+});
+
+it("loads more comments", async () => {
+ testRenderer.root
+ .findByProps({ id: "talk-stream--loadmore" })
+ .props.onClick();
+
+ // Wait for loading.
+ await timeout();
+ expect(testRenderer.toJSON()).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/test/renderStream.spec.tsx b/src/core/client/stream/test/renderStream.spec.tsx
new file mode 100644
index 000000000..d30e32d51
--- /dev/null
+++ b/src/core/client/stream/test/renderStream.spec.tsx
@@ -0,0 +1,42 @@
+import React from "react";
+import TestRenderer from "react-test-renderer";
+import { RecordProxy } from "relay-runtime";
+
+import { timeout } from "talk-common/utils";
+import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap";
+import AppQuery from "talk-stream/queries/AppQuery";
+
+import createEnvironment from "./createEnvironment";
+import { assets } from "./fixtures";
+
+const resolvers = {
+ Query: {
+ asset: () => assets[0],
+ },
+};
+
+const environment = createEnvironment({
+ // Set this to true, to see graphql responses.
+ logNetwork: false,
+ resolvers,
+ initLocalState: (localRecord: RecordProxy) => {
+ localRecord.setValue(assets[0].id, "assetID");
+ },
+});
+
+const context: TalkContext = {
+ relayEnvironment: environment,
+ localeMessages: [],
+};
+
+const testRenderer = TestRenderer.create(
+
+
+
+);
+
+it("renders comment stream", async () => {
+ // Wait for loading.
+ await timeout();
+ expect(testRenderer.toJSON()).toMatchSnapshot();
+});
diff --git a/src/core/common/.babelrc.js b/src/core/common/.babelrc.js
new file mode 100644
index 000000000..fad0a6230
--- /dev/null
+++ b/src/core/common/.babelrc.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ ["@babel/env", { targets: "last 2 versions, ie 11", modules: "commonjs" }],
+ ],
+};
diff --git a/src/core/common/graphql/index.ts b/src/core/common/graphql/index.ts
new file mode 100644
index 000000000..396d9f22a
--- /dev/null
+++ b/src/core/common/graphql/index.ts
@@ -0,0 +1 @@
+export { default as loadSchema } from "./loadSchema";
diff --git a/src/core/server/graph/common/schema/index.ts b/src/core/common/graphql/loadSchema.ts
similarity index 100%
rename from src/core/server/graph/common/schema/index.ts
rename to src/core/common/graphql/loadSchema.ts
diff --git a/src/core/common/utils/index.ts b/src/core/common/utils/index.ts
new file mode 100644
index 000000000..88c1f3fec
--- /dev/null
+++ b/src/core/common/utils/index.ts
@@ -0,0 +1 @@
+export { default as timeout } from "./timeout";
diff --git a/src/core/common/utils/timeout.ts b/src/core/common/utils/timeout.ts
new file mode 100644
index 000000000..006fb1ee8
--- /dev/null
+++ b/src/core/common/utils/timeout.ts
@@ -0,0 +1,4 @@
+/** A promisified timeout. */
+export default function timeout(ms: number = 0) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
diff --git a/src/core/server/graph/management/schema/index.ts b/src/core/server/graph/management/schema/index.ts
index ab7cd2856..6dccc1c9c 100644
--- a/src/core/server/graph/management/schema/index.ts
+++ b/src/core/server/graph/management/schema/index.ts
@@ -1,4 +1,4 @@
-import loadSchema from "talk-server/graph/common/schema";
+import { loadSchema } from "talk-common/graphql";
import resolvers from "talk-server/graph/management/resolvers";
export default function getManagementSchema() {
diff --git a/src/core/server/graph/tenant/schema/index.ts b/src/core/server/graph/tenant/schema/index.ts
index 93641ac66..844e9a4b4 100644
--- a/src/core/server/graph/tenant/schema/index.ts
+++ b/src/core/server/graph/tenant/schema/index.ts
@@ -1,4 +1,4 @@
-import loadSchema from "talk-server/graph/common/schema";
+import { loadSchema } from "talk-common/graphql";
import resolvers from "talk-server/graph/tenant/resolvers";
export default function getTenantSchema() {
diff --git a/src/types/relay-local-schema.d.ts b/src/types/relay-local-schema.d.ts
new file mode 100644
index 000000000..b8b637f72
--- /dev/null
+++ b/src/types/relay-local-schema.d.ts
@@ -0,0 +1,16 @@
+declare module "relay-local-schema" {
+ import { GraphQLSchema } from "graphql";
+ import { Network as RelayNetwork, FetchFunction } from "relay-runtime";
+
+ interface CreateArguments {
+ schema: GraphQLSchema;
+ rootValue?: any;
+ contextValue?: any;
+ }
+
+ export class Network {
+ static create(data: CreateArguments): RelayNetwork;
+ }
+
+ export function createFetch(data: CreateArguments): FetchFunction;
+}
diff --git a/test/jestsetup.ts b/test/enzyme.ts
similarity index 100%
rename from test/jestsetup.ts
rename to test/enzyme.ts
diff --git a/test/jsdom.ts b/test/jsdom.ts
new file mode 100644
index 000000000..9e5518731
--- /dev/null
+++ b/test/jsdom.ts
@@ -0,0 +1,27 @@
+import { JSDOM } from "jsdom";
+
+declare var global: any;
+
+const jsdom = new JSDOM("");
+const { window } = jsdom;
+
+function copyProps(src: any, target: any) {
+ const props = Object.getOwnPropertyNames(src)
+ .filter(prop => typeof target[prop] === "undefined")
+ .reduce(
+ (result, prop) => ({
+ ...result,
+ [prop]: Object.getOwnPropertyDescriptor(src, prop),
+ }),
+ {}
+ );
+ Object.defineProperties(target, props);
+}
+
+global.window = window;
+global.document = (window as any).document;
+global.navigator = {
+ userAgent: "node.js",
+};
+
+copyProps(window, global);
diff --git a/test/setupjest.ts b/test/setupjest.ts
new file mode 100644
index 000000000..1609f2653
--- /dev/null
+++ b/test/setupjest.ts
@@ -0,0 +1,24 @@
+import "./enzyme";
+import "./jsdom";
+
+// TODO: Remove when fixed.
+// Mock React.createContext because of https://github.com/airbnb/enzyme/issues/1509.
+function mockReact() {
+ const originalReact = require.requireActual("react");
+ return {
+ ...originalReact,
+ createContext: jest.fn(defaultValue => {
+ let value = defaultValue;
+ const Provider = (props: any) => {
+ value = props.value;
+ return props.children;
+ };
+ const Consumer = (props: any) => props.children(value);
+ return {
+ Provider,
+ Consumer,
+ };
+ }),
+ };
+}
+jest.mock("react", () => mockReact());
From 25c931cc0570d70d8d47dab390f931a7b27a445f Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Mon, 9 Jul 2018 16:31:57 -0300
Subject: [PATCH 14/31] Implement Replies
---
config/watcher.ts | 7 +-
config/webpack.config.dev.js | 5 +
src/core/client/stream/components/Indent.tsx | 16 ++
.../stream/components/ReplyList.spec.tsx | 36 ++++
.../client/stream/components/ReplyList.tsx | 37 ++++
.../client/stream/components/Stream.spec.tsx | 8 +-
src/core/client/stream/components/Stream.tsx | 19 +-
.../__snapshots__/ReplyList.spec.tsx.snap | 56 ++++++
.../__snapshots__/Stream.spec.tsx.snap | 102 +++++++---
.../stream/containers/CommentContainer.tsx | 15 +-
.../containers/ReplyListContainer.spec.tsx | 37 ++++
.../stream/containers/ReplyListContainer.tsx | 125 ++++++++++++
.../containers/StreamContainer.spec.tsx | 2 +-
.../stream/containers/StreamContainer.tsx | 6 +-
.../ReplyListContainer.spec.tsx.snap | 20 ++
.../StreamContainer.spec.tsx.snap | 4 +-
.../test/__snapshots__/loadMore.spec.tsx.snap | 132 +++++++------
.../__snapshots__/renderReplies.spec.tsx.snap | 111 +++++++++++
.../__snapshots__/renderStream.spec.tsx.snap | 52 ++---
.../showAllReplies.spec.tsx.snap | 181 ++++++++++++++++++
.../client/stream/test/createEnvironment.ts | 1 -
src/core/client/stream/test/fixtures.ts | 30 +++
src/core/client/stream/test/loadMore.spec.tsx | 2 +-
.../client/stream/test/renderReplies.spec.tsx | 42 ++++
.../stream/test/showAllReplies.spec.tsx | 100 ++++++++++
25 files changed, 1007 insertions(+), 139 deletions(-)
create mode 100644 src/core/client/stream/components/Indent.tsx
create mode 100644 src/core/client/stream/components/ReplyList.spec.tsx
create mode 100644 src/core/client/stream/components/ReplyList.tsx
create mode 100644 src/core/client/stream/components/__snapshots__/ReplyList.spec.tsx.snap
create mode 100644 src/core/client/stream/containers/ReplyListContainer.spec.tsx
create mode 100644 src/core/client/stream/containers/ReplyListContainer.tsx
create mode 100644 src/core/client/stream/containers/__snapshots__/ReplyListContainer.spec.tsx.snap
create mode 100644 src/core/client/stream/test/__snapshots__/renderReplies.spec.tsx.snap
create mode 100644 src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
create mode 100644 src/core/client/stream/test/renderReplies.spec.tsx
create mode 100644 src/core/client/stream/test/showAllReplies.spec.tsx
diff --git a/config/watcher.ts b/config/watcher.ts
index 0d3bf23c1..9ff074e51 100644
--- a/config/watcher.ts
+++ b/config/watcher.ts
@@ -15,7 +15,12 @@ const config: Config = {
"core/client/stream/**/*.graphql",
"core/client/server/**/*.graphql",
],
- ignore: ["core/**/*.d.ts", "core/**/*.graphql.ts"],
+ ignore: [
+ "core/**/*.d.ts",
+ "core/**/*.graphql.ts",
+ "**/test/**/*",
+ "core/**/*.spec.*",
+ ],
executor: new CommandExecutor("npm run compile:relay-stream", {
runOnInit: true,
}),
diff --git a/config/webpack.config.dev.js b/config/webpack.config.dev.js
index 80872c5a4..fcbb75fe2 100644
--- a/config/webpack.config.dev.js
+++ b/config/webpack.config.dev.js
@@ -224,6 +224,11 @@ module.exports = {
jsx: "preserve",
noEmit: false,
},
+
+ // Overwrites the behavior of `include` and `exclude` to only
+ // include files that are actually being imported and which
+ // are necessary to compile the bundle.
+ onlyCompileBundledFiles: true,
},
},
],
diff --git a/src/core/client/stream/components/Indent.tsx b/src/core/client/stream/components/Indent.tsx
new file mode 100644
index 000000000..49222acff
--- /dev/null
+++ b/src/core/client/stream/components/Indent.tsx
@@ -0,0 +1,16 @@
+import React, { StatelessComponent } from "react";
+
+export interface IndentProps {
+ level?: number;
+ children: React.ReactNode;
+}
+
+const Indent: StatelessComponent = props => {
+ return (
+
+ {props.children}
+
+ );
+};
+
+export default Indent;
diff --git a/src/core/client/stream/components/ReplyList.spec.tsx b/src/core/client/stream/components/ReplyList.spec.tsx
new file mode 100644
index 000000000..2e5d6a984
--- /dev/null
+++ b/src/core/client/stream/components/ReplyList.spec.tsx
@@ -0,0 +1,36 @@
+import { shallow } from "enzyme";
+import { noop } from "lodash";
+import React from "react";
+import sinon from "sinon";
+
+import ReplyList from "./ReplyList";
+
+it("renders correctly", () => {
+ const props = {
+ commentID: "comment-id",
+ comments: [{ id: "comment-1" }, { id: "comment-2" }],
+ onLoadMore: noop,
+ hasMore: false,
+ };
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
+
+describe("when there is more", () => {
+ const props = {
+ commentID: "comment-id",
+ comments: [{ id: "comment-1" }, { id: "comment-2" }],
+ onLoadMore: sinon.spy(),
+ hasMore: true,
+ };
+
+ const wrapper = shallow( );
+ it("renders a load more button", () => {
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("calls onLoadMore", () => {
+ wrapper.find("#talk-reply-list--show-all--comment-id").simulate("click");
+ expect(props.onLoadMore.calledOnce).toBe(true);
+ });
+});
diff --git a/src/core/client/stream/components/ReplyList.tsx b/src/core/client/stream/components/ReplyList.tsx
new file mode 100644
index 000000000..ce9aa13c5
--- /dev/null
+++ b/src/core/client/stream/components/ReplyList.tsx
@@ -0,0 +1,37 @@
+import * as React from "react";
+import { StatelessComponent } from "react";
+
+import { Button } from "talk-ui/components";
+
+import CommentContainer from "../containers/CommentContainer";
+import Indent from "./Indent";
+
+export interface ReplyListProps {
+ commentID: string;
+ comments: ReadonlyArray<{ id: string }>;
+ onLoadMore: () => void;
+ hasMore: boolean;
+}
+
+const ReplyList: StatelessComponent = props => {
+ return (
+
+ {props.comments.map(comment => (
+
+ ))}
+ {props.hasMore && (
+
+ )}
+
+ );
+};
+
+export default ReplyList;
diff --git a/src/core/client/stream/components/Stream.spec.tsx b/src/core/client/stream/components/Stream.spec.tsx
index 0c632d661..09ae7dfe3 100644
--- a/src/core/client/stream/components/Stream.spec.tsx
+++ b/src/core/client/stream/components/Stream.spec.tsx
@@ -7,7 +7,7 @@ import Stream from "./Stream";
it("renders correctly", () => {
const props = {
- id: "asset-id",
+ assetID: "asset-id",
isClosed: false,
comments: [{ id: "comment-1" }, { id: "comment-2" }],
onLoadMore: noop,
@@ -19,7 +19,7 @@ it("renders correctly", () => {
it("renders when comments is null", () => {
const props = {
- id: "asset-id",
+ assetID: "asset-id",
isClosed: false,
comments: null,
onLoadMore: noop,
@@ -31,7 +31,7 @@ it("renders when comments is null", () => {
describe("when there is more", () => {
const props = {
- id: "asset-id",
+ assetID: "asset-id",
isClosed: false,
comments: [{ id: "comment-1" }, { id: "comment-2" }],
onLoadMore: sinon.spy(),
@@ -44,7 +44,7 @@ describe("when there is more", () => {
});
it("calls onLoadMore", () => {
- wrapper.find("#talk-stream--loadmore").simulate("click");
+ wrapper.find("#talk-stream--load-more").simulate("click");
expect(props.onLoadMore.calledOnce).toBe(true);
});
});
diff --git a/src/core/client/stream/components/Stream.tsx b/src/core/client/stream/components/Stream.tsx
index e884cacc2..c8eff6337 100644
--- a/src/core/client/stream/components/Stream.tsx
+++ b/src/core/client/stream/components/Stream.tsx
@@ -1,13 +1,15 @@
import * as React from "react";
import { StatelessComponent } from "react";
-import Logo from "talk-stream/components/Logo";
-import CommentContainer from "talk-stream/containers/CommentContainer";
-import PostCommentFormContainer from "talk-stream/containers/PostCommentFormContainer";
import { Button } from "talk-ui/components";
+import CommentContainer from "../containers/CommentContainer";
+import PostCommentFormContainer from "../containers/PostCommentFormContainer";
+import ReplyListContainer from "../containers/ReplyListContainer";
+import Logo from "./Logo";
+
export interface StreamProps {
- id: string;
+ assetID: string;
isClosed: boolean;
comments: ReadonlyArray<{ id: string }> | null;
onLoadMore: () => void;
@@ -22,13 +24,16 @@ const Stream: StatelessComponent = props => {
return (
-
+
{props.comments.map(comment => (
-
+
+
+
+
))}
{props.hasMore && (
+
+
+
+`;
+
+exports[`when there is more renders a load more button 1`] = `
+
+
+
+
+
+`;
diff --git a/src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap b/src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap
index 5251bcd6d..624c0dc05 100644
--- a/src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap
+++ b/src/core/client/stream/components/__snapshots__/Stream.spec.tsx.snap
@@ -8,24 +8,44 @@ exports[`renders correctly 1`] = `
-
-
+
+
+
+
+ >
+
+
+
`;
@@ -43,27 +63,47 @@ exports[`when there is more renders a load more button 1`] = `
-
-
+
+
+
+
+ >
+
+
+
;
+// tslint:disable-next-line:no-unused-expression
+graphql`
+ fragment CommentContainer_comment on Comment {
+ author {
+ username
+ }
+ body
+ }
+`;
+
export const CommentContainer: StatelessComponent = props => {
const { data, ...rest } = props;
return ;
@@ -17,10 +27,7 @@ export const CommentContainer: StatelessComponent = props => {
const enhanced = withFragmentContainer<{ data: Data }>({
data: graphql`
fragment CommentContainer on Comment {
- author {
- username
- }
- body
+ ...CommentContainer_comment @relay(mask: false)
}
`,
})(CommentContainer);
diff --git a/src/core/client/stream/containers/ReplyListContainer.spec.tsx b/src/core/client/stream/containers/ReplyListContainer.spec.tsx
new file mode 100644
index 000000000..d2fbb7534
--- /dev/null
+++ b/src/core/client/stream/containers/ReplyListContainer.spec.tsx
@@ -0,0 +1,37 @@
+import { shallow } from "enzyme";
+import { noop } from "lodash";
+import React from "react";
+
+import { ReplyListContainer } from "./ReplyListContainer";
+
+it("renders correctly", () => {
+ const props: any = {
+ comment: {
+ id: "comment-id",
+ replies: {
+ edges: [{ node: { id: "comment-1" } }, { node: { id: "comment-2" } }],
+ },
+ },
+ relay: {
+ hasMore: noop,
+ isLoading: noop,
+ },
+ };
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
+
+it("renders correctly when replies are null", () => {
+ const props: any = {
+ comment: {
+ id: "comment-id",
+ replies: null,
+ },
+ relay: {
+ hasMore: noop,
+ isLoading: noop,
+ },
+ };
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/containers/ReplyListContainer.tsx b/src/core/client/stream/containers/ReplyListContainer.tsx
new file mode 100644
index 000000000..47f940f54
--- /dev/null
+++ b/src/core/client/stream/containers/ReplyListContainer.tsx
@@ -0,0 +1,125 @@
+import React from "react";
+import { graphql, RelayPaginationProp } from "react-relay";
+
+import { withPaginationContainer } from "talk-framework/lib/relay";
+import { PropTypesOf } from "talk-framework/types";
+import { ReplyListContainer_comment as Data } from "talk-stream/__generated__/ReplyListContainer_comment.graphql";
+import {
+ COMMENT_SORT,
+ ReplyListContainerPaginationQueryVariables,
+} from "talk-stream/__generated__/ReplyListContainerPaginationQuery.graphql";
+
+import ReplyList from "../components/ReplyList";
+
+export interface InnerProps {
+ comment: Data;
+ relay: RelayPaginationProp;
+}
+
+export class ReplyListContainer extends React.Component {
+ public render() {
+ if (this.props.comment.replies === null) {
+ return null;
+ }
+ const comments = this.props.comment.replies.edges.map(edge => edge.node);
+ return (
+
+ );
+ }
+
+ private loadMore = () => {
+ if (!this.props.relay.hasMore() || this.props.relay.isLoading()) {
+ return;
+ }
+
+ this.props.relay.loadMore(
+ 999999999, // Fetch All Replies
+ error => {
+ if (error) {
+ // tslint:disable-next-line:no-console
+ console.error(error);
+ }
+ }
+ );
+ };
+}
+
+// TODO: (cvle) This should be autogenerated.
+interface FragmentVariables {
+ count: number;
+ cursor?: string;
+ orderBy: COMMENT_SORT;
+}
+
+const enhanced = withPaginationContainer<
+ { comment: Data },
+ InnerProps,
+ FragmentVariables,
+ ReplyListContainerPaginationQueryVariables
+>(
+ {
+ comment: graphql`
+ fragment ReplyListContainer_comment on Comment
+ @argumentDefinitions(
+ count: { type: "Int!", defaultValue: 5 }
+ cursor: { type: "Cursor" }
+ orderBy: { type: "COMMENT_SORT!", defaultValue: CREATED_AT_ASC }
+ ) {
+ id
+ replies(first: $count, after: $cursor, orderBy: $orderBy)
+ @connection(key: "ReplyList_replies") {
+ edges {
+ node {
+ id
+ ...CommentContainer
+ }
+ }
+ }
+ }
+ `,
+ },
+ {
+ direction: "forward",
+ getConnectionFromProps(props) {
+ return props.comment && props.comment.replies;
+ },
+ // This is also the default implementation of `getFragmentVariables` if it isn't provided.
+ getFragmentVariables(prevVars, totalCount) {
+ return {
+ ...prevVars,
+ count: totalCount,
+ };
+ },
+ getVariables(props, { count, cursor }, fragmentVariables) {
+ return {
+ count,
+ cursor,
+ orderBy: fragmentVariables.orderBy,
+ commentID: props.comment.id,
+ };
+ },
+ query: graphql`
+ # Pagination query to be fetched upon calling 'loadMore'.
+ # Notice that we re-use our fragment, and the shape of this query matches our fragment spec.
+ query ReplyListContainerPaginationQuery(
+ $count: Int!
+ $cursor: Cursor
+ $orderBy: COMMENT_SORT!
+ $commentID: ID!
+ ) {
+ comment(id: $commentID) {
+ ...ReplyListContainer_comment
+ @arguments(count: $count, cursor: $cursor, orderBy: $orderBy)
+ }
+ }
+ `,
+ }
+)(ReplyListContainer);
+
+export type ReplyListContainerProps = PropTypesOf;
+export default enhanced;
diff --git a/src/core/client/stream/containers/StreamContainer.spec.tsx b/src/core/client/stream/containers/StreamContainer.spec.tsx
index 9e3bfebce..3ab0875d2 100644
--- a/src/core/client/stream/containers/StreamContainer.spec.tsx
+++ b/src/core/client/stream/containers/StreamContainer.spec.tsx
@@ -4,7 +4,7 @@ import React from "react";
import { StreamContainer } from "./StreamContainer";
-it("renders username and body", () => {
+it("renders correctly", () => {
const props: any = {
asset: {
id: "asset-id",
diff --git a/src/core/client/stream/containers/StreamContainer.tsx b/src/core/client/stream/containers/StreamContainer.tsx
index c948c5d84..e263337a2 100644
--- a/src/core/client/stream/containers/StreamContainer.tsx
+++ b/src/core/client/stream/containers/StreamContainer.tsx
@@ -11,7 +11,7 @@ import {
import Stream from "../components/Stream";
-export interface InnerProps {
+interface InnerProps {
asset: Data;
relay: RelayPaginationProp;
}
@@ -23,7 +23,8 @@ export class StreamContainer extends React.Component {
: null;
return (
+`;
+
+exports[`renders correctly when replies are null 1`] = `""`;
diff --git a/src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap b/src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap
index 5f9e72622..743ef5627 100644
--- a/src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap
+++ b/src/core/client/stream/containers/__snapshots__/StreamContainer.spec.tsx.snap
@@ -1,7 +1,8 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`renders username and body 1`] = `
+exports[`renders correctly 1`] = `
diff --git a/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
index 075fd6e54..cbecb8711 100644
--- a/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
@@ -36,47 +36,53 @@ exports[`loads more comments 1`] = `
-
-
+
- Markus
-
-
- Joining Too
-
+
+ Markus
+
+
+ Joining Too
+
+
-
-
+
- Lukas
-
-
- What's up?
-
+
+ Lukas
+
+
+ What's up?
+
+
-
-
+
- Isabelle
-
-
- Hey!
-
+
+ Isabelle
+
+
+ Hey!
+
+
@@ -118,37 +124,41 @@ exports[`renders comment stream 1`] = `
-
-
+
- Markus
-
-
- Joining Too
-
+
+ Markus
+
+
+ Joining Too
+
+
-
-
+
- Lukas
-
-
- What's up?
-
+
+ Lukas
+
+
+ What's up?
+
+
+
+
+ Talk NEO
+
+
+
+
+
+
+
+ Post
+
+
+
+
+
+
+ Markus
+
+
+ Joining Too
+
+
+
+
+
+
+ Markus
+
+
+ I like yoghurt
+
+
+
+
+
+ Markus
+
+
+ Joining Too
+
+
+
+
+ Lukas
+
+
+ What's up?
+
+
+
+
+
+
+`;
diff --git a/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
index 20b7f7b83..c49e46241 100644
--- a/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
@@ -36,33 +36,37 @@ exports[`renders comment stream 1`] = `
-
-
+
- Markus
-
-
- Joining Too
-
+
+ Markus
+
+
+ Joining Too
+
+
-
-
+
- Lukas
-
-
- What's up?
-
+
+ Lukas
+
+
+ What's up?
+
+
diff --git a/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
new file mode 100644
index 000000000..b9acbb5cd
--- /dev/null
+++ b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
@@ -0,0 +1,181 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders comment stream 1`] = `
+
+
+
+ Talk NEO
+
+
+
+
+
+
+
+ Post
+
+
+
+
+
+
+ Markus
+
+
+ Joining Too
+
+
+
+
+
+ Lukas
+
+
+ What's up?
+
+
+
+
+
+
+
+`;
+
+exports[`show all replies 1`] = `
+
+
+
+ Talk NEO
+
+
+
+
+
+
+
+ Post
+
+
+
+
+
+
+ Markus
+
+
+ Joining Too
+
+
+
+
+
+ Lukas
+
+
+ What's up?
+
+
+
+
+
+
+
+`;
diff --git a/src/core/client/stream/test/createEnvironment.ts b/src/core/client/stream/test/createEnvironment.ts
index 7ad42d9eb..0276c0b4e 100644
--- a/src/core/client/stream/test/createEnvironment.ts
+++ b/src/core/client/stream/test/createEnvironment.ts
@@ -3,7 +3,6 @@ import { createFetch } from "relay-local-schema";
import {
commitLocalUpdate,
Environment,
- FetchFunction,
Network,
RecordProxy,
RecordSource,
diff --git a/src/core/client/stream/test/fixtures.ts b/src/core/client/stream/test/fixtures.ts
index 059f8f716..755adfe37 100644
--- a/src/core/client/stream/test/fixtures.ts
+++ b/src/core/client/stream/test/fixtures.ts
@@ -49,3 +49,33 @@ export const assets = [
},
},
];
+
+export const commentWithReplies = {
+ id: "comment-with-replies",
+ author: users[0],
+ body: "I like yoghurt",
+ createdAt: "2018-07-06T18:24:00",
+ replies: {
+ edges: [
+ { node: comments[0], cursor: comments[0].createdAt },
+ { node: comments[1], cursor: comments[1].createdAt },
+ ],
+ pageInfo: {
+ hasNextPage: false,
+ },
+ },
+};
+
+export const assetWithReplies = {
+ id: "asset-with-replies",
+ isClosed: false,
+ comments: {
+ edges: [
+ { node: comments[0], cursor: comments[0].createdAt },
+ { node: commentWithReplies, cursor: commentWithReplies.createdAt },
+ ],
+ pageInfo: {
+ hasNextPage: false,
+ },
+ },
+};
diff --git a/src/core/client/stream/test/loadMore.spec.tsx b/src/core/client/stream/test/loadMore.spec.tsx
index 9221643a3..2ff3d5a87 100644
--- a/src/core/client/stream/test/loadMore.spec.tsx
+++ b/src/core/client/stream/test/loadMore.spec.tsx
@@ -82,7 +82,7 @@ it("renders comment stream", async () => {
it("loads more comments", async () => {
testRenderer.root
- .findByProps({ id: "talk-stream--loadmore" })
+ .findByProps({ id: "talk-stream--load-more" })
.props.onClick();
// Wait for loading.
diff --git a/src/core/client/stream/test/renderReplies.spec.tsx b/src/core/client/stream/test/renderReplies.spec.tsx
new file mode 100644
index 000000000..359c2465d
--- /dev/null
+++ b/src/core/client/stream/test/renderReplies.spec.tsx
@@ -0,0 +1,42 @@
+import React from "react";
+import TestRenderer from "react-test-renderer";
+import { RecordProxy } from "relay-runtime";
+
+import { timeout } from "talk-common/utils";
+import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap";
+import AppQuery from "talk-stream/queries/AppQuery";
+
+import createEnvironment from "./createEnvironment";
+import { assetWithReplies } from "./fixtures";
+
+const resolvers = {
+ Query: {
+ asset: () => assetWithReplies,
+ },
+};
+
+const environment = createEnvironment({
+ // Set this to true, to see graphql responses.
+ logNetwork: false,
+ resolvers,
+ initLocalState: (localRecord: RecordProxy) => {
+ localRecord.setValue(assetWithReplies.id, "assetID");
+ },
+});
+
+const context: TalkContext = {
+ relayEnvironment: environment,
+ localeMessages: [],
+};
+
+const testRenderer = TestRenderer.create(
+
+
+
+);
+
+it("renders comment stream", async () => {
+ // Wait for loading.
+ await timeout();
+ expect(testRenderer.toJSON()).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/test/showAllReplies.spec.tsx b/src/core/client/stream/test/showAllReplies.spec.tsx
new file mode 100644
index 000000000..98501d7dc
--- /dev/null
+++ b/src/core/client/stream/test/showAllReplies.spec.tsx
@@ -0,0 +1,100 @@
+import React from "react";
+import TestRenderer from "react-test-renderer";
+import { RecordProxy } from "relay-runtime";
+import sinon from "sinon";
+
+import { timeout } from "talk-common/utils";
+import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap";
+import AppQuery from "talk-stream/queries/AppQuery";
+
+import createEnvironment from "./createEnvironment";
+import { assets, comments } from "./fixtures";
+
+const assetStub = {
+ ...assets[0],
+ comments: {
+ pageInfo: {
+ hasNextPage: false,
+ },
+ edges: [
+ {
+ node: {
+ ...comments[0],
+ replies: {
+ edges: sinon
+ .stub()
+ .onFirstCall()
+ .returns([
+ {
+ node: comments[1],
+ cursor: comments[1].createdAt,
+ },
+ ])
+ .onSecondCall()
+ .returns([
+ {
+ node: comments[2],
+ cursor: comments[2].createdAt,
+ },
+ ]),
+ pageInfo: sinon
+ .stub()
+ .onFirstCall()
+ .returns({
+ endCursor: comments[1].createdAt,
+ hasNextPage: true,
+ })
+ .onSecondCall()
+ .returns({
+ endCursor: comments[2].createdAt,
+ hasNextPage: false,
+ }),
+ },
+ },
+ cursor: comments[0].createdAt,
+ },
+ ],
+ },
+};
+
+const resolvers = {
+ Query: {
+ asset: () => assetStub,
+ },
+};
+
+const environment = createEnvironment({
+ // Set this to true, to see graphql responses.
+ logNetwork: false,
+ resolvers,
+ initLocalState: (localRecord: RecordProxy) => {
+ localRecord.setValue(assetStub.id, "assetID");
+ },
+});
+
+const context: TalkContext = {
+ relayEnvironment: environment,
+ localeMessages: [],
+};
+
+const testRenderer = TestRenderer.create(
+
+
+
+);
+
+it("renders comment stream", async () => {
+ // Wait for loading.
+ await timeout();
+ expect(testRenderer.toJSON()).toMatchSnapshot();
+});
+
+it("show all replies", async () => {
+ testRenderer.root
+ .findByProps({ id: `talk-reply-list--show-all--${comments[0].id}` })
+ .props.onClick();
+
+ // Wait for loading.
+ await timeout();
+ expect(testRenderer.toJSON()).toMatchSnapshot();
+});
From 11de453aacdba799c90ab6201cdfda85f4a61c3c Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Mon, 9 Jul 2018 17:41:39 -0300
Subject: [PATCH 15/31] Fix showAllReplies test
---
.../showAllReplies.spec.tsx.snap | 22 +++---
.../stream/test/showAllReplies.spec.tsx | 71 ++++++++++---------
2 files changed, 50 insertions(+), 43 deletions(-)
diff --git a/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
index b9acbb5cd..ced8cfb6a 100644
--- a/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
@@ -164,16 +164,20 @@ exports[`show all replies 1`] = `
What's up?
-
+
+ Isabelle
+
+
+ Hey!
+
+
diff --git a/src/core/client/stream/test/showAllReplies.spec.tsx b/src/core/client/stream/test/showAllReplies.spec.tsx
index 98501d7dc..df7ac1ebb 100644
--- a/src/core/client/stream/test/showAllReplies.spec.tsx
+++ b/src/core/client/stream/test/showAllReplies.spec.tsx
@@ -10,6 +10,40 @@ import AppQuery from "talk-stream/queries/AppQuery";
import createEnvironment from "./createEnvironment";
import { assets, comments } from "./fixtures";
+const commentStub = {
+ ...comments[0],
+ replies: {
+ edges: sinon
+ .stub()
+ .onFirstCall()
+ .returns([
+ {
+ node: comments[1],
+ cursor: comments[1].createdAt,
+ },
+ ])
+ .onSecondCall()
+ .returns([
+ {
+ node: comments[2],
+ cursor: comments[2].createdAt,
+ },
+ ]),
+ pageInfo: sinon
+ .stub()
+ .onFirstCall()
+ .returns({
+ endCursor: comments[1].createdAt,
+ hasNextPage: true,
+ })
+ .onSecondCall()
+ .returns({
+ endCursor: comments[2].createdAt,
+ hasNextPage: false,
+ }),
+ },
+};
+
const assetStub = {
...assets[0],
comments: {
@@ -18,40 +52,8 @@ const assetStub = {
},
edges: [
{
- node: {
- ...comments[0],
- replies: {
- edges: sinon
- .stub()
- .onFirstCall()
- .returns([
- {
- node: comments[1],
- cursor: comments[1].createdAt,
- },
- ])
- .onSecondCall()
- .returns([
- {
- node: comments[2],
- cursor: comments[2].createdAt,
- },
- ]),
- pageInfo: sinon
- .stub()
- .onFirstCall()
- .returns({
- endCursor: comments[1].createdAt,
- hasNextPage: true,
- })
- .onSecondCall()
- .returns({
- endCursor: comments[2].createdAt,
- hasNextPage: false,
- }),
- },
- },
- cursor: comments[0].createdAt,
+ node: commentStub,
+ cursor: commentStub.createdAt,
},
],
},
@@ -59,6 +61,7 @@ const assetStub = {
const resolvers = {
Query: {
+ comment: () => commentStub,
asset: () => assetStub,
},
};
From a18a9ab0c4c615aa2a54c6a84453e7243d971854 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Mon, 9 Jul 2018 20:55:36 -0300
Subject: [PATCH 16/31] Narrow down arguments in stub
---
src/core/client/stream/test/loadMore.spec.tsx | 76 ++++++++++---------
.../client/stream/test/renderReplies.spec.tsx | 6 +-
.../client/stream/test/renderStream.spec.tsx | 6 +-
.../stream/test/showAllReplies.spec.tsx | 73 ++++++++++--------
4 files changed, 92 insertions(+), 69 deletions(-)
diff --git a/src/core/client/stream/test/loadMore.spec.tsx b/src/core/client/stream/test/loadMore.spec.tsx
index 2ff3d5a87..0971e899e 100644
--- a/src/core/client/stream/test/loadMore.spec.tsx
+++ b/src/core/client/stream/test/loadMore.spec.tsx
@@ -10,47 +10,53 @@ import AppQuery from "talk-stream/queries/AppQuery";
import createEnvironment from "./createEnvironment";
import { assets, comments } from "./fixtures";
+const connectionStub = sinon.stub();
+connectionStub.withArgs({ first: 5, orderBy: "CREATED_AT_DESC" }).returns({
+ edges: [
+ {
+ node: comments[0],
+ cursor: comments[0].createdAt,
+ },
+ {
+ node: comments[1],
+ cursor: comments[1].createdAt,
+ },
+ ],
+ pageInfo: {
+ endCursor: comments[1].createdAt,
+ hasNextPage: true,
+ },
+});
+connectionStub
+ .withArgs({
+ first: 10,
+ orderBy: "CREATED_AT_DESC",
+ after: comments[1].createdAt,
+ })
+ .returns({
+ edges: [
+ {
+ node: comments[2],
+ cursor: comments[2].createdAt,
+ },
+ ],
+ pageInfo: {
+ endCursor: comments[2].createdAt,
+ hasNextPage: false,
+ },
+ });
+
const assetStub = {
...assets[0],
- comments: {
- edges: sinon
- .stub()
- .onFirstCall()
- .returns([
- {
- node: comments[0],
- cursor: comments[0].createdAt,
- },
- {
- node: comments[1],
- cursor: comments[1].createdAt,
- },
- ])
- .onSecondCall()
- .returns([
- {
- node: comments[2],
- cursor: comments[2].createdAt,
- },
- ]),
- pageInfo: sinon
- .stub()
- .onFirstCall()
- .returns({
- endCursor: comments[1].createdAt,
- hasNextPage: true,
- })
- .onSecondCall()
- .returns({
- endCursor: comments[2].createdAt,
- hasNextPage: false,
- }),
- },
+ comments: connectionStub,
};
const resolvers = {
Query: {
- asset: () => assetStub,
+ asset: sinon
+ .stub()
+ .withArgs(undefined, { id: assetStub.id })
+ .returns(assetStub),
},
};
diff --git a/src/core/client/stream/test/renderReplies.spec.tsx b/src/core/client/stream/test/renderReplies.spec.tsx
index 359c2465d..b1d6b43c2 100644
--- a/src/core/client/stream/test/renderReplies.spec.tsx
+++ b/src/core/client/stream/test/renderReplies.spec.tsx
@@ -1,6 +1,7 @@
import React from "react";
import TestRenderer from "react-test-renderer";
import { RecordProxy } from "relay-runtime";
+import sinon from "sinon";
import { timeout } from "talk-common/utils";
import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap";
@@ -11,7 +12,10 @@ import { assetWithReplies } from "./fixtures";
const resolvers = {
Query: {
- asset: () => assetWithReplies,
+ asset: sinon
+ .stub()
+ .withArgs(undefined, { id: assetWithReplies.id })
+ .returns(assetWithReplies),
},
};
diff --git a/src/core/client/stream/test/renderStream.spec.tsx b/src/core/client/stream/test/renderStream.spec.tsx
index d30e32d51..c5027bd7f 100644
--- a/src/core/client/stream/test/renderStream.spec.tsx
+++ b/src/core/client/stream/test/renderStream.spec.tsx
@@ -1,6 +1,7 @@
import React from "react";
import TestRenderer from "react-test-renderer";
import { RecordProxy } from "relay-runtime";
+import sinon from "sinon";
import { timeout } from "talk-common/utils";
import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap";
@@ -11,7 +12,10 @@ import { assets } from "./fixtures";
const resolvers = {
Query: {
- asset: () => assets[0],
+ asset: sinon
+ .stub()
+ .withArgs(undefined, { id: assets[0].id })
+ .returns(assets[0]),
},
};
diff --git a/src/core/client/stream/test/showAllReplies.spec.tsx b/src/core/client/stream/test/showAllReplies.spec.tsx
index df7ac1ebb..665679b76 100644
--- a/src/core/client/stream/test/showAllReplies.spec.tsx
+++ b/src/core/client/stream/test/showAllReplies.spec.tsx
@@ -10,38 +10,41 @@ import AppQuery from "talk-stream/queries/AppQuery";
import createEnvironment from "./createEnvironment";
import { assets, comments } from "./fixtures";
+const connectionStub = sinon.stub();
+connectionStub.withArgs({ first: 5, orderBy: "CREATED_AT_ASC" }).returns({
+ edges: [
+ {
+ node: comments[1],
+ cursor: comments[1].createdAt,
+ },
+ ],
+ pageInfo: {
+ endCursor: comments[1].createdAt,
+ hasNextPage: true,
+ },
+});
+connectionStub
+ .withArgs({
+ first: sinon.match(n => n > 10000),
+ orderBy: "CREATED_AT_ASC",
+ after: comments[1].createdAt,
+ })
+ .returns({
+ edges: [
+ {
+ node: comments[2],
+ cursor: comments[2].createdAt,
+ },
+ ],
+ pageInfo: {
+ endCursor: comments[2].createdAt,
+ hasNextPage: false,
+ },
+ });
+
const commentStub = {
...comments[0],
- replies: {
- edges: sinon
- .stub()
- .onFirstCall()
- .returns([
- {
- node: comments[1],
- cursor: comments[1].createdAt,
- },
- ])
- .onSecondCall()
- .returns([
- {
- node: comments[2],
- cursor: comments[2].createdAt,
- },
- ]),
- pageInfo: sinon
- .stub()
- .onFirstCall()
- .returns({
- endCursor: comments[1].createdAt,
- hasNextPage: true,
- })
- .onSecondCall()
- .returns({
- endCursor: comments[2].createdAt,
- hasNextPage: false,
- }),
- },
+ replies: connectionStub,
};
const assetStub = {
@@ -61,8 +64,14 @@ const assetStub = {
const resolvers = {
Query: {
- comment: () => commentStub,
- asset: () => assetStub,
+ comment: sinon
+ .stub()
+ .withArgs(undefined, { id: commentStub.id })
+ .returns(commentStub),
+ asset: sinon
+ .stub()
+ .withArgs(undefined, { id: assetStub.id })
+ .returns(assetStub),
},
};
From ca12ec652d69b65f573916436aeaa9cec26815da Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Mon, 9 Jul 2018 21:01:45 -0300
Subject: [PATCH 17/31] Throw when wrong args are provided
---
src/core/client/stream/test/loadMore.spec.tsx | 3 ++-
src/core/client/stream/test/renderReplies.spec.tsx | 1 +
src/core/client/stream/test/renderStream.spec.tsx | 1 +
src/core/client/stream/test/showAllReplies.spec.tsx | 4 +++-
4 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/core/client/stream/test/loadMore.spec.tsx b/src/core/client/stream/test/loadMore.spec.tsx
index 0971e899e..fdc901f4a 100644
--- a/src/core/client/stream/test/loadMore.spec.tsx
+++ b/src/core/client/stream/test/loadMore.spec.tsx
@@ -10,7 +10,7 @@ import AppQuery from "talk-stream/queries/AppQuery";
import createEnvironment from "./createEnvironment";
import { assets, comments } from "./fixtures";
-const connectionStub = sinon.stub();
+const connectionStub = sinon.stub().throws();
connectionStub.withArgs({ first: 5, orderBy: "CREATED_AT_DESC" }).returns({
edges: [
{
@@ -55,6 +55,7 @@ const resolvers = {
Query: {
asset: sinon
.stub()
+ .throws()
.withArgs(undefined, { id: assetStub.id })
.returns(assetStub),
},
diff --git a/src/core/client/stream/test/renderReplies.spec.tsx b/src/core/client/stream/test/renderReplies.spec.tsx
index b1d6b43c2..9c535520f 100644
--- a/src/core/client/stream/test/renderReplies.spec.tsx
+++ b/src/core/client/stream/test/renderReplies.spec.tsx
@@ -14,6 +14,7 @@ const resolvers = {
Query: {
asset: sinon
.stub()
+ .throws()
.withArgs(undefined, { id: assetWithReplies.id })
.returns(assetWithReplies),
},
diff --git a/src/core/client/stream/test/renderStream.spec.tsx b/src/core/client/stream/test/renderStream.spec.tsx
index c5027bd7f..998058cce 100644
--- a/src/core/client/stream/test/renderStream.spec.tsx
+++ b/src/core/client/stream/test/renderStream.spec.tsx
@@ -14,6 +14,7 @@ const resolvers = {
Query: {
asset: sinon
.stub()
+ .throws()
.withArgs(undefined, { id: assets[0].id })
.returns(assets[0]),
},
diff --git a/src/core/client/stream/test/showAllReplies.spec.tsx b/src/core/client/stream/test/showAllReplies.spec.tsx
index 665679b76..a3802c49e 100644
--- a/src/core/client/stream/test/showAllReplies.spec.tsx
+++ b/src/core/client/stream/test/showAllReplies.spec.tsx
@@ -10,7 +10,7 @@ import AppQuery from "talk-stream/queries/AppQuery";
import createEnvironment from "./createEnvironment";
import { assets, comments } from "./fixtures";
-const connectionStub = sinon.stub();
+const connectionStub = sinon.stub().throws();
connectionStub.withArgs({ first: 5, orderBy: "CREATED_AT_ASC" }).returns({
edges: [
{
@@ -66,10 +66,12 @@ const resolvers = {
Query: {
comment: sinon
.stub()
+ .throws()
.withArgs(undefined, { id: commentStub.id })
.returns(commentStub),
asset: sinon
.stub()
+ .throws()
.withArgs(undefined, { id: assetStub.id })
.returns(assetStub),
},
From d89d4c25b7912ba1092fd9256af922a2a6010503 Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Tue, 10 Jul 2018 12:15:39 -0300
Subject: [PATCH 18/31] Extract Username, Add indent styles
---
src/core/client/stream/components/Comment.css | 4 ---
src/core/client/stream/components/Comment.tsx | 5 ++--
src/core/client/stream/components/Indent.css | 9 +++++++
src/core/client/stream/components/Indent.tsx | 9 +++----
.../client/stream/components/Username.css | 3 +++
.../stream/components/Username.spec.tsx | 12 +++++++++
.../client/stream/components/Username.tsx | 20 ++++++++++++++
.../__snapshots__/Comment.spec.tsx.snap | 14 +++-------
.../__snapshots__/Username.spec.tsx.snap | 10 +++++++
.../test/__snapshots__/loadMore.spec.tsx.snap | 10 +++----
.../__snapshots__/renderReplies.spec.tsx.snap | 16 ++++--------
.../__snapshots__/renderStream.spec.tsx.snap | 4 +--
.../showAllReplies.spec.tsx.snap | 26 +++++--------------
src/core/client/ui/theme/variables.ts | 8 +++---
14 files changed, 87 insertions(+), 63 deletions(-)
create mode 100644 src/core/client/stream/components/Indent.css
create mode 100644 src/core/client/stream/components/Username.css
create mode 100644 src/core/client/stream/components/Username.spec.tsx
create mode 100644 src/core/client/stream/components/Username.tsx
create mode 100644 src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap
diff --git a/src/core/client/stream/components/Comment.css b/src/core/client/stream/components/Comment.css
index d43780d8f..3981c1eee 100644
--- a/src/core/client/stream/components/Comment.css
+++ b/src/core/client/stream/components/Comment.css
@@ -5,7 +5,3 @@
.gutterBottom {
margin-bottom: calc(2px * $spacing-unit);
}
-
-.author {
- font-weight: $font-weight-medium;
-}
diff --git a/src/core/client/stream/components/Comment.tsx b/src/core/client/stream/components/Comment.tsx
index c1b3f9303..2f91166ed 100644
--- a/src/core/client/stream/components/Comment.tsx
+++ b/src/core/client/stream/components/Comment.tsx
@@ -5,6 +5,7 @@ import { StatelessComponent } from "react";
import { Typography } from "talk-ui/components";
import * as styles from "./Comment.css";
+import Username from "./Username";
export interface CommentProps {
className?: string;
@@ -21,9 +22,7 @@ const Comment: StatelessComponent = props => {
});
return (
-
- {props.author && props.author.username}
-
+ {props.author && {props.author.username} }
{props.body}
);
diff --git a/src/core/client/stream/components/Indent.css b/src/core/client/stream/components/Indent.css
new file mode 100644
index 000000000..c8b46961a
--- /dev/null
+++ b/src/core/client/stream/components/Indent.css
@@ -0,0 +1,9 @@
+.root {
+ margin-left: 2px;
+ border-left: 2px solid;
+ padding-left: 5px;
+}
+
+.level0 {
+ border-color: $palette-secondary-darkest;
+}
diff --git a/src/core/client/stream/components/Indent.tsx b/src/core/client/stream/components/Indent.tsx
index 49222acff..7ea8fddf3 100644
--- a/src/core/client/stream/components/Indent.tsx
+++ b/src/core/client/stream/components/Indent.tsx
@@ -1,16 +1,15 @@
+import cn from "classnames";
import React, { StatelessComponent } from "react";
+import * as styles from "./Indent.css";
+
export interface IndentProps {
level?: number;
children: React.ReactNode;
}
const Indent: StatelessComponent = props => {
- return (
-
- {props.children}
-
- );
+ return {props.children}
;
};
export default Indent;
diff --git a/src/core/client/stream/components/Username.css b/src/core/client/stream/components/Username.css
new file mode 100644
index 000000000..5f84423cd
--- /dev/null
+++ b/src/core/client/stream/components/Username.css
@@ -0,0 +1,3 @@
+.root {
+ font-weight: $font-weight-medium;
+}
diff --git a/src/core/client/stream/components/Username.spec.tsx b/src/core/client/stream/components/Username.spec.tsx
new file mode 100644
index 000000000..c4f1c1dfe
--- /dev/null
+++ b/src/core/client/stream/components/Username.spec.tsx
@@ -0,0 +1,12 @@
+import { shallow } from "enzyme";
+import React from "react";
+
+import Username from "./Username";
+
+it("renders correctly", () => {
+ const props = {
+ children: "Marvin",
+ };
+ const wrapper = shallow( );
+ expect(wrapper).toMatchSnapshot();
+});
diff --git a/src/core/client/stream/components/Username.tsx b/src/core/client/stream/components/Username.tsx
new file mode 100644
index 000000000..3424e1f62
--- /dev/null
+++ b/src/core/client/stream/components/Username.tsx
@@ -0,0 +1,20 @@
+import React from "react";
+import { StatelessComponent } from "react";
+
+import { Typography } from "talk-ui/components";
+
+import * as styles from "./Username.css";
+
+export interface CommentProps {
+ children: string;
+}
+
+const Username: StatelessComponent = props => {
+ return (
+
+ {props.children}
+
+ );
+};
+
+export default Username;
diff --git a/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap b/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
index 4b009e257..ce67dff86 100644
--- a/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
+++ b/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
@@ -4,12 +4,9 @@ exports[`renders username and body 1`] = `
-
+
Marvin
-
+
Woof
@@ -20,12 +17,9 @@ exports[`renders with gutterBottom 1`] = `
-
+
Marvin
-
+
Woof
diff --git a/src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap b/src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap
new file mode 100644
index 000000000..2323b1c31
--- /dev/null
+++ b/src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap
@@ -0,0 +1,10 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders correctly 1`] = `
+
+ Marvin
+
+`;
diff --git a/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
index cbecb8711..b9595be1b 100644
--- a/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
@@ -41,7 +41,7 @@ exports[`loads more comments 1`] = `
className="root gutterBottom"
>
Markus
@@ -57,7 +57,7 @@ exports[`loads more comments 1`] = `
className="root gutterBottom"
>
Lukas
@@ -73,7 +73,7 @@ exports[`loads more comments 1`] = `
className="root gutterBottom"
>
Isabelle
@@ -129,7 +129,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Markus
@@ -145,7 +145,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Lukas
diff --git a/src/core/client/stream/test/__snapshots__/renderReplies.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/renderReplies.spec.tsx.snap
index 3e6552967..1dbd60833 100644
--- a/src/core/client/stream/test/__snapshots__/renderReplies.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/renderReplies.spec.tsx.snap
@@ -41,7 +41,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Markus
@@ -57,7 +57,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Markus
@@ -68,19 +68,13 @@ exports[`renders comment stream 1`] = `
Markus
@@ -94,7 +88,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Lukas
diff --git a/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
index c49e46241..a7610a65c 100644
--- a/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
@@ -41,7 +41,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Markus
@@ -57,7 +57,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Lukas
diff --git a/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
index ced8cfb6a..c744dd323 100644
--- a/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
@@ -41,7 +41,7 @@ exports[`renders comment stream 1`] = `
className="root gutterBottom"
>
Markus
@@ -52,19 +52,13 @@ exports[`renders comment stream 1`] = `
Lukas
@@ -131,7 +125,7 @@ exports[`show all replies 1`] = `
className="root gutterBottom"
>
Markus
@@ -142,19 +136,13 @@ exports[`show all replies 1`] = `
Lukas
@@ -168,7 +156,7 @@ exports[`show all replies 1`] = `
className="root gutterBottom"
>
Isabelle
diff --git a/src/core/client/ui/theme/variables.ts b/src/core/client/ui/theme/variables.ts
index dc5fd9ed7..4c4a54332 100644
--- a/src/core/client/ui/theme/variables.ts
+++ b/src/core/client/ui/theme/variables.ts
@@ -7,7 +7,7 @@ const variables = {
palette: {
/* Primary colors */
primary: {
- darker: "#0D5B8F",
+ darkest: "#0D5B8F",
dark: "#2B7EB5",
main: "#3498DB",
light: "#67B2E4",
@@ -15,7 +15,7 @@ const variables = {
},
/* Secondary colors */
secondary: {
- darker: "#404345",
+ darkest: "#404345",
dark: "#65696B",
main: "#787D80",
light: "#9A9DA0",
@@ -23,7 +23,7 @@ const variables = {
},
/* Success colors */
success: {
- darker: "#03AB61",
+ darkest: "#03AB61",
dark: "#02BD6B",
main: "#00CD73",
light: "#40D996",
@@ -31,7 +31,7 @@ const variables = {
},
/* Error colors */
error: {
- darker: "#F50F0C",
+ darkest: "#F50F0C",
dark: "#FF1F1C",
main: "#FA4643",
light: "#F26563",
From 86906464099b087f55233a4a254641887347273e Mon Sep 17 00:00:00 2001
From: Chi Vinh Le
Date: Tue, 10 Jul 2018 12:29:42 -0300
Subject: [PATCH 19/31] Better css classnames in snapshots
---
config/jest/cssTransform.js | 13 ++++-
.../__snapshots__/Comment.spec.tsx.snap | 4 +-
.../__snapshots__/Username.spec.tsx.snap | 2 +-
.../test/__snapshots__/loadMore.spec.tsx.snap | 52 ++++++++---------
.../__snapshots__/renderReplies.spec.tsx.snap | 36 ++++++------
.../__snapshots__/renderStream.spec.tsx.snap | 22 ++++----
.../showAllReplies.spec.tsx.snap | 56 +++++++++----------
7 files changed, 97 insertions(+), 88 deletions(-)
diff --git a/config/jest/cssTransform.js b/config/jest/cssTransform.js
index 90b6bfa63..ca4c0c0ee 100644
--- a/config/jest/cssTransform.js
+++ b/config/jest/cssTransform.js
@@ -4,7 +4,7 @@
// Copyright https://github.com/Connormiha/jest-css-modules-transform/graphs/contributors
// This oututs `module.exports = cssObject` instead of `module.exports = { default: cssObject }`;
-const { sep: pathSep, resolve } = require("path");
+const { sep: pathSep, resolve, basename, extname } = require("path");
const postcss = require("postcss");
const postcssNested = postcss([require("postcss-nested")]);
@@ -88,7 +88,16 @@ module.exports = {
process(src, path, config) {
const filename = path.slice(path.lastIndexOf(pathSep) + 1);
const textCSS = postcssNested.process(src).css;
- const exprt = JSON.stringify(getCSSSelectors(textCSS, path));
+ const selectors = getCSSSelectors(textCSS, path);
+ const component = basename(path, extname(path));
+
+ Object.keys(selectors).forEach(k => {
+ selectors[k] = selectors[k]
+ .split(/\s+/)
+ .map(v => `${component}-${v}`)
+ .join(" ");
+ });
+ const exprt = JSON.stringify(selectors);
return `module.exports = ${exprt}`;
},
};
diff --git a/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap b/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
index ce67dff86..48a1c0464 100644
--- a/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
+++ b/src/core/client/stream/components/__snapshots__/Comment.spec.tsx.snap
@@ -2,7 +2,7 @@
exports[`renders username and body 1`] = `
Marvin
@@ -15,7 +15,7 @@ exports[`renders username and body 1`] = `
exports[`renders with gutterBottom 1`] = `
Marvin
diff --git a/src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap b/src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap
index 2323b1c31..187895843 100644
--- a/src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap
+++ b/src/core/client/stream/components/__snapshots__/Username.spec.tsx.snap
@@ -2,7 +2,7 @@
exports[`renders correctly 1`] = `
Marvin
diff --git a/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
index b9595be1b..e349723c8 100644
--- a/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/loadMore.spec.tsx.snap
@@ -2,11 +2,11 @@
exports[`loads more comments 1`] = `
Talk NEO
@@ -16,17 +16,17 @@ exports[`loads more comments 1`] = `
>
Markus
Joining Too
@@ -54,15 +54,15 @@ exports[`loads more comments 1`] = `
Lukas
What's up?
@@ -70,15 +70,15 @@ exports[`loads more comments 1`] = `
Isabelle
Hey!
@@ -90,11 +90,11 @@ exports[`loads more comments 1`] = `
exports[`renders comment stream 1`] = `
Talk NEO
@@ -104,17 +104,17 @@ exports[`renders comment stream 1`] = `
>
Markus
Joining Too
@@ -142,22 +142,22 @@ exports[`renders comment stream 1`] = `
Talk NEO
@@ -16,17 +16,17 @@ exports[`renders comment stream 1`] = `
>
Markus
Joining Too
@@ -54,46 +54,46 @@ exports[`renders comment stream 1`] = `
Lukas
What's up?
diff --git a/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
index a7610a65c..bbfe65dd0 100644
--- a/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/renderStream.spec.tsx.snap
@@ -2,11 +2,11 @@
exports[`renders comment stream 1`] = `
Talk NEO
@@ -16,17 +16,17 @@ exports[`renders comment stream 1`] = `
>
Markus
Joining Too
@@ -54,15 +54,15 @@ exports[`renders comment stream 1`] = `
Lukas
What's up?
diff --git a/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
index c744dd323..dcd2108c2 100644
--- a/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
+++ b/src/core/client/stream/test/__snapshots__/showAllReplies.spec.tsx.snap
@@ -2,11 +2,11 @@
exports[`renders comment stream 1`] = `
Talk NEO
@@ -16,17 +16,17 @@ exports[`renders comment stream 1`] = `
>