@roadmanjs/chat 0.0.63 → 0.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/methods/ChatMessageResolver.methods.js +4 -3
- package/dist/chat/methods/ChatMessageResolver.methods.js.map +1 -1
- package/package.json +2 -1
- package/src/chat/fragments/README.md +1 -0
- package/src/chat/fragments/chatAttachment.fragment.ts +15 -0
- package/src/chat/fragments/chatConvo.fragment.ts +29 -0
- package/src/chat/fragments/chatMessage.fragment.ts +35 -0
- package/src/chat/fragments/chatUser.fragment.ts +23 -0
- package/src/chat/fragments/index.ts +5 -0
- package/src/chat/fragments/resType.ts +15 -0
- package/src/chat/index-client.ts +7 -0
- package/src/chat/index.ts +5 -0
- package/src/chat/methods/ChatConvo.methods.ts +336 -0
- package/src/chat/methods/ChatConvo.test.ts +122 -0
- package/src/chat/methods/ChatConvoResolver.methods.ts +243 -0
- package/src/chat/methods/ChatMessageResolver.methods.ts +218 -0
- package/src/chat/methods/index.ts +3 -0
- package/src/chat/models/ChatAttachment.model.ts +43 -0
- package/src/chat/models/ChatConvo.model.ts +108 -0
- package/src/chat/models/ChatMessage.model.ts +102 -0
- package/src/chat/models/ChatUser.model.ts +67 -0
- package/src/chat/models/chat.txt +17 -0
- package/src/chat/models/index.ts +3 -0
- package/src/chat/mutations/chatConvo.mutation.ts +20 -0
- package/src/chat/mutations/chatMessage.mutation.ts +11 -0
- package/src/chat/mutations/index.ts +2 -0
- package/src/chat/query/README.md +1 -0
- package/src/chat/query/chatConvo.query.ts +33 -0
- package/src/chat/query/chatMessage.query.ts +21 -0
- package/src/chat/query/index.ts +2 -0
- package/src/chat/resolvers/ChatConvo.public.resolver.ts +15 -0
- package/src/chat/resolvers/ChatConvo.resolver.ts +71 -0
- package/src/chat/resolvers/ChatMessage.resolver.ts +62 -0
- package/src/chat/resolvers/index.ts +2 -0
- package/src/chat/subscriptions/README.md +1 -0
- package/src/chat/subscriptions/chatConvo.subscription.ts +19 -0
- package/src/chat/subscriptions/chatMessage.subscription.ts +13 -0
- package/src/chat/subscriptions/index.ts +2 -0
- package/src/example.ts +16 -0
- package/src/index.ts +2 -0
- package/src/roadman.ts +25 -0
- package/src/scripts/copyClient.ts +64 -0
- package/src/scripts/createPackageJsonForClient.ts +32 -0
- package/src/shared/ContextType.ts +67 -0
- package/src/shared/pubsub.utils.ts +93 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {Field, ObjectType} from 'couchset';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GraphQL Types start
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@ObjectType('ChatUserType')
|
|
8
|
+
export class ChatUserType {
|
|
9
|
+
@Field(() => String, {nullable: true})
|
|
10
|
+
id?: string;
|
|
11
|
+
|
|
12
|
+
@Field(() => String, {nullable: true})
|
|
13
|
+
email?: string;
|
|
14
|
+
|
|
15
|
+
@Field(() => String, {nullable: true})
|
|
16
|
+
username?: string;
|
|
17
|
+
|
|
18
|
+
@Field(() => String, {nullable: true})
|
|
19
|
+
fullname?: string;
|
|
20
|
+
|
|
21
|
+
@Field(() => String, {nullable: true})
|
|
22
|
+
firstname?: string;
|
|
23
|
+
|
|
24
|
+
@Field(() => String, {nullable: true})
|
|
25
|
+
lastname?: string;
|
|
26
|
+
|
|
27
|
+
@Field(() => String, {nullable: true})
|
|
28
|
+
phone?: string;
|
|
29
|
+
|
|
30
|
+
@Field(() => String, {nullable: true})
|
|
31
|
+
website?: string;
|
|
32
|
+
|
|
33
|
+
@Field(() => String, {nullable: true})
|
|
34
|
+
address?: string;
|
|
35
|
+
|
|
36
|
+
@Field(() => String, {nullable: true})
|
|
37
|
+
country?: string;
|
|
38
|
+
|
|
39
|
+
@Field(() => String, {nullable: true})
|
|
40
|
+
bio?: string;
|
|
41
|
+
|
|
42
|
+
@Field(() => String, {nullable: true})
|
|
43
|
+
avatar?: string;
|
|
44
|
+
|
|
45
|
+
// Wallet here
|
|
46
|
+
@Field(() => String, {nullable: true})
|
|
47
|
+
currency?: string;
|
|
48
|
+
|
|
49
|
+
@Field(() => Number, {nullable: true})
|
|
50
|
+
balance?: number;
|
|
51
|
+
|
|
52
|
+
@Field(() => Boolean, {nullable: true})
|
|
53
|
+
admin?: boolean;
|
|
54
|
+
|
|
55
|
+
@Field(() => [String], {nullable: true})
|
|
56
|
+
plans?: string[];
|
|
57
|
+
|
|
58
|
+
// Revoke accessToken
|
|
59
|
+
@Field(() => Number, {nullable: true})
|
|
60
|
+
tokenVersion?: number;
|
|
61
|
+
|
|
62
|
+
@Field(() => Date, {nullable: true})
|
|
63
|
+
createdAt?: Date;
|
|
64
|
+
|
|
65
|
+
@Field(() => Date, {nullable: true})
|
|
66
|
+
updatedAt?: Date;
|
|
67
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
SELECT *
|
|
2
|
+
FROM `dev` convo
|
|
3
|
+
INNER NEST `dev` members
|
|
4
|
+
ON KEYS convo.members
|
|
5
|
+
INNER NEST `dev` owner
|
|
6
|
+
ON KEYS convo.owner
|
|
7
|
+
WHERE convo._type = "ChatConvo"
|
|
8
|
+
LIMIT 1;
|
|
9
|
+
|
|
10
|
+
SELECT *
|
|
11
|
+
FROM `dev` convo
|
|
12
|
+
INNER NEST `dev` chatConvo
|
|
13
|
+
ON KEYS convo.chatConvoId
|
|
14
|
+
INNER NEST `dev` owner
|
|
15
|
+
ON KEYS convo.owner
|
|
16
|
+
WHERE convo._type = "ChatConvoUser"
|
|
17
|
+
LIMIT 1;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {ChatResTypeFragment} from '../fragments/resType';
|
|
2
|
+
import gql from 'graphql-tag';
|
|
3
|
+
|
|
4
|
+
export const CREATE_CHAT_CONVO_MUTATION = gql`
|
|
5
|
+
mutation CreateChatConvo($args: ChatConvoInput!) {
|
|
6
|
+
data: createChatConvo(args: $args) {
|
|
7
|
+
...ChatResTypeFragment
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
${ChatResTypeFragment}
|
|
11
|
+
`;
|
|
12
|
+
|
|
13
|
+
export const START_CHAT_CONVO_MUTATIONS = gql`
|
|
14
|
+
mutation StartChatConvo($args: ChatConvoInput!) {
|
|
15
|
+
data: startConvo(args: $args) {
|
|
16
|
+
...ChatResTypeFragment
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
${ChatResTypeFragment}
|
|
20
|
+
`;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {ChatResTypeFragment} from '../fragments/resType';
|
|
2
|
+
import gql from 'graphql-tag';
|
|
3
|
+
|
|
4
|
+
export const CREATE_CHAT_MESSAGE_MUTATION = gql`
|
|
5
|
+
mutation CreateChatMessage($args: ChatMessageInput!) {
|
|
6
|
+
data: createChatMessage(args: $args) {
|
|
7
|
+
...ChatResTypeFragment
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
${ChatResTypeFragment}
|
|
11
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Only for client query graphql-tagss
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {ChatConvoFragment} from '../fragments/chatConvo.fragment';
|
|
2
|
+
import gql from 'graphql-tag';
|
|
3
|
+
|
|
4
|
+
export const GET_CHAT_CONVO = gql`
|
|
5
|
+
query GetChatConvo($owner: String!, $before: DateTime, $after: DateTime, $limit: Float) {
|
|
6
|
+
data: chatConvo(owner: $owner, before: $before, after: $after, limit: $limit) {
|
|
7
|
+
items {
|
|
8
|
+
...ChatConvoFragment
|
|
9
|
+
}
|
|
10
|
+
hasNext
|
|
11
|
+
params
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
${ChatConvoFragment}
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
export const GET_CHAT_CONVO_BY_ID = gql`
|
|
18
|
+
query GetChatConvoById($id: String!) {
|
|
19
|
+
data: chatConvoById(id: $id) {
|
|
20
|
+
...ChatConvoFragment
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
${ChatConvoFragment}
|
|
24
|
+
`;
|
|
25
|
+
|
|
26
|
+
export const GET_CHAT_CONVO_PUBLIC_BY_ID = gql`
|
|
27
|
+
query GetChatConvoPublicById($id: String!) {
|
|
28
|
+
data: chatConvoPublicById(id: $id) {
|
|
29
|
+
...ChatConvoFragment
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
${ChatConvoFragment}
|
|
33
|
+
`;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {ChatMessageFragment} from '../fragments/chatMessage.fragment';
|
|
2
|
+
import gql from 'graphql-tag';
|
|
3
|
+
|
|
4
|
+
export const CHAT_TYPING = gql`
|
|
5
|
+
query ChatTyping($convoId: String!, $time: DateTime) {
|
|
6
|
+
data: chatTyping(convoId: $convoId, time: $time)
|
|
7
|
+
}
|
|
8
|
+
`;
|
|
9
|
+
|
|
10
|
+
export const GET_CHAT_MESSAGE = gql`
|
|
11
|
+
query GetChatMessage($convoId: String!, $before: DateTime, $after: DateTime, $limit: Float) {
|
|
12
|
+
data: chatMessage(convoId: $convoId, before: $before, after: $after, limit: $limit) {
|
|
13
|
+
items {
|
|
14
|
+
...ChatMessageFragment
|
|
15
|
+
}
|
|
16
|
+
hasNext
|
|
17
|
+
params
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
${ChatMessageFragment}
|
|
21
|
+
`;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {Resolver, Arg, Query} from 'type-graphql';
|
|
2
|
+
import {ChatConvo} from '../models/ChatConvo.model';
|
|
3
|
+
import {startPublicConvo} from '../methods/ChatConvoResolver.methods';
|
|
4
|
+
|
|
5
|
+
@Resolver()
|
|
6
|
+
export class ChatConvoPublicResolver {
|
|
7
|
+
@Query(() => ChatConvo)
|
|
8
|
+
async chatConvoPublicById(
|
|
9
|
+
@Arg('id', () => String, {nullable: false}) id: string
|
|
10
|
+
): Promise<ChatConvo> {
|
|
11
|
+
return startPublicConvo(id);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default ChatConvoPublicResolver;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {Resolver, Mutation, Ctx, Arg, Query, Subscription, Root, UseMiddleware} from 'type-graphql';
|
|
2
|
+
import {ChatConvo, ChatConvoType} from '../models/ChatConvo.model';
|
|
3
|
+
import {
|
|
4
|
+
chatConvo,
|
|
5
|
+
chatConvoById,
|
|
6
|
+
createChatConvo,
|
|
7
|
+
startConvo,
|
|
8
|
+
} from '../methods/ChatConvoResolver.methods';
|
|
9
|
+
import {isAuth} from '@roadmanjs/auth';
|
|
10
|
+
import {ChatResType, getPagination, ContextType} from '../../shared/ContextType';
|
|
11
|
+
import {OnChatMessage} from '../models';
|
|
12
|
+
import _get from 'lodash/get';
|
|
13
|
+
|
|
14
|
+
const ConvoPagination = getPagination(ChatConvo);
|
|
15
|
+
|
|
16
|
+
@Resolver()
|
|
17
|
+
export class ChatConvoResolver {
|
|
18
|
+
// TODO auth middleware
|
|
19
|
+
@Subscription(() => OnChatMessage, {
|
|
20
|
+
topics: ChatConvo.name,
|
|
21
|
+
filter: ({payload, args}) => args.owner === payload.owner,
|
|
22
|
+
})
|
|
23
|
+
onConvos(
|
|
24
|
+
@Root() data: OnChatMessage,
|
|
25
|
+
@Arg('owner', () => String, {nullable: false}) owner: string,
|
|
26
|
+
@Arg('time', () => Date, {nullable: true}) time: Date // just to make the client HOT
|
|
27
|
+
): OnChatMessage {
|
|
28
|
+
return {time, owner, ...data};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@Query(() => ChatConvo)
|
|
32
|
+
@UseMiddleware(isAuth)
|
|
33
|
+
async chatConvoById(
|
|
34
|
+
@Ctx() ctx: ContextType,
|
|
35
|
+
@Arg('id', () => String, {nullable: false}) id: string
|
|
36
|
+
): Promise<ChatConvo> {
|
|
37
|
+
const owner = _get(ctx, 'payload.userId', ''); // loggedIn user
|
|
38
|
+
|
|
39
|
+
return chatConvoById(id, owner);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Query(() => ConvoPagination)
|
|
43
|
+
@UseMiddleware(isAuth)
|
|
44
|
+
async chatConvo(
|
|
45
|
+
@Arg('owner', () => String, {nullable: false}) owner: string,
|
|
46
|
+
// @Arg('sort', () => String, {nullable: true}) sortArg?: string,
|
|
47
|
+
@Arg('before', () => Date, {nullable: true}) before: Date,
|
|
48
|
+
@Arg('after', () => Date, {nullable: true}) after: Date,
|
|
49
|
+
@Arg('limit', () => Number, {nullable: true}) limit
|
|
50
|
+
): Promise<{items: ChatConvo[]; hasNext: boolean; params: any}> {
|
|
51
|
+
return chatConvo({owner, before, after, limit});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@Mutation(() => ChatResType)
|
|
55
|
+
@UseMiddleware(isAuth)
|
|
56
|
+
async createChatConvo(
|
|
57
|
+
@Arg('args', () => ChatConvoType, {nullable: true}) args: ChatConvoType
|
|
58
|
+
): Promise<ChatResType> {
|
|
59
|
+
return createChatConvo(args);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@Mutation(() => ChatResType)
|
|
63
|
+
@UseMiddleware(isAuth)
|
|
64
|
+
async startConvo(
|
|
65
|
+
@Arg('args', () => ChatConvoType, {nullable: true}) args: ChatConvoType
|
|
66
|
+
): Promise<ChatResType> {
|
|
67
|
+
return startConvo(args);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default ChatConvoResolver;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import {Resolver, Query, Mutation, Arg, UseMiddleware, Ctx, Subscription, Root} from 'couchset';
|
|
2
|
+
import {ContextType, ChatResType, getPagination} from '../../shared/ContextType';
|
|
3
|
+
import {isAuth} from '@roadmanjs/auth';
|
|
4
|
+
import {ChatMessage, ChatMessageType, OnChatMessage} from '../models/ChatMessage.model';
|
|
5
|
+
import {chatTyping, chatMessage, createChatMessage} from '../methods/ChatMessageResolver.methods';
|
|
6
|
+
|
|
7
|
+
const ChatPagination = getPagination(ChatMessage);
|
|
8
|
+
|
|
9
|
+
@Resolver()
|
|
10
|
+
export class ChatMessageResolver {
|
|
11
|
+
// TODO subscriptions and auth middleware
|
|
12
|
+
@Subscription(() => OnChatMessage, {
|
|
13
|
+
topics: ChatMessage.name,
|
|
14
|
+
filter: ({payload, args}) =>
|
|
15
|
+
args.convoId === payload.convoId && args.owner !== payload.owner,
|
|
16
|
+
})
|
|
17
|
+
onChatMessage(
|
|
18
|
+
@Root() data: OnChatMessage,
|
|
19
|
+
@Arg('owner', () => String, {nullable: true}) owner: string,
|
|
20
|
+
@Arg('convoId', () => String, {nullable: false}) convoId: string,
|
|
21
|
+
@Arg('time', () => Date, {nullable: true}) time: Date
|
|
22
|
+
): OnChatMessage {
|
|
23
|
+
return {convoId, time, owner, ...data};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@Query(() => Boolean)
|
|
27
|
+
@UseMiddleware(isAuth)
|
|
28
|
+
async chatTyping(
|
|
29
|
+
@Ctx() ctx: ContextType,
|
|
30
|
+
@Arg('convoId', () => String, {nullable: false}) convoId: string,
|
|
31
|
+
@Arg('time', () => Date, {nullable: true}) time: Date // just to make the client HOT
|
|
32
|
+
): Promise<boolean> {
|
|
33
|
+
return chatTyping(ctx, convoId, time);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Query(() => ChatPagination)
|
|
37
|
+
async chatMessage(
|
|
38
|
+
@Ctx() ctx: ContextType,
|
|
39
|
+
@Arg('convoId', () => String, {nullable: false}) convoId: string,
|
|
40
|
+
// @Arg('sort', () => String, {nullable: true}) sortArg?: string,
|
|
41
|
+
@Arg('before', () => Date, {nullable: true}) before: Date,
|
|
42
|
+
@Arg('after', () => Date, {nullable: true}) after: Date,
|
|
43
|
+
@Arg('limit', () => Number, {nullable: true}) limit
|
|
44
|
+
): Promise<{
|
|
45
|
+
items: ChatMessage[];
|
|
46
|
+
hasNext: boolean;
|
|
47
|
+
params: any;
|
|
48
|
+
}> {
|
|
49
|
+
return chatMessage({ctx, convoId, before, after, limit});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@Mutation(() => ChatResType)
|
|
53
|
+
@UseMiddleware(isAuth)
|
|
54
|
+
async createChatMessage(
|
|
55
|
+
@Ctx() ctx: ContextType,
|
|
56
|
+
@Arg('args', () => ChatMessageType, {nullable: false}) args: ChatMessageType
|
|
57
|
+
): Promise<ChatResType> {
|
|
58
|
+
return createChatMessage(ctx, args);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export default ChatMessageResolver;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Only for client query graphql-tags
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import gql from 'graphql-tag';
|
|
2
|
+
|
|
3
|
+
export const ON_CHAT_CONVO_SUBSCRIPTION = gql`
|
|
4
|
+
subscription onChatConvo($convoId: String!) {
|
|
5
|
+
data: onChatConvo(convoId: $convoId)
|
|
6
|
+
}
|
|
7
|
+
`;
|
|
8
|
+
|
|
9
|
+
export const ON_CONVOS_SUBSCRIPTION = gql`
|
|
10
|
+
subscription OnConvos($owner: String!, $time: DateTime) {
|
|
11
|
+
data: onConvos(owner: $owner, time: $time) {
|
|
12
|
+
convoId
|
|
13
|
+
typing
|
|
14
|
+
message
|
|
15
|
+
time
|
|
16
|
+
owner
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import gql from 'graphql-tag';
|
|
2
|
+
|
|
3
|
+
export const ON_CHAT_MESSAGE_SUBSCRIPTION = gql`
|
|
4
|
+
subscription OnChatMessage($owner: String, $convoId: String!, $time: DateTime) {
|
|
5
|
+
data: onChatMessage(owner: $owner, convoId: $convoId, time: $time) {
|
|
6
|
+
convoId
|
|
7
|
+
typing
|
|
8
|
+
message
|
|
9
|
+
time
|
|
10
|
+
owner
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
`;
|
package/src/example.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
|
|
3
|
+
import {couchsetRoadman} from '@roadmanjs/couchset';
|
|
4
|
+
import {getChatResolvers} from '.';
|
|
5
|
+
import {roadman} from 'roadman';
|
|
6
|
+
|
|
7
|
+
roadman({
|
|
8
|
+
resolvers: [...getChatResolvers()],
|
|
9
|
+
roadmen: [couchsetRoadman as any],
|
|
10
|
+
})
|
|
11
|
+
.then(() => {
|
|
12
|
+
console.log('roadman started');
|
|
13
|
+
})
|
|
14
|
+
.catch((error) => {
|
|
15
|
+
console.error(error);
|
|
16
|
+
});
|
package/src/index.ts
ADDED
package/src/roadman.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
|
|
4
|
+
import {ChatConvoResolver, ChatMessageResolver} from './chat/resolvers';
|
|
5
|
+
import {RoadMan, RoadmanBuild} from '@roadmanjs/core';
|
|
6
|
+
|
|
7
|
+
// import {configureFirebase} from '@roadmanjs/firebase-admin';
|
|
8
|
+
import ChatConvoPublicResolver from './chat/resolvers/ChatConvo.public.resolver';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A roadman for chat and groups, using UserType from 'auth'
|
|
12
|
+
* @param RoadmanBuild
|
|
13
|
+
*/
|
|
14
|
+
export const chatRoadman: RoadMan = async (args: RoadmanBuild): Promise<RoadmanBuild> => {
|
|
15
|
+
// await configureFirebase();
|
|
16
|
+
return args;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const getChatResolvers = () => [
|
|
20
|
+
ChatConvoResolver,
|
|
21
|
+
ChatMessageResolver,
|
|
22
|
+
ChatConvoPublicResolver,
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export default chatRoadman;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {createClientPackageJson} from './createPackageJsonForClient';
|
|
2
|
+
import shelljs from 'shelljs';
|
|
3
|
+
import {writeFileSync} from 'fs';
|
|
4
|
+
/**
|
|
5
|
+
* TODO script to copy fragments, query, mutations, subscriptions into client output
|
|
6
|
+
* - The copy some parts of package-json, like version number
|
|
7
|
+
* - Publish the separate client package.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
Using shell we create an output folder with these files
|
|
12
|
+
dist-client
|
|
13
|
+
- README.md
|
|
14
|
+
- package.json (edited with minimal deps)
|
|
15
|
+
- docs
|
|
16
|
+
- register
|
|
17
|
+
- dist ✅
|
|
18
|
+
- fragments
|
|
19
|
+
- query
|
|
20
|
+
- mutations
|
|
21
|
+
- subscriptions
|
|
22
|
+
- index.ts
|
|
23
|
+
|
|
24
|
+
@PS - NOTES to friends reading this.
|
|
25
|
+
- Why not use yarn workspaces? these are smaller packages, some might have very few files, plus lerna private e.t.c...
|
|
26
|
+
- A script is more efficient and faster, can run together with main publishing CI/CD
|
|
27
|
+
- Two bird with one stone.
|
|
28
|
+
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
(async () => {
|
|
32
|
+
// Dirs
|
|
33
|
+
shelljs.rm('-rf', 'dist-client');
|
|
34
|
+
shelljs.mkdir('-p', 'dist-client');
|
|
35
|
+
shelljs.mkdir('-p', 'dist-client/dist');
|
|
36
|
+
|
|
37
|
+
// register & docs
|
|
38
|
+
shelljs.cp('-rf', 'register', 'dist-client/register');
|
|
39
|
+
shelljs.cp('-rf', 'docs', 'dist-client/docs');
|
|
40
|
+
|
|
41
|
+
// README.md
|
|
42
|
+
shelljs.cp('-rf', 'README.md', 'dist-client/README.md');
|
|
43
|
+
|
|
44
|
+
// package.json
|
|
45
|
+
// TODO edit package.json to make it smaller with less deps
|
|
46
|
+
// shelljs.cp('-rf', 'package.json', 'dist-client/package.json');
|
|
47
|
+
|
|
48
|
+
// frags, query, mutations, sub
|
|
49
|
+
shelljs.cp('-rf', 'dist/chat/fragments', 'dist-client/dist/fragments');
|
|
50
|
+
shelljs.cp('-rf', 'dist/chat/query', 'dist-client/dist/query');
|
|
51
|
+
shelljs.cp('-rf', 'dist/chat/mutations', 'dist-client/dist/mutations');
|
|
52
|
+
shelljs.cp('-rf', 'dist/chat/subscriptions', 'dist-client/dist/subscriptions');
|
|
53
|
+
|
|
54
|
+
// index
|
|
55
|
+
shelljs.cp('-rf', 'dist/chat/index-client.d.ts', 'dist-client/dist/index.d.ts');
|
|
56
|
+
shelljs.cp('-rf', 'dist/chat/index-client.js', 'dist-client/dist/index.js');
|
|
57
|
+
shelljs.cp('-rf', 'dist/chat/index-client.js.map', 'dist-client/dist/index.js.map');
|
|
58
|
+
|
|
59
|
+
const getPackageJsonFile = await createClientPackageJson();
|
|
60
|
+
console.log('string file', JSON.stringify(getPackageJsonFile));
|
|
61
|
+
writeFileSync('dist-client/package.json', JSON.stringify(getPackageJsonFile), {
|
|
62
|
+
encoding: 'utf8',
|
|
63
|
+
});
|
|
64
|
+
})();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple script to copy current version from main package.json and create a client version
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {readFileSync} from 'fs';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Re-usable method for generating client package.json
|
|
9
|
+
* @param clientPackageName
|
|
10
|
+
*/
|
|
11
|
+
export const createClientPackageJson = async (): Promise<Object> => {
|
|
12
|
+
const packageFile: any = await readFileSync('package.json', {encoding: 'utf8'});
|
|
13
|
+
const packageContentJSON = JSON.parse(packageFile);
|
|
14
|
+
|
|
15
|
+
const newPackage: Object = {
|
|
16
|
+
...packageContentJSON,
|
|
17
|
+
name: '@roadmanjs/chat-client', // TODO edit it from props
|
|
18
|
+
description: '@roadmanjs/chat fragments, query, mutations, subscriptions', // TODO from args
|
|
19
|
+
dependencies: {
|
|
20
|
+
// make it only one dep for easy client react .e.t.c
|
|
21
|
+
'graphql-tag': '^2.12.5',
|
|
22
|
+
},
|
|
23
|
+
devDependencies: {}, // make it empty
|
|
24
|
+
peerDependencies: {}, // make it empty
|
|
25
|
+
scripts: {}, // empty scripts
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// console.log('new packageJson file', newPackage);
|
|
29
|
+
|
|
30
|
+
return newPackage;
|
|
31
|
+
};
|
|
32
|
+
createClientPackageJson();
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {Field, ObjectType} from 'couchset';
|
|
2
|
+
// import { GraphQLObjectType, GraphQLScalarType } from "graphql"
|
|
3
|
+
import {Request, Response} from 'express';
|
|
4
|
+
|
|
5
|
+
import GraphQLJSON from 'graphql-type-json';
|
|
6
|
+
import {RedisPubSub} from 'graphql-redis-subscriptions';
|
|
7
|
+
|
|
8
|
+
export {GeoType} from 'couchset';
|
|
9
|
+
|
|
10
|
+
export interface ContextType {
|
|
11
|
+
req: Request;
|
|
12
|
+
res: Response;
|
|
13
|
+
payload?: any;
|
|
14
|
+
pubsub: RedisPubSub;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* GraphQL Types start
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* ChatResType
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
export interface GeoLocationType {
|
|
26
|
+
lat: number;
|
|
27
|
+
lon: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// export const getPagination = <T>(c: T): any =>
|
|
31
|
+
// new GraphQLObjectType({
|
|
32
|
+
// name: `${(c as any).name}Pagination`,
|
|
33
|
+
// fields: () => ({
|
|
34
|
+
// // items: {type: new GraphQLList(c as any)},
|
|
35
|
+
// hasNext: {type: GraphQLBoolean},
|
|
36
|
+
// params: {type: GraphQLString}, // TODO to GraphQLJSON
|
|
37
|
+
// }),
|
|
38
|
+
// });
|
|
39
|
+
|
|
40
|
+
@ObjectType()
|
|
41
|
+
export class ChatResType {
|
|
42
|
+
@Field(() => Boolean)
|
|
43
|
+
success: boolean;
|
|
44
|
+
|
|
45
|
+
@Field(() => String, {nullable: true})
|
|
46
|
+
message?: string;
|
|
47
|
+
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
49
|
+
@Field((type) => GraphQLJSON, {nullable: true})
|
|
50
|
+
data?: any;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const getPagination = <T>(c: T): any => {
|
|
54
|
+
@ObjectType(`${(c as any).name}Pagination`)
|
|
55
|
+
class Pagination {
|
|
56
|
+
@Field(() => [c], {nullable: true})
|
|
57
|
+
items: [typeof c];
|
|
58
|
+
|
|
59
|
+
@Field(() => Boolean, {nullable: true})
|
|
60
|
+
hasNext?: boolean;
|
|
61
|
+
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
63
|
+
@Field((type) => GraphQLJSON, {nullable: true})
|
|
64
|
+
params?: any;
|
|
65
|
+
}
|
|
66
|
+
return Pagination;
|
|
67
|
+
};
|