@memberjunction/server 1.8.0 → 2.0.0

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.
Files changed (191) hide show
  1. package/CHANGELOG.json +160 -1
  2. package/CHANGELOG.md +34 -2
  3. package/package.json +30 -39
  4. package/src/apolloServer/index.ts +0 -1
  5. package/src/auth/newUsers.ts +4 -3
  6. package/src/context.ts +19 -27
  7. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  8. package/src/generated/generated.ts +13440 -12226
  9. package/src/generic/ResolverBase.ts +297 -172
  10. package/src/generic/RunViewResolver.ts +204 -14
  11. package/src/index.ts +18 -19
  12. package/src/resolvers/AskSkipResolver.ts +44 -44
  13. package/src/resolvers/ColorResolver.ts +3 -14
  14. package/src/resolvers/DatasetResolver.ts +4 -4
  15. package/src/resolvers/EntityCommunicationsResolver.ts +42 -20
  16. package/src/resolvers/FileCategoryResolver.ts +2 -2
  17. package/src/resolvers/FileResolver.ts +6 -4
  18. package/src/resolvers/MergeRecordsResolver.ts +3 -2
  19. package/src/resolvers/PotentialDuplicateRecordResolver.ts +48 -40
  20. package/src/resolvers/QueryResolver.ts +2 -2
  21. package/src/resolvers/ReportResolver.ts +6 -6
  22. package/src/resolvers/UserFavoriteResolver.ts +8 -8
  23. package/src/resolvers/UserResolver.ts +3 -1
  24. package/src/resolvers/UserViewResolver.ts +1 -1
  25. package/src/types.ts +21 -0
  26. package/tsconfig.json +3 -4
  27. package/dist/apolloServer/TransactionPlugin.d.ts +0 -4
  28. package/dist/apolloServer/TransactionPlugin.d.ts.map +0 -1
  29. package/dist/apolloServer/TransactionPlugin.js +0 -49
  30. package/dist/apolloServer/TransactionPlugin.js.map +0 -1
  31. package/dist/apolloServer/index.d.ts +0 -11
  32. package/dist/apolloServer/index.d.ts.map +0 -1
  33. package/dist/apolloServer/index.js +0 -27
  34. package/dist/apolloServer/index.js.map +0 -1
  35. package/dist/auth/exampleNewUserSubClass.d.ts +0 -6
  36. package/dist/auth/exampleNewUserSubClass.d.ts.map +0 -1
  37. package/dist/auth/exampleNewUserSubClass.js +0 -54
  38. package/dist/auth/exampleNewUserSubClass.js.map +0 -1
  39. package/dist/auth/index.d.ts +0 -30
  40. package/dist/auth/index.d.ts.map +0 -1
  41. package/dist/auth/index.js +0 -129
  42. package/dist/auth/index.js.map +0 -1
  43. package/dist/auth/newUsers.d.ts +0 -5
  44. package/dist/auth/newUsers.d.ts.map +0 -1
  45. package/dist/auth/newUsers.js +0 -66
  46. package/dist/auth/newUsers.js.map +0 -1
  47. package/dist/auth/tokenExpiredError.d.ts +0 -5
  48. package/dist/auth/tokenExpiredError.d.ts.map +0 -1
  49. package/dist/auth/tokenExpiredError.js +0 -16
  50. package/dist/auth/tokenExpiredError.js.map +0 -1
  51. package/dist/cache.d.ts +0 -3
  52. package/dist/cache.d.ts.map +0 -1
  53. package/dist/cache.js +0 -11
  54. package/dist/cache.js.map +0 -1
  55. package/dist/config.d.ts +0 -196
  56. package/dist/config.d.ts.map +0 -1
  57. package/dist/config.js +0 -72
  58. package/dist/config.js.map +0 -1
  59. package/dist/context.d.ts +0 -17
  60. package/dist/context.d.ts.map +0 -1
  61. package/dist/context.js +0 -114
  62. package/dist/context.js.map +0 -1
  63. package/dist/directives/Public.d.ts +0 -4
  64. package/dist/directives/Public.d.ts.map +0 -1
  65. package/dist/directives/Public.js +0 -34
  66. package/dist/directives/Public.js.map +0 -1
  67. package/dist/directives/index.d.ts +0 -2
  68. package/dist/directives/index.d.ts.map +0 -1
  69. package/dist/directives/index.js +0 -18
  70. package/dist/directives/index.js.map +0 -1
  71. package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts +0 -6
  72. package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts.map +0 -1
  73. package/dist/entitySubclasses/DuplicateRunEntity.server.js +0 -37
  74. package/dist/entitySubclasses/DuplicateRunEntity.server.js.map +0 -1
  75. package/dist/entitySubclasses/EntityBehavior.server.d.ts +0 -29
  76. package/dist/entitySubclasses/EntityBehavior.server.d.ts.map +0 -1
  77. package/dist/entitySubclasses/EntityBehavior.server.js +0 -213
  78. package/dist/entitySubclasses/EntityBehavior.server.js.map +0 -1
  79. package/dist/entitySubclasses/entityPermissions.server.d.ts +0 -23
  80. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +0 -1
  81. package/dist/entitySubclasses/entityPermissions.server.js +0 -99
  82. package/dist/entitySubclasses/entityPermissions.server.js.map +0 -1
  83. package/dist/entitySubclasses/userViewEntity.server.d.ts +0 -13
  84. package/dist/entitySubclasses/userViewEntity.server.d.ts.map +0 -1
  85. package/dist/entitySubclasses/userViewEntity.server.js +0 -164
  86. package/dist/entitySubclasses/userViewEntity.server.js.map +0 -1
  87. package/dist/generated/generated.d.ts +0 -6420
  88. package/dist/generated/generated.d.ts.map +0 -1
  89. package/dist/generated/generated.js +0 -34770
  90. package/dist/generated/generated.js.map +0 -1
  91. package/dist/generic/DeleteOptionsInput.d.ts +0 -5
  92. package/dist/generic/DeleteOptionsInput.d.ts.map +0 -1
  93. package/dist/generic/DeleteOptionsInput.js +0 -28
  94. package/dist/generic/DeleteOptionsInput.js.map +0 -1
  95. package/dist/generic/KeyInputOutputTypes.d.ts +0 -16
  96. package/dist/generic/KeyInputOutputTypes.d.ts.map +0 -1
  97. package/dist/generic/KeyInputOutputTypes.js +0 -62
  98. package/dist/generic/KeyInputOutputTypes.js.map +0 -1
  99. package/dist/generic/KeyValuePairInput.d.ts +0 -5
  100. package/dist/generic/KeyValuePairInput.d.ts.map +0 -1
  101. package/dist/generic/KeyValuePairInput.js +0 -28
  102. package/dist/generic/KeyValuePairInput.js.map +0 -1
  103. package/dist/generic/PushStatusResolver.d.ts +0 -14
  104. package/dist/generic/PushStatusResolver.d.ts.map +0 -1
  105. package/dist/generic/PushStatusResolver.js +0 -58
  106. package/dist/generic/PushStatusResolver.js.map +0 -1
  107. package/dist/generic/ResolverBase.d.ts +0 -37
  108. package/dist/generic/ResolverBase.d.ts.map +0 -1
  109. package/dist/generic/ResolverBase.js +0 -468
  110. package/dist/generic/ResolverBase.js.map +0 -1
  111. package/dist/generic/RunViewResolver.d.ts +0 -88
  112. package/dist/generic/RunViewResolver.d.ts.map +0 -1
  113. package/dist/generic/RunViewResolver.js +0 -443
  114. package/dist/generic/RunViewResolver.js.map +0 -1
  115. package/dist/index.d.ts +0 -28
  116. package/dist/index.d.ts.map +0 -1
  117. package/dist/index.js +0 -145
  118. package/dist/index.js.map +0 -1
  119. package/dist/orm.d.ts +0 -4
  120. package/dist/orm.d.ts.map +0 -1
  121. package/dist/orm.js +0 -34
  122. package/dist/orm.js.map +0 -1
  123. package/dist/resolvers/AskSkipResolver.d.ts +0 -54
  124. package/dist/resolvers/AskSkipResolver.d.ts.map +0 -1
  125. package/dist/resolvers/AskSkipResolver.js +0 -800
  126. package/dist/resolvers/AskSkipResolver.js.map +0 -1
  127. package/dist/resolvers/ColorResolver.d.ts +0 -22
  128. package/dist/resolvers/ColorResolver.d.ts.map +0 -1
  129. package/dist/resolvers/ColorResolver.js +0 -94
  130. package/dist/resolvers/ColorResolver.js.map +0 -1
  131. package/dist/resolvers/DatasetResolver.d.ts +0 -42
  132. package/dist/resolvers/DatasetResolver.d.ts.map +0 -1
  133. package/dist/resolvers/DatasetResolver.js +0 -168
  134. package/dist/resolvers/DatasetResolver.js.map +0 -1
  135. package/dist/resolvers/EntityCommunicationsResolver.d.ts +0 -49
  136. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +0 -1
  137. package/dist/resolvers/EntityCommunicationsResolver.js +0 -228
  138. package/dist/resolvers/EntityCommunicationsResolver.js.map +0 -1
  139. package/dist/resolvers/EntityRecordNameResolver.d.ts +0 -21
  140. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +0 -1
  141. package/dist/resolvers/EntityRecordNameResolver.js +0 -113
  142. package/dist/resolvers/EntityRecordNameResolver.js.map +0 -1
  143. package/dist/resolvers/EntityResolver.d.ts +0 -6
  144. package/dist/resolvers/EntityResolver.d.ts.map +0 -1
  145. package/dist/resolvers/EntityResolver.js +0 -60
  146. package/dist/resolvers/EntityResolver.js.map +0 -1
  147. package/dist/resolvers/FileCategoryResolver.d.ts +0 -6
  148. package/dist/resolvers/FileCategoryResolver.d.ts.map +0 -1
  149. package/dist/resolvers/FileCategoryResolver.js +0 -65
  150. package/dist/resolvers/FileCategoryResolver.js.map +0 -1
  151. package/dist/resolvers/FileResolver.d.ts +0 -24
  152. package/dist/resolvers/FileResolver.d.ts.map +0 -1
  153. package/dist/resolvers/FileResolver.js +0 -162
  154. package/dist/resolvers/FileResolver.js.map +0 -1
  155. package/dist/resolvers/MergeRecordsResolver.d.ts +0 -59
  156. package/dist/resolvers/MergeRecordsResolver.d.ts.map +0 -1
  157. package/dist/resolvers/MergeRecordsResolver.js +0 -256
  158. package/dist/resolvers/MergeRecordsResolver.js.map +0 -1
  159. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +0 -29
  160. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +0 -1
  161. package/dist/resolvers/PotentialDuplicateRecordResolver.js +0 -127
  162. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +0 -1
  163. package/dist/resolvers/QueryResolver.d.ts +0 -13
  164. package/dist/resolvers/QueryResolver.d.ts.map +0 -1
  165. package/dist/resolvers/QueryResolver.js +0 -74
  166. package/dist/resolvers/QueryResolver.js.map +0 -1
  167. package/dist/resolvers/ReportResolver.d.ts +0 -20
  168. package/dist/resolvers/ReportResolver.d.ts.map +0 -1
  169. package/dist/resolvers/ReportResolver.js +0 -175
  170. package/dist/resolvers/ReportResolver.js.map +0 -1
  171. package/dist/resolvers/UserFavoriteResolver.d.ts +0 -42
  172. package/dist/resolvers/UserFavoriteResolver.d.ts.map +0 -1
  173. package/dist/resolvers/UserFavoriteResolver.js +0 -221
  174. package/dist/resolvers/UserFavoriteResolver.js.map +0 -1
  175. package/dist/resolvers/UserResolver.d.ts +0 -10
  176. package/dist/resolvers/UserResolver.d.ts.map +0 -1
  177. package/dist/resolvers/UserResolver.js +0 -72
  178. package/dist/resolvers/UserResolver.js.map +0 -1
  179. package/dist/resolvers/UserViewResolver.d.ts +0 -13
  180. package/dist/resolvers/UserViewResolver.d.ts.map +0 -1
  181. package/dist/resolvers/UserViewResolver.js +0 -102
  182. package/dist/resolvers/UserViewResolver.js.map +0 -1
  183. package/dist/types.d.ts +0 -17
  184. package/dist/types.d.ts.map +0 -1
  185. package/dist/types.js +0 -3
  186. package/dist/types.js.map +0 -1
  187. package/dist/util.d.ts +0 -4
  188. package/dist/util.d.ts.map +0 -1
  189. package/dist/util.js +0 -89
  190. package/dist/util.js.map +0 -1
  191. package/src/entitySubclasses/EntityBehavior.server.ts +0 -241
@@ -1,83 +1,91 @@
1
- import { Arg, Ctx, Field, Float, InputType, Int, ObjectType, Query, Resolver } from "type-graphql";
2
- import { PotentialDuplicateRequest, PotentialDuplicateResponse, PotentialDuplicate, Metadata, KeyValuePair, LogError, CompositeKey, PotentialDuplicateResult } from '@memberjunction/core';
3
- import { AppContext } from "../types";
4
- import { UserCache } from "@memberjunction/sqlserver-dataprovider";
1
+ import { Arg, Ctx, Field, Float, InputType, Int, ObjectType, Query, Resolver } from 'type-graphql';
2
+ import {
3
+ PotentialDuplicateRequest,
4
+ PotentialDuplicateResponse,
5
+ PotentialDuplicate,
6
+ Metadata,
7
+ CompositeKey,
8
+ PotentialDuplicateResult,
9
+ } from '@memberjunction/core';
10
+ import { AppContext } from '../types';
11
+ import { UserCache } from '@memberjunction/sqlserver-dataprovider';
5
12
 
6
13
  //load the default vectorDB and embedding model
7
- import {LoadMistralEmbedding} from '@memberjunction/ai-mistral';
8
- import {LoadPineconeVectorDB} from '@memberjunction/ai-vectors-pinecone';
9
- import { CompositeKeyInputType, CompositeKeyOutputType, KeyValuePairOutputType } from "../generic/KeyInputOutputTypes";
14
+ import { LoadMistralEmbedding } from '@memberjunction/ai-mistral';
15
+ import { LoadPineconeVectorDB } from '@memberjunction/ai-vectors-pinecone';
16
+ import { CompositeKeyInputType, CompositeKeyOutputType, KeyValuePairOutputType } from '../generic/KeyInputOutputTypes';
10
17
  LoadMistralEmbedding();
11
18
  LoadPineconeVectorDB();
12
19
 
13
20
  @InputType()
14
21
  export class PotentialDuplicateRequestType extends PotentialDuplicateRequest {
15
- @Field(() => Int)
16
- EntityID: number;
22
+ @Field(() => String)
23
+ declare EntityID: string;
17
24
 
18
25
  @Field(() => [CompositeKeyInputType])
19
- RecordIDs: CompositeKey[];
26
+ declare RecordIDs: CompositeKey[];
20
27
 
21
- @Field(() => Int, { nullable: true })
22
- EntityDocumentID: number;
28
+ @Field(() => String, { nullable: true })
29
+ declare EntityDocumentID: string;
23
30
 
24
31
  @Field(() => Int, { nullable: true })
25
- ProbabilityScore: number;
26
-
27
- @Field(() => Int)
28
- ListID: number;
32
+ declare ProbabilityScore: number;
33
+
34
+ @Field(() => String)
35
+ declare ListID: string;
29
36
  }
30
37
 
31
38
  @ObjectType()
32
39
  export class PotentialDuplicateType extends PotentialDuplicate {
33
40
  @Field(() => Float)
34
- ProbabilityScore: number;
41
+ declare ProbabilityScore: number;
35
42
 
36
43
  @Field(() => [KeyValuePairOutputType])
37
- KeyValuePairs: KeyValuePairOutputType[];
44
+ declare KeyValuePairs: KeyValuePairOutputType[];
38
45
  }
39
46
 
40
47
  @ObjectType()
41
48
  export class PotentialDuplicateResultType extends PotentialDuplicateResult {
42
- @Field(() => Int, { nullable: true })
43
- EntityID: number;
49
+ @Field(() => String, { nullable: true })
50
+ declare EntityID: string;
44
51
 
45
52
  @Field(() => [PotentialDuplicateType])
46
- Duplicates: PotentialDuplicateType[];
53
+ declare Duplicates: PotentialDuplicateType[];
47
54
 
48
55
  @Field(() => CompositeKeyOutputType)
49
56
  RecordPrimaryKeys: CompositeKey;
50
57
 
51
- @Field(() => [Int])
52
- DuplicateRunDetailMatchRecordIDs: number[];
58
+ @Field(() => [String])
59
+ declare DuplicateRunDetailMatchRecordIDs: string[];
53
60
  }
54
61
 
55
62
  @ObjectType()
56
- export class PotentialDuplicateResponseType extends PotentialDuplicateResponse{
57
-
63
+ export class PotentialDuplicateResponseType extends PotentialDuplicateResponse {
58
64
  @Field(() => String)
59
- Status: 'Inprogress' | 'Success' | 'Error';
65
+ declare Status: 'Inprogress' | 'Success' | 'Error';
60
66
 
61
67
  @Field(() => String, { nullable: true })
62
- ErrorMessage?: string;
68
+ declare ErrorMessage?: string;
63
69
 
64
70
  @Field(() => [PotentialDuplicateResultType])
65
- PotentialDuplicateResult: PotentialDuplicateResult[]
71
+ declare PotentialDuplicateResult: PotentialDuplicateResult[];
66
72
  }
67
73
 
68
74
  @Resolver(PotentialDuplicateResponseType)
69
75
  export class DuplicateRecordResolver {
70
-
71
76
  @Query(() => PotentialDuplicateResponseType)
72
- async GetRecordDuplicates(@Ctx() { dataSource, userPayload }: AppContext, @Arg("params")params: PotentialDuplicateRequestType): Promise<PotentialDuplicateResponseType> {
73
- const md = new Metadata();
74
-
75
- const user = UserCache.Instance.Users.find((u) => u.Email.trim().toLowerCase() === userPayload.email.trim().toLowerCase());
76
- if (!user) {
77
- throw new Error(`User ${userPayload.email} not found in UserCache`);
78
- }
79
-
80
- const result = await md.GetRecordDuplicates(params, user);
81
- return result;
77
+ async GetRecordDuplicates(
78
+ @Ctx() { dataSource, userPayload }: AppContext,
79
+ @Arg('params') params: PotentialDuplicateRequestType
80
+ ): Promise<PotentialDuplicateResponseType> {
81
+ const md = new Metadata();
82
+
83
+ const user = UserCache.Instance.Users.find((u) => u.Email.trim().toLowerCase() === userPayload.email.trim().toLowerCase());
84
+ if (!user) {
85
+ throw new Error(`User ${userPayload.email} not found in UserCache`);
82
86
  }
83
- }
87
+
88
+ const result = await md.GetRecordDuplicates(params, user);
89
+ return result;
90
+ }
91
+ }
@@ -6,7 +6,7 @@ import { AppContext } from '../types';
6
6
  @ObjectType()
7
7
  export class RunQueryResultType {
8
8
  @Field()
9
- QueryID: number;
9
+ QueryID: string;
10
10
 
11
11
  @Field()
12
12
  Success: boolean;
@@ -27,7 +27,7 @@ export class RunQueryResultType {
27
27
  @Resolver(RunQueryResultType)
28
28
  export class ReportResolver {
29
29
  @Query(() => RunQueryResultType)
30
- async GetQueryData(@Arg('QueryID', () => Int) QueryID: number, @Ctx() {}: AppContext): Promise<RunQueryResultType> {
30
+ async GetQueryData(@Arg('QueryID', () => String) QueryID: string, @Ctx() {}: AppContext): Promise<RunQueryResultType> {
31
31
  const runQuery = new RunQuery();
32
32
  const result = await runQuery.RunQuery({ QueryID: QueryID });
33
33
  return {
@@ -9,7 +9,7 @@ import { UserCache } from '@memberjunction/sqlserver-dataprovider';
9
9
  @ObjectType()
10
10
  export class RunReportResultType {
11
11
  @Field()
12
- ReportID: number;
12
+ ReportID: string;
13
13
 
14
14
  @Field()
15
15
  Success: boolean;
@@ -30,7 +30,7 @@ export class RunReportResultType {
30
30
  @ObjectType()
31
31
  export class CreateReportResultType {
32
32
  @Field()
33
- ReportID: number;
33
+ ReportID: string;
34
34
 
35
35
  @Field()
36
36
  ReportName: string;
@@ -45,7 +45,7 @@ export class CreateReportResultType {
45
45
  @Resolver(RunReportResultType)
46
46
  export class ReportResolverExtended {
47
47
  @Query(() => RunReportResultType)
48
- async GetReportData(@Arg('ReportID', () => Int) ReportID: number, @Ctx() {}: AppContext): Promise<RunReportResultType> {
48
+ async GetReportData(@Arg('ReportID', () => String) ReportID: string, @Ctx() {}: AppContext): Promise<RunReportResultType> {
49
49
  const runReport = new RunReport();
50
50
  const result = await runReport.RunReport({ ReportID: ReportID });
51
51
  return {
@@ -62,7 +62,7 @@ export class ReportResolverExtended {
62
62
  * This mutation will create a new report from a conversation detail ID
63
63
  */
64
64
  @Mutation(() => CreateReportResultType)
65
- async CreateReportFromConversationDetailID(@Arg('ConversationDetailID', () => Int) ConversationDetailID: number,
65
+ async CreateReportFromConversationDetailID(@Arg('ConversationDetailID', () => String) ConversationDetailID: string,
66
66
  @Ctx() {dataSource, userPayload}: AppContext): Promise<CreateReportResultType> {
67
67
  try {
68
68
  const md = new Metadata();
@@ -128,7 +128,7 @@ export class ReportResolverExtended {
128
128
  }
129
129
  else {
130
130
  return {
131
- ReportID: -1,
131
+ ReportID: "",
132
132
  ReportName: '',
133
133
  Success: false,
134
134
  ErrorMessage: 'Unable to save new report'
@@ -137,7 +137,7 @@ export class ReportResolverExtended {
137
137
  }
138
138
  catch (ex) {
139
139
  return {
140
- ReportID: -1,
140
+ ReportID: "",
141
141
  ReportName: '',
142
142
  Success: false,
143
143
  ErrorMessage: 'Unable to create new report: ' + ex.message
@@ -10,26 +10,26 @@ import { UserFavorite_, UserFavoriteResolverBase } from '../generated/generated'
10
10
  //****************************************************************************
11
11
  @InputType()
12
12
  export class UserFavoriteSearchParams {
13
- @Field(() => Int)
14
- EntityID: number;
13
+ @Field(() => String)
14
+ EntityID: string;
15
15
 
16
16
  @Field(() => CompositeKeyInputType)
17
17
  CompositeKey: CompositeKeyInputType;
18
18
 
19
- @Field(() => Int)
20
- UserID: number;
19
+ @Field(() => String)
20
+ UserID: string;
21
21
  }
22
22
 
23
23
  @InputType()
24
24
  export class UserFavoriteSetParams {
25
- @Field(() => Int)
26
- EntityID: number;
25
+ @Field(() => String)
26
+ EntityID: string;
27
27
 
28
28
  @Field(() => CompositeKeyInputType)
29
29
  CompositeKey: CompositeKeyInputType;
30
30
 
31
- @Field(() => Int)
32
- UserID: number;
31
+ @Field(() => String)
32
+ UserID: string;
33
33
 
34
34
  @Field(() => Boolean)
35
35
  IsFavorite: boolean;
@@ -5,7 +5,9 @@ import { User_, UserResolverBase } from '../generated/generated';
5
5
  export class UserResolver extends UserResolverBase {
6
6
  @Query(() => User_)
7
7
  async CurrentUser(@Ctx() { dataSource, userPayload }: AppContext) {
8
- return await this.UserByEmail(userPayload.email, { dataSource, userPayload });
8
+ const result = await this.UserByEmail(userPayload.email, { dataSource, userPayload });
9
+ console.log('CurrentUser', result);
10
+ return result;
9
11
  }
10
12
 
11
13
  @Query(() => User_)
@@ -43,7 +43,7 @@ export class UserViewResolver extends UserViewResolverBase {
43
43
  }
44
44
 
45
45
  @Query(() => [UserView_])
46
- async UpdateWhereClause(@Arg('ID', () => Int) ID: number, @Ctx() { userPayload }: AppContext) {
46
+ async UpdateWhereClause(@Arg('ID', () => String) ID: string, @Ctx() { userPayload }: AppContext) {
47
47
  // in this query we want to update the uesrView record in the DB with a new where clause
48
48
  // this should normally not be a factor but we have this exposed in the GraphQL API so that
49
49
  // a dev can force the update if desired from the client. The normal path is just to update
package/src/types.ts CHANGED
@@ -1,4 +1,6 @@
1
+ import { UserViewEntity } from '@memberjunction/core-entities';
1
2
  import { GraphQLSchema } from 'graphql';
3
+ import { PubSubEngine } from 'type-graphql';
2
4
  import { DataSource, QueryRunner } from 'typeorm';
3
5
 
4
6
  export type UserPayload = {
@@ -17,3 +19,22 @@ export type DirectiveBuilder = {
17
19
  typeDefs: string;
18
20
  transformer: (schema: GraphQLSchema) => GraphQLSchema;
19
21
  };
22
+
23
+ export type RunViewGenericParams = {
24
+ viewInfo: UserViewEntity;
25
+ dataSource: DataSource;
26
+ extraFilter: string;
27
+ orderBy: string;
28
+ userSearchString: string;
29
+ excludeUserViewRunID?: string;
30
+ overrideExcludeFilter?: string;
31
+ saveViewResults?: boolean;
32
+ fields?: string[];
33
+ ignoreMaxRows?: boolean;
34
+ excludeDataFromAllPriorViewRuns?: boolean;
35
+ forceAuditLog?: boolean;
36
+ auditLogDescription?: string;
37
+ resultType?: string;
38
+ userPayload?: UserPayload;
39
+ pubSub: PubSubEngine
40
+ }
package/tsconfig.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "module": "commonjs",
4
- "target": "es2020",
3
+ "module": "ESNext",
4
+ "target": "ESNext",
5
5
  "outDir": "dist",
6
6
  "rootDir": "src",
7
7
  "sourceMap": true,
@@ -23,8 +23,7 @@
23
23
  "noFallthroughCasesInSwitch": true,
24
24
  "allowSyntheticDefaultImports": true,
25
25
  "emitDecoratorMetadata": true,
26
- "skipLibCheck": true,
27
- "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo"
26
+ "skipLibCheck": true
28
27
  },
29
28
  "exclude": ["node_modules"],
30
29
  "include": ["./src/**/*.ts"]
@@ -1,4 +0,0 @@
1
- import { ApolloServerPlugin } from '@apollo/server';
2
- import { AppContext } from '../types';
3
- export declare const TransactionPlugin: ApolloServerPlugin<AppContext>;
4
- //# sourceMappingURL=TransactionPlugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionPlugin.d.ts","sourceRoot":"","sources":["../../src/apolloServer/TransactionPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgF,MAAM,gBAAgB,CAAC;AAElI,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,UAAU,CAoD5D,CAAC"}
@@ -1,49 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TransactionPlugin = void 0;
4
- exports.TransactionPlugin = {
5
- async requestDidStart(requestContext) {
6
- const start = Date.now();
7
- const query = requestContext.request.query || '';
8
- const isMutation = /^\s*mutation\b/i.test(query);
9
- if (!isMutation) {
10
- return null;
11
- }
12
- const dataSource = requestContext.contextValue.dataSource;
13
- const queryRunner = dataSource.createQueryRunner();
14
- requestContext.contextValue.queryRunner = queryRunner;
15
- console.log('Starting transaction wrapper, time spent: ', Date.now() - start, 'ms ');
16
- await queryRunner.startTransaction();
17
- return {
18
- didEncounterErrors: async (requestContext) => {
19
- console.log('Error in transaction wrapper: ' + requestContext.errors, 'time spent: ', Date.now() - start, 'ms');
20
- },
21
- executionDidStart: async () => {
22
- return {
23
- executionDidEnd: async (err) => {
24
- try {
25
- if (err) {
26
- console.log('Error in transaction, rolling back, time spent: ', Date.now() - start, 'ms ');
27
- console.error('Rolling back transaction', err);
28
- await queryRunner.rollbackTransaction();
29
- }
30
- else {
31
- console.log('Committing transaction, time spent: ', Date.now() - start, 'ms ');
32
- await queryRunner.commitTransaction();
33
- }
34
- }
35
- catch (execErr) {
36
- console.log('Execution Error, time spent: ', Date.now() - start, 'ms ');
37
- console.error(execErr);
38
- }
39
- finally {
40
- await queryRunner.release();
41
- console.log('Transaction complete, time spent: ', Date.now() - start, 'ms ');
42
- }
43
- },
44
- };
45
- },
46
- };
47
- },
48
- };
49
- //# sourceMappingURL=TransactionPlugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionPlugin.js","sourceRoot":"","sources":["../../src/apolloServer/TransactionPlugin.ts"],"names":[],"mappings":";;;AAIa,QAAA,iBAAiB,GAAmC;IAC/D,KAAK,CAAC,eAAe,CAAC,cAAc;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAKD,MAAM,UAAU,GAAe,cAAc,CAAC,YAAY,CAAC,UAAU,CAAC;QACtE,MAAM,WAAW,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAEnD,cAAc,CAAC,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;QACrF,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAC;QAErC,OAAO;YACL,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;gBAC3C,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YAClH,CAAC;YACD,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC5B,OAAO;oBACL,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;wBAC7B,IAAI,CAAC;4BACH,IAAI,GAAG,EAAE,CAAC;gCACR,OAAO,CAAC,GAAG,CACT,kDAAkD,EAClD,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAClB,KAAK,CACN,CAAC;gCACF,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;gCAC/C,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;4BAC1C,CAAC;iCAAM,CAAC;gCACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;gCAC/E,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;4BACxC,CAAC;wBACH,CAAC;wBAAC,OAAO,OAAO,EAAE,CAAC;4BACjB,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;4BACxE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACzB,CAAC;gCAAS,CAAC;4BACT,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;4BAC5B,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;wBAC/E,CAAC;oBACH,CAAC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -1,11 +0,0 @@
1
- /// <reference types="node" />
2
- import { ApolloServer, ApolloServerOptions } from '@apollo/server';
3
- import { Disposable } from 'graphql-ws';
4
- import { Server } from 'http';
5
- import { AppContext } from '../types';
6
- declare const buildApolloServer: (configOverride: ApolloServerOptions<AppContext>, { httpServer, serverCleanup }: {
7
- httpServer: Server;
8
- serverCleanup: Disposable;
9
- }) => ApolloServer<AppContext>;
10
- export default buildApolloServer;
11
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/apolloServer/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGnE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,QAAA,MAAM,iBAAiB,mBACL,oBAAoB,UAAU,CAAC,iCAChB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,UAAU,CAAA;CAAE,6BAoB9E,CAAC;AAEL,eAAe,iBAAiB,CAAC"}
@@ -1,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const server_1 = require("@apollo/server");
4
- const drainHttpServer_1 = require("@apollo/server/plugin/drainHttpServer");
5
- const config_1 = require("../config");
6
- const TransactionPlugin_1 = require("./TransactionPlugin");
7
- const buildApolloServer = (configOverride, { httpServer, serverCleanup }) => new server_1.ApolloServer({
8
- csrfPrevention: true,
9
- cache: 'bounded',
10
- plugins: [
11
- (0, drainHttpServer_1.ApolloServerPluginDrainHttpServer)({ httpServer }),
12
- TransactionPlugin_1.TransactionPlugin,
13
- {
14
- async serverWillStart() {
15
- return {
16
- async drainServer() {
17
- await serverCleanup.dispose();
18
- },
19
- };
20
- },
21
- },
22
- ],
23
- introspection: config_1.enableIntrospection,
24
- ...configOverride,
25
- });
26
- exports.default = buildApolloServer;
27
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/apolloServer/index.ts"],"names":[],"mappings":";;AAAA,2CAAmE;AACnE,2EAA0F;AAI1F,sCAAgD;AAEhD,2DAAwD;AAExD,MAAM,iBAAiB,GAAG,CACxB,cAA+C,EAC/C,EAAE,UAAU,EAAE,aAAa,EAAqD,EAChF,EAAE,CACF,IAAI,qBAAY,CAAC;IACf,cAAc,EAAE,IAAI;IACpB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE;QACP,IAAA,mDAAiC,EAAC,EAAE,UAAU,EAAE,CAAC;QACjD,qCAAiB;QACjB;YACE,KAAK,CAAC,eAAe;gBACnB,OAAO;oBACL,KAAK,CAAC,WAAW;wBACf,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;oBAChC,CAAC;iBACF,CAAC;YACJ,CAAC;SACF;KACF;IACD,aAAa,EAAE,4BAAmB;IAClC,GAAG,cAAc;CAClB,CAAC,CAAC;AAEL,kBAAe,iBAAiB,CAAC"}
@@ -1,6 +0,0 @@
1
- import { NewUserBase } from "./newUsers";
2
- export declare class ExampleNewUserSubClass extends NewUserBase {
3
- createNewUser(firstName: string, lastName: string, email: string): Promise<import("@memberjunction/core-entities").UserEntity>;
4
- }
5
- export declare function LoadExampleNewUserSubClass(): void;
6
- //# sourceMappingURL=exampleNewUserSubClass.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exampleNewUserSubClass.d.ts","sourceRoot":"","sources":["../../src/auth/exampleNewUserSubClass.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAYzC,qBAAa,sBAAuB,SAAQ,WAAW;IAC7B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAsDzF;AAED,wBAAgB,0BAA0B,SAEzC"}
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LoadExampleNewUserSubClass = exports.ExampleNewUserSubClass = void 0;
4
- const core_1 = require("@memberjunction/core");
5
- const newUsers_1 = require("./newUsers");
6
- const sqlserver_dataprovider_1 = require("@memberjunction/sqlserver-dataprovider");
7
- const config_1 = require("../config");
8
- class ExampleNewUserSubClass extends newUsers_1.NewUserBase {
9
- async createNewUser(firstName, lastName, email) {
10
- try {
11
- const md = new core_1.Metadata();
12
- const contextUser = sqlserver_dataprovider_1.UserCache.Instance.Users.find(u => u.Email.trim().toLowerCase() === config_1.configInfo?.userHandling?.contextUserForNewUserCreation?.trim().toLowerCase());
13
- if (!contextUser) {
14
- (0, core_1.LogError)(`Failed to load context user ${config_1.configInfo?.userHandling?.contextUserForNewUserCreation}, if you've not specified this on your config.json you must do so. This is the user that is contextually used for creating a new user record dynamically.`);
15
- return undefined;
16
- }
17
- const pEntity = md.Entities.find(e => e.Name === 'Persons');
18
- if (!pEntity) {
19
- (0, core_1.LogError)('Failed to find Persons entity');
20
- return undefined;
21
- }
22
- let personId;
23
- const rv = new core_1.RunView();
24
- const viewResults = await rv.RunView({
25
- EntityName: 'Persons',
26
- ExtraFilter: `Email = '${email}'`
27
- }, contextUser);
28
- if (viewResults && viewResults.Success && Array.isArray(viewResults.Results) && viewResults.Results.length > 0) {
29
- const row = viewResults.Results[0];
30
- personId = row['ID'];
31
- }
32
- if (!personId) {
33
- const p = await md.GetEntityObject('Persons', contextUser);
34
- p.NewRecord();
35
- if (await p.Save()) {
36
- personId = p.FirstPrimaryKey.Value;
37
- }
38
- else {
39
- (0, core_1.LogError)(`Failed to create new person ${firstName} ${lastName} ${email}`);
40
- }
41
- }
42
- return super.createNewUser(firstName, lastName, email, 'Other', pEntity?.ID, personId);
43
- }
44
- catch (e) {
45
- (0, core_1.LogError)(`Error creating new user ${email} ${e}`);
46
- return undefined;
47
- }
48
- }
49
- }
50
- exports.ExampleNewUserSubClass = ExampleNewUserSubClass;
51
- function LoadExampleNewUserSubClass() {
52
- }
53
- exports.LoadExampleNewUserSubClass = LoadExampleNewUserSubClass;
54
- //# sourceMappingURL=exampleNewUserSubClass.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exampleNewUserSubClass.js","sourceRoot":"","sources":["../../src/auth/exampleNewUserSubClass.ts"],"names":[],"mappings":";;;AACA,+CAAmE;AACnE,yCAAyC;AACzC,mFAAmE;AACnE,sCAAuC;AAUvC,MAAa,sBAAuB,SAAQ,sBAAW;IACnC,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,QAAgB,EAAE,KAAa;QAClF,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,eAAQ,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,kCAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,mBAAU,EAAE,YAAY,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YACtK,IAAG,CAAC,WAAW,EAAE,CAAC;gBACd,IAAA,eAAQ,EAAC,+BAA+B,mBAAU,EAAE,YAAY,EAAE,6BAA6B,2JAA2J,CAAC,CAAC;gBAC5P,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,IAAA,eAAQ,EAAC,+BAA+B,CAAC,CAAC;gBAC1C,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,IAAI,QAAQ,CAAC;YAEb,MAAM,EAAE,GAAG,IAAI,cAAO,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;gBACjC,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,YAAY,KAAK,GAAG;aACpC,EAAE,WAAW,CAAC,CAAA;YAEf,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAE7G,MAAM,GAAG,GAAI,WAAW,CAAC,OAA4B,CAAC,CAAC,CAAC,CAAC;gBACzD,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAEZ,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAC3D,CAAC,CAAC,SAAS,EAAE,CAAC;gBAMd,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACjB,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC;gBACvC,CAAC;qBACI,CAAC;oBACF,IAAA,eAAQ,EAAC,+BAA+B,SAAS,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAA;gBAC7E,CAAC;YACL,CAAC;YAGD,OAAO,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,IAAA,eAAQ,EAAC,2BAA2B,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;YAClD,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;CACJ;AAvDD,wDAuDC;AAED,SAAgB,0BAA0B;AAE1C,CAAC;AAFD,gEAEC"}
@@ -1,30 +0,0 @@
1
- import { JwtHeader, SigningKeyCallback } from 'jsonwebtoken';
2
- import { DataSource } from 'typeorm';
3
- import { UserInfo } from '@memberjunction/core';
4
- export * from './tokenExpiredError';
5
- export declare const validationOptions: {
6
- [x: string]: {
7
- audience: string;
8
- jwksUri: string;
9
- };
10
- };
11
- export declare class UserPayload {
12
- aio?: string;
13
- aud?: string;
14
- exp?: number;
15
- iat?: number;
16
- iss?: string;
17
- name?: string;
18
- nbf?: number;
19
- nonce?: string;
20
- oid?: string;
21
- preferred_username?: string;
22
- rh?: string;
23
- sub?: string;
24
- tid?: string;
25
- uti?: string;
26
- ver?: string;
27
- }
28
- export declare const getSigningKeys: (issuer: string) => (header: JwtHeader, cb: SigningKeyCallback) => void;
29
- export declare const verifyUserRecord: (email?: string, firstName?: string, lastName?: string, requestDomain?: string, dataSource?: DataSource, attemptCacheUpdateIfNeeded?: boolean) => Promise<UserInfo | undefined>;
30
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAI7D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAI1D,cAAc,qBAAqB,CAAC;AAiBpC,eAAO,MAAM,iBAAiB;;;;;CAS7B,CAAC;AAEF,qBAAa,WAAW;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CAEd;AAED,eAAO,MAAM,cAAc,WAAY,MAAM,cAAc,SAAS,MAAM,kBAAkB,SAsB3F,CAAC;AAEF,eAAO,MAAM,gBAAgB,WAAkB,MAAM,cAAc,MAAM,aAAa,MAAM,kBAAkB,MAAM,eAAe,UAAU,+BAA8B,OAAO,KAAU,QAAQ,QAAQ,GAAG,SAAS,CAsEvN,CAAC"}