payload 0.14.31-beta.0 → 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 (59) hide show
  1. package/.eslintrc.js +6 -0
  2. package/CHANGELOG.md +60 -71
  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/admin/components/forms/field-types/RichText/RichText.js +1 -1
  6. package/dist/admin/components/forms/field-types/RichText/index.scss +4 -1
  7. package/dist/admin/components/forms/field-types/Select/index.js +1 -1
  8. package/dist/admin/components/utilities/CustomProvider/index.d.ts +4 -0
  9. package/dist/admin/components/utilities/CustomProvider/index.js +18 -0
  10. package/dist/admin/index.js +3 -1
  11. package/dist/auth/auth.spec.d.ts +1 -0
  12. package/dist/auth/auth.spec.js +198 -0
  13. package/dist/collections/graphql/resolvers/resolvers.spec.d.ts +1 -0
  14. package/dist/collections/graphql/resolvers/resolvers.spec.js +360 -0
  15. package/dist/collections/operations/find.d.ts +1 -0
  16. package/dist/collections/operations/find.js +4 -2
  17. package/dist/collections/operations/local/find.d.ts +1 -0
  18. package/dist/collections/operations/local/find.js +3 -2
  19. package/dist/collections/operations/local/local.spec.d.ts +1 -0
  20. package/dist/collections/operations/local/local.spec.js +175 -0
  21. package/dist/collections/tests/collections.spec.d.ts +1 -0
  22. package/dist/collections/tests/collections.spec.js +725 -0
  23. package/dist/collections/tests/hooks.spec.d.ts +1 -0
  24. package/dist/collections/tests/hooks.spec.js +152 -0
  25. package/dist/collections/tests/pointField.spec.d.ts +1 -0
  26. package/dist/collections/tests/pointField.spec.js +208 -0
  27. package/dist/collections/tests/relationships.spec.d.ts +1 -0
  28. package/dist/collections/tests/relationships.spec.js +174 -0
  29. package/dist/collections/tests/uploads.spec.d.ts +1 -0
  30. package/dist/collections/tests/uploads.spec.js +328 -0
  31. package/dist/config/sanitize.js +4 -1
  32. package/dist/config/schema.js +2 -1
  33. package/dist/config/types.d.ts +2 -1
  34. package/dist/errors/errors.spec.d.ts +1 -0
  35. package/dist/errors/errors.spec.js +29 -0
  36. package/dist/express/middleware/errorHandler.spec.d.ts +1 -0
  37. package/dist/express/middleware/errorHandler.spec.js +91 -0
  38. package/dist/fields/config/schema.js +5 -5
  39. package/dist/fields/validations.js +6 -5
  40. package/dist/fields/validations.spec.js +120 -1
  41. package/dist/globals/requestHandlers/globals.spec.d.ts +4 -0
  42. package/dist/globals/requestHandlers/globals.spec.js +161 -0
  43. package/dist/graphql/errorHandler.d.ts +2 -1
  44. package/dist/graphql/errorHandler.js +9 -6
  45. package/dist/graphql/index.d.ts +2 -1
  46. package/dist/graphql/index.js +13 -4
  47. package/dist/graphql/schema/buildObjectType.js +6 -36
  48. package/dist/graphql/utilities/formatName.js +3 -3
  49. package/dist/graphql/utilities/formatOptions.d.ts +3 -0
  50. package/dist/graphql/utilities/formatOptions.js +27 -0
  51. package/dist/preferences/graphql/resolvers.spec.d.ts +1 -0
  52. package/dist/preferences/graphql/resolvers.spec.js +115 -0
  53. package/dist/types/index.d.ts +1 -1
  54. package/dist/versions/drafts/appendVersionToQueryKey.js +8 -5
  55. package/docs/admin/components.mdx +10 -2
  56. package/docs/getting-started/installation.mdx +12 -0
  57. package/docs/local-api/overview.mdx +1 -0
  58. package/docs/versions/overview.mdx +2 -2
  59. 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,6 +1,52 @@
1
- ## [0.14.31-beta.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.14.31-beta.0) (2022-03-10)
1
+ ## [0.15.2](https://github.com/payloadcms/payload/compare/v0.15.1...v0.15.2) (2022-04-04)
2
2
 
3
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
+
8
+ ## [0.15.1](https://github.com/payloadcms/payload/compare/v0.15.0...v0.15.1) (2022-03-28)
9
+
10
+
11
+ ### Features
12
+
13
+ * builds a way to inject custom React providers into admin UI ([5a7e8a9](https://github.com/payloadcms/payload/commit/5a7e8a980be4e93f2503d8d007019948199a4867))
14
+ * export Plugin type from config types ([#491](https://github.com/payloadcms/payload/issues/491)) ([45f7011](https://github.com/payloadcms/payload/commit/45f70114e6664942228b46373843879c06ab8211))
15
+
16
+ # [0.15.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.15.0) (2022-03-16)
17
+
18
+ ### BREAKING CHANGES
19
+
20
+ The GraphQL error response data object has moved from the top level to the extensions object.
21
+
22
+ Here is a previous example:
23
+
24
+ ```js
25
+ {
26
+ "message": "The following fields are invalid: location,",
27
+ "data": [
28
+ {
29
+ "message": "This field requires two numbers",
30
+ "field": "location"
31
+ },
32
+ ]
33
+ },
34
+ ```
35
+
36
+ The new shape of GraphQL errors is as follows:
37
+
38
+ ```js
39
+ "extensions": {
40
+ "name": "ValidationError",
41
+ "data": [
42
+ {
43
+ "message": "This field requires two numbers",
44
+ "field": "location"
45
+ },
46
+ ]
47
+ }
48
+ ```
49
+
4
50
  ### Bug Fixes
5
51
 
6
52
  * [#422](https://github.com/payloadcms/payload/issues/422), prevents loading duplicative relationship options ([414679d](https://github.com/payloadcms/payload/commit/414679d86aac7ed94970a6eee14ff77b65f5c1d1))
@@ -12,120 +58,59 @@
12
58
  * [#461](https://github.com/payloadcms/payload/issues/461) ([08924a1](https://github.com/payloadcms/payload/commit/08924a1934ef257992381dfdded0cd9c7333e40c))
13
59
  * [#464](https://github.com/payloadcms/payload/issues/464), graphql upload access control ([fd0629e](https://github.com/payloadcms/payload/commit/fd0629e93202dfaa399c753c59481b1cbd139bf6))
14
60
  * adds key to RichText based on initialValue ([f710b8c](https://github.com/payloadcms/payload/commit/f710b8c4f3247156f64fb2b528a960bf808ef7ac))
61
+ * adjusts lte and gte types to match docs and codebase ([#480](https://github.com/payloadcms/payload/issues/480)) ([8fc4f7f](https://github.com/payloadcms/payload/commit/8fc4f7f8068cb8fcef13b1cfd6de7b4f74b5415f))
15
62
  * allow jwt to work without csrf in config ([4048734](https://github.com/payloadcms/payload/commit/40487347e3f8bd03da440a73bec0ee491abbef85))
16
- * autosave ([e835cbe](https://github.com/payloadcms/payload/commit/e835cbe0b18960905d7bfb9129bf0cf3ed3970a4))
17
- * avoids console 404 on unpublished docs ([c7c3418](https://github.com/payloadcms/payload/commit/c7c34188e16d7e85a038ccc7f128590d0784131d))
18
63
  * awaits beforeDelete hooks ([609b871](https://github.com/payloadcms/payload/commit/609b871fa274e8b6d9eaf301e52ab42179aad9b7))
19
- * bug in how find merges drafts ([1fb1eaa](https://github.com/payloadcms/payload/commit/1fb1eaab50ed3796345f1f1361b839c9fe191ee0))
20
- * bug with version count ([6bf7d82](https://github.com/payloadcms/payload/commit/6bf7d820476f28b2f127e6e3c3e358a988b237c7))
21
64
  * config empty and sparse csrf is now allowed ([7e7b058](https://github.com/payloadcms/payload/commit/7e7b0589ef6c06941af3e7e3a24c7071d8b77a1a))
22
65
  * ensures empty hasMany relationships save as empty arrays ([08b3e8f](https://github.com/payloadcms/payload/commit/08b3e8f18f0aa620d537f3258b2e080600e0f43e))
23
- * ensures fetching published doc only retrieves published docs ([7841f2a](https://github.com/payloadcms/payload/commit/7841f2a86b1095e0a1b93df34f7fe9ae2371279d))
24
- * ensures multipart/form-data using _payload flattens field data before sending ([ae44727](https://github.com/payloadcms/payload/commit/ae44727fb9734fc3801f7249fa9e78668311c09e))
25
66
  * ensures nested lists always render properly ([20e5dfb](https://github.com/payloadcms/payload/commit/20e5dfbb4ab8dab320d60772f5195c5faffe38d3))
26
67
  * ensures overrideAccess is false if undefined while populating ([97f3178](https://github.com/payloadcms/payload/commit/97f31780051828a9d506eba3520a1390acb99a96))
27
- * ensures revision hooks await promises ([f56bbe8](https://github.com/payloadcms/payload/commit/f56bbe814e31b953e1b39bf44d1e00f71b0c3b60))
28
- * ensures revisions retain all locales ([f246252](https://github.com/payloadcms/payload/commit/f246252a422c3524c1c3f65fcf073ea42ab347c3))
29
68
  * ensures rte upload is populated when only upload is enabled ([39438b8](https://github.com/payloadcms/payload/commit/39438b8460f853f64d84436eed49dde74cd207d2))
30
- * ensures unique is not set within revisions collections ([b13615f](https://github.com/payloadcms/payload/commit/b13615f2bfaf25089a8189724b999bc23110a649))
31
- * ensures VersionCount is accurate ([7569811](https://github.com/payloadcms/payload/commit/756981172f054d23a55197cfbfbec448d4841830))
32
- * ensures versions have proper data ([0ba508a](https://github.com/payloadcms/payload/commit/0ba508a87efd0f88f922da894521cd3842dad103))
33
69
  * import path for createRichTextRelationshipPromise ([586cd4d](https://github.com/payloadcms/payload/commit/586cd4d6af5485116ebb299a5af3d24f5baeaa2e))
34
70
  * improperly typed local create method ([48aa27c](https://github.com/payloadcms/payload/commit/48aa27ce701e44561edf442ee6c248b007ecafcb))
35
- * improves version config sanitization ([fc24485](https://github.com/payloadcms/payload/commit/fc24485455157f8d370c5af9fbf5d18450549983))
36
71
  * mobile styling to not found page ([d3f88a1](https://github.com/payloadcms/payload/commit/d3f88a1bd9aeb1551d64b9ed975da5e69e5821bd))
37
72
  * new slate version types ([c5de01b](https://github.com/payloadcms/payload/commit/c5de01bfc48ca6793c1526499fe934d9ad8f0cc9))
38
73
  * optimizes relationship input search querying ([7e69fcb](https://github.com/payloadcms/payload/commit/7e69fcbc7d89012a7caff6e0e9013a9ad8a62a14))
39
74
  * prevents None from appearing in hasMany relationship select options ([cbf43fa](https://github.com/payloadcms/payload/commit/cbf43fa0d8ba50b7a9ef952f1693de6923068ffd))
40
75
  * rare crash with link rte element ([f5535f6](https://github.com/payloadcms/payload/commit/f5535f613ac4d876d040be74b45e105e0f4775a8))
41
- * removes required from versions status field ([03c8445](https://github.com/payloadcms/payload/commit/03c8445a6d8d6ded719de44227dbbe928200427f))
42
76
  * rte upload field population ([8327b5a](https://github.com/payloadcms/payload/commit/8327b5aae505a189a5b9617c3485d646b5f8b517))
43
77
  * type error in useField ([ef4e6d3](https://github.com/payloadcms/payload/commit/ef4e6d32a90215c07aa2c1e7217cf53558bfae97))
44
- * uses replace instead of push to autocreate a doc ([a7ecada](https://github.com/payloadcms/payload/commit/a7ecadaa52500af287da6b21c8df2675dbe83b43))
45
- * version where input type ([a5c8ea4](https://github.com/payloadcms/payload/commit/a5c8ea4e2e3e02dbbdb3429d9130eb109cec3258))
46
78
 
47
79
 
48
80
  ### Features
49
81
 
82
+ * :tada: versions, drafts, & autosave!
50
83
  * [#458](https://github.com/payloadcms/payload/issues/458), provides field hooks with sibling data ([8e23a24](https://github.com/payloadcms/payload/commit/8e23a24f34ef7425bb4d43e96e869b255740c739))
51
- * abstracts revisions components for reuse in globals ([da5684d](https://github.com/payloadcms/payload/commit/da5684df27133b254eecd22fb3e0aad1910c382f))
52
84
  * add before and after login components ([#427](https://github.com/payloadcms/payload/issues/427)) ([5591eea](https://github.com/payloadcms/payload/commit/5591eeafca1aa6e8abcc2d8276f7478e00b75ef2))
53
- * add local api for versions on globals ([4072e7e](https://github.com/payloadcms/payload/commit/4072e7ee06bb1a4cc33d6dd2af024c8971157089))
54
85
  * add logMockCredentials email option ([ff33453](https://github.com/payloadcms/payload/commit/ff3345373630ca6913165284123a62269b3fa2c6))
86
+ * add pagination argument to optimize graphql relationships and use in local api ([#482](https://github.com/payloadcms/payload/issues/482)) ([647db51](https://github.com/payloadcms/payload/commit/647db5122e7b7be7f032d50ccf332780d8203369))
55
87
  * adds a way to customize express.static options ([dbb3c50](https://github.com/payloadcms/payload/commit/dbb3c502227597ef4d04c9e5c8db6d2f51a8aac4))
56
88
  * adds admin.upload.collections[collection-name].fields to the RTE to save specific data on upload elements ([3adf44a](https://github.com/payloadcms/payload/commit/3adf44a24162e5adbcebdb0ca7d0d460d23c57eb))
57
- * adds autosave to versions table ([14e5d09](https://github.com/payloadcms/payload/commit/14e5d0977f4be61ebecf6aa67926cbc18960e9c6))
58
- * adds base revision fields ([6ed11a5](https://github.com/payloadcms/payload/commit/6ed11a55636df7abee4c859593c88179139c68c6))
59
89
  * adds indentation controls to rich text ([7df50f9](https://github.com/payloadcms/payload/commit/7df50f9bf9d4867e65bdd8cebdf43e0ab1737a63))
60
- * adds most recently published comparison doc ([1e093e1](https://github.com/payloadcms/payload/commit/1e093e1eee511bbb04c5652bc7a854df7d544258))
61
90
  * adds originalDoc to field access control ([c979513](https://github.com/payloadcms/payload/commit/c9795133b376d8159457a0a38784d0b53a549061))
91
+ * adds path to GraphQL errors ([#457](https://github.com/payloadcms/payload/issues/457)) ([ad98b29](https://github.com/payloadcms/payload/commit/ad98b293983016db3c730112c9d2387de7bacb34))
62
92
  * adds recursion to richText field to populate relationship and upload nested fields ([42af22c](https://github.com/payloadcms/payload/commit/42af22c2a10de44555bfedf902e7b4a4c9b25d6b))
63
- * adds restore revisions to collections ([5eea398](https://github.com/payloadcms/payload/commit/5eea398e4340224db4792147fd3e3bcd4d44317f))
64
- * adds stepnav to revisions template ([a589877](https://github.com/payloadcms/payload/commit/a589877698ebe2fb2f8e7d0fd29c9dfe91237630))
93
+ * allow empty string radio and select option values ([#479](https://github.com/payloadcms/payload/issues/479)) ([f14e187](https://github.com/payloadcms/payload/commit/f14e187545b759ac4623189d5e31f25382728cc0))
65
94
  * allows access control to prevent reading of drafts ([c38470c](https://github.com/payloadcms/payload/commit/c38470c7b2119cec6ff9a3efc89f087a5999bb66))
66
95
  * allows global access control to return query constraints ([c0150ae](https://github.com/payloadcms/payload/commit/c0150ae8465777a2be1b6bc496a5be30cf478f42))
67
96
  * allows select input to receive new options ([#435](https://github.com/payloadcms/payload/issues/435)) ([500fb1c](https://github.com/payloadcms/payload/commit/500fb1c5c41a55d35c41173d50a976388fd0bd1b))
68
- * allows selection of revisions in certain locales to compare ([f572230](https://github.com/payloadcms/payload/commit/f57223024adff8629f155ac719720fab38f4df64))
69
- * attempts to render rich text diffs more appropriately ([7bd60b5](https://github.com/payloadcms/payload/commit/7bd60b5a3d3a9be94e97264b5c507c1c781858af))
70
- * builds a way for multipart/form-data reqs to retain non-string values ([65b0ad7](https://github.com/payloadcms/payload/commit/65b0ad7f084a9c279a1e4fb799542f97c645653d))
71
97
  * builds a way for multipart/form-data reqs to retain non-string values ([4efc2cf](https://github.com/payloadcms/payload/commit/4efc2cf71c8ec4c452fea0febfd1156b37868739))
72
- * builds autosave into existing update operation ([de48f44](https://github.com/payloadcms/payload/commit/de48f4417a799ba5d971b8fb0278e48bec95d753))
73
- * builds global publishVersion ([7397d63](https://github.com/payloadcms/payload/commit/7397d6307345a06e6758cd1d6ac718c9bf79693c))
74
- * builds group and iterable diffs ([bddaefd](https://github.com/payloadcms/payload/commit/bddaefdae7ba81d0e42da85d8772e83e850c3eab))
75
- * builds remainder of diff field types ([a479770](https://github.com/payloadcms/payload/commit/a47977084f219b9ddc4f0e27899e9b3a56d7448a))
76
- * builds revert to saved, unpublish ([160ab54](https://github.com/payloadcms/payload/commit/160ab54b85d51e40b334040bd1b9089feaa9e27e))
77
- * builds revisions list view ([1920a93](https://github.com/payloadcms/payload/commit/1920a937b2d669019312db96c29519eb0d0a150a))
78
- * builds revisions models ([0686126](https://github.com/payloadcms/payload/commit/06861261fe89a58ded6db3948c70ef451195c52f))
79
- * creates global revisions ([ec82b92](https://github.com/payloadcms/payload/commit/ec82b923f32aa06342f83c37185b13aa4458c295))
80
- * disables LeaveWithoutSaving if autosave enabled ([01d07bc](https://github.com/payloadcms/payload/commit/01d07bcb9a69ecef84d5d1c7095cd890fa1359be))
81
98
  * enhances rich text upload with custom field API ([0e4eb90](https://github.com/payloadcms/payload/commit/0e4eb906f2881dca518fea6b41e460bc57da9801))
82
99
  * ensures field hooks run on all locales when locale=all ([c3f743a](https://github.com/payloadcms/payload/commit/c3f743af03bbde856dcd87114383f0b484c0b20f))
83
- * ensures revisions are created and deleted accordingly ([8df767e](https://github.com/payloadcms/payload/commit/8df767e9a23c660be43a83b9ed0ad1bd59f0bcd0))
84
100
  * exposes data arg within create and update access control ([73f418b](https://github.com/payloadcms/payload/commit/73f418bb5cadf73f683fe04ee94e4d24c8cfe96f))
85
101
  * exposes FieldWithPath type for reuse ([df3a836](https://github.com/payloadcms/payload/commit/df3a83634fcb64724ef239600e3af4fc295fee4f))
86
102
  * exposes useLocale for reuse ([bef0206](https://github.com/payloadcms/payload/commit/bef02062e769d1b0279c51af748f06d41c924c8a))
87
- * finishes revision restore ([0e093bf](https://github.com/payloadcms/payload/commit/0e093bf15edc2952a4a3db28f2a9bdb3d723d667))
88
- * functional autosave ([e910d89](https://github.com/payloadcms/payload/commit/e910d8938fd3ad18483c7965c71775ac8ee6a887))
89
- * further revisions views ([740d6b1](https://github.com/payloadcms/payload/commit/740d6b15e5487e5c8bf27d3089ffd9c3e5d3645c))
90
- * GraphQL version collection resolvers ([7cfb2f7](https://github.com/payloadcms/payload/commit/7cfb2f7f02a46b3883dc0f6cb914d3ef09c16ffe))
91
- * implements versions in global ui ([eb4f957](https://github.com/payloadcms/payload/commit/eb4f9572b834ecce245633fe6a8cd07e39c8f1d4))
92
- * implements versions in globals, adds tests ([a59b14b](https://github.com/payloadcms/payload/commit/a59b14bd8c3114fe5dcd7917f7020e87d3155959))
93
- * improve code coverage for graphql versions ([26b13a8](https://github.com/payloadcms/payload/commit/26b13a81c35be473367b01a317e10b0c84e0b5ee))
94
103
  * improves adding rich text voids to RTE ([966c3c6](https://github.com/payloadcms/payload/commit/966c3c647198569ba06013481a3b6fa9042b058d))
95
104
  * improves relationship field performance ([13318ff](https://github.com/payloadcms/payload/commit/13318ff3608a6be3dc7b86cc4e97155b26ef9df6))
96
105
  * improves rich text link ([2e9a4c7](https://github.com/payloadcms/payload/commit/2e9a4c7d717e3a08b2982b8c49eb358baf23da17))
97
- * improves versions UI count and list view ([e81ba84](https://github.com/payloadcms/payload/commit/e81ba84ca7d9202a439b402df0060a4c33fdefb9))
98
106
  * indexes filenames ([07c8ac0](https://github.com/payloadcms/payload/commit/07c8ac08e21689cc6a3a2a546e58cf544fb61dec))
99
- * merges back in logic for non draft versions and draft versions ([ed8abd9](https://github.com/payloadcms/payload/commit/ed8abd94e6ebe429190e193aafec0da08c645752))
100
- * optimization of unpublish, revert to saved ([4e773c7](https://github.com/payloadcms/payload/commit/4e773c71520815529c186235232d7197e0cfd214))
101
- * progress to Autosave ([13add58](https://github.com/payloadcms/payload/commit/13add5885db1970c22d8407aa50d18274de106ed))
102
- * progress to draft types ([b59bb0b](https://github.com/payloadcms/payload/commit/b59bb0bbc26577dde1fd3f8527f7554c0214badb))
103
- * progress to drafts ([be1da85](https://github.com/payloadcms/payload/commit/be1da8507a04737422e778b7c2406de891c0792c))
104
- * progress to restore revision ([2e946a0](https://github.com/payloadcms/payload/commit/2e946a0aacfb8dacb9a07906e1630d612a6e0b8e))
105
- * progress to revision restore ([210488b](https://github.com/payloadcms/payload/commit/210488ba4ebfc98c22a618de9db499bbf0a59a79))
106
- * progress to saving drafts manually ([71c49bc](https://github.com/payloadcms/payload/commit/71c49bc5f27446eedb75b715a20b86ed4a79570c))
107
- * removes mongoose required ([4fbddee](https://github.com/payloadcms/payload/commit/4fbddeeb462f1e10e9a56b72ae1f20e27ebc38bc))
108
- * renames revisions to versions ([3a71afb](https://github.com/payloadcms/payload/commit/3a71afbd373eecd52668532cb8f5847b8f94a0fa))
109
- * renders diffs ([245e12e](https://github.com/payloadcms/payload/commit/245e12e8b6a3aeada1080bca22380ed1e6be0242))
110
- * reorders version creation ([cd0e172](https://github.com/payloadcms/payload/commit/cd0e17270801e39024fc8b46340185d21702ed70))
111
- * revision access control config ([ac53bac](https://github.com/payloadcms/payload/commit/ac53bac2f4605e20490aef94729c8911708c3bed))
112
- * rich text indent PoC ([2deed8b](https://github.com/payloadcms/payload/commit/2deed8b1464931c4bc76a288923b307cf04b6a4a))
113
- * scaffold of individual Revision view ([40f93e9](https://github.com/payloadcms/payload/commit/40f93e9d64e89b9d48c76c3c419e5267aa695d09))
114
- * scaffolds admin revisions ([7253710](https://github.com/payloadcms/payload/commit/72537106a3bb2383f9fbed35e1842f9f6962d95b))
115
- * scaffolds drafts / autosave config ([066b593](https://github.com/payloadcms/payload/commit/066b593d8fa6ae0472a6adb7f9440d466f69c6a2))
116
- * scaffolds new revisions operations and rest routes ([4a445f0](https://github.com/payloadcms/payload/commit/4a445f03e808197536cc26b150f1bc25c4d1bd01))
117
- * scaffolds revisions tests ([fbbe590](https://github.com/payloadcms/payload/commit/fbbe590ea27b387067b03b46874e0b907bdd91cd))
107
+ a79570c))
108
+ * rich text indentation ([2deed8b](https://github.com/payloadcms/payload/commit/2deed8b1464931c4bc76a288923b307cf04b6a4a))
118
109
  * serverURL is no longer required ([#437](https://github.com/payloadcms/payload/issues/437)) ([dca90c4](https://github.com/payloadcms/payload/commit/dca90c4aa92dd0cc2084ba16249254c9259622c3))
119
- * styles multiple collection actions ([0463982](https://github.com/payloadcms/payload/commit/0463982b5bd3f80d4d9eb819524b65ed52089396))
120
- * tests & autosave improvements ([7220ff7](https://github.com/payloadcms/payload/commit/7220ff7a8ad284ccb421430ffa2ea97aaa1a7682))
121
110
  * updates dependencies ([3ca3f53](https://github.com/payloadcms/payload/commit/3ca3f533d07b644fa8a3d077932860e9f12318c2))
122
- * uses debounce in autosave ([ee9cd24](https://github.com/payloadcms/payload/commit/ee9cd24e102f391ade37c6d41a62dfb95a168e54))
123
- * uses DocumentInfo to fetch and maintain doc versions ([8f30c3b](https://github.com/payloadcms/payload/commit/8f30c3bfefaa1530ac086aba22d4b8e6bac8f97d))
124
- * wires up restore ([189bc21](https://github.com/payloadcms/payload/commit/189bc21e48b82c638c6924cf4652082898e251b3))
125
- * working autosave ([c62707c](https://github.com/payloadcms/payload/commit/c62707cd515c0a21da1dc2cd5a9c69f396d4baa0))
126
- * working drafts ([b00517e](https://github.com/payloadcms/payload/commit/b00517ec20851c7ce09cc73002f61cd808350d6c))
127
111
 
128
- ## [0.14.30-beta.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.14.30-beta.0) (2022-03-07)
112
+ ## [0.14.31-beta.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.14.31-beta.0) (2022-03-10)
113
+
129
114
 
130
115
  ### Bug Fixes
131
116
 
@@ -149,6 +134,8 @@
149
134
  * rte upload field population ([8327b5a](https://github.com/payloadcms/payload/commit/8327b5aae505a189a5b9617c3485d646b5f8b517))
150
135
  * type error in useField ([ef4e6d3](https://github.com/payloadcms/payload/commit/ef4e6d32a90215c07aa2c1e7217cf53558bfae97))
151
136
  * [#464](https://github.com/payloadcms/payload/issues/464), graphql upload access control ([fd0629e](https://github.com/payloadcms/payload/commit/fd0629e93202dfaa399c753c59481b1cbd139bf6))
137
+ * ensures overrideAccess is false if undefined while populating ([97f3178](https://github.com/payloadcms/payload/commit/97f31780051828a9d506eba3520a1390acb99a96))
138
+
152
139
 
153
140
  ### Features
154
141
 
@@ -174,6 +161,8 @@
174
161
  * serverURL is no longer required ([#437](https://github.com/payloadcms/payload/issues/437)) ([dca90c4](https://github.com/payloadcms/payload/commit/dca90c4aa92dd0cc2084ba16249254c9259622c3))
175
162
  * updates dependencies ([3ca3f53](https://github.com/payloadcms/payload/commit/3ca3f533d07b644fa8a3d077932860e9f12318c2))
176
163
  * uses DocumentInfo to fetch and maintain doc versions ([8f30c3b](https://github.com/payloadcms/payload/commit/8f30c3bfefaa1530ac086aba22d4b8e6bac8f97d))
164
+ * exposes data arg within create and update access control ([73f418b](https://github.com/payloadcms/payload/commit/73f418bb5cadf73f683fe04ee94e4d24c8cfe96f))
165
+
177
166
  # [0.14.0](https://github.com/payloadcms/payload/compare/v0.13.6...v0.14.0) (2022-01-03)
178
167
 
179
168
 
@@ -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
+ });
@@ -147,7 +147,7 @@ const RichText = (props) => {
147
147
  return null;
148
148
  })),
149
149
  React.createElement("div", { className: `${baseClass}__editor`, ref: editorRef },
150
- React.createElement(Editable, { renderElement: renderElement, renderLeaf: renderLeaf, placeholder: placeholder, spellCheck: true, readOnly: readOnly, onBlur: onBlur, onKeyDown: (event) => {
150
+ React.createElement(Editable, { className: `${baseClass}__input`, renderElement: renderElement, renderLeaf: renderLeaf, placeholder: placeholder, spellCheck: true, readOnly: readOnly, onBlur: onBlur, onKeyDown: (event) => {
151
151
  if (event.key === 'Enter') {
152
152
  if (event.shiftKey) {
153
153
  event.preventDefault();
@@ -17,7 +17,6 @@
17
17
  }
18
18
 
19
19
  &__editor {
20
- min-height: base(10);
21
20
 
22
21
  [data-slate-node=element] {
23
22
  margin-bottom: base(0.25);
@@ -31,6 +30,10 @@
31
30
  }
32
31
  }
33
32
 
33
+ &__input {
34
+ min-height: base(10);
35
+ }
36
+
34
37
  &__wrap {
35
38
  width: 100%;
36
39
  position: relative;
@@ -4,7 +4,7 @@ import useField from '../../useField';
4
4
  import { select } from '../../../../../fields/validations';
5
5
  import SelectInput from './Input';
6
6
  const formatOptions = (options) => options.map((option) => {
7
- if (typeof option === 'object' && option.value) {
7
+ if (typeof option === 'object' && (option.value || option.value === '')) {
8
8
  return option;
9
9
  }
10
10
  return {
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const CustomProvider: React.FC<{
3
+ children: any;
4
+ }>;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { useConfig } from '@payloadcms/config-provider';
3
+ const NestProviders = ({ providers, children }) => {
4
+ const Component = providers[0];
5
+ if (providers.length > 1) {
6
+ return (React.createElement(Component, null,
7
+ React.createElement(NestProviders, { providers: providers.slice(1) }, children)));
8
+ }
9
+ return (React.createElement(Component, null, children));
10
+ };
11
+ export const CustomProvider = ({ children }) => {
12
+ const config = useConfig();
13
+ const { admin: { components: { providers, }, }, } = config;
14
+ if (Array.isArray(providers) && providers.length > 0) {
15
+ return (React.createElement(NestProviders, { providers: providers }, children));
16
+ }
17
+ return (React.createElement(React.Fragment, null, children));
18
+ };
@@ -10,6 +10,7 @@ import { ModalProvider, ModalContainer } from '@faceless-ui/modal';
10
10
  import { ToastContainer, Slide } from 'react-toastify';
11
11
  import { ConfigProvider, AuthProvider } from '@payloadcms/config-provider';
12
12
  import { PreferencesProvider } from './components/utilities/Preferences';
13
+ import { CustomProvider } from './components/utilities/CustomProvider';
13
14
  import { SearchParamsProvider } from './components/utilities/SearchParams';
14
15
  import { LocaleProvider } from './components/utilities/Locale';
15
16
  import Routes from './components/Routes';
@@ -31,7 +32,8 @@ const Index = () => (React.createElement(React.Fragment, null,
31
32
  React.createElement(SearchParamsProvider, null,
32
33
  React.createElement(LocaleProvider, null,
33
34
  React.createElement(StepNavProvider, null,
34
- React.createElement(Routes, null)))),
35
+ React.createElement(CustomProvider, null,
36
+ React.createElement(Routes, null))))),
35
37
  React.createElement(ModalContainer, null)))))))),
36
38
  React.createElement(ToastContainer, { position: "bottom-center", transition: Slide })));
37
39
  render(React.createElement(Index, null), document.getElementById('app'));
@@ -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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