Compare commits
133 Commits
plugin-nes
...
db-postgre
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08f372e6c2 | ||
|
|
2994269f22 | ||
|
|
8d1a706928 | ||
|
|
fcb29bb1c6 | ||
|
|
2c402cc65c | ||
|
|
ad38f76011 | ||
|
|
b974a2c042 | ||
|
|
cb8d562132 | ||
|
|
1f0036054a | ||
|
|
aaa4397351 | ||
|
|
6185f8a5d8 | ||
|
|
e47e544364 | ||
|
|
2e80350a5a | ||
|
|
4c4f924e90 | ||
|
|
170957c380 | ||
|
|
9061ae05e7 | ||
|
|
fe0028c899 | ||
|
|
ec1ad0b662 | ||
|
|
e5f32562a3 | ||
|
|
ba6100cbe8 | ||
|
|
c08c8b5628 | ||
|
|
9e918831d1 | ||
|
|
25c9a145be | ||
|
|
3b1d331316 | ||
|
|
5aa68b5e5d | ||
|
|
d8e9084db2 | ||
|
|
65690a675c | ||
|
|
9530d28a67 | ||
|
|
509ec677c4 | ||
|
|
a00439ea89 | ||
|
|
0055a8eb36 | ||
|
|
de5d6cc4bd | ||
|
|
51f84a4fcf | ||
|
|
c0ba6cc19a | ||
|
|
5fa99fb060 | ||
|
|
e3c3ddac34 | ||
|
|
6186493246 | ||
|
|
9b44296092 | ||
|
|
cbd03ed2f8 | ||
|
|
cf135fd1e4 | ||
|
|
e7608f5507 | ||
|
|
608d6d0a87 | ||
|
|
9bbacc4fb1 | ||
|
|
7df7bf448b | ||
|
|
44599cbc7b | ||
|
|
373787de31 | ||
|
|
c1c86009a5 | ||
|
|
6cf6ca3ea8 | ||
|
|
6706bdb140 | ||
|
|
5caaa032bb | ||
|
|
4cf8c5bd78 | ||
|
|
d6afee662b | ||
|
|
0fc62446b8 | ||
|
|
823fde07c3 | ||
|
|
fe35b7d32c | ||
|
|
3b45b0d085 | ||
|
|
742a7af93d | ||
|
|
a7e7c92768 | ||
|
|
e10d5df0b2 | ||
|
|
3023118b71 | ||
|
|
80375d1798 | ||
|
|
589b492b2e | ||
|
|
bdeef377ea | ||
|
|
b76c5c8c11 | ||
|
|
58c9fecbae | ||
|
|
e88de5db60 | ||
|
|
ce75fab4fc | ||
|
|
5b57f1411a | ||
|
|
11ff2042f3 | ||
|
|
8f9481f8a7 | ||
|
|
5de32b2534 | ||
|
|
dbcffc688f | ||
|
|
17cf179d16 | ||
|
|
1dc86aa6e6 | ||
|
|
d8e0824547 | ||
|
|
1453547e35 | ||
|
|
4c6874449a | ||
|
|
332c9b3a98 | ||
|
|
73544b5b5e | ||
|
|
e03302160a | ||
|
|
edb530fc64 | ||
|
|
064b4baed8 | ||
|
|
4cb8259b8b | ||
|
|
34b2451b3b | ||
|
|
29ccd06553 | ||
|
|
a5971c12b3 | ||
|
|
0900baf8f9 | ||
|
|
d1a9a3e4d5 | ||
|
|
d27a33dc1d | ||
|
|
d01c586a90 | ||
|
|
caa0d7cf0d | ||
|
|
c40b5a1784 | ||
|
|
b0869ea0ed | ||
|
|
00faebed4b | ||
|
|
638a35a2e7 | ||
|
|
44bca2ed36 | ||
|
|
fa90cec758 | ||
|
|
2164dcc594 | ||
|
|
a3ae416085 | ||
|
|
02d2c51717 | ||
|
|
b3503e3dce | ||
|
|
2e5400fa7a | ||
|
|
48dc116f57 | ||
|
|
9b2ba7cc0e | ||
|
|
916923071a | ||
|
|
3ceb6efd32 | ||
|
|
8184e0005a | ||
|
|
1c0d43c61a | ||
|
|
0eb7b44735 | ||
|
|
c038acb3a4 | ||
|
|
f8c2ccf6b1 | ||
|
|
e6092fd36c | ||
|
|
e0eae77758 | ||
|
|
0780ff22bb | ||
|
|
e7f6bfbe9d | ||
|
|
23df60dba5 | ||
|
|
8919b86571 | ||
|
|
8104fac5ed | ||
|
|
59ef1263a5 | ||
|
|
813e3dbc98 | ||
|
|
12a23092e1 | ||
|
|
4a49beb552 | ||
|
|
80530c666e | ||
|
|
f53e2df951 | ||
|
|
db58e2bab2 | ||
|
|
d88e97e123 | ||
|
|
bb72e506e6 | ||
|
|
b1f727fd6a | ||
|
|
72af18229b | ||
|
|
af52b526c8 | ||
|
|
60525623bf | ||
|
|
0fba582926 | ||
|
|
5d1cad3adb |
46
.github/CODEOWNERS
vendored
46
.github/CODEOWNERS
vendored
@@ -1,50 +1,32 @@
|
|||||||
# Order matters. The last matching pattern takes precedence.
|
# Order matters. The last matching pattern takes precedence.
|
||||||
|
|
||||||
### Catch-all ###
|
|
||||||
* @denolfe @jmikrut @DanRibbens
|
|
||||||
.* @denolfe @jmikrut @DanRibbens
|
|
||||||
|
|
||||||
### Core ###
|
### Core ###
|
||||||
/packages/payload/ @denolfe @jmikrut @DanRibbens
|
|
||||||
/packages/payload/src/uploads/ @denolfe
|
|
||||||
/packages/payload/src/admin/ @jmikrut @jacobsfletch @JarrodMFlesch
|
|
||||||
|
|
||||||
### Adapters ###
|
### Adapters ###
|
||||||
/packages/bundler-*/ @denolfe @jmikrut @DanRibbens @JarrodMFlesch
|
/packages/richtext-*/ @AlessioGr
|
||||||
/packages/db-*/ @denolfe @jmikrut @DanRibbens
|
|
||||||
/packages/richtext-*/ @denolfe @jmikrut @DanRibbens @AlessioGr
|
|
||||||
|
|
||||||
### Plugins ###
|
### Plugins ###
|
||||||
/packages/plugin-*/ @denolfe @jmikrut @DanRibbens @jacobsfletch @JarrodMFlesch @AlessioGr
|
|
||||||
/packages/plugin-cloud*/ @denolfe
|
/packages/plugin-cloud*/ @denolfe
|
||||||
/packages/plugin-form-builder/ @jacobsfletch
|
|
||||||
/packages/plugin-live-preview*/ @jacobsfletch
|
|
||||||
/packages/plugin-nested-docs/ @jacobsfletch
|
|
||||||
/packages/plugin-password-protection/ @jmikrut
|
|
||||||
/packages/plugin-redirects/ @jacobsfletch
|
|
||||||
/packages/plugin-search/ @jacobsfletch
|
|
||||||
/packages/plugin-sentry/ @JessChowdhury
|
|
||||||
/packages/plugin-seo/ @jacobsfletch
|
|
||||||
/packages/plugin-stripe/ @jacobsfletch
|
|
||||||
/packages/plugin-zapier/ @JarrodMFlesch
|
|
||||||
|
|
||||||
### Examples ###
|
|
||||||
/examples/ @jacobsfletch
|
|
||||||
/examples/testing/ @JarrodMFlesch
|
|
||||||
/examples/email/ @JessChowdhury
|
|
||||||
/examples/whitelabel/ @JessChowdhury
|
|
||||||
|
|
||||||
### Templates ###
|
### Templates ###
|
||||||
/templates/ @jacobsfletch
|
/templates/ @jacobsfletch @denolfe
|
||||||
/templates/blank/ @denolfe
|
|
||||||
|
|
||||||
### Misc ###
|
### Misc ###
|
||||||
/packages/create-payload-app/ @denolfe
|
/packages/create-payload-app/ @denolfe
|
||||||
/packages/eslint-config-payload/ @denolfe
|
/packages/eslint-*/ @denolfe
|
||||||
/packages/payload-admin-bar/ @jacobsfletch
|
|
||||||
|
### Build Files ###
|
||||||
|
/**/package.json @denolfe
|
||||||
|
|
||||||
|
/tsconfig.json @denolfe
|
||||||
|
/**/tsconfig*.json @denolfe
|
||||||
|
|
||||||
|
/jest.config.js @denolfe
|
||||||
|
/**/jest.config.js @denolfe
|
||||||
|
|
||||||
### Root ###
|
### Root ###
|
||||||
/package.json @denolfe
|
/package.json @denolfe
|
||||||
/scripts/ @denolfe
|
/scripts/ @denolfe
|
||||||
|
/.husky/ @denolfe
|
||||||
|
/.vscode/ @denolfe
|
||||||
/.github/ @denolfe
|
/.github/ @denolfe
|
||||||
/.github/CODEOWNERS @denolfe
|
|
||||||
|
|||||||
32
.github/workflows/main.yml
vendored
32
.github/workflows/main.yml
vendored
@@ -15,6 +15,10 @@ jobs:
|
|||||||
needs_build: ${{ steps.filter.outputs.needs_build }}
|
needs_build: ${{ steps.filter.outputs.needs_build }}
|
||||||
templates: ${{ steps.filter.outputs.templates }}
|
templates: ${{ steps.filter.outputs.templates }}
|
||||||
steps:
|
steps:
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 25
|
fetch-depth: 25
|
||||||
@@ -45,6 +49,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 25
|
fetch-depth: 25
|
||||||
|
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- name: Use Node.js 18
|
- name: Use Node.js 18
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -96,6 +104,10 @@ jobs:
|
|||||||
AWS_REGION: us-east-1
|
AWS_REGION: us-east-1
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- name: Use Node.js 18
|
- name: Use Node.js 18
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -177,6 +189,10 @@ jobs:
|
|||||||
part: [ 1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 8/8 ]
|
part: [ 1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 8/8 ]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- name: Use Node.js 18
|
- name: Use Node.js 18
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -214,6 +230,10 @@ jobs:
|
|||||||
needs: core-build
|
needs: core-build
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- name: Use Node.js 18
|
- name: Use Node.js 18
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -254,6 +274,10 @@ jobs:
|
|||||||
- live-preview-react
|
- live-preview-react
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- name: Use Node.js 18
|
- name: Use Node.js 18
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -291,6 +315,10 @@ jobs:
|
|||||||
- plugin-seo
|
- plugin-seo
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- name: Use Node.js 18
|
- name: Use Node.js 18
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -329,6 +357,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 25
|
fetch-depth: 25
|
||||||
|
|
||||||
|
# https://github.com/actions/virtual-environments/issues/1187
|
||||||
|
- name: tune linux network
|
||||||
|
run: sudo ethtool -K eth0 tx off rx off
|
||||||
|
|
||||||
- name: Use Node.js 18
|
- name: Use Node.js 18
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
|
|||||||
78
CHANGELOG.md
78
CHANGELOG.md
@@ -1,3 +1,81 @@
|
|||||||
|
## [2.13.0](https://github.com/payloadcms/payload/compare/v2.12.1...v2.13.0) (2024-04-19)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* allow configuration for setting headers on external file fetch ([ec1ad0b](https://github.com/payloadcms/payload/commit/ec1ad0b6628d400d7435821c8a72b6746bf87577))
|
||||||
|
* **db-\*:** custom db table and enum names ([#5045](https://github.com/payloadcms/payload/issues/5045)) ([9bbacc4](https://github.com/payloadcms/payload/commit/9bbacc4fb1ad247634f394e95c42ee3adade8048))
|
||||||
|
* json field schemas ([#5726](https://github.com/payloadcms/payload/issues/5726)) ([2c402cc](https://github.com/payloadcms/payload/commit/2c402cc65c9e8f7f33e2fb0ce5e1a8ceff52af1b))
|
||||||
|
* **plugin-seo:** add Chinese translation ([#5429](https://github.com/payloadcms/payload/issues/5429)) ([fcb29bb](https://github.com/payloadcms/payload/commit/fcb29bb1c637867301bbc1070b4a84383bf0e90a))
|
||||||
|
* **richtext-lexical:** add HorizontalRuleFeature ([d8e9084](https://github.com/payloadcms/payload/commit/d8e9084db21828968046ab59775633e409ce5c2a))
|
||||||
|
* **richtext-lexical:** improve floating handle y-positioning by positioning it in the center for smaller elements. ([0055a8e](https://github.com/payloadcms/payload/commit/0055a8eb36b95722cccdc5eb3101a79d3e764f8b))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* adds type error validations for `email` and `password` in login operation ([#4852](https://github.com/payloadcms/payload/issues/4852)) ([1f00360](https://github.com/payloadcms/payload/commit/1f0036054a9461535b0992f2449e91e4eaf97d4e))
|
||||||
|
* avoids getting and setting doc preferences when creating new ([#5757](https://github.com/payloadcms/payload/issues/5757)) ([e3c3dda](https://github.com/payloadcms/payload/commit/e3c3ddac34dff8fa085f5b702be2838d513be300))
|
||||||
|
* block field type missing dbName ([#5695](https://github.com/payloadcms/payload/issues/5695)) ([e7608f5](https://github.com/payloadcms/payload/commit/e7608f5507d3b85ea3f44b5cb1f43edf67608b1b))
|
||||||
|
* **db-mongodb:** failing `contains` query with special chars ([#5774](https://github.com/payloadcms/payload/issues/5774)) ([5fa99fb](https://github.com/payloadcms/payload/commit/5fa99fb060cabbb69b5d6688748260e562e6bea3))
|
||||||
|
* **db-mongodb:** ignore end session errors ([#5904](https://github.com/payloadcms/payload/issues/5904)) ([cb8d562](https://github.com/payloadcms/payload/commit/cb8d562132bee437798880e1d7f64dbfdee36949))
|
||||||
|
* **db-mongodb:** version fields indexSortableFields ([#5863](https://github.com/payloadcms/payload/issues/5863)) ([fe0028c](https://github.com/payloadcms/payload/commit/fe0028c89945303a431b48efdae7b6e22304c8a3))
|
||||||
|
* **db-postgres:** hasMany relationship query contains operator ([#4212](https://github.com/payloadcms/payload/issues/4212)) ([608d6d0](https://github.com/payloadcms/payload/commit/608d6d0a872af224ea42c3e6c8a3b4f21678f550))
|
||||||
|
* **db-postgres:** issue querying by localised relationship not respecting locale as constraint ([#5666](https://github.com/payloadcms/payload/issues/5666)) ([44599cb](https://github.com/payloadcms/payload/commit/44599cbc7b8f23d6d8c7a3e05466237406812a6d))
|
||||||
|
* **db-postgres:** query hasMany fields with in ([#5881](https://github.com/payloadcms/payload/issues/5881)) ([6185f8a](https://github.com/payloadcms/payload/commit/6185f8a5d845d12651f5a3ee128eb43d3b9d2449))
|
||||||
|
* **db-postgres:** relationship query pagination ([#5802](https://github.com/payloadcms/payload/issues/5802)) ([65690a6](https://github.com/payloadcms/payload/commit/65690a675c17cfacebe775a327a57741ac09416a))
|
||||||
|
* **db-postgres:** validateExistingBlockIsIdentical localized ([#5839](https://github.com/payloadcms/payload/issues/5839)) ([4c4f924](https://github.com/payloadcms/payload/commit/4c4f924e90ee23a73c9a7cc7e69bbc2caf902b92))
|
||||||
|
* duplicate document multiple times in quick succession ([#5642](https://github.com/payloadcms/payload/issues/5642)) ([373787d](https://github.com/payloadcms/payload/commit/373787de31cbbd33b587aa4be6344948f082f5bb))
|
||||||
|
* missing date locales ([#5656](https://github.com/payloadcms/payload/issues/5656)) ([c1c8600](https://github.com/payloadcms/payload/commit/c1c86009a5e9aad401a05f7c63ad37bd3f88dc84))
|
||||||
|
* number ids were not sanitized to number in rest api ([51f84a4](https://github.com/payloadcms/payload/commit/51f84a4fcfd437eb73c7d83205b66e3620085909))
|
||||||
|
* passes parent id instead of incoming id to saveVersion ([#5831](https://github.com/payloadcms/payload/issues/5831)) ([25c9a14](https://github.com/payloadcms/payload/commit/25c9a145bec9e9566d2bbcba59d5b34394e10bbd))
|
||||||
|
* **plugin-seo:** uses correct key for ukrainian translation ([#5873](https://github.com/payloadcms/payload/issues/5873)) ([e47e544](https://github.com/payloadcms/payload/commit/e47e544364031ac834565a4d86ef6ec9c04e63c0))
|
||||||
|
* properly handle drafts in bulk update ([#5872](https://github.com/payloadcms/payload/issues/5872)) ([ad38f76](https://github.com/payloadcms/payload/commit/ad38f760111abf947c6b0ee4b983ee1224a9bf1b))
|
||||||
|
* req.collection being lost when querying a global inside a collection ([#5727](https://github.com/payloadcms/payload/issues/5727)) ([cbd03ed](https://github.com/payloadcms/payload/commit/cbd03ed2f8819ee8ac20e8739cc03e88ff4caa25))
|
||||||
|
* **richtext-lexical:** catch errors that may occur during HTML generation ([#5754](https://github.com/payloadcms/payload/issues/5754)) ([9b44296](https://github.com/payloadcms/payload/commit/9b442960929d00faa07f1383b1267f71e6f44efe))
|
||||||
|
* **richtext-lexical:** do not allow omitting editor prop for sub-richtext fields within lexical defined in the payload config ([#5766](https://github.com/payloadcms/payload/issues/5766)) ([6186493](https://github.com/payloadcms/payload/commit/6186493246157b4d4b33c8c47378f08581315942))
|
||||||
|
* **richtext-lexical:** incorrect floating handle y-position calculation next to certain kinds of HTML elements like HR ([de5d6cc](https://github.com/payloadcms/payload/commit/de5d6cc4bd591745156f0b8c56795b7bd2eaad7e))
|
||||||
|
* **richtext-lexical:** limit unnecessary floating handle positioning updates ([a00439e](https://github.com/payloadcms/payload/commit/a00439ea893e074d64be83ee6af1e780178a7ee3))
|
||||||
|
* **richtext-lexical:** pass through config for schema generation. Makes it more robust ([#5700](https://github.com/payloadcms/payload/issues/5700)) ([cf135fd](https://github.com/payloadcms/payload/commit/cf135fd1e4aeb30121281399e26be901393ada6d))
|
||||||
|
* **richtext-lexical:** use correct nodeType on HorizontalRule feature HTML converter ([#5805](https://github.com/payloadcms/payload/issues/5805)) ([3b1d331](https://github.com/payloadcms/payload/commit/3b1d3313165499616673f6d363c90ef884994525))
|
||||||
|
* updates type name of `CustomPublishButtonProps` to `CustomPublishButtonType` ([#5644](https://github.com/payloadcms/payload/issues/5644)) ([7df7bf4](https://github.com/payloadcms/payload/commit/7df7bf448bd26e870a1fde8aaa47430904d68366))
|
||||||
|
* updates var ([9530d28](https://github.com/payloadcms/payload/commit/9530d28a6760a667b718027a49ea43ba1accd546))
|
||||||
|
* use isolateObjectProperty function in createLocalReq ([#5748](https://github.com/payloadcms/payload/issues/5748)) ([c0ba6cc](https://github.com/payloadcms/payload/commit/c0ba6cc19a20c043a08ca77caacd47ef7cfb48f4))
|
||||||
|
* uses find instead of fieldIndex for custom ID check ([509ec67](https://github.com/payloadcms/payload/commit/509ec677c42993d9c08facf6928a5ef1e9767508))
|
||||||
|
|
||||||
|
### ⚠ BREAKING CHANGES
|
||||||
|
|
||||||
|
* **richtext-lexical:** do not allow omitting editor prop for sub-richtext fields within lexical defined in the payload config ([#5766](https://github.com/payloadcms/payload/issues/5766))
|
||||||
|
|
||||||
|
## [2.12.1](https://github.com/payloadcms/payload/compare/v2.12.0...v2.12.1) (2024-04-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Skip parsing if operator is 'exist' ([#5404](https://github.com/payloadcms/payload/issues/5404)) ([742a7af](https://github.com/payloadcms/payload/commit/742a7af93d2e9ef4d41ee093cef875322792ae72))
|
||||||
|
* updates colors of tooltip in light mode ([#5632](https://github.com/payloadcms/payload/issues/5632)) ([a7e7c92](https://github.com/payloadcms/payload/commit/a7e7c9276835e0a35a18daccb218c901ca2fdd8c))
|
||||||
|
|
||||||
|
## [2.12.0](https://github.com/payloadcms/payload/compare/v2.11.2...v2.12.0) (2024-04-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **plugin-seo:** adds Norwegian translation ([#5621](https://github.com/payloadcms/payload/issues/5621)) ([589b492](https://github.com/payloadcms/payload/commit/589b492b2e6bc578e6f17649ff6d936ffd88b8b5))
|
||||||
|
* **richtext-*:** add ability to provide custom Field and Error components ([#5574](https://github.com/payloadcms/payload/issues/5574)) ([02d2c51](https://github.com/payloadcms/payload/commit/02d2c517176a775c6eeb4b164d9e6b45d8f5e4c1))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **db-postgres:** error on delete having joins ([#5459](https://github.com/payloadcms/payload/issues/5459)) ([9169230](https://github.com/payloadcms/payload/commit/916923071a2c28077326bfd2059d1665ef47e94f))
|
||||||
|
* image resize tiff files ([#5415](https://github.com/payloadcms/payload/issues/5415)) ([8184e00](https://github.com/payloadcms/payload/commit/8184e0005af1b6da93d0921c31547515a4ce6343))
|
||||||
|
* number field with hasMany accept defaultValue array ([#5618](https://github.com/payloadcms/payload/issues/5618)) ([a3ae416](https://github.com/payloadcms/payload/commit/a3ae4160850290c194bb228e1fbeb8c7533cead3))
|
||||||
|
* regression of filterOptions using different transaction ([#5169](https://github.com/payloadcms/payload/issues/5169)) ([3ceb6ef](https://github.com/payloadcms/payload/commit/3ceb6efd32cfa9556c6656469fa43d61d7679b1d))
|
||||||
|
* **richtext-lexical:** Blocks: generated output schema is not fully correct ([#5259](https://github.com/payloadcms/payload/issues/5259)) ([e7f6bfb](https://github.com/payloadcms/payload/commit/e7f6bfbe9da4cab42c7ec7019371d5e79af17ec9))
|
||||||
|
* **richtext-lexical:** checklist html converter incorrectly outputting children ([#5570](https://github.com/payloadcms/payload/issues/5570)) ([2e5400f](https://github.com/payloadcms/payload/commit/2e5400fa7a5ac7441e00134a7f4299022228f64f))
|
||||||
|
* **richtext-lexical:** disable instanceof HTMLImageElement check as it causes issues when used on the server ([2164dcc](https://github.com/payloadcms/payload/commit/2164dcc594b5c16d7111b71cdb01f5f7aaa7e127))
|
||||||
|
* **richtext-lexical:** Link: add open-in-new-tab to html converter ([23df60d](https://github.com/payloadcms/payload/commit/23df60dba5682255ce6f60e3ee8e6901f6a70c7b))
|
||||||
|
* **richtext-lexical:** properly center add- and drag-block handles ([#5568](https://github.com/payloadcms/payload/issues/5568)) ([48dc116](https://github.com/payloadcms/payload/commit/48dc116f57113c3124ff93a50fa1189053e21d76))
|
||||||
|
* sets beforeValidateHook req type to required ([#5608](https://github.com/payloadcms/payload/issues/5608)) ([e10d5df](https://github.com/payloadcms/payload/commit/e10d5df0b2dd21b86cce44d0e36b31e9d3411b39))
|
||||||
|
|
||||||
## [2.11.2](https://github.com/payloadcms/payload/compare/v2.11.1...v2.11.2) (2024-02-23)
|
## [2.11.2](https://github.com/payloadcms/payload/compare/v2.11.1...v2.11.2) (2024-02-23)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ import * as React from 'react'
|
|||||||
import {
|
import {
|
||||||
CustomSaveButtonProps,
|
CustomSaveButtonProps,
|
||||||
CustomSaveDraftButtonProps,
|
CustomSaveDraftButtonProps,
|
||||||
CustomPublishButtonProps,
|
CustomPublishButtonType,
|
||||||
CustomPreviewButtonProps,
|
CustomPreviewButtonProps,
|
||||||
} from 'payload/types'
|
} from 'payload/types'
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@ export const CustomSaveDraftButton: CustomSaveDraftButtonProps = ({
|
|||||||
return <DefaultButton label={label} disabled={disabled} saveDraft={saveDraft} />
|
return <DefaultButton label={label} disabled={disabled} saveDraft={saveDraft} />
|
||||||
}
|
}
|
||||||
|
|
||||||
export const CustomPublishButton: CustomPublishButtonProps = ({
|
export const CustomPublishButton: CustomPublishButtonType = ({
|
||||||
DefaultButton,
|
DefaultButton,
|
||||||
disabled,
|
disabled,
|
||||||
label,
|
label,
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ It's often best practice to write your Collections in separate files and then im
|
|||||||
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
||||||
| **`defaultSort`** | Pass a top-level field to sort by default in the collection List view. Prefix the name of the field with a minus symbol ("-") to sort in descending order. |
|
| **`defaultSort`** | Pass a top-level field to sort by default in the collection List view. Prefix the name of the field with a minus symbol ("-") to sort in descending order. |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`dbName`** | Custom table or collection name depending on the database adapter. Auto-generated from slug if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
@@ -59,7 +60,8 @@ export const Orders: CollectionConfig = {
|
|||||||
#### More collection config examples
|
#### More collection config examples
|
||||||
|
|
||||||
You can find an assortment
|
You can find an assortment
|
||||||
of [example collection configs](https://github.com/payloadcms/public-demo/tree/master/src/payload/collections) in the Public
|
of [example collection configs](https://github.com/payloadcms/public-demo/tree/master/src/payload/collections) in the
|
||||||
|
Public
|
||||||
Demo source code on GitHub.
|
Demo source code on GitHub.
|
||||||
|
|
||||||
### Admin options
|
### Admin options
|
||||||
|
|||||||
@@ -6,14 +6,18 @@ desc: Set up your Global config for your needs by defining fields, adding slugs
|
|||||||
keywords: globals, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express
|
keywords: globals, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express
|
||||||
---
|
---
|
||||||
|
|
||||||
Global configs are in many ways similar to [Collections](/docs/configuration/collections). The big difference is that Collections will potentially contain _many_ documents, while a Global is a "one-off". Globals are perfect for things like header nav, site-wide banner alerts, app-wide localized strings, and other "global" data that your site or app might rely on.
|
Global configs are in many ways similar to [Collections](/docs/configuration/collections). The big difference is that
|
||||||
|
Collections will potentially contain _many_ documents, while a Global is a "one-off". Globals are perfect for things
|
||||||
|
like header nav, site-wide banner alerts, app-wide localized strings, and other "global" data that your site or app
|
||||||
|
might rely on.
|
||||||
|
|
||||||
As with Collection configs, it's often best practice to write your Globals in separate files and then import them into the main Payload config.
|
As with Collection configs, it's often best practice to write your Globals in separate files and then import them into
|
||||||
|
the main Payload config.
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| **`slug`** \* | Unique, URL-friendly string that will act as an identifier for this Global. |
|
| **`slug`** \* | Unique, URL-friendly string that will act as an identifier for this Global. |
|
||||||
| **`fields`** \* | Array of field types that will determine the structure and functionality of the data stored within this Global. [Click here](/docs/fields/overview) for a full list of field types as well as how to configure them. |
|
| **`fields`** \* | Array of field types that will determine the structure and functionality of the data stored within this Global. [Click here](/docs/fields/overview) for a full list of field types as well as how to configure them. |
|
||||||
| **`label`** | Text for the name in the Admin panel or an object with keys for each language. Auto-generated from slug if not defined. |
|
| **`label`** | Text for the name in the Admin panel or an object with keys for each language. Auto-generated from slug if not defined. |
|
||||||
@@ -26,6 +30,7 @@ As with Collection configs, it's often best practice to write your Globals in se
|
|||||||
| **`graphQL.name`** | Text used in schema generation. Auto-generated from slug if not defined. |
|
| **`graphQL.name`** | Text used in schema generation. Auto-generated from slug if not defined. |
|
||||||
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
| **`typescript`** | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`dbName`** | Custom table or collection name for this global depending on the database adapter. Auto-generated from slug if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
@@ -59,14 +64,16 @@ export default Nav
|
|||||||
|
|
||||||
#### Global config example
|
#### Global config example
|
||||||
|
|
||||||
You can find a few [example Global configs](https://github.com/payloadcms/public-demo/tree/master/src/payload/globals) in the Public Demo source code on GitHub.
|
You can find a few [example Global configs](https://github.com/payloadcms/public-demo/tree/master/src/payload/globals)
|
||||||
|
in the Public Demo source code on GitHub.
|
||||||
|
|
||||||
### Admin options
|
### Admin options
|
||||||
|
|
||||||
You can customize the way that the Admin panel behaves on a Global-by-Global basis by defining the `admin` property on a Global's config.
|
You can customize the way that the Admin panel behaves on a Global-by-Global basis by defining the `admin` property on a
|
||||||
|
Global's config.
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|---------------|-----------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `group` | Text used as a label for grouping collection and global links together in the navigation. |
|
| `group` | Text used as a label for grouping collection and global links together in the navigation. |
|
||||||
| `hidden` | Set to true or a function, called with the current user, returning true to exclude this global from navigation and admin routing. |
|
| `hidden` | Set to true or a function, called with the current user, returning true to exclude this global from navigation and admin routing. |
|
||||||
| `components` | Swap in your own React components to be used within this Global. [More](/docs/admin/components#globals) |
|
| `components` | Swap in your own React components to be used within this Global. [More](/docs/admin/components#globals) |
|
||||||
@@ -76,9 +83,11 @@ You can customize the way that the Admin panel behaves on a Global-by-Global bas
|
|||||||
|
|
||||||
### Preview
|
### Preview
|
||||||
|
|
||||||
Global `admin` options can accept a `preview` function that will be used to generate a link pointing to the frontend of your app to preview data.
|
Global `admin` options can accept a `preview` function that will be used to generate a link pointing to the frontend of
|
||||||
|
your app to preview data.
|
||||||
|
|
||||||
If the function is specified, a Preview button will automatically appear in the corresponding global's Edit view. Clicking the Preview button will link to the URL that is generated by the function.
|
If the function is specified, a Preview button will automatically appear in the corresponding global's Edit view.
|
||||||
|
Clicking the Preview button will link to the URL that is generated by the function.
|
||||||
|
|
||||||
**The preview function accepts two arguments:**
|
**The preview function accepts two arguments:**
|
||||||
|
|
||||||
@@ -113,15 +122,20 @@ export const MyGlobal: GlobalConfig = {
|
|||||||
|
|
||||||
### Access control
|
### Access control
|
||||||
|
|
||||||
As with Collections, you can specify extremely granular access control (what users can do with this Global) on a Global-by-Global basis. However, Globals only have `update` and `read` access control due to their nature of only having one document. To learn more, go to the [Access Control](/docs/access-control/overview) docs.
|
As with Collections, you can specify extremely granular access control (what users can do with this Global) on a
|
||||||
|
Global-by-Global basis. However, Globals only have `update` and `read` access control due to their nature of only having
|
||||||
|
one document. To learn more, go to the [Access Control](/docs/access-control/overview) docs.
|
||||||
|
|
||||||
### Hooks
|
### Hooks
|
||||||
|
|
||||||
Globals also fully support a smaller subset of Hooks. To learn more, go to the [Hooks](/docs/hooks/overview) documentation.
|
Globals also fully support a smaller subset of Hooks. To learn more, go to the [Hooks](/docs/hooks/overview)
|
||||||
|
documentation.
|
||||||
|
|
||||||
### Field types
|
### Field types
|
||||||
|
|
||||||
Globals support all field types that Payload has to offer—including simple fields like text and checkboxes all the way to more complicated layout-building field groups like Blocks. [Click here](/docs/fields/overview) to learn more about field types.
|
Globals support all field types that Payload has to offer—including simple fields like text and checkboxes all the way
|
||||||
|
to more complicated layout-building field groups like Blocks. [Click here](/docs/fields/overview) to learn more about
|
||||||
|
field types.
|
||||||
|
|
||||||
### TypeScript
|
### TypeScript
|
||||||
|
|
||||||
|
|||||||
@@ -38,11 +38,17 @@ export default buildConfig({
|
|||||||
### Options
|
### Options
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `pool` | [Pool connection options](https://orm.drizzle.team/docs/quick-postgresql/node-postgres) that will be passed to Drizzle and `node-postgres`. |
|
| `pool` \* | [Pool connection options](https://orm.drizzle.team/docs/quick-postgresql/node-postgres) that will be passed to Drizzle and `node-postgres`. |
|
||||||
| `push` | Disable Drizzle's [`db push`](https://orm.drizzle.team/kit-docs/overview#prototyping-with-db-push) in development mode. By default, `push` is enabled for development mode only. |
|
| `push` | Disable Drizzle's [`db push`](https://orm.drizzle.team/kit-docs/overview#prototyping-with-db-push) in development mode. By default, `push` is enabled for development mode only. |
|
||||||
| `migrationDir` | Customize the directory that migrations are stored. |
|
| `migrationDir` | Customize the directory that migrations are stored. |
|
||||||
|
| `logger` | The instance of the logger to be passed to drizzle. By default Payload's will be used. |
|
||||||
| `schemaName` | A string for the postgres schema to use, defaults to 'public'. |
|
| `schemaName` | A string for the postgres schema to use, defaults to 'public'. |
|
||||||
|
| `localesSuffix` | A string appended to the end of table names for storing localized fields. Default is '_locales'. |
|
||||||
|
| `relationshipsSuffix` | A string appended to the end of table names for storing relationships. Default is '_rels'. |
|
||||||
|
| `versionsSuffix` | A string appended to the end of table names for storing versions. Defaults to '_v'. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Access to Drizzle
|
### Access to Drizzle
|
||||||
|
|
||||||
|
|||||||
@@ -21,13 +21,15 @@ keywords: array, fields, config, configuration, documentation, Content Managemen
|
|||||||
**Example uses:**
|
**Example uses:**
|
||||||
|
|
||||||
- A "slider" with an image ([upload field](/docs/fields/upload)) and a caption ([text field](/docs/fields/text))
|
- A "slider" with an image ([upload field](/docs/fields/upload)) and a caption ([text field](/docs/fields/text))
|
||||||
- Navigational structures where editors can specify nav items containing pages ([relationship field](/docs/fields/relationship)), an "open in new tab" [checkbox field](/docs/fields/checkbox)
|
- Navigational structures where editors can specify nav items containing
|
||||||
- Event agenda "timeslots" where you need to specify start & end time ([date field](/docs/fields/date)), label ([text field](/docs/fields/text)), and Learn More page [relationship](/docs/fields/relationship)
|
pages ([relationship field](/docs/fields/relationship)), an "open in new tab" [checkbox field](/docs/fields/checkbox)
|
||||||
|
- Event agenda "timeslots" where you need to specify start & end time ([date field](/docs/fields/date)),
|
||||||
|
label ([text field](/docs/fields/text)), and Learn More page [relationship](/docs/fields/relationship)
|
||||||
|
|
||||||
### Config
|
### Config
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| **`name`** \* | To be used as the property name when stored and retrieved from the database. [More](/docs/fields/overview#field-names) |
|
| **`name`** \* | To be used as the property name when stored and retrieved from the database. [More](/docs/fields/overview#field-names) |
|
||||||
| **`label`** | Text used as the heading in the Admin panel or an object with keys for each language. Auto-generated from name if not defined. |
|
| **`label`** | Text used as the heading in the Admin panel or an object with keys for each language. Auto-generated from name if not defined. |
|
||||||
| **`fields`** \* | Array of field types to correspond to each row of the Array. |
|
| **`fields`** \* | Array of field types to correspond to each row of the Array. |
|
||||||
@@ -45,15 +47,17 @@ keywords: array, fields, config, configuration, documentation, Content Managemen
|
|||||||
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
||||||
|
| **`dbName`** | Custom table name for the field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined. |
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
### Admin Config
|
### Admin Config
|
||||||
|
|
||||||
In addition to the default [field admin config](/docs/fields/overview#admin-config), you can adjust the following properties:
|
In addition to the default [field admin config](/docs/fields/overview#admin-config), you can adjust the following
|
||||||
|
properties:
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ------------------------- | -------------------------------------------------------------------------------------------------------------------- |
|
|---------------------------|----------------------------------------------------------------------------------------------------------------------|
|
||||||
| **`initCollapsed`** | Set the initial collapsed state |
|
| **`initCollapsed`** | Set the initial collapsed state |
|
||||||
| **`components.RowLabel`** | Function or React component to be rendered as the label on the array row. Receives `({ data, index, path })` as args |
|
| **`components.RowLabel`** | Function or React component to be rendered as the label on the array row. Receives `({ data, index, path })` as args |
|
||||||
|
|
||||||
|
|||||||
@@ -22,14 +22,15 @@ keywords: blocks, fields, config, configuration, documentation, Content Manageme
|
|||||||
|
|
||||||
**Example uses:**
|
**Example uses:**
|
||||||
|
|
||||||
- A layout builder tool that grants editors to design highly customizable page or post layouts. Blocks could include configs such as `Quote`, `CallToAction`, `Slider`, `Content`, `Gallery`, or others.
|
- A layout builder tool that grants editors to design highly customizable page or post layouts. Blocks could include
|
||||||
|
configs such as `Quote`, `CallToAction`, `Slider`, `Content`, `Gallery`, or others.
|
||||||
- A form builder tool where available block configs might be `Text`, `Select`, or `Checkbox`.
|
- A form builder tool where available block configs might be `Text`, `Select`, or `Checkbox`.
|
||||||
- Virtual event agenda "timeslots" where a timeslot could either be a `Break`, a `Presentation`, or a `BreakoutSession`.
|
- Virtual event agenda "timeslots" where a timeslot could either be a `Break`, a `Presentation`, or a `BreakoutSession`.
|
||||||
|
|
||||||
### Field config
|
### Field config
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| **`name`** \* | To be used as the property name when stored and retrieved from the database. [More](/docs/fields/overview#field-names) |
|
| **`name`** \* | To be used as the property name when stored and retrieved from the database. [More](/docs/fields/overview#field-names) |
|
||||||
| **`label`** | Text used as the heading in the Admin panel or an object with keys for each language. Auto-generated from name if not defined. |
|
| **`label`** | Text used as the heading in the Admin panel or an object with keys for each language. Auto-generated from name if not defined. |
|
||||||
| **`blocks`** \* | Array of [block configs](/docs/fields/blocks#block-configs) to be made available to this field. |
|
| **`blocks`** \* | Array of [block configs](/docs/fields/blocks#block-configs) to be made available to this field. |
|
||||||
@@ -51,10 +52,11 @@ _\* An asterisk denotes that a property is required._
|
|||||||
|
|
||||||
### Admin Config
|
### Admin Config
|
||||||
|
|
||||||
In addition to the default [field admin config](/docs/fields/overview#admin-config), you can adjust the following properties:
|
In addition to the default [field admin config](/docs/fields/overview#admin-config), you can adjust the following
|
||||||
|
properties:
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ------------------- | ------------------------------- |
|
|---------------------|---------------------------------|
|
||||||
| **`initCollapsed`** | Set the initial collapsed state |
|
| **`initCollapsed`** | Set the initial collapsed state |
|
||||||
|
|
||||||
### Block configs
|
### Block configs
|
||||||
@@ -72,7 +74,7 @@ Blocks are defined as separate configs of their own.
|
|||||||
</Banner>
|
</Banner>
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| **`slug`** \* | Identifier for this block type. Will be saved on each block as the `blockType` property. |
|
| **`slug`** \* | Identifier for this block type. Will be saved on each block as the `blockType` property. |
|
||||||
| **`fields`** \* | Array of fields to be stored in this block. |
|
| **`fields`** \* | Array of fields to be stored in this block. |
|
||||||
| **`labels`** | Customize the block labels that appear in the Admin dashboard. Auto-generated from slug if not defined. |
|
| **`labels`** | Customize the block labels that appear in the Admin dashboard. Auto-generated from slug if not defined. |
|
||||||
@@ -80,6 +82,7 @@ Blocks are defined as separate configs of their own.
|
|||||||
| **`imageAltText`** | Customize this block's image thumbnail alt text. |
|
| **`imageAltText`** | Customize this block's image thumbnail alt text. |
|
||||||
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
| **`interfaceName`** | Create a top level, reusable [Typescript interface](/docs/typescript/generating-types#custom-field-interfaces) & [GraphQL type](/docs/graphql/graphql-schema#custom-field-schemas). |
|
||||||
| **`graphQL.singularName`** | Text to use for the GraphQL schema name. Auto-generated from slug if not defined. NOTE: this is set for deprecation, prefer `interfaceName`. |
|
| **`graphQL.singularName`** | Text to use for the GraphQL schema name. Auto-generated from slug if not defined. NOTE: this is set for deprecation, prefer `interfaceName`. |
|
||||||
|
| **`dbName`** | Custom table name for this block type when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from slug if not defined.
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
|
||||||
#### Auto-generated data per block
|
#### Auto-generated data per block
|
||||||
@@ -92,7 +95,8 @@ The `blockType` is saved as the slug of the block that has been selected.
|
|||||||
|
|
||||||
**`blockName`**
|
**`blockName`**
|
||||||
|
|
||||||
The Admin panel provides each block with a `blockName` field which optionally allows editors to label their blocks for better editability and readability.
|
The Admin panel provides each block with a `blockName` field which optionally allows editors to label their blocks for
|
||||||
|
better editability and readability.
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
@@ -139,7 +143,8 @@ export const ExampleCollection: CollectionConfig = {
|
|||||||
|
|
||||||
### TypeScript
|
### TypeScript
|
||||||
|
|
||||||
As you build your own Block configs, you might want to store them in separate files but retain typing accordingly. To do so, you can import and use Payload's `Block` type:
|
As you build your own Block configs, you might want to store them in separate files but retain typing accordingly. To do
|
||||||
|
so, you can import and use Payload's `Block` type:
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import type { Block } from 'payload/types'
|
import type { Block } from 'payload/types'
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ label: JSON
|
|||||||
order: 50
|
order: 50
|
||||||
desc: The JSON field type will store any string in the Database. Learn how to use JSON fields, see examples and options.
|
desc: The JSON field type will store any string in the Database. Learn how to use JSON fields, see examples and options.
|
||||||
|
|
||||||
keywords: json, fields, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express
|
keywords: json, jsonSchema, schema, validation, fields, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express
|
||||||
---
|
---
|
||||||
|
|
||||||
<Banner>
|
<Banner>
|
||||||
@@ -30,6 +30,7 @@ This field uses the `monaco-react` editor syntax highlighting.
|
|||||||
| **`unique`** | Enforce that each entry in the Collection has a unique value for this field. |
|
| **`unique`** | Enforce that each entry in the Collection has a unique value for this field. |
|
||||||
| **`index`** | Build an [index](/docs/database/overview) for this field to produce faster queries. Set this field to `true` if your users will perform queries on this field's data often. |
|
| **`index`** | Build an [index](/docs/database/overview) for this field to produce faster queries. Set this field to `true` if your users will perform queries on this field's data often. |
|
||||||
| **`validate`** | Provide a custom validation function that will be executed on both the Admin panel and the backend. [More](/docs/fields/overview#validation) |
|
| **`validate`** | Provide a custom validation function that will be executed on both the Admin panel and the backend. [More](/docs/fields/overview#validation) |
|
||||||
|
| **`jsonSchema`** | Provide a JSON schema that will be used for validation. [JSON schemas](https://json-schema.org/learn/getting-started-step-by-step) |
|
||||||
| **`saveToJWT`** | If this field is top-level and nested in a config supporting [Authentication](/docs/authentication/config), include its data in the user JWT. |
|
| **`saveToJWT`** | If this field is top-level and nested in a config supporting [Authentication](/docs/authentication/config), include its data in the user JWT. |
|
||||||
| **`hooks`** | Provide field-based hooks to control logic for this field. [More](/docs/fields/overview#field-level-hooks) |
|
| **`hooks`** | Provide field-based hooks to control logic for this field. [More](/docs/fields/overview#field-level-hooks) |
|
||||||
| **`access`** | Provide field-based access control to denote what users can see and do with this field's data. [More](/docs/fields/overview#field-level-access-control) |
|
| **`access`** | Provide field-based access control to denote what users can see and do with this field's data. [More](/docs/fields/overview#field-level-access-control) |
|
||||||
@@ -52,7 +53,7 @@ In addition to the default [field admin config](/docs/fields/overview#admin-conf
|
|||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
`collections/ExampleCollection.ts
|
`collections/ExampleCollection.ts`
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import { CollectionConfig } from 'payload/types'
|
import { CollectionConfig } from 'payload/types'
|
||||||
@@ -68,3 +69,68 @@ export const ExampleCollection: CollectionConfig = {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### JSON Schema Validation
|
||||||
|
|
||||||
|
Payload JSON fields fully support the [JSON schema](https://json-schema.org/) standard. By providing a schema in your field config, the editor will be guided in the admin UI, getting typeahead for properties and their formats automatically. When the document is saved, the default validation will prevent saving any invalid data in the field according to the schema in your config.
|
||||||
|
|
||||||
|
If you only provide a URL to a schema, Payload will fetch the desired schema if it is publicly available. If not, it is recommended to add the schema directly to your config or import it from another file so that it can be implemented consistently in your project.
|
||||||
|
|
||||||
|
|
||||||
|
#### Local JSON Schema
|
||||||
|
|
||||||
|
`collections/ExampleCollection.ts`
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { CollectionConfig } from 'payload/types'
|
||||||
|
|
||||||
|
export const ExampleCollection: CollectionConfig = {
|
||||||
|
slug: 'example-collection',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'customerJSON', // required
|
||||||
|
type: 'json', // required
|
||||||
|
jsonSchema: {
|
||||||
|
uri: 'a://b/foo.json', // required
|
||||||
|
fileMatch: ['a://b/foo.json'], // required
|
||||||
|
schema: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
foo: {
|
||||||
|
enum: ['bar', 'foobar'],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
// {"foo": "bar"} or {"foo": "foobar"} - ok
|
||||||
|
// Attempting to create {"foo": "not-bar"} will throw an error
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Remote JSON Schema
|
||||||
|
|
||||||
|
`collections/ExampleCollection.ts`
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { CollectionConfig } from 'payload/types'
|
||||||
|
|
||||||
|
export const ExampleCollection: CollectionConfig = {
|
||||||
|
slug: 'example-collection',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'customerJSON', // required
|
||||||
|
type: 'json', // required
|
||||||
|
jsonSchema: {
|
||||||
|
uri: 'https://example.com/customer.schema.json', // required
|
||||||
|
fileMatch: ['https://example.com/customer.schema.json'], // required
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
// If 'https://example.com/customer.schema.json' has a JSON schema
|
||||||
|
// {"foo": "bar"} or {"foo": "foobar"} - ok
|
||||||
|
// Attempting to create {"foo": "not-bar"} will throw an error
|
||||||
|
```
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ keywords: radio, fields, config, configuration, documentation, Content Managemen
|
|||||||
| **`required`** | Require this field to have a value. |
|
| **`required`** | Require this field to have a value. |
|
||||||
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`enumName`** | Custom enum name for this field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined.
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ keywords: select, multi-select, fields, config, configuration, documentation, Co
|
|||||||
### Config
|
### Config
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| **`name`** \* | To be used as the property name when stored and retrieved from the database. [More](/docs/fields/overview#field-names) |
|
| **`name`** \* | To be used as the property name when stored and retrieved from the database. [More](/docs/fields/overview#field-names) |
|
||||||
| **`options`** \* | Array of options to allow the field to store. Can either be an array of strings, or an array of objects containing a `label` string and a `value` string. |
|
| **`options`** \* | Array of options to allow the field to store. Can either be an array of strings, or an array of objects containing a `label` string and a `value` string. |
|
||||||
| **`hasMany`** | Boolean when, if set to `true`, allows this field to have many selections instead of only one. |
|
| **`hasMany`** | Boolean when, if set to `true`, allows this field to have many selections instead of only one. |
|
||||||
@@ -38,6 +38,8 @@ keywords: select, multi-select, fields, config, configuration, documentation, Co
|
|||||||
| **`required`** | Require this field to have a value. |
|
| **`required`** | Require this field to have a value. |
|
||||||
| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
|
| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
|
||||||
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
| **`custom`** | Extension point for adding custom data (e.g. for plugins) |
|
||||||
|
| **`enumName`** | Custom enum name for this field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined. |
|
||||||
|
| **`dbName`** | Custom table name (if `hasMany` set to `true`) for this field when using SQL database adapter ([Postgres](/docs/database/postgres)). Auto-generated from name if not defined. |
|
||||||
|
|
||||||
_\* An asterisk denotes that a property is required._
|
_\* An asterisk denotes that a property is required._
|
||||||
|
|
||||||
@@ -52,7 +54,8 @@ _\* An asterisk denotes that a property is required._
|
|||||||
|
|
||||||
### Admin config
|
### Admin config
|
||||||
|
|
||||||
In addition to the default [field admin config](/docs/fields/overview#admin-config), the Select field type also allows for the following admin-specific properties:
|
In addition to the default [field admin config](/docs/fields/overview#admin-config), the Select field type also allows
|
||||||
|
for the following admin-specific properties:
|
||||||
|
|
||||||
**`isClearable`**
|
**`isClearable`**
|
||||||
|
|
||||||
@@ -60,7 +63,8 @@ Set to `true` if you'd like this field to be clearable within the Admin UI.
|
|||||||
|
|
||||||
**`isSortable`**
|
**`isSortable`**
|
||||||
|
|
||||||
Set to `true` if you'd like this field to be sortable within the Admin UI using drag and drop. (Only works when `hasMany` is set to `true`)
|
Set to `true` if you'd like this field to be sortable within the Admin UI using drag and drop. (Only works
|
||||||
|
when `hasMany` is set to `true`)
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
@@ -101,7 +105,8 @@ export const ExampleCollection: CollectionConfig = {
|
|||||||
|
|
||||||
### Customization
|
### Customization
|
||||||
|
|
||||||
The Select field UI component can be customized by providing a custom React component to the `components` object in the Base config.
|
The Select field UI component can be customized by providing a custom React component to the `components` object in the
|
||||||
|
Base config.
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
export const CustomSelectField: Field = {
|
export const CustomSelectField: Field = {
|
||||||
@@ -157,21 +162,26 @@ export const CustomSelectComponent: React.FC<CustomSelectProps> = ({ path, optio
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<label className = "field-label" >
|
<label className = "field-label" >
|
||||||
Custom Select
|
Custom
|
||||||
|
Select
|
||||||
< /label>
|
< /label>
|
||||||
< SelectInput
|
< SelectInput
|
||||||
path = { path }
|
path = { path }
|
||||||
name = { path }
|
name = { path }
|
||||||
options = { adjustedOptions }
|
options = { adjustedOptions }
|
||||||
value = { value }
|
value = { value }
|
||||||
onChange={(e) => setValue(e.value)}
|
onChange = {(e)
|
||||||
|
=>
|
||||||
|
setValue(e.value)
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
< /div>
|
< /div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If you are looking to create a dynamic select field, the following tutorial will walk you through the process of creating a custom select field that fetches its options from an external API.
|
If you are looking to create a dynamic select field, the following tutorial will walk you through the process of
|
||||||
|
creating a custom select field that fetches its options from an external API.
|
||||||
|
|
||||||
<VideoDrawer
|
<VideoDrawer
|
||||||
id='Efn9OxSjA6Y'
|
id='Efn9OxSjA6Y'
|
||||||
@@ -179,4 +189,5 @@ If you are looking to create a dynamic select field, the following tutorial will
|
|||||||
drawerTitle='How to Create a Custom Select Field: A Step-by-Step Guide'
|
drawerTitle='How to Create a Custom Select Field: A Step-by-Step Guide'
|
||||||
/>
|
/>
|
||||||
|
|
||||||
If you want to learn more about custom components check out the [Admin > Custom Component](/docs/admin/components#field-component) docs.
|
If you want to learn more about custom components check out
|
||||||
|
the [Admin > Custom Component](/docs/admin/components#field-component) docs.
|
||||||
|
|||||||
@@ -292,13 +292,11 @@ For auth-enabled Collections, this hook runs after successful `forgotPassword` o
|
|||||||
```ts
|
```ts
|
||||||
import { CollectionAfterForgotPasswordHook } from 'payload/types'
|
import { CollectionAfterForgotPasswordHook } from 'payload/types'
|
||||||
|
|
||||||
const afterLoginHook: CollectionAfterForgotPasswordHook = async ({
|
const afterForgotPasswordHook: CollectionAfterForgotPasswordHook = async ({
|
||||||
req, // full express request
|
args, // arguments passed into the operation
|
||||||
user, // user being logged in
|
context,
|
||||||
token, // user token
|
collection, // The collection which this hook is being run on
|
||||||
}) => {
|
}) => {...}
|
||||||
return user
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## TypeScript
|
## TypeScript
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ import { GlobalAfterChangeHook } from 'payload/types'
|
|||||||
|
|
||||||
const afterChangeHook: GlobalAfterChangeHook = async ({
|
const afterChangeHook: GlobalAfterChangeHook = async ({
|
||||||
doc, // full document data
|
doc, // full document data
|
||||||
previousDoc, // document data before updating the collection
|
previousDoc, // document data before updating the global
|
||||||
req, // full express request
|
req, // full express request
|
||||||
}) => {
|
}) => {
|
||||||
return data
|
return data
|
||||||
|
|||||||
@@ -290,5 +290,5 @@ If you've configured tests for your package, integrate them into your workf
|
|||||||
The best way to share and allow others to use your plugin once it is complete is to publish an NPM package. This process is straightforward and well documented, find out more about [creating and publishing a NPM package here](https://docs.npmjs.com/creating-and-publishing-scoped-public-packages/).
|
The best way to share and allow others to use your plugin once it is complete is to publish an NPM package. This process is straightforward and well documented, find out more about [creating and publishing a NPM package here](https://docs.npmjs.com/creating-and-publishing-scoped-public-packages/).
|
||||||
##### Add payload-plugin topic tag:
|
##### Add payload-plugin topic tag:
|
||||||
Apply the tag **payload-plugin** to your GitHub repository. This will boost the visibility of your plugin and ensure it gets listed with [existing payload plugins](https://github.com/topics/payload-plugin).
|
Apply the tag **payload-plugin** to your GitHub repository. This will boost the visibility of your plugin and ensure it gets listed with [existing payload plugins](https://github.com/topics/payload-plugin).
|
||||||
##### Use [Semantic Versioning](https://semver.org/) (SemVar):
|
##### Use [Semantic Versioning](https://semver.org/) (SemVer):
|
||||||
With the SemVar system you release version numbers that reflect the nature of changes (major, minor, patch). Ensure all major versions reference their Payload compatibility.
|
With the SemVer system you release version numbers that reflect the nature of changes (major, minor, patch). Ensure all major versions reference their Payload compatibility.
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ formBuilder({
|
|||||||
|
|
||||||
#### `beforeEmail`
|
#### `beforeEmail`
|
||||||
|
|
||||||
The `beforeEmail` property is a [beforeChange](<[beforeChange](https://payloadcms.com/docs/hooks/globals#beforechange)>) hook that is called just after emails are prepared, but before they are sent. This is a great place to inject your own HTML template to add custom styles.
|
The `beforeEmail` property is a [beforeChange](https://payloadcms.com/docs/hooks/globals#beforechange) hook that is called just after emails are prepared, but before they are sent. This is a great place to inject your own HTML template to add custom styles.
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
// payload.config.ts
|
// payload.config.ts
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ const examplePageConfig: CollectionConfig = {
|
|||||||
|
|
||||||
This plugin supports localization by default. If the `localization` property is set in your Payload config,
|
This plugin supports localization by default. If the `localization` property is set in your Payload config,
|
||||||
the `breadcrumbs` field is automatically localized. For more details on how localization works in Payload, see
|
the `breadcrumbs` field is automatically localized. For more details on how localization works in Payload, see
|
||||||
the [Localization](https://payloadcms.com/docs/localization/overview) docs.
|
the [Localization](https://payloadcms.com/docs/configuration/localization) docs.
|
||||||
|
|
||||||
## TypeScript
|
## TypeScript
|
||||||
|
|
||||||
@@ -235,5 +235,5 @@ official [Nested Docs Plugin Example](https://github.com/payloadcms/payload/tree
|
|||||||
demonstrates exactly how to configure this plugin in Payload and implement it on your front-end.
|
demonstrates exactly how to configure this plugin in Payload and implement it on your front-end.
|
||||||
The [Templates Directory](https://github.com/payloadcms/payload/tree/main/templates) also contains an
|
The [Templates Directory](https://github.com/payloadcms/payload/tree/main/templates) also contains an
|
||||||
official [Website Template](https://github.com/payloadcms/payload/tree/main/templates/website)
|
official [Website Template](https://github.com/payloadcms/payload/tree/main/templates/website)
|
||||||
and [E-commerce Template](https://github.com/payloadcms/payload/tree/main/templates/ecommere), both of which use this
|
and [E-commerce Template](https://github.com/payloadcms/payload/tree/main/templates/ecommerce), both of which use this
|
||||||
plugin.
|
plugin.
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ This plugin allows you to easily manage redirects for your application from with
|
|||||||
For example, if you have a page at `/about` and you want to change it to `/about-us`, you can create a redirect from the old page to the new one, then you can use this data to write HTTP redirects into your front-end application. This will ensure that users are redirected to the correct page without penalty because search engines are notified of the change at the request level. This is a very lightweight plugin that will allow you to integrate managed redirects for any front-end framework.
|
For example, if you have a page at `/about` and you want to change it to `/about-us`, you can create a redirect from the old page to the new one, then you can use this data to write HTTP redirects into your front-end application. This will ensure that users are redirected to the correct page without penalty because search engines are notified of the change at the request level. This is a very lightweight plugin that will allow you to integrate managed redirects for any front-end framework.
|
||||||
|
|
||||||
<Banner type="info">
|
<Banner type="info">
|
||||||
This plugin is completely open-source and the [source code can be found here](https://github.com/payloadcms/payload/tree/main/packages/plugin-redirects). If you need help, check out our [Community Help](https://payloadcms.com/community-help). If you think you've found a bug, please [open a new issue](https://github.com/payloadcms/payload/issues/new?assignees=&labels=plugin%3A%redirects&template=bug_report.md&title=plugin-redirects%3A) with as much detail as possible.
|
This plugin is completely open-source and the [source code can be found here](https://github.com/payloadcms/payload/tree/main/packages/plugin-redirects). If you need help, check out our [Community Help](https://payloadcms.com/community-help). If you think you've found a bug, please [open a new issue](https://github.com/payloadcms/payload/issues/new?assignees=&labels=plugin%3A%25redirects&template=bug_report.md&title=plugin-redirects%3A) with as much detail as possible.
|
||||||
</Banner>
|
</Banner>
|
||||||
|
|
||||||
##### Core features
|
##### Core features
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ This plugin automatically creates the `search` collection, but you can override
|
|||||||
|
|
||||||
#### `beforeSync`
|
#### `beforeSync`
|
||||||
|
|
||||||
Before creating or updating a search record, the `beforeSync` function runs. This is an [afterChange](<[afterChange](https://payloadcms.com/docs/hooks/globals#afterchange)>) hook that allows you to modify the data or provide fallbacks before its search record is created or updated.
|
Before creating or updating a search record, the `beforeSync` function runs. This is an [afterChange](https://payloadcms.com/docs/hooks/globals#afterchange) hook that allows you to modify the data or provide fallbacks before its search record is created or updated.
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
// payload.config.ts
|
// payload.config.ts
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ import {
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
The [Templates Directory](https://github.com/payloadcms/payload/tree/main/templates) contains an official [Website Template](https://github.com/payloadcms/payload/tree/main/templates/website) and [E-commerce Template](https://github.com/payloadcms/payload/tree/main/templates/ecommere) which demonstrates exactly how to configure this plugin in Payload and implement it on your front-end.
|
The [Templates Directory](https://github.com/payloadcms/payload/tree/main/templates) contains an official [Website Template](https://github.com/payloadcms/payload/tree/main/templates/website) and [E-commerce Template](https://github.com/payloadcms/payload/tree/main/templates/ecommerce) which demonstrates exactly how to configure this plugin in Payload and implement it on your front-end.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ To prevent DDoS, brute-force, and similar attacks, you can set IP-based rate lim
|
|||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ---------------- | ----------------------------------------------------------------------------------------------------------------------- |
|
| ---------------- | ----------------------------------------------------------------------------------------------------------------------- |
|
||||||
| **`window`** | Time in milliseconds to track requests per IP. Defaults to `90000` (15 minutes). |
|
| **`window`** | Time in milliseconds to track requests per IP. Defaults to `900000` (15 minutes). |
|
||||||
| **`max`** | Number of requests served from a single IP before limiting. Defaults to `500`. |
|
| **`max`** | Number of requests served from a single IP before limiting. Defaults to `500`. |
|
||||||
| **`skip`** | Express middleware function that can return true (or promise resulting in true) that will bypass limit. |
|
| **`skip`** | Express middleware function that can return true (or promise resulting in true) that will bypass limit. |
|
||||||
| **`trustProxy`** | True or false, to enable to allow requests to pass through a proxy such as a load balancer or an `nginx` reverse proxy. |
|
| **`trustProxy`** | True or false, to enable to allow requests to pass through a proxy such as a load balancer or an `nginx` reverse proxy. |
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ Here's an overview of all the included features:
|
|||||||
| **`RelationshipFeature`** | Yes | Allows you to create block-level (not inline) relationships to other documents |
|
| **`RelationshipFeature`** | Yes | Allows you to create block-level (not inline) relationships to other documents |
|
||||||
| **`BlockQuoteFeature`** | Yes | Allows you to create block-level quotes |
|
| **`BlockQuoteFeature`** | Yes | Allows you to create block-level quotes |
|
||||||
| **`UploadFeature`** | Yes | Allows you to create block-level upload nodes - this supports all kinds of uploads, not just images |
|
| **`UploadFeature`** | Yes | Allows you to create block-level upload nodes - this supports all kinds of uploads, not just images |
|
||||||
|
| **`HorizontalRuleFeature`** | Yes | Horizontal rules / separators. Basically displays an `<hr>` element |
|
||||||
| **`BlocksFeature`** | No | Allows you to use Payload's [Blocks Field](/docs/fields/blocks) directly inside your editor. In the feature props, you can specify the allowed blocks - just like in the Blocks field. |
|
| **`BlocksFeature`** | No | Allows you to use Payload's [Blocks Field](/docs/fields/blocks) directly inside your editor. In the feature props, you can specify the allowed blocks - just like in the Blocks field. |
|
||||||
| **`TreeViewFeature`** | No | Adds a debug box under the editor, which allows you to see the current editor state live, the dom, as well as time travel. Very useful for debugging |
|
| **`TreeViewFeature`** | No | Adds a debug box under the editor, which allows you to see the current editor state live, the dom, as well as time travel. Very useful for debugging |
|
||||||
|
|
||||||
@@ -176,7 +177,7 @@ Next, take a look at the [features we've already built](https://github.com/paylo
|
|||||||
Lexical saves data in JSON, but can also generate its HTML representation via two main methods:
|
Lexical saves data in JSON, but can also generate its HTML representation via two main methods:
|
||||||
|
|
||||||
1. **Outputting HTML from the Collection:** Create a new field in your collection to convert saved JSON content to HTML. Payload generates and outputs the HTML for use in your frontend.
|
1. **Outputting HTML from the Collection:** Create a new field in your collection to convert saved JSON content to HTML. Payload generates and outputs the HTML for use in your frontend.
|
||||||
2. **Generating HTML on the Frontend:** Convert JSON to HTML on-demand, either in your frontend or elsewhere.
|
2. **Generating HTML on any server** Convert JSON to HTML on-demand on the server.
|
||||||
|
|
||||||
The editor comes with built-in HTML serializers, simplifying the process of converting JSON to HTML.
|
The editor comes with built-in HTML serializers, simplifying the process of converting JSON to HTML.
|
||||||
|
|
||||||
@@ -213,7 +214,7 @@ const Pages: CollectionConfig = {
|
|||||||
```
|
```
|
||||||
The `lexicalHTML()` function creates a new field that automatically converts the referenced lexical richText field into HTML through an afterRead hook.
|
The `lexicalHTML()` function creates a new field that automatically converts the referenced lexical richText field into HTML through an afterRead hook.
|
||||||
|
|
||||||
#### Generating HTML in the Frontend:
|
#### Generating HTML anywhere on the server:
|
||||||
|
|
||||||
If you wish to convert JSON to HTML ad-hoc, use this code snippet:
|
If you wish to convert JSON to HTML ad-hoc, use this code snippet:
|
||||||
|
|
||||||
|
|||||||
@@ -168,7 +168,9 @@ Specifying custom `Type`s let you extend your custom elements by adding addition
|
|||||||
`collections/ExampleCollection.ts`
|
`collections/ExampleCollection.ts`
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import { CollectionConfig } from 'payload/types'
|
import type { CollectionConfig } from 'payload/types'
|
||||||
|
|
||||||
|
import { slateEditor } from '@payloadcms/richtext-slate'
|
||||||
|
|
||||||
export const ExampleCollection: CollectionConfig = {
|
export const ExampleCollection: CollectionConfig = {
|
||||||
slug: 'example-collection',
|
slug: 'example-collection',
|
||||||
@@ -182,6 +184,7 @@ export const ExampleCollection: CollectionConfig = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
required: true,
|
required: true,
|
||||||
|
editor: slateEditor({
|
||||||
admin: {
|
admin: {
|
||||||
elements: [
|
elements: [
|
||||||
'h2',
|
'h2',
|
||||||
@@ -233,6 +236,7 @@ export const ExampleCollection: CollectionConfig = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ Every Payload Collection can opt-in to supporting Uploads by specifying the `upl
|
|||||||
| **`adminThumbnail`** | Set the way that the Admin panel will display thumbnails for this Collection. [More](#admin-thumbnails) |
|
| **`adminThumbnail`** | Set the way that the Admin panel will display thumbnails for this Collection. [More](#admin-thumbnails) |
|
||||||
| **`crop`** | Set to `false` to disable the cropping tool in the Admin panel. Crop is enabled by default. [More](#crop-and-focal-point-selector) |
|
| **`crop`** | Set to `false` to disable the cropping tool in the Admin panel. Crop is enabled by default. [More](#crop-and-focal-point-selector) |
|
||||||
| **`disableLocalStorage`** | Completely disable uploading files to disk locally. [More](#disabling-local-upload-storage) |
|
| **`disableLocalStorage`** | Completely disable uploading files to disk locally. [More](#disabling-local-upload-storage) |
|
||||||
|
| **`externalFileHeaderFilter`** | Accepts existing headers and can filter/modify them. |
|
||||||
| **`focalPoint`** | Set to `false` to disable the focal point selection tool in the Admin panel. The focal point selector is only available when `imageSizes` or `resizeOptions` are defined. [More](#crop-and-focal-point-selector) |
|
| **`focalPoint`** | Set to `false` to disable the focal point selection tool in the Admin panel. The focal point selector is only available when `imageSizes` or `resizeOptions` are defined. [More](#crop-and-focal-point-selector) |
|
||||||
| **`formatOptions`** | An object with `format` and `options` that are used with the Sharp image library to format the upload file. [More](https://sharp.pixelplumbing.com/api-output#toformat) |
|
| **`formatOptions`** | An object with `format` and `options` that are used with the Sharp image library to format the upload file. [More](https://sharp.pixelplumbing.com/api-output#toformat) |
|
||||||
| **`handlers`** | Array of Express request handlers to execute before the built-in Payload static middleware executes. |
|
| **`handlers`** | Array of Express request handlers to execute before the built-in Payload static middleware executes. |
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
"@payloadcms/db-mongodb": "latest",
|
"@payloadcms/db-mongodb": "latest",
|
||||||
"@payloadcms/richtext-slate": "latest",
|
"@payloadcms/richtext-slate": "latest",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2810,6 +2810,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3476,13 +3481,14 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3663,6 +3669,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0, espree@^9.6.1:
|
espree@^9.6.0, espree@^9.6.1:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3748,7 +3764,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3785,6 +3801,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4508,9 +4561,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"@payloadcms/richtext-slate": "latest",
|
"@payloadcms/richtext-slate": "latest",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"escape-html": "^1.0.3",
|
"escape-html": "^1.0.3",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"next": "^13.4.8",
|
"next": "^13.4.8",
|
||||||
"payload": "latest",
|
"payload": "latest",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
|
|||||||
@@ -2963,6 +2963,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3634,13 +3639,14 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3822,6 +3828,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0, espree@^9.6.1:
|
espree@^9.6.0, espree@^9.6.1:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3907,7 +3923,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3944,6 +3960,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4701,9 +4754,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"@payloadcms/db-mongodb": "latest",
|
"@payloadcms/db-mongodb": "latest",
|
||||||
"@payloadcms/richtext-slate": "latest",
|
"@payloadcms/richtext-slate": "latest",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2810,6 +2810,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3476,13 +3481,14 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3663,6 +3669,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0, espree@^9.6.1:
|
espree@^9.6.0, espree@^9.6.1:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3748,7 +3764,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3785,6 +3801,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4508,9 +4561,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest",
|
"payload": "latest",
|
||||||
"handlebars": "^4.7.7",
|
"handlebars": "^4.7.7",
|
||||||
"inline-css": "^4.0.2"
|
"inline-css": "^4.0.2"
|
||||||
|
|||||||
@@ -2179,25 +2179,7 @@ bl@^4.0.3:
|
|||||||
inherits "^2.0.4"
|
inherits "^2.0.4"
|
||||||
readable-stream "^3.4.0"
|
readable-stream "^3.4.0"
|
||||||
|
|
||||||
body-parser@1.20.1:
|
body-parser@1.20.2, body-parser@^1.20.1:
|
||||||
version "1.20.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
|
|
||||||
integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==
|
|
||||||
dependencies:
|
|
||||||
bytes "3.1.2"
|
|
||||||
content-type "~1.0.4"
|
|
||||||
debug "2.6.9"
|
|
||||||
depd "2.0.0"
|
|
||||||
destroy "1.2.0"
|
|
||||||
http-errors "2.0.0"
|
|
||||||
iconv-lite "0.4.24"
|
|
||||||
on-finished "2.4.1"
|
|
||||||
qs "6.11.0"
|
|
||||||
raw-body "2.5.1"
|
|
||||||
type-is "~1.6.18"
|
|
||||||
unpipe "1.0.0"
|
|
||||||
|
|
||||||
body-parser@^1.20.1:
|
|
||||||
version "1.20.2"
|
version "1.20.2"
|
||||||
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
|
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
|
||||||
integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
|
integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
|
||||||
@@ -2631,10 +2613,10 @@ cookie-signature@1.0.6:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
|
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
|
||||||
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
|
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
|
||||||
|
|
||||||
cookie@0.5.0:
|
cookie@0.6.0:
|
||||||
version "0.5.0"
|
version "0.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
cookiejar@^2.1.4:
|
cookiejar@^2.1.4:
|
||||||
version "2.1.4"
|
version "2.1.4"
|
||||||
@@ -3248,13 +3230,14 @@ es-module-lexer@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
|
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
|
||||||
integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
|
integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3380,6 +3363,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0:
|
espree@^9.6.0:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3463,17 +3456,17 @@ express-rate-limit@^5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@^4.17.1, express@^4.18.2:
|
express@^4.18.2, express@^4.19.2:
|
||||||
version "4.18.2"
|
version "4.19.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
accepts "~1.3.8"
|
accepts "~1.3.8"
|
||||||
array-flatten "1.1.1"
|
array-flatten "1.1.1"
|
||||||
body-parser "1.20.1"
|
body-parser "1.20.2"
|
||||||
content-disposition "0.5.4"
|
content-disposition "0.5.4"
|
||||||
content-type "~1.0.4"
|
content-type "~1.0.4"
|
||||||
cookie "0.5.0"
|
cookie "0.6.0"
|
||||||
cookie-signature "1.0.6"
|
cookie-signature "1.0.6"
|
||||||
debug "2.6.9"
|
debug "2.6.9"
|
||||||
depd "2.0.0"
|
depd "2.0.0"
|
||||||
@@ -4258,14 +4251,14 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^1.1.5:
|
ip@^1.1.5:
|
||||||
version "1.1.8"
|
version "1.1.9"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396"
|
||||||
integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==
|
integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
@@ -6390,16 +6383,6 @@ range-parser@^1.2.1, range-parser@~1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
||||||
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
|
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
|
||||||
|
|
||||||
raw-body@2.5.1:
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
|
|
||||||
integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
|
|
||||||
dependencies:
|
|
||||||
bytes "3.1.2"
|
|
||||||
http-errors "2.0.0"
|
|
||||||
iconv-lite "0.4.24"
|
|
||||||
unpipe "1.0.0"
|
|
||||||
|
|
||||||
raw-body@2.5.2, raw-body@^2.2.0:
|
raw-body@2.5.2, raw-body@^2.2.0:
|
||||||
version "2.5.2"
|
version "2.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
|
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"@payloadcms/plugin-form-builder": "^1.0.12",
|
"@payloadcms/plugin-form-builder": "^1.0.12",
|
||||||
"@payloadcms/plugin-seo": "^1.0.8",
|
"@payloadcms/plugin-seo": "^1.0.8",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2589,6 +2589,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3159,13 +3164,14 @@ es-module-lexer@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1"
|
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1"
|
||||||
integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==
|
integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3223,6 +3229,16 @@ eslint-scope@5.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
esrecurse@^4.3.0:
|
esrecurse@^4.3.0:
|
||||||
version "4.3.0"
|
version "4.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
|
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
|
||||||
@@ -3287,7 +3303,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3324,6 +3340,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -3924,9 +3977,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"@payloadcms/richtext-slate": "^1.0.0",
|
"@payloadcms/richtext-slate": "^1.0.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "^2.0.0"
|
"payload": "^2.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2974,6 +2974,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3549,13 +3554,14 @@ es-module-lexer@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5"
|
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5"
|
||||||
integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==
|
integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3613,6 +3619,16 @@ eslint-scope@5.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
esrecurse@^4.3.0:
|
esrecurse@^4.3.0:
|
||||||
version "4.3.0"
|
version "4.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
|
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
|
||||||
@@ -3677,7 +3693,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3714,6 +3730,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4347,9 +4400,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"@payloadcms/db-mongodb": "latest",
|
"@payloadcms/db-mongodb": "latest",
|
||||||
"@payloadcms/richtext-slate": "latest",
|
"@payloadcms/richtext-slate": "latest",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2810,6 +2810,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3476,13 +3481,14 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3663,6 +3669,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0, espree@^9.6.1:
|
espree@^9.6.0, espree@^9.6.1:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3748,7 +3764,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3785,6 +3801,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4508,9 +4561,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ For more details on this, see the [CORS](https://payloadcms.com/docs/production/
|
|||||||
|
|
||||||
## Front-end
|
## Front-end
|
||||||
|
|
||||||
If you're building a website or other front-end for your tenant, you will need specify the `tenant` in your requests. For example, if you wanted to fetch all pages for the tenant `ABC`, you would make a request to `/api/pages?where[tenant][slug][equals]=abc`.
|
If you're building a website or other front-end for your tenant, you will need specify the `tenant` in your requests. For example, if you wanted to fetch all pages for the tenant `ABC`, you would make a request to `/api/pages?where[tenant.name][equals]=ABC`.
|
||||||
|
|
||||||
For a head start on building a website for your tenant(s), check out the official [Website Template](https://github.com/payloadcms/template-website). It includes a page layout builder, preview, SEO, and much more. It is not multi-tenant, though, but you can easily take the concepts from that example and apply them here.
|
For a head start on building a website for your tenant(s), check out the official [Website Template](https://github.com/payloadcms/template-website). It includes a page layout builder, preview, SEO, and much more. It is not multi-tenant, though, but you can easily take the concepts from that example and apply them here.
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"@payloadcms/db-mongodb": "latest",
|
"@payloadcms/db-mongodb": "latest",
|
||||||
"@payloadcms/richtext-slate": "latest",
|
"@payloadcms/richtext-slate": "latest",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ app.get('/', (_, res) => {
|
|||||||
const start = async (): Promise<void> => {
|
const start = async (): Promise<void> => {
|
||||||
await payload.init({
|
await payload.init({
|
||||||
secret: process.env.PAYLOAD_SECRET,
|
secret: process.env.PAYLOAD_SECRET,
|
||||||
mongoURL: process.env.MONGODB_URI,
|
|
||||||
express: app,
|
express: app,
|
||||||
onInit: () => {
|
onInit: () => {
|
||||||
payload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`)
|
payload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`)
|
||||||
|
|||||||
@@ -2888,6 +2888,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3559,13 +3564,14 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3747,6 +3753,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0, espree@^9.6.1:
|
espree@^9.6.0, espree@^9.6.1:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3832,7 +3848,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3869,6 +3885,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4625,9 +4678,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"@payloadcms/richtext-slate": "latest",
|
"@payloadcms/richtext-slate": "latest",
|
||||||
"@payloadcms/plugin-nested-docs": "latest",
|
"@payloadcms/plugin-nested-docs": "latest",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2862,6 +2862,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3533,13 +3538,14 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3721,6 +3727,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0, espree@^9.6.1:
|
espree@^9.6.0, espree@^9.6.1:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3806,7 +3822,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3843,6 +3859,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4599,9 +4652,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"@payloadcms/richtext-slate": "latest",
|
"@payloadcms/richtext-slate": "latest",
|
||||||
"@payloadcms/plugin-redirects": "^1.0.0",
|
"@payloadcms/plugin-redirects": "^1.0.0",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2815,6 +2815,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
|
||||||
@@ -3481,13 +3486,14 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3668,6 +3674,16 @@ eslint@^8.19.0:
|
|||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
espree@^9.6.0, espree@^9.6.1:
|
espree@^9.6.0, espree@^9.6.1:
|
||||||
version "9.6.1"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||||
@@ -3753,7 +3769,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.17.1:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -3790,6 +3806,43 @@ express@4.18.2, express@^4.17.1:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4513,9 +4566,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
"@payloadcms/db-mongodb": "^1.1.0",
|
"@payloadcms/db-mongodb": "^1.1.0",
|
||||||
"@payloadcms/richtext-slate": "^1.3.1",
|
"@payloadcms/richtext-slate": "^1.3.1",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
"express": "^4.18.2",
|
"express": "^4.19.2",
|
||||||
"get-tsconfig": "^4.7.0",
|
"get-tsconfig": "^4.7.0",
|
||||||
"payload": "^2.4.0"
|
"payload": "^2.4.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3335,6 +3335,11 @@ cookie@0.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
||||||
|
|
||||||
|
cookie@0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
cosmiconfig@^7.0.0:
|
cosmiconfig@^7.0.0:
|
||||||
version "7.1.0"
|
version "7.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
|
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
|
||||||
@@ -3928,13 +3933,14 @@ es-module-lexer@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5"
|
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5"
|
||||||
integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==
|
integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3997,6 +4003,16 @@ eslint-scope@5.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
esprima@^4.0.0:
|
esprima@^4.0.0:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
||||||
@@ -4097,7 +4113,7 @@ express-rate-limit@5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@4.18.2, express@^4.18.2:
|
express@4.18.2:
|
||||||
version "4.18.2"
|
version "4.18.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
||||||
@@ -4134,6 +4150,43 @@ express@4.18.2, express@^4.18.2:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
|
express@^4.19.2:
|
||||||
|
version "4.19.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.8"
|
||||||
|
array-flatten "1.1.1"
|
||||||
|
body-parser "1.20.2"
|
||||||
|
content-disposition "0.5.4"
|
||||||
|
content-type "~1.0.4"
|
||||||
|
cookie "0.6.0"
|
||||||
|
cookie-signature "1.0.6"
|
||||||
|
debug "2.6.9"
|
||||||
|
depd "2.0.0"
|
||||||
|
encodeurl "~1.0.2"
|
||||||
|
escape-html "~1.0.3"
|
||||||
|
etag "~1.8.1"
|
||||||
|
finalhandler "1.2.0"
|
||||||
|
fresh "0.5.2"
|
||||||
|
http-errors "2.0.0"
|
||||||
|
merge-descriptors "1.0.1"
|
||||||
|
methods "~1.1.2"
|
||||||
|
on-finished "2.4.1"
|
||||||
|
parseurl "~1.3.3"
|
||||||
|
path-to-regexp "0.1.7"
|
||||||
|
proxy-addr "~2.0.7"
|
||||||
|
qs "6.11.0"
|
||||||
|
range-parser "~1.2.1"
|
||||||
|
safe-buffer "5.2.1"
|
||||||
|
send "0.18.0"
|
||||||
|
serve-static "1.15.0"
|
||||||
|
setprototypeof "1.2.0"
|
||||||
|
statuses "2.0.1"
|
||||||
|
type-is "~1.6.18"
|
||||||
|
utils-merge "1.0.1"
|
||||||
|
vary "~1.1.2"
|
||||||
|
|
||||||
ext@^1.1.2:
|
ext@^1.1.2:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
||||||
@@ -4301,9 +4354,9 @@ focus-trap@^6.9.2:
|
|||||||
tabbable "^5.3.3"
|
tabbable "^5.3.3"
|
||||||
|
|
||||||
follow-redirects@^1.15.2:
|
follow-redirects@^1.15.2:
|
||||||
version "1.15.4"
|
version "1.15.6"
|
||||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf"
|
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
|
||||||
integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==
|
integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
|
||||||
|
|
||||||
for-each@^0.3.3:
|
for-each@^0.3.3:
|
||||||
version "0.3.3"
|
version "0.3.3"
|
||||||
@@ -4835,9 +4888,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.19.2",
|
||||||
"payload": "latest"
|
"payload": "latest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -2058,25 +2058,7 @@ bl@^4.0.3:
|
|||||||
inherits "^2.0.4"
|
inherits "^2.0.4"
|
||||||
readable-stream "^3.4.0"
|
readable-stream "^3.4.0"
|
||||||
|
|
||||||
body-parser@1.20.1:
|
body-parser@1.20.2, body-parser@^1.20.1:
|
||||||
version "1.20.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
|
|
||||||
integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==
|
|
||||||
dependencies:
|
|
||||||
bytes "3.1.2"
|
|
||||||
content-type "~1.0.4"
|
|
||||||
debug "2.6.9"
|
|
||||||
depd "2.0.0"
|
|
||||||
destroy "1.2.0"
|
|
||||||
http-errors "2.0.0"
|
|
||||||
iconv-lite "0.4.24"
|
|
||||||
on-finished "2.4.1"
|
|
||||||
qs "6.11.0"
|
|
||||||
raw-body "2.5.1"
|
|
||||||
type-is "~1.6.18"
|
|
||||||
unpipe "1.0.0"
|
|
||||||
|
|
||||||
body-parser@^1.20.1:
|
|
||||||
version "1.20.2"
|
version "1.20.2"
|
||||||
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
|
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
|
||||||
integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
|
integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
|
||||||
@@ -2473,10 +2455,10 @@ cookie-signature@1.0.6:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
|
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
|
||||||
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
|
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
|
||||||
|
|
||||||
cookie@0.5.0:
|
cookie@0.6.0:
|
||||||
version "0.5.0"
|
version "0.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
|
||||||
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
|
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
|
||||||
|
|
||||||
copyfiles@^2.4.1:
|
copyfiles@^2.4.1:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
@@ -3033,13 +3015,14 @@ es-module-lexer@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
|
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
|
||||||
integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
|
integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
|
||||||
version "0.10.62"
|
version "0.10.64"
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-iterator "^2.0.3"
|
es6-iterator "^2.0.3"
|
||||||
es6-symbol "^3.1.3"
|
es6-symbol "^3.1.3"
|
||||||
|
esniff "^2.0.1"
|
||||||
next-tick "^1.1.0"
|
next-tick "^1.1.0"
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
es6-iterator@^2.0.3:
|
||||||
@@ -3097,6 +3080,16 @@ eslint-scope@5.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
|
|
||||||
|
esniff@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
|
||||||
|
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
|
||||||
|
dependencies:
|
||||||
|
d "^1.0.1"
|
||||||
|
es5-ext "^0.10.62"
|
||||||
|
event-emitter "^0.3.5"
|
||||||
|
type "^2.7.2"
|
||||||
|
|
||||||
esrecurse@^4.3.0:
|
esrecurse@^4.3.0:
|
||||||
version "4.3.0"
|
version "4.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
|
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
|
||||||
@@ -3154,17 +3147,17 @@ express-rate-limit@^5.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2"
|
||||||
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==
|
||||||
|
|
||||||
express@^4.17.1, express@^4.18.2:
|
express@^4.18.2, express@^4.19.2:
|
||||||
version "4.18.2"
|
version "4.19.2"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
|
||||||
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
|
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
accepts "~1.3.8"
|
accepts "~1.3.8"
|
||||||
array-flatten "1.1.1"
|
array-flatten "1.1.1"
|
||||||
body-parser "1.20.1"
|
body-parser "1.20.2"
|
||||||
content-disposition "0.5.4"
|
content-disposition "0.5.4"
|
||||||
content-type "~1.0.4"
|
content-type "~1.0.4"
|
||||||
cookie "0.5.0"
|
cookie "0.6.0"
|
||||||
cookie-signature "1.0.6"
|
cookie-signature "1.0.6"
|
||||||
debug "2.6.9"
|
debug "2.6.9"
|
||||||
depd "2.0.0"
|
depd "2.0.0"
|
||||||
@@ -3748,9 +3741,9 @@ interpret@^2.2.0:
|
|||||||
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
|
||||||
|
|
||||||
ip@^2.0.0:
|
ip@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
|
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
|
||||||
integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
|
integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
|
||||||
|
|
||||||
ipaddr.js@1.9.1:
|
ipaddr.js@1.9.1:
|
||||||
version "1.9.1"
|
version "1.9.1"
|
||||||
@@ -5675,16 +5668,6 @@ range-parser@^1.2.1, range-parser@~1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
||||||
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
|
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
|
||||||
|
|
||||||
raw-body@2.5.1:
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
|
|
||||||
integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
|
|
||||||
dependencies:
|
|
||||||
bytes "3.1.2"
|
|
||||||
http-errors "2.0.0"
|
|
||||||
iconv-lite "0.4.24"
|
|
||||||
unpipe "1.0.0"
|
|
||||||
|
|
||||||
raw-body@2.5.2:
|
raw-body@2.5.2:
|
||||||
version "2.5.2"
|
version "2.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
|
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
"dev:generate-types": "ts-node -T ./test/generateTypes.ts",
|
"dev:generate-types": "ts-node -T ./test/generateTypes.ts",
|
||||||
"dev:postgres": "pnpm --filter payload run dev:postgres",
|
"dev:postgres": "pnpm --filter payload run dev:postgres",
|
||||||
"docker:restart": "pnpm docker:stop --remove-orphans && pnpm docker:start",
|
"docker:restart": "pnpm docker:stop --remove-orphans && pnpm docker:start",
|
||||||
"docker:start": "docker-compose -f packages/plugin-cloud-storage/docker-compose.yml up -d",
|
"docker:start": "docker compose -f packages/plugin-cloud-storage/docker-compose.yml up -d",
|
||||||
"docker:stop": "docker-compose -f packages/plugin-cloud-storage/docker-compose.yml down",
|
"docker:stop": "docker compose -f packages/plugin-cloud-storage/docker-compose.yml down",
|
||||||
"fix": "eslint \"packages/**/*.ts\" --fix",
|
"fix": "eslint \"packages/**/*.ts\" --fix",
|
||||||
"lint": "eslint \"packages/**/*.ts\"",
|
"lint": "eslint \"packages/**/*.ts\"",
|
||||||
"lint-staged": "lint-staged",
|
"lint-staged": "lint-staged",
|
||||||
@@ -128,6 +128,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sentry/react": "^7.77.0"
|
"@sentry/react": "^7.77.0",
|
||||||
|
"ajv": "^8.12.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,11 @@
|
|||||||
"name": "@payloadcms/bundler-vite",
|
"name": "@payloadcms/bundler-vite",
|
||||||
"version": "0.1.6",
|
"version": "0.1.6",
|
||||||
"description": "The officially supported Vite bundler adapter for Payload",
|
"description": "The officially supported Vite bundler adapter for Payload",
|
||||||
"repository": "https://github.com/payloadcms/payload",
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/payloadcms/payload.git",
|
||||||
|
"directory": "packages/bundler-vite"
|
||||||
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"homepage": "https://payloadcms.com",
|
"homepage": "https://payloadcms.com",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -2,7 +2,11 @@
|
|||||||
"name": "@payloadcms/bundler-webpack",
|
"name": "@payloadcms/bundler-webpack",
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"description": "The officially supported Webpack bundler adapter for Payload",
|
"description": "The officially supported Webpack bundler adapter for Payload",
|
||||||
"repository": "https://github.com/payloadcms/payload",
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/payloadcms/payload.git",
|
||||||
|
"directory": "packages/bundler-webpack"
|
||||||
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"homepage": "https://payloadcms.com",
|
"homepage": "https://payloadcms.com",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -2,9 +2,15 @@
|
|||||||
"name": "create-payload-app",
|
"name": "create-payload-app",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"homepage": "https://payloadcms.com",
|
||||||
"bin": {
|
"bin": {
|
||||||
"create-payload-app": "bin/cli.js"
|
"create-payload-app": "bin/cli.js"
|
||||||
},
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/payloadcms/payload.git",
|
||||||
|
"directory": "packages/create-payload-app"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "pnpm build:swc",
|
"build": "pnpm build:swc",
|
||||||
"build:swc": "swc ./src -d ./dist --config-file .swcrc",
|
"build:swc": "swc ./src -d ./dist --config-file .swcrc",
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@payloadcms/db-mongodb",
|
"name": "@payloadcms/db-mongodb",
|
||||||
"version": "1.4.3",
|
"version": "1.5.0",
|
||||||
"description": "The officially supported MongoDB database adapter for Payload",
|
"description": "The officially supported MongoDB database adapter for Payload",
|
||||||
"repository": "https://github.com/payloadcms/payload",
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/payloadcms/payload.git",
|
||||||
|
"directory": "packages/db-mongodb"
|
||||||
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"homepage": "https://payloadcms.com",
|
"homepage": "https://payloadcms.com",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { withSession } from './withSession'
|
|||||||
|
|
||||||
export const createGlobal: CreateGlobal = async function createGlobal(
|
export const createGlobal: CreateGlobal = async function createGlobal(
|
||||||
this: MongooseAdapter,
|
this: MongooseAdapter,
|
||||||
{ data, req = {} as PayloadRequest, slug },
|
{ slug, data, req = {} as PayloadRequest },
|
||||||
) {
|
) {
|
||||||
const Model = this.globals
|
const Model = this.globals
|
||||||
const global = {
|
const global = {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { withSession } from './withSession'
|
|||||||
|
|
||||||
export const findGlobal: FindGlobal = async function findGlobal(
|
export const findGlobal: FindGlobal = async function findGlobal(
|
||||||
this: MongooseAdapter,
|
this: MongooseAdapter,
|
||||||
{ locale, req = {} as PayloadRequest, slug, where },
|
{ slug, locale, req = {} as PayloadRequest, where },
|
||||||
) {
|
) {
|
||||||
const Model = this.globals
|
const Model = this.globals
|
||||||
const options = {
|
const options = {
|
||||||
|
|||||||
@@ -6,11 +6,7 @@ import type { SanitizedCollectionConfig } from 'payload/types'
|
|||||||
import mongoose from 'mongoose'
|
import mongoose from 'mongoose'
|
||||||
import mongooseAggregatePaginate from 'mongoose-aggregate-paginate-v2'
|
import mongooseAggregatePaginate from 'mongoose-aggregate-paginate-v2'
|
||||||
import paginate from 'mongoose-paginate-v2'
|
import paginate from 'mongoose-paginate-v2'
|
||||||
import {
|
import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload/versions'
|
||||||
buildVersionCollectionFields,
|
|
||||||
buildVersionGlobalFields,
|
|
||||||
getVersionsModelName,
|
|
||||||
} from 'payload/versions'
|
|
||||||
|
|
||||||
import type { MongooseAdapter } from '.'
|
import type { MongooseAdapter } from '.'
|
||||||
import type { CollectionModel } from './types'
|
import type { CollectionModel } from './types'
|
||||||
@@ -19,19 +15,21 @@ import buildCollectionSchema from './models/buildCollectionSchema'
|
|||||||
import { buildGlobalModel } from './models/buildGlobalModel'
|
import { buildGlobalModel } from './models/buildGlobalModel'
|
||||||
import buildSchema from './models/buildSchema'
|
import buildSchema from './models/buildSchema'
|
||||||
import getBuildQueryPlugin from './queries/buildQuery'
|
import getBuildQueryPlugin from './queries/buildQuery'
|
||||||
|
import { getDBName } from './utilities/getDBName'
|
||||||
|
|
||||||
export const init: Init = async function init(this: MongooseAdapter) {
|
export const init: Init = async function init(this: MongooseAdapter) {
|
||||||
this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => {
|
this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => {
|
||||||
const schema = buildCollectionSchema(collection, this.payload.config)
|
const schema = buildCollectionSchema(collection, this.payload.config)
|
||||||
|
|
||||||
if (collection.versions) {
|
if (collection.versions) {
|
||||||
const versionModelName = getVersionsModelName(collection)
|
const versionModelName = getDBName({ config: collection, versions: true })
|
||||||
|
|
||||||
const versionCollectionFields = buildVersionCollectionFields(collection)
|
const versionCollectionFields = buildVersionCollectionFields(collection)
|
||||||
|
|
||||||
const versionSchema = buildSchema(this.payload.config, versionCollectionFields, {
|
const versionSchema = buildSchema(this.payload.config, versionCollectionFields, {
|
||||||
disableUnique: true,
|
disableUnique: true,
|
||||||
draftsEnabled: true,
|
draftsEnabled: true,
|
||||||
|
indexSortableFields: this.payload.config.indexSortableFields,
|
||||||
options: {
|
options: {
|
||||||
minimize: false,
|
minimize: false,
|
||||||
timestamps: false,
|
timestamps: false,
|
||||||
@@ -54,12 +52,11 @@ export const init: Init = async function init(this: MongooseAdapter) {
|
|||||||
versionSchema,
|
versionSchema,
|
||||||
this.autoPluralization === true ? undefined : versionModelName,
|
this.autoPluralization === true ? undefined : versionModelName,
|
||||||
) as CollectionModel
|
) as CollectionModel
|
||||||
// this.payload.versions[collection.slug] = model;
|
|
||||||
this.versions[collection.slug] = model
|
this.versions[collection.slug] = model
|
||||||
}
|
}
|
||||||
|
|
||||||
const model = mongoose.model(
|
const model = mongoose.model(
|
||||||
collection.slug,
|
getDBName({ config: collection }),
|
||||||
schema,
|
schema,
|
||||||
this.autoPluralization === true ? undefined : collection.slug,
|
this.autoPluralization === true ? undefined : collection.slug,
|
||||||
) as CollectionModel
|
) as CollectionModel
|
||||||
@@ -77,7 +74,7 @@ export const init: Init = async function init(this: MongooseAdapter) {
|
|||||||
|
|
||||||
this.payload.config.globals.forEach((global) => {
|
this.payload.config.globals.forEach((global) => {
|
||||||
if (global.versions) {
|
if (global.versions) {
|
||||||
const versionModelName = getVersionsModelName(global)
|
const versionModelName = getDBName({ config: global, versions: true })
|
||||||
|
|
||||||
const versionGlobalFields = buildVersionGlobalFields(global)
|
const versionGlobalFields = buildVersionGlobalFields(global)
|
||||||
|
|
||||||
|
|||||||
@@ -361,7 +361,7 @@ const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = {
|
|||||||
}
|
}
|
||||||
if (field.localized && config.localization) {
|
if (field.localized && config.localization) {
|
||||||
config.localization.locales.forEach((locale) => {
|
config.localization.locales.forEach((locale) => {
|
||||||
schema.index({ [`${field.name}.${locale}`]: '2dsphere' }, indexOptions)
|
schema.index({ [`${field.name}.${locale.code}`]: '2dsphere' }, indexOptions)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
schema.index({ [field.name]: '2dsphere' }, indexOptions)
|
schema.index({ [field.name]: '2dsphere' }, indexOptions)
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ export const sanitizeQueryValue = ({
|
|||||||
formattedValue = Number(val)
|
formattedValue = Number(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field.type === 'date' && typeof val === 'string') {
|
if (field.type === 'date' && typeof val === 'string' && operator !== 'exists') {
|
||||||
formattedValue = new Date(val)
|
formattedValue = new Date(val)
|
||||||
if (Number.isNaN(Date.parse(formattedValue))) {
|
if (Number.isNaN(Date.parse(formattedValue))) {
|
||||||
return undefined
|
return undefined
|
||||||
@@ -142,7 +142,10 @@ export const sanitizeQueryValue = ({
|
|||||||
|
|
||||||
if (path !== '_id' || (path === '_id' && hasCustomID && field.type === 'text')) {
|
if (path !== '_id' || (path === '_id' && hasCustomID && field.type === 'text')) {
|
||||||
if (operator === 'contains') {
|
if (operator === 'contains') {
|
||||||
formattedValue = { $options: 'i', $regex: formattedValue }
|
formattedValue = {
|
||||||
|
$options: 'i',
|
||||||
|
$regex: formattedValue.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ export const commitTransaction: CommitTransaction = async function commitTransac
|
|||||||
}
|
}
|
||||||
|
|
||||||
await this.sessions[id].commitTransaction()
|
await this.sessions[id].commitTransaction()
|
||||||
|
try {
|
||||||
await this.sessions[id].endSession()
|
await this.sessions[id].endSession()
|
||||||
|
} catch (error) {
|
||||||
|
// ending sessions is only best effort and won't impact anything if it fails since the transaction was committed
|
||||||
|
}
|
||||||
delete this.sessions[id]
|
delete this.sessions[id]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { withSession } from './withSession'
|
|||||||
|
|
||||||
export const updateGlobal: UpdateGlobal = async function updateGlobal(
|
export const updateGlobal: UpdateGlobal = async function updateGlobal(
|
||||||
this: MongooseAdapter,
|
this: MongooseAdapter,
|
||||||
{ data, req = {} as PayloadRequest, slug },
|
{ slug, data, req = {} as PayloadRequest },
|
||||||
) {
|
) {
|
||||||
const Model = this.globals
|
const Model = this.globals
|
||||||
const options = {
|
const options = {
|
||||||
|
|||||||
41
packages/db-mongodb/src/utilities/getDBName.ts
Normal file
41
packages/db-mongodb/src/utilities/getDBName.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import type { DBIdentifierName } from 'payload/database'
|
||||||
|
|
||||||
|
type Args = {
|
||||||
|
config: {
|
||||||
|
dbName?: DBIdentifierName
|
||||||
|
enumName?: DBIdentifierName
|
||||||
|
name?: string
|
||||||
|
slug?: string
|
||||||
|
}
|
||||||
|
locales?: boolean
|
||||||
|
target?: 'dbName' | 'enumName'
|
||||||
|
versions?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to name database enums and collections
|
||||||
|
* Returns the collection or enum name for a given entity
|
||||||
|
*/
|
||||||
|
export const getDBName = ({
|
||||||
|
config: { name, slug },
|
||||||
|
config,
|
||||||
|
target = 'dbName',
|
||||||
|
versions = false,
|
||||||
|
}: Args): string => {
|
||||||
|
let result: string
|
||||||
|
let custom = config[target]
|
||||||
|
|
||||||
|
if (!custom && target === 'enumName') {
|
||||||
|
custom = config['dbName']
|
||||||
|
}
|
||||||
|
|
||||||
|
if (custom) {
|
||||||
|
result = typeof custom === 'function' ? custom({}) : custom
|
||||||
|
} else {
|
||||||
|
result = name ?? slug
|
||||||
|
}
|
||||||
|
|
||||||
|
if (versions) result = `_${result}_versions`
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@payloadcms/db-postgres",
|
"name": "@payloadcms/db-postgres",
|
||||||
"version": "0.6.0",
|
"version": "0.8.0",
|
||||||
"description": "The officially supported Postgres database adapter for Payload",
|
"description": "The officially supported Postgres database adapter for Payload",
|
||||||
"repository": "https://github.com/payloadcms/payload",
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/payloadcms/payload.git",
|
||||||
|
"directory": "packages/db-postgres"
|
||||||
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"homepage": "https://payloadcms.com",
|
"homepage": "https://payloadcms.com",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import type { Create } from 'payload/database'
|
import type { Create } from 'payload/database'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export const create: Create = async function create(
|
export const create: Create = async function create(
|
||||||
@@ -19,8 +18,11 @@ export const create: Create = async function create(
|
|||||||
db,
|
db,
|
||||||
fields: collection.fields,
|
fields: collection.fields,
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName: toSnakeCase(collectionSlug),
|
|
||||||
req,
|
req,
|
||||||
|
tableName: getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collection,
|
||||||
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
import type { CreateGlobalArgs } from 'payload/database'
|
import type { CreateGlobalArgs } from 'payload/database'
|
||||||
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export async function createGlobal<T extends TypeWithID>(
|
export async function createGlobal<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{ data, req = {} as PayloadRequest, slug }: CreateGlobalArgs,
|
{ slug, data, req = {} as PayloadRequest }: CreateGlobalArgs,
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
||||||
@@ -20,8 +19,11 @@ export async function createGlobal<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields: globalConfig.fields,
|
fields: globalConfig.fields,
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName: toSnakeCase(slug),
|
|
||||||
req,
|
req,
|
||||||
|
tableName: getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: globalConfig,
|
||||||
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import type { TypeWithVersion } from 'payload/database'
|
import type { TypeWithVersion } from 'payload/database'
|
||||||
import { type CreateGlobalVersionArgs } from 'payload/database'
|
|
||||||
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import { sql } from 'drizzle-orm'
|
import { sql } from 'drizzle-orm'
|
||||||
|
import { type CreateGlobalVersionArgs } from 'payload/database'
|
||||||
import { buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export async function createGlobalVersion<T extends TypeWithID>(
|
export async function createGlobalVersion<T extends TypeWithID>(
|
||||||
@@ -16,8 +16,11 @@ export async function createGlobalVersion<T extends TypeWithID>(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const global = this.payload.globals.config.find(({ slug }) => slug === globalSlug)
|
const global = this.payload.globals.config.find(({ slug }) => slug === globalSlug)
|
||||||
const globalTableName = toSnakeCase(globalSlug)
|
const tableName = getTableName({
|
||||||
const tableName = `_${globalTableName}_v`
|
adapter: this,
|
||||||
|
config: global,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
|
|
||||||
const result = await upsertRow<TypeWithVersion<T>>({
|
const result = await upsertRow<TypeWithVersion<T>>({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -29,8 +32,8 @@ export async function createGlobalVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields: buildVersionGlobalFields(global),
|
fields: buildVersionGlobalFields(global),
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName,
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
const table = this.tables[tableName]
|
const table = this.tables[tableName]
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ import type { PayloadRequest, TypeWithID } from 'payload/types'
|
|||||||
|
|
||||||
import { sql } from 'drizzle-orm'
|
import { sql } from 'drizzle-orm'
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export async function createVersion<T extends TypeWithID>(
|
export async function createVersion<T extends TypeWithID>(
|
||||||
@@ -21,8 +21,11 @@ export async function createVersion<T extends TypeWithID>(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collection = this.payload.collections[collectionSlug].config
|
const collection = this.payload.collections[collectionSlug].config
|
||||||
const collectionTableName = toSnakeCase(collectionSlug)
|
const tableName = getTableName({
|
||||||
const tableName = `_${collectionTableName}_v`
|
adapter: this,
|
||||||
|
config: collection,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
|
|
||||||
const result = await upsertRow<TypeWithVersion<T>>({
|
const result = await upsertRow<TypeWithVersion<T>>({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -35,12 +38,20 @@ export async function createVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields: buildVersionCollectionFields(collection),
|
fields: buildVersionCollectionFields(collection),
|
||||||
operation: 'create',
|
operation: 'create',
|
||||||
tableName,
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
const table = this.tables[tableName]
|
const table = this.tables[tableName]
|
||||||
const relationshipsTable = this.tables[`${tableName}_rels`]
|
const relationshipsTable =
|
||||||
|
this.tables[
|
||||||
|
getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collection,
|
||||||
|
relationships: true,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
|
]
|
||||||
|
|
||||||
if (collection.versions.drafts) {
|
if (collection.versions.drafts) {
|
||||||
await db.execute(sql`
|
await db.execute(sql`
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { DeleteMany } from 'payload/database'
|
|||||||
import type { PayloadRequest } from 'payload/types'
|
import type { PayloadRequest } from 'payload/types'
|
||||||
|
|
||||||
import { inArray } from 'drizzle-orm'
|
import { inArray } from 'drizzle-orm'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const deleteMany: DeleteMany = async function deleteMany(
|
export const deleteMany: DeleteMany = async function deleteMany(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -14,7 +14,7 @@ export const deleteMany: DeleteMany = async function deleteMany(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig = this.payload.collections[collection].config
|
const collectionConfig = this.payload.collections[collection].config
|
||||||
const tableName = toSnakeCase(collection)
|
const tableName = getTableName({ adapter: this, config: collectionConfig })
|
||||||
|
|
||||||
const result = await findMany({
|
const result = await findMany({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
|
|||||||
@@ -1,47 +1,71 @@
|
|||||||
import type { DeleteOne } from 'payload/database'
|
import type { DeleteOne } from 'payload/database'
|
||||||
import type { PayloadRequest } from 'payload/types'
|
import type { PayloadRequest } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
import { eq } from 'drizzle-orm'
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { buildFindManyArgs } from './find/buildFindManyArgs'
|
import { buildFindManyArgs } from './find/buildFindManyArgs'
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
|
import { selectDistinct } from './queries/selectDistinct'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { transform } from './transform/read'
|
import { transform } from './transform/read'
|
||||||
|
|
||||||
export const deleteOne: DeleteOne = async function deleteOne(
|
export const deleteOne: DeleteOne = async function deleteOne(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{ collection, req = {} as PayloadRequest, where: incomingWhere },
|
{ collection: collectionSlug, req = {} as PayloadRequest, where: whereArg },
|
||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig = this.payload.collections[collection].config
|
const collection = this.payload.collections[collectionSlug].config
|
||||||
const tableName = toSnakeCase(collection)
|
const tableName = getTableName({
|
||||||
|
|
||||||
const { where } = await buildQuery({
|
|
||||||
adapter: this,
|
adapter: this,
|
||||||
fields: collectionConfig.fields,
|
config: collection,
|
||||||
|
})
|
||||||
|
let docToDelete: Record<string, unknown>
|
||||||
|
|
||||||
|
const { joinAliases, joins, selectFields, where } = await buildQuery({
|
||||||
|
adapter: this,
|
||||||
|
fields: collection.fields,
|
||||||
|
locale: req.locale,
|
||||||
tableName,
|
tableName,
|
||||||
where: incomingWhere,
|
where: whereArg,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const selectDistinctResult = await selectDistinct({
|
||||||
|
adapter: this,
|
||||||
|
chainedMethods: [{ args: [1], method: 'limit' }],
|
||||||
|
db,
|
||||||
|
joinAliases,
|
||||||
|
joins,
|
||||||
|
selectFields,
|
||||||
|
tableName,
|
||||||
|
where,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (selectDistinctResult?.[0]?.id) {
|
||||||
|
docToDelete = await db.query[tableName].findFirst({
|
||||||
|
where: eq(this.tables[tableName].id, selectDistinctResult[0].id),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
const findManyArgs = buildFindManyArgs({
|
const findManyArgs = buildFindManyArgs({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
depth: 0,
|
depth: 0,
|
||||||
fields: collectionConfig.fields,
|
fields: collection.fields,
|
||||||
tableName,
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
findManyArgs.where = where
|
findManyArgs.where = where
|
||||||
|
|
||||||
const docToDelete = await db.query[tableName].findFirst(findManyArgs)
|
docToDelete = await db.query[tableName].findFirst(findManyArgs)
|
||||||
|
}
|
||||||
|
|
||||||
const result = transform({
|
const result = transform({
|
||||||
config: this.payload.config,
|
config: this.payload.config,
|
||||||
data: docToDelete,
|
data: docToDelete,
|
||||||
fields: collectionConfig.fields,
|
fields: collection.fields,
|
||||||
})
|
})
|
||||||
|
|
||||||
await db.delete(this.tables[tableName]).where(where)
|
await db.delete(this.tables[tableName]).where(eq(this.tables[tableName].id, docToDelete.id))
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
|||||||
|
|
||||||
import { inArray } from 'drizzle-orm'
|
import { inArray } from 'drizzle-orm'
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const deleteVersions: DeleteVersions = async function deleteVersion(
|
export const deleteVersions: DeleteVersions = async function deleteVersion(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -16,7 +16,11 @@ export const deleteVersions: DeleteVersions = async function deleteVersion(
|
|||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
|
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collectionConfig,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
const { docs } = await findMany({
|
const { docs } = await findMany({
|
||||||
|
|||||||
@@ -1,38 +1,41 @@
|
|||||||
import type { Find } from 'payload/database'
|
import type { Find } from 'payload/database'
|
||||||
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const find: Find = async function find(
|
export const find: Find = async function find(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{
|
{
|
||||||
collection,
|
collection,
|
||||||
limit: limitArg,
|
limit,
|
||||||
locale,
|
locale,
|
||||||
page = 1,
|
page = 1,
|
||||||
pagination,
|
pagination,
|
||||||
req = {} as PayloadRequest,
|
req = {} as PayloadRequest,
|
||||||
sort: sortArg,
|
sort: sortArg,
|
||||||
where: whereArg,
|
where,
|
||||||
},
|
},
|
||||||
) {
|
) {
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort
|
const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort
|
||||||
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collectionConfig,
|
||||||
|
})
|
||||||
|
|
||||||
return findMany({
|
return findMany({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
fields: collectionConfig.fields,
|
fields: collectionConfig.fields,
|
||||||
limit: limitArg,
|
limit,
|
||||||
locale,
|
locale,
|
||||||
page,
|
page,
|
||||||
pagination,
|
pagination,
|
||||||
req,
|
req,
|
||||||
sort,
|
sort,
|
||||||
tableName: toSnakeCase(collection),
|
tableName,
|
||||||
where: whereArg,
|
where,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export const buildFindManyArgs = ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adapter.tables[`${tableName}_rels`]) {
|
if (adapter.tables[`${tableName}${adapter.relationshipsSuffix}`]) {
|
||||||
result.with._rels = {
|
result.with._rels = {
|
||||||
columns: {
|
columns: {
|
||||||
id: false,
|
id: false,
|
||||||
@@ -63,7 +63,7 @@ export const buildFindManyArgs = ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adapter.tables[`${tableName}_locales`]) {
|
if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {
|
||||||
result.with._locales = _locales
|
result.with._locales = _locales
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import type { QueryPromise } from 'drizzle-orm'
|
||||||
|
|
||||||
export type ChainedMethods = {
|
export type ChainedMethods = {
|
||||||
args: unknown[]
|
args: unknown[]
|
||||||
method: string
|
method: string
|
||||||
@@ -8,7 +10,7 @@ export type ChainedMethods = {
|
|||||||
* @param methods
|
* @param methods
|
||||||
* @param query
|
* @param query
|
||||||
*/
|
*/
|
||||||
const chainMethods = ({ methods, query }): Promise<unknown> => {
|
const chainMethods = <T>({ methods, query }): QueryPromise<T> => {
|
||||||
return methods.reduce((query, { args, method }) => {
|
return methods.reduce((query, { args, method }) => {
|
||||||
return query[method](...args)
|
return query[method](...args)
|
||||||
}, query)
|
}, query)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import type { PostgresAdapter } from '../types'
|
|||||||
import type { ChainedMethods } from './chainMethods'
|
import type { ChainedMethods } from './chainMethods'
|
||||||
|
|
||||||
import buildQuery from '../queries/buildQuery'
|
import buildQuery from '../queries/buildQuery'
|
||||||
|
import { selectDistinct } from '../queries/selectDistinct'
|
||||||
import { transform } from '../transform/read'
|
import { transform } from '../transform/read'
|
||||||
import { buildFindManyArgs } from './buildFindManyArgs'
|
import { buildFindManyArgs } from './buildFindManyArgs'
|
||||||
import { chainMethods } from './chainMethods'
|
import { chainMethods } from './chainMethods'
|
||||||
@@ -39,7 +40,6 @@ export const findMany = async function find({
|
|||||||
let hasPrevPage: boolean
|
let hasPrevPage: boolean
|
||||||
let hasNextPage: boolean
|
let hasNextPage: boolean
|
||||||
let pagingCounter: number
|
let pagingCounter: number
|
||||||
let selectDistinctResult
|
|
||||||
|
|
||||||
const { joinAliases, joins, orderBy, selectFields, where } = await buildQuery({
|
const { joinAliases, joins, orderBy, selectFields, where } = await buildQuery({
|
||||||
adapter,
|
adapter,
|
||||||
@@ -69,36 +69,21 @@ export const findMany = async function find({
|
|||||||
tableName,
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
// only fetch IDs when a sort or where query is used that needs to be done on join tables, otherwise these can be done directly on the table in findMany
|
|
||||||
if (Object.keys(joins).length > 0 || joinAliases.length > 0) {
|
|
||||||
if (where) {
|
|
||||||
selectDistinctMethods.push({ args: [where], method: 'where' })
|
|
||||||
}
|
|
||||||
|
|
||||||
joinAliases.forEach(({ condition, table }) => {
|
|
||||||
selectDistinctMethods.push({
|
|
||||||
args: [table, condition],
|
|
||||||
method: 'leftJoin',
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Object.entries(joins).forEach(([joinTable, condition]) => {
|
|
||||||
if (joinTable) {
|
|
||||||
selectDistinctMethods.push({
|
|
||||||
args: [adapter.tables[joinTable], condition],
|
|
||||||
method: 'leftJoin',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
selectDistinctMethods.push({ args: [skip || (page - 1) * limit], method: 'offset' })
|
selectDistinctMethods.push({ args: [skip || (page - 1) * limit], method: 'offset' })
|
||||||
selectDistinctMethods.push({ args: [limit === 0 ? undefined : limit], method: 'limit' })
|
selectDistinctMethods.push({ args: [limit === 0 ? undefined : limit], method: 'limit' })
|
||||||
|
|
||||||
selectDistinctResult = await chainMethods({
|
const selectDistinctResult = await selectDistinct({
|
||||||
methods: selectDistinctMethods,
|
adapter,
|
||||||
query: db.selectDistinct(selectFields).from(table),
|
chainedMethods: selectDistinctMethods,
|
||||||
|
db,
|
||||||
|
joinAliases,
|
||||||
|
joins,
|
||||||
|
selectFields,
|
||||||
|
tableName,
|
||||||
|
where,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (selectDistinctResult) {
|
||||||
if (selectDistinctResult.length === 0) {
|
if (selectDistinctResult.length === 0) {
|
||||||
return {
|
return {
|
||||||
docs: [],
|
docs: [],
|
||||||
@@ -112,13 +97,14 @@ export const findMany = async function find({
|
|||||||
totalDocs: 0,
|
totalDocs: 0,
|
||||||
totalPages: 0,
|
totalPages: 0,
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
// set the id in an object for sorting later
|
// set the id in an object for sorting later
|
||||||
selectDistinctResult.forEach(({ id }, i) => {
|
selectDistinctResult.forEach(({ id }, i) => {
|
||||||
orderedIDMap[id as number | string] = i
|
orderedIDMap[id] = i
|
||||||
})
|
})
|
||||||
orderedIDs = Object.keys(orderedIDMap)
|
orderedIDs = Object.keys(orderedIDMap)
|
||||||
findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs)
|
findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
findManyArgs.limit = limitArg === 0 ? undefined : limitArg
|
findManyArgs.limit = limitArg === 0 ? undefined : limitArg
|
||||||
|
|
||||||
@@ -134,7 +120,7 @@ export const findMany = async function find({
|
|||||||
|
|
||||||
const findPromise = db.query[tableName].findMany(findManyArgs)
|
const findPromise = db.query[tableName].findMany(findManyArgs)
|
||||||
|
|
||||||
if (pagination !== false && (orderedIDs ? orderedIDs?.length >= limit : true)) {
|
if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) {
|
||||||
const selectCountMethods: ChainedMethods = []
|
const selectCountMethods: ChainedMethods = []
|
||||||
|
|
||||||
joinAliases.forEach(({ condition, table }) => {
|
joinAliases.forEach(({ condition, table }) => {
|
||||||
|
|||||||
@@ -2,11 +2,12 @@
|
|||||||
import type { Field } from 'payload/types'
|
import type { Field } from 'payload/types'
|
||||||
|
|
||||||
import { fieldAffectsData, tabHasName } from 'payload/types'
|
import { fieldAffectsData, tabHasName } from 'payload/types'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from '../types'
|
import type { PostgresAdapter } from '../types'
|
||||||
import type { Result } from './buildFindManyArgs'
|
import type { Result } from './buildFindManyArgs'
|
||||||
|
|
||||||
|
import { getTableName } from '../schema/getTableName'
|
||||||
|
|
||||||
type TraverseFieldArgs = {
|
type TraverseFieldArgs = {
|
||||||
_locales: Record<string, unknown>
|
_locales: Record<string, unknown>
|
||||||
adapter: PostgresAdapter
|
adapter: PostgresAdapter
|
||||||
@@ -78,9 +79,22 @@ export const traverseFields = ({
|
|||||||
with: {},
|
with: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
const arrayTableName = `${currentTableName}_${path}${toSnakeCase(field.name)}`
|
const arrayTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
parentTableName: currentTableName,
|
||||||
|
prefix: `${currentTableName}_${path}`,
|
||||||
|
})
|
||||||
|
|
||||||
if (adapter.tables[`${arrayTableName}_locales`]) withArray.with._locales = _locales
|
const arrayTableNameWithLocales = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
locales: true,
|
||||||
|
parentTableName: currentTableName,
|
||||||
|
prefix: `${currentTableName}_${path}`,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (adapter.tables[arrayTableNameWithLocales]) withArray.with._locales = _locales
|
||||||
currentArgs.with[`${path}${field.name}`] = withArray
|
currentArgs.with[`${path}${field.name}`] = withArray
|
||||||
|
|
||||||
traverseFields({
|
traverseFields({
|
||||||
@@ -128,9 +142,15 @@ export const traverseFields = ({
|
|||||||
with: {},
|
with: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
const tableName = `${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`
|
const tableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: block,
|
||||||
|
parentTableName: topLevelTableName,
|
||||||
|
prefix: `${topLevelTableName}_blocks_`,
|
||||||
|
})
|
||||||
|
|
||||||
if (adapter.tables[`${tableName}_locales`]) withBlock.with._locales = _locales
|
if (adapter.tables[`${tableName}${adapter.localesSuffix}`])
|
||||||
|
withBlock.with._locales = _locales
|
||||||
topLevelArgs.with[blockKey] = withBlock
|
topLevelArgs.with[blockKey] = withBlock
|
||||||
|
|
||||||
traverseFields({
|
traverseFields({
|
||||||
|
|||||||
@@ -1,17 +1,19 @@
|
|||||||
import type { FindGlobal } from 'payload/database'
|
import type { FindGlobal } from 'payload/database'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const findGlobal: FindGlobal = async function findGlobal(
|
export const findGlobal: FindGlobal = async function findGlobal(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{ locale, req, slug, where },
|
{ slug, locale, req, where },
|
||||||
) {
|
) {
|
||||||
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
||||||
const tableName = toSnakeCase(slug)
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: globalConfig,
|
||||||
|
})
|
||||||
|
|
||||||
const {
|
const {
|
||||||
docs: [doc],
|
docs: [doc],
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { FindGlobalVersions } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedGlobalConfig } from 'payload/types'
|
import type { PayloadRequest, SanitizedGlobalConfig } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const findGlobalVersions: FindGlobalVersions = async function findGlobalVersions(
|
export const findGlobalVersions: FindGlobalVersions = async function findGlobalVersions(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -27,7 +27,11 @@ export const findGlobalVersions: FindGlobalVersions = async function findGlobalV
|
|||||||
)
|
)
|
||||||
const sort = typeof sortArg === 'string' ? sortArg : '-createdAt'
|
const sort = typeof sortArg === 'string' ? sortArg : '-createdAt'
|
||||||
|
|
||||||
const tableName = `_${toSnakeCase(global)}_v`
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: globalConfig,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
const fields = buildVersionGlobalFields(globalConfig)
|
const fields = buildVersionGlobalFields(globalConfig)
|
||||||
|
|
||||||
return findMany({
|
return findMany({
|
||||||
|
|||||||
@@ -1,17 +1,20 @@
|
|||||||
import type { FindOneArgs } from 'payload/database'
|
import type { FindOneArgs } from 'payload/database'
|
||||||
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export async function findOne<T extends TypeWithID>(
|
export async function findOne<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{ collection, locale, req = {} as PayloadRequest, where: incomingWhere }: FindOneArgs,
|
{ collection, locale, req = {} as PayloadRequest, where }: FindOneArgs,
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collectionConfig,
|
||||||
|
})
|
||||||
|
|
||||||
const { docs } = await findMany({
|
const { docs } = await findMany({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -22,8 +25,8 @@ export async function findOne<T extends TypeWithID>(
|
|||||||
pagination: false,
|
pagination: false,
|
||||||
req,
|
req,
|
||||||
sort: undefined,
|
sort: undefined,
|
||||||
tableName: toSnakeCase(collection),
|
tableName,
|
||||||
where: incomingWhere,
|
where,
|
||||||
})
|
})
|
||||||
|
|
||||||
return docs?.[0] || null
|
return docs?.[0] || null
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { FindVersions } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const findVersions: FindVersions = async function findVersions(
|
export const findVersions: FindVersions = async function findVersions(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
@@ -25,7 +25,11 @@ export const findVersions: FindVersions = async function findVersions(
|
|||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort
|
const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort
|
||||||
|
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collectionConfig,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
return findMany({
|
return findMany({
|
||||||
|
|||||||
@@ -47,20 +47,24 @@ export function postgresAdapter(args: Args): PostgresAdapterResult {
|
|||||||
name: 'postgres',
|
name: 'postgres',
|
||||||
|
|
||||||
// Postgres-specific
|
// Postgres-specific
|
||||||
|
blockTableNames: {},
|
||||||
drizzle: undefined,
|
drizzle: undefined,
|
||||||
enums: {},
|
enums: {},
|
||||||
fieldConstraints: {},
|
fieldConstraints: {},
|
||||||
idType,
|
idType,
|
||||||
|
localesSuffix: args.localesSuffix || '_locales',
|
||||||
logger: args.logger,
|
logger: args.logger,
|
||||||
pgSchema: undefined,
|
pgSchema: undefined,
|
||||||
pool: undefined,
|
pool: undefined,
|
||||||
poolOptions: args.pool,
|
poolOptions: args.pool,
|
||||||
push: args.push,
|
push: args.push,
|
||||||
relations: {},
|
relations: {},
|
||||||
|
relationshipsSuffix: args.relationshipsSuffix || '_rels',
|
||||||
schema: {},
|
schema: {},
|
||||||
schemaName: args.schemaName,
|
schemaName: args.schemaName,
|
||||||
sessions: {},
|
sessions: {},
|
||||||
tables: {},
|
tables: {},
|
||||||
|
versionsSuffix: args.versionsSuffix || '_v',
|
||||||
|
|
||||||
// DatabaseAdapter
|
// DatabaseAdapter
|
||||||
beginTransaction,
|
beginTransaction,
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import type { SanitizedCollectionConfig } from 'payload/types'
|
|||||||
|
|
||||||
import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core'
|
import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core'
|
||||||
import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import { buildTable } from './schema/build'
|
import { buildTable } from './schema/build'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const init: Init = async function init(this: PostgresAdapter) {
|
export const init: Init = async function init(this: PostgresAdapter) {
|
||||||
if (this.schemaName) {
|
if (this.schemaName) {
|
||||||
@@ -25,7 +25,10 @@ export const init: Init = async function init(this: PostgresAdapter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => {
|
this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => {
|
||||||
const tableName = toSnakeCase(collection.slug)
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collection,
|
||||||
|
})
|
||||||
|
|
||||||
buildTable({
|
buildTable({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -37,10 +40,15 @@ export const init: Init = async function init(this: PostgresAdapter) {
|
|||||||
fields: collection.fields,
|
fields: collection.fields,
|
||||||
tableName,
|
tableName,
|
||||||
timestamps: collection.timestamps,
|
timestamps: collection.timestamps,
|
||||||
|
versions: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (collection.versions) {
|
if (collection.versions) {
|
||||||
const versionsTableName = `_${tableName}_v`
|
const versionsTableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collection,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
const versionFields = buildVersionCollectionFields(collection)
|
const versionFields = buildVersionCollectionFields(collection)
|
||||||
|
|
||||||
buildTable({
|
buildTable({
|
||||||
@@ -53,12 +61,13 @@ export const init: Init = async function init(this: PostgresAdapter) {
|
|||||||
fields: versionFields,
|
fields: versionFields,
|
||||||
tableName: versionsTableName,
|
tableName: versionsTableName,
|
||||||
timestamps: true,
|
timestamps: true,
|
||||||
|
versions: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.payload.config.globals.forEach((global) => {
|
this.payload.config.globals.forEach((global) => {
|
||||||
const tableName = toSnakeCase(global.slug)
|
const tableName = getTableName({ adapter: this, config: global })
|
||||||
|
|
||||||
buildTable({
|
buildTable({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -70,10 +79,11 @@ export const init: Init = async function init(this: PostgresAdapter) {
|
|||||||
fields: global.fields,
|
fields: global.fields,
|
||||||
tableName,
|
tableName,
|
||||||
timestamps: false,
|
timestamps: false,
|
||||||
|
versions: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (global.versions) {
|
if (global.versions) {
|
||||||
const versionsTableName = `_${tableName}_v`
|
const versionsTableName = getTableName({ adapter: this, config: global, versions: true })
|
||||||
const versionFields = buildVersionGlobalFields(global)
|
const versionFields = buildVersionGlobalFields(global)
|
||||||
|
|
||||||
buildTable({
|
buildTable({
|
||||||
@@ -86,6 +96,7 @@ export const init: Init = async function init(this: PostgresAdapter) {
|
|||||||
fields: versionFields,
|
fields: versionFields,
|
||||||
tableName: versionsTableName,
|
tableName: versionsTableName,
|
||||||
timestamps: true,
|
timestamps: true,
|
||||||
|
versions: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import { v4 as uuid } from 'uuid'
|
|||||||
import type { GenericColumn, GenericTable, PostgresAdapter } from '../types'
|
import type { GenericColumn, GenericTable, PostgresAdapter } from '../types'
|
||||||
import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery'
|
import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery'
|
||||||
|
|
||||||
|
import { getTableName } from '../schema/getTableName'
|
||||||
|
|
||||||
type Constraint = {
|
type Constraint = {
|
||||||
columnName: string
|
columnName: string
|
||||||
table: GenericTable | PgTableWithColumns<any>
|
table: GenericTable | PgTableWithColumns<any>
|
||||||
@@ -95,7 +97,7 @@ export const getTableColumnFromPath = ({
|
|||||||
field: {
|
field: {
|
||||||
name: 'id',
|
name: 'id',
|
||||||
type: adapter.idType === 'uuid' ? 'text' : 'number',
|
type: adapter.idType === 'uuid' ? 'text' : 'number',
|
||||||
} as TextField | NumberField,
|
} as NumberField | TextField,
|
||||||
table: adapter.tables[newTableName],
|
table: adapter.tables[newTableName],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -183,7 +185,13 @@ export const getTableColumnFromPath = ({
|
|||||||
|
|
||||||
case 'group': {
|
case 'group': {
|
||||||
if (locale && field.localized && adapter.payload.config.localization) {
|
if (locale && field.localized && adapter.payload.config.localization) {
|
||||||
newTableName = `${tableName}_locales`
|
newTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
locales: true,
|
||||||
|
parentTableName: tableName,
|
||||||
|
prefix: `${tableName}_`,
|
||||||
|
})
|
||||||
|
|
||||||
joins[tableName] = eq(
|
joins[tableName] = eq(
|
||||||
adapter.tables[tableName].id,
|
adapter.tables[tableName].id,
|
||||||
@@ -217,8 +225,92 @@ export const getTableColumnFromPath = ({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'select': {
|
||||||
|
if (field.hasMany) {
|
||||||
|
newTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
parentTableName: `${tableName}_${tableNameSuffix}`,
|
||||||
|
prefix: `${tableName}_${tableNameSuffix}`,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (locale && field.localized && adapter.payload.config.localization) {
|
||||||
|
joins[newTableName] = and(
|
||||||
|
eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent),
|
||||||
|
eq(adapter.tables[newTableName]._locale, locale),
|
||||||
|
)
|
||||||
|
if (locale !== 'all') {
|
||||||
|
constraints.push({
|
||||||
|
columnName: '_locale',
|
||||||
|
table: adapter.tables[newTableName],
|
||||||
|
value: locale,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
joins[newTableName] = eq(
|
||||||
|
adapter.tables[tableName].id,
|
||||||
|
adapter.tables[newTableName].parent,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
columnName: 'value',
|
||||||
|
constraints,
|
||||||
|
field,
|
||||||
|
table: adapter.tables[newTableName],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'text':
|
||||||
|
case 'number': {
|
||||||
|
if (field.hasMany) {
|
||||||
|
let tableType = 'texts'
|
||||||
|
let columnName = 'text'
|
||||||
|
if (field.type === 'number') {
|
||||||
|
tableType = 'numbers'
|
||||||
|
columnName = 'number'
|
||||||
|
}
|
||||||
|
newTableName = `${tableName}_${tableType}`
|
||||||
|
const joinConstraints = [
|
||||||
|
eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent),
|
||||||
|
eq(adapter.tables[newTableName].path, `${constraintPath}${field.name}`),
|
||||||
|
]
|
||||||
|
|
||||||
|
if (locale && field.localized && adapter.payload.config.localization) {
|
||||||
|
joins[newTableName] = and(
|
||||||
|
...joinConstraints,
|
||||||
|
eq(adapter.tables[newTableName]._locale, locale),
|
||||||
|
)
|
||||||
|
if (locale !== 'all') {
|
||||||
|
constraints.push({
|
||||||
|
columnName: 'locale',
|
||||||
|
table: adapter.tables[newTableName],
|
||||||
|
value: locale,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
joins[newTableName] = and(...joinConstraints)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
columnName,
|
||||||
|
constraints,
|
||||||
|
field,
|
||||||
|
table: adapter.tables[newTableName],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
case 'array': {
|
case 'array': {
|
||||||
newTableName = `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`
|
newTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
parentTableName: `${tableName}_${tableNameSuffix}`,
|
||||||
|
prefix: `${tableName}_${tableNameSuffix}`,
|
||||||
|
})
|
||||||
constraintPath = `${constraintPath}${field.name}.%.`
|
constraintPath = `${constraintPath}${field.name}.%.`
|
||||||
if (locale && field.localized && adapter.payload.config.localization) {
|
if (locale && field.localized && adapter.payload.config.localization) {
|
||||||
joins[newTableName] = and(
|
joins[newTableName] = and(
|
||||||
@@ -265,7 +357,12 @@ export const getTableColumnFromPath = ({
|
|||||||
const blockTypes = Array.isArray(value) ? value : [value]
|
const blockTypes = Array.isArray(value) ? value : [value]
|
||||||
blockTypes.forEach((blockType) => {
|
blockTypes.forEach((blockType) => {
|
||||||
const block = field.blocks.find((block) => block.slug === blockType)
|
const block = field.blocks.find((block) => block.slug === blockType)
|
||||||
newTableName = `${tableName}_blocks_${toSnakeCase(block.slug)}`
|
newTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: block,
|
||||||
|
parentTableName: tableName,
|
||||||
|
prefix: `${tableName}_blocks_`,
|
||||||
|
})
|
||||||
joins[newTableName] = eq(
|
joins[newTableName] = eq(
|
||||||
adapter.tables[tableName].id,
|
adapter.tables[tableName].id,
|
||||||
adapter.tables[newTableName]._parentID,
|
adapter.tables[newTableName]._parentID,
|
||||||
@@ -285,7 +382,12 @@ export const getTableColumnFromPath = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const hasBlockField = field.blocks.some((block) => {
|
const hasBlockField = field.blocks.some((block) => {
|
||||||
newTableName = `${tableName}_blocks_${toSnakeCase(block.slug)}`
|
newTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: block,
|
||||||
|
parentTableName: tableName,
|
||||||
|
prefix: `${tableName}_blocks_`,
|
||||||
|
})
|
||||||
constraintPath = `${constraintPath}${field.name}.%.`
|
constraintPath = `${constraintPath}${field.name}.%.`
|
||||||
let result
|
let result
|
||||||
const blockConstraints = []
|
const blockConstraints = []
|
||||||
@@ -351,7 +453,7 @@ export const getTableColumnFromPath = ({
|
|||||||
case 'relationship':
|
case 'relationship':
|
||||||
case 'upload': {
|
case 'upload': {
|
||||||
let relationshipFields
|
let relationshipFields
|
||||||
const relationTableName = `${rootTableName}_rels`
|
const relationTableName = `${rootTableName}${adapter.relationshipsSuffix}`
|
||||||
const newCollectionPath = pathSegments.slice(1).join('.')
|
const newCollectionPath = pathSegments.slice(1).join('.')
|
||||||
const aliasRelationshipTableName = uuid()
|
const aliasRelationshipTableName = uuid()
|
||||||
const aliasRelationshipTable = alias(
|
const aliasRelationshipTable = alias(
|
||||||
@@ -359,6 +461,23 @@ export const getTableColumnFromPath = ({
|
|||||||
aliasRelationshipTableName,
|
aliasRelationshipTableName,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (locale && field.localized && adapter.payload.config.localization) {
|
||||||
|
joinAliases.push({
|
||||||
|
condition: and(
|
||||||
|
eq((aliasTable || adapter.tables[rootTableName]).id, aliasRelationshipTable.parent),
|
||||||
|
eq(aliasRelationshipTable.locale, locale),
|
||||||
|
like(aliasRelationshipTable.path, `${constraintPath}${field.name}`),
|
||||||
|
),
|
||||||
|
table: aliasRelationshipTable,
|
||||||
|
})
|
||||||
|
if (locale !== 'all') {
|
||||||
|
constraints.push({
|
||||||
|
columnName: 'locale',
|
||||||
|
table: aliasRelationshipTable,
|
||||||
|
value: locale,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// Join in the relationships table
|
// Join in the relationships table
|
||||||
joinAliases.push({
|
joinAliases.push({
|
||||||
condition: and(
|
condition: and(
|
||||||
@@ -367,15 +486,20 @@ export const getTableColumnFromPath = ({
|
|||||||
),
|
),
|
||||||
table: aliasRelationshipTable,
|
table: aliasRelationshipTable,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
selectFields[`${relationTableName}.path`] = aliasRelationshipTable.path
|
selectFields[`${relationTableName}.path`] = aliasRelationshipTable.path
|
||||||
|
|
||||||
let newAliasTable
|
let newAliasTable
|
||||||
|
|
||||||
if (typeof field.relationTo === 'string') {
|
if (typeof field.relationTo === 'string') {
|
||||||
newTableName = `${toSnakeCase(field.relationTo)}`
|
const relationshipConfig = adapter.payload.collections[field.relationTo].config
|
||||||
|
newTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: relationshipConfig,
|
||||||
|
})
|
||||||
// parent to relationship join table
|
// parent to relationship join table
|
||||||
relationshipFields = adapter.payload.collections[field.relationTo].config.fields
|
relationshipFields = relationshipConfig.fields
|
||||||
|
|
||||||
newAliasTable = alias(adapter.tables[newTableName], toSnakeCase(uuid()))
|
newAliasTable = alias(adapter.tables[newTableName], toSnakeCase(uuid()))
|
||||||
|
|
||||||
@@ -394,7 +518,11 @@ export const getTableColumnFromPath = ({
|
|||||||
}
|
}
|
||||||
} else if (newCollectionPath === 'value') {
|
} else if (newCollectionPath === 'value') {
|
||||||
const tableColumnsNames = field.relationTo.map(
|
const tableColumnsNames = field.relationTo.map(
|
||||||
(relationTo) => `"${aliasRelationshipTableName}"."${toSnakeCase(relationTo)}_id"`,
|
(relationTo) =>
|
||||||
|
`"${aliasRelationshipTableName}"."${getTableName({
|
||||||
|
adapter,
|
||||||
|
config: adapter.payload.collections[relationTo].config,
|
||||||
|
})}_id"`,
|
||||||
)
|
)
|
||||||
return {
|
return {
|
||||||
constraints,
|
constraints,
|
||||||
@@ -435,13 +563,13 @@ export const getTableColumnFromPath = ({
|
|||||||
value,
|
value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
default: {
|
|
||||||
if (fieldAffectsData(field)) {
|
if (fieldAffectsData(field)) {
|
||||||
if (field.localized && adapter.payload.config.localization) {
|
if (field.localized && adapter.payload.config.localization) {
|
||||||
// If localized, we go to localized table and set aliasTable to undefined
|
// If localized, we go to localized table and set aliasTable to undefined
|
||||||
// so it is not picked up below to be used as targetTable
|
// so it is not picked up below to be used as targetTable
|
||||||
newTableName = `${tableName}_locales`
|
newTableName = `${tableName}${adapter.localesSuffix}`
|
||||||
|
|
||||||
const parentTable = aliasTable || adapter.tables[tableName]
|
const parentTable = aliasTable || adapter.tables[tableName]
|
||||||
|
|
||||||
@@ -472,8 +600,6 @@ export const getTableColumnFromPath = ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new APIError(`Cannot find field for path at ${fieldPath}`)
|
throw new APIError(`Cannot find field for path at ${fieldPath}`)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ export const sanitizeQueryValue = ({
|
|||||||
formattedValue = Number(val)
|
formattedValue = Number(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field.type === 'date') {
|
if (field.type === 'date' && operator !== 'exists') {
|
||||||
if (typeof val === 'string') {
|
if (typeof val === 'string') {
|
||||||
formattedValue = new Date(val)
|
formattedValue = new Date(val)
|
||||||
if (Number.isNaN(Date.parse(formattedValue))) {
|
if (Number.isNaN(Date.parse(formattedValue))) {
|
||||||
@@ -85,6 +85,10 @@ export const sanitizeQueryValue = ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ('hasMany' in field && field.hasMany && operator === 'contains') {
|
||||||
|
operator = 'equals'
|
||||||
|
}
|
||||||
|
|
||||||
if (operator === 'near' || operator === 'within' || operator === 'intersects') {
|
if (operator === 'near' || operator === 'within' || operator === 'intersects') {
|
||||||
throw new APIError(
|
throw new APIError(
|
||||||
`Querying with '${operator}' is not supported with the postgres database adapter.`,
|
`Querying with '${operator}' is not supported with the postgres database adapter.`,
|
||||||
|
|||||||
60
packages/db-postgres/src/queries/selectDistinct.ts
Normal file
60
packages/db-postgres/src/queries/selectDistinct.ts
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import type { QueryPromise, SQL } from 'drizzle-orm'
|
||||||
|
|
||||||
|
import type { ChainedMethods } from '../find/chainMethods'
|
||||||
|
import type { DrizzleDB, PostgresAdapter } from '../types'
|
||||||
|
import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery'
|
||||||
|
|
||||||
|
import { chainMethods } from '../find/chainMethods'
|
||||||
|
import { type GenericColumn } from '../types'
|
||||||
|
|
||||||
|
type Args = {
|
||||||
|
adapter: PostgresAdapter
|
||||||
|
chainedMethods?: ChainedMethods
|
||||||
|
db: DrizzleDB
|
||||||
|
joinAliases: BuildQueryJoinAliases
|
||||||
|
joins: BuildQueryJoins
|
||||||
|
selectFields: Record<string, GenericColumn>
|
||||||
|
tableName: string
|
||||||
|
where: SQL
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects distinct records from a table only if there are joins that need to be used, otherwise return null
|
||||||
|
*/
|
||||||
|
export const selectDistinct = ({
|
||||||
|
adapter,
|
||||||
|
chainedMethods = [],
|
||||||
|
db,
|
||||||
|
joinAliases,
|
||||||
|
joins,
|
||||||
|
selectFields,
|
||||||
|
tableName,
|
||||||
|
where,
|
||||||
|
}: Args): QueryPromise<Record<string, GenericColumn> & { id: number | string }[]> => {
|
||||||
|
if (Object.keys(joins).length > 0 || joinAliases.length > 0) {
|
||||||
|
if (where) {
|
||||||
|
chainedMethods.push({ args: [where], method: 'where' })
|
||||||
|
}
|
||||||
|
|
||||||
|
joinAliases.forEach(({ condition, table }) => {
|
||||||
|
chainedMethods.push({
|
||||||
|
args: [table, condition],
|
||||||
|
method: 'leftJoin',
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.entries(joins).forEach(([joinTable, condition]) => {
|
||||||
|
if (joinTable) {
|
||||||
|
chainedMethods.push({
|
||||||
|
args: [adapter.tables[joinTable], condition],
|
||||||
|
method: 'leftJoin',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return chainMethods({
|
||||||
|
methods: chainedMethods,
|
||||||
|
query: db.selectDistinct(selectFields).from(adapter.tables[tableName]),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,9 +2,9 @@ import type { PayloadRequest, SanitizedCollectionConfig } from 'payload/types'
|
|||||||
|
|
||||||
import { type QueryDrafts, combineQueries } from 'payload/database'
|
import { type QueryDrafts, combineQueries } from 'payload/database'
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import { findMany } from './find/findMany'
|
import { findMany } from './find/findMany'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
|
|
||||||
export const queryDrafts: QueryDrafts = async function queryDrafts({
|
export const queryDrafts: QueryDrafts = async function queryDrafts({
|
||||||
collection,
|
collection,
|
||||||
@@ -17,7 +17,11 @@ export const queryDrafts: QueryDrafts = async function queryDrafts({
|
|||||||
where,
|
where,
|
||||||
}) {
|
}) {
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collectionConfig,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
const combinedWhere = combineQueries({ latest: { equals: true } }, where)
|
const combinedWhere = combineQueries({ latest: { equals: true } }, where)
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import type { Field } from 'payload/types'
|
|||||||
import { relations } from 'drizzle-orm'
|
import { relations } from 'drizzle-orm'
|
||||||
import { index, integer, numeric, serial, timestamp, unique, varchar } from 'drizzle-orm/pg-core'
|
import { index, integer, numeric, serial, timestamp, unique, varchar } from 'drizzle-orm/pg-core'
|
||||||
import { fieldAffectsData } from 'payload/types'
|
import { fieldAffectsData } from 'payload/types'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { GenericColumns, GenericTable, IDType, PostgresAdapter } from '../types'
|
import type { GenericColumns, GenericTable, IDType, PostgresAdapter } from '../types'
|
||||||
|
|
||||||
|
import { getTableName } from './getTableName'
|
||||||
import { parentIDColumnMap } from './parentIDColumnMap'
|
import { parentIDColumnMap } from './parentIDColumnMap'
|
||||||
import { setColumnID } from './setColumnID'
|
import { setColumnID } from './setColumnID'
|
||||||
import { traverseFields } from './traverseFields'
|
import { traverseFields } from './traverseFields'
|
||||||
@@ -35,6 +35,7 @@ type Args = {
|
|||||||
rootTableName?: string
|
rootTableName?: string
|
||||||
tableName: string
|
tableName: string
|
||||||
timestamps?: boolean
|
timestamps?: boolean
|
||||||
|
versions: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
type Result = {
|
type Result = {
|
||||||
@@ -59,6 +60,7 @@ export const buildTable = ({
|
|||||||
rootTableName: incomingRootTableName,
|
rootTableName: incomingRootTableName,
|
||||||
tableName,
|
tableName,
|
||||||
timestamps,
|
timestamps,
|
||||||
|
versions,
|
||||||
}: Args): Result => {
|
}: Args): Result => {
|
||||||
const rootTableName = incomingRootTableName || tableName
|
const rootTableName = incomingRootTableName || tableName
|
||||||
const columns: Record<string, PgColumnBuilder> = baseColumns
|
const columns: Record<string, PgColumnBuilder> = baseColumns
|
||||||
@@ -113,6 +115,7 @@ export const buildTable = ({
|
|||||||
rootRelationsToBuild: rootRelationsToBuild || relationsToBuild,
|
rootRelationsToBuild: rootRelationsToBuild || relationsToBuild,
|
||||||
rootTableIDColType: rootTableIDColType || idColType,
|
rootTableIDColType: rootTableIDColType || idColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
|
versions,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
if (timestamps) {
|
if (timestamps) {
|
||||||
@@ -147,7 +150,7 @@ export const buildTable = ({
|
|||||||
adapter.tables[tableName] = table
|
adapter.tables[tableName] = table
|
||||||
|
|
||||||
if (hasLocalizedField) {
|
if (hasLocalizedField) {
|
||||||
const localeTableName = `${tableName}_locales`
|
const localeTableName = `${tableName}${adapter.localesSuffix}`
|
||||||
localesColumns.id = serial('id').primaryKey()
|
localesColumns.id = serial('id').primaryKey()
|
||||||
localesColumns._locale = adapter.enums.enum__locales('_locale').notNull()
|
localesColumns._locale = adapter.enums.enum__locales('_locale').notNull()
|
||||||
localesColumns._parentID = parentIDColumnMap[idColType]('_parent_id')
|
localesColumns._parentID = parentIDColumnMap[idColType]('_parent_id')
|
||||||
@@ -288,11 +291,16 @@ export const buildTable = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
relationships.forEach((relationTo) => {
|
relationships.forEach((relationTo) => {
|
||||||
const formattedRelationTo = toSnakeCase(relationTo)
|
const relationshipConfig = adapter.payload.collections[relationTo].config
|
||||||
|
const formattedRelationTo = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: relationshipConfig,
|
||||||
|
throwValidationError: true,
|
||||||
|
})
|
||||||
let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer'
|
let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer'
|
||||||
const relatedCollectionCustomID = adapter.payload.collections[
|
const relatedCollectionCustomID = relationshipConfig.fields.find(
|
||||||
relationTo
|
(field) => fieldAffectsData(field) && field.name === 'id',
|
||||||
].config.fields.find((field) => fieldAffectsData(field) && field.name === 'id')
|
)
|
||||||
if (relatedCollectionCustomID?.type === 'number') colType = 'numeric'
|
if (relatedCollectionCustomID?.type === 'number') colType = 'numeric'
|
||||||
if (relatedCollectionCustomID?.type === 'text') colType = 'varchar'
|
if (relatedCollectionCustomID?.type === 'text') colType = 'varchar'
|
||||||
|
|
||||||
@@ -301,7 +309,7 @@ export const buildTable = ({
|
|||||||
).references(() => adapter.tables[formattedRelationTo].id, { onDelete: 'cascade' })
|
).references(() => adapter.tables[formattedRelationTo].id, { onDelete: 'cascade' })
|
||||||
})
|
})
|
||||||
|
|
||||||
const relationshipsTableName = `${tableName}_rels`
|
const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`
|
||||||
|
|
||||||
relationshipsTable = adapter.pgSchema.table(
|
relationshipsTable = adapter.pgSchema.table(
|
||||||
relationshipsTableName,
|
relationshipsTableName,
|
||||||
@@ -333,7 +341,11 @@ export const buildTable = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
relationships.forEach((relationTo) => {
|
relationships.forEach((relationTo) => {
|
||||||
const relatedTableName = toSnakeCase(relationTo)
|
const relatedTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: adapter.payload.collections[relationTo].config,
|
||||||
|
throwValidationError: true,
|
||||||
|
})
|
||||||
const idColumnName = `${relationTo}ID`
|
const idColumnName = `${relationTo}ID`
|
||||||
result[idColumnName] = one(adapter.tables[relatedTableName], {
|
result[idColumnName] = one(adapter.tables[relatedTableName], {
|
||||||
fields: [relationshipsTable[idColumnName]],
|
fields: [relationshipsTable[idColumnName]],
|
||||||
|
|||||||
75
packages/db-postgres/src/schema/getTableName.ts
Normal file
75
packages/db-postgres/src/schema/getTableName.ts
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import type { DBIdentifierName } from 'payload/database'
|
||||||
|
|
||||||
|
import { APIError } from 'payload/errors'
|
||||||
|
import toSnakeCase from 'to-snake-case'
|
||||||
|
|
||||||
|
import type { PostgresAdapter } from '../types'
|
||||||
|
|
||||||
|
type Args = {
|
||||||
|
adapter: PostgresAdapter
|
||||||
|
/** The collection, global or field config **/
|
||||||
|
config: {
|
||||||
|
dbName?: DBIdentifierName
|
||||||
|
enumName?: DBIdentifierName
|
||||||
|
name?: string
|
||||||
|
slug?: string
|
||||||
|
}
|
||||||
|
/** Localized tables need to be given the locales suffix */
|
||||||
|
locales?: boolean
|
||||||
|
/** For nested tables passed for the user custom dbName functions to handle their own iterations */
|
||||||
|
parentTableName?: string
|
||||||
|
/** For sub tables (array for example) this needs to include the parentTableName */
|
||||||
|
prefix?: string
|
||||||
|
/** Adds the relationships suffix */
|
||||||
|
relationships?: boolean
|
||||||
|
/** For tables based on fields that could have both enumName and dbName (ie: select with hasMany), default: 'dbName' */
|
||||||
|
target?: 'dbName' | 'enumName'
|
||||||
|
throwValidationError?: boolean
|
||||||
|
/** Adds the versions suffix, should only be used on the base collection to duplicate suffixing */
|
||||||
|
versions?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to name database enums and tables
|
||||||
|
* Returns the table or enum name for a given entity
|
||||||
|
*/
|
||||||
|
export const getTableName = ({
|
||||||
|
adapter,
|
||||||
|
config: { name, slug },
|
||||||
|
config,
|
||||||
|
locales = false,
|
||||||
|
parentTableName,
|
||||||
|
prefix = '',
|
||||||
|
relationships = false,
|
||||||
|
target = 'dbName',
|
||||||
|
throwValidationError = false,
|
||||||
|
versions = false,
|
||||||
|
}: Args): string => {
|
||||||
|
let result: string
|
||||||
|
let custom = config[target]
|
||||||
|
|
||||||
|
if (!custom && target === 'enumName') {
|
||||||
|
custom = config['dbName']
|
||||||
|
}
|
||||||
|
|
||||||
|
if (custom) {
|
||||||
|
result = typeof custom === 'function' ? custom({ tableName: parentTableName }) : custom
|
||||||
|
} else {
|
||||||
|
result = `${prefix}${toSnakeCase(name ?? slug)}`
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locales) result = `${result}${adapter.localesSuffix}`
|
||||||
|
if (versions) result = `_${result}${adapter.versionsSuffix}`
|
||||||
|
if (relationships) result = `${result}${adapter.relationshipsSuffix}`
|
||||||
|
|
||||||
|
if (!throwValidationError) {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.length > 63) {
|
||||||
|
throw new APIError(
|
||||||
|
`Exceeded max identifier length for table or enum name of 63 characters. Invalid name: ${result}`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ import type { GenericColumns, IDType, PostgresAdapter } from '../types'
|
|||||||
import { hasLocalesTable } from '../utilities/hasLocalesTable'
|
import { hasLocalesTable } from '../utilities/hasLocalesTable'
|
||||||
import { buildTable } from './build'
|
import { buildTable } from './build'
|
||||||
import { createIndex } from './createIndex'
|
import { createIndex } from './createIndex'
|
||||||
|
import { getTableName } from './getTableName'
|
||||||
import { idToUUID } from './idToUUID'
|
import { idToUUID } from './idToUUID'
|
||||||
import { parentIDColumnMap } from './parentIDColumnMap'
|
import { parentIDColumnMap } from './parentIDColumnMap'
|
||||||
import { validateExistingBlockIsIdentical } from './validateExistingBlockIsIdentical'
|
import { validateExistingBlockIsIdentical } from './validateExistingBlockIsIdentical'
|
||||||
@@ -53,6 +54,7 @@ type Args = {
|
|||||||
rootRelationsToBuild?: Map<string, string>
|
rootRelationsToBuild?: Map<string, string>
|
||||||
rootTableIDColType: string
|
rootTableIDColType: string
|
||||||
rootTableName: string
|
rootTableName: string
|
||||||
|
versions: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
type Result = {
|
type Result = {
|
||||||
@@ -86,7 +88,9 @@ export const traverseFields = ({
|
|||||||
rootRelationsToBuild,
|
rootRelationsToBuild,
|
||||||
rootTableIDColType,
|
rootTableIDColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
|
versions,
|
||||||
}: Args): Result => {
|
}: Args): Result => {
|
||||||
|
const throwValidationError = true
|
||||||
let hasLocalizedField = false
|
let hasLocalizedField = false
|
||||||
let hasLocalizedRelationshipField = false
|
let hasLocalizedRelationshipField = false
|
||||||
let hasManyTextField: 'index' | boolean = false
|
let hasManyTextField: 'index' | boolean = false
|
||||||
@@ -217,7 +221,15 @@ export const traverseFields = ({
|
|||||||
|
|
||||||
case 'radio':
|
case 'radio':
|
||||||
case 'select': {
|
case 'select': {
|
||||||
const enumName = `enum_${newTableName}_${toSnakeCase(field.name)}`
|
const enumName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
parentTableName: newTableName,
|
||||||
|
prefix: `enum_${newTableName}_`,
|
||||||
|
target: 'enumName',
|
||||||
|
throwValidationError,
|
||||||
|
versions,
|
||||||
|
})
|
||||||
|
|
||||||
adapter.enums[enumName] = pgEnum(
|
adapter.enums[enumName] = pgEnum(
|
||||||
enumName,
|
enumName,
|
||||||
@@ -231,7 +243,14 @@ export const traverseFields = ({
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (field.type === 'select' && field.hasMany) {
|
if (field.type === 'select' && field.hasMany) {
|
||||||
const selectTableName = `${newTableName}_${toSnakeCase(field.name)}`
|
const selectTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
parentTableName: newTableName,
|
||||||
|
prefix: `${newTableName}_`,
|
||||||
|
throwValidationError,
|
||||||
|
versions,
|
||||||
|
})
|
||||||
const baseColumns: Record<string, PgColumnBuilder> = {
|
const baseColumns: Record<string, PgColumnBuilder> = {
|
||||||
order: integer('order').notNull(),
|
order: integer('order').notNull(),
|
||||||
parent: parentIDColumnMap[parentIDColType]('parent_id')
|
parent: parentIDColumnMap[parentIDColType]('parent_id')
|
||||||
@@ -266,6 +285,7 @@ export const traverseFields = ({
|
|||||||
disableUnique,
|
disableUnique,
|
||||||
fields: [],
|
fields: [],
|
||||||
tableName: selectTableName,
|
tableName: selectTableName,
|
||||||
|
versions,
|
||||||
})
|
})
|
||||||
|
|
||||||
relationsToBuild.set(fieldName, selectTableName)
|
relationsToBuild.set(fieldName, selectTableName)
|
||||||
@@ -296,7 +316,13 @@ export const traverseFields = ({
|
|||||||
case 'array': {
|
case 'array': {
|
||||||
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
||||||
|
|
||||||
const arrayTableName = `${newTableName}_${toSnakeCase(field.name)}`
|
const arrayTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
parentTableName: newTableName,
|
||||||
|
prefix: `${newTableName}_`,
|
||||||
|
throwValidationError,
|
||||||
|
})
|
||||||
const baseColumns: Record<string, PgColumnBuilder> = {
|
const baseColumns: Record<string, PgColumnBuilder> = {
|
||||||
_order: integer('_order').notNull(),
|
_order: integer('_order').notNull(),
|
||||||
_parentID: parentIDColumnMap[parentIDColType]('_parent_id')
|
_parentID: parentIDColumnMap[parentIDColType]('_parent_id')
|
||||||
@@ -334,6 +360,7 @@ export const traverseFields = ({
|
|||||||
rootTableIDColType,
|
rootTableIDColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
tableName: arrayTableName,
|
tableName: arrayTableName,
|
||||||
|
versions,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (subHasManyTextField) {
|
if (subHasManyTextField) {
|
||||||
@@ -356,7 +383,7 @@ export const traverseFields = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hasLocalesTable(field.fields)) {
|
if (hasLocalesTable(field.fields)) {
|
||||||
result._locales = many(adapter.tables[`${arrayTableName}_locales`])
|
result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`])
|
||||||
}
|
}
|
||||||
|
|
||||||
subRelationsToBuild.forEach((val, key) => {
|
subRelationsToBuild.forEach((val, key) => {
|
||||||
@@ -375,7 +402,13 @@ export const traverseFields = ({
|
|||||||
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull
|
||||||
|
|
||||||
field.blocks.forEach((block) => {
|
field.blocks.forEach((block) => {
|
||||||
const blockTableName = `${rootTableName}_blocks_${toSnakeCase(block.slug)}`
|
const blockTableName = getTableName({
|
||||||
|
adapter,
|
||||||
|
config: block,
|
||||||
|
parentTableName: rootTableName,
|
||||||
|
prefix: `${rootTableName}_blocks_`,
|
||||||
|
throwValidationError,
|
||||||
|
})
|
||||||
if (!adapter.tables[blockTableName]) {
|
if (!adapter.tables[blockTableName]) {
|
||||||
const baseColumns: Record<string, PgColumnBuilder> = {
|
const baseColumns: Record<string, PgColumnBuilder> = {
|
||||||
_order: integer('_order').notNull(),
|
_order: integer('_order').notNull(),
|
||||||
@@ -416,6 +449,7 @@ export const traverseFields = ({
|
|||||||
rootTableIDColType,
|
rootTableIDColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
tableName: blockTableName,
|
tableName: blockTableName,
|
||||||
|
versions,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (subHasManyTextField) {
|
if (subHasManyTextField) {
|
||||||
@@ -439,7 +473,9 @@ export const traverseFields = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hasLocalesTable(block.fields)) {
|
if (hasLocalesTable(block.fields)) {
|
||||||
result._locales = many(adapter.tables[`${blockTableName}_locales`])
|
result._locales = many(
|
||||||
|
adapter.tables[`${blockTableName}${adapter.localesSuffix}`],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
subRelationsToBuild.forEach((val, key) => {
|
subRelationsToBuild.forEach((val, key) => {
|
||||||
@@ -451,15 +487,16 @@ export const traverseFields = ({
|
|||||||
)
|
)
|
||||||
|
|
||||||
adapter.relations[`relations_${blockTableName}`] = blockTableRelations
|
adapter.relations[`relations_${blockTableName}`] = blockTableRelations
|
||||||
} else if (process.env.NODE_ENV !== 'production') {
|
} else if (process.env.NODE_ENV !== 'production' && !versions) {
|
||||||
validateExistingBlockIsIdentical({
|
validateExistingBlockIsIdentical({
|
||||||
block,
|
block,
|
||||||
localized: field.localized,
|
localized: field.localized,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
table: adapter.tables[blockTableName],
|
table: adapter.tables[blockTableName],
|
||||||
|
tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
adapter.blockTableNames[`${rootTableName}.${toSnakeCase(block.slug)}`] = blockTableName
|
||||||
rootRelationsToBuild.set(`_blocks_${block.slug}`, blockTableName)
|
rootRelationsToBuild.set(`_blocks_${block.slug}`, blockTableName)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -498,6 +535,7 @@ export const traverseFields = ({
|
|||||||
rootRelationsToBuild,
|
rootRelationsToBuild,
|
||||||
rootTableIDColType,
|
rootTableIDColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
|
versions,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (groupHasLocalizedField) hasLocalizedField = true
|
if (groupHasLocalizedField) hasLocalizedField = true
|
||||||
@@ -540,6 +578,7 @@ export const traverseFields = ({
|
|||||||
rootRelationsToBuild,
|
rootRelationsToBuild,
|
||||||
rootTableIDColType,
|
rootTableIDColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
|
versions,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (groupHasLocalizedField) hasLocalizedField = true
|
if (groupHasLocalizedField) hasLocalizedField = true
|
||||||
@@ -583,6 +622,7 @@ export const traverseFields = ({
|
|||||||
rootRelationsToBuild,
|
rootRelationsToBuild,
|
||||||
rootTableIDColType,
|
rootTableIDColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
|
versions,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (tabHasLocalizedField) hasLocalizedField = true
|
if (tabHasLocalizedField) hasLocalizedField = true
|
||||||
@@ -626,6 +666,7 @@ export const traverseFields = ({
|
|||||||
rootRelationsToBuild,
|
rootRelationsToBuild,
|
||||||
rootTableIDColType,
|
rootTableIDColType,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
|
versions,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (rowHasLocalizedField) hasLocalizedField = true
|
if (rowHasLocalizedField) hasLocalizedField = true
|
||||||
|
|||||||
@@ -10,9 +10,13 @@ type Args = {
|
|||||||
localized: boolean
|
localized: boolean
|
||||||
rootTableName: string
|
rootTableName: string
|
||||||
table: GenericTable
|
table: GenericTable
|
||||||
|
tableLocales?: GenericTable
|
||||||
}
|
}
|
||||||
|
|
||||||
const getFlattenedFieldNames = (fields: Field[], prefix: string = ''): string[] => {
|
const getFlattenedFieldNames = (
|
||||||
|
fields: Field[],
|
||||||
|
prefix: string = '',
|
||||||
|
): { localized?: boolean; name: string }[] => {
|
||||||
return fields.reduce((fieldsToUse, field) => {
|
return fields.reduce((fieldsToUse, field) => {
|
||||||
let fieldPrefix = prefix
|
let fieldPrefix = prefix
|
||||||
|
|
||||||
@@ -44,7 +48,13 @@ const getFlattenedFieldNames = (fields: Field[], prefix: string = ''): string[]
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fieldAffectsData(field)) {
|
if (fieldAffectsData(field)) {
|
||||||
return [...fieldsToUse, `${fieldPrefix?.replace('.', '_') || ''}${field.name}`]
|
return [
|
||||||
|
...fieldsToUse,
|
||||||
|
{
|
||||||
|
name: `${fieldPrefix?.replace('.', '_') || ''}${field.name}`,
|
||||||
|
localized: field.localized,
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
return fieldsToUse
|
return fieldsToUse
|
||||||
@@ -56,22 +66,25 @@ export const validateExistingBlockIsIdentical = ({
|
|||||||
localized,
|
localized,
|
||||||
rootTableName,
|
rootTableName,
|
||||||
table,
|
table,
|
||||||
|
tableLocales,
|
||||||
}: Args): void => {
|
}: Args): void => {
|
||||||
const fieldNames = getFlattenedFieldNames(block.fields)
|
const fieldNames = getFlattenedFieldNames(block.fields)
|
||||||
|
|
||||||
const missingField =
|
const missingField =
|
||||||
// ensure every field from the config is in the matching table
|
// ensure every field from the config is in the matching table
|
||||||
fieldNames.find((name) => Object.keys(table).indexOf(name) === -1) ||
|
fieldNames.find(({ name, localized }) => {
|
||||||
|
const fieldTable = localized && tableLocales ? tableLocales : table
|
||||||
|
return Object.keys(fieldTable).indexOf(name) === -1
|
||||||
|
}) ||
|
||||||
// ensure every table column is matched for every field from the config
|
// ensure every table column is matched for every field from the config
|
||||||
Object.keys(table).find((fieldName) => {
|
Object.keys(table).find((fieldName) => {
|
||||||
if (!['_locale', '_order', '_parentID', '_path', '_uuid'].includes(fieldName)) {
|
if (!['_locale', '_order', '_parentID', '_path', '_uuid'].includes(fieldName)) {
|
||||||
return fieldNames.indexOf(fieldName) === -1
|
return fieldNames.findIndex((field) => field.name) === -1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (missingField) {
|
if (missingField) {
|
||||||
throw new InvalidConfiguration(
|
throw new InvalidConfiguration(
|
||||||
`The table ${rootTableName} has multiple blocks with slug ${block.slug}, but the schemas do not match. One block includes the field ${missingField}, while the other block does not.`,
|
`The table ${rootTableName} has multiple blocks with slug ${block.slug}, but the schemas do not match. One block includes the field ${typeof missingField === 'string' ? missingField : missingField.name}, while the other block does not.`,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ type Args = {
|
|||||||
data: Record<string, unknown>[]
|
data: Record<string, unknown>[]
|
||||||
field: BlockField
|
field: BlockField
|
||||||
locale?: string
|
locale?: string
|
||||||
texts: Record<string, unknown>[]
|
|
||||||
numbers: Record<string, unknown>[]
|
numbers: Record<string, unknown>[]
|
||||||
path: string
|
path: string
|
||||||
relationships: Record<string, unknown>[]
|
relationships: Record<string, unknown>[]
|
||||||
@@ -26,6 +25,7 @@ type Args = {
|
|||||||
selects: {
|
selects: {
|
||||||
[tableName: string]: Record<string, unknown>[]
|
[tableName: string]: Record<string, unknown>[]
|
||||||
}
|
}
|
||||||
|
texts: Record<string, unknown>[]
|
||||||
}
|
}
|
||||||
export const transformBlocks = ({
|
export const transformBlocks = ({
|
||||||
adapter,
|
adapter,
|
||||||
@@ -35,12 +35,12 @@ export const transformBlocks = ({
|
|||||||
data,
|
data,
|
||||||
field,
|
field,
|
||||||
locale,
|
locale,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
path,
|
path,
|
||||||
relationships,
|
relationships,
|
||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
}: Args) => {
|
}: Args) => {
|
||||||
data.forEach((blockRow, i) => {
|
data.forEach((blockRow, i) => {
|
||||||
if (typeof blockRow.blockType !== 'string') return
|
if (typeof blockRow.blockType !== 'string') return
|
||||||
@@ -86,7 +86,6 @@ export const transformBlocks = ({
|
|||||||
fieldPrefix: '',
|
fieldPrefix: '',
|
||||||
fields: matchedBlock.fields,
|
fields: matchedBlock.fields,
|
||||||
locales: newRow.locales,
|
locales: newRow.locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName: blockTableName,
|
parentTableName: blockTableName,
|
||||||
path: `${path || ''}${field.name}.${i}.`,
|
path: `${path || ''}${field.name}.${i}.`,
|
||||||
@@ -94,6 +93,7 @@ export const transformBlocks = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row: newRow.row,
|
row: newRow.row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
|
|
||||||
blocks[blockType].push(newRow)
|
blocks[blockType].push(newRow)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import toSnakeCase from 'to-snake-case'
|
|||||||
import type { PostgresAdapter } from '../../types'
|
import type { PostgresAdapter } from '../../types'
|
||||||
import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types'
|
import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from '../../schema/getTableName'
|
||||||
import { isArrayOfRows } from '../../utilities/isArrayOfRows'
|
import { isArrayOfRows } from '../../utilities/isArrayOfRows'
|
||||||
import { transformArray } from './array'
|
import { transformArray } from './array'
|
||||||
import { transformBlocks } from './blocks'
|
import { transformBlocks } from './blocks'
|
||||||
@@ -45,7 +46,6 @@ type Args = {
|
|||||||
locales: {
|
locales: {
|
||||||
[locale: string]: Record<string, unknown>
|
[locale: string]: Record<string, unknown>
|
||||||
}
|
}
|
||||||
texts: Record<string, unknown>[]
|
|
||||||
numbers: Record<string, unknown>[]
|
numbers: Record<string, unknown>[]
|
||||||
/**
|
/**
|
||||||
* This is the name of the parent table
|
* This is the name of the parent table
|
||||||
@@ -58,6 +58,7 @@ type Args = {
|
|||||||
selects: {
|
selects: {
|
||||||
[tableName: string]: Record<string, unknown>[]
|
[tableName: string]: Record<string, unknown>[]
|
||||||
}
|
}
|
||||||
|
texts: Record<string, unknown>[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export const traverseFields = ({
|
export const traverseFields = ({
|
||||||
@@ -73,7 +74,6 @@ export const traverseFields = ({
|
|||||||
fields,
|
fields,
|
||||||
forcedLocale,
|
forcedLocale,
|
||||||
locales,
|
locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName,
|
parentTableName,
|
||||||
path,
|
path,
|
||||||
@@ -81,6 +81,7 @@ export const traverseFields = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row,
|
row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
}: Args) => {
|
}: Args) => {
|
||||||
fields.forEach((field) => {
|
fields.forEach((field) => {
|
||||||
let columnName = ''
|
let columnName = ''
|
||||||
@@ -88,7 +89,12 @@ export const traverseFields = ({
|
|||||||
let fieldData: unknown
|
let fieldData: unknown
|
||||||
|
|
||||||
if (fieldAffectsData(field)) {
|
if (fieldAffectsData(field)) {
|
||||||
columnName = `${columnPrefix || ''}${toSnakeCase(field.name)}`
|
columnName = `${columnPrefix || ''}${getTableName({
|
||||||
|
adapter,
|
||||||
|
config: field,
|
||||||
|
// do not pass columnPrefix here because it is required and custom dbNames also need it
|
||||||
|
prefix: '',
|
||||||
|
})}`
|
||||||
fieldName = `${fieldPrefix || ''}${field.name}`
|
fieldName = `${fieldPrefix || ''}${field.name}`
|
||||||
fieldData = data[field.name]
|
fieldData = data[field.name]
|
||||||
}
|
}
|
||||||
@@ -111,12 +117,12 @@ export const traverseFields = ({
|
|||||||
data: localeData,
|
data: localeData,
|
||||||
field,
|
field,
|
||||||
locale: localeKey,
|
locale: localeKey,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
path,
|
path,
|
||||||
relationships,
|
relationships,
|
||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
|
|
||||||
arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)
|
arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)
|
||||||
@@ -132,12 +138,12 @@ export const traverseFields = ({
|
|||||||
blocksToDelete,
|
blocksToDelete,
|
||||||
data: data[field.name],
|
data: data[field.name],
|
||||||
field,
|
field,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
path,
|
path,
|
||||||
relationships,
|
relationships,
|
||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
|
|
||||||
arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)
|
arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)
|
||||||
@@ -147,8 +153,8 @@ export const traverseFields = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (field.type === 'blocks') {
|
if (field.type === 'blocks') {
|
||||||
field.blocks.forEach(({ slug }) => {
|
field.blocks.forEach((block) => {
|
||||||
blocksToDelete.add(toSnakeCase(slug))
|
blocksToDelete.add(getTableName({ adapter, config: block }))
|
||||||
})
|
})
|
||||||
|
|
||||||
if (field.localized) {
|
if (field.localized) {
|
||||||
@@ -163,12 +169,12 @@ export const traverseFields = ({
|
|||||||
data: localeData,
|
data: localeData,
|
||||||
field,
|
field,
|
||||||
locale: localeKey,
|
locale: localeKey,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
path,
|
path,
|
||||||
relationships,
|
relationships,
|
||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -181,12 +187,12 @@ export const traverseFields = ({
|
|||||||
blocksToDelete,
|
blocksToDelete,
|
||||||
data: fieldData,
|
data: fieldData,
|
||||||
field,
|
field,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
path,
|
path,
|
||||||
relationships,
|
relationships,
|
||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +216,6 @@ export const traverseFields = ({
|
|||||||
fields: field.fields,
|
fields: field.fields,
|
||||||
forcedLocale: localeKey,
|
forcedLocale: localeKey,
|
||||||
locales,
|
locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName,
|
parentTableName,
|
||||||
path: `${path || ''}${field.name}.`,
|
path: `${path || ''}${field.name}.`,
|
||||||
@@ -218,6 +223,7 @@ export const traverseFields = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row,
|
row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@@ -233,7 +239,6 @@ export const traverseFields = ({
|
|||||||
fieldPrefix: `${fieldName}_`,
|
fieldPrefix: `${fieldName}_`,
|
||||||
fields: field.fields,
|
fields: field.fields,
|
||||||
locales,
|
locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName,
|
parentTableName,
|
||||||
path: `${path || ''}${field.name}.`,
|
path: `${path || ''}${field.name}.`,
|
||||||
@@ -241,6 +246,7 @@ export const traverseFields = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row,
|
row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -267,7 +273,6 @@ export const traverseFields = ({
|
|||||||
fields: tab.fields,
|
fields: tab.fields,
|
||||||
forcedLocale: localeKey,
|
forcedLocale: localeKey,
|
||||||
locales,
|
locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName,
|
parentTableName,
|
||||||
path: `${path || ''}${tab.name}.`,
|
path: `${path || ''}${tab.name}.`,
|
||||||
@@ -275,6 +280,7 @@ export const traverseFields = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row,
|
row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@@ -290,7 +296,6 @@ export const traverseFields = ({
|
|||||||
fieldPrefix: `${fieldPrefix || ''}${tab.name}_`,
|
fieldPrefix: `${fieldPrefix || ''}${tab.name}_`,
|
||||||
fields: tab.fields,
|
fields: tab.fields,
|
||||||
locales,
|
locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName,
|
parentTableName,
|
||||||
path: `${path || ''}${tab.name}.`,
|
path: `${path || ''}${tab.name}.`,
|
||||||
@@ -298,6 +303,7 @@ export const traverseFields = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row,
|
row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -314,7 +320,6 @@ export const traverseFields = ({
|
|||||||
fieldPrefix,
|
fieldPrefix,
|
||||||
fields: tab.fields,
|
fields: tab.fields,
|
||||||
locales,
|
locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName,
|
parentTableName,
|
||||||
path,
|
path,
|
||||||
@@ -322,6 +327,7 @@ export const traverseFields = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row,
|
row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -340,7 +346,6 @@ export const traverseFields = ({
|
|||||||
fieldPrefix,
|
fieldPrefix,
|
||||||
fields: field.fields,
|
fields: field.fields,
|
||||||
locales,
|
locales,
|
||||||
texts,
|
|
||||||
numbers,
|
numbers,
|
||||||
parentTableName,
|
parentTableName,
|
||||||
path,
|
path,
|
||||||
@@ -348,6 +353,7 @@ export const traverseFields = ({
|
|||||||
relationshipsToDelete,
|
relationshipsToDelete,
|
||||||
row,
|
row,
|
||||||
selects,
|
selects,
|
||||||
|
texts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -488,7 +494,11 @@ export const traverseFields = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fieldAffectsData(field)) {
|
if (fieldAffectsData(field)) {
|
||||||
const valuesToTransform: { localeKey?: string; ref: unknown; value: unknown }[] = []
|
const valuesToTransform: {
|
||||||
|
localeKey?: string
|
||||||
|
ref: unknown
|
||||||
|
value: unknown
|
||||||
|
}[] = []
|
||||||
|
|
||||||
if (field.localized) {
|
if (field.localized) {
|
||||||
if (typeof fieldData === 'object' && fieldData !== null) {
|
if (typeof fieldData === 'object' && fieldData !== null) {
|
||||||
|
|||||||
@@ -23,12 +23,15 @@ import type { Pool, PoolConfig } from 'pg'
|
|||||||
export type DrizzleDB = NodePgDatabase<Record<string, unknown>>
|
export type DrizzleDB = NodePgDatabase<Record<string, unknown>>
|
||||||
|
|
||||||
export type Args = {
|
export type Args = {
|
||||||
|
localesSuffix?: string
|
||||||
idType?: 'serial' | 'uuid'
|
idType?: 'serial' | 'uuid'
|
||||||
logger?: DrizzleConfig['logger']
|
logger?: DrizzleConfig['logger']
|
||||||
migrationDir?: string
|
migrationDir?: string
|
||||||
pool: PoolConfig
|
pool: PoolConfig
|
||||||
push?: boolean
|
push?: boolean
|
||||||
schemaName?: string
|
schemaName?: string
|
||||||
|
relationshipsSuffix?: string
|
||||||
|
versionsSuffix?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type GenericColumn = PgColumn<
|
export type GenericColumn = PgColumn<
|
||||||
@@ -58,6 +61,10 @@ export type DrizzleTransaction = PgTransaction<
|
|||||||
>
|
>
|
||||||
|
|
||||||
export type PostgresAdapter = BaseDatabaseAdapter & {
|
export type PostgresAdapter = BaseDatabaseAdapter & {
|
||||||
|
/**
|
||||||
|
* Used internally to map the block name to the table name
|
||||||
|
*/
|
||||||
|
blockTableNames: Record<string, string>
|
||||||
drizzle: DrizzleDB
|
drizzle: DrizzleDB
|
||||||
enums: Record<string, GenericEnum>
|
enums: Record<string, GenericEnum>
|
||||||
/**
|
/**
|
||||||
@@ -66,12 +73,14 @@ export type PostgresAdapter = BaseDatabaseAdapter & {
|
|||||||
*/
|
*/
|
||||||
fieldConstraints: Record<string, Record<string, string>>
|
fieldConstraints: Record<string, Record<string, string>>
|
||||||
idType: Args['idType']
|
idType: Args['idType']
|
||||||
|
localesSuffix?: string
|
||||||
logger: DrizzleConfig['logger']
|
logger: DrizzleConfig['logger']
|
||||||
pgSchema?: { table: PgTableFn } | PgSchema
|
pgSchema?: { table: PgTableFn } | PgSchema
|
||||||
pool: Pool
|
pool: Pool
|
||||||
poolOptions: Args['pool']
|
poolOptions: Args['pool']
|
||||||
push: boolean
|
push: boolean
|
||||||
relations: Record<string, GenericRelation>
|
relations: Record<string, GenericRelation>
|
||||||
|
relationshipsSuffix?: string
|
||||||
schema: Record<string, GenericEnum | GenericRelation | GenericTable>
|
schema: Record<string, GenericEnum | GenericRelation | GenericTable>
|
||||||
schemaName?: Args['schemaName']
|
schemaName?: Args['schemaName']
|
||||||
sessions: {
|
sessions: {
|
||||||
@@ -82,14 +91,21 @@ export type PostgresAdapter = BaseDatabaseAdapter & {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tables: Record<string, GenericTable | PgTableWithColumns<any>>
|
tables: Record<string, GenericTable | PgTableWithColumns<any>>
|
||||||
|
versionsSuffix?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type IDType = 'integer' | 'numeric' | 'uuid' | 'varchar'
|
export type IDType = 'integer' | 'numeric' | 'uuid' | 'varchar'
|
||||||
|
|
||||||
export type PostgresAdapterResult = (args: { payload: Payload }) => PostgresAdapter
|
export type PostgresAdapterResult = (args: { payload: Payload }) => PostgresAdapter
|
||||||
|
|
||||||
export type MigrateUpArgs = { payload: Payload; req?: Partial<PayloadRequest> }
|
export type MigrateUpArgs = {
|
||||||
export type MigrateDownArgs = { payload: Payload; req?: Partial<PayloadRequest> }
|
payload: Payload
|
||||||
|
req?: Partial<PayloadRequest>
|
||||||
|
}
|
||||||
|
export type MigrateDownArgs = {
|
||||||
|
payload: Payload
|
||||||
|
req?: Partial<PayloadRequest>
|
||||||
|
}
|
||||||
|
|
||||||
declare module 'payload' {
|
declare module 'payload' {
|
||||||
export interface DatabaseAdapter
|
export interface DatabaseAdapter
|
||||||
@@ -98,9 +114,11 @@ declare module 'payload' {
|
|||||||
drizzle: DrizzleDB
|
drizzle: DrizzleDB
|
||||||
enums: Record<string, GenericEnum>
|
enums: Record<string, GenericEnum>
|
||||||
fieldConstraints: Record<string, Record<string, string>>
|
fieldConstraints: Record<string, Record<string, string>>
|
||||||
|
localeSuffix?: string
|
||||||
pool: Pool
|
pool: Pool
|
||||||
push: boolean
|
push: boolean
|
||||||
relations: Record<string, GenericRelation>
|
relations: Record<string, GenericRelation>
|
||||||
|
relationshipsSuffix?: string
|
||||||
schema: Record<string, GenericEnum | GenericRelation | GenericTable>
|
schema: Record<string, GenericEnum | GenericRelation | GenericTable>
|
||||||
sessions: {
|
sessions: {
|
||||||
[id: string]: {
|
[id: string]: {
|
||||||
@@ -110,5 +128,6 @@ declare module 'payload' {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tables: Record<string, GenericTable>
|
tables: Record<string, GenericTable>
|
||||||
|
versionsSuffix?: string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ import type { UpdateOne } from 'payload/database'
|
|||||||
import toSnakeCase from 'to-snake-case'
|
import toSnakeCase from 'to-snake-case'
|
||||||
|
|
||||||
import type { ChainedMethods } from './find/chainMethods'
|
import type { ChainedMethods } from './find/chainMethods'
|
||||||
import { chainMethods } from './find/chainMethods'
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
|
import { selectDistinct } from './queries/selectDistinct'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export const updateOne: UpdateOne = async function updateOne(
|
export const updateOne: UpdateOne = async function updateOne(
|
||||||
@@ -14,8 +16,12 @@ export const updateOne: UpdateOne = async function updateOne(
|
|||||||
) {
|
) {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collection = this.payload.collections[collectionSlug].config
|
const collection = this.payload.collections[collectionSlug].config
|
||||||
const tableName = toSnakeCase(collectionSlug)
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collection,
|
||||||
|
})
|
||||||
const whereToUse = whereArg || { id: { equals: id } }
|
const whereToUse = whereArg || { id: { equals: id } }
|
||||||
|
let idToUpdate = id
|
||||||
|
|
||||||
const { joinAliases, joins, selectFields, where } = await buildQuery({
|
const { joinAliases, joins, selectFields, where } = await buildQuery({
|
||||||
adapter: this,
|
adapter: this,
|
||||||
@@ -25,43 +31,20 @@ export const updateOne: UpdateOne = async function updateOne(
|
|||||||
where: whereToUse,
|
where: whereToUse,
|
||||||
})
|
})
|
||||||
|
|
||||||
let idToUpdate = id
|
const selectDistinctResult = await selectDistinct({
|
||||||
|
adapter: this,
|
||||||
// only fetch IDs when a sort or where query is used that needs to be done on join tables, otherwise these can be done directly on the table in findMany
|
chainedMethods: [{ args: [1], method: 'limit' }],
|
||||||
if (Object.keys(joins).length > 0 || joinAliases.length > 0) {
|
db,
|
||||||
const selectDistinctMethods: ChainedMethods = []
|
joinAliases,
|
||||||
|
joins,
|
||||||
if (where) {
|
selectFields,
|
||||||
selectDistinctMethods.push({ args: [where], method: 'where' })
|
tableName,
|
||||||
}
|
where,
|
||||||
|
|
||||||
joinAliases.forEach(({ condition, table }) => {
|
|
||||||
selectDistinctMethods.push({
|
|
||||||
args: [table, condition],
|
|
||||||
method: 'leftJoin',
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Object.entries(joins).forEach(([joinTable, condition]) => {
|
|
||||||
if (joinTable) {
|
|
||||||
selectDistinctMethods.push({
|
|
||||||
args: [this.tables[joinTable], condition],
|
|
||||||
method: 'leftJoin',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
selectDistinctMethods.push({ args: [1], method: 'limit' })
|
|
||||||
|
|
||||||
const selectDistinctResult = await chainMethods({
|
|
||||||
methods: selectDistinctMethods,
|
|
||||||
query: db.selectDistinct(selectFields).from(this.tables[tableName]),
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if (selectDistinctResult?.[0]?.id) {
|
if (selectDistinctResult?.[0]?.id) {
|
||||||
idToUpdate = selectDistinctResult?.[0]?.id
|
idToUpdate = selectDistinctResult?.[0]?.id
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const result = await upsertRow({
|
const result = await upsertRow({
|
||||||
id: idToUpdate,
|
id: idToUpdate,
|
||||||
@@ -70,8 +53,8 @@ export const updateOne: UpdateOne = async function updateOne(
|
|||||||
db,
|
db,
|
||||||
fields: collection.fields,
|
fields: collection.fields,
|
||||||
operation: 'update',
|
operation: 'update',
|
||||||
tableName: toSnakeCase(collectionSlug),
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -1,19 +1,21 @@
|
|||||||
import type { UpdateGlobalArgs } from 'payload/database'
|
import type { UpdateGlobalArgs } from 'payload/database'
|
||||||
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export async function updateGlobal<T extends TypeWithID>(
|
export async function updateGlobal<T extends TypeWithID>(
|
||||||
this: PostgresAdapter,
|
this: PostgresAdapter,
|
||||||
{ data, req = {} as PayloadRequest, slug }: UpdateGlobalArgs,
|
{ slug, data, req = {} as PayloadRequest }: UpdateGlobalArgs,
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
const globalConfig = this.payload.globals.config.find((config) => config.slug === slug)
|
||||||
const tableName = toSnakeCase(slug)
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: globalConfig,
|
||||||
|
})
|
||||||
|
|
||||||
const existingGlobal = await db.query[tableName].findFirst({})
|
const existingGlobal = await db.query[tableName].findFirst({})
|
||||||
|
|
||||||
@@ -23,8 +25,8 @@ export async function updateGlobal<T extends TypeWithID>(
|
|||||||
data,
|
data,
|
||||||
db,
|
db,
|
||||||
fields: globalConfig.fields,
|
fields: globalConfig.fields,
|
||||||
tableName,
|
|
||||||
req,
|
req,
|
||||||
|
tableName,
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { TypeWithVersion, UpdateGlobalVersionArgs } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedGlobalConfig, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, SanitizedGlobalConfig, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionGlobalFields } from 'payload/versions'
|
import { buildVersionGlobalFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export async function updateGlobalVersion<T extends TypeWithID>(
|
export async function updateGlobalVersion<T extends TypeWithID>(
|
||||||
@@ -25,7 +25,11 @@ export async function updateGlobalVersion<T extends TypeWithID>(
|
|||||||
({ slug }) => slug === global,
|
({ slug }) => slug === global,
|
||||||
)
|
)
|
||||||
const whereToUse = whereArg || { id: { equals: id } }
|
const whereToUse = whereArg || { id: { equals: id } }
|
||||||
const tableName = `_${toSnakeCase(global)}_v`
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: globalConfig,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
const fields = buildVersionGlobalFields(globalConfig)
|
const fields = buildVersionGlobalFields(globalConfig)
|
||||||
|
|
||||||
const { where } = await buildQuery({
|
const { where } = await buildQuery({
|
||||||
@@ -43,9 +47,9 @@ export async function updateGlobalVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields,
|
fields,
|
||||||
operation: 'update',
|
operation: 'update',
|
||||||
|
req,
|
||||||
tableName,
|
tableName,
|
||||||
where,
|
where,
|
||||||
req,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import type { TypeWithVersion, UpdateVersionArgs } from 'payload/database'
|
|||||||
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
import type { PayloadRequest, SanitizedCollectionConfig, TypeWithID } from 'payload/types'
|
||||||
|
|
||||||
import { buildVersionCollectionFields } from 'payload/versions'
|
import { buildVersionCollectionFields } from 'payload/versions'
|
||||||
import toSnakeCase from 'to-snake-case'
|
|
||||||
|
|
||||||
import type { PostgresAdapter } from './types'
|
import type { PostgresAdapter } from './types'
|
||||||
|
|
||||||
import buildQuery from './queries/buildQuery'
|
import buildQuery from './queries/buildQuery'
|
||||||
|
import { getTableName } from './schema/getTableName'
|
||||||
import { upsertRow } from './upsertRow'
|
import { upsertRow } from './upsertRow'
|
||||||
|
|
||||||
export async function updateVersion<T extends TypeWithID>(
|
export async function updateVersion<T extends TypeWithID>(
|
||||||
@@ -23,7 +23,11 @@ export async function updateVersion<T extends TypeWithID>(
|
|||||||
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
const db = this.sessions[req.transactionID]?.db || this.drizzle
|
||||||
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config
|
||||||
const whereToUse = whereArg || { id: { equals: id } }
|
const whereToUse = whereArg || { id: { equals: id } }
|
||||||
const tableName = `_${toSnakeCase(collection)}_v`
|
const tableName = getTableName({
|
||||||
|
adapter: this,
|
||||||
|
config: collectionConfig,
|
||||||
|
versions: true,
|
||||||
|
})
|
||||||
const fields = buildVersionCollectionFields(collectionConfig)
|
const fields = buildVersionCollectionFields(collectionConfig)
|
||||||
|
|
||||||
const { where } = await buildQuery({
|
const { where } = await buildQuery({
|
||||||
@@ -41,9 +45,9 @@ export async function updateVersion<T extends TypeWithID>(
|
|||||||
db,
|
db,
|
||||||
fields,
|
fields,
|
||||||
operation: 'update',
|
operation: 'update',
|
||||||
|
req,
|
||||||
tableName,
|
tableName,
|
||||||
where,
|
where,
|
||||||
req,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ export const upsertRow = async <T extends TypeWithID>({
|
|||||||
// //////////////////////////////////
|
// //////////////////////////////////
|
||||||
|
|
||||||
if (localesToInsert.length > 0) {
|
if (localesToInsert.length > 0) {
|
||||||
const localeTable = adapter.tables[`${tableName}_locales`]
|
const localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`]
|
||||||
|
|
||||||
if (operation === 'update') {
|
if (operation === 'update') {
|
||||||
await db.delete(localeTable).where(eq(localeTable._parentID, insertedRow.id))
|
await db.delete(localeTable).where(eq(localeTable._parentID, insertedRow.id))
|
||||||
@@ -151,7 +151,7 @@ export const upsertRow = async <T extends TypeWithID>({
|
|||||||
// INSERT RELATIONSHIPS
|
// INSERT RELATIONSHIPS
|
||||||
// //////////////////////////////////
|
// //////////////////////////////////
|
||||||
|
|
||||||
const relationshipsTableName = `${tableName}_rels`
|
const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`
|
||||||
|
|
||||||
if (operation === 'update') {
|
if (operation === 'update') {
|
||||||
await deleteExistingRowsByPath({
|
await deleteExistingRowsByPath({
|
||||||
@@ -224,15 +224,16 @@ export const upsertRow = async <T extends TypeWithID>({
|
|||||||
|
|
||||||
if (operation === 'update') {
|
if (operation === 'update') {
|
||||||
for (const blockName of rowToInsert.blocksToDelete) {
|
for (const blockName of rowToInsert.blocksToDelete) {
|
||||||
const blockTableName = `${tableName}_blocks_${blockName}`
|
const blockTableName = adapter.blockTableNames[`${tableName}.${blockName}`]
|
||||||
const blockTable = adapter.tables[blockTableName]
|
const blockTable = adapter.tables[blockTableName]
|
||||||
await db.delete(blockTable).where(eq(blockTable._parentID, insertedRow.id))
|
await db.delete(blockTable).where(eq(blockTable._parentID, insertedRow.id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const [blockName, blockRows] of Object.entries(blocksToInsert)) {
|
for (const [blockName, blockRows] of Object.entries(blocksToInsert)) {
|
||||||
|
const blockTableName = adapter.blockTableNames[`${tableName}.${blockName}`]
|
||||||
insertedBlockRows[blockName] = await db
|
insertedBlockRows[blockName] = await db
|
||||||
.insert(adapter.tables[`${tableName}_blocks_${blockName}`])
|
.insert(adapter.tables[blockTableName])
|
||||||
.values(blockRows.map(({ row }) => row))
|
.values(blockRows.map(({ row }) => row))
|
||||||
.returning()
|
.returning()
|
||||||
|
|
||||||
@@ -259,7 +260,7 @@ export const upsertRow = async <T extends TypeWithID>({
|
|||||||
|
|
||||||
if (blockLocaleRowsToInsert.length > 0) {
|
if (blockLocaleRowsToInsert.length > 0) {
|
||||||
await db
|
await db
|
||||||
.insert(adapter.tables[`${tableName}_blocks_${blockName}_locales`])
|
.insert(adapter.tables[`${blockTableName}${adapter.localesSuffix}`])
|
||||||
.values(blockLocaleRowsToInsert)
|
.values(blockLocaleRowsToInsert)
|
||||||
.returning()
|
.returning()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export const insertArrays = async ({ adapter, arrays, db, parentRows }: Args): P
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Insert locale rows
|
// Insert locale rows
|
||||||
if (adapter.tables[`${tableName}_locales`] && row.locales.length > 0) {
|
if (adapter.tables[`${tableName}${adapter.localesSuffix}`] && row.locales.length > 0) {
|
||||||
if (!row.locales[0]._parentID) {
|
if (!row.locales[0]._parentID) {
|
||||||
row.locales = row.locales.map((localeRow, i) => {
|
row.locales = row.locales.map((localeRow, i) => {
|
||||||
if (typeof localeRow._getParentID === 'function') {
|
if (typeof localeRow._getParentID === 'function') {
|
||||||
@@ -81,7 +81,10 @@ export const insertArrays = async ({ adapter, arrays, db, parentRows }: Args): P
|
|||||||
return localeRow
|
return localeRow
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
await db.insert(adapter.tables[`${tableName}_locales`]).values(row.locales).returning()
|
await db
|
||||||
|
.insert(adapter.tables[`${tableName}${adapter.localesSuffix}`])
|
||||||
|
.values(row.locales)
|
||||||
|
.returning()
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are sub arrays, call this function recursively
|
// If there are sub arrays, call this function recursively
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ type BaseArgs = {
|
|||||||
db: DrizzleDB
|
db: DrizzleDB
|
||||||
fields: Field[]
|
fields: Field[]
|
||||||
path?: string
|
path?: string
|
||||||
tableName: string
|
|
||||||
req: PayloadRequest
|
req: PayloadRequest
|
||||||
|
tableName: string
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreateArgs = BaseArgs & {
|
type CreateArgs = BaseArgs & {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user