payload 0.15.1 → 0.15.2

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 (30) hide show
  1. package/.eslintrc.js +6 -0
  2. package/CHANGELOG.md +7 -0
  3. package/dist/admin/components/elements/elements.spec.d.ts +1 -0
  4. package/dist/admin/components/elements/elements.spec.js +12 -0
  5. package/dist/auth/auth.spec.d.ts +1 -0
  6. package/dist/auth/auth.spec.js +198 -0
  7. package/dist/collections/graphql/resolvers/resolvers.spec.d.ts +1 -0
  8. package/dist/collections/graphql/resolvers/resolvers.spec.js +360 -0
  9. package/dist/collections/operations/local/local.spec.d.ts +1 -0
  10. package/dist/collections/operations/local/local.spec.js +175 -0
  11. package/dist/collections/tests/collections.spec.d.ts +1 -0
  12. package/dist/collections/tests/collections.spec.js +725 -0
  13. package/dist/collections/tests/hooks.spec.d.ts +1 -0
  14. package/dist/collections/tests/hooks.spec.js +152 -0
  15. package/dist/collections/tests/pointField.spec.d.ts +1 -0
  16. package/dist/collections/tests/pointField.spec.js +208 -0
  17. package/dist/collections/tests/relationships.spec.d.ts +1 -0
  18. package/dist/collections/tests/relationships.spec.js +174 -0
  19. package/dist/collections/tests/uploads.spec.d.ts +1 -0
  20. package/dist/collections/tests/uploads.spec.js +328 -0
  21. package/dist/errors/errors.spec.d.ts +1 -0
  22. package/dist/errors/errors.spec.js +29 -0
  23. package/dist/express/middleware/errorHandler.spec.d.ts +1 -0
  24. package/dist/express/middleware/errorHandler.spec.js +91 -0
  25. package/dist/globals/requestHandlers/globals.spec.d.ts +4 -0
  26. package/dist/globals/requestHandlers/globals.spec.js +161 -0
  27. package/dist/preferences/graphql/resolvers.spec.d.ts +1 -0
  28. package/dist/preferences/graphql/resolvers.spec.js +115 -0
  29. package/dist/versions/drafts/appendVersionToQueryKey.js +8 -5
  30. package/package.json +1 -1
package/.eslintrc.js CHANGED
@@ -40,6 +40,12 @@ module.exports = {
40
40
  ],
41
41
  },
42
42
  },
43
+ {
44
+ files: ['*.spec.ts'],
45
+ rules: {
46
+ '@typescript-eslint/no-use-before-define': 'off',
47
+ },
48
+ },
43
49
  ],
44
50
  rules: {
45
51
  'no-sparse-arrays': 'off',
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.15.2](https://github.com/payloadcms/payload/compare/v0.15.1...v0.15.2) (2022-04-04)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * [#495](https://github.com/payloadcms/payload/issues/495), avoids appending version to id queries ([a703e05](https://github.com/payloadcms/payload/commit/a703e0582df3f4706ee051cf1752c79ff4b551ef))
7
+
1
8
  ## [0.15.1](https://github.com/payloadcms/payload/compare/v0.15.0...v0.15.1) (2022-03-28)
2
9
 
3
10
 
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import Separator from './Paginator/Separator';
4
+ describe('Elements', () => {
5
+ describe('Paginator', () => {
6
+ it('separator - renders dash', () => {
7
+ const { getByText } = render(React.createElement(Separator, null));
8
+ const linkElement = getByText(/—/i); // —
9
+ expect(linkElement).toBeInTheDocument();
10
+ });
11
+ });
12
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const mongodb_1 = __importDefault(require("mongodb"));
7
+ const load_1 = __importDefault(require("../config/load"));
8
+ const testCredentials_1 = require("../mongoose/testCredentials");
9
+ require('isomorphic-fetch');
10
+ const { url: mongoURL, port: mongoPort, name: mongoDBName } = testCredentials_1.connection;
11
+ const { serverURL: url } = (0, load_1.default)();
12
+ let token = null;
13
+ describe('Users REST API', () => {
14
+ it('should prevent registering a first user', async () => {
15
+ const response = await fetch(`${url}/api/admins/first-register`, {
16
+ body: JSON.stringify({
17
+ email: 'thisuser@shouldbeprevented.com',
18
+ password: 'get-out',
19
+ }),
20
+ headers: {
21
+ 'Content-Type': 'application/json',
22
+ },
23
+ method: 'post',
24
+ });
25
+ expect(response.status).toBe(403);
26
+ });
27
+ it('should login a user successfully', async () => {
28
+ const response = await fetch(`${url}/api/admins/login`, {
29
+ body: JSON.stringify({
30
+ email: testCredentials_1.email,
31
+ password: testCredentials_1.password,
32
+ }),
33
+ headers: {
34
+ 'Content-Type': 'application/json',
35
+ },
36
+ method: 'post',
37
+ });
38
+ const data = await response.json();
39
+ expect(response.status).toBe(200);
40
+ expect(data.token).toBeDefined();
41
+ ({ token } = data);
42
+ });
43
+ it('should return a logged in user from /me', async () => {
44
+ const response = await fetch(`${url}/api/admins/me`, {
45
+ headers: {
46
+ Authorization: `JWT ${token}`,
47
+ },
48
+ });
49
+ const data = await response.json();
50
+ expect(response.status).toBe(200);
51
+ expect(data.user.email).toBeDefined();
52
+ });
53
+ it('should refresh a token and reset its expiration', async () => {
54
+ const response = await fetch(`${url}/api/admins/refresh-token`, {
55
+ method: 'post',
56
+ headers: {
57
+ Authorization: `JWT ${token}`,
58
+ },
59
+ });
60
+ const data = await response.json();
61
+ expect(response.status).toBe(200);
62
+ expect(data.refreshedToken).toBeDefined();
63
+ token = data.refreshedToken;
64
+ });
65
+ it('should allow forgot-password by email', async () => {
66
+ // TODO: figure out how to spy on payload instance functions
67
+ // const mailSpy = jest.spyOn(payload, 'sendEmail');
68
+ const response = await fetch(`${url}/api/admins/forgot-password`, {
69
+ method: 'post',
70
+ body: JSON.stringify({
71
+ email: testCredentials_1.email,
72
+ }),
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ },
76
+ });
77
+ // is not working
78
+ // expect(mailSpy).toHaveBeenCalled();
79
+ expect(response.status).toBe(200);
80
+ });
81
+ it('should allow a user to be created', async () => {
82
+ const response = await fetch(`${url}/api/admins`, {
83
+ body: JSON.stringify({
84
+ email: 'name@test.com',
85
+ password: testCredentials_1.password,
86
+ roles: ['editor'],
87
+ }),
88
+ headers: {
89
+ Authorization: `JWT ${token}`,
90
+ 'Content-Type': 'application/json',
91
+ },
92
+ method: 'post',
93
+ });
94
+ const data = await response.json();
95
+ expect(response.status).toBe(201);
96
+ expect(data).toHaveProperty('message');
97
+ expect(data).toHaveProperty('doc');
98
+ const { doc } = data;
99
+ expect(doc).toHaveProperty('email');
100
+ expect(doc).toHaveProperty('createdAt');
101
+ expect(doc).toHaveProperty('roles');
102
+ });
103
+ it('should allow verification of a user', async () => {
104
+ const emailToVerify = 'verify@me.com';
105
+ const response = await fetch(`${url}/api/public-users`, {
106
+ body: JSON.stringify({
107
+ email: emailToVerify,
108
+ password: testCredentials_1.password,
109
+ roles: ['editor'],
110
+ }),
111
+ headers: {
112
+ Authorization: `JWT ${token}`,
113
+ 'Content-Type': 'application/json',
114
+ },
115
+ method: 'post',
116
+ });
117
+ expect(response.status).toBe(201);
118
+ const client = await mongodb_1.default.connect(`${mongoURL}:${mongoPort}`, {
119
+ useUnifiedTopology: true,
120
+ });
121
+ const db = client.db(mongoDBName);
122
+ const userResult = await db.collection('public-users').findOne({ email: emailToVerify });
123
+ const { _verified, _verificationToken } = userResult;
124
+ expect(_verified).toBe(false);
125
+ expect(_verificationToken).toBeDefined();
126
+ const verificationResponse = await fetch(`${url}/api/public-users/verify/${_verificationToken}`, {
127
+ headers: {
128
+ 'Content-Type': 'application/json',
129
+ },
130
+ method: 'post',
131
+ });
132
+ expect(verificationResponse.status).toBe(200);
133
+ const afterVerifyResult = await db.collection('public-users').findOne({ email: emailToVerify });
134
+ const { _verified: afterVerified, _verificationToken: afterToken } = afterVerifyResult;
135
+ expect(afterVerified).toBe(true);
136
+ expect(afterToken).toBeUndefined();
137
+ });
138
+ describe('Account Locking', () => {
139
+ const userEmail = 'lock@me.com';
140
+ let db;
141
+ beforeAll(async () => {
142
+ const client = await mongodb_1.default.connect(`${mongoURL}:${mongoPort}`);
143
+ db = client.db(mongoDBName);
144
+ });
145
+ it('should lock the user after too many attempts', async () => {
146
+ await fetch(`${url}/api/admins`, {
147
+ body: JSON.stringify({
148
+ email: userEmail,
149
+ password: testCredentials_1.password,
150
+ }),
151
+ headers: {
152
+ Authorization: `JWT ${token}`,
153
+ 'Content-Type': 'application/json',
154
+ },
155
+ method: 'post',
156
+ });
157
+ const tryLogin = () => fetch(`${url}/api/admins/login`, {
158
+ body: JSON.stringify({
159
+ email: userEmail,
160
+ password: 'bad',
161
+ }),
162
+ headers: {
163
+ Authorization: `JWT ${token}`,
164
+ 'Content-Type': 'application/json',
165
+ },
166
+ method: 'post',
167
+ });
168
+ await tryLogin();
169
+ await tryLogin();
170
+ await tryLogin();
171
+ await tryLogin();
172
+ await tryLogin();
173
+ const userResult = await db.collection('admins').findOne({ email: userEmail });
174
+ const { loginAttempts, lockUntil } = userResult;
175
+ expect(loginAttempts).toBe(5);
176
+ expect(lockUntil).toBeDefined();
177
+ });
178
+ it('should unlock account once lockUntil period is over', async () => {
179
+ await db.collection('admins').findOneAndUpdate({ email: userEmail }, { $set: { lockUntil: Date.now() - (605 * 1000) } });
180
+ await fetch(`${url}/api/admins/login`, {
181
+ body: JSON.stringify({
182
+ email: userEmail,
183
+ password: testCredentials_1.password,
184
+ }),
185
+ headers: {
186
+ Authorization: `JWT ${token}`,
187
+ 'Content-Type': 'application/json',
188
+ },
189
+ method: 'post',
190
+ });
191
+ const userResult = await db.collection('admins').findOne({ email: userEmail });
192
+ const { loginAttempts, lockUntil } = userResult;
193
+ expect(loginAttempts).toBe(0);
194
+ expect(lockUntil).toBeUndefined();
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvYXV0aC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBQWtDO0FBQ2xDLDBEQUF1QztBQUN2QyxpRUFBMEU7QUFFMUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFNUIsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsNEJBQVUsQ0FBQztBQUV6RSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUEsY0FBUyxHQUFFLENBQUM7QUFFdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBRWpCLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyw0QkFBNEIsRUFBRTtZQUMvRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsS0FBSyxFQUFFLGdDQUFnQztnQkFDdkMsUUFBUSxFQUFFLFNBQVM7YUFDcEIsQ0FBQztZQUNGLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNoRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsbUJBQW1CLEVBQUU7WUFDdEQsSUFBSSxFQUFFLElBQUksQ0FBQyxT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
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /**
7
+ * @jest-environment node
8
+ */
9
+ const graphql_request_1 = require("graphql-request");
10
+ const load_1 = __importDefault(require("../../../config/load"));
11
+ const testCredentials_1 = require("../../../mongoose/testCredentials");
12
+ require('isomorphic-fetch');
13
+ const config = (0, load_1.default)();
14
+ const url = `${config.serverURL}${config.routes.api}${config.routes.graphQL}`;
15
+ let client = null;
16
+ let token = null;
17
+ describe('GrahpQL Resolvers', () => {
18
+ beforeAll(async (done) => {
19
+ const query = `
20
+ mutation {
21
+ loginAdmin(
22
+ email: "${testCredentials_1.email}",
23
+ password: "${testCredentials_1.password}"
24
+ ) {
25
+ token
26
+ }
27
+ }`;
28
+ const response = await (0, graphql_request_1.request)(url, query);
29
+ token = response.loginAdmin.token;
30
+ client = new graphql_request_1.GraphQLClient(url, { headers: { Authorization: `JWT ${token}` } });
31
+ done();
32
+ });
33
+ describe('Create', () => {
34
+ it('should allow a localized post to be created', async () => {
35
+ const title = 'gql create';
36
+ const description = 'description';
37
+ // language=graphQL
38
+ const query = `mutation {
39
+ createLocalizedPost(data: {title: "${title}", description: "${description}", priority: 10}) {
40
+ id
41
+ title
42
+ description
43
+ priority
44
+ createdAt
45
+ updatedAt
46
+ }
47
+ }`;
48
+ const response = await client.request(query);
49
+ const data = response.createLocalizedPost;
50
+ expect(data.title).toBe(title);
51
+ expect(data.id).toStrictEqual(expect.any(String));
52
+ // const timestampRegex = /^(\d{4})(?:-?W(\d+)(?:-?(\d+)D?)?|(?:-(\d+))?-(\d+))(?:[T ](\d+):(\d+)(?::(\d+)(?:\.(\d+))?)?)?(?:Z(-?\d*))?$/;
53
+ // expect(data.createdAt).toStrictEqual(expect.stringMatching(timestampRegex));
54
+ // expect(data.updatedAt).toStrictEqual(expect.stringMatching(timestampRegex));
55
+ expect(data.createdAt).toStrictEqual(expect.any(String));
56
+ expect(data.updatedAt).toStrictEqual(expect.any(String));
57
+ });
58
+ });
59
+ describe('Read', () => {
60
+ it('should be able to read localized post', async () => {
61
+ const title = 'gql read 1';
62
+ const description = 'description';
63
+ // language=graphQL
64
+ const query = `mutation {
65
+ createLocalizedPost(data: {title: "${title}", description: "${description}", priority: 10}) {
66
+ id
67
+ title
68
+ description
69
+ priority
70
+ createdAt
71
+ updatedAt
72
+ }
73
+ }`;
74
+ const response = await client.request(query);
75
+ const { id } = response.createLocalizedPost;
76
+ // language=graphQL
77
+ const readQuery = `query {
78
+ LocalizedPost(id: "${id}") {
79
+ id
80
+ }
81
+ }`;
82
+ const readResponse = await client.request(readQuery);
83
+ const retrievedId = readResponse.LocalizedPost.id;
84
+ expect(retrievedId).toStrictEqual(id);
85
+ });
86
+ it('should query exists - true', async () => {
87
+ const title = 'gql read 2';
88
+ const description = 'description';
89
+ const summary = 'summary';
90
+ // language=graphQL
91
+ const query = `mutation {
92
+ createLocalizedPost(data: {title: "${title}", description: "${description}", summary: "${summary}", priority: 10}) {
93
+ id
94
+ title
95
+ description
96
+ priority
97
+ createdAt
98
+ updatedAt
99
+ }
100
+ }`;
101
+ const response = await client.request(query);
102
+ const { id } = response.createLocalizedPost;
103
+ // language=graphQL
104
+ const readQuery = `query {
105
+ LocalizedPosts(where: { summary: { exists: true }}) {
106
+ docs {
107
+ id
108
+ description
109
+ summary
110
+ }
111
+ }
112
+ }`;
113
+ const readResponse = await client.request(readQuery);
114
+ const retrievedId = readResponse.LocalizedPosts.docs[0].id;
115
+ expect(readResponse.LocalizedPosts.docs).toHaveLength(1);
116
+ expect(retrievedId).toStrictEqual(id);
117
+ });
118
+ it('should query exists - false', async () => {
119
+ const title = 'gql read 3';
120
+ const description = 'description';
121
+ // language=graphQL
122
+ const query = `mutation {
123
+ createLocalizedPost(data: {title: "${title}", description: "${description}", priority: 10}) {
124
+ id
125
+ title
126
+ description
127
+ priority
128
+ createdAt
129
+ updatedAt
130
+ }
131
+ }`;
132
+ const response = await client.request(query);
133
+ const { id } = response.createLocalizedPost;
134
+ // language=graphQL
135
+ const readQuery = `query {
136
+ LocalizedPosts(where: { summary: { exists: false }}) {
137
+ docs {
138
+ id
139
+ summary
140
+ }
141
+ }
142
+ }`;
143
+ const readResponse = await client.request(readQuery);
144
+ const retrievedDoc = readResponse.LocalizedPosts.docs[0];
145
+ expect(readResponse.LocalizedPosts.docs.length).toBeGreaterThan(0);
146
+ expect(retrievedDoc.id).toStrictEqual(id);
147
+ expect(retrievedDoc.summary).toBeNull();
148
+ });
149
+ });
150
+ describe('Update', () => {
151
+ it('should allow updating an existing post', async () => {
152
+ const title = 'gql update';
153
+ const description = 'description';
154
+ // language=graphQL
155
+ const query = `mutation {
156
+ createLocalizedPost(data: { title: "${title}", description: "${description}", priority: 10}) {
157
+ id
158
+ title
159
+ description
160
+ priority
161
+ }
162
+ }`;
163
+ const createResponse = await client.request(query);
164
+ const createData = createResponse.createLocalizedPost;
165
+ const { id } = createData;
166
+ const updatedDesc = 'updated description';
167
+ // language=graphQL
168
+ const update = `
169
+ mutation {
170
+ updateLocalizedPost(id: "${id}" data: {description: "${updatedDesc}"}) {
171
+ description
172
+ }
173
+ }`;
174
+ const response = await client.request(update);
175
+ const data = response.updateLocalizedPost;
176
+ expect(data.description).toBe(updatedDesc);
177
+ });
178
+ });
179
+ describe('Delete', () => {
180
+ it('should be able to delete a localized post', async () => {
181
+ const title = 'gql delete';
182
+ const description = 'description';
183
+ // language=graphQL
184
+ const query = `mutation {
185
+ createLocalizedPost(data: {title: "${title}", description: "${description}", priority: 10}) {
186
+ id
187
+ title
188
+ description
189
+ priority
190
+ createdAt
191
+ updatedAt
192
+ }
193
+ }`;
194
+ const response = await client.request(query);
195
+ const { id } = response.createLocalizedPost;
196
+ // language=graphQL
197
+ const deleteMutation = `mutation {
198
+ deleteLocalizedPost(id: "${id}") {
199
+ id
200
+ }
201
+ }`;
202
+ const deleteResponse = await client.request(deleteMutation);
203
+ const deletedId = deleteResponse.deleteLocalizedPost.id;
204
+ expect(deletedId).toStrictEqual(id);
205
+ });
206
+ });
207
+ describe('Error Handler', () => {
208
+ it('should return have an array of errors when making a bad request', async () => {
209
+ let error;
210
+ // language=graphQL
211
+ const query = `query {
212
+ LocalizedPosts(where: { summary: { exists: true }}) {
213
+ docs {
214
+ badFieldName
215
+ }
216
+ }
217
+ }`;
218
+ await client.request(query).catch((err) => {
219
+ error = err;
220
+ });
221
+ expect(Array.isArray(error.response.errors)).toBe(true);
222
+ expect(typeof error.response.errors[0].message).toBe('string');
223
+ });
224
+ it('should return have an array of errors when failing to pass validation', async () => {
225
+ let error;
226
+ // language=graphQL
227
+ const query = `mutation {
228
+ createLocalizedPost(data: {priority: 10}) {
229
+ id
230
+ priority
231
+ createdAt
232
+ updatedAt
233
+ }
234
+ }`;
235
+ await client.request(query).catch((err) => {
236
+ error = err;
237
+ });
238
+ expect(Array.isArray(error.response.errors)).toBe(true);
239
+ expect(typeof error.response.errors[0].message).toBe('string');
240
+ });
241
+ });
242
+ describe('Custom ID', () => {
243
+ it('should create', async () => {
244
+ const id = 10;
245
+ const query = `mutation {
246
+ createCustomID(data: {
247
+ id: ${id},
248
+ name: "custom"
249
+ }) {
250
+ id,
251
+ name
252
+ }
253
+ }`;
254
+ const response = await client.request(query);
255
+ const data = response.createCustomID;
256
+ expect(data.id).toStrictEqual(id);
257
+ });
258
+ it('should update', async () => {
259
+ const id = 11;
260
+ const name = 'custom name';
261
+ const query = `
262
+ mutation {
263
+ createCustomID(data: {
264
+ id: ${id},
265
+ name: "${name}"
266
+ }) {
267
+ id
268
+ name
269
+ }
270
+ }`;
271
+ await client.request(query);
272
+ const updatedName = 'updated name';
273
+ const update = `
274
+ mutation {
275
+ updateCustomID(id: ${id} data: {name: "${updatedName}"}) {
276
+ name
277
+ }
278
+ }`;
279
+ const response = await client.request(update);
280
+ const data = response.updateCustomID;
281
+ expect(data.name).toStrictEqual(updatedName);
282
+ expect(data.name).not.toStrictEqual(name);
283
+ });
284
+ it('should query on id', async () => {
285
+ const id = 15;
286
+ const name = 'custom name';
287
+ const create = `mutation {
288
+ createCustomID(data: {
289
+ id: ${id},
290
+ name: "${name}"
291
+ }) {
292
+ id
293
+ name
294
+ }
295
+ }`;
296
+ await client.request(create);
297
+ const query = `
298
+ query {
299
+ CustomIDs(where: { id: { equals: ${id} } }) {
300
+ docs {
301
+ id
302
+ name
303
+ }
304
+ }
305
+ }`;
306
+ const response = await client.request(query);
307
+ const [doc] = response.CustomIDs.docs;
308
+ expect(doc.id).toStrictEqual(id);
309
+ expect(doc.name).toStrictEqual(name);
310
+ });
311
+ it('should delete', async () => {
312
+ const id = 12;
313
+ const query = `mutation {
314
+ createCustomID(data: {
315
+ id: ${id},
316
+ name: "delete me"
317
+ }) {
318
+ id
319
+ name
320
+ }
321
+ }`;
322
+ await client.request(query);
323
+ const deleteMutation = `mutation {
324
+ deleteCustomID(id: ${id}) {
325
+ id
326
+ }
327
+ }`;
328
+ const deleteResponse = await client.request(deleteMutation);
329
+ const deletedId = deleteResponse.deleteCustomID.id;
330
+ expect(deletedId).toStrictEqual(id);
331
+ });
332
+ it('should allow relationships', async () => {
333
+ const id = 13;
334
+ const query = `mutation {
335
+ createCustomID(data: {
336
+ id: ${id},
337
+ name: "relate me"
338
+ }) {
339
+ id
340
+ name
341
+ }
342
+ }`;
343
+ await client.request(query);
344
+ const relation = `mutation {
345
+ createRelationshipA(data: {
346
+ customID: [ ${id} ]
347
+ }) {
348
+ customID {
349
+ id
350
+ }
351
+ }
352
+ }`;
353
+ const relationResponse = await client.request(relation);
354
+ const { customID } = relationResponse.createRelationshipA;
355
+ expect(customID).toHaveLength(1);
356
+ expect(customID).toHaveLength(1);
357
+ });
358
+ });
359
+ });
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXJzLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29sbGVjdGlvbnMvZ3JhcGhxbC9yZXNvbHZlcnMvcmVzb2x2ZXJzLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILHFEQUF5RDtBQUN6RCxnRUFBNkM7QUFDN0MsdUVBQW9FO0FBRXBFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRTVCLE1BQU0sTUFBTSxHQUFHLElBQUEsY0FBUyxHQUFFLENBQUM7QUFFM0IsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFOUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztBQUVqQixRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO0lBQ2pDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsTUFBTSxLQUFLLEdBQUc7OztvQkFHRSx1QkFBSzt1QkFDRiwwQkFBUTs7OztRQUl2QixDQUFDO1FBRUwsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLHlCQUFPLEVBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTNDLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUVsQyxNQUFNLEdBQUcsSUFBSSwrQkFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWhGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDM0QsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUVsQyxtQkFBbUI7WUFDbkIsTUFBTSxLQUFLLEdBQUc7K0NBQzJCLEtBQUssb0JBQW9CLFdBQVc7Ozs7Ozs7O1FBUTNFLENBQUM7WUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0MsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDO1lBRTFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsRCwwSUFBMEk7WUFDMUksK0VBQStFO1lBQy9FLCtFQUErRTtZQUMvRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDekQsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUNwQixFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUVsQyxtQkFBbUI7WUFDbkIsTUFBTSxLQUFLLEdBQUc7aURBQzZCLEtBQUssb0JBQW9CLFdBQVc7Ozs7Ozs7O1VBUTNFLENBQUM7WUFFTCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0MsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztZQUM1QyxtQkFBbUI7WUFDbkIsTUFBTSxTQUFTLEdBQUc7NkJBQ0ssRUFBRTs7O1FBR3ZCLENBQUM7WUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFFbEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMxQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDM0IsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUUxQixtQkFBbUI7WUFDbkIsTUFBTSxLQUFLLEdBQUc7aURBQzZCLEtBQUssb0JBQW9CLFdBQVcsZ0JBQWdCLE9BQU87Ozs7Ozs7O1VBUWxHLENBQUM7WUFFTCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0MsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztZQUM1QyxtQkFBbUI7WUFDbkIsTUFBTSxTQUFTLEdBQUc7Ozs7Ozs7O0VBUXRCLENBQUM7WUFDRyxNQUFNLFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRTNELE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZCQUE2QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMzQixNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7WUFFbEMsbUJBQW1CO1lBQ25CLE1BQU0sS0FBSyxHQUFHO2lEQUM2QixLQUFLLG9CQUFvQixXQUFXOzs7Ozs7OztVQVEzRSxDQUFDO1lBRUwsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTdDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUM7WUFDNUMsbUJBQW1CO1lBQ25CLE1BQU0sU0FBUyxHQUFHOzs7Ozs7O0VBT3RCLENBQUM7WUFDRyxNQUFNLFlBQVksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFekQsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRSxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixFQUFFLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUVsQyxtQkFBbUI7WUFDbkIsTUFBTSxLQUFLLEdBQUc7Z0RBQzRCLEtBQUssb0JBQW9CLFdBQVc7Ozs7OztRQU01RSxDQUFDO1lBRUgsTUFBTSxjQUFjLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRW5ELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztZQUN0RCxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsVUFBVSxDQUFDO1lBQzFCLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO1lBRTFDLG1CQUFtQjtZQUNuQixNQUFNLE1BQU0sR0FBRzs7bUNBRWMsRUFBRSwwQkFBMEIsV0FBVzs7O1FBR2xFLENBQUM7WUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDO1lBRTFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUVsQyxtQkFBbUI7WUFDbkIsTUFBTSxLQUFLLEdBQUc7aURBQzZCLEtBQUssb0JBQW9CLFdBQVc7Ozs7Ozs7O1VBUTNFLENBQUM7WUFFTCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0MsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztZQUM1QyxtQkFBbUI7WUFDbkIsTUFBTSxjQUFjLEdBQUc7bUNBQ00sRUFBRTs7O1FBRzdCLENBQUM7WUFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUV4RCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUM3QixFQUFFLENBQUMsaUVBQWlFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0UsSUFBSSxLQUFLLENBQUM7WUFFVixtQkFBbUI7WUFDbkIsTUFBTSxLQUFLLEdBQUc7Ozs7OztRQU1aLENBQUM7WUFDSCxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3hDLEtBQUssR0FBRyxHQUFHLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsTUFBTSxDQUFDLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3JGLElBQUksS0FBSyxDQUFDO1lBQ1YsbUJBQW1CO1lBQ25CLE1BQU0sS0FBSyxHQUFHOzs7Ozs7O1FBT1osQ0FBQztZQUVILE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDeEMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLEVBQUUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxLQUFLLEdBQUc7O2dCQUVKLEVBQUU7Ozs7OztRQU1WLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDO1lBRTNCLE1BQU0sS0FBSyxHQUFHOzs7Z0JBR0osRUFBRTttQkFDQyxJQUFJOzs7OztRQUtmLENBQUM7WUFFSCxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDO1lBRW5DLE1BQU0sTUFBTSxHQUFHOzsrQkFFVSxFQUFFLGtCQUFrQixXQUFXOzs7UUFHdEQsQ0FBQztZQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBRXJDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUM7WUFFM0IsTUFBTSxNQUFNLEdBQUc7O2dCQUVMLEVBQUU7bUJBQ0MsSUFBSTs7Ozs7UUFLZixDQUFDO1lBRUgsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTdCLE1BQU0sS0FBSyxHQUFHOzsyQ0FFdUIsRUFBRTs7Ozs7O1FBTXJDLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGVBQWUsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDZCxNQUFNLEtBQUssR0FBRzs7Z0JBRUosRUFBRTs7Ozs7O1FBTVYsQ0FBQztZQUVILE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU1QixNQUFNLGNBQWMsR0FBRzs2QkFDQSxFQUFFOzs7UUFHdkIsQ0FBQztZQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1RCxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUVuRCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNkLE1BQU0sS0FBSyxHQUFHOztrQkFFRixFQUFFOzs7Ozs7UUFNWixDQUFDO1lBRUgsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLE1BQU0sUUFBUSxHQUFHOzt3QkFFQyxFQUFFOzs7Ozs7UUFNbEIsQ0FBQztZQUNILE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztZQUUxRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIn0=
@@ -0,0 +1 @@
1
+ export {};