@merkur/plugin-graphql-client 0.38.0 → 0.40.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <p align="center">
2
2
  <a href="https://merkur.js.org/docs/getting-started" title="Getting started">
3
- <img src="https://raw.githubusercontent.com/mjancarik/merkur/master/images/merkur-illustration.png" width="100px" height="100px" alt="Merkur illustration"/>
3
+ <img src="https://raw.githubusercontent.com/mjancarik/merkur/master/images/merkur-logo.png" width="100px" height="100px" alt="Merkur illustration"/>
4
4
  </a>
5
5
  </p>
6
6
 
package/lib/index.cjs CHANGED
@@ -12,139 +12,120 @@ const TYPENAME_FIELD = {
12
12
  kind: 'Field',
13
13
  name: {
14
14
  kind: 'Name',
15
- value: '__typename',
16
- },
15
+ value: '__typename'
16
+ }
17
17
  };
18
-
19
18
  const DEV = 'development';
20
- const ENV =
21
- typeof process !== 'undefined' && process && process.env
22
- ? process.env.NODE_ENV
23
- : DEV;
24
-
19
+ const ENV = typeof process !== 'undefined' && process && process.env ? process.env.NODE_ENV : DEV;
25
20
  function setEndpointUrl(widget, url, name = 'graphql') {
26
21
  widget.$in.graphqlClient[name].endpointUrl = url;
27
22
  }
28
-
29
23
  function setEntityClasses(widget, entityClasses, name = 'graphql') {
30
- widget.$in.graphqlClient[name].entityClasses =
31
- buildTypeToEntityMap(entityClasses);
24
+ widget.$in.graphqlClient[name].entityClasses = buildTypeToEntityMap(entityClasses);
32
25
  }
33
-
34
26
  function graphqlClientPlugin(name = 'graphql') {
35
27
  return {
36
28
  async setup(widget) {
37
29
  core.assignMissingKeys(widget, graphqlClientAPI(name));
38
-
39
30
  if (!widget.$in.graphqlClient) widget.$in.graphqlClient = {};
40
-
41
31
  widget.$in.graphqlClient[name] = {
42
32
  endpointUrl: '',
43
- entityClasses: {},
33
+ entityClasses: {}
44
34
  };
45
-
46
35
  return widget;
47
36
  },
48
37
  async create(widget) {
49
38
  if (ENV === DEV && !widget.$in.httpClient) {
50
- throw new Error(
51
- 'You must install missing plugin: npm i @merkur/plugin-http-client',
52
- );
39
+ throw new Error('You must install missing plugin: npm i @merkur/plugin-http-client');
53
40
  }
54
-
55
41
  core.bindWidgetToFunctions(widget, widget[name]);
56
-
57
42
  return widget;
58
- },
43
+ }
59
44
  };
60
45
  }
61
-
62
46
  function graphqlClientAPI(name = 'graphql') {
63
47
  return {
64
48
  [name]: {
65
49
  async request(widget, operation, variables = {}, options = {}) {
66
- const { endpointUrl, entityClasses } = widget.$in.graphqlClient[name];
67
- const { headers = {}, body = {}, ...restOptions } = options;
68
-
50
+ const {
51
+ endpointUrl,
52
+ entityClasses
53
+ } = widget.$in.graphqlClient[name];
54
+ const {
55
+ headers = {},
56
+ body = {},
57
+ ...restOptions
58
+ } = options;
69
59
  operation = addTypenameToSelections(operation);
70
-
71
- const { response } = await widget.http.request({
60
+ const {
61
+ response
62
+ } = await widget.http.request({
72
63
  url: endpointUrl,
73
64
  method: 'POST',
74
65
  headers: {
75
66
  'Content-Type': 'application/json',
76
- ...headers,
67
+ ...headers
77
68
  },
78
69
  body: {
79
70
  query: graphql.stripIgnoredCharacters(graphql.print(operation)),
80
71
  variables,
81
- ...body,
72
+ ...body
82
73
  },
83
- ...restOptions,
74
+ ...restOptions
84
75
  });
85
-
86
- const { errors, data = {} } = response.body;
76
+ const {
77
+ errors,
78
+ data = {}
79
+ } = response.body;
87
80
  if (errors) {
88
- if (
89
- Array.isArray(errors) &&
90
- errors.some((error) => error.status === 'unauthorized')
91
- ) {
92
- return Promise.reject(
93
- new UnauthorizedError(`Unauthorized Error`, { errors, data }),
94
- );
81
+ if (Array.isArray(errors) && errors.some(error => error.status === 'unauthorized')) {
82
+ return Promise.reject(new UnauthorizedError(`Unauthorized Error`, {
83
+ errors,
84
+ data
85
+ }));
95
86
  }
96
-
97
- return Promise.reject(
98
- new GraphQLError(`Api Error`, { errors, data }),
99
- );
87
+ return Promise.reject(new GraphQLError(`Api Error`, {
88
+ errors,
89
+ data
90
+ }));
100
91
  }
101
-
102
92
  return processResponseData(data, entityClasses);
103
- },
104
- },
93
+ }
94
+ }
105
95
  };
106
96
  }
107
-
108
97
  function buildTypeToEntityMap(entityClasses) {
109
98
  const map = {};
110
-
111
- entityClasses.forEach((entityClass) => {
112
- let { entityType } = entityClass;
113
-
99
+ entityClasses.forEach(entityClass => {
100
+ let {
101
+ entityType
102
+ } = entityClass;
114
103
  if (!Array.isArray(entityType)) {
115
104
  entityType = [entityType];
116
105
  }
117
-
118
- entityType.forEach((type) => (map[type] = entityClass));
106
+ entityType.forEach(type => map[type] = entityClass);
119
107
  });
120
-
121
108
  return map;
122
109
  }
123
-
124
110
  function processResponseData(data, entityClasses) {
125
111
  const processedData = {};
126
-
127
112
  if (typeof data === 'string') {
128
113
  return data;
129
114
  }
130
115
  Object.entries(data).forEach(([field, value]) => {
131
116
  if (Array.isArray(value)) {
132
- value = value.map((node) => processResponseData(node, entityClasses));
117
+ value = value.map(node => processResponseData(node, entityClasses));
133
118
  } else if (typeof value === 'object' && value !== null) {
134
119
  value = processResponseData(value, entityClasses);
135
120
  }
136
-
137
121
  processedData[field] = value;
138
122
  });
139
-
140
123
  const type = processedData.__typename;
141
124
  if (!type || !entityClasses[type]) {
142
125
  return processedData;
143
126
  }
144
-
145
127
  return Reflect.construct(entityClasses[type], [processedData]);
146
128
  }
147
-
148
129
  function addTypenameToSelections(document) {
149
130
  return graphql.visit(document, {
150
131
  SelectionSet: {
@@ -155,40 +136,32 @@ function addTypenameToSelections(document) {
155
136
  }
156
137
 
157
138
  // No changes if no selections.
158
- const { selections } = node;
139
+ const {
140
+ selections
141
+ } = node;
159
142
  if (!selections) {
160
143
  return;
161
144
  }
162
145
 
163
146
  // If selections already have a __typename, or are part of an
164
147
  // introspection query, do nothing.
165
- const skip = selections.some(
166
- (selection) =>
167
- selection.kind === 'Field' &&
168
- (selection.name.value === '__typename' ||
169
- selection.name.value.lastIndexOf('__', 0) === 0),
170
- );
171
-
148
+ const skip = selections.some(selection => selection.kind === 'Field' && (selection.name.value === '__typename' || selection.name.value.lastIndexOf('__', 0) === 0));
172
149
  if (skip) {
173
150
  return;
174
151
  }
175
152
 
176
153
  // If this SelectionSet is @export-ed as an input variable, it should
177
154
  // not have a __typename field (see issue #4691).
178
- if (
179
- parent.kind === 'Field' &&
180
- parent.directives &&
181
- parent.directives.some((d) => d.name.value === 'export')
182
- ) {
155
+ if (parent.kind === 'Field' && parent.directives && parent.directives.some(d => d.name.value === 'export')) {
183
156
  return;
184
157
  }
185
158
 
186
159
  // Create and return a new SelectionSet with a __typename Field.
187
160
  return Object.assign({}, node, {
188
- selections: [...selections, TYPENAME_FIELD],
161
+ selections: [...selections, TYPENAME_FIELD]
189
162
  });
190
- },
191
- },
163
+ }
164
+ }
192
165
  });
193
166
  }
194
167
 
package/lib/index.js CHANGED
@@ -12,139 +12,120 @@ const TYPENAME_FIELD = {
12
12
  kind: 'Field',
13
13
  name: {
14
14
  kind: 'Name',
15
- value: '__typename',
16
- },
15
+ value: '__typename'
16
+ }
17
17
  };
18
-
19
18
  const DEV = 'development';
20
- const ENV =
21
- typeof process !== 'undefined' && process && process.env
22
- ? process.env.NODE_ENV
23
- : DEV;
24
-
19
+ const ENV = typeof process !== 'undefined' && process && process.env ? process.env.NODE_ENV : DEV;
25
20
  function setEndpointUrl(widget, url, name = 'graphql') {
26
21
  widget.$in.graphqlClient[name].endpointUrl = url;
27
22
  }
28
-
29
23
  function setEntityClasses(widget, entityClasses, name = 'graphql') {
30
- widget.$in.graphqlClient[name].entityClasses =
31
- buildTypeToEntityMap(entityClasses);
24
+ widget.$in.graphqlClient[name].entityClasses = buildTypeToEntityMap(entityClasses);
32
25
  }
33
-
34
26
  function graphqlClientPlugin(name = 'graphql') {
35
27
  return {
36
28
  async setup(widget) {
37
29
  core.assignMissingKeys(widget, graphqlClientAPI(name));
38
-
39
30
  if (!widget.$in.graphqlClient) widget.$in.graphqlClient = {};
40
-
41
31
  widget.$in.graphqlClient[name] = {
42
32
  endpointUrl: '',
43
- entityClasses: {},
33
+ entityClasses: {}
44
34
  };
45
-
46
35
  return widget;
47
36
  },
48
37
  async create(widget) {
49
38
  if (ENV === DEV && !widget.$in.httpClient) {
50
- throw new Error(
51
- 'You must install missing plugin: npm i @merkur/plugin-http-client',
52
- );
39
+ throw new Error('You must install missing plugin: npm i @merkur/plugin-http-client');
53
40
  }
54
-
55
41
  core.bindWidgetToFunctions(widget, widget[name]);
56
-
57
42
  return widget;
58
- },
43
+ }
59
44
  };
60
45
  }
61
-
62
46
  function graphqlClientAPI(name = 'graphql') {
63
47
  return {
64
48
  [name]: {
65
49
  async request(widget, operation, variables = {}, options = {}) {
66
- const { endpointUrl, entityClasses } = widget.$in.graphqlClient[name];
67
- const { headers = {}, body = {}, ...restOptions } = options;
68
-
50
+ const {
51
+ endpointUrl,
52
+ entityClasses
53
+ } = widget.$in.graphqlClient[name];
54
+ const {
55
+ headers = {},
56
+ body = {},
57
+ ...restOptions
58
+ } = options;
69
59
  operation = addTypenameToSelections(operation);
70
-
71
- const { response } = await widget.http.request({
60
+ const {
61
+ response
62
+ } = await widget.http.request({
72
63
  url: endpointUrl,
73
64
  method: 'POST',
74
65
  headers: {
75
66
  'Content-Type': 'application/json',
76
- ...headers,
67
+ ...headers
77
68
  },
78
69
  body: {
79
70
  query: graphql.stripIgnoredCharacters(graphql.print(operation)),
80
71
  variables,
81
- ...body,
72
+ ...body
82
73
  },
83
- ...restOptions,
74
+ ...restOptions
84
75
  });
85
-
86
- const { errors, data = {} } = response.body;
76
+ const {
77
+ errors,
78
+ data = {}
79
+ } = response.body;
87
80
  if (errors) {
88
- if (
89
- Array.isArray(errors) &&
90
- errors.some((error) => error.status === 'unauthorized')
91
- ) {
92
- return Promise.reject(
93
- new UnauthorizedError(`Unauthorized Error`, { errors, data }),
94
- );
81
+ if (Array.isArray(errors) && errors.some(error => error.status === 'unauthorized')) {
82
+ return Promise.reject(new UnauthorizedError(`Unauthorized Error`, {
83
+ errors,
84
+ data
85
+ }));
95
86
  }
96
-
97
- return Promise.reject(
98
- new GraphQLError(`Api Error`, { errors, data }),
99
- );
87
+ return Promise.reject(new GraphQLError(`Api Error`, {
88
+ errors,
89
+ data
90
+ }));
100
91
  }
101
-
102
92
  return processResponseData(data, entityClasses);
103
- },
104
- },
93
+ }
94
+ }
105
95
  };
106
96
  }
107
-
108
97
  function buildTypeToEntityMap(entityClasses) {
109
98
  const map = {};
110
-
111
- entityClasses.forEach((entityClass) => {
112
- let { entityType } = entityClass;
113
-
99
+ entityClasses.forEach(entityClass => {
100
+ let {
101
+ entityType
102
+ } = entityClass;
114
103
  if (!Array.isArray(entityType)) {
115
104
  entityType = [entityType];
116
105
  }
117
-
118
- entityType.forEach((type) => (map[type] = entityClass));
106
+ entityType.forEach(type => map[type] = entityClass);
119
107
  });
120
-
121
108
  return map;
122
109
  }
123
-
124
110
  function processResponseData(data, entityClasses) {
125
111
  const processedData = {};
126
-
127
112
  if (typeof data === 'string') {
128
113
  return data;
129
114
  }
130
115
  Object.entries(data).forEach(([field, value]) => {
131
116
  if (Array.isArray(value)) {
132
- value = value.map((node) => processResponseData(node, entityClasses));
117
+ value = value.map(node => processResponseData(node, entityClasses));
133
118
  } else if (typeof value === 'object' && value !== null) {
134
119
  value = processResponseData(value, entityClasses);
135
120
  }
136
-
137
121
  processedData[field] = value;
138
122
  });
139
-
140
123
  const type = processedData.__typename;
141
124
  if (!type || !entityClasses[type]) {
142
125
  return processedData;
143
126
  }
144
-
145
127
  return Reflect.construct(entityClasses[type], [processedData]);
146
128
  }
147
-
148
129
  function addTypenameToSelections(document) {
149
130
  return graphql.visit(document, {
150
131
  SelectionSet: {
@@ -155,40 +136,32 @@ function addTypenameToSelections(document) {
155
136
  }
156
137
 
157
138
  // No changes if no selections.
158
- const { selections } = node;
139
+ const {
140
+ selections
141
+ } = node;
159
142
  if (!selections) {
160
143
  return;
161
144
  }
162
145
 
163
146
  // If selections already have a __typename, or are part of an
164
147
  // introspection query, do nothing.
165
- const skip = selections.some(
166
- (selection) =>
167
- selection.kind === 'Field' &&
168
- (selection.name.value === '__typename' ||
169
- selection.name.value.lastIndexOf('__', 0) === 0),
170
- );
171
-
148
+ const skip = selections.some(selection => selection.kind === 'Field' && (selection.name.value === '__typename' || selection.name.value.lastIndexOf('__', 0) === 0));
172
149
  if (skip) {
173
150
  return;
174
151
  }
175
152
 
176
153
  // If this SelectionSet is @export-ed as an input variable, it should
177
154
  // not have a __typename field (see issue #4691).
178
- if (
179
- parent.kind === 'Field' &&
180
- parent.directives &&
181
- parent.directives.some((d) => d.name.value === 'export')
182
- ) {
155
+ if (parent.kind === 'Field' && parent.directives && parent.directives.some(d => d.name.value === 'export')) {
183
156
  return;
184
157
  }
185
158
 
186
159
  // Create and return a new SelectionSet with a __typename Field.
187
160
  return Object.assign({}, node, {
188
- selections: [...selections, TYPENAME_FIELD],
161
+ selections: [...selections, TYPENAME_FIELD]
189
162
  });
190
- },
191
- },
163
+ }
164
+ }
192
165
  });
193
166
  }
194
167
 
package/lib/index.mjs CHANGED
@@ -10,139 +10,120 @@ const TYPENAME_FIELD = {
10
10
  kind: 'Field',
11
11
  name: {
12
12
  kind: 'Name',
13
- value: '__typename',
14
- },
13
+ value: '__typename'
14
+ }
15
15
  };
16
-
17
16
  const DEV = 'development';
18
- const ENV =
19
- typeof process !== 'undefined' && process && process.env
20
- ? process.env.NODE_ENV
21
- : DEV;
22
-
17
+ const ENV = typeof process !== 'undefined' && process && process.env ? process.env.NODE_ENV : DEV;
23
18
  function setEndpointUrl(widget, url, name = 'graphql') {
24
19
  widget.$in.graphqlClient[name].endpointUrl = url;
25
20
  }
26
-
27
21
  function setEntityClasses(widget, entityClasses, name = 'graphql') {
28
- widget.$in.graphqlClient[name].entityClasses =
29
- buildTypeToEntityMap(entityClasses);
22
+ widget.$in.graphqlClient[name].entityClasses = buildTypeToEntityMap(entityClasses);
30
23
  }
31
-
32
24
  function graphqlClientPlugin(name = 'graphql') {
33
25
  return {
34
26
  async setup(widget) {
35
27
  assignMissingKeys(widget, graphqlClientAPI(name));
36
-
37
28
  if (!widget.$in.graphqlClient) widget.$in.graphqlClient = {};
38
-
39
29
  widget.$in.graphqlClient[name] = {
40
30
  endpointUrl: '',
41
- entityClasses: {},
31
+ entityClasses: {}
42
32
  };
43
-
44
33
  return widget;
45
34
  },
46
35
  async create(widget) {
47
36
  if (ENV === DEV && !widget.$in.httpClient) {
48
- throw new Error(
49
- 'You must install missing plugin: npm i @merkur/plugin-http-client',
50
- );
37
+ throw new Error('You must install missing plugin: npm i @merkur/plugin-http-client');
51
38
  }
52
-
53
39
  bindWidgetToFunctions(widget, widget[name]);
54
-
55
40
  return widget;
56
- },
41
+ }
57
42
  };
58
43
  }
59
-
60
44
  function graphqlClientAPI(name = 'graphql') {
61
45
  return {
62
46
  [name]: {
63
47
  async request(widget, operation, variables = {}, options = {}) {
64
- const { endpointUrl, entityClasses } = widget.$in.graphqlClient[name];
65
- const { headers = {}, body = {}, ...restOptions } = options;
66
-
48
+ const {
49
+ endpointUrl,
50
+ entityClasses
51
+ } = widget.$in.graphqlClient[name];
52
+ const {
53
+ headers = {},
54
+ body = {},
55
+ ...restOptions
56
+ } = options;
67
57
  operation = addTypenameToSelections(operation);
68
-
69
- const { response } = await widget.http.request({
58
+ const {
59
+ response
60
+ } = await widget.http.request({
70
61
  url: endpointUrl,
71
62
  method: 'POST',
72
63
  headers: {
73
64
  'Content-Type': 'application/json',
74
- ...headers,
65
+ ...headers
75
66
  },
76
67
  body: {
77
68
  query: stripIgnoredCharacters(print(operation)),
78
69
  variables,
79
- ...body,
70
+ ...body
80
71
  },
81
- ...restOptions,
72
+ ...restOptions
82
73
  });
83
-
84
- const { errors, data = {} } = response.body;
74
+ const {
75
+ errors,
76
+ data = {}
77
+ } = response.body;
85
78
  if (errors) {
86
- if (
87
- Array.isArray(errors) &&
88
- errors.some((error) => error.status === 'unauthorized')
89
- ) {
90
- return Promise.reject(
91
- new UnauthorizedError(`Unauthorized Error`, { errors, data }),
92
- );
79
+ if (Array.isArray(errors) && errors.some(error => error.status === 'unauthorized')) {
80
+ return Promise.reject(new UnauthorizedError(`Unauthorized Error`, {
81
+ errors,
82
+ data
83
+ }));
93
84
  }
94
-
95
- return Promise.reject(
96
- new GraphQLError(`Api Error`, { errors, data }),
97
- );
85
+ return Promise.reject(new GraphQLError(`Api Error`, {
86
+ errors,
87
+ data
88
+ }));
98
89
  }
99
-
100
90
  return processResponseData(data, entityClasses);
101
- },
102
- },
91
+ }
92
+ }
103
93
  };
104
94
  }
105
-
106
95
  function buildTypeToEntityMap(entityClasses) {
107
96
  const map = {};
108
-
109
- entityClasses.forEach((entityClass) => {
110
- let { entityType } = entityClass;
111
-
97
+ entityClasses.forEach(entityClass => {
98
+ let {
99
+ entityType
100
+ } = entityClass;
112
101
  if (!Array.isArray(entityType)) {
113
102
  entityType = [entityType];
114
103
  }
115
-
116
- entityType.forEach((type) => (map[type] = entityClass));
104
+ entityType.forEach(type => map[type] = entityClass);
117
105
  });
118
-
119
106
  return map;
120
107
  }
121
-
122
108
  function processResponseData(data, entityClasses) {
123
109
  const processedData = {};
124
-
125
110
  if (typeof data === 'string') {
126
111
  return data;
127
112
  }
128
113
  Object.entries(data).forEach(([field, value]) => {
129
114
  if (Array.isArray(value)) {
130
- value = value.map((node) => processResponseData(node, entityClasses));
115
+ value = value.map(node => processResponseData(node, entityClasses));
131
116
  } else if (typeof value === 'object' && value !== null) {
132
117
  value = processResponseData(value, entityClasses);
133
118
  }
134
-
135
119
  processedData[field] = value;
136
120
  });
137
-
138
121
  const type = processedData.__typename;
139
122
  if (!type || !entityClasses[type]) {
140
123
  return processedData;
141
124
  }
142
-
143
125
  return Reflect.construct(entityClasses[type], [processedData]);
144
126
  }
145
-
146
127
  function addTypenameToSelections(document) {
147
128
  return visit(document, {
148
129
  SelectionSet: {
@@ -153,40 +134,32 @@ function addTypenameToSelections(document) {
153
134
  }
154
135
 
155
136
  // No changes if no selections.
156
- const { selections } = node;
137
+ const {
138
+ selections
139
+ } = node;
157
140
  if (!selections) {
158
141
  return;
159
142
  }
160
143
 
161
144
  // If selections already have a __typename, or are part of an
162
145
  // introspection query, do nothing.
163
- const skip = selections.some(
164
- (selection) =>
165
- selection.kind === 'Field' &&
166
- (selection.name.value === '__typename' ||
167
- selection.name.value.lastIndexOf('__', 0) === 0),
168
- );
169
-
146
+ const skip = selections.some(selection => selection.kind === 'Field' && (selection.name.value === '__typename' || selection.name.value.lastIndexOf('__', 0) === 0));
170
147
  if (skip) {
171
148
  return;
172
149
  }
173
150
 
174
151
  // If this SelectionSet is @export-ed as an input variable, it should
175
152
  // not have a __typename field (see issue #4691).
176
- if (
177
- parent.kind === 'Field' &&
178
- parent.directives &&
179
- parent.directives.some((d) => d.name.value === 'export')
180
- ) {
153
+ if (parent.kind === 'Field' && parent.directives && parent.directives.some(d => d.name.value === 'export')) {
181
154
  return;
182
155
  }
183
156
 
184
157
  // Create and return a new SelectionSet with a __typename Field.
185
158
  return Object.assign({}, node, {
186
- selections: [...selections, TYPENAME_FIELD],
159
+ selections: [...selections, TYPENAME_FIELD]
187
160
  });
188
- },
189
- },
161
+ }
162
+ }
190
163
  });
191
164
  }
192
165
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@merkur/plugin-graphql-client",
3
- "version": "0.38.0",
3
+ "version": "0.40.0",
4
4
  "description": "Merkur event emitter plugin.",
5
5
  "main": "lib/index",
6
6
  "module": "lib/index",
@@ -27,8 +27,7 @@
27
27
  "preversion": "npm test",
28
28
  "test": "jest --no-watchman -c ./jest.config.js",
29
29
  "test:es:version": "es-check es11 ./lib/index.mjs --module && es-check es9 ./lib/index.es9.mjs --module && es-check es9 ./lib/index.es9.cjs --module",
30
- "build": "rollup -c rollup.config.mjs",
31
- "prepare": "npm run build"
30
+ "build": "rollup -c rollup.config.mjs"
32
31
  },
33
32
  "repository": {
34
33
  "type": "git",
@@ -51,10 +50,10 @@
51
50
  },
52
51
  "homepage": "https://merkur.js.org/",
53
52
  "devDependencies": {
54
- "@merkur/core": "^0.38.0",
55
- "@merkur/plugin-component": "^0.38.0",
56
- "@merkur/plugin-error": "^0.38.0",
57
- "@merkur/plugin-http-client": "^0.38.0"
53
+ "@merkur/core": "^0.40.0",
54
+ "@merkur/plugin-component": "^0.40.0",
55
+ "@merkur/plugin-error": "^0.40.0",
56
+ "@merkur/plugin-http-client": "^0.40.0"
58
57
  },
59
58
  "peerDependencies": {
60
59
  "@merkur/core": "*",
@@ -65,5 +64,5 @@
65
64
  "graphql": "^16.6.0",
66
65
  "graphql-tag": "^2.12.6"
67
66
  },
68
- "gitHead": "a6e379c0cb887898e34465dc3db9231feb68e6a5"
67
+ "gitHead": "a7bf45d46a5c0fca7130ae6a86e1cd94e5894ca2"
69
68
  }