@memberjunction/graphql-dataprovider 0.9.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.
@@ -0,0 +1,2 @@
1
+ import { GraphQLDataProvider, GraphQLProviderConfigData } from "./graphQLDataProvider";
2
+ export declare function setupGraphQLClient(config: GraphQLProviderConfigData): Promise<GraphQLDataProvider>;
package/dist/config.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupGraphQLClient = void 0;
4
+ const core_1 = require("@memberjunction/core");
5
+ const graphQLDataProvider_1 = require("./graphQLDataProvider");
6
+ async function setupGraphQLClient(config) {
7
+ // Set the provider for all entities to be GraphQL in this project, can use a different provider in other situations....
8
+ const provider = new graphQLDataProvider_1.GraphQLDataProvider();
9
+ // BaseEntity + Metadata share the same GraphQLDataProvider instance
10
+ core_1.BaseEntity.Provider = provider;
11
+ core_1.Metadata.Provider = provider;
12
+ core_1.RunView.Provider = provider;
13
+ core_1.RunReport.Provider = provider;
14
+ await provider.Config(config);
15
+ return provider;
16
+ }
17
+ exports.setupGraphQLClient = setupGraphQLClient;
18
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAAA,+CAAgF;AAChF,+DAAuF;AAEhF,KAAK,UAAU,kBAAkB,CAAC,MAAiC;IACtE,wHAAwH;IACxH,MAAM,QAAQ,GAAG,IAAI,yCAAmB,EAAE,CAAA;IAE1C,oEAAoE;IACpE,iBAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC9B,eAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC5B,cAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC3B,gBAAS,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAE7B,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9B,OAAO,QAAQ,CAAA;AACnB,CAAC;AAbD,gDAaC"}
@@ -0,0 +1,99 @@
1
+ /**************************************************************************************************************
2
+ * The graphQLDataProvider provides a data provider for the entities framework that uses GraphQL to communicate
3
+ * with the server.
4
+ * In practice - this FILE will NOT exist in the entities library, we need to move to its own separate project
5
+ * so it is only included by the consumer of the entities library if they want to use it.
6
+ **************************************************************************************************************/
7
+ import { BaseEntity, IEntityDataProvider, IMetadataProvider, IRunViewProvider, ProviderConfigDataBase, RunViewResult, EntityInfo, RunViewParams, ProviderBase, EntityDataProviderType, UserInfo, RecordChange, ILocalStorageProvider, EntitySaveOptions, TransactionGroupBase, DatasetItemFilterType, DatasetResultType, DatasetStatusResultType, EntityRecordNameInput, EntityRecordNameResult, IRunReportProvider, RunReportResult, UserViewEntityBase, RunReportParams } from "@memberjunction/core";
8
+ import { Observable } from 'rxjs';
9
+ export declare class GraphQLProviderConfigData extends ProviderConfigDataBase {
10
+ get Token(): string;
11
+ get URL(): string;
12
+ get WSURL(): string;
13
+ /**
14
+ * wsurl is the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, pass in a blank string for this
15
+ */
16
+ constructor(token: string, url: string, wsurl: string, MJCoreSchemaName?: string, includeSchemas?: string[], excludeSchemas?: string[]);
17
+ }
18
+ export declare class GraphQLDataProvider extends ProviderBase implements IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider {
19
+ private _url;
20
+ private _token;
21
+ private static _client;
22
+ private _sessionId;
23
+ get ConfigData(): GraphQLProviderConfigData;
24
+ GenerateUUID(): string;
25
+ Config(configData: GraphQLProviderConfigData): Promise<boolean>;
26
+ get sessionId(): string;
27
+ protected AllowRefresh(): boolean;
28
+ protected GetCurrentUser(): Promise<UserInfo>;
29
+ /**************************************************************************/
30
+ /**************************************************************************/
31
+ RunReport(params: RunReportParams, contextUser?: UserInfo): Promise<RunReportResult>;
32
+ /**************************************************************************/
33
+ /**************************************************************************/
34
+ /**************************************************************************/
35
+ /**************************************************************************/
36
+ RunView(params: RunViewParams, contextUser?: UserInfo): Promise<RunViewResult>;
37
+ protected getEntityNameAndUserView(params: RunViewParams, contextUser?: UserInfo): Promise<{
38
+ entityName: string;
39
+ v: UserViewEntityBase;
40
+ }>;
41
+ protected getViewRunTimeFieldList(e: EntityInfo, v: UserViewEntityBase, params: RunViewParams, dynamicView: boolean): string[];
42
+ /**************************************************************************/
43
+ /**************************************************************************/
44
+ /**************************************************************************/
45
+ /**************************************************************************/
46
+ get ProviderType(): EntityDataProviderType;
47
+ GetRecordChanges(entityName: string, recordId: number): Promise<RecordChange[]>;
48
+ Save(entity: BaseEntity, user: UserInfo, options: EntitySaveOptions): Promise<{}>;
49
+ Load(entity: BaseEntity, RecordID: number, EntityRelationshipsToLoad: string[], user: UserInfo): Promise<{}>;
50
+ protected getRelatedEntityString(entityInfo: EntityInfo, EntityRelationshipsToLoad: string[]): string;
51
+ Delete(entity: BaseEntity, user: UserInfo): Promise<boolean>;
52
+ /**************************************************************************/
53
+ /**************************************************************************/
54
+ /**************************************************************************/
55
+ /**************************************************************************/
56
+ GetDatasetByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetResultType>;
57
+ GetDatasetStatusByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetStatusResultType>;
58
+ CreateTransactionGroup(): Promise<TransactionGroupBase>;
59
+ GetRecordFavoriteStatus(userId: number, entityName: string, recordId: number): Promise<boolean>;
60
+ SetRecordFavoriteStatus(userId: number, entityName: string, recordId: number, isFavorite: boolean, contextUser: UserInfo): Promise<void>;
61
+ GetEntityRecordName(entityName: string, recordId: number): Promise<string>;
62
+ GetEntityRecordNames(info: EntityRecordNameInput[]): Promise<EntityRecordNameResult[]>;
63
+ static ExecuteGQL(query: string, variables: any): Promise<any>;
64
+ private _allLatestMetadataUpdatesQuery;
65
+ private _innerAllEntitiesQueryString;
66
+ private _innerAllEntityFieldsQueryString;
67
+ private _innerAllEntityRelationshipsQueryString;
68
+ private _innerAllEntityPermissionsQueryString;
69
+ private _innerAllApplicationsQueryString;
70
+ private _innerCurrentUserQueryString;
71
+ private _allApplicationsQuery;
72
+ private _innerAllRolesQueryString;
73
+ private _innerAllRowLevelSecurityFiltersQueryString;
74
+ private _innerAllAuditLogTypesQueryString;
75
+ private _innerAllAuthorizationsQueryString;
76
+ private _allMetaDataQuery;
77
+ private _currentUserQuery;
78
+ private roleInfoString;
79
+ private userInfoString;
80
+ private userRoleInfoString;
81
+ private rowLevelSecurityFilterInfoString;
82
+ private auditLogTypeInfoString;
83
+ private authorizationInfoString;
84
+ private applicationInfoString;
85
+ private applicationEntityInfoString;
86
+ private entityInfoString;
87
+ private entityFieldInfoString;
88
+ private entityRelationshipInfoString;
89
+ private entityPermissionInfoString;
90
+ private infoString;
91
+ private _localStorageProvider;
92
+ get LocalStorageProvider(): ILocalStorageProvider;
93
+ /**************************************************************************/
94
+ /**************************************************************************/
95
+ protected get Metadata(): IMetadataProvider;
96
+ private _wsClient;
97
+ private _pushStatusRequests;
98
+ PushStatusUpdates(sessionId?: string): Observable<string>;
99
+ }
@@ -0,0 +1,814 @@
1
+ "use strict";
2
+ /**************************************************************************************************************
3
+ * The graphQLDataProvider provides a data provider for the entities framework that uses GraphQL to communicate
4
+ * with the server.
5
+ * In practice - this FILE will NOT exist in the entities library, we need to move to its own separate project
6
+ * so it is only included by the consumer of the entities library if they want to use it.
7
+ **************************************************************************************************************/
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.GraphQLDataProvider = exports.GraphQLProviderConfigData = void 0;
10
+ const core_1 = require("@memberjunction/core");
11
+ const graphql_request_1 = require("graphql-request");
12
+ const graphQLTransactionGroup_1 = require("./graphQLTransactionGroup");
13
+ const idb_1 = require("idb");
14
+ const rxjs_1 = require("rxjs");
15
+ const graphql_ws_1 = require("graphql-ws");
16
+ class GraphQLProviderConfigData extends core_1.ProviderConfigDataBase {
17
+ get Token() { return this.Data.Token; }
18
+ get URL() { return this.Data.URL; }
19
+ get WSURL() { return this.Data.WSURL; }
20
+ /**
21
+ * wsurl is the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, pass in a blank string for this
22
+ */
23
+ constructor(token, url, wsurl, MJCoreSchemaName, includeSchemas, excludeSchemas) {
24
+ super({
25
+ Token: token,
26
+ URL: url,
27
+ WSURL: wsurl,
28
+ }, MJCoreSchemaName, includeSchemas, excludeSchemas);
29
+ }
30
+ }
31
+ exports.GraphQLProviderConfigData = GraphQLProviderConfigData;
32
+ // The GraphQLDataProvider implements both the IEntityDataProvider and IMetadataProvider interfaces.
33
+ class GraphQLDataProvider extends core_1.ProviderBase {
34
+ constructor() {
35
+ super(...arguments);
36
+ this._allLatestMetadataUpdatesQuery = (0, graphql_request_1.gql) `query mdUpdates {
37
+ AllLatestMetadataUpdates {
38
+ ID
39
+ Type
40
+ UpdatedAt
41
+ }
42
+ }
43
+ `;
44
+ this._innerAllEntitiesQueryString = `AllEntities {
45
+ ${this.entityInfoString()}
46
+ }`;
47
+ this._innerAllEntityFieldsQueryString = `AllEntityFields {
48
+ ${this.entityFieldInfoString()}
49
+ }`;
50
+ this._innerAllEntityRelationshipsQueryString = `AllEntityRelationships {
51
+ ${this.entityRelationshipInfoString()}
52
+ }`;
53
+ this._innerAllEntityPermissionsQueryString = `AllEntityPermissions {
54
+ ${this.entityPermissionInfoString()}
55
+ }`;
56
+ this._innerAllApplicationsQueryString = `AllApplications {
57
+ ${this.applicationInfoString()}
58
+ ApplicationEntities {
59
+ ${this.applicationEntityInfoString()}
60
+ }
61
+ }
62
+ `;
63
+ this._innerCurrentUserQueryString = `CurrentUser {
64
+ ${this.userInfoString()}
65
+ UserRoles {
66
+ ${this.userRoleInfoString()}
67
+ }
68
+ }
69
+ `;
70
+ this._allApplicationsQuery = (0, graphql_request_1.gql) `
71
+ ${this._innerAllApplicationsQueryString}
72
+ `;
73
+ this._innerAllRolesQueryString = `AllRoles {
74
+ ${this.roleInfoString()}
75
+ }
76
+ `;
77
+ this._innerAllRowLevelSecurityFiltersQueryString = `AllRowLevelSecurityFilters {
78
+ ${this.rowLevelSecurityFilterInfoString()}
79
+ }
80
+ `;
81
+ this._innerAllAuditLogTypesQueryString = `AllAuditLogTypes {
82
+ ${this.auditLogTypeInfoString()}
83
+ }
84
+ `;
85
+ this._innerAllAuthorizationsQueryString = `AllAuthorizations {
86
+ ${this.authorizationInfoString()}
87
+ }
88
+ `;
89
+ this._allMetaDataQuery = (0, graphql_request_1.gql) `query AllApplicationsAndEntities {
90
+ ${this._innerAllApplicationsQueryString}
91
+ ${this._innerAllEntitiesQueryString}
92
+ ${this._innerAllEntityFieldsQueryString}
93
+ ${this._innerAllEntityPermissionsQueryString}
94
+ ${this._innerAllEntityRelationshipsQueryString}
95
+ ${this._innerCurrentUserQueryString}
96
+ ${this._innerAllRolesQueryString}
97
+ ${this._innerAllRowLevelSecurityFiltersQueryString}
98
+ ${this._innerAllAuditLogTypesQueryString}
99
+ ${this._innerAllAuthorizationsQueryString}
100
+ }`;
101
+ this._currentUserQuery = (0, graphql_request_1.gql) `query CurrentUserAndRoles {
102
+ ${this._innerCurrentUserQueryString}
103
+ }`;
104
+ this._wsClient = null;
105
+ this._pushStatusRequests = [];
106
+ }
107
+ get ConfigData() { return super.ConfigData; }
108
+ GenerateUUID() {
109
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
110
+ var r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;
111
+ return v.toString(16);
112
+ });
113
+ }
114
+ async Config(configData) {
115
+ try {
116
+ // FIRST, set up the GraphQL client
117
+ this._sessionId = this.GenerateUUID();
118
+ this._url = configData.URL;
119
+ this._token = configData.Token;
120
+ // now create the new client, if it isn't alreayd created
121
+ if (!GraphQLDataProvider._client)
122
+ GraphQLDataProvider._client = new graphql_request_1.GraphQLClient(configData.URL, {
123
+ headers: {
124
+ authorization: 'Bearer ' + configData.Token,
125
+ 'x-session-id': this._sessionId
126
+ }
127
+ });
128
+ return super.Config(configData); // now parent class can do it's config
129
+ }
130
+ catch (e) {
131
+ (0, core_1.LogError)(e);
132
+ throw (e);
133
+ }
134
+ }
135
+ get sessionId() {
136
+ return this._sessionId;
137
+ }
138
+ AllowRefresh() {
139
+ return true; // this provider doesn't have any issues with allowing refreshes at any time
140
+ }
141
+ async GetCurrentUser() {
142
+ const d = await GraphQLDataProvider.ExecuteGQL(this._currentUserQuery, null);
143
+ if (d) {
144
+ return new core_1.UserInfo(this, d.CurrentUser);
145
+ }
146
+ }
147
+ /**************************************************************************/
148
+ // START ---- IRunReportProvider
149
+ /**************************************************************************/
150
+ async RunReport(params, contextUser) {
151
+ const query = (0, graphql_request_1.gql) `
152
+ query GetReportDataQuery ($ReportID: Int!) {
153
+ GetReportData(ReportID: $ReportID) {
154
+ Success
155
+ Results
156
+ RowCount
157
+ ExecutionTime
158
+ ErrorMessage
159
+ }
160
+ }`;
161
+ const result = await GraphQLDataProvider.ExecuteGQL(query, { ReportID: params.ReportID });
162
+ if (result && result.GetReportData)
163
+ return {
164
+ ReportID: params.ReportID,
165
+ Success: result.GetReportData.Success,
166
+ Results: JSON.parse(result.GetReportData.Results),
167
+ RowCount: result.GetReportData.RowCount,
168
+ ExecutionTime: result.GetReportData.ExecutionTime,
169
+ ErrorMessage: result.GetReportData.ErrorMessage,
170
+ };
171
+ }
172
+ /**************************************************************************/
173
+ // END ---- IRunReportProvider
174
+ /**************************************************************************/
175
+ /**************************************************************************/
176
+ // START ---- IRunViewProvider
177
+ /**************************************************************************/
178
+ async RunView(params, contextUser) {
179
+ try {
180
+ let qName = '';
181
+ let paramType = '';
182
+ if (params) {
183
+ const innerParams = {};
184
+ let entity, viewEntity;
185
+ if (params.ViewEntity) {
186
+ viewEntity = params.ViewEntity;
187
+ entity = viewEntity.Entity;
188
+ }
189
+ else {
190
+ const { entityName, v } = await this.getEntityNameAndUserView(params, contextUser);
191
+ viewEntity = v;
192
+ entity = entityName;
193
+ }
194
+ // get entity metadata
195
+ const e = this.Entities.find(e => e.Name === entity);
196
+ let dynamicView = false;
197
+ if (params.ViewID) {
198
+ qName = `Run${e.ClassName}ViewByID`;
199
+ paramType = 'RunViewByIDInput';
200
+ innerParams.ViewID = params.ViewID;
201
+ }
202
+ else if (params.ViewName) {
203
+ qName = `Run${e.ClassName}ViewByName`;
204
+ paramType = 'RunViewByNameInput';
205
+ innerParams.ViewName = params.ViewName;
206
+ }
207
+ else {
208
+ dynamicView = true;
209
+ qName = `Run${e.ClassName}DynamicView`;
210
+ paramType = 'RunDynamicViewInput';
211
+ innerParams.EntityName = params.EntityName;
212
+ }
213
+ innerParams.ExtraFilter = params.ExtraFilter ? params.ExtraFilter : '';
214
+ innerParams.OrderBy = params.OrderBy ? params.OrderBy : '';
215
+ innerParams.UserSearchString = params.UserSearchString ? params.UserSearchString : '';
216
+ innerParams.Fields = params.Fields; // pass it straight through, either null or array of strings
217
+ innerParams.IgnoreMaxRows = params.IgnoreMaxRows ? params.IgnoreMaxRows : false;
218
+ innerParams.ForceAuditLog = params.ForceAuditLog ? params.ForceAuditLog : false;
219
+ if (params.AuditLogDescription && params.AuditLogDescription.length > 0)
220
+ innerParams.AuditLogDescription = params.AuditLogDescription;
221
+ if (!dynamicView) {
222
+ innerParams.ExcludeUserViewRunID = params.ExcludeUserViewRunID ? params.ExcludeUserViewRunID : -1;
223
+ innerParams.ExcludeDataFromAllPriorViewRuns = params.ExcludeDataFromAllPriorViewRuns ? params.ExcludeDataFromAllPriorViewRuns : false;
224
+ innerParams.OverrideExcludeFilter = params.OverrideExcludeFilter ? params.OverrideExcludeFilter : '';
225
+ innerParams.SaveViewResults = params.SaveViewResults ? params.SaveViewResults : false;
226
+ }
227
+ const fieldList = this.getViewRunTimeFieldList(e, viewEntity, params, dynamicView);
228
+ const query = (0, graphql_request_1.gql) `
229
+ query RunViewQuery ($input: ${paramType}!) {
230
+ ${qName}(input: $input) {
231
+ Results {
232
+ ${fieldList.join("\n ")}
233
+ }
234
+ UserViewRunID
235
+ RowCount
236
+ TotalRowCount
237
+ ExecutionTime
238
+ Success
239
+ ErrorMessage
240
+ }
241
+ }`;
242
+ const viewData = await GraphQLDataProvider.ExecuteGQL(query, { input: innerParams });
243
+ if (viewData && viewData[qName])
244
+ return viewData[qName];
245
+ }
246
+ else
247
+ throw ("No parameters passed to RunView");
248
+ return null;
249
+ }
250
+ catch (e) {
251
+ (0, core_1.LogError)(e);
252
+ throw (e);
253
+ }
254
+ }
255
+ async getEntityNameAndUserView(params, contextUser) {
256
+ let entityName;
257
+ let v;
258
+ if (!params.EntityName) {
259
+ if (params.ViewID) {
260
+ v = await core_1.ViewInfo.GetViewEntity(params.ViewID, contextUser);
261
+ entityName = v.Entity;
262
+ }
263
+ else if (params.ViewName) {
264
+ v = await core_1.ViewInfo.GetViewEntityByName(params.ViewName, contextUser);
265
+ entityName = v.Entity;
266
+ }
267
+ else
268
+ throw new Error(`No EntityName, ViewID or ViewName passed to RunView`);
269
+ }
270
+ else
271
+ entityName = params.EntityName;
272
+ return { entityName, v };
273
+ }
274
+ getViewRunTimeFieldList(e, v, params, dynamicView) {
275
+ const fieldList = [];
276
+ if (params.Fields) {
277
+ if (params.Fields.find(f => f.trim().toLowerCase() === 'ID') === undefined)
278
+ fieldList.push('ID'); // always include ID field
279
+ // now add any other fields that were passed in
280
+ params.Fields.forEach(f => fieldList.push(f));
281
+ }
282
+ else {
283
+ // no fields were passed in. So, let's check to see if we are running an dynamic view.
284
+ // If so, we need to include all fields since the caller didn't specify the fields they want
285
+ // otherwise, we include the fields that are part of the view definition.
286
+ if (dynamicView)
287
+ e.Fields.forEach(f => fieldList.push(f.Name)); // include all fields since no fields were passed in
288
+ else {
289
+ // include the fields that are part of the view definition
290
+ // first make sure we have ID in the view column list, always should, but make sure
291
+ if (v.Columns.find(c => c.EntityField.Name === 'ID' && c.hidden === false) === undefined)
292
+ fieldList.push('ID'); // always include ID field in the result data, don't need to display the data, but we need to always provide record ID to the caller
293
+ // now add the rest of the fields
294
+ v.Columns.forEach(c => {
295
+ if (c.hidden === false) // don't include hidden fields
296
+ fieldList.push(c.EntityField.Name);
297
+ });
298
+ }
299
+ }
300
+ return fieldList;
301
+ }
302
+ /**************************************************************************/
303
+ // END ---- IRunViewProvider
304
+ /**************************************************************************/
305
+ /**************************************************************************/
306
+ // START ---- IEntityDataProvider
307
+ /**************************************************************************/
308
+ get ProviderType() {
309
+ return core_1.EntityDataProviderType.Network;
310
+ }
311
+ async GetRecordChanges(entityName, recordId) {
312
+ try {
313
+ const p = {
314
+ EntityName: 'Record Changes',
315
+ ExtraFilter: `RecordID = ${recordId} AND Entity = '${entityName}'`,
316
+ //OrderBy: 'ChangedAt DESC',
317
+ };
318
+ const result = await this.RunView(p);
319
+ if (result) {
320
+ // sort the results client side because, for now, the RunViewParams doesn't support OrderBy dynamically like we tried. Later change this to do via the SQL query
321
+ return result.Results.sort((a, b) => {
322
+ return (a.ChangedAt > b.ChangedAt) ? -1 : 1; // sort descending on the date.... GraphQL passes back the date as time since base date
323
+ });
324
+ }
325
+ else
326
+ return null;
327
+ }
328
+ catch (e) {
329
+ (0, core_1.LogError)(e);
330
+ throw (e);
331
+ }
332
+ }
333
+ async Save(entity, user, options) {
334
+ try {
335
+ const vars = { input: {} };
336
+ const type = (entity.ID) ? "Update" : "Create";
337
+ // Create the query for the mutation first, we will provide the specific
338
+ // input values later in the loop below. Here we are just setting up the mutation
339
+ // and the fields that will be returned since the mutation returns back the latest
340
+ // values for the entity and we need to have those values to update the entity after the
341
+ // save
342
+ const mutationName = `${type}${entity.EntityInfo.ClassName}`;
343
+ const inner = ` ${mutationName}(input: $input) {
344
+ ${entity.Fields.map(f => f.Name).join("\n ")}
345
+ }`;
346
+ const outer = (0, graphql_request_1.gql) `mutation ${type}${entity.EntityInfo.ClassName} ($input: ${mutationName}Input!) {
347
+ ${inner}
348
+ }
349
+ `;
350
+ for (let i = 0; i < entity.Fields.length; i++) {
351
+ const f = entity.Fields[i];
352
+ if (f.SQLType.trim().toLowerCase() !== 'uniqueidentifier' &&
353
+ (f.ReadOnly == false || (f.Name == 'ID' && entity.ID))) {
354
+ // only pass along writable fields, AND the ID value if this is an update
355
+ let val = f.Value;
356
+ if (val && f.EntityFieldInfo.TSType === core_1.EntityFieldTSType.Date)
357
+ val = val.getTime();
358
+ if (val == null && f.EntityFieldInfo.AllowsNull == false) {
359
+ if (f.EntityFieldInfo.DefaultValue != null) {
360
+ // no value, but there is a default value, so use that, since field does NOT allow NULL
361
+ val = f.EntityFieldInfo.DefaultValue;
362
+ }
363
+ else {
364
+ // no default value, null value and field doesn't allow nulls, so set to either 0 or empty string
365
+ if (f.FieldType == core_1.EntityFieldTSType.Number || f.FieldType == core_1.EntityFieldTSType.Boolean)
366
+ val = 0;
367
+ else
368
+ val = '';
369
+ }
370
+ }
371
+ vars.input[f.Name] = val;
372
+ }
373
+ }
374
+ if (entity.TransactionGroup) {
375
+ return new Promise((resolve, reject) => {
376
+ // we are part of a transaction group, so just add our query to the list
377
+ // and when the transaction is committed, we will send all the queries at once
378
+ entity.TransactionGroup.AddTransaction(new core_1.TransactionItem(inner, vars, { mutationName,
379
+ mutationInputType: mutationName + 'Input!' }, (results, success) => {
380
+ // we get here whenever the transaction group does gets around to committing
381
+ // our query. We need to update our entity with the values that were returned
382
+ // from the mutation if it was successful.
383
+ if (success && results) {
384
+ // got our data, send it back to the caller, which is the entity object
385
+ // and that object needs to update itself from this data.
386
+ resolve(results);
387
+ }
388
+ else {
389
+ // the transaction failed, nothing to update, but we need to call Reject so the
390
+ // promise resolves with a rejection so our outer caller knows
391
+ reject();
392
+ }
393
+ }));
394
+ });
395
+ }
396
+ else {
397
+ // not part of a transaction group, so just go for it and send across our GQL
398
+ const d = await GraphQLDataProvider.ExecuteGQL(outer, vars);
399
+ if (d && d[type + entity.EntityInfo.ClassName]) {
400
+ return d[type + entity.EntityInfo.ClassName];
401
+ }
402
+ else
403
+ return null;
404
+ }
405
+ }
406
+ catch (e) {
407
+ (0, core_1.LogError)(e);
408
+ return null;
409
+ }
410
+ }
411
+ async Load(entity, RecordID, EntityRelationshipsToLoad = null, user) {
412
+ try {
413
+ const rel = EntityRelationshipsToLoad && EntityRelationshipsToLoad.length > 0 ? this.getRelatedEntityString(entity.EntityInfo, EntityRelationshipsToLoad) : '';
414
+ const query = (0, graphql_request_1.gql) `query Single${entity.EntityInfo.ClassName}${rel.length > 0 ? 'Full' : ''} ($ID: Int!) {
415
+ ${entity.EntityInfo.ClassName}(ID: $ID) {
416
+ ${entity.Fields.map(f => f.Name).join("\n ")}
417
+ ${rel}
418
+ }
419
+ }
420
+ `;
421
+ const d = await GraphQLDataProvider.ExecuteGQL(query, { ID: RecordID });
422
+ if (d && d[entity.EntityInfo.ClassName]) {
423
+ return d[entity.EntityInfo.ClassName];
424
+ }
425
+ else
426
+ return null;
427
+ }
428
+ catch (e) {
429
+ (0, core_1.LogError)(e);
430
+ return null;
431
+ }
432
+ }
433
+ getRelatedEntityString(entityInfo, EntityRelationshipsToLoad) {
434
+ let rel = '';
435
+ for (let i = 0; i < entityInfo.RelatedEntities.length; i++) {
436
+ if (EntityRelationshipsToLoad.indexOf(entityInfo.RelatedEntities[i].RelatedEntity) >= 0) {
437
+ const r = entityInfo.RelatedEntities[i];
438
+ const re = this.Entities.find(e => e.ID === r.RelatedEntityID);
439
+ rel += `
440
+ ${re.CodeName} {
441
+ ${re.Fields.map(f => f.Name).join("\n ")}
442
+ }
443
+ `;
444
+ }
445
+ }
446
+ return rel;
447
+ }
448
+ async Delete(entity, user) {
449
+ try {
450
+ const vars = { ID: entity.ID };
451
+ const queryName = 'Delete' + entity.EntityInfo.ClassName;
452
+ const query = (0, graphql_request_1.gql) `mutation ${queryName} ($ID: Int!) {
453
+ ${queryName}(ID: $ID)
454
+ }
455
+ `;
456
+ if (entity.TransactionGroup) {
457
+ // we have a transaction group, need to play nice and be part of it
458
+ return new Promise((resolve, reject) => {
459
+ // we are part of a transaction group, so just add our query to the list
460
+ // and when the transaction is committed, we will send all the queries at once
461
+ entity.TransactionGroup.AddTransaction(new core_1.TransactionItem(query, vars, { mutationName: queryName,
462
+ mutationInputType: 'Int!' }, (results, success) => {
463
+ // we get here whenever the transaction group does gets around to committing
464
+ // our query.
465
+ if (success && results) {
466
+ // success indicated by the entity.ID matching the return value of the mutation
467
+ resolve(entity.ID === results);
468
+ }
469
+ else {
470
+ // the transaction failed, nothing to update, but we need to call Reject so the
471
+ // promise resolves with a rejection so our outer caller knows
472
+ reject();
473
+ }
474
+ }));
475
+ });
476
+ }
477
+ else {
478
+ // no transaction just go for it
479
+ const d = await GraphQLDataProvider.ExecuteGQL(query, vars);
480
+ if (d && d[queryName])
481
+ return entity.ID === d[queryName]; // returns the ID of the deleted record if SP is successful
482
+ else
483
+ return false;
484
+ }
485
+ }
486
+ catch (e) {
487
+ (0, core_1.LogError)(e);
488
+ return false;
489
+ }
490
+ }
491
+ /**************************************************************************/
492
+ // END ---- IEntityDataProvider
493
+ /**************************************************************************/
494
+ /**************************************************************************/
495
+ // START ---- IMetadataProvider
496
+ /**************************************************************************/
497
+ async GetDatasetByName(datasetName, itemFilters) {
498
+ const query = (0, graphql_request_1.gql) `query GetDatasetByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {
499
+ GetDatasetByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {
500
+ DatasetID
501
+ DatasetName
502
+ Success
503
+ Status
504
+ LatestUpdateDate
505
+ Results
506
+ }
507
+ }`;
508
+ const data = await GraphQLDataProvider.ExecuteGQL(query, { DatasetName: datasetName, ItemFilters: itemFilters });
509
+ if (data && data.GetDatasetByName && data.GetDatasetByName.Success) {
510
+ return {
511
+ DatasetID: data.GetDatasetByName.DatasetID,
512
+ DatasetName: data.GetDatasetByName.DatasetName,
513
+ Success: data.GetDatasetByName.Success,
514
+ Status: data.GetDatasetByName.Status,
515
+ LatestUpdateDate: new Date(data.GetDatasetByName.LatestUpdateDate),
516
+ Results: JSON.parse(data.GetDatasetByName.Results)
517
+ };
518
+ }
519
+ else {
520
+ return {
521
+ DatasetID: 0,
522
+ DatasetName: datasetName,
523
+ Success: false,
524
+ Status: 'Unknown',
525
+ LatestUpdateDate: null,
526
+ Results: null
527
+ };
528
+ }
529
+ }
530
+ async GetDatasetStatusByName(datasetName, itemFilters) {
531
+ const query = (0, graphql_request_1.gql) `query GetDatasetStatusByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {
532
+ GetDatasetStatusByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {
533
+ DatasetID
534
+ DatasetName
535
+ Success
536
+ Status
537
+ LatestUpdateDate
538
+ EntityUpdateDates
539
+ }
540
+ }`;
541
+ const data = await GraphQLDataProvider.ExecuteGQL(query, { DatasetName: datasetName, ItemFilters: itemFilters });
542
+ if (data && data.GetDatasetStatusByName && data.GetDatasetStatusByName.Success) {
543
+ return {
544
+ DatasetID: data.GetDatasetStatusByName.DatasetID,
545
+ DatasetName: data.GetDatasetStatusByName.DatasetName,
546
+ Success: data.GetDatasetStatusByName.Success,
547
+ Status: data.GetDatasetStatusByName.Status,
548
+ LatestUpdateDate: new Date(data.GetDatasetStatusByName.LatestUpdateDate),
549
+ EntityUpdateDates: JSON.parse(data.GetDatasetStatusByName.EntityUpdateDates)
550
+ };
551
+ }
552
+ else {
553
+ return {
554
+ DatasetID: 0,
555
+ DatasetName: datasetName,
556
+ Success: false,
557
+ Status: 'Unknown',
558
+ LatestUpdateDate: null,
559
+ EntityUpdateDates: null
560
+ };
561
+ }
562
+ }
563
+ async CreateTransactionGroup() {
564
+ return new graphQLTransactionGroup_1.GraphQLTransactionGroup();
565
+ }
566
+ async GetRecordFavoriteStatus(userId, entityName, recordId) {
567
+ const e = this.Entities.find(e => e.Name === entityName);
568
+ if (!e)
569
+ throw new Error(`Entity ${entityName} not found in metadata`);
570
+ const query = (0, graphql_request_1.gql) `query GetRecordFavoriteStatus($params: UserFavoriteSearchParams!) {
571
+ GetRecordFavoriteStatus(params: $params) {
572
+ Success
573
+ IsFavorite
574
+ }
575
+ }`;
576
+ const data = await GraphQLDataProvider.ExecuteGQL(query, { params: { UserID: userId, EntityID: e.ID, RecordID: recordId } });
577
+ if (data && data.GetRecordFavoriteStatus && data.GetRecordFavoriteStatus.Success)
578
+ return data.GetRecordFavoriteStatus.IsFavorite;
579
+ }
580
+ async SetRecordFavoriteStatus(userId, entityName, recordId, isFavorite, contextUser) {
581
+ const e = this.Entities.find(e => e.Name === entityName);
582
+ if (!e)
583
+ throw new Error(`Entity ${entityName} not found in metadata`);
584
+ const query = (0, graphql_request_1.gql) `mutation SetRecordFavoriteStatus($params: UserFavoriteSetParams!) {
585
+ SetRecordFavoriteStatus(params: $params){
586
+ Success
587
+ }
588
+ }`;
589
+ const data = await GraphQLDataProvider.ExecuteGQL(query, { params: { UserID: userId, EntityID: e.ID, RecordID: recordId, IsFavorite: isFavorite } });
590
+ if (data && data.SetRecordFavoriteStatus !== null)
591
+ return data.SetRecordFavoriteStatus.Success;
592
+ }
593
+ async GetEntityRecordName(entityName, recordId) {
594
+ if (!entityName || !recordId)
595
+ return null;
596
+ const query = (0, graphql_request_1.gql) `query GetEntityRecordNameQuery ($EntityName: String!, $RecordID: Int!) {
597
+ GetEntityRecordName(EntityName: $EntityName, RecordID: $RecordID) {
598
+ Success
599
+ Status
600
+ RecordName
601
+ }
602
+ }`;
603
+ const data = await GraphQLDataProvider.ExecuteGQL(query, { EntityName: entityName, RecordID: recordId });
604
+ if (data && data.GetEntityRecordName && data.GetEntityRecordName.Success)
605
+ return data.GetEntityRecordName.RecordName;
606
+ }
607
+ async GetEntityRecordNames(info) {
608
+ if (!info)
609
+ return null;
610
+ const query = (0, graphql_request_1.gql) `query GetEntityRecordNamesQuery ($info: [EntityRecordNameInput!]!) {
611
+ GetEntityRecordNames(info: $info) {
612
+ Success
613
+ Status
614
+ RecordID
615
+ EntityName
616
+ RecordName
617
+ }
618
+ }`;
619
+ const data = await GraphQLDataProvider.ExecuteGQL(query, { info: info });
620
+ if (data && data.GetEntityRecordNames)
621
+ return data.GetEntityRecordNames;
622
+ }
623
+ static async ExecuteGQL(query, variables) {
624
+ try {
625
+ const data = await this._client.request(query, variables);
626
+ return data;
627
+ }
628
+ catch (e) {
629
+ (0, core_1.LogError)(e);
630
+ throw e; // force the caller to handle the error
631
+ }
632
+ }
633
+ roleInfoString() {
634
+ return this.infoString(new core_1.RoleInfo(null));
635
+ }
636
+ userInfoString() {
637
+ return this.infoString(new core_1.UserInfo(null, null));
638
+ }
639
+ userRoleInfoString() {
640
+ return this.infoString(new core_1.UserRoleInfo(null));
641
+ }
642
+ rowLevelSecurityFilterInfoString() {
643
+ return this.infoString(new core_1.RowLevelSecurityFilterInfo(null));
644
+ }
645
+ auditLogTypeInfoString() {
646
+ return this.infoString(new core_1.AuditLogTypeInfo(null));
647
+ }
648
+ authorizationInfoString() {
649
+ return this.infoString(new core_1.AuthorizationInfo(null));
650
+ }
651
+ applicationInfoString() {
652
+ return this.infoString(new core_1.ApplicationInfo(null, null));
653
+ }
654
+ applicationEntityInfoString() {
655
+ return this.infoString(new core_1.ApplicationEntityInfo(null));
656
+ }
657
+ entityInfoString() {
658
+ return this.infoString(new core_1.EntityInfo(null));
659
+ }
660
+ entityFieldInfoString() {
661
+ return this.infoString(new core_1.EntityFieldInfo(null));
662
+ }
663
+ entityRelationshipInfoString() {
664
+ return this.infoString(new core_1.EntityRelationshipInfo(null));
665
+ }
666
+ entityPermissionInfoString() {
667
+ return this.infoString(new core_1.EntityPermissionInfo(null));
668
+ }
669
+ infoString(object) {
670
+ let sOutput = '';
671
+ const keys = Object.keys(object);
672
+ for (let i = 0; i < keys.length; i++) {
673
+ if (keys[i].substring(0, 1) != '_')
674
+ sOutput += keys[i] + '\n ';
675
+ }
676
+ return sOutput;
677
+ }
678
+ get LocalStorageProvider() {
679
+ if (!this._localStorageProvider)
680
+ this._localStorageProvider = new BrowserIndexedDBStorageProvider();
681
+ return this._localStorageProvider;
682
+ }
683
+ /**************************************************************************/
684
+ // END ---- IMetadataProvider
685
+ /**************************************************************************/
686
+ get Metadata() {
687
+ return this;
688
+ }
689
+ PushStatusUpdates(sessionId = null) {
690
+ if (!sessionId)
691
+ sessionId = this.sessionId;
692
+ if (!this._wsClient)
693
+ this._wsClient = (0, graphql_ws_1.createClient)({
694
+ url: this.ConfigData.WSURL,
695
+ connectionParams: {
696
+ Authorization: 'Bearer ' + this.ConfigData.Token,
697
+ },
698
+ });
699
+ const existingRequest = this._pushStatusRequests.find(r => r.sessionId === sessionId);
700
+ if (existingRequest)
701
+ return existingRequest.observable;
702
+ const SUBSCRIBE_TO_STATUS = (0, graphql_request_1.gql) `subscription StatusUpdates($sessionId: String!) {
703
+ statusUpdates(sessionId: $sessionId) {
704
+ date
705
+ message
706
+ sessionId
707
+ }
708
+ }
709
+ `;
710
+ const newObservable = new rxjs_1.Observable((observer) => {
711
+ const unsubscribe = this._wsClient.subscribe({ query: SUBSCRIBE_TO_STATUS, variables: { sessionId } }, {
712
+ next: (data) => {
713
+ return observer.next(data.data.statusUpdates);
714
+ },
715
+ error: (error) => {
716
+ return observer.error(error);
717
+ },
718
+ complete: () => {
719
+ return observer.complete();
720
+ },
721
+ });
722
+ return () => {
723
+ // Cleanup logic
724
+ console.log('would unsub here');
725
+ //unsubscribe();
726
+ };
727
+ });
728
+ this._pushStatusRequests.push({ sessionId, observable: newObservable });
729
+ return newObservable;
730
+ }
731
+ }
732
+ exports.GraphQLDataProvider = GraphQLDataProvider;
733
+ // this class implements a simple in-memory only storage as a fallback if the browser doesn't support local storage
734
+ class BrowserStorageProviderBase {
735
+ constructor() {
736
+ this._localStorage = {};
737
+ }
738
+ async getItem(key) {
739
+ return new Promise((resolve) => {
740
+ if (this._localStorage.hasOwnProperty(key))
741
+ resolve(this._localStorage[key]);
742
+ else
743
+ resolve(null);
744
+ });
745
+ }
746
+ async setItem(key, value) {
747
+ return new Promise((resolve) => {
748
+ this._localStorage[key] = value;
749
+ resolve();
750
+ });
751
+ }
752
+ async remove(key) {
753
+ return new Promise((resolve) => {
754
+ if (this._localStorage.hasOwnProperty(key)) {
755
+ delete this._localStorage[key];
756
+ }
757
+ resolve();
758
+ });
759
+ }
760
+ }
761
+ // This implementation just wraps the browser local storage and if for some reason the browser doesn't
762
+ // have a localStorage object, we just use a simple object to store the data in memory.
763
+ class BrowserLocalStorageProvider extends BrowserStorageProviderBase {
764
+ async getItem(key) {
765
+ if (localStorage)
766
+ return localStorage.getItem(key);
767
+ else
768
+ return await super.getItem(key);
769
+ }
770
+ async setItem(key, value) {
771
+ if (localStorage)
772
+ localStorage.setItem(key, value);
773
+ else
774
+ await super.setItem(key, value);
775
+ }
776
+ async remove(key) {
777
+ if (localStorage)
778
+ localStorage.removeItem(key);
779
+ else
780
+ await super.remove(key);
781
+ }
782
+ }
783
+ const IDB_DB_NAME = 'MJ_Metadata';
784
+ const IDB_DB_ObjectStoreName = 'Metadata_KVPairs';
785
+ class BrowserIndexedDBStorageProvider extends BrowserStorageProviderBase {
786
+ constructor() {
787
+ super();
788
+ this.dbPromise = (0, idb_1.openDB)(IDB_DB_NAME, 1, {
789
+ upgrade(db) {
790
+ if (!db.objectStoreNames.contains(IDB_DB_ObjectStoreName)) {
791
+ db.createObjectStore(IDB_DB_ObjectStoreName);
792
+ }
793
+ },
794
+ });
795
+ }
796
+ async setItem(key, value) {
797
+ const db = await this.dbPromise;
798
+ const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');
799
+ await tx.objectStore(IDB_DB_ObjectStoreName).put(value, key);
800
+ await tx.done;
801
+ }
802
+ async getItem(key) {
803
+ const db = await this.dbPromise;
804
+ const value = await db.transaction(IDB_DB_ObjectStoreName).objectStore(IDB_DB_ObjectStoreName).get(key);
805
+ return value;
806
+ }
807
+ async remove(key) {
808
+ const db = await this.dbPromise;
809
+ const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');
810
+ await tx.objectStore(IDB_DB_ObjectStoreName).delete(key);
811
+ await tx.done;
812
+ }
813
+ }
814
+ //# sourceMappingURL=graphQLDataProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphQLDataProvider.js","sourceRoot":"","sources":["../src/graphQLDataProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { TransactionGroupBase, TransactionItem, TransactionResult } from "@memberjunction/core";
2
+ export declare class GraphQLTransactionGroup extends TransactionGroupBase {
3
+ protected HandleSubmit(items: TransactionItem[]): Promise<TransactionResult[]>;
4
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphQLTransactionGroup = void 0;
4
+ const core_1 = require("@memberjunction/core");
5
+ const graphQLDataProvider_1 = require("./graphQLDataProvider");
6
+ class GraphQLTransactionGroup extends core_1.TransactionGroupBase {
7
+ async HandleSubmit(items) {
8
+ // iterate through each instruction and build up the combined query string
9
+ // and the combined variables object
10
+ let combinedQuery = '';
11
+ let mutationParams = '';
12
+ const combinedVars = {};
13
+ for (let i = 0; i < items.length; i++) {
14
+ const item = items[i];
15
+ let itemMutation = item.Instruction;
16
+ if (item.Vars) {
17
+ const keys = Object.keys(item.Vars);
18
+ // rename the variables to avoid collisions and aggregate the varisables
19
+ // from the item into our combined variables
20
+ for (let j = 0; j < keys.length; j++) {
21
+ const key = keys[j];
22
+ const newKey = `${key}_${i}`;
23
+ combinedVars[newKey] = item.Vars[key];
24
+ const keyRegEx = new RegExp('\\$' + key, 'g'); // Create the RegExp dynamically with the global flag.
25
+ itemMutation = itemMutation.replace(keyRegEx, '$' + newKey);
26
+ mutationParams += `$${newKey}: ${item.ExtraData.mutationInputType} \n`;
27
+ }
28
+ }
29
+ // add in the specific mutation and give it an alias so we can easily figure out the results
30
+ // from each of them and pass back properly
31
+ combinedQuery += `mutation_${i}: ` + itemMutation + '\n';
32
+ }
33
+ combinedQuery = `mutation (${mutationParams}){ \n` + combinedQuery + '\n}'; // wrap it up in a mutation so we can execute it
34
+ const execResults = await graphQLDataProvider_1.GraphQLDataProvider.ExecuteGQL(combinedQuery, combinedVars);
35
+ const returnResults = [];
36
+ for (let i = 0; i < items.length; i++) {
37
+ /// NEED TO TEST TO SEE WHAT ORDER WE GET RESULTS BACK AS
38
+ const result = execResults[`mutation_${i}`];
39
+ const item = items[i];
40
+ returnResults.push(new core_1.TransactionResult(item, result, result !== null));
41
+ }
42
+ return returnResults;
43
+ }
44
+ }
45
+ exports.GraphQLTransactionGroup = GraphQLTransactionGroup;
46
+ //# sourceMappingURL=graphQLTransactionGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphQLTransactionGroup.js","sourceRoot":"","sources":["../src/graphQLTransactionGroup.ts"],"names":[],"mappings":";;;AAAA,+CAA+F;AAC/F,+DAA4D;AAE5D,MAAa,uBAAwB,SAAQ,2BAAoB;IACnD,KAAK,CAAC,YAAY,CAAC,KAAwB;QACjD,2EAA2E;QAC3E,oCAAoC;QACpC,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,MAAM,YAAY,GAAQ,EAAE,CAAC;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,EAAE;gBACX,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpC,wEAAwE;gBACxE,4CAA4C;gBAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpB,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC7B,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAEtC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,sDAAsD;oBACrG,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;oBAC5D,cAAc,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,iBAAiB,KAAK,CAAC;iBAC1E;aACJ;YACD,4FAA4F;YAC5F,2CAA2C;YAC3C,aAAa,IAAI,YAAY,CAAC,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC;SAC5D;QAED,aAAa,GAAG,aAAa,cAAc,OAAO,GAAG,aAAa,GAAE,KAAK,CAAC,CAAC,gDAAgD;QAC3H,MAAM,WAAW,GAAG,MAAM,yCAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC,CAAA;QACrF,MAAM,aAAa,GAAwB,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,yDAAyD;YACzD,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,IAAI,wBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;SAC5E;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;CACJ;AAzCD,0DAyCC"}
@@ -0,0 +1,2 @@
1
+ export { setupGraphQLClient } from "./config";
2
+ export { GraphQLDataProvider } from "./graphQLDataProvider";
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphQLDataProvider = exports.setupGraphQLClient = void 0;
4
+ var config_1 = require("./config");
5
+ Object.defineProperty(exports, "setupGraphQLClient", { enumerable: true, get: function () { return config_1.setupGraphQLClient; } });
6
+ var graphQLDataProvider_1 = require("./graphQLDataProvider");
7
+ Object.defineProperty(exports, "GraphQLDataProvider", { enumerable: true, get: function () { return graphQLDataProvider_1.GraphQLDataProvider; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAC3B,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@memberjunction/graphql-dataprovider",
3
+ "version": "0.9.0",
4
+ "description": "MemberJunction: GraphQL Client Data Provider",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "/dist"
9
+ ],
10
+ "scripts": {
11
+ "start": "ts-node-dev src/index.ts",
12
+ "build": "tsc",
13
+ "test": "echo \"Error: no test specified\" && exit 1"
14
+ },
15
+ "author": "MemberJunction.com",
16
+ "license": "ISC",
17
+ "devDependencies": {
18
+ "ts-node-dev": "^2.0.0",
19
+ "typescript": "^5.0.3"
20
+ },
21
+ "dependencies": {
22
+ "@memberjunction/core": "^0.9.1",
23
+ "graphql": "^16.6.0",
24
+ "graphql-request": "^5.2.0",
25
+ "graphql-ws": "^5.14.0",
26
+ "idb": "^7.1.1",
27
+ "rxjs": "^7.8.1"
28
+ }
29
+ }