payload 0.20.7-beta.0 → 0.20.10-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +18 -37
  2. package/components/styles.css +1 -1
  3. package/dist/admin/components/elements/ColumnSelector/index.js +1 -1
  4. package/dist/admin/components/elements/ColumnSelector/index.scss +4 -7
  5. package/dist/admin/components/elements/Eyebrow/index.scss +4 -0
  6. package/dist/admin/components/elements/Pill/index.scss +1 -0
  7. package/dist/admin/components/elements/ReactSelect/index.js +2 -2
  8. package/dist/admin/components/elements/ReactSelect/types.d.ts +1 -0
  9. package/dist/admin/components/elements/WhereBuilder/index.js +1 -1
  10. package/dist/admin/components/forms/field-types/Array/Array.js +1 -1
  11. package/dist/admin/components/forms/field-types/Array/index.scss +1 -1
  12. package/dist/admin/components/forms/field-types/Blocks/Blocks.js +1 -1
  13. package/dist/admin/components/forms/field-types/Blocks/index.scss +1 -1
  14. package/dist/admin/components/forms/field-types/Group/index.js +3 -0
  15. package/dist/admin/components/forms/field-types/Group/index.scss +12 -0
  16. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.js +3 -3
  17. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.scss +1 -15
  18. package/dist/admin/components/forms/field-types/Select/Input.d.ts +1 -0
  19. package/dist/admin/components/forms/field-types/Select/Input.js +2 -2
  20. package/dist/admin/components/forms/field-types/Select/index.js +6 -3
  21. package/dist/admin/components/forms/field-types/Tabs/index.js +17 -15
  22. package/dist/admin/components/forms/field-types/Tabs/index.scss +3 -4
  23. package/dist/admin/components/forms/field-types/Tabs/provider.d.ts +8 -0
  24. package/dist/admin/components/forms/field-types/Tabs/provider.js +7 -0
  25. package/dist/admin/components/forms/field-types/Upload/index.scss +1 -1
  26. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Iterable/index.js +2 -2
  27. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/styles.d.ts +1 -0
  28. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/styles.js +1 -0
  29. package/dist/admin/components/views/Version/Version.js +1 -1
  30. package/dist/admin/components/views/collections/List/buildColumns.js +1 -1
  31. package/dist/collections/operations/local/restoreVersion.d.ts +0 -1
  32. package/dist/collections/operations/local/restoreVersion.js +2 -3
  33. package/dist/fields/config/schema.js +4 -1
  34. package/dist/fields/config/types.d.ts +3 -0
  35. package/dist/fields/config/types.js +1 -1
  36. package/dist/fields/hooks/beforeChange/promise.js +3 -3
  37. package/dist/globals/operations/local/restoreVersion.d.ts +2 -0
  38. package/dist/globals/operations/local/restoreVersion.js +6 -3
  39. package/dist/index.js +1 -1
  40. package/dist/mongoose/buildSchema.js +4 -4
  41. package/dist/{admin/utilities → utilities}/flattenTopLevelFields.d.ts +1 -1
  42. package/dist/utilities/flattenTopLevelFields.js +33 -0
  43. package/dist/webpack/getBaseConfig.js +2 -6
  44. package/docs/fields/select.mdx +40 -22
  45. package/docs/fields/tabs.mdx +64 -2
  46. package/package.json +1 -1
  47. package/dist/admin/utilities/flattenTopLevelFields.js +0 -30
  48. package/dist/auth/auth.spec.d.ts +0 -1
  49. package/dist/auth/auth.spec.js +0 -198
  50. package/dist/versions/tests/collections-graphql.spec.d.ts +0 -1
  51. package/dist/versions/tests/collections-graphql.spec.js +0 -141
  52. package/dist/versions/tests/collections-rest.spec.d.ts +0 -1
  53. package/dist/versions/tests/collections-rest.spec.js +0 -148
  54. package/dist/versions/tests/globals-graphql.spec.d.ts +0 -1
  55. package/dist/versions/tests/globals-graphql.spec.js +0 -157
  56. package/dist/versions/tests/globals-rest.spec.d.ts +0 -1
  57. package/dist/versions/tests/globals-rest.spec.js +0 -151
@@ -2,8 +2,70 @@
2
2
  title: Tabs Field
3
3
  label: Tabs
4
4
  order: 170
5
- desc: Tabs field desc here
5
+ desc: The Tabs field is a great way to organize complex editing experiences into specific tab-based areas.
6
6
  keywords: tabs, fields, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express
7
7
  ---
8
8
 
9
- Coming soon
9
+ <Banner >
10
+ The Tabs field is presentational-only and only affects the Admin panel. By using it, you can place fields within a nice layout component that separates certain sub-fields by a tabbed interface.
11
+ </Banner>
12
+
13
+ ![Tabs field type used to separate Hero fields from Page Layout](https://payloadcms.com/images/fields/tabs/tabs.jpg)
14
+ *Tabs field type used to separate Hero fields from Page Layout*
15
+
16
+ ### Config
17
+
18
+ | Option | Description |
19
+ | ---------------- | ----------- |
20
+ | **`tabs`** * | Array of tabs to render within this Tabs field. |
21
+ | **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
22
+
23
+ #### Tab-specific Config
24
+
25
+ Each tab has its own required `label` and `fields` array. You can also optionally pass a `description` to render within each individual tab.
26
+
27
+ | Option | Description |
28
+ | ----------------- | ----------- |
29
+ | **`label`** * | The label to render on the tab itself. |
30
+ | **`fields`** * | The fields to render within this tab. |
31
+ | **`description`** | Optionally render a description within this tab to describe the contents of the tab itself. |
32
+
33
+ *\* An asterisk denotes that a property is required.*
34
+
35
+ ### Example
36
+
37
+ `collections/ExampleCollection.js`
38
+ ```js
39
+ {
40
+ slug: 'example-collection',
41
+ fields: [
42
+ {
43
+ type: 'tabs', // required
44
+ tabs: [ // required
45
+ {
46
+ label: 'Tab One Label', // required
47
+ description: 'This will appear within the tab above the fields.'
48
+ fields: [ // required
49
+ {
50
+ name: 'someTextField',
51
+ type: 'text',
52
+ required: true,
53
+ },
54
+ ],
55
+ },
56
+ {
57
+ label: 'Tab Two Label', // required
58
+ fields: [ // required
59
+ {
60
+ name: 'numberField',
61
+ type: 'number',
62
+ required: true,
63
+ },
64
+ ],
65
+ }
66
+ ]
67
+
68
+ }
69
+ ]
70
+ }
71
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "0.20.7-beta.0",
3
+ "version": "0.20.10-beta.0",
4
4
  "description": "Node, React and MongoDB Headless CMS and Application Framework",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -1,30 +0,0 @@
1
- import { fieldAffectsData, fieldHasSubFields, fieldIsPresentationalOnly } from '../../fields/config/types';
2
- const flattenFields = (fields, keepPresentationalFields) => {
3
- return fields.reduce((fieldsToUse, field) => {
4
- if (fieldAffectsData(field) || (keepPresentationalFields && fieldIsPresentationalOnly(field))) {
5
- return [
6
- ...fieldsToUse,
7
- field,
8
- ];
9
- }
10
- if (fieldHasSubFields(field)) {
11
- return [
12
- ...fieldsToUse,
13
- ...flattenFields(field.fields, keepPresentationalFields),
14
- ];
15
- }
16
- if (field.type === 'tabs') {
17
- return [
18
- ...fieldsToUse,
19
- ...field.tabs.reduce((tabFields, tab) => {
20
- return [
21
- ...tabFields,
22
- ...flattenFields(tab.fields, keepPresentationalFields),
23
- ];
24
- }, []),
25
- ];
26
- }
27
- return fieldsToUse;
28
- }, []);
29
- };
30
- export default flattenFields;
@@ -1 +0,0 @@
1
- export {};
@@ -1,198 +0,0 @@
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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
@@ -1 +0,0 @@
1
- export {};
@@ -1,141 +0,0 @@
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;
16
- let token;
17
- let postID;
18
- let versionID;
19
- describe('Collections GrahpQL Version Resolvers', () => {
20
- const title = 'autosave title';
21
- beforeAll(async (done) => {
22
- const login = `
23
- mutation {
24
- loginAdmin(
25
- email: "${testCredentials_1.email}",
26
- password: "${testCredentials_1.password}"
27
- ) {
28
- token
29
- }
30
- }`;
31
- const response = await (0, graphql_request_1.request)(url, login);
32
- token = response.loginAdmin.token;
33
- client = new graphql_request_1.GraphQLClient(url, { headers: { Authorization: `JWT ${token}` } });
34
- done();
35
- });
36
- describe('Create', () => {
37
- it('should allow a new autosavePost to be created with draft status', async () => {
38
- const description = 'autosave description';
39
- const query = `mutation {
40
- createAutosavePost(data: {title: "${title}", description: "${description}"}) {
41
- id
42
- title
43
- description
44
- createdAt
45
- updatedAt
46
- _status
47
- }
48
- }`;
49
- const response = await client.request(query);
50
- const data = response.createAutosavePost;
51
- postID = data.id;
52
- expect(data._status).toStrictEqual('draft');
53
- });
54
- });
55
- describe('Read', () => {
56
- const updatedTitle = 'updated title';
57
- beforeAll(async (done) => {
58
- // modify the post to create a new version
59
- // language=graphQL
60
- const update = `mutation {
61
- updateAutosavePost(id: "${postID}", data: {title: "${updatedTitle}"}) {
62
- title
63
- }
64
- }`;
65
- await client.request(update);
66
- // language=graphQL
67
- const query = `query {
68
- versionsAutosavePosts(where: { parent: { equals: "${postID}" } }) {
69
- docs {
70
- id
71
- }
72
- }
73
- }`;
74
- const response = await client.request(query);
75
- versionID = response.versionsAutosavePosts.docs[0].id;
76
- done();
77
- });
78
- it('should allow read of versions by version id', async () => {
79
- const query = `query {
80
- versionAutosavePost(id: "${versionID}") {
81
- id
82
- parent {
83
- id
84
- }
85
- version {
86
- title
87
- }
88
- }
89
- }`;
90
- const response = await client.request(query);
91
- const data = response.versionAutosavePost;
92
- versionID = data.id;
93
- expect(data.id).toBeDefined();
94
- expect(data.parent.id).toStrictEqual(postID);
95
- expect(data.version.title).toStrictEqual(title);
96
- });
97
- it('should allow read of versions by querying version content', async () => {
98
- // language=graphQL
99
- const query = `query {
100
- versionsAutosavePosts(where: { version__title: {equals: "${title}" } }) {
101
- docs {
102
- id
103
- parent {
104
- id
105
- }
106
- version {
107
- title
108
- }
109
- }
110
- }
111
- }`;
112
- const response = await client.request(query);
113
- const data = response.versionsAutosavePosts;
114
- const doc = data.docs[0];
115
- versionID = doc.id;
116
- expect(doc.id).toBeDefined();
117
- expect(doc.parent.id).toStrictEqual(postID);
118
- expect(doc.version.title).toStrictEqual(title);
119
- });
120
- });
121
- describe('Restore', () => {
122
- it('should allow a version to be restored', async () => {
123
- // update a versionsPost
124
- const restore = `mutation {
125
- restoreVersionAutosavePost(id: "${versionID}") {
126
- title
127
- }
128
- }`;
129
- await client.request(restore);
130
- const query = `query {
131
- AutosavePost(id: "${postID}") {
132
- title
133
- }
134
- }`;
135
- const response = await client.request(query);
136
- const data = response.AutosavePost;
137
- expect(data.title).toStrictEqual(title);
138
- });
139
- });
140
- });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMtZ3JhcGhxbC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZlcnNpb25zL3Rlc3RzL2NvbGxlY3Rpb25zLWdyYXBocWwuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztHQUVHO0FBQ0gscURBQXlEO0FBQ3pELDZEQUEwQztBQUMxQyxvRUFBaUU7QUFFakUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFTLEdBQUUsQ0FBQztBQUUzQixNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUU5RSxJQUFJLE1BQU0sQ0FBQztBQUNYLElBQUksS0FBSyxDQUFDO0FBQ1YsSUFBSSxNQUFNLENBQUM7QUFDWCxJQUFJLFNBQVMsQ0FBQztBQUVkLFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7SUFDckQsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7SUFFL0IsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN2QixNQUFNLEtBQUssR0FBRzs7O29CQUdFLHVCQUFLO3VCQUNGLDBCQUFROzs7O1FBSXZCLENBQUM7UUFFTCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEseUJBQU8sRUFBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFM0MsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBRWxDLE1BQU0sR0FBRyxJQUFJLCtCQUFhLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEYsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFD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
@@ -1 +0,0 @@
1
- export {};
@@ -1,148 +0,0 @@
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 load_1 = __importDefault(require("../../config/load"));
7
- const testCredentials_1 = require("../../mongoose/testCredentials");
8
- require('isomorphic-fetch');
9
- const { serverURL: url } = (0, load_1.default)();
10
- let token = null;
11
- let headers = null;
12
- let postID;
13
- let versionID;
14
- describe('Collection Versions - REST', () => {
15
- beforeAll(async (done) => {
16
- const response = await fetch(`${url}/api/admins/login`, {
17
- body: JSON.stringify({
18
- email: testCredentials_1.email,
19
- password: testCredentials_1.password,
20
- }),
21
- headers: {
22
- 'Content-Type': 'application/json',
23
- },
24
- method: 'post',
25
- });
26
- const data = await response.json();
27
- ({ token } = data);
28
- headers = {
29
- Authorization: `JWT ${token}`,
30
- 'Content-Type': 'application/json',
31
- };
32
- const post = await fetch(`${url}/api/autosave-posts`, {
33
- body: JSON.stringify({
34
- title: 'Here is an autosave post in EN',
35
- description: '345j23o4ifj34jf54g',
36
- }),
37
- headers,
38
- method: 'post',
39
- }).then((res) => res.json());
40
- postID = post.doc.id;
41
- done();
42
- });
43
- describe('Create', () => {
44
- it('should allow a new version to be created', async () => {
45
- const title2 = 'Here is an updated post title in EN';
46
- const updatedPost = await fetch(`${url}/api/autosave-posts/${postID}`, {
47
- body: JSON.stringify({
48
- title: title2,
49
- }),
50
- headers,
51
- method: 'put',
52
- }).then((res) => res.json());
53
- const versions = await fetch(`${url}/api/autosave-posts/versions`, {
54
- headers,
55
- }).then((res) => res.json());
56
- versionID = versions.docs[0].id;
57
- expect(updatedPost.doc.title).toBe(title2);
58
- expect(updatedPost.doc._status).toStrictEqual('draft');
59
- expect(versionID).toBeDefined();
60
- });
61
- it('should allow a version to be retrieved by ID', async () => {
62
- const version = await fetch(`${url}/api/autosave-posts/versions/${versionID}`, {
63
- headers,
64
- }).then((res) => res.json());
65
- expect(version.id).toStrictEqual(versionID);
66
- });
67
- it('should allow a version to save locales properly', async () => {
68
- const englishTitle = 'Title in EN';
69
- const spanishTitle = 'Title in ES';
70
- await fetch(`${url}/api/autosave-posts/${postID}`, {
71
- body: JSON.stringify({
72
- title: englishTitle,
73
- }),
74
- headers,
75
- method: 'put',
76
- }).then((res) => res.json());
77
- const updatedPostES = await fetch(`${url}/api/autosave-posts/${postID}?locale=es`, {
78
- body: JSON.stringify({
79
- title: spanishTitle,
80
- }),
81
- headers,
82
- method: 'put',
83
- }).then((res) => res.json());
84
- expect(updatedPostES.doc.title).toBe(spanishTitle);
85
- const newEnglishTitle = 'New title in EN';
86
- await fetch(`${url}/api/autosave-posts/${postID}`, {
87
- body: JSON.stringify({
88
- title: newEnglishTitle,
89
- }),
90
- headers,
91
- method: 'put',
92
- }).then((res) => res.json());
93
- const versions = await fetch(`${url}/api/autosave-posts/versions?locale=all`, {
94
- headers,
95
- }).then((res) => res.json());
96
- expect(versions.docs[0].version.title.en).toStrictEqual(englishTitle);
97
- expect(versions.docs[0].version.title.es).toStrictEqual(spanishTitle);
98
- });
99
- });
100
- describe('Restore', () => {
101
- it('should allow a version to be restored', async () => {
102
- const title2 = 'Here is an updated post title in EN';
103
- const updatedPost = await fetch(`${url}/api/autosave-posts/${postID}`, {
104
- body: JSON.stringify({
105
- title: title2,
106
- }),
107
- headers,
108
- method: 'put',
109
- }).then((res) => res.json());
110
- expect(updatedPost.doc.title).toBe(title2);
111
- const versions = await fetch(`${url}/api/autosave-posts/versions`, {
112
- headers,
113
- }).then((res) => res.json());
114
- versionID = versions.docs[0].id;
115
- const restore = await fetch(`${url}/api/autosave-posts/versions/${versionID}`, {
116
- headers,
117
- method: 'post',
118
- }).then((res) => res.json());
119
- expect(restore.message).toBeDefined();
120
- expect(restore.doc.title).toBeDefined();
121
- const restoredPost = await fetch(`${url}/api/autosave-posts/${postID}?draft=true`, {
122
- headers,
123
- }).then((res) => res.json());
124
- expect(restoredPost.title).toBe(restore.doc.title);
125
- });
126
- });
127
- describe('Draft Access Control', () => {
128
- it('should prevent a draft from being publicly readable', async () => {
129
- const badAttempt = await fetch(`${url}/api/autosave-posts/${postID}`);
130
- expect(badAttempt.status).toBe(404);
131
- });
132
- it('should prevent an authenticated user from retrieving drafts without asking', async () => {
133
- const badAttempt = await fetch(`${url}/api/autosave-posts/${postID}`, {
134
- headers: {
135
- 'Content-Type': 'application/json',
136
- },
137
- });
138
- expect(badAttempt.status).toBe(404);
139
- });
140
- it('should allow an authenticated user to explicitly retrieve draft', async () => {
141
- const badAttempt = await fetch(`${url}/api/autosave-posts/${postID}?draft=true`, {
142
- headers,
143
- });
144
- expect(badAttempt.status).toBe(200);
145
- });
146
- });
147
- });
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMtcmVzdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZlcnNpb25zL3Rlc3RzL2NvbGxlY3Rpb25zLXJlc3Quc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZEQUEwQztBQUMxQyxvRUFBaUU7QUFFakUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFNUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFBLGNBQVMsR0FBRSxDQUFDO0FBRXZDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztBQUNqQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDbkIsSUFBSSxNQUFNLENBQUM7QUFDWCxJQUFJLFNBQVMsQ0FBQztBQUVkLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7SUFDMUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsbUJBQW1CLEVBQUU7WUFDdEQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUssRUFBTCx1QkFBSztnQkFDTCxRQUFRLEVBQVIsMEJBQVE7YUFDVCxDQUFDO1lBQ0YsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7YUFDbkM7WUFDRCxNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRW5DLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVuQixPQUFPLEdBQUc7WUFDUixhQUFhLEVBQUUsT0FBTyxLQUFLLEVBQUU7WUFDN0IsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQyxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FB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
@@ -1 +0,0 @@
1
- export {};