From d2e3cba22a0de0c693d52185f5b1d31234544bdb Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Sat, 10 Jul 2021 17:02:11 -0400 Subject: [PATCH 001/115] chore: bump mongodb-memory-server to 7.2.0 and fix test runner --- package.json | 2 +- src/auth/auth.spec.js | 2 +- src/mongoose/connect.ts | 7 +- yarn.lock | 280 ++++++++++++++++------------------------ 4 files changed, 114 insertions(+), 177 deletions(-) diff --git a/package.json b/package.json index 9a37702f85..407214fa71 100644 --- a/package.json +++ b/package.json @@ -262,7 +262,7 @@ "form-data": "^3.0.0", "graphql-request": "^3.4.0", "mongodb": "^3.6.2", - "mongodb-memory-server": "6.5.2", + "mongodb-memory-server": "^7.2.0", "nodemon": "^2.0.6", "optimize-css-assets-webpack-plugin": "^5.0.4", "passport-strategy": "^1.0.0", diff --git a/src/auth/auth.spec.js b/src/auth/auth.spec.js index e1dc515f76..fe0c0d177a 100644 --- a/src/auth/auth.spec.js +++ b/src/auth/auth.spec.js @@ -1,4 +1,4 @@ -import { MongoClient } from 'mongodb'; +import MongoClient from 'mongodb'; import getConfig from '../config/load'; import { email, password, mongo } from '../../tests/api/credentials'; diff --git a/src/mongoose/connect.ts b/src/mongoose/connect.ts index 4b571c7ae8..9a4dc1e45e 100644 --- a/src/mongoose/connect.ts +++ b/src/mongoose/connect.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import mongoose, { ConnectionOptions } from 'mongoose'; import Logger from '../utilities/logger'; @@ -17,15 +16,17 @@ const connectMongoose = async (url: string, options: ConnectionOptions): Promise }; if (process.env.NODE_ENV === 'test') { + connectionOptions.dbName = 'payloadmemory'; // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires const { MongoMemoryServer } = require('mongodb-memory-server'); - const mongod = new MongoMemoryServer({ + const mongo = await MongoMemoryServer.create({ instance: { port: 27018, dbName: 'payloadmemory', }, }); - urlToConnect = await mongod.getUri(); + + urlToConnect = mongo.getUri(); successfulConnectionMessage = 'Connected to in-memory Mongo server successfully!'; } diff --git a/yarn.lock b/yarn.lock index 912137f1c0..451c519bd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1834,23 +1834,6 @@ dependencies: "@types/node" "*" -"@types/cross-spawn@^6.0.1": - version "6.0.2" - resolved "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz#168309de311cd30a2b8ae720de6475c2fbf33ac7" - integrity sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw== - dependencies: - "@types/node" "*" - -"@types/debug@^4.1.5": - version "4.1.6" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.6.tgz#0b7018723084918a865eff99249c490505df2163" - integrity sha512-7fDOJFA/x8B+sO1901BmHlf5dE1cxBU8mRXj8QOEDnn16hhGJv/IHxJtZhvsabZsIMn0eLIyeOKAeqSNJJYTpA== - -"@types/dedent@^0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@types/dedent/-/dedent-0.7.0.tgz#155f339ca404e6dd90b9ce46a3f78fd69ca9b050" - integrity sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A== - "@types/escape-html@^1.0.0": version "1.0.1" resolved "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz#b19b4646915f0ae2c306bf984dc0a59c5cfc97ba" @@ -1941,18 +1924,6 @@ dependencies: "@types/webpack" "^4" -"@types/find-cache-dir@^3.2.0": - version "3.2.1" - resolved "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz#7b959a4b9643a1e6a1a5fe49032693cc36773501" - integrity sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw== - -"@types/find-package-json@^1.1.1": - version "1.2.2" - resolved "https://registry.npmjs.org/@types/find-package-json/-/find-package-json-1.2.2.tgz#ba70d83fdc88dd4e0c13e89d8e774a5c567ed180" - integrity sha512-pg5EZwfH31le1JqT3STadD4VqQ4h/vlouU3dlwXqijLz2eedRq3WXP89yauMMdq5IOHBaKgyIbwb0kvl+DFCFw== - dependencies: - "@types/node" "*" - "@types/find-up@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/find-up/-/find-up-4.0.0.tgz#6b74a76670477a23f0793cfaf2dafc86df59723a" @@ -1960,13 +1931,6 @@ dependencies: find-up "*" -"@types/get-port@^4.0.1": - version "4.2.0" - resolved "https://registry.npmjs.org/@types/get-port/-/get-port-4.2.0.tgz#4fc44616c737d37d3ee7926d86fa975d0afba5e4" - integrity sha512-Iv2FAb5RnIk/eFO2CTu8k+0VMmIR15pKbcqRWi+s3ydW+aKXlN2yemP92SrO++ERyJx+p6Ie1ggbLBMbU1SjiQ== - dependencies: - get-port "*" - "@types/graceful-fs@^4.1.2": version "4.1.5" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -2098,21 +2062,11 @@ dependencies: "@types/node" "*" -"@types/lockfile@^1.0.1": - version "1.0.2" - resolved "https://registry.npmjs.org/@types/lockfile/-/lockfile-1.0.2.tgz#3f77e84171a2b7e3198bd5717c7547a54393baf8" - integrity sha512-jD5VbvhfMhaYN4M3qPJuhMVUg3Dfc4tvPvLEAXn6GXbs/ajDFtCQahX37GIE65ipTI3I+hEvNaXS3MYAn9Ce3Q== - "@types/lodash@^4.14.149": version "4.14.170" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== -"@types/md5-file@^4.0.1": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/md5-file/-/md5-file-4.0.2.tgz#c7241e88f4aa17218c774befb0fc34f33f21fe36" - integrity sha512-8gacRfEqLrmZ6KofpFfxyjsm/LYepeWUWUJGaf5A9W9J5B2/dRZMdkDqFDL6YDa9IweH12IO76jO7mpsK2B3wg== - "@types/mdast@^3.0.0": version "3.0.3" resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" @@ -2151,13 +2105,6 @@ resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== -"@types/mkdirp@^1.0.0": - version "1.0.2" - resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz#8d0bad7aa793abe551860be1f7ae7f3198c16666" - integrity sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ== - dependencies: - "@types/node" "*" - "@types/mkdirp@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz#0930b948914a78587de35458b86c907b6e98bbf6" @@ -2223,6 +2170,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz#e1cf817d70a1e118e81922c4ff6683ce9d422e26" integrity sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA== +"@types/node@14.x || 15.x": + version "15.14.1" + resolved "https://registry.npmjs.org/@types/node/-/node-15.14.1.tgz#4f9d3689532499fdda1c898e19f4593718655e36" + integrity sha512-wF6hazbsnwaW3GhK4jFuw5NaLDQVRQ6pWQUGAUrJzxixFkTaODSiAKMPXuHwPEPkAKQWHAzj6uJ5h+3zU9gQxg== + "@types/nodemailer@^6.4.0": version "6.4.2" resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.2.tgz#d8ee254c969e6ad83fb9a0a0df3a817406a3fa3b" @@ -2534,10 +2486,10 @@ dependencies: "@types/jest" "*" -"@types/tmp@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.1.0.tgz#19cf73a7bcf641965485119726397a096f0049bd" - integrity sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA== +"@types/tmp@^0.2.0": + version "0.2.1" + resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.1.tgz#83ecf4ec22a8c218c71db25f316619fe5b986011" + integrity sha512-7cTXwKP/HLOPVgjg+YhBdQ7bMiobGMuoBmrGmqwIWJv8elC6t1DfVc/mn4fD9UE1IjhwmhaQ5pGVXkmXbH0rhg== "@types/uglify-js@*": version "3.13.0" @@ -2551,11 +2503,6 @@ resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== -"@types/uuid@7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-7.0.0.tgz#9f6993ccc8210efa90bda7e1afabbb06a9f860cd" - integrity sha512-RiX1I0lK9WFLFqy2xOxke396f0wKIzk5sAll0tL4J4XDYJXURI7JOs96XQb3nP+2gEpQ/LutBb66jgiT5oQshQ== - "@types/uuid@^8.3.0": version "8.3.0" resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" @@ -3334,6 +3281,13 @@ async-foreach@^0.1.3: resolved "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= +async-mutex@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.1.tgz#7033af665f1c7cebed8b878267a43ba9e77c5f67" + integrity sha512-vRfQwcqBnJTLzVQo72Sf7KIUbcSUP5hNchx6udI1U6LuPQpfePgdjJzlCe76yFZ8pxlLjn9lwcl/Ya0TSOv0Tw== + dependencies: + tslib "^2.1.0" + async-retry@1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" @@ -3926,7 +3880,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== @@ -5018,6 +4972,13 @@ debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.2.0, debug@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -5062,11 +5023,6 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - deep-equal@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" @@ -6100,15 +6056,6 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@3.3.1, find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -6118,10 +6065,14 @@ find-cache-dir@^2.0.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-package-json@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz#4057d1b943f82d8445fe52dc9cf456f6b8b58083" - integrity sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw== +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" find-root@^1.1.0: version "1.1.0" @@ -6364,7 +6315,7 @@ get-pkg-repo@^1.0.0: parse-github-repo-url "^1.3.0" through2 "^2.0.0" -get-port@*, get-port@5.1.1: +get-port@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== @@ -6923,7 +6874,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== @@ -8449,13 +8400,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lockfile@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== - dependencies: - signal-exit "^3.0.2" - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -8629,10 +8573,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -md5-file@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/md5-file/-/md5-file-4.0.0.tgz#f3f7ba1e2dd1144d5bf1de698d0e5f44a4409584" - integrity sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg== +md5-file@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz#e519f631feca9c39e7f9ea1780b63c4745012e20" + integrity sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw== mdast-util-from-markdown@^0.8.0: version "0.8.5" @@ -8949,46 +8893,36 @@ modify-values@^1.0.0: resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -mongodb-memory-server-core@6.5.2: - version "6.5.2" - resolved "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-6.5.2.tgz#21c96b6e3104b999905ecb232f83d2432467a0f5" - integrity sha512-Cs1wB+GrL2KconDD2emk6ptU1OqdYia11I7fw5sOqnEWc8stTQ4rtptbRcLmHyTcTgRYC/fsQQvzbbd7DBf4DQ== +mongodb-memory-server-core@7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-7.2.0.tgz#c7c403b729b861df3b4989224bb9cbbbcec5e618" + integrity sha512-GCdCaVIVipxHW5PrhhVXZIVgfa4Rht+95RwRdSFXp9MwZaGqAU+aUlcRJkE02RSdITvI6dHmXG3X+Uz7yB1ChA== dependencies: - "@types/cross-spawn" "^6.0.1" - "@types/debug" "^4.1.5" - "@types/dedent" "^0.7.0" - "@types/find-cache-dir" "^3.2.0" - "@types/find-package-json" "^1.1.1" - "@types/get-port" "^4.0.1" - "@types/lockfile" "^1.0.1" - "@types/md5-file" "^4.0.1" - "@types/mkdirp" "^1.0.0" - "@types/tmp" "0.1.0" - "@types/uuid" "7.0.0" - camelcase "^5.3.1" - cross-spawn "^7.0.1" - debug "^4.1.1" - dedent "^0.7.0" - find-cache-dir "3.3.1" - find-package-json "^1.2.0" - get-port "5.1.1" - https-proxy-agent "5.0.0" - lockfile "^1.0.4" - md5-file "^4.0.0" - mkdirp "^1.0.3" - tar-stream "^2.1.1" - tmp "^0.1.0" - uuid "^7.0.2" + "@types/tmp" "^0.2.0" + async-mutex "^0.3.0" + camelcase "^6.1.0" + debug "^4.2.0" + find-cache-dir "^3.3.1" + get-port "^5.1.1" + https-proxy-agent "^5.0.0" + md5-file "^5.0.0" + mkdirp "^1.0.4" + mongodb "^3.6.9" + new-find-package-json "^1.1.0" + semver "^7.3.5" + tar-stream "^2.1.4" + tmp "^0.2.1" + tslib "^2.3.0" + uuid "^8.3.1" yauzl "^2.10.0" - optionalDependencies: - mongodb "^3.5.4" -mongodb-memory-server@6.5.2: - version "6.5.2" - resolved "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-6.5.2.tgz#47f4c19ab830f63ee6119629072eee2df7d8957a" - integrity sha512-PUCiWcHGwyqQiZF3J4iCy1DXqPjoNtehV2qMFJ26rhNBFzmc5SW+9/FUQwGNLge5/Lm1dEwcraJD5PUe8m9Kdg== +mongodb-memory-server@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-7.2.0.tgz#b425b0014841d1d18134de8e08e6d3c6affa13e9" + integrity sha512-bTVzkHwNgEQHt8pRZF8Fca96eghd/72RHn0kEsnYjf0XjY5Vvg8/PvxOEWRd4Oa15tUJ6rW5eMsQhRfb1FPCFg== dependencies: - mongodb-memory-server-core "6.5.2" + mongodb-memory-server-core "7.2.0" + tslib "^2.3.0" mongodb@3.6.8: version "3.6.8" @@ -9003,7 +8937,7 @@ mongodb@3.6.8: optionalDependencies: saslprep "^1.0.0" -mongodb@^3.5.4: +mongodb@^3.6.2, mongodb@^3.6.9: version "3.6.10" resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.6.10.tgz#f10e990113c86b195c8af0599b9b3a90748b6ee4" integrity sha512-fvIBQBF7KwCJnDZUnFFy4WqEFP8ibdXeFANnylW19+vOwdjOAvqIzPdsNCEMT6VKTHnYu4K64AWRih0mkFms6Q== @@ -9016,30 +8950,17 @@ mongodb@^3.5.4: optionalDependencies: saslprep "^1.0.0" -mongodb@^3.6.2: - version "3.6.9" - resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.6.9.tgz#4889cf529724267d393a18275d6cf19d71905b1d" - integrity sha512-1nSCKgSunzn/CXwgOWgbPHUWOO5OfERcuOWISmqd610jn0s8BU9K4879iJVabqgpPPbA6hO7rG48eq+fGED3Mg== - dependencies: - bl "^2.2.1" - bson "^1.1.4" - denque "^1.4.1" - optional-require "^1.0.3" - safe-buffer "^5.1.2" - optionalDependencies: - saslprep "^1.0.0" - mongoose-legacy-pluralize@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== mongoose-paginate-v2@^1.3.6: - version "1.3.18" - resolved "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.3.18.tgz#714631a94afd0136c77e8af6cfcaad3ed37026bd" - integrity sha512-MTEyXvQmUNlXyPGophxILHTYQQ80r3uMtgdnKVr+4qgWLM6JxHbWsFpCmaJJ7ofuV7bhkfBTGx3EDoJo+bIKFw== + version "1.4.1" + resolved "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.4.1.tgz#63c2ac249f9767626d3d044e3ab2847b21071edf" + integrity sha512-MOmcD6TWPkrLCy4D6iq8/P9GqwSzSq6HZjMWuMnKPOANCDFeHdd7KHuce5tYMlpQ5G9E4Co5meOfEnhpZzL/SQ== -mongoose@*, mongoose@^5.8.9: +mongoose@*: version "5.12.14" resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.12.14.tgz#610460f0725acf67b3eefcd92f0a48a08919d51b" integrity sha512-1lMRY8cfGYFWHqe5DLnVgNQDyD0fEbSoWIQe9Mllt/ZtayZ5XUFQt+o5VKrB44vsT5cLNzgwEFO0NvwTwqLluQ== @@ -9057,6 +8978,25 @@ mongoose@*, mongoose@^5.8.9: sift "13.5.2" sliced "1.0.1" +mongoose@^5.8.9: + version "5.13.2" + resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.2.tgz#1b9095fc6bbbb015ea3bc2a79d6f56025406c769" + integrity sha512-sBUKJGpdwZCq9102Lj6ZOaLcW4z/T4TI9aGWrNX5ZlICwChKWG4Wo5qriLImdww3H7bETPW9vYtSiADNlA4wSQ== + dependencies: + "@types/mongodb" "^3.5.27" + "@types/node" "14.x || 15.x" + bson "^1.1.4" + kareem "2.3.2" + mongodb "3.6.8" + mongoose-legacy-pluralize "1.0.2" + mpath "0.8.3" + mquery "3.2.5" + ms "2.1.2" + regexp-clone "1.0.0" + safe-buffer "5.2.1" + sift "13.5.2" + sliced "1.0.1" + mpath@0.8.3: version "0.8.3" resolved "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz#828ac0d187f7f42674839d74921970979abbdd8f" @@ -9173,6 +9113,14 @@ neo-async@^2.6.0, neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +new-find-package-json@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-1.1.0.tgz#053e006b17f409b9a816d5bcf0ee2b90a50326a3" + integrity sha512-KOH3BNZcTKPzEkaJgG2iSUaurxKmefqRKmCOYH+8xqJytNIgjqU4J88BHfK+gy/UlEzlhccLyuJDJAcCgexSwA== + dependencies: + debug "^4.3.2" + tslib "^2.3.0" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -11663,13 +11611,6 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -12685,7 +12626,7 @@ tar-fs@^2.0.0, tar-fs@^2.1.1: pump "^3.0.0" tar-stream "^2.1.4" -tar-stream@^2.1.1, tar-stream@^2.1.4: +tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -12850,12 +12791,12 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== dependencies: - rimraf "^2.6.3" + rimraf "^3.0.0" tmpl@1.0.x: version "1.0.4" @@ -13009,7 +12950,7 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== @@ -13100,10 +13041,10 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.2: - version "4.3.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" - integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== uglify-js@^3.1.4: version "3.13.9" @@ -13377,7 +13318,7 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@8.3.2, uuid@^8.1.0, uuid@^8.3.0: +uuid@8.3.2, uuid@^8.1.0, uuid@^8.3.0, uuid@^8.3.1: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -13387,11 +13328,6 @@ uuid@^3.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.2: - version "7.0.3" - resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" From 7e52de7daf319a9543eef29a5d699ddfb7ccf9f8 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Thu, 15 Jul 2021 15:04:47 -0400 Subject: [PATCH 002/115] docs: fix collections admin link --- docs/configuration/collections.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index d0435770a1..bdaa5816d4 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -17,7 +17,7 @@ It's often best practice to write your Collections in separate files and then im | **`slug`** * | Unique, URL-friendly string that will act as an identifier for this Collection. | | **`fields`** * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [Click here](/docs/fields/overview) for a full list of field types as well as how to configure them. | | **`labels`** | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. | -| **`admin`** | Admin-specific configuration. See below for [more detail](/docs/collections#admin). | +| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-options). | | **`hooks`** | Entry points to "tie in" to Collection actions at specific points. [More](/docs/hooks/overview#collection-hooks) | | **`access`** | Provide access control functions to define exactly who should be able to do what with Documents in this Collection. [More](/docs/access-control/overview/#collections) | | **`auth`** | Specify options if you would like this Collection to feature authentication. For more, consult the [Authentication](/docs/authentication/config) documentation. | From dcd8052498dd2900f228eaffcf6142b63e8e5a9b Mon Sep 17 00:00:00 2001 From: Jarrod Flesch Date: Wed, 21 Jul 2021 18:09:14 -0400 Subject: [PATCH 003/115] fix: accurately documents the props for the datepicker field --- docs/fields/date.mdx | 59 +++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/docs/fields/date.mdx b/docs/fields/date.mdx index 5ae80413d4..35f3947d54 100644 --- a/docs/fields/date.mdx +++ b/docs/fields/date.mdx @@ -6,42 +6,57 @@ desc: The Date field type stores a Date in the database. Learn how to use and cu keywords: date, fields, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express --- - - The Date field type saves a Date in the database and provides the Admin panel with a customizable time picker interface. + + The Date field type saves a Date in the database and provides the Admin panel + with a customizable time picker interface. This field uses [`react-datepicker`](https://www.npmjs.com/package/react-datepicker) for the Admin panel component. ### Config -| Option | Description | -| ---------------- | ----------- | -| **`name`** * | To be used as the property name when stored and retrieved from the database. | -| **`label`** | Used as a field label in the Admin panel and to name the generated GraphQL type. | -| **`index`** | Build a [MongoDB index](https://docs.mongodb.com/manual/indexes/) 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) | -| **`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) | -| **`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) | -| **`hidden`** | Restrict this field's visibility from all APIs entirely. Will still be saved to the database, but will not appear in any API or the Admin panel. | -| **`defaultValue`** | Provide data to be used for this field's default value. | -| **`localized`** | Enable localization for this field. Requires [localization to be enabled](/docs/configuration/localization) in the Base config. | -| **`required`** | Require this field to have a value. | -| **`admin`** | Admin-specific configuration. See below for [more detail](#admin). | +| Option | Description | +| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`name`** \* | To be used as the property name when stored and retrieved from the database. | +| **`label`** | Used as a field label in the Admin panel and to name the generated GraphQL type. | +| **`index`** | Build a [MongoDB index](https://docs.mongodb.com/manual/indexes/) 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) | +| **`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) | +| **`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) | +| **`hidden`** | Restrict this field's visibility from all APIs entirely. Will still be saved to the database, but will not appear in any API or the Admin panel. | +| **`defaultValue`** | Provide data to be used for this field's default value. | +| **`localized`** | Enable localization for this field. Requires [localization to be enabled](/docs/configuration/localization) in the Base config. | +| **`required`** | Require this field to have a value. | +| **`admin`** | Admin-specific configuration. See below for [more detail](#admin). | -*\* An asterisk denotes that a property is required.* +_\* An asterisk denotes that a property is required._ -### Admin config +### Admin Date Config -In addition to the default [field admin config](/docs/fields/overview#admin-config), you can customize all of the options that `react-datepicker` provisions for via the `date` property. +In addition to the default [field admin config](/docs/fields/overview#admin-config), you can customize the following fields that will adjust how the component displays in the admin panel via the `date` property. + +| Option | Description | +| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`pickerAppearance`** | Determines the appearance of the datepicker: `dayAndTime` `timeOnly` `dayOnly`. Defaults to `dayAndTime`. | +| **`displayFormat`** | Determines how the date is presented. dayAndTime default to `MMM d, yyy h:mm a` timeOnly defaults to `h:mm a` and dayOnly defaults to `MMM d, yyy`. | +| **`placeholder`** | Placeholder text for the field. | +| **`monthsToShow`** | Number of months to display max is 2. Defaults to 1. | +| **`minDate`** | Passed directly to [react-datepicker](https://github.com/Hacker0x01/react-datepicker/blob/master/docs/datepicker.md). | +| **`maxDate`** | Passed directly to [react-datepicker](https://github.com/Hacker0x01/react-datepicker/blob/master/docs/datepicker.md). | +| **`minTime`** | Passed directly to [react-datepicker](https://github.com/Hacker0x01/react-datepicker/blob/master/docs/datepicker.md). | +| **`maxTime`** | Passed directly to [react-datepicker](https://github.com/Hacker0x01/react-datepicker/blob/master/docs/datepicker.md). | +| **`timeIntervals`** | Passed directly to [react-datepicker](https://github.com/Hacker0x01/react-datepicker/blob/master/docs/datepicker.md). Defaults to 30 minutes. | +| **`timeFormat`** | Passed directly to [react-datepicker](https://github.com/Hacker0x01/react-datepicker/blob/master/docs/datepicker.md). Defaults to `'h:mm aa'`. | + +_\* An asterisk denotes that a property is required._ Common use cases for customizing the `date` property are to restrict your field to only show time or day input—but lots more can be done. -[Check out the `react-datepicker` docs](https://github.com/Hacker0x01/react-datepicker/blob/master/docs/datepicker.md) for more info. - ### Example `collections/ExampleCollection.js` + ```js { slug: 'example-collection', @@ -53,7 +68,7 @@ Common use cases for customizing the `date` property are to restrict your field defaultValue: '1988-11-05T8:00:00.000+05:00', admin: { date: { - // All `react-datepicker` options are supported + // All config options above should be placed here pickerAppearance: 'timeOnly', } } From 603a11c4d5829f4b3f05f099f69d3e337ca38f3f Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Jul 2021 09:50:03 -0400 Subject: [PATCH 004/115] docs: renames plugins overview --- docs/plugins/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/overview.mdx b/docs/plugins/overview.mdx index 40c15c9b2a..75e7e7e1b9 100644 --- a/docs/plugins/overview.mdx +++ b/docs/plugins/overview.mdx @@ -1,6 +1,6 @@ --- title: Plugins -label: Plugins +label: Overview order: 10 desc: Plugins provide a great way to modularize Payload functionalities into easy-to-use enhancements and extensions of your Payload apps. keywords: plugins, config, configuration, extensions, custom, documentation, Content Management System, cms, headless, javascript, node, react, express From 266ccb374449b0a131a574d9b12275b6bb7e5c60 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Jul 2021 09:56:29 -0400 Subject: [PATCH 005/115] feat: only attempts to find config when payload is initialized --- src/config/load.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config/load.ts b/src/config/load.ts index 6d002ef062..f796c84e4a 100644 --- a/src/config/load.ts +++ b/src/config/load.ts @@ -6,11 +6,12 @@ import findConfig from './find'; import validate from './validate'; import babelConfig from '../babel.config'; -const configPath = findConfig(); const removedExtensions = ['.scss', '.css', '.svg', '.png', '.jpg', '.eot', '.ttf', '.woff', '.woff2']; const loadConfig = (): Config => { + const configPath = findConfig(); + removedExtensions.forEach((ext) => { require.extensions[ext] = () => null; }); From bd0b1df560671bd0c2c46d3984f20b422a8dbbf5 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Jul 2021 10:00:28 -0400 Subject: [PATCH 006/115] chore(release): v0.7.7 --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0666644e24..a41b7796a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [0.7.7](https://github.com/payloadcms/payload/compare/v0.7.6...v0.7.7) (2021-07-23) + + +### Bug Fixes + +* accurately documents the props for the datepicker field ([dcd8052](https://github.com/payloadcms/payload/commit/dcd8052498dd2900f228eaffcf6142b63e8e5a9b)) + + +### Features + +* only attempts to find config when payload is initialized ([266ccb3](https://github.com/payloadcms/payload/commit/266ccb374449b0a131a574d9b12275b6bb7e5c60)) + ## [0.7.6](https://github.com/payloadcms/payload/compare/v0.7.5...v0.7.6) (2021-07-07) ## [0.7.5](https://github.com/payloadcms/payload/compare/v0.7.4...v0.7.5) (2021-07-07) diff --git a/package.json b/package.json index 9a37702f85..87f48fa13a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.7.6", + "version": "0.7.7", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From cbac8887ddb7a4446f5502c577d4600905b13380 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Jul 2021 12:08:27 -0400 Subject: [PATCH 007/115] feat: fixes group label schema validation --- src/fields/config/schema.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/fields/config/schema.ts b/src/fields/config/schema.ts index b2cd5afdba..e3a958edde 100644 --- a/src/fields/config/schema.ts +++ b/src/fields/config/schema.ts @@ -146,7 +146,6 @@ export const row = baseField.keys({ export const group = baseField.keys({ type: joi.string().valid('group').required(), name: joi.string().required(), - label: joi.string(), fields: joi.array().items(joi.link('#field')), defaultValue: joi.object(), admin: baseAdminFields.keys({ From 998122b071732e2230014073851ab50165371d51 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Jul 2021 12:09:45 -0400 Subject: [PATCH 008/115] chore(release): v0.7.8 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a41b7796a3..5becdd88b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.7.8](https://github.com/payloadcms/payload/compare/v0.7.7...v0.7.8) (2021-07-23) + + +### Features + +* fixes group label schema validation ([cbac888](https://github.com/payloadcms/payload/commit/cbac8887ddb7a4446f5502c577d4600905b13380)) + ## [0.7.7](https://github.com/payloadcms/payload/compare/v0.7.6...v0.7.7) (2021-07-23) diff --git a/package.json b/package.json index 87f48fa13a..e846cec2b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.7.7", + "version": "0.7.8", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From 4d1249dd03f441ee872e66437118c3e8703aaefc Mon Sep 17 00:00:00 2001 From: James Date: Mon, 26 Jul 2021 14:33:03 -0400 Subject: [PATCH 009/115] fix: missing richtext gutter --- src/admin/components/forms/field-types/RichText/RichText.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/admin/components/forms/field-types/RichText/RichText.tsx b/src/admin/components/forms/field-types/RichText/RichText.tsx index e38c6da229..cf939a8c6c 100644 --- a/src/admin/components/forms/field-types/RichText/RichText.tsx +++ b/src/admin/components/forms/field-types/RichText/RichText.tsx @@ -177,8 +177,8 @@ const RichText: React.FC = (props) => { width, }} > - { !hideGutter && () }
+ { !hideGutter && () } Date: Mon, 26 Jul 2021 14:33:26 -0400 Subject: [PATCH 010/115] feat: improves group styling when there is no label --- src/admin/components/forms/field-types/Group/index.scss | 4 ++++ src/admin/components/forms/field-types/Group/index.tsx | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/admin/components/forms/field-types/Group/index.scss b/src/admin/components/forms/field-types/Group/index.scss index 9808069380..4529bedfd0 100644 --- a/src/admin/components/forms/field-types/Group/index.scss +++ b/src/admin/components/forms/field-types/Group/index.scss @@ -29,6 +29,10 @@ } } + &--no-label { + margin-top: 0, + } + @include mid-break { &__fields-wrapper { display: flex; diff --git a/src/admin/components/forms/field-types/Group/index.tsx b/src/admin/components/forms/field-types/Group/index.tsx index c9d53690c3..45512f35a6 100644 --- a/src/admin/components/forms/field-types/Group/index.tsx +++ b/src/admin/components/forms/field-types/Group/index.tsx @@ -29,7 +29,11 @@ const Group: React.FC = (props) => { return (
Date: Mon, 26 Jul 2021 22:25:11 -0400 Subject: [PATCH 011/115] feat: improves conditional logic performance and edge cases --- .../forms/Form/buildStateFromSchema.ts | 13 ++------- .../components/forms/Form/fieldReducer.ts | 25 ++++++++++++++++- src/admin/components/forms/Form/index.tsx | 28 +++++++------------ src/admin/components/forms/Form/types.ts | 4 +-- .../forms/field-types/Array/Array.tsx | 2 -- .../forms/field-types/Blocks/Blocks.tsx | 2 -- .../forms/field-types/Checkbox/index.tsx | 2 -- .../forms/field-types/Code/Code.tsx | 2 -- .../forms/field-types/DateTime/index.tsx | 2 -- .../forms/field-types/Email/index.tsx | 2 -- .../forms/field-types/Number/index.tsx | 2 -- .../forms/field-types/RadioGroup/index.tsx | 2 -- .../forms/field-types/Relationship/index.tsx | 2 -- .../forms/field-types/RichText/RichText.tsx | 2 -- .../forms/field-types/Select/index.tsx | 2 -- .../forms/field-types/Text/index.tsx | 2 -- .../forms/field-types/Textarea/index.tsx | 2 -- .../forms/field-types/Upload/index.tsx | 2 -- .../components/forms/useFieldType/index.tsx | 4 +-- .../components/forms/useFieldType/types.ts | 3 +- .../components/forms/withCondition/index.tsx | 26 +++++++++-------- src/fields/traverseFields.ts | 10 +++++++ src/fields/validationPromise.ts | 4 ++- 23 files changed, 68 insertions(+), 77 deletions(-) diff --git a/src/admin/components/forms/Form/buildStateFromSchema.ts b/src/admin/components/forms/Form/buildStateFromSchema.ts index b87980fb2d..6b7ae209c7 100644 --- a/src/admin/components/forms/Form/buildStateFromSchema.ts +++ b/src/admin/components/forms/Form/buildStateFromSchema.ts @@ -2,18 +2,12 @@ import ObjectID from 'bson-objectid'; import { Field as FieldSchema } from '../../../../fields/config/types'; import { Fields, Field, Data } from './types'; -const buildValidationPromise = async (fieldState: Field, field: FieldSchema, fullData: Data = {}, data: Data = {}) => { +const buildValidationPromise = async (fieldState: Field, field: FieldSchema) => { const validatedFieldState = fieldState; - let passesConditionalLogic = true; - - if (field?.admin?.condition) { - passesConditionalLogic = await field.admin.condition(fullData, data); - } - let validationResult: boolean | string = true; - if (passesConditionalLogic && typeof field.validate === 'function') { + if (typeof field.validate === 'function') { validationResult = await field.validate(fieldState.value, field); } @@ -37,10 +31,9 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = initialValue: value, valid: true, validate: field.validate, - condition: field?.admin?.condition, }; - validationPromises.push(buildValidationPromise(fieldState, field, fullData, data)); + validationPromises.push(buildValidationPromise(fieldState, field)); return fieldState; }; diff --git a/src/admin/components/forms/Form/fieldReducer.ts b/src/admin/components/forms/Form/fieldReducer.ts index 2d1939984e..e42bacc876 100644 --- a/src/admin/components/forms/Form/fieldReducer.ts +++ b/src/admin/components/forms/Form/fieldReducer.ts @@ -103,6 +103,29 @@ function fieldReducer(state: Fields, action): Fields { return newState; } + case 'MODIFY_CONDITION': { + const { path, result } = action; + + return Object.entries(state).reduce((newState, [key, val]) => { + if (key === path || key.indexOf(`${path}.`) === 0) { + return { + ...newState, + [key]: { + ...val, + passesCondition: result, + }, + }; + } + + return { + ...newState, + [key]: { + ...val, + }, + }; + }, {}); + } + default: { const newField = { value: action.value, @@ -113,7 +136,7 @@ function fieldReducer(state: Fields, action): Fields { initialValue: action.initialValue, stringify: action.stringify, validate: action.validate, - condition: action.condition, + passesCondition: action.passesCondition, }; return { diff --git a/src/admin/components/forms/Form/index.tsx b/src/admin/components/forms/Form/index.tsx index 591789e3c7..b9de633140 100644 --- a/src/admin/components/forms/Form/index.tsx +++ b/src/admin/components/forms/Form/index.tsx @@ -67,32 +67,24 @@ const Form: React.FC = (props) => { const validatedFieldState = {}; let isValid = true; - const data = contextRef.current.getData(); - const validationPromises = Object.entries(contextRef.current.fields).map(async ([path, field]) => { const validatedField = { ...field, valid: true, }; - const siblingData = contextRef.current.getSiblingData(path); + if (field.passesCondition !== false) { + let validationResult: boolean | string = true; - let passesConditionalLogic = true; + if (typeof field.validate === 'function') { + validationResult = await field.validate(field.value); + } - if (typeof field?.condition === 'function') { - passesConditionalLogic = await field.condition(data, siblingData); - } - - let validationResult: boolean | string = true; - - if (passesConditionalLogic && typeof field.validate === 'function') { - validationResult = await field.validate(field.value); - } - - if (typeof validationResult === 'string') { - validatedField.errorMessage = validationResult; - validatedField.valid = false; - isValid = false; + if (typeof validationResult === 'string') { + validatedField.errorMessage = validationResult; + validatedField.valid = false; + isValid = false; + } } validatedFieldState[path] = validatedField; diff --git a/src/admin/components/forms/Form/types.ts b/src/admin/components/forms/Form/types.ts index bc19f86af8..50c6d6de89 100644 --- a/src/admin/components/forms/Form/types.ts +++ b/src/admin/components/forms/Form/types.ts @@ -1,5 +1,3 @@ -import { Condition } from '../../../../fields/config/types'; - export type Field = { value: unknown initialValue: unknown @@ -9,7 +7,7 @@ export type Field = { disableFormData?: boolean ignoreWhileFlattening?: boolean stringify?: boolean - condition?: Condition + passesCondition?: boolean } export type Fields = { diff --git a/src/admin/components/forms/field-types/Array/Array.tsx b/src/admin/components/forms/field-types/Array/Array.tsx index e242351681..a26677aa94 100644 --- a/src/admin/components/forms/field-types/Array/Array.tsx +++ b/src/admin/components/forms/field-types/Array/Array.tsx @@ -30,7 +30,6 @@ const ArrayFieldType: React.FC = (props) => { permissions, admin: { readOnly, - condition, }, } = props; @@ -69,7 +68,6 @@ const ArrayFieldType: React.FC = (props) => { validate: memoizedValidate, disableFormData, ignoreWhileFlattening: true, - condition, }); const addRow = useCallback(async (rowIndex) => { diff --git a/src/admin/components/forms/field-types/Blocks/Blocks.tsx b/src/admin/components/forms/field-types/Blocks/Blocks.tsx index f168c8d904..30221b1b3f 100644 --- a/src/admin/components/forms/field-types/Blocks/Blocks.tsx +++ b/src/admin/components/forms/field-types/Blocks/Blocks.tsx @@ -44,7 +44,6 @@ const Blocks: React.FC = (props) => { permissions, admin: { readOnly, - condition, }, } = props; @@ -79,7 +78,6 @@ const Blocks: React.FC = (props) => { validate: memoizedValidate, disableFormData, ignoreWhileFlattening: true, - condition, }); const addRow = useCallback(async (rowIndex, blockType) => { diff --git a/src/admin/components/forms/field-types/Checkbox/index.tsx b/src/admin/components/forms/field-types/Checkbox/index.tsx index c32f78c6b2..a9af7805e7 100644 --- a/src/admin/components/forms/field-types/Checkbox/index.tsx +++ b/src/admin/components/forms/field-types/Checkbox/index.tsx @@ -23,7 +23,6 @@ const Checkbox: React.FC = (props) => { readOnly, style, width, - condition, } = {}, } = props; @@ -43,7 +42,6 @@ const Checkbox: React.FC = (props) => { path, validate: memoizedValidate, disableFormData, - condition, }); return ( diff --git a/src/admin/components/forms/field-types/Code/Code.tsx b/src/admin/components/forms/field-types/Code/Code.tsx index 77f279cd2d..72b30027df 100644 --- a/src/admin/components/forms/field-types/Code/Code.tsx +++ b/src/admin/components/forms/field-types/Code/Code.tsx @@ -23,7 +23,6 @@ const Code: React.FC = (props) => { style, width, language, - condition, } = {}, label, minLength, @@ -54,7 +53,6 @@ const Code: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, - condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/DateTime/index.tsx b/src/admin/components/forms/field-types/DateTime/index.tsx index ae37e7ae3f..49fb0861b5 100644 --- a/src/admin/components/forms/field-types/DateTime/index.tsx +++ b/src/admin/components/forms/field-types/DateTime/index.tsx @@ -25,7 +25,6 @@ const DateTime: React.FC = (props) => { style, width, date, - condition, } = {}, } = props; @@ -44,7 +43,6 @@ const DateTime: React.FC = (props) => { } = useFieldType({ path, validate: memoizedValidate, - condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Email/index.tsx b/src/admin/components/forms/field-types/Email/index.tsx index ddd3bb4ac9..cd5e9a42be 100644 --- a/src/admin/components/forms/field-types/Email/index.tsx +++ b/src/admin/components/forms/field-types/Email/index.tsx @@ -20,7 +20,6 @@ const Email: React.FC = (props) => { width, placeholder, autoComplete, - condition, } = {}, label, } = props; @@ -36,7 +35,6 @@ const Email: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, - condition, }); const { diff --git a/src/admin/components/forms/field-types/Number/index.tsx b/src/admin/components/forms/field-types/Number/index.tsx index a84cae676b..7c55f5622a 100644 --- a/src/admin/components/forms/field-types/Number/index.tsx +++ b/src/admin/components/forms/field-types/Number/index.tsx @@ -23,7 +23,6 @@ const NumberField: React.FC = (props) => { width, step, placeholder, - condition, } = {}, } = props; @@ -43,7 +42,6 @@ const NumberField: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, - condition, }); const handleChange = useCallback((e) => { diff --git a/src/admin/components/forms/field-types/RadioGroup/index.tsx b/src/admin/components/forms/field-types/RadioGroup/index.tsx index 553d49c14f..e751b0cb74 100644 --- a/src/admin/components/forms/field-types/RadioGroup/index.tsx +++ b/src/admin/components/forms/field-types/RadioGroup/index.tsx @@ -25,7 +25,6 @@ const RadioGroup: React.FC = (props) => { layout = 'horizontal', style, width, - condition, } = {}, options, } = props; @@ -45,7 +44,6 @@ const RadioGroup: React.FC = (props) => { } = useFieldType({ path, validate: memoizedValidate, - condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Relationship/index.tsx b/src/admin/components/forms/field-types/Relationship/index.tsx index 4fb5cc4fbc..defa225398 100644 --- a/src/admin/components/forms/field-types/Relationship/index.tsx +++ b/src/admin/components/forms/field-types/Relationship/index.tsx @@ -35,7 +35,6 @@ const Relationship: React.FC = (props) => { readOnly, style, width, - condition, } = {}, } = props; @@ -72,7 +71,6 @@ const Relationship: React.FC = (props) => { } = useFieldType({ path: path || name, validate: memoizedValidate, - condition, }); const addOptions = useCallback((data, relation) => { diff --git a/src/admin/components/forms/field-types/RichText/RichText.tsx b/src/admin/components/forms/field-types/RichText/RichText.tsx index cf939a8c6c..3eb113db5a 100644 --- a/src/admin/components/forms/field-types/RichText/RichText.tsx +++ b/src/admin/components/forms/field-types/RichText/RichText.tsx @@ -43,7 +43,6 @@ const RichText: React.FC = (props) => { style, width, placeholder, - condition, hideGutter, } = {}, } = props; @@ -105,7 +104,6 @@ const RichText: React.FC = (props) => { path, validate: memoizedValidate, stringify: true, - condition, }); const { diff --git a/src/admin/components/forms/field-types/Select/index.tsx b/src/admin/components/forms/field-types/Select/index.tsx index 9a5ae8e914..210d2d9972 100644 --- a/src/admin/components/forms/field-types/Select/index.tsx +++ b/src/admin/components/forms/field-types/Select/index.tsx @@ -36,7 +36,6 @@ const Select: React.FC = (props) => { readOnly, style, width, - condition, } = {}, } = props; @@ -57,7 +56,6 @@ const Select: React.FC = (props) => { } = useFieldType({ path, validate: memoizedValidate, - condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Text/index.tsx b/src/admin/components/forms/field-types/Text/index.tsx index 792e95803a..97c96cd9b7 100644 --- a/src/admin/components/forms/field-types/Text/index.tsx +++ b/src/admin/components/forms/field-types/Text/index.tsx @@ -20,7 +20,6 @@ const Text: React.FC = (props) => { readOnly, style, width, - condition, } = {}, } = props; @@ -29,7 +28,6 @@ const Text: React.FC = (props) => { const fieldType = useFieldType({ path, validate, - condition, enableDebouncedValue: true, }); diff --git a/src/admin/components/forms/field-types/Textarea/index.tsx b/src/admin/components/forms/field-types/Textarea/index.tsx index 22192690a5..a3805b5946 100644 --- a/src/admin/components/forms/field-types/Textarea/index.tsx +++ b/src/admin/components/forms/field-types/Textarea/index.tsx @@ -20,7 +20,6 @@ const Textarea: React.FC = (props) => { width, placeholder, rows, - condition, } = {}, label, minLength, @@ -43,7 +42,6 @@ const Textarea: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, - condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Upload/index.tsx b/src/admin/components/forms/field-types/Upload/index.tsx index fc72c333ab..16450047c1 100644 --- a/src/admin/components/forms/field-types/Upload/index.tsx +++ b/src/admin/components/forms/field-types/Upload/index.tsx @@ -30,7 +30,6 @@ const Upload: React.FC = (props) => { readOnly, style, width, - condition, } = {}, label, validate = upload, @@ -52,7 +51,6 @@ const Upload: React.FC = (props) => { const fieldType = useFieldType({ path, validate: memoizedValidate, - condition, }); const { diff --git a/src/admin/components/forms/useFieldType/index.tsx b/src/admin/components/forms/useFieldType/index.tsx index 9de075b9f3..f3ca248378 100644 --- a/src/admin/components/forms/useFieldType/index.tsx +++ b/src/admin/components/forms/useFieldType/index.tsx @@ -13,7 +13,6 @@ const useFieldType = (options: Options): FieldType => { disableFormData, ignoreWhileFlattening, stringify, - condition, } = options; const formContext = useForm(); @@ -49,7 +48,6 @@ const useFieldType = (options: Options): FieldType => { ignoreWhileFlattening, initialValue, validate, - condition, value: valueToSend, valid: false, errorMessage: undefined, @@ -65,7 +63,7 @@ const useFieldType = (options: Options): FieldType => { } dispatchFields(fieldToDispatch); - }, [path, dispatchFields, validate, disableFormData, ignoreWhileFlattening, initialValue, stringify, condition]); + }, [path, dispatchFields, validate, disableFormData, ignoreWhileFlattening, initialValue, stringify]); // Method to return from `useFieldType`, used to // update internal field values from field component(s) diff --git a/src/admin/components/forms/useFieldType/types.ts b/src/admin/components/forms/useFieldType/types.ts index 164bc2ce94..cb0ca529b0 100644 --- a/src/admin/components/forms/useFieldType/types.ts +++ b/src/admin/components/forms/useFieldType/types.ts @@ -1,4 +1,4 @@ -import { Validate, Condition } from '../../../../fields/config/types'; +import { Validate } from '../../../../fields/config/types'; export type Options = { path: string @@ -7,7 +7,6 @@ export type Options = { disableFormData?: boolean ignoreWhileFlattening?: boolean stringify?: boolean - condition?: Condition } export type FieldType = { diff --git a/src/admin/components/forms/withCondition/index.tsx b/src/admin/components/forms/withCondition/index.tsx index 9236b667bd..235c79cc60 100644 --- a/src/admin/components/forms/withCondition/index.tsx +++ b/src/admin/components/forms/withCondition/index.tsx @@ -34,20 +34,24 @@ const withCondition =

>(Field: React.Component const data = getData(); const siblingData = getSiblingData(path); - const passesCondition = condition ? condition(data, siblingData) : true; + const hasCondition = Boolean(condition); + const currentlyPassesCondition = hasCondition ? condition(data, siblingData) : true; + const field = getField(path); + const existingConditionPasses = field?.passesCondition; useEffect(() => { - if (!passesCondition) { - const field = getField(path); - dispatchFields({ - ...field, - path, - valid: true, - }); - } - }, [passesCondition, getField, dispatchFields, path]); + if (hasCondition) { + if (!existingConditionPasses && currentlyPassesCondition) { + dispatchFields({ type: 'MODIFY_CONDITION', path, result: true }); + } - if (passesCondition) { + if (!currentlyPassesCondition && (existingConditionPasses || typeof existingConditionPasses === 'undefined')) { + dispatchFields({ type: 'MODIFY_CONDITION', path, result: false }); + } + } + }, [currentlyPassesCondition, existingConditionPasses, dispatchFields, path, hasCondition]); + + if (currentlyPassesCondition) { return ; } diff --git a/src/fields/traverseFields.ts b/src/fields/traverseFields.ts index 1c0ed533a2..50f082f57c 100644 --- a/src/fields/traverseFields.ts +++ b/src/fields/traverseFields.ts @@ -34,6 +34,7 @@ type Arguments = { unflattenLocales: boolean unflattenLocaleActions: (() => void)[] docWithLocales?: Record + skipValidation?: boolean } const traverseFields = (args: Arguments): void => { @@ -64,6 +65,7 @@ const traverseFields = (args: Arguments): void => { unflattenLocaleActions, unflattenLocales, docWithLocales = {}, + skipValidation, } = args; fields.forEach((field) => { @@ -187,11 +189,14 @@ const traverseFields = (args: Arguments): void => { fullData, })); + const passesCondition = (field.admin?.condition && hook === 'beforeChange') ? field.admin.condition(fullData, data) : true; + if (fieldHasSubFields(field)) { if (field.name === undefined) { traverseFields({ ...args, fields: field.fields, + skipValidation: !passesCondition, }); } else if (fieldIsArrayType(field)) { if (Array.isArray(data[field.name])) { @@ -207,6 +212,7 @@ const traverseFields = (args: Arguments): void => { originalDoc: originalDoc?.[field.name]?.[i], docWithLocales: docWithLocales?.[field.name]?.[i], path: `${path}${field.name}.${i}.`, + skipValidation: !passesCondition, }); } } @@ -218,6 +224,7 @@ const traverseFields = (args: Arguments): void => { originalDoc: originalDoc[field.name], docWithLocales: docWithLocales?.[field.name], path: `${path}${field.name}.`, + skipValidation: !passesCondition, }); } } @@ -235,6 +242,7 @@ const traverseFields = (args: Arguments): void => { originalDoc: originalDoc?.[field.name]?.[i], docWithLocales: docWithLocales?.[field.name]?.[i], path: `${path}${field.name}.${i}.`, + skipValidation: !passesCondition, }); } }); @@ -267,6 +275,7 @@ const traverseFields = (args: Arguments): void => { existingData: { [field.name]: existingRowCount }, field, path, + skipValidation: skipValidation || !passesCondition, })); } else { validationPromises.push(() => validationPromise({ @@ -276,6 +285,7 @@ const traverseFields = (args: Arguments): void => { existingData: originalDoc, field, path, + skipValidation: skipValidation || !passesCondition, })); } } diff --git a/src/fields/validationPromise.ts b/src/fields/validationPromise.ts index 58644fd234..c1fd4b5e97 100644 --- a/src/fields/validationPromise.ts +++ b/src/fields/validationPromise.ts @@ -7,6 +7,7 @@ type Arguments = { errors: {message: string, field: string}[] newData: Record existingData: Record + skipValidation?: boolean } const validationPromise = async ({ @@ -16,8 +17,9 @@ const validationPromise = async ({ existingData, field, path, + skipValidation, }: Arguments): Promise => { - if (hook !== 'beforeChange') return true; + if (hook !== 'beforeChange' || !skipValidation) return true; const hasCondition = field.admin && field.admin.condition; const shouldValidate = field.validate && !hasCondition; From fedeaeafc9607f7c21e40c2df44923056e5d460c Mon Sep 17 00:00:00 2001 From: James Date: Mon, 26 Jul 2021 22:45:31 -0400 Subject: [PATCH 012/115] fix: skipValidation logic --- src/fields/traverseFields.ts | 13 +++++++------ src/fields/validationPromise.ts | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/fields/traverseFields.ts b/src/fields/traverseFields.ts index 50f082f57c..680afab4c9 100644 --- a/src/fields/traverseFields.ts +++ b/src/fields/traverseFields.ts @@ -190,13 +190,14 @@ const traverseFields = (args: Arguments): void => { })); const passesCondition = (field.admin?.condition && hook === 'beforeChange') ? field.admin.condition(fullData, data) : true; + const skipValidationFromHere = skipValidation || !passesCondition; if (fieldHasSubFields(field)) { if (field.name === undefined) { traverseFields({ ...args, fields: field.fields, - skipValidation: !passesCondition, + skipValidation: skipValidationFromHere, }); } else if (fieldIsArrayType(field)) { if (Array.isArray(data[field.name])) { @@ -212,7 +213,7 @@ const traverseFields = (args: Arguments): void => { originalDoc: originalDoc?.[field.name]?.[i], docWithLocales: docWithLocales?.[field.name]?.[i], path: `${path}${field.name}.${i}.`, - skipValidation: !passesCondition, + skipValidation: skipValidationFromHere, }); } } @@ -224,7 +225,7 @@ const traverseFields = (args: Arguments): void => { originalDoc: originalDoc[field.name], docWithLocales: docWithLocales?.[field.name], path: `${path}${field.name}.`, - skipValidation: !passesCondition, + skipValidation: skipValidationFromHere, }); } } @@ -242,7 +243,7 @@ const traverseFields = (args: Arguments): void => { originalDoc: originalDoc?.[field.name]?.[i], docWithLocales: docWithLocales?.[field.name]?.[i], path: `${path}${field.name}.${i}.`, - skipValidation: !passesCondition, + skipValidation: skipValidationFromHere, }); } }); @@ -275,7 +276,7 @@ const traverseFields = (args: Arguments): void => { existingData: { [field.name]: existingRowCount }, field, path, - skipValidation: skipValidation || !passesCondition, + skipValidation: skipValidationFromHere, })); } else { validationPromises.push(() => validationPromise({ @@ -285,7 +286,7 @@ const traverseFields = (args: Arguments): void => { existingData: originalDoc, field, path, - skipValidation: skipValidation || !passesCondition, + skipValidation: skipValidationFromHere, })); } } diff --git a/src/fields/validationPromise.ts b/src/fields/validationPromise.ts index c1fd4b5e97..e1512ac949 100644 --- a/src/fields/validationPromise.ts +++ b/src/fields/validationPromise.ts @@ -19,7 +19,7 @@ const validationPromise = async ({ path, skipValidation, }: Arguments): Promise => { - if (hook !== 'beforeChange' || !skipValidation) return true; + if (hook !== 'beforeChange' || skipValidation) return true; const hasCondition = field.admin && field.admin.condition; const shouldValidate = field.validate && !hasCondition; From ebfb72c8fa0723ec75922c6fa4739b48ee82b29f Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 21 Jul 2021 13:25:04 -0400 Subject: [PATCH 013/115] feat: add collection slug to schema validation errors --- src/config/schema.ts | 4 +--- src/config/validate.ts | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/config/schema.ts b/src/config/schema.ts index 96e9c426eb..d83875df50 100644 --- a/src/config/schema.ts +++ b/src/config/schema.ts @@ -1,5 +1,4 @@ import joi from 'joi'; -import collectionSchema from '../collections/config/schema'; import globalSchema from '../globals/config/schema'; const component = joi.alternatives().try( @@ -31,8 +30,7 @@ export default joi.object({ graphQL: joi.string(), graphQLPlayground: joi.string(), }), - collections: joi.array() - .items(collectionSchema), + collections: joi.array(), globals: joi.array() .items(globalSchema), admin: joi.object({ diff --git a/src/config/validate.ts b/src/config/validate.ts index ab51f57953..04d93c550c 100644 --- a/src/config/validate.ts +++ b/src/config/validate.ts @@ -1,24 +1,54 @@ import schema from './schema'; +import collectionSchema from '../collections/config/schema'; import Logger from '../utilities/logger'; import { PayloadConfig, Config } from './types'; +import { PayloadCollectionConfig } from '../collections/config/types'; const logger = Logger(); +const validateCollection = (collections: PayloadCollectionConfig[]): string[] => { + const collectionResults = {}; + collections.forEach((collection) => { + collectionResults[collection.slug] = collectionSchema.validate(collection, { abortEarly: false }); + }); + + const collectionErrors: string[] = []; + Object.keys(collectionResults).forEach((slug) => { + if (collectionResults[slug].error) { + collectionResults[slug].error.details.forEach(({ message }) => { + collectionErrors.push(`Collection "${slug}" > ${message}`); + }); + } + }); + return collectionErrors; +}; + const validateSchema = (config: PayloadConfig): Config => { const result = schema.validate(config, { abortEarly: false, }); - if (result.error) { - logger.error(`There were ${result.error.details.length} errors validating your Payload config`); + const collectionErrors = validateCollection(config.collections); - result.error.details.forEach(({ message }, i) => { - logger.error(`${i + 1}: ${message}`); + if (result.error || collectionErrors.length > 0) { + logger.error(`There were ${(result.error?.details?.length || 0) + collectionErrors.length} errors validating your Payload config`); + + let i = 0; + if (result.error) { + result.error.details.forEach(({ message }) => { + i += 1; + logger.error(`${i}: ${message}`); + }); + } + collectionErrors.forEach((message) => { + i += 1; + logger.error(`${i}: ${message}`); }); process.exit(1); } + return result.value as Config; }; From bb63b4aad153d125f68bf1fe1e9a3e4a5358ded9 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 21 Jul 2021 16:23:59 -0400 Subject: [PATCH 014/115] feat: add global slug and field names to schema validation errors --- src/collections/config/schema.ts | 4 +- src/config/schema.ts | 4 +- src/config/validate.ts | 64 ++++++++++++++++++++++++-------- src/globals/config/schema.ts | 7 ++-- 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/collections/config/schema.ts b/src/collections/config/schema.ts index ae653dd978..636e8a711f 100644 --- a/src/collections/config/schema.ts +++ b/src/collections/config/schema.ts @@ -1,5 +1,4 @@ import joi from 'joi'; -import fieldSchema from '../../fields/config/schema'; const component = joi.alternatives().try( joi.object().unknown(), @@ -34,8 +33,7 @@ const collectionSchema = joi.object().keys({ preview: joi.func(), disableDuplicate: joi.bool(), }), - fields: joi.array() - .items(fieldSchema), + fields: joi.array(), hooks: joi.object({ beforeOperation: joi.array().items(joi.func()), beforeValidate: joi.array().items(joi.func()), diff --git a/src/config/schema.ts b/src/config/schema.ts index d83875df50..b5f6df2386 100644 --- a/src/config/schema.ts +++ b/src/config/schema.ts @@ -1,5 +1,4 @@ import joi from 'joi'; -import globalSchema from '../globals/config/schema'; const component = joi.alternatives().try( joi.object().unknown(), @@ -31,8 +30,7 @@ export default joi.object({ graphQLPlayground: joi.string(), }), collections: joi.array(), - globals: joi.array() - .items(globalSchema), + globals: joi.array(), admin: joi.object({ user: joi.string(), meta: joi.object() diff --git a/src/config/validate.ts b/src/config/validate.ts index 04d93c550c..867fc39942 100644 --- a/src/config/validate.ts +++ b/src/config/validate.ts @@ -3,24 +3,53 @@ import collectionSchema from '../collections/config/schema'; import Logger from '../utilities/logger'; import { PayloadConfig, Config } from './types'; import { PayloadCollectionConfig } from '../collections/config/types'; +import fieldSchema from '../fields/config/schema'; +import { PayloadGlobalConfig } from '../globals/config/types'; +import globalSchema from '../globals/config/schema'; const logger = Logger(); -const validateCollection = (collections: PayloadCollectionConfig[]): string[] => { - const collectionResults = {}; - collections.forEach((collection) => { - collectionResults[collection.slug] = collectionSchema.validate(collection, { abortEarly: false }); - }); - - const collectionErrors: string[] = []; - Object.keys(collectionResults).forEach((slug) => { - if (collectionResults[slug].error) { - collectionResults[slug].error.details.forEach(({ message }) => { - collectionErrors.push(`Collection "${slug}" > ${message}`); +const validateFields = (context: string, collection: PayloadCollectionConfig): string[] => { + const errors: string[] = []; + collection.fields.forEach((field) => { + const result = fieldSchema.validate(field, { abortEarly: false }); + if (result.error) { + result.error.details.forEach(({ message }) => { + errors.push(`${context} "${collection.slug}" > Field "${field.name}" > ${message}`); }); } }); - return collectionErrors; + return errors; +}; + +const validateCollections = (collections: PayloadCollectionConfig[]): string[] => { + const errors: string[] = []; + collections.forEach((collection) => { + const result = collectionSchema.validate(collection, { abortEarly: false }); + if (result.error) { + result.error.details.forEach(({ message }) => { + errors.push(`Collection "${collection.slug}" > ${message}`); + }); + } + errors.push(...validateFields('Collection', collection)); + }); + + return errors; +}; + +const validateGlobals = (globals: PayloadGlobalConfig[]): string[] => { + const errors: string[] = []; + globals.forEach((global) => { + const result = globalSchema.validate(global, { abortEarly: false }); + if (result.error) { + result.error.details.forEach(({ message }) => { + errors.push(`Globals "${global.slug}" > ${message}`); + }); + } + errors.push(...validateFields('Global', global)); + }); + + return errors; }; const validateSchema = (config: PayloadConfig): Config => { @@ -28,10 +57,13 @@ const validateSchema = (config: PayloadConfig): Config => { abortEarly: false, }); - const collectionErrors = validateCollection(config.collections); + const nestedErrors = [ + ...validateCollections(config.collections), + ...validateGlobals(config.globals), + ]; - if (result.error || collectionErrors.length > 0) { - logger.error(`There were ${(result.error?.details?.length || 0) + collectionErrors.length} errors validating your Payload config`); + if (result.error || nestedErrors.length > 0) { + logger.error(`There were ${(result.error?.details?.length || 0) + nestedErrors.length} errors validating your Payload config`); let i = 0; if (result.error) { @@ -40,7 +72,7 @@ const validateSchema = (config: PayloadConfig): Config => { logger.error(`${i}: ${message}`); }); } - collectionErrors.forEach((message) => { + nestedErrors.forEach((message) => { i += 1; logger.error(`${i}: ${message}`); }); diff --git a/src/globals/config/schema.ts b/src/globals/config/schema.ts index 65717df64a..b7e6836786 100644 --- a/src/globals/config/schema.ts +++ b/src/globals/config/schema.ts @@ -1,7 +1,6 @@ import joi from 'joi'; -import fieldSchema from '../../fields/config/schema'; -const schema = joi.object().keys({ +const globalSchema = joi.object().keys({ slug: joi.string().required(), label: joi.string(), hooks: joi.object({ @@ -15,7 +14,7 @@ const schema = joi.object().keys({ read: joi.func(), update: joi.func(), }), - fields: joi.array().items(fieldSchema), + fields: joi.array(), }).unknown(); -export default schema; +export default globalSchema; From dac60a024b0eb7197d5a501daea342827ee7c751 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 23 Jul 2021 16:52:02 -0400 Subject: [PATCH 015/115] feat: add customizable admin field descriptions --- demo/collections/AllFields.ts | 19 ++++++++++ demo/collections/CustomComponents/index.ts | 12 +++++++ demo/customComponents/Description/index.tsx | 11 ++++++ src/admin/components/forms/Label/index.scss | 2 +- .../forms/RenderFieldDescription/index.scss | 8 +++++ .../forms/RenderFieldDescription/index.tsx | 35 +++++++++++++++++++ .../forms/RenderFieldDescription/types.ts | 5 +++ .../forms/field-types/Text/index.tsx | 10 ++++++ src/collections/config/types.ts | 2 +- src/fields/config/schema.ts | 5 +++ src/fields/config/types.ts | 20 +++++++---- 11 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 demo/customComponents/Description/index.tsx create mode 100644 src/admin/components/forms/RenderFieldDescription/index.scss create mode 100644 src/admin/components/forms/RenderFieldDescription/index.tsx create mode 100644 src/admin/components/forms/RenderFieldDescription/types.ts diff --git a/demo/collections/AllFields.ts b/demo/collections/AllFields.ts index 92a1f7348d..81338fbf31 100644 --- a/demo/collections/AllFields.ts +++ b/demo/collections/AllFields.ts @@ -40,6 +40,25 @@ const AllFields: PayloadCollectionConfig = { read: ({ req: { user } }) => Boolean(user), }, }, + { + name: 'descriptionText', + type: 'text', + label: 'Text with text description', + defaultValue: 'Default Value', + admin: { + description: 'This text describes the field', + }, + }, + { + name: 'descriptionFunction', + type: 'text', + label: 'Text with function description', + defaultValue: 'Default Value', + maxLength: 20, + admin: { + description: ({ value }) => (typeof value === 'string' ? `${20 - value.length} characters left` : ''), + }, + }, { name: 'image', type: 'upload', diff --git a/demo/collections/CustomComponents/index.ts b/demo/collections/CustomComponents/index.ts index d4fb667354..c784275b29 100644 --- a/demo/collections/CustomComponents/index.ts +++ b/demo/collections/CustomComponents/index.ts @@ -7,6 +7,7 @@ import GroupField from './components/fields/Group/Field'; import NestedGroupField from './components/fields/NestedGroupCustomField/Field'; import NestedText1Field from './components/fields/NestedText1/Field'; import ListView from './components/views/List'; +import CustomDescriptionComponent from '../../customComponents/Description'; const CustomComponents: PayloadCollectionConfig = { slug: 'custom-components', @@ -38,6 +39,17 @@ const CustomComponents: PayloadCollectionConfig = { }, }, }, + { + name: 'descriptionComponent', + type: 'text', + label: 'Text with description component', + defaultValue: 'Default Value', + admin: { + components: { + Description: CustomDescriptionComponent, + }, + }, + }, { name: 'array', label: 'Array', diff --git a/demo/customComponents/Description/index.tsx b/demo/customComponents/Description/index.tsx new file mode 100644 index 0000000000..581c56391a --- /dev/null +++ b/demo/customComponents/Description/index.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +const CustomDescriptionComponent: React.FC = ({ value }) => ( +

+ character count: + {' '} + { value.length } +
+); + +export default CustomDescriptionComponent; diff --git a/src/admin/components/forms/Label/index.scss b/src/admin/components/forms/Label/index.scss index 98c4ceeb69..c6b9c3b1fc 100644 --- a/src/admin/components/forms/Label/index.scss +++ b/src/admin/components/forms/Label/index.scss @@ -3,7 +3,7 @@ label.field-label { display: flex; padding-bottom: base(.25); - color: $color-gray; + color: $color-dark-gray; .required { color: $color-red; diff --git a/src/admin/components/forms/RenderFieldDescription/index.scss b/src/admin/components/forms/RenderFieldDescription/index.scss new file mode 100644 index 0000000000..2a6f97e10a --- /dev/null +++ b/src/admin/components/forms/RenderFieldDescription/index.scss @@ -0,0 +1,8 @@ +@import '../../../scss/styles.scss'; + +.field-description { + display: flex; + padding-top: base(.25); + padding-bottom: base(.25); + color: $color-gray; +} diff --git a/src/admin/components/forms/RenderFieldDescription/index.tsx b/src/admin/components/forms/RenderFieldDescription/index.tsx new file mode 100644 index 0000000000..255f125601 --- /dev/null +++ b/src/admin/components/forms/RenderFieldDescription/index.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Props } from './types'; +import './index.scss'; + +const RenderFieldDescription: React.FC = (props) => { + const { + description, + value, + CustomComponent, + } = props; + + if (CustomComponent) { + return ( +
+ +
+ ); + } + + if (description) { + return ( +
+ {typeof description === 'function' ? description({ value }) : description} +
+ ); + } + + return null; +}; + +export default RenderFieldDescription; diff --git a/src/admin/components/forms/RenderFieldDescription/types.ts b/src/admin/components/forms/RenderFieldDescription/types.ts new file mode 100644 index 0000000000..c784b8419b --- /dev/null +++ b/src/admin/components/forms/RenderFieldDescription/types.ts @@ -0,0 +1,5 @@ +export type Props = { + description?: string | ((value) => string); + CustomComponent?: React.ComponentType<{ value: unknown }>; + value: unknown; +} diff --git a/src/admin/components/forms/field-types/Text/index.tsx b/src/admin/components/forms/field-types/Text/index.tsx index 792e95803a..edbcfbb8ec 100644 --- a/src/admin/components/forms/field-types/Text/index.tsx +++ b/src/admin/components/forms/field-types/Text/index.tsx @@ -5,6 +5,7 @@ import Label from '../../Label'; import Error from '../../Error'; import { text } from '../../../../../fields/validations'; import { Props } from './types'; +import RenderFieldDescription from '../../RenderFieldDescription'; import './index.scss'; @@ -21,6 +22,10 @@ const Text: React.FC = (props) => { style, width, condition, + description, + components: { + Description, + } = {}, } = {}, } = props; @@ -73,6 +78,11 @@ const Text: React.FC = (props) => { id={path} name={path} /> +
); }; diff --git a/src/collections/config/types.ts b/src/collections/config/types.ts index 14e718d91f..1002251956 100644 --- a/src/collections/config/types.ts +++ b/src/collections/config/types.ts @@ -99,7 +99,7 @@ export type PayloadCollectionConfig = { admin?: { useAsTitle?: string; defaultColumns?: string[]; - disableDuplicate?: boolean + disableDuplicate?: boolean; components?: { views?: { Edit?: React.ComponentType diff --git a/src/fields/config/schema.ts b/src/fields/config/schema.ts index e3a958edde..b957206064 100644 --- a/src/fields/config/schema.ts +++ b/src/fields/config/schema.ts @@ -6,6 +6,10 @@ const component = joi.alternatives().try( ); export const baseAdminFields = joi.object().keys({ + description: joi.alternatives().try( + joi.string(), + joi.func(), + ), position: joi.string().valid('sidebar'), width: joi.string(), style: joi.object().unknown(), @@ -17,6 +21,7 @@ export const baseAdminFields = joi.object().keys({ Cell: component, Field: component, Filter: component, + Description: component, }).default({}), }); diff --git a/src/fields/config/types.ts b/src/fields/config/types.ts index 7d615d1ac9..2131e03d26 100644 --- a/src/fields/config/types.ts +++ b/src/fields/config/types.ts @@ -22,7 +22,7 @@ export type FieldAccess = (args: { siblingData: Record }) => Promise | boolean; -export type Condition = (data: Record, siblingData: Record) => boolean +export type Condition = (data: Record, siblingData: Record) => boolean; type Admin = { position?: string; @@ -31,7 +31,13 @@ type Admin = { readOnly?: boolean; disabled?: boolean; condition?: Condition; - components?: { [key: string]: React.ComponentType }; + description?: string | ((data: Record) => string); + components?: { + Filter?: React.ComponentType; + Cell?: React.ComponentType; + Field?: React.ComponentType; + Description?: React.ComponentType<{value: unknown}> + } hidden?: boolean } @@ -214,11 +220,11 @@ export type RadioField = FieldBase & { } export type Block = { - slug: string, - labels?: Labels - fields: Field[], - imageURL?: string - imageAltText?: string + slug: string; + labels?: Labels; + fields: Field[]; + imageURL?: string; + imageAltText?: string; } export type BlockField = FieldBase & { From 4544711f0e4ea0e78570b93717a4bf213946d9b3 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 26 Jul 2021 12:34:19 -0400 Subject: [PATCH 016/115] feat: add admin description to collections and globals --- demo/collections/AllFields.ts | 1 + demo/globals/NavigationArray.ts | 3 +++ src/admin/components/views/Global/Default.tsx | 6 ++++++ src/admin/components/views/Global/index.scss | 6 ++++++ src/admin/components/views/collections/List/Default.tsx | 6 ++++++ src/admin/components/views/collections/List/index.scss | 5 +++++ src/admin/components/views/collections/List/index.tsx | 2 +- src/collections/config/schema.ts | 1 + src/collections/config/types.ts | 1 + src/globals/config/schema.ts | 3 +++ src/globals/config/types.ts | 1 + 11 files changed, 34 insertions(+), 1 deletion(-) diff --git a/demo/collections/AllFields.ts b/demo/collections/AllFields.ts index 81338fbf31..4d0f38ba28 100644 --- a/demo/collections/AllFields.ts +++ b/demo/collections/AllFields.ts @@ -22,6 +22,7 @@ const AllFields: PayloadCollectionConfig = { return null; }, + description: 'Every type of field in one place', }, access: { read: () => true, diff --git a/demo/globals/NavigationArray.ts b/demo/globals/NavigationArray.ts index aa3151a182..f7384ffd33 100644 --- a/demo/globals/NavigationArray.ts +++ b/demo/globals/NavigationArray.ts @@ -7,6 +7,9 @@ export default { update: ({ req: { user } }) => checkRole(['admin', 'user'], user), read: () => true, }, + admin: { + description: 'A description for the editor', + }, fields: [ { name: 'array', diff --git a/src/admin/components/views/Global/Default.tsx b/src/admin/components/views/Global/Default.tsx index 7cc0de9a41..4c65d0b9aa 100644 --- a/src/admin/components/views/Global/Default.tsx +++ b/src/admin/components/views/Global/Default.tsx @@ -26,6 +26,9 @@ const DefaultGlobalView: React.FC = (props) => { fields, preview, label, + admin: { + description, + } = {}, } = global; const hasSavePermission = permissions?.update?.permission; @@ -55,6 +58,9 @@ const DefaultGlobalView: React.FC = (props) => { {' '} {label} + {description && ( +
{description}
+ )} = (props) => { singular: singularLabel, plural: pluralLabel, }, + admin: { + description, + }, }, data, newDocumentURL, @@ -52,6 +55,9 @@ const DefaultList: React.FC = (props) => { Create New )} + {description && ( +
{description}
+ )} = (props) => { const { permissions } = useAuth(); const location = useLocation(); const { setStepNav } = useStepNav(); - const { getPreference, setPreference } = usePreferences(); + const { getPreference } = usePreferences(); const [fields] = useState(() => formatFields(collection)); const [listControls, setListControls] = useState({}); diff --git a/src/collections/config/schema.ts b/src/collections/config/schema.ts index 636e8a711f..b657342fee 100644 --- a/src/collections/config/schema.ts +++ b/src/collections/config/schema.ts @@ -23,6 +23,7 @@ const collectionSchema = joi.object().keys({ admin: joi.object({ useAsTitle: joi.string(), defaultColumns: joi.array().items(joi.string()), + description: joi.string(), enableRichTextRelationship: joi.boolean(), components: joi.object({ views: joi.object({ diff --git a/src/collections/config/types.ts b/src/collections/config/types.ts index 1002251956..4e14d8f272 100644 --- a/src/collections/config/types.ts +++ b/src/collections/config/types.ts @@ -99,6 +99,7 @@ export type PayloadCollectionConfig = { admin?: { useAsTitle?: string; defaultColumns?: string[]; + description?: string; disableDuplicate?: boolean; components?: { views?: { diff --git a/src/globals/config/schema.ts b/src/globals/config/schema.ts index b7e6836786..2e9bf5b3ee 100644 --- a/src/globals/config/schema.ts +++ b/src/globals/config/schema.ts @@ -3,6 +3,9 @@ import joi from 'joi'; const globalSchema = joi.object().keys({ slug: joi.string().required(), label: joi.string(), + admin: joi.object({ + description: joi.string(), + }), hooks: joi.object({ beforeValidate: joi.array().items(joi.func()), beforeChange: joi.array().items(joi.func()), diff --git a/src/globals/config/types.ts b/src/globals/config/types.ts index a2013ff1dd..af1e9ade84 100644 --- a/src/globals/config/types.ts +++ b/src/globals/config/types.ts @@ -54,6 +54,7 @@ export type PayloadGlobalConfig = { } fields: Field[]; admin?: { + description: string, components?: { views?: { Edit?: React.ComponentType From 29a1108518c7942f8ae06a990393a6e0ad4b6b16 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 26 Jul 2021 17:26:09 -0400 Subject: [PATCH 017/115] feat: add descriptions to every allowed field type, globals and collections --- demo/collections/AllFields.ts | 9 +++++ demo/collections/Code.ts | 1 + demo/collections/CustomComponents/index.ts | 12 ------- demo/collections/Media.ts | 1 + demo/customComponents/Description/index.tsx | 11 ------ docs/configuration/collections.mdx | 1 + docs/configuration/globals.mdx | 1 + docs/fields/overview.mdx | 25 +++++++++++++ docs/fields/row.mdx | 2 +- .../index.scss | 0 .../index.tsx | 15 ++------ .../types.ts | 1 - .../forms/field-types/Array/Array.tsx | 8 +++++ .../forms/field-types/Array/index.scss | 8 +++++ .../forms/field-types/Array/types.ts | 3 +- .../forms/field-types/Blocks/Blocks.tsx | 8 +++++ .../forms/field-types/Blocks/index.scss | 8 +++++ .../forms/field-types/Blocks/types.ts | 5 +-- .../forms/field-types/Checkbox/index.tsx | 6 ++++ .../forms/field-types/Code/Code.tsx | 6 ++++ .../forms/field-types/DateTime/index.tsx | 6 ++++ .../forms/field-types/Email/index.tsx | 6 ++++ .../forms/field-types/Group/index.scss | 8 +++++ .../forms/field-types/Group/index.tsx | 14 ++++++-- .../forms/field-types/Number/index.tsx | 6 ++++ .../forms/field-types/Password/types.ts | 3 +- .../RadioGroup/RadioInput/index.scss | 4 +-- .../forms/field-types/RadioGroup/index.tsx | 6 ++++ .../forms/field-types/Relationship/index.tsx | 6 ++++ .../forms/field-types/RichText/RichText.tsx | 6 ++++ .../forms/field-types/Select/index.tsx | 6 ++++ .../forms/field-types/Text/index.tsx | 8 ++--- .../forms/field-types/Textarea/index.tsx | 6 ++++ .../forms/field-types/Upload/Add/index.scss | 9 ++++- .../forms/field-types/Upload/Add/index.tsx | 36 ++++++++++++------- .../Upload/SelectExisting/index.scss | 9 ++++- .../Upload/SelectExisting/index.tsx | 34 +++++++++++------- .../forms/field-types/Upload/index.tsx | 6 ++++ .../views/collections/List/Default.tsx | 2 +- src/fields/config/schema.ts | 7 +++- src/fields/config/types.ts | 6 ++-- src/globals/config/types.ts | 2 +- 42 files changed, 242 insertions(+), 85 deletions(-) delete mode 100644 demo/customComponents/Description/index.tsx rename src/admin/components/forms/{RenderFieldDescription => FieldDescription}/index.scss (100%) rename src/admin/components/forms/{RenderFieldDescription => FieldDescription}/index.tsx (56%) rename src/admin/components/forms/{RenderFieldDescription => FieldDescription}/types.ts (59%) diff --git a/demo/collections/AllFields.ts b/demo/collections/AllFields.ts index 4d0f38ba28..b11c607df3 100644 --- a/demo/collections/AllFields.ts +++ b/demo/collections/AllFields.ts @@ -65,6 +65,9 @@ const AllFields: PayloadCollectionConfig = { type: 'upload', label: 'Image', relationTo: 'media', + admin: { + description: 'No selfies', + }, }, { name: 'select', @@ -246,6 +249,9 @@ const AllFields: PayloadCollectionConfig = { label: 'Relationship to One Collection', name: 'relationship', relationTo: 'conditions', + admin: { + description: 'Relates to description', + }, }, { type: 'relationship', @@ -264,6 +270,9 @@ const AllFields: PayloadCollectionConfig = { type: 'textarea', label: 'Textarea', name: 'textarea', + admin: { + description: 'Hello textarea description', + }, }, { name: 'richText', diff --git a/demo/collections/Code.ts b/demo/collections/Code.ts index 3f473ba879..2bb4a87a2e 100644 --- a/demo/collections/Code.ts +++ b/demo/collections/Code.ts @@ -14,6 +14,7 @@ const Code: PayloadCollectionConfig = { required: true, admin: { language: 'js', + description: 'javascript example', }, }, ], diff --git a/demo/collections/CustomComponents/index.ts b/demo/collections/CustomComponents/index.ts index c784275b29..d4fb667354 100644 --- a/demo/collections/CustomComponents/index.ts +++ b/demo/collections/CustomComponents/index.ts @@ -7,7 +7,6 @@ import GroupField from './components/fields/Group/Field'; import NestedGroupField from './components/fields/NestedGroupCustomField/Field'; import NestedText1Field from './components/fields/NestedText1/Field'; import ListView from './components/views/List'; -import CustomDescriptionComponent from '../../customComponents/Description'; const CustomComponents: PayloadCollectionConfig = { slug: 'custom-components', @@ -39,17 +38,6 @@ const CustomComponents: PayloadCollectionConfig = { }, }, }, - { - name: 'descriptionComponent', - type: 'text', - label: 'Text with description component', - defaultValue: 'Default Value', - admin: { - components: { - Description: CustomDescriptionComponent, - }, - }, - }, { name: 'array', label: 'Array', diff --git a/demo/collections/Media.ts b/demo/collections/Media.ts index 16920ea69d..15eaadb168 100644 --- a/demo/collections/Media.ts +++ b/demo/collections/Media.ts @@ -11,6 +11,7 @@ const Media: PayloadCollectionConfig = { }, admin: { enableRichTextRelationship: true, + description: 'No selfies please', }, upload: { staticURL: '/media', diff --git a/demo/customComponents/Description/index.tsx b/demo/customComponents/Description/index.tsx deleted file mode 100644 index 581c56391a..0000000000 --- a/demo/customComponents/Description/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -const CustomDescriptionComponent: React.FC = ({ value }) => ( -
- character count: - {' '} - { value.length } -
-); - -export default CustomDescriptionComponent; diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index bdaa5816d4..d596dfd784 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -17,6 +17,7 @@ It's often best practice to write your Collections in separate files and then im | **`slug`** * | Unique, URL-friendly string that will act as an identifier for this Collection. | | **`fields`** * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [Click here](/docs/fields/overview) for a full list of field types as well as how to configure them. | | **`labels`** | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. | +| **`description`**| Text that displays below the Collection label in the List view to give editors more information. | | **`admin`** | Admin-specific configuration. See below for [more detail](#admin-options). | | **`hooks`** | Entry points to "tie in" to Collection actions at specific points. [More](/docs/hooks/overview#collection-hooks) | | **`access`** | Provide access control functions to define exactly who should be able to do what with Documents in this Collection. [More](/docs/access-control/overview/#collections) | diff --git a/docs/configuration/globals.mdx b/docs/configuration/globals.mdx index de134517d1..5de2bc6eed 100644 --- a/docs/configuration/globals.mdx +++ b/docs/configuration/globals.mdx @@ -17,6 +17,7 @@ As with Collection configs, it's often best practice to write your Globals in se | **`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. | | **`label`** | Singular label for use in identifying this Global throughout Payload. Auto-generated from slug if not defined. | +| **`description`**| Text that displays below the Collection label in the List view to give editors more information. | | **`admin`** | Admin-specific configuration. See below for [more detail](/docs/configuration/globals#admin-options). | | **`hooks`** | Entry points to "tie in" to collection actions at specific points. [More](/docs/hooks/overview#global-hooks) | | **`access`** | Provide access control functions to define exactly who should be able to do what with this Global. [More](/docs/access-control/overview/#globals) | diff --git a/docs/fields/overview.mdx b/docs/fields/overview.mdx index 3ae8097e5a..47a54b3d87 100644 --- a/docs/fields/overview.mdx +++ b/docs/fields/overview.mdx @@ -91,6 +91,7 @@ In addition to each field's base configuration, you can define specific traits a | ------------- | -------------| | `condition` | You can programmatically show / hide fields based on what other fields are doing. [Click here](#conditional-logic) for more info. | | `components` | All field components can be completely and easily swapped out for custom components that you define. [Click here](#custom-admin-components) for more info. | +| `description` | Text to display with the field to provide more information for the editor user using a string or function returning a string. [Click here](#description) for more info. | | `position` | Specify if the field should be rendered in the sidebar by defining `position: 'sidebar'`. | | `width` | Restrict the width of a field. you can pass any string-based value here, be it pixels, percentages, etc. This property is especially useful when fields are nested within a `Row` type where they can be organized horizontally. | | `readOnly` | Setting a field to `readOnly` has no effect on the API whatsoever but disables the admin component's editability to prevent editors from modifying the field's value. | @@ -138,3 +139,27 @@ The `condition` function should return a boolean that will control if the field ### Custom components All Payload fields support the ability to swap in your own React components with ease. For more information, including examples, [click here](/docs/admin/components#fields). + +### Description + +You can simply provide a string that will show by the field, but there are use cases where you may want to create some dynamic feedback. By using a function for the `description` property you can provide rich feedback in realtime the user interacts with the form. + +The `description` can be assigned a function can wth the parameter `{ value }` and can return the `string` you wish to display. + +**Example:** + +```js +{ + fields: [ + { + name: 'message', + type: 'text', + maxLength: 20, + admin: { + description: ({ value }) => (`${20 - value.length} characters left`) + } + } + ] +} +``` +This example will display the number of characters allowed as the user types. diff --git a/docs/fields/row.mdx b/docs/fields/row.mdx index 32ad232bbe..ede63f2667 100644 --- a/docs/fields/row.mdx +++ b/docs/fields/row.mdx @@ -15,7 +15,7 @@ keywords: row, fields, config, configuration, documentation, Content Management | Option | Description | | ---------------- | ----------- | | **`fields`** * | Array of field types to nest within this Row. | -| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. | +| **`admin`** | Admin-specific configuration excluding `description`, `readOnly`, and `hidden`. See the [default field admin config](/docs/fields/overview#admin-config) for more details. | *\* An asterisk denotes that a property is required.* diff --git a/src/admin/components/forms/RenderFieldDescription/index.scss b/src/admin/components/forms/FieldDescription/index.scss similarity index 100% rename from src/admin/components/forms/RenderFieldDescription/index.scss rename to src/admin/components/forms/FieldDescription/index.scss diff --git a/src/admin/components/forms/RenderFieldDescription/index.tsx b/src/admin/components/forms/FieldDescription/index.tsx similarity index 56% rename from src/admin/components/forms/RenderFieldDescription/index.tsx rename to src/admin/components/forms/FieldDescription/index.tsx index 255f125601..97c9363ae9 100644 --- a/src/admin/components/forms/RenderFieldDescription/index.tsx +++ b/src/admin/components/forms/FieldDescription/index.tsx @@ -2,23 +2,12 @@ import React from 'react'; import { Props } from './types'; import './index.scss'; -const RenderFieldDescription: React.FC = (props) => { +const FieldDescription: React.FC = (props) => { const { description, value, - CustomComponent, } = props; - if (CustomComponent) { - return ( -
- -
- ); - } - if (description) { return (
= (props) => { return null; }; -export default RenderFieldDescription; +export default FieldDescription; diff --git a/src/admin/components/forms/RenderFieldDescription/types.ts b/src/admin/components/forms/FieldDescription/types.ts similarity index 59% rename from src/admin/components/forms/RenderFieldDescription/types.ts rename to src/admin/components/forms/FieldDescription/types.ts index c784b8419b..77aac3a00c 100644 --- a/src/admin/components/forms/RenderFieldDescription/types.ts +++ b/src/admin/components/forms/FieldDescription/types.ts @@ -1,5 +1,4 @@ export type Props = { description?: string | ((value) => string); - CustomComponent?: React.ComponentType<{ value: unknown }>; value: unknown; } diff --git a/src/admin/components/forms/field-types/Array/Array.tsx b/src/admin/components/forms/field-types/Array/Array.tsx index e242351681..19c4aed892 100644 --- a/src/admin/components/forms/field-types/Array/Array.tsx +++ b/src/admin/components/forms/field-types/Array/Array.tsx @@ -11,6 +11,7 @@ import useFieldType from '../../useFieldType'; import Error from '../../Error'; import { array } from '../../../../../fields/validations'; import Banner from '../../../elements/Banner'; +import FieldDescription from '../../FieldDescription'; import { Props, RenderArrayProps } from './types'; import './index.scss'; @@ -31,6 +32,7 @@ const ArrayFieldType: React.FC = (props) => { admin: { readOnly, condition, + description, }, } = props; @@ -132,6 +134,7 @@ const ArrayFieldType: React.FC = (props) => { minRows={minRows} maxRows={maxRows} required={required} + description={description} /> ); }; @@ -156,6 +159,7 @@ const RenderArray = React.memo((props: RenderArrayProps) => { minRows, maxRows, required, + description, } = props; const hasMaxRows = maxRows && rows.length >= maxRows; @@ -173,6 +177,10 @@ const RenderArray = React.memo((props: RenderArrayProps) => {

{label}

+
{(provided) => ( diff --git a/src/admin/components/forms/field-types/Array/index.scss b/src/admin/components/forms/field-types/Array/index.scss index 1ef8fccc70..43b4c7a4c5 100644 --- a/src/admin/components/forms/field-types/Array/index.scss +++ b/src/admin/components/forms/field-types/Array/index.scss @@ -4,6 +4,14 @@ margin: base(2) 0; min-width: base(15); + &__header { + h3 { + margin-bottom: 0; + } + + margin-bottom: base(1); + } + &__error-wrap { position: relative; } diff --git a/src/admin/components/forms/field-types/Array/types.ts b/src/admin/components/forms/field-types/Array/types.ts index d9408fed57..067f45c811 100644 --- a/src/admin/components/forms/field-types/Array/types.ts +++ b/src/admin/components/forms/field-types/Array/types.ts @@ -1,5 +1,5 @@ import { Data } from '../../Form/types'; -import { ArrayField, Labels, Field } from '../../../../../fields/config/types'; +import { ArrayField, Labels, Field, Description } from '../../../../../fields/config/types'; import { FieldTypes } from '..'; import { FieldPermissions } from '../../../../../auth/types'; @@ -30,4 +30,5 @@ export type RenderArrayProps = { showError: boolean errorMessage: string rows: Data[] + description?: Description } diff --git a/src/admin/components/forms/field-types/Blocks/Blocks.tsx b/src/admin/components/forms/field-types/Blocks/Blocks.tsx index f168c8d904..b8850c4529 100644 --- a/src/admin/components/forms/field-types/Blocks/Blocks.tsx +++ b/src/admin/components/forms/field-types/Blocks/Blocks.tsx @@ -17,6 +17,7 @@ import Popup from '../../../elements/Popup'; import BlockSelector from './BlockSelector'; import { blocks as blocksValidator } from '../../../../../fields/validations'; import Banner from '../../../elements/Banner'; +import FieldDescription from '../../FieldDescription'; import { Props, RenderBlockProps } from './types'; import { DocumentPreferences } from '../../../../../preferences/types'; @@ -45,6 +46,7 @@ const Blocks: React.FC = (props) => { admin: { readOnly, condition, + description, }, } = props; @@ -181,6 +183,7 @@ const Blocks: React.FC = (props) => { minRows={minRows} maxRows={maxRows} required={required} + description={description} /> ); }; @@ -206,6 +209,7 @@ const RenderBlocks = React.memo((props: RenderBlockProps) => { minRows, maxRows, required, + description, } = props; const hasMaxRows = maxRows && rows.length >= maxRows; @@ -223,6 +227,10 @@ const RenderBlocks = React.memo((props: RenderBlockProps) => {

{label}

+
void + description?: Description } diff --git a/src/admin/components/forms/field-types/Checkbox/index.tsx b/src/admin/components/forms/field-types/Checkbox/index.tsx index c32f78c6b2..5d22dfbd62 100644 --- a/src/admin/components/forms/field-types/Checkbox/index.tsx +++ b/src/admin/components/forms/field-types/Checkbox/index.tsx @@ -4,6 +4,7 @@ import withCondition from '../../withCondition'; import Error from '../../Error'; import { checkbox } from '../../../../../fields/validations'; import Check from '../../../icons/Check'; +import FieldDescription from '../../FieldDescription'; import { Props } from './types'; import './index.scss'; @@ -24,6 +25,7 @@ const Checkbox: React.FC = (props) => { style, width, condition, + description, } = {}, } = props; @@ -87,6 +89,10 @@ const Checkbox: React.FC = (props) => { {label} + ); }; diff --git a/src/admin/components/forms/field-types/Code/Code.tsx b/src/admin/components/forms/field-types/Code/Code.tsx index 77f279cd2d..bb89d58b83 100644 --- a/src/admin/components/forms/field-types/Code/Code.tsx +++ b/src/admin/components/forms/field-types/Code/Code.tsx @@ -7,6 +7,7 @@ import useFieldType from '../../useFieldType'; import withCondition from '../../withCondition'; import Label from '../../Label'; import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; import { code } from '../../../../../fields/validations'; import { Props } from './types'; @@ -24,6 +25,7 @@ const Code: React.FC = (props) => { width, language, condition, + description, } = {}, label, minLength, @@ -94,6 +96,10 @@ const Code: React.FC = (props) => { pointerEvents: readOnly ? 'none' : 'auto', }} /> + ); }; diff --git a/src/admin/components/forms/field-types/DateTime/index.tsx b/src/admin/components/forms/field-types/DateTime/index.tsx index ae37e7ae3f..d2e749fd81 100644 --- a/src/admin/components/forms/field-types/DateTime/index.tsx +++ b/src/admin/components/forms/field-types/DateTime/index.tsx @@ -5,6 +5,7 @@ import withCondition from '../../withCondition'; import useFieldType from '../../useFieldType'; import Label from '../../Label'; import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; import { date as dateValidation } from '../../../../../fields/validations'; import { Props } from './types'; @@ -26,6 +27,7 @@ const DateTime: React.FC = (props) => { width, date, condition, + description, } = {}, } = props; @@ -80,6 +82,10 @@ const DateTime: React.FC = (props) => { value={value as Date} /> + ); }; diff --git a/src/admin/components/forms/field-types/Email/index.tsx b/src/admin/components/forms/field-types/Email/index.tsx index ddd3bb4ac9..8e8bf9e329 100644 --- a/src/admin/components/forms/field-types/Email/index.tsx +++ b/src/admin/components/forms/field-types/Email/index.tsx @@ -3,6 +3,7 @@ import withCondition from '../../withCondition'; import useFieldType from '../../useFieldType'; import Label from '../../Label'; import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; import { email } from '../../../../../fields/validations'; import { Props } from './types'; @@ -21,6 +22,7 @@ const Email: React.FC = (props) => { placeholder, autoComplete, condition, + description, } = {}, label, } = props; @@ -80,6 +82,10 @@ const Email: React.FC = (props) => { name={path} autoComplete={autoComplete} /> + ); }; diff --git a/src/admin/components/forms/field-types/Group/index.scss b/src/admin/components/forms/field-types/Group/index.scss index 4529bedfd0..8fe4316e1d 100644 --- a/src/admin/components/forms/field-types/Group/index.scss +++ b/src/admin/components/forms/field-types/Group/index.scss @@ -5,6 +5,14 @@ margin-bottom: base(2); display: flex; + &__header { + margin-bottom: base(1); + } + + &__title { + margin-bottom: 0; + } + &:hover { .field-type-gutter__content-container { box-shadow: #{$style-stroke-width-m} 0px 0px 0px $color-dark-gray; diff --git a/src/admin/components/forms/field-types/Group/index.tsx b/src/admin/components/forms/field-types/Group/index.tsx index 45512f35a6..f7cef62acf 100644 --- a/src/admin/components/forms/field-types/Group/index.tsx +++ b/src/admin/components/forms/field-types/Group/index.tsx @@ -1,6 +1,7 @@ import React from 'react'; import RenderFields from '../../RenderFields'; import withCondition from '../../withCondition'; +import FieldDescription from '../../FieldDescription'; import FieldTypeGutter from '../../FieldTypeGutter'; import { NegativeFieldGutterProvider } from '../../FieldTypeGutter/context'; import { Props } from './types'; @@ -21,6 +22,7 @@ const Group: React.FC = (props) => { style, width, hideGutter, + description, }, permissions, } = props; @@ -42,8 +44,16 @@ const Group: React.FC = (props) => { { !hideGutter && () }
- {label && ( -

{label}

+ {(label || description) && ( +
+ {label && ( +

{label}

+ )} + +
)}
diff --git a/src/admin/components/forms/field-types/Number/index.tsx b/src/admin/components/forms/field-types/Number/index.tsx index a84cae676b..15b8a92aa5 100644 --- a/src/admin/components/forms/field-types/Number/index.tsx +++ b/src/admin/components/forms/field-types/Number/index.tsx @@ -2,6 +2,7 @@ import React, { useCallback } from 'react'; import useFieldType from '../../useFieldType'; import Label from '../../Label'; import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; import withCondition from '../../withCondition'; import { number } from '../../../../../fields/validations'; import { Props } from './types'; @@ -24,6 +25,7 @@ const NumberField: React.FC = (props) => { step, placeholder, condition, + description, } = {}, } = props; @@ -90,6 +92,10 @@ const NumberField: React.FC = (props) => { name={path} step={step} /> +
); }; diff --git a/src/admin/components/forms/field-types/Password/types.ts b/src/admin/components/forms/field-types/Password/types.ts index 3cea2a9796..214b322c52 100644 --- a/src/admin/components/forms/field-types/Password/types.ts +++ b/src/admin/components/forms/field-types/Password/types.ts @@ -1,5 +1,5 @@ import React from 'react'; -import { Validate } from '../../../../../fields/config/types'; +import { Description, Validate } from '../../../../../fields/config/types'; export type Props = { autoComplete?: string @@ -10,4 +10,5 @@ export type Props = { style?: React.CSSProperties width?: string label?: string + description?: Description } diff --git a/src/admin/components/forms/field-types/RadioGroup/RadioInput/index.scss b/src/admin/components/forms/field-types/RadioGroup/RadioInput/index.scss index 1231ab92b1..0ad325d165 100644 --- a/src/admin/components/forms/field-types/RadioGroup/RadioInput/index.scss +++ b/src/admin/components/forms/field-types/RadioGroup/RadioInput/index.scss @@ -64,13 +64,13 @@ cursor: default; &__label { - color: $color-gray; + color: $color-dark-gray; } &--is-selected { .radio-input__styled-radio { &:before { - background-color: $color-gray; + background-color: $color-dark-gray; } } } diff --git a/src/admin/components/forms/field-types/RadioGroup/index.tsx b/src/admin/components/forms/field-types/RadioGroup/index.tsx index 553d49c14f..848306e000 100644 --- a/src/admin/components/forms/field-types/RadioGroup/index.tsx +++ b/src/admin/components/forms/field-types/RadioGroup/index.tsx @@ -4,6 +4,7 @@ import useFieldType from '../../useFieldType'; import withCondition from '../../withCondition'; import Error from '../../Error'; import Label from '../../Label'; +import FieldDescription from '../../FieldDescription'; import RadioInput from './RadioInput'; import { radio } from '../../../../../fields/validations'; import { optionIsObject } from '../../../../../fields/config/types'; @@ -26,6 +27,7 @@ const RadioGroup: React.FC = (props) => { style, width, condition, + description, } = {}, options, } = props; @@ -99,6 +101,10 @@ const RadioGroup: React.FC = (props) => { ); })} +
); }; diff --git a/src/admin/components/forms/field-types/Relationship/index.tsx b/src/admin/components/forms/field-types/Relationship/index.tsx index 4fb5cc4fbc..f41957378b 100644 --- a/src/admin/components/forms/field-types/Relationship/index.tsx +++ b/src/admin/components/forms/field-types/Relationship/index.tsx @@ -9,6 +9,7 @@ import { Value } from '../../../elements/ReactSelect/types'; import useFieldType from '../../useFieldType'; import Label from '../../Label'; import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; import { relationship } from '../../../../../fields/validations'; import { PaginatedDocs } from '../../../../../collections/config/types'; import { useFormProcessing } from '../../Form/context'; @@ -36,6 +37,7 @@ const Relationship: React.FC = (props) => { style, width, condition, + description, } = {}, } = props; @@ -393,6 +395,10 @@ const Relationship: React.FC = (props) => { {errorLoading} )} + ); }; diff --git a/src/admin/components/forms/field-types/RichText/RichText.tsx b/src/admin/components/forms/field-types/RichText/RichText.tsx index cf939a8c6c..11717ae094 100644 --- a/src/admin/components/forms/field-types/RichText/RichText.tsx +++ b/src/admin/components/forms/field-types/RichText/RichText.tsx @@ -15,6 +15,7 @@ import hotkeys from './hotkeys'; import enablePlugins from './enablePlugins'; import defaultValue from '../../../../../fields/richText/defaultValue'; import FieldTypeGutter from '../../FieldTypeGutter'; +import FieldDescription from '../../FieldDescription'; import withHTML from './plugins/withHTML'; import { Props } from './types'; import { RichTextElement, RichTextLeaf } from '../../../../../fields/config/types'; @@ -44,6 +45,7 @@ const RichText: React.FC = (props) => { width, placeholder, condition, + description, hideGutter, } = {}, } = props; @@ -299,6 +301,10 @@ const RichText: React.FC = (props) => { /> + ); diff --git a/src/admin/components/forms/field-types/Select/index.tsx b/src/admin/components/forms/field-types/Select/index.tsx index 9a5ae8e914..3c3985df1b 100644 --- a/src/admin/components/forms/field-types/Select/index.tsx +++ b/src/admin/components/forms/field-types/Select/index.tsx @@ -4,6 +4,7 @@ import ReactSelect from '../../../elements/ReactSelect'; import useFieldType from '../../useFieldType'; import Label from '../../Label'; import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; import { select } from '../../../../../fields/validations'; import { Option } from '../../../../../fields/config/types'; import { Props, Option as ReactSelectOption } from './types'; @@ -37,6 +38,7 @@ const Select: React.FC = (props) => { style, width, condition, + description, } = {}, } = props; @@ -110,6 +112,10 @@ const Select: React.FC = (props) => { options={options} isMulti={hasMany} /> + ); }; diff --git a/src/admin/components/forms/field-types/Text/index.tsx b/src/admin/components/forms/field-types/Text/index.tsx index edbcfbb8ec..5f28a2ec18 100644 --- a/src/admin/components/forms/field-types/Text/index.tsx +++ b/src/admin/components/forms/field-types/Text/index.tsx @@ -5,7 +5,7 @@ import Label from '../../Label'; import Error from '../../Error'; import { text } from '../../../../../fields/validations'; import { Props } from './types'; -import RenderFieldDescription from '../../RenderFieldDescription'; +import FieldDescription from '../../FieldDescription'; import './index.scss'; @@ -23,9 +23,6 @@ const Text: React.FC = (props) => { width, condition, description, - components: { - Description, - } = {}, } = {}, } = props; @@ -78,10 +75,9 @@ const Text: React.FC = (props) => { id={path} name={path} /> - ); diff --git a/src/admin/components/forms/field-types/Textarea/index.tsx b/src/admin/components/forms/field-types/Textarea/index.tsx index 22192690a5..4d51ad757e 100644 --- a/src/admin/components/forms/field-types/Textarea/index.tsx +++ b/src/admin/components/forms/field-types/Textarea/index.tsx @@ -3,6 +3,7 @@ import useFieldType from '../../useFieldType'; import withCondition from '../../withCondition'; import Label from '../../Label'; import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; import { textarea } from '../../../../../fields/validations'; import { Props } from './types'; @@ -21,6 +22,7 @@ const Textarea: React.FC = (props) => { placeholder, rows, condition, + description, } = {}, label, minLength, @@ -79,6 +81,10 @@ const Textarea: React.FC = (props) => { name={path} rows={rows} /> + ); }; diff --git a/src/admin/components/forms/field-types/Upload/Add/index.scss b/src/admin/components/forms/field-types/Upload/Add/index.scss index 8528e2a233..e4048a079d 100644 --- a/src/admin/components/forms/field-types/Upload/Add/index.scss +++ b/src/admin/components/forms/field-types/Upload/Add/index.scss @@ -11,9 +11,12 @@ } &__header { - display: flex; margin-bottom: $baseline; + div { + display: flex; + } + h1 { margin: 0 auto 0 0; } @@ -22,4 +25,8 @@ margin: 0 0 0 $baseline; } } + + &__sub-header { + margin-top: base(.25); + } } diff --git a/src/admin/components/forms/field-types/Upload/Add/index.tsx b/src/admin/components/forms/field-types/Upload/Add/index.tsx index 6ebd9f86fc..3fa0127430 100644 --- a/src/admin/components/forms/field-types/Upload/Add/index.tsx +++ b/src/admin/components/forms/field-types/Upload/Add/index.tsx @@ -17,6 +17,11 @@ const baseClass = 'add-upload-modal'; const AddUploadModal: React.FC = (props) => { const { collection, + collection: { + admin: { + description, + } = {}, + } = {}, slug, fieldTypes, setValue, @@ -50,19 +55,24 @@ const AddUploadModal: React.FC = (props) => { disableSuccessStatus >
-

- New - {' '} - {collection.labels.singular} -

- Save -
= (props) => { collection, collection: { slug: collectionSlug, + admin: { + description, + } = {}, } = {}, slug: modalSlug, } = props; @@ -68,19 +71,24 @@ const SelectExistingUploadModal: React.FC = (props) => { {isOpen && (
-

- {' '} - Select existing - {' '} - {collection.labels.singular} -

-
= (props) => { style, width, condition, + description, } = {}, label, validate = upload, @@ -161,6 +163,10 @@ const Upload: React.FC = (props) => { addModalSlug, }} /> + )} diff --git a/src/admin/components/views/collections/List/Default.tsx b/src/admin/components/views/collections/List/Default.tsx index b0106364c4..6f7241a633 100644 --- a/src/admin/components/views/collections/List/Default.tsx +++ b/src/admin/components/views/collections/List/Default.tsx @@ -27,7 +27,7 @@ const DefaultList: React.FC = (props) => { }, admin: { description, - }, + } = {}, }, data, newDocumentURL, diff --git a/src/fields/config/schema.ts b/src/fields/config/schema.ts index b957206064..4d8b947ddb 100644 --- a/src/fields/config/schema.ts +++ b/src/fields/config/schema.ts @@ -21,7 +21,6 @@ export const baseAdminFields = joi.object().keys({ Cell: component, Field: component, Filter: component, - Description: component, }).default({}), }); @@ -146,6 +145,11 @@ export const radio = baseField.keys({ export const row = baseField.keys({ type: joi.string().valid('row').required(), fields: joi.array().items(joi.link('#field')), + admin: baseAdminFields.keys({ + description: joi.forbidden(), + readOnly: joi.forbidden(), + hidden: joi.forbidden(), + }), }); export const group = baseField.keys({ @@ -155,6 +159,7 @@ export const group = baseField.keys({ defaultValue: joi.object(), admin: baseAdminFields.keys({ hideGutter: joi.boolean().default(false), + description: joi.string(), }), }); diff --git a/src/fields/config/types.ts b/src/fields/config/types.ts index 2131e03d26..2ec10950f2 100644 --- a/src/fields/config/types.ts +++ b/src/fields/config/types.ts @@ -31,16 +31,17 @@ type Admin = { readOnly?: boolean; disabled?: boolean; condition?: Condition; - description?: string | ((data: Record) => string); + description?: Description; components?: { Filter?: React.ComponentType; Cell?: React.ComponentType; Field?: React.ComponentType; - Description?: React.ComponentType<{value: unknown}> } hidden?: boolean } +export type Description = string | ((value: Record) => string); + export type Labels = { singular: string; plural: string; @@ -136,6 +137,7 @@ export type GroupField = FieldBase & { fields: Field[]; admin?: Admin & { hideGutter?: boolean + description?: string } } diff --git a/src/globals/config/types.ts b/src/globals/config/types.ts index af1e9ade84..812125e2e0 100644 --- a/src/globals/config/types.ts +++ b/src/globals/config/types.ts @@ -54,7 +54,7 @@ export type PayloadGlobalConfig = { } fields: Field[]; admin?: { - description: string, + description?: string, components?: { views?: { Edit?: React.ComponentType From e0933f612a70af0a18c88ef96e7af0878e20cf01 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Jul 2021 12:09:08 -0400 Subject: [PATCH 018/115] feat: add component support to field description --- demo/collections/CustomComponents/index.ts | 9 +++++ demo/customComponents/Description/index.tsx | 11 ++++++ docs/fields/overview.mdx | 37 ++++++++++++++++--- .../forms/FieldDescription/index.tsx | 8 +++- .../forms/FieldDescription/types.ts | 14 ++++++- .../forms/field-types/Array/Array.tsx | 2 +- .../forms/field-types/Blocks/Blocks.tsx | 2 +- .../forms/field-types/Code/Code.tsx | 2 +- .../forms/field-types/DateTime/index.tsx | 2 +- .../forms/field-types/Email/index.tsx | 2 +- .../forms/field-types/Number/index.tsx | 2 +- .../forms/field-types/RichText/RichText.tsx | 2 +- .../forms/field-types/Select/index.tsx | 2 +- .../forms/field-types/Text/index.tsx | 4 +- .../forms/field-types/Textarea/index.tsx | 2 +- .../forms/field-types/Upload/index.tsx | 2 +- 16 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 demo/customComponents/Description/index.tsx diff --git a/demo/collections/CustomComponents/index.ts b/demo/collections/CustomComponents/index.ts index d4fb667354..86d4bde792 100644 --- a/demo/collections/CustomComponents/index.ts +++ b/demo/collections/CustomComponents/index.ts @@ -7,6 +7,7 @@ import GroupField from './components/fields/Group/Field'; import NestedGroupField from './components/fields/NestedGroupCustomField/Field'; import NestedText1Field from './components/fields/NestedText1/Field'; import ListView from './components/views/List'; +import CustomDescriptionComponent from '../../customComponents/Description'; const CustomComponents: PayloadCollectionConfig = { slug: 'custom-components', @@ -38,6 +39,14 @@ const CustomComponents: PayloadCollectionConfig = { }, }, }, + { + name: 'componentDescription', + label: 'Component Description', + type: 'text', + admin: { + description: CustomDescriptionComponent, + }, + }, { name: 'array', label: 'Array', diff --git a/demo/customComponents/Description/index.tsx b/demo/customComponents/Description/index.tsx new file mode 100644 index 0000000000..41433a43ef --- /dev/null +++ b/demo/customComponents/Description/index.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +const CustomDescriptionComponent: React.FC = ({ value }) => ( +
+ Character count: + {' '} + { value?.length || 0 } +
+); + +export default CustomDescriptionComponent; diff --git a/docs/fields/overview.mdx b/docs/fields/overview.mdx index 47a54b3d87..58027874c2 100644 --- a/docs/fields/overview.mdx +++ b/docs/fields/overview.mdx @@ -91,7 +91,7 @@ In addition to each field's base configuration, you can define specific traits a | ------------- | -------------| | `condition` | You can programmatically show / hide fields based on what other fields are doing. [Click here](#conditional-logic) for more info. | | `components` | All field components can be completely and easily swapped out for custom components that you define. [Click here](#custom-admin-components) for more info. | -| `description` | Text to display with the field to provide more information for the editor user using a string or function returning a string. [Click here](#description) for more info. | +| `description` | Helper text to display with the field to provide more information for the editor user. [Click here](#description) for more info. | | `position` | Specify if the field should be rendered in the sidebar by defining `position: 'sidebar'`. | | `width` | Restrict the width of a field. you can pass any string-based value here, be it pixels, percentages, etc. This property is especially useful when fields are nested within a `Row` type where they can be organized horizontally. | | `readOnly` | Setting a field to `readOnly` has no effect on the API whatsoever but disables the admin component's editability to prevent editors from modifying the field's value. | @@ -142,11 +142,14 @@ All Payload fields support the ability to swap in your own React components with ### Description -You can simply provide a string that will show by the field, but there are use cases where you may want to create some dynamic feedback. By using a function for the `description` property you can provide rich feedback in realtime the user interacts with the form. +A description can be configured three ways. +- As a string +- As a function that accepts an object containing the field's value, which returns a string +- As a React component that accepts value as a prop -The `description` can be assigned a function can wth the parameter `{ value }` and can return the `string` you wish to display. +As shown above, you can simply provide a string that will show by the field, but there are use cases where you may want to create some dynamic feedback. By using a function or a component for the `description` property you can provide rich feedback in realtime the user interacts with the form. -**Example:** +**Function Example:** ```js { @@ -156,10 +159,34 @@ The `description` can be assigned a function can wth the parameter `{ value }` a type: 'text', maxLength: 20, admin: { - description: ({ value }) => (`${20 - value.length} characters left`) + description: ({ value }) => (`${typeof value === 'string' ? 20 - value.length : '20'} characters left`) } } ] } ``` This example will display the number of characters allowed as the user types. + +**Component Example:** +```js +{ + fields: [ + { + name: 'message', + type: 'text', + maxLength: 20, + admin: { + description: + ({ value }) => ( +
+ Character count: + {' '} + { value?.length || 0 } +
+ ) + } + } + ] +} +``` +This component will count the number of characters entered. diff --git a/src/admin/components/forms/FieldDescription/index.tsx b/src/admin/components/forms/FieldDescription/index.tsx index 97c9363ae9..0ec54ac769 100644 --- a/src/admin/components/forms/FieldDescription/index.tsx +++ b/src/admin/components/forms/FieldDescription/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Props } from './types'; +import { Props, isComponent } from './types'; import './index.scss'; const FieldDescription: React.FC = (props) => { @@ -8,6 +8,12 @@ const FieldDescription: React.FC = (props) => { value, } = props; + + if (isComponent(description)) { + const Description = description; + return ; + } + if (description) { return (
string + +export type DescriptionComponent = React.ComponentType<{value: unknown}> + +type Description = string | DescriptionFunction | DescriptionComponent + export type Props = { - description?: string | ((value) => string); + description?: Description value: unknown; } + +export function isComponent(description: Description): description is DescriptionComponent { + return React.isValidElement(description); +} diff --git a/src/admin/components/forms/field-types/Array/Array.tsx b/src/admin/components/forms/field-types/Array/Array.tsx index 19c4aed892..3a8e8f95fc 100644 --- a/src/admin/components/forms/field-types/Array/Array.tsx +++ b/src/admin/components/forms/field-types/Array/Array.tsx @@ -178,7 +178,7 @@ const RenderArray = React.memo((props: RenderArrayProps) => {

{label}

diff --git a/src/admin/components/forms/field-types/Blocks/Blocks.tsx b/src/admin/components/forms/field-types/Blocks/Blocks.tsx index b8850c4529..672c6a4d74 100644 --- a/src/admin/components/forms/field-types/Blocks/Blocks.tsx +++ b/src/admin/components/forms/field-types/Blocks/Blocks.tsx @@ -228,7 +228,7 @@ const RenderBlocks = React.memo((props: RenderBlockProps) => {

{label}

diff --git a/src/admin/components/forms/field-types/Code/Code.tsx b/src/admin/components/forms/field-types/Code/Code.tsx index bb89d58b83..fb3c8547da 100644 --- a/src/admin/components/forms/field-types/Code/Code.tsx +++ b/src/admin/components/forms/field-types/Code/Code.tsx @@ -97,7 +97,7 @@ const Code: React.FC = (props) => { }} />
diff --git a/src/admin/components/forms/field-types/DateTime/index.tsx b/src/admin/components/forms/field-types/DateTime/index.tsx index d2e749fd81..99a0e34219 100644 --- a/src/admin/components/forms/field-types/DateTime/index.tsx +++ b/src/admin/components/forms/field-types/DateTime/index.tsx @@ -83,7 +83,7 @@ const DateTime: React.FC = (props) => { /> diff --git a/src/admin/components/forms/field-types/Email/index.tsx b/src/admin/components/forms/field-types/Email/index.tsx index 8e8bf9e329..137deb1eb8 100644 --- a/src/admin/components/forms/field-types/Email/index.tsx +++ b/src/admin/components/forms/field-types/Email/index.tsx @@ -83,7 +83,7 @@ const Email: React.FC = (props) => { autoComplete={autoComplete} /> diff --git a/src/admin/components/forms/field-types/Number/index.tsx b/src/admin/components/forms/field-types/Number/index.tsx index 15b8a92aa5..3279611393 100644 --- a/src/admin/components/forms/field-types/Number/index.tsx +++ b/src/admin/components/forms/field-types/Number/index.tsx @@ -93,7 +93,7 @@ const NumberField: React.FC = (props) => { step={step} /> diff --git a/src/admin/components/forms/field-types/RichText/RichText.tsx b/src/admin/components/forms/field-types/RichText/RichText.tsx index 11717ae094..cdea22e365 100644 --- a/src/admin/components/forms/field-types/RichText/RichText.tsx +++ b/src/admin/components/forms/field-types/RichText/RichText.tsx @@ -302,7 +302,7 @@ const RichText: React.FC = (props) => { diff --git a/src/admin/components/forms/field-types/Select/index.tsx b/src/admin/components/forms/field-types/Select/index.tsx index 3c3985df1b..0ce1e67fb2 100644 --- a/src/admin/components/forms/field-types/Select/index.tsx +++ b/src/admin/components/forms/field-types/Select/index.tsx @@ -113,7 +113,7 @@ const Select: React.FC = (props) => { isMulti={hasMany} /> diff --git a/src/admin/components/forms/field-types/Text/index.tsx b/src/admin/components/forms/field-types/Text/index.tsx index 5f28a2ec18..e9c0d4ab78 100644 --- a/src/admin/components/forms/field-types/Text/index.tsx +++ b/src/admin/components/forms/field-types/Text/index.tsx @@ -67,7 +67,7 @@ const Text: React.FC = (props) => { required={required} /> = (props) => { name={path} /> diff --git a/src/admin/components/forms/field-types/Textarea/index.tsx b/src/admin/components/forms/field-types/Textarea/index.tsx index 4d51ad757e..8d570114e3 100644 --- a/src/admin/components/forms/field-types/Textarea/index.tsx +++ b/src/admin/components/forms/field-types/Textarea/index.tsx @@ -82,7 +82,7 @@ const Textarea: React.FC = (props) => { rows={rows} /> diff --git a/src/admin/components/forms/field-types/Upload/index.tsx b/src/admin/components/forms/field-types/Upload/index.tsx index d424c1d792..91a727f632 100644 --- a/src/admin/components/forms/field-types/Upload/index.tsx +++ b/src/admin/components/forms/field-types/Upload/index.tsx @@ -164,7 +164,7 @@ const Upload: React.FC = (props) => { }} /> From fe0098ccd9b3477b47985222659a0e3fc2e7bb3b Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Jul 2021 12:37:37 -0400 Subject: [PATCH 019/115] feat: add component support to collection and global description --- demo/collections/AllFields.ts | 3 +- demo/collections/CustomComponents/index.ts | 2 +- .../CollectionDescription/index.tsx | 9 ++++++ docs/configuration/collections.mdx | 2 +- docs/configuration/globals.mdx | 2 +- .../elements/ViewDescription/index.scss | 0 .../elements/ViewDescription/index.tsx | 28 +++++++++++++++++++ .../elements/ViewDescription/types.ts | 15 ++++++++++ src/admin/components/views/Global/Default.tsx | 5 +++- .../views/collections/List/Default.tsx | 5 +++- src/collections/config/schema.ts | 15 +++++----- src/collections/config/types.ts | 2 +- src/fields/config/schema.ts | 26 ++++++++--------- src/fields/config/types.ts | 1 - src/globals/config/schema.ts | 6 +++- src/globals/config/types.ts | 2 +- src/utilities/componentSchema.ts | 6 ++++ 17 files changed, 96 insertions(+), 33 deletions(-) create mode 100644 demo/customComponents/CollectionDescription/index.tsx create mode 100644 src/admin/components/elements/ViewDescription/index.scss create mode 100644 src/admin/components/elements/ViewDescription/index.tsx create mode 100644 src/admin/components/elements/ViewDescription/types.ts create mode 100644 src/utilities/componentSchema.ts diff --git a/demo/collections/AllFields.ts b/demo/collections/AllFields.ts index b11c607df3..d69518f41b 100644 --- a/demo/collections/AllFields.ts +++ b/demo/collections/AllFields.ts @@ -4,6 +4,7 @@ import Email from '../blocks/Email'; import Quote from '../blocks/Quote'; import NumberBlock from '../blocks/Number'; import CallToAction from '../blocks/CallToAction'; +import CollectionDescription from '../customComponents/CollectionDescription'; const AllFields: PayloadCollectionConfig = { slug: 'all-fields', @@ -22,7 +23,7 @@ const AllFields: PayloadCollectionConfig = { return null; }, - description: 'Every type of field in one place', + description: CollectionDescription, }, access: { read: () => true, diff --git a/demo/collections/CustomComponents/index.ts b/demo/collections/CustomComponents/index.ts index 86d4bde792..804a028725 100644 --- a/demo/collections/CustomComponents/index.ts +++ b/demo/collections/CustomComponents/index.ts @@ -41,7 +41,7 @@ const CustomComponents: PayloadCollectionConfig = { }, { name: 'componentDescription', - label: 'Component Description', + label: 'Component ViewDescription', type: 'text', admin: { description: CustomDescriptionComponent, diff --git a/demo/customComponents/CollectionDescription/index.tsx b/demo/customComponents/CollectionDescription/index.tsx new file mode 100644 index 0000000000..b53f6865f1 --- /dev/null +++ b/demo/customComponents/CollectionDescription/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +const CollectionDescription: React.FC = () => ( +
+ Collection description +
+); + +export default CollectionDescription; diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index d596dfd784..36562b8429 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -17,7 +17,7 @@ It's often best practice to write your Collections in separate files and then im | **`slug`** * | Unique, URL-friendly string that will act as an identifier for this Collection. | | **`fields`** * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [Click here](/docs/fields/overview) for a full list of field types as well as how to configure them. | | **`labels`** | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. | -| **`description`**| Text that displays below the Collection label in the List view to give editors more information. | +| **`description`**| Text or React component to display below the Collection label in the List view to give editors more information. | | **`admin`** | Admin-specific configuration. See below for [more detail](#admin-options). | | **`hooks`** | Entry points to "tie in" to Collection actions at specific points. [More](/docs/hooks/overview#collection-hooks) | | **`access`** | Provide access control functions to define exactly who should be able to do what with Documents in this Collection. [More](/docs/access-control/overview/#collections) | diff --git a/docs/configuration/globals.mdx b/docs/configuration/globals.mdx index 5de2bc6eed..516b22a0e0 100644 --- a/docs/configuration/globals.mdx +++ b/docs/configuration/globals.mdx @@ -17,7 +17,7 @@ As with Collection configs, it's often best practice to write your Globals in se | **`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. | | **`label`** | Singular label for use in identifying this Global throughout Payload. Auto-generated from slug if not defined. | -| **`description`**| Text that displays below the Collection label in the List view to give editors more information. | +| **`description`**| Text or React component to display below the Global header to give editors more information. | | **`admin`** | Admin-specific configuration. See below for [more detail](/docs/configuration/globals#admin-options). | | **`hooks`** | Entry points to "tie in" to collection actions at specific points. [More](/docs/hooks/overview#global-hooks) | | **`access`** | Provide access control functions to define exactly who should be able to do what with this Global. [More](/docs/access-control/overview/#globals) | diff --git a/src/admin/components/elements/ViewDescription/index.scss b/src/admin/components/elements/ViewDescription/index.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/admin/components/elements/ViewDescription/index.tsx b/src/admin/components/elements/ViewDescription/index.tsx new file mode 100644 index 0000000000..5872c7f449 --- /dev/null +++ b/src/admin/components/elements/ViewDescription/index.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { Props, isComponent } from './types'; +import './index.scss'; + +const ViewDescription: React.FC = (props) => { + const { + description, + } = props; + + if (isComponent(description)) { + const Description = description; + return ; + } + + if (description) { + return ( +
+ {typeof description === 'function' ? description() : description} +
+ ); + } + + return null; +}; + +export default ViewDescription; diff --git a/src/admin/components/elements/ViewDescription/types.ts b/src/admin/components/elements/ViewDescription/types.ts new file mode 100644 index 0000000000..0c5404ab29 --- /dev/null +++ b/src/admin/components/elements/ViewDescription/types.ts @@ -0,0 +1,15 @@ +import React from 'react'; + +export type DescriptionFunction = () => string + +export type DescriptionComponent = React.ComponentType + +type Description = string | DescriptionFunction | DescriptionComponent + +export type Props = { + description?: Description +} + +export function isComponent(description: Description): description is DescriptionComponent { + return React.isValidElement(description); +} diff --git a/src/admin/components/views/Global/Default.tsx b/src/admin/components/views/Global/Default.tsx index 4c65d0b9aa..042a8c69f0 100644 --- a/src/admin/components/views/Global/Default.tsx +++ b/src/admin/components/views/Global/Default.tsx @@ -13,6 +13,7 @@ import LeaveWithoutSaving from '../../modals/LeaveWithoutSaving'; import { Props } from './types'; import './index.scss'; +import ViewDescription from '../../elements/ViewDescription'; const baseClass = 'global-edit'; @@ -59,7 +60,9 @@ const DefaultGlobalView: React.FC = (props) => { {label} {description && ( -
{description}
+
+ +
)} = (props) => { )} {description && ( -
{description}
+
+ +
)} string); disableDuplicate?: boolean; components?: { views?: { diff --git a/src/fields/config/schema.ts b/src/fields/config/schema.ts index 4d8b947ddb..49eb9d38d3 100644 --- a/src/fields/config/schema.ts +++ b/src/fields/config/schema.ts @@ -1,14 +1,10 @@ import joi from 'joi'; - -const component = joi.alternatives().try( - joi.object().unknown(), - joi.func(), -); +import { componentSchema } from '../../utilities/componentSchema'; export const baseAdminFields = joi.object().keys({ description: joi.alternatives().try( joi.string(), - joi.func(), + componentSchema, ), position: joi.string().valid('sidebar'), width: joi.string(), @@ -18,9 +14,9 @@ export const baseAdminFields = joi.object().keys({ disabled: joi.boolean().default(false), condition: joi.func(), components: joi.object().keys({ - Cell: component, - Field: component, - Filter: component, + Cell: componentSchema, + Field: componentSchema, + Filter: componentSchema, }).default({}), }); @@ -235,9 +231,9 @@ export const richText = baseField.keys({ joi.string(), joi.object({ name: joi.string().required(), - Button: component, - Element: component, - plugins: joi.array().items(component), + Button: componentSchema, + Element: componentSchema, + plugins: joi.array().items(componentSchema), }), ), ), @@ -246,9 +242,9 @@ export const richText = baseField.keys({ joi.string(), joi.object({ name: joi.string().required(), - Button: component, - Leaf: component, - plugins: joi.array().items(component), + Button: componentSchema, + Leaf: componentSchema, + plugins: joi.array().items(componentSchema), }), ), ), diff --git a/src/fields/config/types.ts b/src/fields/config/types.ts index 2ec10950f2..f98739f5c8 100644 --- a/src/fields/config/types.ts +++ b/src/fields/config/types.ts @@ -137,7 +137,6 @@ export type GroupField = FieldBase & { fields: Field[]; admin?: Admin & { hideGutter?: boolean - description?: string } } diff --git a/src/globals/config/schema.ts b/src/globals/config/schema.ts index 2e9bf5b3ee..a8ff605021 100644 --- a/src/globals/config/schema.ts +++ b/src/globals/config/schema.ts @@ -1,10 +1,14 @@ import joi from 'joi'; +import { componentSchema } from '../../utilities/componentSchema'; const globalSchema = joi.object().keys({ slug: joi.string().required(), label: joi.string(), admin: joi.object({ - description: joi.string(), + description: joi.alternatives().try( + joi.string(), + componentSchema, + ), }), hooks: joi.object({ beforeValidate: joi.array().items(joi.func()), diff --git a/src/globals/config/types.ts b/src/globals/config/types.ts index 812125e2e0..e35d93b44f 100644 --- a/src/globals/config/types.ts +++ b/src/globals/config/types.ts @@ -54,7 +54,7 @@ export type PayloadGlobalConfig = { } fields: Field[]; admin?: { - description?: string, + description?: string | (() => string); components?: { views?: { Edit?: React.ComponentType diff --git a/src/utilities/componentSchema.ts b/src/utilities/componentSchema.ts new file mode 100644 index 0000000000..69de5be563 --- /dev/null +++ b/src/utilities/componentSchema.ts @@ -0,0 +1,6 @@ +import joi from 'joi'; + +export const componentSchema = joi.alternatives().try( + joi.object().unknown(), + joi.func(), +); From 6bd16a5cc7d29a6478da9f8782d2ece8a10910ed Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Jul 2021 13:10:49 -0400 Subject: [PATCH 020/115] chore: update package dependencies --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 451c519bd5..1a0a822155 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13041,7 +13041,7 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.3.5: +typescript@^4.1.2: version "4.3.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== From 8f90caeb10276dcfc8b879c1cc0d4a01c310b516 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Jul 2021 13:15:35 -0400 Subject: [PATCH 021/115] chore(release): v0.7.9 --- CHANGELOG.md | 19 +++++++++++++++++++ package.json | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5becdd88b1..738715b3c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +## [0.7.9](https://github.com/payloadcms/payload/compare/v0.7.8...v0.7.9) (2021-07-27) + + +### Bug Fixes + +* missing richtext gutter ([4d1249d](https://github.com/payloadcms/payload/commit/4d1249dd03f441ee872e66437118c3e8703aaefc)) + + +### Features + +* add admin description to collections and globals ([4544711](https://github.com/payloadcms/payload/commit/4544711f0e4ea0e78570b93717a4bf213946d9b3)) +* add collection slug to schema validation errors ([ebfb72c](https://github.com/payloadcms/payload/commit/ebfb72c8fa0723ec75922c6fa4739b48ee82b29f)) +* add component support to collection and global description ([fe0098c](https://github.com/payloadcms/payload/commit/fe0098ccd9b3477b47985222659a0e3fc2e7bb3b)) +* add component support to field description ([e0933f6](https://github.com/payloadcms/payload/commit/e0933f612a70af0a18c88ef96e7af0878e20cf01)) +* add customizable admin field descriptions ([dac60a0](https://github.com/payloadcms/payload/commit/dac60a024b0eb7197d5a501daea342827ee7c751)) +* add descriptions to every allowed field type, globals and collections ([29a1108](https://github.com/payloadcms/payload/commit/29a1108518c7942f8ae06a990393a6e0ad4b6b16)) +* add global slug and field names to schema validation errors ([bb63b4a](https://github.com/payloadcms/payload/commit/bb63b4aad153d125f68bf1fe1e9a3e4a5358ded9)) +* improves group styling when there is no label ([ea358a6](https://github.com/payloadcms/payload/commit/ea358a66e8b8d2e54dd162eae0cf7066128cfabf)) + ## [0.7.8](https://github.com/payloadcms/payload/compare/v0.7.7...v0.7.8) (2021-07-23) diff --git a/package.json b/package.json index 2bd89027d1..7d6f1205c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.7.8", + "version": "0.7.9", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From a2fa30fad2cd9b8ab6ac4f3905706b97d5663954 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Jul 2021 17:55:14 -0400 Subject: [PATCH 022/115] fix: jest debug testing --- .vscode/launch.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7074612e85..4253a1d439 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,6 +18,7 @@ }, "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node", "port": 9229, "skipFiles": [ "/**" From a1b3414dd0a55809e1e6d4558b1036ae76a325c1 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Jul 2021 17:55:57 -0400 Subject: [PATCH 023/115] chore: ensures tests can run locally on mac --- src/auth/auth.spec.js | 9 ++++-- .../graphql/resolvers/resolvers.spec.js | 2 +- src/collections/tests/collections.spec.js | 2 +- src/collections/tests/hooks.spec.js | 2 +- src/collections/tests/relationships.spec.js | 2 +- src/collections/tests/uploads.spec.js | 2 +- src/globals/requestHandlers/globals.spec.js | 2 +- src/index.ts | 2 +- src/mongoose/connect.ts | 30 +++++++++++-------- src/mongoose/testCredentials.js | 7 +++++ src/preferences/graphql/resolvers.spec.js | 2 +- tests/api/credentials.js | 7 ----- tests/api/globalSetup.js | 2 +- 13 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 src/mongoose/testCredentials.js delete mode 100644 tests/api/credentials.js diff --git a/src/auth/auth.spec.js b/src/auth/auth.spec.js index fe0c0d177a..5699d6223a 100644 --- a/src/auth/auth.spec.js +++ b/src/auth/auth.spec.js @@ -1,10 +1,10 @@ import MongoClient from 'mongodb'; import getConfig from '../config/load'; -import { email, password, mongo } from '../../tests/api/credentials'; +import { email, password, connection } from '../mongoose/testCredentials'; require('isomorphic-fetch'); -const { url: mongoURL, port: mongoPort, name: mongoDBName } = mongo; +const { url: mongoURL, port: mongoPort, name: mongoDBName } = connection; const { serverURL: url } = getConfig(); @@ -137,7 +137,10 @@ describe('Users REST API', () => { }); expect(response.status).toBe(201); - const client = await MongoClient.connect(`${mongoURL}:${mongoPort}`); + const client = await MongoClient.connect(`${mongoURL}:${mongoPort}`, { + useUnifiedTopology: true, + }); + const db = client.db(mongoDBName); const userResult = await db.collection('public-users').findOne({ email: emailToVerify }); const { _verified, _verificationToken } = userResult; diff --git a/src/collections/graphql/resolvers/resolvers.spec.js b/src/collections/graphql/resolvers/resolvers.spec.js index 3132a24c3a..4d8c446472 100644 --- a/src/collections/graphql/resolvers/resolvers.spec.js +++ b/src/collections/graphql/resolvers/resolvers.spec.js @@ -3,7 +3,7 @@ */ import { request, GraphQLClient } from 'graphql-request'; import getConfig from '../../../config/load'; -import { email, password } from '../../../../tests/api/credentials'; +import { email, password } from '../../../mongoose/testCredentials'; require('isomorphic-fetch'); diff --git a/src/collections/tests/collections.spec.js b/src/collections/tests/collections.spec.js index 64bf3a8060..b8e27a505d 100644 --- a/src/collections/tests/collections.spec.js +++ b/src/collections/tests/collections.spec.js @@ -1,6 +1,6 @@ import { v4 as uuid } from 'uuid'; import getConfig from '../../config/load'; -import { email, password } from '../../../tests/api/credentials'; +import { email, password } from '../../mongoose/testCredentials'; require('isomorphic-fetch'); diff --git a/src/collections/tests/hooks.spec.js b/src/collections/tests/hooks.spec.js index 2b92bf694c..34dc4d6bf9 100644 --- a/src/collections/tests/hooks.spec.js +++ b/src/collections/tests/hooks.spec.js @@ -1,5 +1,5 @@ import getConfig from '../../config/load'; -import { email, password } from '../../../tests/api/credentials'; +import { email, password } from '../../mongoose/testCredentials'; require('isomorphic-fetch'); diff --git a/src/collections/tests/relationships.spec.js b/src/collections/tests/relationships.spec.js index 8afe2e91b6..a81189f080 100644 --- a/src/collections/tests/relationships.spec.js +++ b/src/collections/tests/relationships.spec.js @@ -1,5 +1,5 @@ import getConfig from '../../config/load'; -import { email, password } from '../../../tests/api/credentials'; +import { email, password } from '../../mongoose/testCredentials'; require('isomorphic-fetch'); diff --git a/src/collections/tests/uploads.spec.js b/src/collections/tests/uploads.spec.js index e9b3d52da8..3213c32b24 100644 --- a/src/collections/tests/uploads.spec.js +++ b/src/collections/tests/uploads.spec.js @@ -3,7 +3,7 @@ import path from 'path'; import FormData from 'form-data'; import getConfig from '../../config/load'; import fileExists from '../../../tests/api/utils/fileExists'; -import { email, password } from '../../../tests/api/credentials'; +import { email, password } from '../../mongoose/testCredentials'; require('isomorphic-fetch'); diff --git a/src/globals/requestHandlers/globals.spec.js b/src/globals/requestHandlers/globals.spec.js index a4e441505b..d26e2a6c6f 100644 --- a/src/globals/requestHandlers/globals.spec.js +++ b/src/globals/requestHandlers/globals.spec.js @@ -3,7 +3,7 @@ */ import getConfig from '../../config/load'; -import { email, password } from '../../../tests/api/credentials'; +import { email, password } from '../../mongoose/testCredentials'; require('isomorphic-fetch'); diff --git a/src/index.ts b/src/index.ts index acba3f991d..2bad4f283d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -148,7 +148,7 @@ export class Payload { initPreferences(this); // Connect to database - connectMongoose(this.mongoURL, options.mongoOptions); + connectMongoose(this.mongoURL, options.mongoOptions, options.local); // If not initializing locally, set up HTTP routing if (!this.local) { diff --git a/src/mongoose/connect.ts b/src/mongoose/connect.ts index 9a4dc1e45e..1d1a31c649 100644 --- a/src/mongoose/connect.ts +++ b/src/mongoose/connect.ts @@ -1,9 +1,10 @@ import mongoose, { ConnectionOptions } from 'mongoose'; import Logger from '../utilities/logger'; +import { connection } from './testCredentials'; const logger = Logger(); -const connectMongoose = async (url: string, options: ConnectionOptions): Promise => { +const connectMongoose = async (url: string, options: ConnectionOptions, local: boolean): Promise => { let urlToConnect = url; let successfulConnectionMessage = 'Connected to Mongo server successfully!'; const connectionOptions = { @@ -16,20 +17,25 @@ const connectMongoose = async (url: string, options: ConnectionOptions): Promise }; if (process.env.NODE_ENV === 'test') { - connectionOptions.dbName = 'payloadmemory'; - // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires - const { MongoMemoryServer } = require('mongodb-memory-server'); - const mongo = await MongoMemoryServer.create({ - instance: { - port: 27018, - dbName: 'payloadmemory', - }, - }); + if (local) { + urlToConnect = `${connection.url}:${connection.port}/${connection.name}`; + } else { + connectionOptions.dbName = 'payloadmemory'; + // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires + const { MongoMemoryServer } = require('mongodb-memory-server'); + const mongo = await MongoMemoryServer.create({ + instance: { + dbName: connection.name, + port: connection.port, + }, + }); - urlToConnect = mongo.getUri(); - successfulConnectionMessage = 'Connected to in-memory Mongo server successfully!'; + urlToConnect = mongo.getUri(); + successfulConnectionMessage = 'Connected to in-memory Mongo server successfully!'; + } } + try { await mongoose.connect(urlToConnect, connectionOptions); logger.info(successfulConnectionMessage); diff --git a/src/mongoose/testCredentials.js b/src/mongoose/testCredentials.js new file mode 100644 index 0000000000..86a9438218 --- /dev/null +++ b/src/mongoose/testCredentials.js @@ -0,0 +1,7 @@ +export const email = 'test@test.com'; +export const password = 'test123'; +export const connection = { + url: 'mongodb://127.0.0.1', + port: 27018, + name: 'payloadmemory', +}; diff --git a/src/preferences/graphql/resolvers.spec.js b/src/preferences/graphql/resolvers.spec.js index 281566a960..65ef70ef4a 100644 --- a/src/preferences/graphql/resolvers.spec.js +++ b/src/preferences/graphql/resolvers.spec.js @@ -3,7 +3,7 @@ */ import { request, GraphQLClient } from 'graphql-request'; import getConfig from '../../config/load'; -import { email, password } from '../../../tests/api/credentials'; +import { email, password } from '../../mongoose/testCredentials'; require('isomorphic-fetch'); diff --git a/tests/api/credentials.js b/tests/api/credentials.js deleted file mode 100644 index 836d95d95f..0000000000 --- a/tests/api/credentials.js +++ /dev/null @@ -1,7 +0,0 @@ -exports.email = 'test@test.com'; -exports.password = 'test123'; -exports.mongo = { - url: 'mongodb://127.0.0.1', - port: 27018, - name: 'payloadmemory', -}; diff --git a/tests/api/globalSetup.js b/tests/api/globalSetup.js index 075f4979a7..4184fd16c4 100644 --- a/tests/api/globalSetup.js +++ b/tests/api/globalSetup.js @@ -2,7 +2,7 @@ require('isomorphic-fetch'); require('../../demo/server'); const loadConfig = require('../../src/config/load').default; -const { email, password } = require('./credentials'); +const { email, password } = require('../../src/mongoose/testCredentials'); const { serverURL } = loadConfig(); From f6fc0972e0431e0455f18646ff86ac8b8d940562 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Jul 2021 17:57:59 -0400 Subject: [PATCH 024/115] chore(release): v0.7.10 --- CHANGELOG.md | 13 +++++++++++++ package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 738715b3c0..d9187ddc4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [0.7.10](https://github.com/payloadcms/payload/compare/v0.7.9...v0.7.10) (2021-07-27) + + +### Bug Fixes + +* jest debug testing ([a2fa30f](https://github.com/payloadcms/payload/commit/a2fa30fad2cd9b8ab6ac4f3905706b97d5663954)) +* skipValidation logic ([fedeaea](https://github.com/payloadcms/payload/commit/fedeaeafc9607f7c21e40c2df44923056e5d460c)) + + +### Features + +* improves conditional logic performance and edge cases ([d43390f](https://github.com/payloadcms/payload/commit/d43390f2a4c5ebeb7b9b0f07e003816005efc761)) + ## [0.7.9](https://github.com/payloadcms/payload/compare/v0.7.8...v0.7.9) (2021-07-27) diff --git a/package.json b/package.json index 7d6f1205c8..b4e255a69b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.7.9", + "version": "0.7.10", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From c649362b95f1ddaeb47cb121b814ca30712dea86 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Jul 2021 18:29:46 -0400 Subject: [PATCH 025/115] fix: ensures text component is always controlled --- src/admin/components/forms/field-types/Text/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/admin/components/forms/field-types/Text/index.tsx b/src/admin/components/forms/field-types/Text/index.tsx index f1b457f65a..ff6b1ab8ee 100644 --- a/src/admin/components/forms/field-types/Text/index.tsx +++ b/src/admin/components/forms/field-types/Text/index.tsx @@ -65,7 +65,7 @@ const Text: React.FC = (props) => { required={required} /> Date: Tue, 27 Jul 2021 20:13:25 -0400 Subject: [PATCH 026/115] feat: revises naming conventions of config types --- package.json | 2 +- .../elements/ColumnSelector/types.ts | 4 +- .../elements/DeleteDocument/types.ts | 4 +- .../components/elements/FileDetails/types.ts | 4 +- .../components/elements/ListControls/types.ts | 4 +- .../components/elements/SortComplex/types.ts | 4 +- .../components/elements/Thumbnail/types.ts | 4 +- .../components/elements/UploadCard/types.ts | 4 +- .../elements/UploadGallery/types.ts | 4 +- .../components/elements/WhereBuilder/types.ts | 4 +- .../forms/field-types/Relationship/types.ts | 4 +- .../forms/field-types/Upload/Add/types.ts | 4 +- .../Upload/SelectExisting/types.ts | 4 +- src/admin/components/views/Account/types.ts | 4 +- src/admin/components/views/Dashboard/types.ts | 8 ++-- src/admin/components/views/Global/types.ts | 6 +-- src/admin/components/views/Verify/index.tsx | 4 +- .../views/collections/Edit/Auth/types.ts | 4 +- .../views/collections/Edit/Upload/types.ts | 4 +- .../views/collections/Edit/types.ts | 4 +- .../views/collections/List/Cell/types.ts | 4 +- .../views/collections/List/buildColumns.tsx | 4 +- .../views/collections/List/types.ts | 6 +-- src/admin/hooks/useThumbnail.ts | 4 +- src/auth/getExtractJWT.ts | 4 +- src/auth/sendVerificationEmail.ts | 4 +- src/collections/config/build.ts | 4 +- src/collections/config/sanitize.ts | 8 ++-- src/collections/config/types.ts | 8 ++-- src/collections/init.ts | 4 +- src/config/build.ts | 4 +- src/config/load.ts | 5 +-- src/config/sanitize.ts | 8 ++-- src/config/types.ts | 18 ++++----- src/config/validate.ts | 20 +++++----- src/errors/DuplicateGlobal.ts | 4 +- src/express/middleware/authenticate.ts | 4 +- src/express/middleware/corsHeaders.ts | 4 +- src/express/middleware/errorHandler.ts | 4 +- src/fields/performFieldOperations.ts | 6 +-- src/globals/buildModel.ts | 4 +- src/globals/config/sanitize.ts | 8 ++-- src/globals/config/types.ts | 6 +-- src/globals/graphql/resolvers/findOne.ts | 4 +- src/globals/requestHandlers/findOne.ts | 4 +- src/globals/requestHandlers/update.ts | 4 +- src/graphql/index.ts | 4 +- .../schema/buildFallbackLocaleInputType.ts | 4 +- src/graphql/schema/buildLocaleInputType.ts | 4 +- src/graphql/schema/buildPoliciesType.ts | 8 ++-- src/index.ts | 4 +- src/mongoose/buildSchema.ts | 40 +++++++++---------- src/uploads/imageResizer.ts | 4 +- src/utilities/checkDuplicateCollections.ts | 4 +- src/webpack/getBaseConfig.ts | 4 +- src/webpack/getDevConfig.ts | 4 +- src/webpack/getProdConfig.ts | 4 +- src/webpack/init.ts | 4 +- types.d.ts | 5 ++- yarn.lock | 8 ++-- 60 files changed, 171 insertions(+), 171 deletions(-) diff --git a/package.json b/package.json index b4e255a69b..3d54118696 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@faceless-ui/modal": "^1.1.2", "@faceless-ui/scroll-info": "^1.2.3", "@faceless-ui/window-info": "^1.2.4", - "@payloadcms/config-provider": "0.0.23", + "@payloadcms/config-provider": "^0.1.0", "@types/mime": "^2.0.3", "@udecode/slate-plugins": "^0.71.9", "assert": "^2.0.0", diff --git a/src/admin/components/elements/ColumnSelector/types.ts b/src/admin/components/elements/ColumnSelector/types.ts index a27578745b..6307b02f72 100644 --- a/src/admin/components/elements/ColumnSelector/types.ts +++ b/src/admin/components/elements/ColumnSelector/types.ts @@ -1,6 +1,6 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { - collection: CollectionConfig, + collection: SanitizedCollectionConfig, handleChange: (columns) => void, } diff --git a/src/admin/components/elements/DeleteDocument/types.ts b/src/admin/components/elements/DeleteDocument/types.ts index c547e160e8..5c353a5d2e 100644 --- a/src/admin/components/elements/DeleteDocument/types.ts +++ b/src/admin/components/elements/DeleteDocument/types.ts @@ -1,7 +1,7 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { - collection?: CollectionConfig, + collection?: SanitizedCollectionConfig, id?: string, title?: string, } diff --git a/src/admin/components/elements/FileDetails/types.ts b/src/admin/components/elements/FileDetails/types.ts index 8ba5af4f97..119b26edcb 100644 --- a/src/admin/components/elements/FileDetails/types.ts +++ b/src/admin/components/elements/FileDetails/types.ts @@ -1,7 +1,7 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { - collection: CollectionConfig + collection: SanitizedCollectionConfig doc: Record handleRemove?: () => void, } diff --git a/src/admin/components/elements/ListControls/types.ts b/src/admin/components/elements/ListControls/types.ts index 5121943d58..bef034d03e 100644 --- a/src/admin/components/elements/ListControls/types.ts +++ b/src/admin/components/elements/ListControls/types.ts @@ -1,10 +1,10 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { enableColumns?: boolean, enableSort?: boolean, setSort: (sort: string) => void, - collection: CollectionConfig, + collection: SanitizedCollectionConfig, handleChange: (newState) => void, } diff --git a/src/admin/components/elements/SortComplex/types.ts b/src/admin/components/elements/SortComplex/types.ts index b29c93f435..c171e21bf7 100644 --- a/src/admin/components/elements/SortComplex/types.ts +++ b/src/admin/components/elements/SortComplex/types.ts @@ -1,6 +1,6 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { handleChange: (controls: any) => void, - collection: CollectionConfig, + collection: SanitizedCollectionConfig, } diff --git a/src/admin/components/elements/Thumbnail/types.ts b/src/admin/components/elements/Thumbnail/types.ts index bad63ec4c0..d080799ef8 100644 --- a/src/admin/components/elements/Thumbnail/types.ts +++ b/src/admin/components/elements/Thumbnail/types.ts @@ -1,7 +1,7 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { doc: Record - collection: CollectionConfig + collection: SanitizedCollectionConfig size?: 'small' | 'medium' | 'large' | 'expand', } diff --git a/src/admin/components/elements/UploadCard/types.ts b/src/admin/components/elements/UploadCard/types.ts index b211f959c1..bb9177efa0 100644 --- a/src/admin/components/elements/UploadCard/types.ts +++ b/src/admin/components/elements/UploadCard/types.ts @@ -1,7 +1,7 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { - collection: CollectionConfig, + collection: SanitizedCollectionConfig, doc: Record onClick?: () => void, } diff --git a/src/admin/components/elements/UploadGallery/types.ts b/src/admin/components/elements/UploadGallery/types.ts index 770441c00e..14c9078a9f 100644 --- a/src/admin/components/elements/UploadGallery/types.ts +++ b/src/admin/components/elements/UploadGallery/types.ts @@ -1,7 +1,7 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; export type Props = { docs?: Record[], - collection: CollectionConfig, + collection: SanitizedCollectionConfig, onCardClick: (doc) => void, } diff --git a/src/admin/components/elements/WhereBuilder/types.ts b/src/admin/components/elements/WhereBuilder/types.ts index e659e24af9..35871ece70 100644 --- a/src/admin/components/elements/WhereBuilder/types.ts +++ b/src/admin/components/elements/WhereBuilder/types.ts @@ -1,10 +1,10 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; import { Field } from '../../../../fields/config/types'; import { Operator } from '../../../../types'; export type Props = { handleChange: (controls: any) => void, - collection: CollectionConfig, + collection: SanitizedCollectionConfig, } export type FieldCondition = { diff --git a/src/admin/components/forms/field-types/Relationship/types.ts b/src/admin/components/forms/field-types/Relationship/types.ts index 087131c0e3..4589972897 100644 --- a/src/admin/components/forms/field-types/Relationship/types.ts +++ b/src/admin/components/forms/field-types/Relationship/types.ts @@ -1,4 +1,4 @@ -import { PaginatedDocs, CollectionConfig } from '../../../../../collections/config/types'; +import { PaginatedDocs, SanitizedCollectionConfig } from '../../../../../collections/config/types'; import { RelationshipField } from '../../../../../fields/config/types'; export type OptionsPage = { @@ -27,7 +27,7 @@ type ADD = { data: PaginatedDocs relation: string hasMultipleRelations: boolean - collection: CollectionConfig + collection: SanitizedCollectionConfig } export type Action = CLEAR | ADD diff --git a/src/admin/components/forms/field-types/Upload/Add/types.ts b/src/admin/components/forms/field-types/Upload/Add/types.ts index c9ef7c6986..3e71e1c981 100644 --- a/src/admin/components/forms/field-types/Upload/Add/types.ts +++ b/src/admin/components/forms/field-types/Upload/Add/types.ts @@ -1,9 +1,9 @@ -import { CollectionConfig } from '../../../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../../../collections/config/types'; import { FieldTypes } from '../..'; export type Props = { setValue: (val: { id: string } | null) => void - collection: CollectionConfig + collection: SanitizedCollectionConfig slug: string fieldTypes: FieldTypes } diff --git a/src/admin/components/forms/field-types/Upload/SelectExisting/types.ts b/src/admin/components/forms/field-types/Upload/SelectExisting/types.ts index e9002a09b7..7839db192e 100644 --- a/src/admin/components/forms/field-types/Upload/SelectExisting/types.ts +++ b/src/admin/components/forms/field-types/Upload/SelectExisting/types.ts @@ -1,7 +1,7 @@ -import { CollectionConfig } from '../../../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../../../collections/config/types'; export type Props = { setValue: (val: { id: string } | null) => void - collection: CollectionConfig + collection: SanitizedCollectionConfig slug: string } diff --git a/src/admin/components/views/Account/types.ts b/src/admin/components/views/Account/types.ts index f05c7866ed..d1422f04ef 100644 --- a/src/admin/components/views/Account/types.ts +++ b/src/admin/components/views/Account/types.ts @@ -1,11 +1,11 @@ -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; import { Fields, Data } from '../../forms/Form/types'; import { CollectionPermission } from '../../../../auth/types'; export type Props = { hasSavePermission: boolean apiURL: string - collection: CollectionConfig + collection: SanitizedCollectionConfig data: Data permissions: CollectionPermission initialState: Fields diff --git a/src/admin/components/views/Dashboard/types.ts b/src/admin/components/views/Dashboard/types.ts index ea8febf384..3783ce2aea 100644 --- a/src/admin/components/views/Dashboard/types.ts +++ b/src/admin/components/views/Dashboard/types.ts @@ -1,9 +1,9 @@ -import { CollectionConfig } from '../../../../collections/config/types'; -import { GlobalConfig } from '../../../../globals/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; +import { SanitizedGlobalConfig } from '../../../../globals/config/types'; import { Permissions } from '../../../../auth/types'; export type Props = { - collections: CollectionConfig[], - globals: GlobalConfig[], + collections: SanitizedCollectionConfig[], + globals: SanitizedGlobalConfig[], permissions: Permissions } diff --git a/src/admin/components/views/Global/types.ts b/src/admin/components/views/Global/types.ts index 09aadbcbdb..a61af6077b 100644 --- a/src/admin/components/views/Global/types.ts +++ b/src/admin/components/views/Global/types.ts @@ -1,13 +1,13 @@ import { GlobalPermission } from '../../../../auth/types'; -import { GlobalConfig } from '../../../../globals/config/types'; +import { SanitizedGlobalConfig } from '../../../../globals/config/types'; import { Fields } from '../../forms/Form/types'; export type IndexProps = { - global: GlobalConfig + global: SanitizedGlobalConfig } export type Props = { - global: GlobalConfig + global: SanitizedGlobalConfig data: Record onSave: () => void permissions: GlobalPermission diff --git a/src/admin/components/views/Verify/index.tsx b/src/admin/components/views/Verify/index.tsx index c676f19c03..5c804e899a 100644 --- a/src/admin/components/views/Verify/index.tsx +++ b/src/admin/components/views/Verify/index.tsx @@ -5,14 +5,14 @@ import Logo from '../../graphics/Logo'; import MinimalTemplate from '../../templates/Minimal'; import Button from '../../elements/Button'; import Meta from '../../utilities/Meta'; -import { CollectionConfig } from '../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../collections/config/types'; import Login from '../Login'; import './index.scss'; const baseClass = 'verify'; -const Verify: React.FC<{ collection: CollectionConfig }> = ({ collection }) => { +const Verify: React.FC<{ collection: SanitizedCollectionConfig }> = ({ collection }) => { const { slug: collectionSlug } = collection; const { user } = useAuth(); diff --git a/src/admin/components/views/collections/Edit/Auth/types.ts b/src/admin/components/views/collections/Edit/Auth/types.ts index 910f64e8d0..5f4fcb17a4 100644 --- a/src/admin/components/views/collections/Edit/Auth/types.ts +++ b/src/admin/components/views/collections/Edit/Auth/types.ts @@ -1,11 +1,11 @@ -import { CollectionConfig } from '../../../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../../../collections/config/types'; import { VerifyConfig } from '../../../../../../auth/types'; export type Props = { useAPIKey?: boolean requirePassword?: boolean verify?: VerifyConfig | boolean - collection: CollectionConfig + collection: SanitizedCollectionConfig email: string operation: 'update' | 'create' } diff --git a/src/admin/components/views/collections/Edit/Upload/types.ts b/src/admin/components/views/collections/Edit/Upload/types.ts index be0fa787d7..c90cb15fa0 100644 --- a/src/admin/components/views/collections/Edit/Upload/types.ts +++ b/src/admin/components/views/collections/Edit/Upload/types.ts @@ -1,4 +1,4 @@ -import { CollectionConfig } from '../../../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../../../collections/config/types'; export type Data = { filename: string @@ -8,7 +8,7 @@ export type Data = { export type Props = { data?: Data - collection: CollectionConfig + collection: SanitizedCollectionConfig adminThumbnail?: string mimeTypes?: string[]; } diff --git a/src/admin/components/views/collections/Edit/types.ts b/src/admin/components/views/collections/Edit/types.ts index 2254e5632e..2acdafac70 100644 --- a/src/admin/components/views/collections/Edit/types.ts +++ b/src/admin/components/views/collections/Edit/types.ts @@ -1,10 +1,10 @@ -import { CollectionConfig } from '../../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../../collections/config/types'; import { CollectionPermission } from '../../../../../auth/types'; import { Document } from '../../../../../types'; import { Fields } from '../../../forms/Form/types'; export type IndexProps = { - collection: CollectionConfig + collection: SanitizedCollectionConfig isEditing?: boolean } diff --git a/src/admin/components/views/collections/List/Cell/types.ts b/src/admin/components/views/collections/List/Cell/types.ts index 892d1c2de0..55c63c1404 100644 --- a/src/admin/components/views/collections/List/Cell/types.ts +++ b/src/admin/components/views/collections/List/Cell/types.ts @@ -1,10 +1,10 @@ import { Field } from '../../../../../../fields/config/types'; -import { CollectionConfig } from '../../../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../../../collections/config/types'; export type Props = { field: Field colIndex: number - collection: CollectionConfig + collection: SanitizedCollectionConfig cellData: unknown rowData: { [path: string]: unknown diff --git a/src/admin/components/views/collections/List/buildColumns.tsx b/src/admin/components/views/collections/List/buildColumns.tsx index 79b2a001e9..e9f10a7101 100644 --- a/src/admin/components/views/collections/List/buildColumns.tsx +++ b/src/admin/components/views/collections/List/buildColumns.tsx @@ -1,11 +1,11 @@ import React from 'react'; import Cell from './Cell'; import SortColumn from '../../../elements/SortColumn'; -import { CollectionConfig } from '../../../../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../../../../collections/config/types'; import { Column } from '../../../elements/Table/types'; import { fieldHasSubFields, Field } from '../../../../../fields/config/types'; -const buildColumns = (collection: CollectionConfig, columns: string[], setSort: (sort: string) => void): Column[] => (columns || []).reduce((cols, col, colIndex) => { +const buildColumns = (collection: SanitizedCollectionConfig, columns: string[], setSort: (sort: string) => void): Column[] => (columns || []).reduce((cols, col, colIndex) => { let field = null; const fields = [ diff --git a/src/admin/components/views/collections/List/types.ts b/src/admin/components/views/collections/List/types.ts index cc2661d67f..9efe943efe 100644 --- a/src/admin/components/views/collections/List/types.ts +++ b/src/admin/components/views/collections/List/types.ts @@ -1,8 +1,8 @@ -import { CollectionConfig, PaginatedDocs } from '../../../../../collections/config/types'; +import { SanitizedCollectionConfig, PaginatedDocs } from '../../../../../collections/config/types'; import { Column } from '../../../elements/Table/types'; export type Props = { - collection: CollectionConfig + collection: SanitizedCollectionConfig data: PaginatedDocs newDocumentURL: string setListControls: (controls: unknown) => void @@ -12,5 +12,5 @@ export type Props = { } export type ListIndexProps = { - collection: CollectionConfig + collection: SanitizedCollectionConfig } diff --git a/src/admin/hooks/useThumbnail.ts b/src/admin/hooks/useThumbnail.ts index d9c504ca66..ce37876464 100644 --- a/src/admin/hooks/useThumbnail.ts +++ b/src/admin/hooks/useThumbnail.ts @@ -1,10 +1,10 @@ import { useConfig } from '@payloadcms/config-provider'; -import { CollectionConfig } from '../../collections/config/types'; +import { SanitizedCollectionConfig } from '../../collections/config/types'; import isImage from '../../uploads/isImage'; const absoluteURLPattern = new RegExp('^(?:[a-z]+:)?//', 'i'); -const useThumbnail = (collection: CollectionConfig, doc: Record): string | false => { +const useThumbnail = (collection: SanitizedCollectionConfig, doc: Record): string | false => { const { upload: { staticURL, diff --git a/src/auth/getExtractJWT.ts b/src/auth/getExtractJWT.ts index 900af4ba72..6ad091c6d6 100644 --- a/src/auth/getExtractJWT.ts +++ b/src/auth/getExtractJWT.ts @@ -1,8 +1,8 @@ import { Request } from 'express'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; import parseCookies from '../utilities/parseCookies'; -const getExtractJWT = (config: Config) => (req: Request): string | null => { +const getExtractJWT = (config: SanitizedConfig) => (req: Request): string | null => { if (req && req.get) { const jwtFromHeader = req.get('Authorization'); const origin = req.get('Origin'); diff --git a/src/auth/sendVerificationEmail.ts b/src/auth/sendVerificationEmail.ts index 9816de3aa4..43dfdf64ea 100644 --- a/src/auth/sendVerificationEmail.ts +++ b/src/auth/sendVerificationEmail.ts @@ -1,12 +1,12 @@ import { Payload } from '..'; import { PayloadRequest } from '../express/types'; -import { Config, EmailOptions } from '../config/types'; +import { SanitizedConfig, EmailOptions } from '../config/types'; import { Collection } from '../collections/config/types'; import { User, VerifyConfig } from './types'; type Args = { - config: Config, + config: SanitizedConfig, collection: Collection, user: User disableEmail: boolean diff --git a/src/collections/config/build.ts b/src/collections/config/build.ts index b254434bbc..9f65b6687c 100644 --- a/src/collections/config/build.ts +++ b/src/collections/config/build.ts @@ -1,5 +1,5 @@ -import { PayloadCollectionConfig } from './types'; +import { CollectionConfig } from './types'; -const buildCollection = (collection: PayloadCollectionConfig): PayloadCollectionConfig => collection; +const buildCollection = (collection: CollectionConfig): CollectionConfig => collection; export default buildCollection; diff --git a/src/collections/config/sanitize.ts b/src/collections/config/sanitize.ts index 111646e9f4..ad34bab46d 100644 --- a/src/collections/config/sanitize.ts +++ b/src/collections/config/sanitize.ts @@ -1,5 +1,5 @@ import merge from 'deepmerge'; -import { CollectionConfig, PayloadCollectionConfig } from './types'; +import { SanitizedCollectionConfig, CollectionConfig } from './types'; import sanitizeFields from '../../fields/config/sanitize'; import toKebabCase from '../../utilities/toKebabCase'; import baseAuthFields from '../../fields/baseFields/baseAuthFields'; @@ -55,12 +55,12 @@ const mergeBaseFields = (fields, baseFields) => { return baseFields; }; -const sanitizeCollection = (collections: PayloadCollectionConfig[], collection: PayloadCollectionConfig): CollectionConfig => { +const sanitizeCollection = (collections: CollectionConfig[], collection: CollectionConfig): SanitizedCollectionConfig => { // ///////////////////////////////// // Make copy of collection config // ///////////////////////////////// - const sanitized: PayloadCollectionConfig = merge(defaults, collection); + const sanitized: CollectionConfig = merge(defaults, collection); sanitized.slug = toKebabCase(sanitized.slug); sanitized.labels = sanitized.labels || formatLabels(sanitized.slug); @@ -123,7 +123,7 @@ const sanitizeCollection = (collections: PayloadCollectionConfig[], collection: const validRelationships = collections.map((c) => c.slug); sanitized.fields = sanitizeFields(sanitized.fields, validRelationships); - return sanitized as CollectionConfig; + return sanitized as SanitizedCollectionConfig; }; export default sanitizeCollection; diff --git a/src/collections/config/types.ts b/src/collections/config/types.ts index 0670be6625..20821d8321 100644 --- a/src/collections/config/types.ts +++ b/src/collections/config/types.ts @@ -89,7 +89,7 @@ export type AfterForgotPasswordHook = (args?: { args?: any; }) => any; -export type PayloadCollectionConfig = { +export type CollectionConfig = { slug: string; labels?: { singular?: string; @@ -137,7 +137,7 @@ export type PayloadCollectionConfig = { timestamps?: boolean }; -export interface CollectionConfig extends Omit, 'auth' | 'upload' | 'fields'> { +export interface SanitizedCollectionConfig extends Omit, 'auth' | 'upload' | 'fields'> { auth: Auth; upload: Upload; fields: Field[]; @@ -145,12 +145,12 @@ export interface CollectionConfig extends Omit { + ctx.config.collections = ctx.config.collections.map((collection: SanitizedCollectionConfig) => { const formattedCollection = collection; const schema = buildSchema(formattedCollection, ctx.config); diff --git a/src/config/build.ts b/src/config/build.ts index 4fe727191f..cd8480c50c 100644 --- a/src/config/build.ts +++ b/src/config/build.ts @@ -1,4 +1,4 @@ -import { PayloadConfig, Config } from './types'; +import { Config, SanitizedConfig } from './types'; import sanitize from './sanitize'; /** @@ -6,7 +6,7 @@ import sanitize from './sanitize'; * @param config Payload Config * @returns Built and sanitized Payload Config */ -export function buildConfig(config: PayloadConfig): Config { +export function buildConfig(config: Config): SanitizedConfig { const sanitized = sanitize(config); if (Array.isArray(config.plugins)) { diff --git a/src/config/load.ts b/src/config/load.ts index f796c84e4a..51fc7e6070 100644 --- a/src/config/load.ts +++ b/src/config/load.ts @@ -1,15 +1,14 @@ /* eslint-disable import/no-dynamic-require */ /* eslint-disable global-require */ import path from 'path'; -import { Config } from './types'; +import { SanitizedConfig } from './types'; import findConfig from './find'; import validate from './validate'; import babelConfig from '../babel.config'; - const removedExtensions = ['.scss', '.css', '.svg', '.png', '.jpg', '.eot', '.ttf', '.woff', '.woff2']; -const loadConfig = (): Config => { +const loadConfig = (): SanitizedConfig => { const configPath = findConfig(); removedExtensions.forEach((ext) => { diff --git a/src/config/sanitize.ts b/src/config/sanitize.ts index 8804930ae7..1b41f1d762 100644 --- a/src/config/sanitize.ts +++ b/src/config/sanitize.ts @@ -1,5 +1,5 @@ import merge from 'deepmerge'; -import { PayloadConfig, Config } from './types'; +import { Config, SanitizedConfig } from './types'; import defaultUser from '../auth/defaultUser'; import sanitizeCollection from '../collections/config/sanitize'; import { InvalidConfiguration } from '../errors'; @@ -7,8 +7,8 @@ import sanitizeGlobals from '../globals/config/sanitize'; import checkDuplicateCollections from '../utilities/checkDuplicateCollections'; import { defaults } from './defaults'; -const sanitizeConfig = (config: PayloadConfig): Config => { - const sanitizedConfig = merge(defaults, config) as PayloadConfig; +const sanitizeConfig = (config: Config): SanitizedConfig => { + const sanitizedConfig = merge(defaults, config) as Config; if (!sanitizedConfig.admin.user) { sanitizedConfig.admin.user = 'users'; @@ -30,7 +30,7 @@ const sanitizeConfig = (config: PayloadConfig): Config => { config.serverURL, ]; - return sanitizedConfig as Config; + return sanitizedConfig as SanitizedConfig; }; export default sanitizeConfig; diff --git a/src/config/types.ts b/src/config/types.ts index 10cb7e6925..7bee5cdd1e 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -7,8 +7,8 @@ import SMTPConnection from 'nodemailer/lib/smtp-connection'; import GraphQL from 'graphql'; import { ConnectionOptions } from 'mongoose'; import { Payload } from '..'; -import { AfterErrorHook, PayloadCollectionConfig, CollectionConfig } from '../collections/config/types'; -import { PayloadGlobalConfig, GlobalConfig } from '../globals/config/types'; +import { AfterErrorHook, CollectionConfig, SanitizedCollectionConfig } from '../collections/config/types'; +import { GlobalConfig, SanitizedGlobalConfig } from '../globals/config/types'; import { PayloadRequest } from '../express/types'; import { Where } from '../types'; @@ -18,7 +18,7 @@ type Email = { } // eslint-disable-next-line no-use-before-define -type Plugin = (config: Config) => Config; +type Plugin = (config: SanitizedConfig) => SanitizedConfig; type GeneratePreviewURLOptions = { locale: string @@ -70,7 +70,7 @@ export type InitOptions = { export type AccessResult = boolean | Where; export type Access = (args?: any) => AccessResult; -export type PayloadConfig = { +export type Config = { admin?: { user?: string; meta?: { @@ -96,8 +96,8 @@ export type PayloadConfig = { } webpack?: (config: Configuration) => Configuration; }; - collections?: PayloadCollectionConfig[]; - globals?: PayloadGlobalConfig[]; + collections?: CollectionConfig[]; + globals?: GlobalConfig[]; serverURL: string; cookiePrefix?: string; csrf?: string[]; @@ -146,8 +146,8 @@ export type PayloadConfig = { plugins?: Plugin[] }; -export type Config = Omit, 'collections' | 'globals'> & { - collections: CollectionConfig[] - globals: GlobalConfig[] +export type SanitizedConfig = Omit, 'collections' | 'globals'> & { + collections: SanitizedCollectionConfig[] + globals: SanitizedGlobalConfig[] paths: { [key: string]: string }; } diff --git a/src/config/validate.ts b/src/config/validate.ts index 867fc39942..f53daa1a6b 100644 --- a/src/config/validate.ts +++ b/src/config/validate.ts @@ -1,28 +1,28 @@ import schema from './schema'; import collectionSchema from '../collections/config/schema'; import Logger from '../utilities/logger'; -import { PayloadConfig, Config } from './types'; -import { PayloadCollectionConfig } from '../collections/config/types'; +import { SanitizedConfig } from './types'; +import { SanitizedCollectionConfig } from '../collections/config/types'; import fieldSchema from '../fields/config/schema'; -import { PayloadGlobalConfig } from '../globals/config/types'; +import { SanitizedGlobalConfig } from '../globals/config/types'; import globalSchema from '../globals/config/schema'; const logger = Logger(); -const validateFields = (context: string, collection: PayloadCollectionConfig): string[] => { +const validateFields = (context: string, entity: SanitizedCollectionConfig | SanitizedGlobalConfig): string[] => { const errors: string[] = []; - collection.fields.forEach((field) => { + entity.fields.forEach((field) => { const result = fieldSchema.validate(field, { abortEarly: false }); if (result.error) { result.error.details.forEach(({ message }) => { - errors.push(`${context} "${collection.slug}" > Field "${field.name}" > ${message}`); + errors.push(`${context} "${entity.slug}" > Field "${field.name}" > ${message}`); }); } }); return errors; }; -const validateCollections = (collections: PayloadCollectionConfig[]): string[] => { +const validateCollections = (collections: SanitizedCollectionConfig[]): string[] => { const errors: string[] = []; collections.forEach((collection) => { const result = collectionSchema.validate(collection, { abortEarly: false }); @@ -37,7 +37,7 @@ const validateCollections = (collections: PayloadCollectionConfig[]): string[] = return errors; }; -const validateGlobals = (globals: PayloadGlobalConfig[]): string[] => { +const validateGlobals = (globals: SanitizedGlobalConfig[]): string[] => { const errors: string[] = []; globals.forEach((global) => { const result = globalSchema.validate(global, { abortEarly: false }); @@ -52,7 +52,7 @@ const validateGlobals = (globals: PayloadGlobalConfig[]): string[] => { return errors; }; -const validateSchema = (config: PayloadConfig): Config => { +const validateSchema = (config: SanitizedConfig): SanitizedConfig => { const result = schema.validate(config, { abortEarly: false, }); @@ -81,7 +81,7 @@ const validateSchema = (config: PayloadConfig): Config => { } - return result.value as Config; + return result.value; }; export default validateSchema; diff --git a/src/errors/DuplicateGlobal.ts b/src/errors/DuplicateGlobal.ts index d4da36e4e9..2f87754057 100644 --- a/src/errors/DuplicateGlobal.ts +++ b/src/errors/DuplicateGlobal.ts @@ -1,8 +1,8 @@ -import { PayloadGlobalConfig } from '../globals/config/types'; +import { GlobalConfig } from '../globals/config/types'; import APIError from './APIError'; class DuplicateGlobal extends APIError { - constructor(config: PayloadGlobalConfig) { + constructor(config: GlobalConfig) { super(`Global label "${config.label}" is already in use`); } } diff --git a/src/express/middleware/authenticate.ts b/src/express/middleware/authenticate.ts index 3843a336e6..23f6e90d75 100644 --- a/src/express/middleware/authenticate.ts +++ b/src/express/middleware/authenticate.ts @@ -1,10 +1,10 @@ import passport from 'passport'; import { Request, Response, NextFunction } from 'express'; -import { Config } from '../../config/types'; +import { SanitizedConfig } from '../../config/types'; export type PayloadAuthenticate = (req: Request, res: Response, next: NextFunction) => NextFunction; -export default (config: Config): PayloadAuthenticate => { +export default (config: SanitizedConfig): PayloadAuthenticate => { const methods = config.collections.reduce((enabledMethods, collection) => { if (typeof collection.auth === 'object' && collection.auth.useAPIKey) { const collectionMethods = [...enabledMethods]; diff --git a/src/express/middleware/corsHeaders.ts b/src/express/middleware/corsHeaders.ts index 89c7fe5e94..8337e5a225 100644 --- a/src/express/middleware/corsHeaders.ts +++ b/src/express/middleware/corsHeaders.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from 'express'; -import { Config } from '../../config/types'; +import { SanitizedConfig } from '../../config/types'; -export default (config: Config) => ( +export default (config: SanitizedConfig) => ( (req: Request, res: Response, next: NextFunction) => { if (config.cors) { res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS'); diff --git a/src/express/middleware/errorHandler.ts b/src/express/middleware/errorHandler.ts index fd8bcac2bb..bf4d7a7113 100644 --- a/src/express/middleware/errorHandler.ts +++ b/src/express/middleware/errorHandler.ts @@ -1,7 +1,7 @@ import httpStatus from 'http-status'; import { NextFunction, Response } from 'express'; import { Logger } from 'pino'; -import { Config } from '../../config/types'; +import { SanitizedConfig } from '../../config/types'; import formatErrorResponse, { ErrorResponse } from '../responses/formatError'; import { PayloadRequest } from '../types'; import APIError from '../../errors/APIError'; @@ -10,7 +10,7 @@ export type ErrorHandler = (err: APIError, req: PayloadRequest, res: Response, n // NextFunction must be passed for Express to use this middleware as error handler // eslint-disable-next-line @typescript-eslint/no-unused-vars -const errorHandler = (config: Config, logger: Logger) => async (err: APIError, req: PayloadRequest, res: Response, next: NextFunction): Promise | void> => { +const errorHandler = (config: SanitizedConfig, logger: Logger) => async (err: APIError, req: PayloadRequest, res: Response, next: NextFunction): Promise | void> => { let response = formatErrorResponse(err); let status = err.status || httpStatus.INTERNAL_SERVER_ERROR; diff --git a/src/fields/performFieldOperations.ts b/src/fields/performFieldOperations.ts index 4197fdaba9..2775f8963c 100644 --- a/src/fields/performFieldOperations.ts +++ b/src/fields/performFieldOperations.ts @@ -2,8 +2,8 @@ import { Payload } from '..'; import { ValidationError } from '../errors'; import sanitizeFallbackLocale from '../localization/sanitizeFallbackLocale'; import traverseFields from './traverseFields'; -import { CollectionConfig } from '../collections/config/types'; -import { GlobalConfig } from '../globals/config/types'; +import { SanitizedCollectionConfig } from '../collections/config/types'; +import { SanitizedGlobalConfig } from '../globals/config/types'; import { Operation } from '../types'; import { PayloadRequest } from '../express/types'; import { HookName } from './config/types'; @@ -25,7 +25,7 @@ type Arguments = { currentDepth?: number } -export default async function performFieldOperations(this: Payload, entityConfig: CollectionConfig | GlobalConfig, args: Arguments): Promise<{ [key: string]: unknown }> { +export default async function performFieldOperations(this: Payload, entityConfig: SanitizedCollectionConfig | SanitizedGlobalConfig, args: Arguments): Promise<{ [key: string]: unknown }> { const { data, originalDoc: fullOriginalDoc, diff --git a/src/globals/buildModel.ts b/src/globals/buildModel.ts index 8a8491353a..c30416686a 100644 --- a/src/globals/buildModel.ts +++ b/src/globals/buildModel.ts @@ -1,8 +1,8 @@ import mongoose from 'mongoose'; import buildSchema from '../mongoose/buildSchema'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; -const buildModel = (config: Config): mongoose.PaginateModel | null => { +const buildModel = (config: SanitizedConfig): mongoose.PaginateModel | null => { if (config.globals && config.globals.length > 0) { const globalsSchema = new mongoose.Schema({}, { discriminatorKey: 'globalType', timestamps: true }); diff --git a/src/globals/config/sanitize.ts b/src/globals/config/sanitize.ts index eb0d286d2e..c801a9c330 100644 --- a/src/globals/config/sanitize.ts +++ b/src/globals/config/sanitize.ts @@ -1,10 +1,10 @@ import { toWords } from '../../utilities/formatLabels'; -import { PayloadCollectionConfig } from '../../collections/config/types'; +import { CollectionConfig } from '../../collections/config/types'; import sanitizeFields from '../../fields/config/sanitize'; -import { PayloadGlobalConfig, GlobalConfig } from './types'; +import { GlobalConfig, SanitizedGlobalConfig } from './types'; import defaultAccess from '../../auth/defaultAccess'; -const sanitizeGlobals = (collections: PayloadCollectionConfig[], globals: PayloadGlobalConfig[]): GlobalConfig[] => { +const sanitizeGlobals = (collections: CollectionConfig[], globals: GlobalConfig[]): SanitizedGlobalConfig[] => { const sanitizedGlobals = globals.map((global) => { const sanitizedGlobal = { ...global }; @@ -34,7 +34,7 @@ const sanitizeGlobals = (collections: PayloadCollectionConfig[], globals: Payloa const validRelationships = collections.map((c) => c.slug); sanitizedGlobal.fields = sanitizeFields(global.fields, validRelationships); - return sanitizedGlobal as GlobalConfig; + return sanitizedGlobal as SanitizedGlobalConfig; }); return sanitizedGlobals; diff --git a/src/globals/config/types.ts b/src/globals/config/types.ts index e35d93b44f..e74851e7e1 100644 --- a/src/globals/config/types.ts +++ b/src/globals/config/types.ts @@ -36,7 +36,7 @@ export type AfterReadHook = (args?: { export type GlobalModel = Model -export type PayloadGlobalConfig = { +export type GlobalConfig = { slug: string label?: string preview?: GeneratePreviewURL @@ -63,11 +63,11 @@ export type PayloadGlobalConfig = { } } -export interface GlobalConfig extends Omit, 'fields'> { +export interface SanitizedGlobalConfig extends Omit, 'fields'> { fields: Field[] } export type Globals = { Model: GlobalModel - config: GlobalConfig[] + config: SanitizedGlobalConfig[] } diff --git a/src/globals/graphql/resolvers/findOne.ts b/src/globals/graphql/resolvers/findOne.ts index afcf9822c3..09e5fb3053 100644 --- a/src/globals/graphql/resolvers/findOne.ts +++ b/src/globals/graphql/resolvers/findOne.ts @@ -1,9 +1,9 @@ /* eslint-disable no-param-reassign */ -import { GlobalConfig } from '../../config/types'; +import { SanitizedGlobalConfig } from '../../config/types'; import { Document } from '../../../types'; -function findOne(globalConfig: GlobalConfig): Document { +function findOne(globalConfig: SanitizedGlobalConfig): Document { async function resolver(_, args, context) { if (args.locale) context.req.locale = args.locale; if (args.fallbackLocale) context.req.fallbackLocale = args.fallbackLocale; diff --git a/src/globals/requestHandlers/findOne.ts b/src/globals/requestHandlers/findOne.ts index c96cf0fa0a..94f59124d0 100644 --- a/src/globals/requestHandlers/findOne.ts +++ b/src/globals/requestHandlers/findOne.ts @@ -1,13 +1,13 @@ import { Response, NextFunction } from 'express'; import httpStatus from 'http-status'; import { PayloadRequest } from '../../express/types'; -import { GlobalConfig } from '../config/types'; +import { SanitizedGlobalConfig } from '../config/types'; import { Document } from '../../types'; export type FindOneGlobalResult = Promise | void>; export type FindOneGlobalResponse = (req: PayloadRequest, res: Response, next: NextFunction) => FindOneGlobalResult; -export default function findOne(globalConfig: GlobalConfig): FindOneGlobalResponse { +export default function findOne(globalConfig: SanitizedGlobalConfig): FindOneGlobalResponse { async function handler(req: PayloadRequest, res: Response, next: NextFunction): FindOneGlobalResult { try { const { slug } = globalConfig; diff --git a/src/globals/requestHandlers/update.ts b/src/globals/requestHandlers/update.ts index 3c42546c48..b58b5a254a 100644 --- a/src/globals/requestHandlers/update.ts +++ b/src/globals/requestHandlers/update.ts @@ -1,13 +1,13 @@ import { Response, NextFunction } from 'express'; import httpStatus from 'http-status'; import { PayloadRequest } from '../../express/types'; -import { GlobalConfig } from '../config/types'; +import { SanitizedGlobalConfig } from '../config/types'; import { Document } from '../../types'; export type UpdateGlobalResult = Promise | void>; export type UpdateGlobalResponse = (req: PayloadRequest, res: Response, next: NextFunction) => UpdateGlobalResult; -function update(globalConfig: GlobalConfig): UpdateGlobalResponse { +function update(globalConfig: SanitizedGlobalConfig): UpdateGlobalResponse { async function handler(req: PayloadRequest, res: Response, next: NextFunction) { try { const { slug } = globalConfig; diff --git a/src/graphql/index.ts b/src/graphql/index.ts index df6bce4146..0e5b81bff2 100644 --- a/src/graphql/index.ts +++ b/src/graphql/index.ts @@ -14,7 +14,7 @@ import initGlobals from '../globals/graphql/init'; import initPreferences from '../preferences/graphql/init'; import { GraphQLResolvers } from './bindResolvers'; import buildWhereInputType from './schema/buildWhereInputType'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; type GraphQLTypes = { blockTypes: any; @@ -26,7 +26,7 @@ type GraphQLTypes = { class InitializeGraphQL { types: GraphQLTypes; - config: Config; + config: SanitizedConfig; graphQL: { resolvers: GraphQLResolvers diff --git a/src/graphql/schema/buildFallbackLocaleInputType.ts b/src/graphql/schema/buildFallbackLocaleInputType.ts index dbb0ab9f16..3c73afceff 100644 --- a/src/graphql/schema/buildFallbackLocaleInputType.ts +++ b/src/graphql/schema/buildFallbackLocaleInputType.ts @@ -1,7 +1,7 @@ import { GraphQLEnumType } from 'graphql'; -import { Config } from '../../config/types'; +import { SanitizedConfig } from '../../config/types'; -const buildFallbackLocaleInputType = (localization: Config['localization']): GraphQLEnumType => new GraphQLEnumType({ +const buildFallbackLocaleInputType = (localization: SanitizedConfig['localization']): GraphQLEnumType => new GraphQLEnumType({ name: 'FallbackLocaleInputType', values: [...localization.locales, 'none'].reduce((values, locale) => ({ ...values, diff --git a/src/graphql/schema/buildLocaleInputType.ts b/src/graphql/schema/buildLocaleInputType.ts index c7ae98741d..9b763984a9 100644 --- a/src/graphql/schema/buildLocaleInputType.ts +++ b/src/graphql/schema/buildLocaleInputType.ts @@ -1,7 +1,7 @@ import { GraphQLEnumType } from 'graphql'; -import { Config } from '../../config/types'; +import { SanitizedConfig } from '../../config/types'; -const buildLocaleInputType = (localization: Config['localization']): GraphQLEnumType => new GraphQLEnumType({ +const buildLocaleInputType = (localization: SanitizedConfig['localization']): GraphQLEnumType => new GraphQLEnumType({ name: 'LocaleInputType', values: localization.locales.reduce((values, locale) => ({ ...values, diff --git a/src/graphql/schema/buildPoliciesType.ts b/src/graphql/schema/buildPoliciesType.ts index 8b967c12b9..3299a5b312 100644 --- a/src/graphql/schema/buildPoliciesType.ts +++ b/src/graphql/schema/buildPoliciesType.ts @@ -2,8 +2,8 @@ import { GraphQLJSONObject } from 'graphql-type-json'; import { GraphQLBoolean, GraphQLNonNull, GraphQLObjectType } from 'graphql'; import formatName from '../utilities/formatName'; -import { CollectionConfig } from '../../collections/config/types'; -import { GlobalConfig } from '../../globals/config/types'; +import { SanitizedCollectionConfig } from '../../collections/config/types'; +import { SanitizedGlobalConfig } from '../../globals/config/types'; import { Field } from '../../fields/config/types'; type OperationType = 'create' | 'read' | 'update' | 'delete'; @@ -103,7 +103,7 @@ export default function buildPoliciesType(): GraphQLObjectType { }, }; - Object.values(this.config.collections).forEach((collection: CollectionConfig) => { + Object.values(this.config.collections).forEach((collection: SanitizedCollectionConfig) => { fields[formatName(collection.slug)] = { type: new GraphQLObjectType({ name: formatName(`${collection.labels.singular}Access`), @@ -112,7 +112,7 @@ export default function buildPoliciesType(): GraphQLObjectType { }; }); - Object.values(this.config.globals).forEach((global: GlobalConfig) => { + Object.values(this.config.globals).forEach((global: SanitizedGlobalConfig) => { fields[formatName(global.slug)] = { type: new GraphQLObjectType({ name: formatName(`${global.label}Access`), diff --git a/src/index.ts b/src/index.ts index 2bad4f283d..27474499f3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import express, { Express, Router } from 'express'; import crypto from 'crypto'; import { Document, Model } from 'mongoose'; import { - Config, + SanitizedConfig, EmailOptions, InitOptions, } from './config/types'; @@ -50,7 +50,7 @@ require('isomorphic-fetch'); * @description Payload */ export class Payload { - config: Config; + config: SanitizedConfig; collections: Collection[] = []; diff --git a/src/mongoose/buildSchema.ts b/src/mongoose/buildSchema.ts index 5ceebe9fc2..f8c33d2ac1 100644 --- a/src/mongoose/buildSchema.ts +++ b/src/mongoose/buildSchema.ts @@ -1,11 +1,11 @@ /* eslint-disable no-use-before-define */ import { Schema, SchemaDefinition } from 'mongoose'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; import { ArrayField, Block, BlockField, Field, GroupField, RadioField, RelationshipField, RowField, SelectField, UploadField } from '../fields/config/types'; -type FieldSchemaGenerator = (field: Field, fields: SchemaDefinition, config: Config) => SchemaDefinition; +type FieldSchemaGenerator = (field: Field, fields: SchemaDefinition, config: SanitizedConfig) => SchemaDefinition; -const setBlockDiscriminators = (fields: Field[], schema: Schema, config: Config) => { +const setBlockDiscriminators = (fields: Field[], schema: Schema, config: SanitizedConfig) => { fields.forEach((field) => { const blockFieldType = field as BlockField; if (blockFieldType.type === 'blocks' && blockFieldType.blocks && blockFieldType.blocks.length > 0) { @@ -47,7 +47,7 @@ const formatBaseSchema = (field: Field) => ({ index: field.index || field.unique || false, }); -const buildSchema = (config: Config, configFields: Field[], options = {}): Schema => { +const buildSchema = (config: SanitizedConfig, configFields: Field[], options = {}): Schema => { let fields = {}; configFields.forEach((field) => { @@ -66,7 +66,7 @@ const buildSchema = (config: Config, configFields: Field[], options = {}): Schem }; const fieldToSchemaMap = { - number: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + number: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: Number }; let schemaToReturn; @@ -87,7 +87,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - text: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + text: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: String }; let schemaToReturn; @@ -108,7 +108,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - email: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + email: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: String }; let schemaToReturn; @@ -129,7 +129,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - textarea: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + textarea: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: String }; let schemaToReturn; @@ -150,7 +150,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - richText: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + richText: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: Schema.Types.Mixed }; let schemaToReturn; @@ -171,7 +171,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - code: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + code: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: String }; let schemaToReturn; @@ -192,7 +192,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - radio: (field: RadioField, fields: SchemaDefinition, config: Config): SchemaDefinition => { + radio: (field: RadioField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: String, @@ -220,7 +220,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - checkbox: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + checkbox: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: Boolean }; let schemaToReturn; @@ -241,7 +241,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - date: (field: Field, fields: SchemaDefinition, config: Config): SchemaDefinition => { + date: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: Date }; let schemaToReturn; @@ -262,7 +262,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - upload: (field: UploadField, fields: SchemaDefinition, config: Config): SchemaDefinition => { + upload: (field: UploadField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: Schema.Types.ObjectId, @@ -288,7 +288,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - relationship: (field: RelationshipField, fields: SchemaDefinition, config: Config) => { + relationship: (field: RelationshipField, fields: SchemaDefinition, config: SanitizedConfig) => { const hasManyRelations = Array.isArray(field.relationTo); let schemaToReturn: { [key: string]: any } = {}; @@ -343,7 +343,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - row: (field: RowField, fields: SchemaDefinition, config: Config): SchemaDefinition => { + row: (field: RowField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const newFields = { ...fields }; field.fields.forEach((rowField: Field) => { @@ -357,7 +357,7 @@ const fieldToSchemaMap = { return newFields; }, - array: (field: ArrayField, fields: SchemaDefinition, config: Config) => { + array: (field: ArrayField, fields: SchemaDefinition, config: SanitizedConfig) => { const baseSchema = { ...formatBaseSchema(field), type: [buildSchema(config, field.fields, { _id: false, id: false })], @@ -382,7 +382,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - group: (field: GroupField, fields: SchemaDefinition, config: Config): SchemaDefinition => { + group: (field: GroupField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), required: field.fields.some((subField) => subField.required === true), @@ -408,7 +408,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - select: (field: SelectField, fields: SchemaDefinition, config: Config): SchemaDefinition => { + select: (field: SelectField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: String, @@ -439,7 +439,7 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, - blocks: (field: BlockField, fields: SchemaDefinition, config: Config): SchemaDefinition => { + blocks: (field: BlockField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = [new Schema({ }, { _id: false, discriminatorKey: 'blockType' })]; let schemaToReturn; diff --git a/src/uploads/imageResizer.ts b/src/uploads/imageResizer.ts index c68ff1b8be..7eb5cfe821 100644 --- a/src/uploads/imageResizer.ts +++ b/src/uploads/imageResizer.ts @@ -3,7 +3,7 @@ import sharp from 'sharp'; import sanitize from 'sanitize-filename'; import getImageSize from './getImageSize'; import fileExists from './fileExists'; -import { CollectionConfig } from '../collections/config/types'; +import { SanitizedCollectionConfig } from '../collections/config/types'; import { FileSizes, ImageSize } from './types'; function getOutputImage(sourceImage: string, size: ImageSize) { @@ -28,7 +28,7 @@ function getOutputImage(sourceImage: string, size: ImageSize) { */ export default async function resizeAndSave( staticPath: string, - config: CollectionConfig, + config: SanitizedCollectionConfig, savedFilename: string, mimeType: string, ): Promise { diff --git a/src/utilities/checkDuplicateCollections.ts b/src/utilities/checkDuplicateCollections.ts index 366df08d96..f3d0f23870 100644 --- a/src/utilities/checkDuplicateCollections.ts +++ b/src/utilities/checkDuplicateCollections.ts @@ -1,9 +1,9 @@ import { DuplicateCollection } from '../errors'; -import { PayloadCollectionConfig } from '../collections/config/types'; +import { CollectionConfig } from '../collections/config/types'; const getDuplicates = (arr: string[]) => arr.filter((item, index) => arr.indexOf(item) !== index); -const checkDuplicateCollections = (collections: PayloadCollectionConfig[]): void => { +const checkDuplicateCollections = (collections: CollectionConfig[]): void => { const duplicateSlugs = getDuplicates(collections.map((c) => c.slug)); if (duplicateSlugs.length > 0) { throw new DuplicateCollection('slug', duplicateSlugs); diff --git a/src/webpack/getBaseConfig.ts b/src/webpack/getBaseConfig.ts index dfaa282072..e63cc2f645 100644 --- a/src/webpack/getBaseConfig.ts +++ b/src/webpack/getBaseConfig.ts @@ -1,13 +1,13 @@ import path from 'path'; import HtmlWebpackPlugin from 'html-webpack-plugin'; import webpack, { Configuration } from 'webpack'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; import babelConfig from '../babel.config'; const mockModulePath = path.resolve(__dirname, './mocks/emptyModule.js'); const mockDotENVPath = path.resolve(__dirname, './mocks/dotENV.js'); -export default (config: Config): Configuration => ({ +export default (config: SanitizedConfig): Configuration => ({ entry: { main: [ path.resolve(__dirname, '../admin'), diff --git a/src/webpack/getDevConfig.ts b/src/webpack/getDevConfig.ts index 6f0a00f308..576648f8e1 100644 --- a/src/webpack/getDevConfig.ts +++ b/src/webpack/getDevConfig.ts @@ -1,8 +1,8 @@ import webpack, { Configuration } from 'webpack'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; import getBaseConfig from './getBaseConfig'; -export default (payloadConfig: Config): Configuration => { +export default (payloadConfig: SanitizedConfig): Configuration => { const baseConfig = getBaseConfig(payloadConfig) as any; let config: Configuration = { diff --git a/src/webpack/getProdConfig.ts b/src/webpack/getProdConfig.ts index de0abffc8c..f158589203 100644 --- a/src/webpack/getProdConfig.ts +++ b/src/webpack/getProdConfig.ts @@ -4,10 +4,10 @@ import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; import path from 'path'; import { Configuration } from 'webpack'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; import getBaseConfig from './getBaseConfig'; -export default (payloadConfig: Config): Configuration => { +export default (payloadConfig: SanitizedConfig): Configuration => { const baseConfig = getBaseConfig(payloadConfig) as any; let config: Configuration = { diff --git a/src/webpack/init.ts b/src/webpack/init.ts index 60d62f3707..e1b99438f3 100644 --- a/src/webpack/init.ts +++ b/src/webpack/init.ts @@ -3,11 +3,11 @@ import express, { Router } from 'express'; import webpackDevMiddleware from 'webpack-dev-middleware'; import webpackHotMiddleware from 'webpack-hot-middleware'; import getWebpackDevConfig from './getDevConfig'; -import { Config } from '../config/types'; +import { SanitizedConfig } from '../config/types'; const router = express.Router(); -function initWebpack(config: Config): Router { +function initWebpack(config: SanitizedConfig): Router { const webpackDevConfig = getWebpackDevConfig(config); const compiler = webpack(webpackDevConfig); diff --git a/types.d.ts b/types.d.ts index 8d956246c0..fcc3a4473b 100644 --- a/types.d.ts +++ b/types.d.ts @@ -1,7 +1,8 @@ export * from './dist/types'; export { - PayloadCollectionConfig as CollectionConfig, + CollectionConfig, + SanitizedCollectionConfig, BeforeOperationHook as CollectionBeforeOperationHook, BeforeValidateHook as CollectionBeforeValidateHook, BeforeChangeHook as CollectionBeforeChangeHook, @@ -14,5 +15,5 @@ export { AfterForgotPasswordHook as CollectionAfterForgotPasswordHook, } from './dist/collections/config/types'; -export { PayloadGlobalConfig as GlobalConfig } from './dist/globals/config/types'; +export { GlobalConfig, SanitizedGlobalConfig } from './dist/globals/config/types'; export { Field, FieldHook, FieldAccess, RichTextCustomElement, RichTextCustomLeaf, Block } from './dist/fields/config/types'; diff --git a/yarn.lock b/yarn.lock index 1a0a822155..3062052d50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1544,10 +1544,10 @@ dependencies: "@octokit/openapi-types" "^7.3.2" -"@payloadcms/config-provider@0.0.23": - version "0.0.23" - resolved "https://registry.npmjs.org/@payloadcms/config-provider/-/config-provider-0.0.23.tgz#42a036ad87365db1f56167f9ed5f68d74d270abe" - integrity sha512-Ww+0/TOLTOttSPpAUOOxT5lUPnxKK9SjCtaNBmClRNgsPlnacoW6yVBL/0fqwQKS2e4vWZivXvx70yzrWZhM6w== +"@payloadcms/config-provider@^0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@payloadcms/config-provider/-/config-provider-0.1.0.tgz#69d030090862841639cb465529de31337eaa65ba" + integrity sha512-s+X0jOlMC8ZT1GoApxMoLGbdd96rhONMm4TQLU9b2RiqoWnpRvn7cA8a97wQAOa7+B3mfQ64/LgOiIHKYLffDw== dependencies: jwt-decode "^3.1.2" From aa81e048610095febdbd1667a886939eb1438d48 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Jul 2021 20:21:51 -0400 Subject: [PATCH 027/115] docs: typescript configs --- docs/configuration/collections.mdx | 21 +++++++++++++++++++++ docs/configuration/globals.mdx | 21 +++++++++++++++++++++ docs/configuration/overview.mdx | 21 +++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index 36562b8429..d3db66be14 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -111,3 +111,24 @@ Hooks are a powerful way to extend collection functionality and execute your own ### Field types Collections 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 + +You can import collection types as follows: + +```js +import { CollectionConfig } from 'payload/types'; + +// This is the type used for incoming collection configs. +// Only the bare minimum properties are marked as required. +``` + +```js +import { SanitizedCollectionConfig } from 'payload/types'; + +// This is the type used after an incoming collection config is fully sanitized. + +// If you are building a plugin, you might benefit from this type, +// as plugins interact will fully defaulted, sanitized, and validated +// collection configs. +``` diff --git a/docs/configuration/globals.mdx b/docs/configuration/globals.mdx index 516b22a0e0..ac180e4b5a 100644 --- a/docs/configuration/globals.mdx +++ b/docs/configuration/globals.mdx @@ -71,3 +71,24 @@ Globals also fully support a smaller subset of Hooks. To learn more, go to the [ ### 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 + +You can import global types as follows: + +```js +import { GlobalConfig } from 'payload/types'; + +// This is the type used for incoming global configs. +// Only the bare minimum properties are marked as required. +``` + +```js +import { SanitizedGlobalConfig } from 'payload/types'; + +// This is the type used after an incoming global config is fully sanitized. + +// If you are building a plugin, you might benefit from this type, +// as plugins interact will fully defaulted, sanitized, and validated +// global configs. +``` diff --git a/docs/configuration/overview.mdx b/docs/configuration/overview.mdx index 5dc93f7c39..50eb3e62e0 100644 --- a/docs/configuration/overview.mdx +++ b/docs/configuration/overview.mdx @@ -145,3 +145,24 @@ If for any reason you need to re-use the built-in Payload `babel.config.js`, you ``` import { config } from 'payload/babel'; ``` + +### TypeScript + +You can import collection types as follows: + +```js +import { Config } from 'payload/config'; + +// This is the type used for an incoming Payload config. +// Only the bare minimum properties are marked as required. +``` + +```js +import { SanitizedConfig } from 'payload/config'; + +// This is the type used after an incoming Payload config is fully sanitized. + +// If you are building a plugin, you might benefit from this type, +// as plugins interact will fully defaulted, sanitized, and validated +// Payload configs. +``` From d672e704bffbb012d82da9da44ba7629b9c38763 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Jul 2021 20:33:42 -0400 Subject: [PATCH 028/115] chore(release): v0.8.0 --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9187ddc4c..79c4c64187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [0.8.0](https://github.com/payloadcms/payload/compare/v0.7.10...v0.8.0) (2021-07-28) + + +### Bug Fixes + +* ensures text component is always controlled ([c649362](https://github.com/payloadcms/payload/commit/c649362b95f1ddaeb47cb121b814ca30712dea86)) + + +### Features + +* revises naming conventions of config types ([5a7e5b9](https://github.com/payloadcms/payload/commit/5a7e5b921d7803ec2da8cc3dc8162c1dd6828ca0)) + ## [0.7.10](https://github.com/payloadcms/payload/compare/v0.7.9...v0.7.10) (2021-07-27) diff --git a/package.json b/package.json index 3d54118696..c5ab837581 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.7.10", + "version": "0.8.0", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From dbc4115644aa64af21cdb276310ec0c808e6b05f Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Jul 2021 20:40:40 -0400 Subject: [PATCH 029/115] chore: updates changelog with breaking change --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79c4c64187..430a87eddc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # [0.8.0](https://github.com/payloadcms/payload/compare/v0.7.10...v0.8.0) (2021-07-28) +### BREAKING CHANGES + +* There have been a few very minor, yet breaking TypeScript changes in this release. If you are accessing Payload config types from directly within the `dist` folder, like any of the following: + +- `import { PayloadCollectionConfig, CollectionConfig } from 'payload/dist/collections/config/types';` +- `import { PayloadGlobalConfig, GlobalConfig } from 'payload/dist/globals/config/types';` +- `import { Config, PayloadConfig } from 'payload/config';` + +You may need to modify your code to work with this release. The TL;DR of the change is that we have improved our naming conventions of internally used types, which will become more important over time. Now, we have landed on a naming convention as follows: + +- Incoming configs, typed correctly for optional / required config properties, are named `Config`, `CollectionConfig`, and `GlobalConfig`. +- Fully defaulted, sanitized, and validated configs are now named `SanitizedConfig`, `SanitizedCollectionConfig`, and `SanitizedGlobalConfig`. + +They can be imported safely outside of the `dist` folder now as well. For more information on how to properly import which types you need, see the following Docs pages which have now been updated with examples on how to properly access the new types: + +- [Base Payload config docs](https://payloadcms.com/docs/configuration/overview) +- [Collection config docs](https://payloadcms.com/docs/configuration/collections) +- [Global config docs](https://payloadcms.com/docs/configuration/globals) ### Bug Fixes From deef5202c15301b685fe5efc8a6ff59b012ea1d4 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Jul 2021 14:37:27 -0400 Subject: [PATCH 030/115] fix: row admin type --- src/fields/config/types.ts | 8 +- yarn.lock | 2011 +++++++++++++++++------------------- 2 files changed, 934 insertions(+), 1085 deletions(-) diff --git a/src/fields/config/types.ts b/src/fields/config/types.ts index f98739f5c8..5e47ac41b7 100644 --- a/src/fields/config/types.ts +++ b/src/fields/config/types.ts @@ -140,7 +140,13 @@ export type GroupField = FieldBase & { } } -export type RowField = FieldBase & { +export type RowAdmin = Omit & { + readOnly?: false; + hidden?: false; +}; + +export type RowField = Omit & { + admin?: RowAdmin; type: 'row'; fields: Field[]; } diff --git a/yarn.lock b/yarn.lock index 1a0a822155..3c527b715e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@babel/cli@^7.12.8": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/cli/-/cli-7.14.5.tgz#9551b194f02360729de6060785bbdcce52c69f0a" - integrity sha512-poegjhRvXHWO0EAsnYajwYZuqcz7gyfxwfaecUESxDujrqOivf3zrjFbub8IJkrqEaz3fvJWh001EzxBub54fg== + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/cli/-/cli-7.14.8.tgz#fac73c0e2328a8af9fd3560c06b096bfa3730933" + integrity sha512-lcy6Lymft9Rpfqmrqdd4oTDdUx9ZwaAhAfywVrHG4771Pa6PPT0danJ1kDHBXYqh4HHSmIdA+nlmfxfxSDPtBg== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -25,25 +25,25 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" - integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== "@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.7.5": - version "7.14.6" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" - integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz#20cdf7c84b5d86d83fac8710a8bc605a7ba3f010" + integrity sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" + "@babel/generator" "^7.14.8" "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helpers" "^7.14.6" - "@babel/parser" "^7.14.6" + "@babel/helper-module-transforms" "^7.14.8" + "@babel/helpers" "^7.14.8" + "@babel/parser" "^7.14.8" "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/traverse" "^7.14.8" + "@babel/types" "^7.14.8" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -51,12 +51,12 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" - integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== +"@babel/generator@^7.14.8": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz#bf86fd6af96cf3b74395a8ca409515f89423e070" + integrity sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.14.8" jsesc "^2.5.1" source-map "^0.5.0" @@ -86,13 +86,13 @@ semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": - version "7.14.6" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" - integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz#a6f8c3de208b1e5629424a9a63567f56501955fc" + integrity sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ== dependencies: "@babel/helper-annotate-as-pure" "^7.14.5" "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.14.7" "@babel/helper-optimise-call-expression" "^7.14.5" "@babel/helper-replace-supers" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" @@ -149,10 +149,10 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" - integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ== +"@babel/helper-member-expression-to-functions@^7.14.5", "@babel/helper-member-expression-to-functions@^7.14.7": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== dependencies: "@babel/types" "^7.14.5" @@ -163,19 +163,19 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-module-transforms@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" - integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.14.8": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz#d4279f7e3fd5f4d5d342d833af36d4dd87d7dc49" + integrity sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA== dependencies: "@babel/helper-module-imports" "^7.14.5" "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-simple-access" "^7.14.8" "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.8" "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/traverse" "^7.14.8" + "@babel/types" "^7.14.8" "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" @@ -208,12 +208,12 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-simple-access@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" - integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== +"@babel/helper-simple-access@^7.14.5", "@babel/helper-simple-access@^7.14.8": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" + integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.14.8" "@babel/helper-skip-transparent-expression-wrappers@^7.14.5": version "7.14.5" @@ -229,10 +229,10 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.8": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" + integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== "@babel/helper-validator-option@^7.14.5": version "7.14.5" @@ -249,14 +249,14 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helpers@^7.14.6": - version "7.14.6" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" - integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== +"@babel/helpers@^7.14.8": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz#839f88f463025886cff7f85a35297007e2da1b77" + integrity sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw== dependencies: "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/traverse" "^7.14.8" + "@babel/types" "^7.14.8" "@babel/highlight@^7.14.5": version "7.14.5" @@ -268,21 +268,21 @@ js-tokens "^4.0.0" "@babel/node@^7.12.6": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/node/-/node-7.14.5.tgz#cfbfab24c74f2855243d0548bb74a0b8b37b8fce" - integrity sha512-fwAf0Ba3gjcwP04T0BD0Y3oHOTDQH2tVcyaPOMjb+8xkCJ38FoaVOlLfQ/asBgm6aCkBkn12/l8spCXUEEeAyA== + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/node/-/node-7.14.7.tgz#0090e83e726027ea682240718ca39e4b625b15ad" + integrity sha512-QghINtVgOUCrSpE7z4IXPTGJfRYyjoY7ny5Qz0cuUlsThQv6WSn1xJk217WlEDucPLP2o5HwGXPSkxD4LWOZxQ== dependencies: "@babel/register" "^7.14.5" commander "^4.0.1" - core-js "^3.14.0" + core-js "^3.15.0" node-environment-flags "^1.0.5" regenerator-runtime "^0.13.4" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.7.0": - version "7.14.6" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz#d85cc68ca3cac84eae384c06f032921f5227f4b2" - integrity sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.8", "@babel/parser@^7.7.0": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz#66fd41666b2d7b840bd5ace7f7416d5ac60208d4" + integrity sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": version "7.14.5" @@ -293,10 +293,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz#4024990e3dd74181f4f426ea657769ff49a2df39" - integrity sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA== +"@babel/plugin-proposal-async-generator-functions@^7.14.7": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" + integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" @@ -367,12 +367,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz#e581d5ccdfa187ea6ed73f56c6a21c1580b90fbf" - integrity sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A== +"@babel/plugin-proposal-object-rest-spread@^7.14.7": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.14.7" "@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" @@ -597,10 +597,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz#d32ad19ff1a6da1e861dc62720d80d9776e3bf35" - integrity sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww== +"@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -694,10 +694,10 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz#d537e8ee083ee6f6aa4f4eef9d2081d555746e4c" - integrity sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": + version "7.14.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" + integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -796,7 +796,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.14.5": +"@babel/plugin-transform-spread@^7.14.6": version "7.14.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== @@ -850,16 +850,16 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/preset-env@^7.8.3": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.5.tgz#c0c84e763661fd0e74292c3d511cb33b0c668997" - integrity sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA== + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz#254942f5ca80ccabcfbb2a9f524c74bca574005b" + integrity sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg== dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.14.7" "@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.7" "@babel/plugin-proposal-class-properties" "^7.14.5" "@babel/plugin-proposal-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import" "^7.14.5" @@ -868,7 +868,7 @@ "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.7" "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" "@babel/plugin-proposal-private-methods" "^7.14.5" @@ -894,7 +894,7 @@ "@babel/plugin-transform-block-scoping" "^7.14.5" "@babel/plugin-transform-classes" "^7.14.5" "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" "@babel/plugin-transform-dotall-regex" "^7.14.5" "@babel/plugin-transform-duplicate-keys" "^7.14.5" "@babel/plugin-transform-exponentiation-operator" "^7.14.5" @@ -906,7 +906,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.14.5" "@babel/plugin-transform-modules-systemjs" "^7.14.5" "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" "@babel/plugin-transform-new-target" "^7.14.5" "@babel/plugin-transform-object-super" "^7.14.5" "@babel/plugin-transform-parameters" "^7.14.5" @@ -914,18 +914,18 @@ "@babel/plugin-transform-regenerator" "^7.14.5" "@babel/plugin-transform-reserved-words" "^7.14.5" "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" "@babel/plugin-transform-sticky-regex" "^7.14.5" "@babel/plugin-transform-template-literals" "^7.14.5" "@babel/plugin-transform-typeof-symbol" "^7.14.5" "@babel/plugin-transform-unicode-escapes" "^7.14.5" "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.5" + "@babel/types" "^7.14.8" babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.14.0" + core-js-compat "^3.15.0" semver "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -972,17 +972,17 @@ source-map-support "^0.5.16" "@babel/runtime-corejs3@^7.10.2": - version "7.14.6" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz#066b966eda40481740180cb3caab861a3f208cd3" - integrity sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q== + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.8.tgz#68539e0129f13eb1ed9a9aa273d3542b93c88384" + integrity sha512-4dMD5QRBkumn45oweR0SxoNtt15oz3BUBAQ8cIx7HJqZTtE8zjpM0My8aHJHVnyf4XfRg6DNzaE1080WLBiC1w== dependencies: - core-js-pure "^3.14.0" + core-js-pure "^3.15.0" regenerator-runtime "^0.13.4" "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": - version "7.14.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" - integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" + integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== dependencies: regenerator-runtime "^0.13.4" @@ -995,27 +995,27 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.7.0": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" - integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.14.8", "@babel/traverse@^7.7.0": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz#c0253f02677c5de1a8ff9df6b0aacbec7da1a8ce" + integrity sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" + "@babel/generator" "^7.14.8" "@babel/helper-function-name" "^7.14.5" "@babel/helper-hoist-variables" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/parser" "^7.14.8" + "@babel/types" "^7.14.8" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== +"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.14.8" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz#38109de8fcadc06415fbd9b74df0065d4d41c728" + integrity sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q== dependencies: - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.8" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1036,17 +1036,17 @@ resolved "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== -"@date-io/core@^2.10.11": - version "2.10.11" - resolved "https://registry.npmjs.org/@date-io/core/-/core-2.10.11.tgz#b1a3d57730f3eaaab54d5658be4a71727297e357" - integrity sha512-keXQnwH0LM8wyvu+j5Z2KGK56D+eItjy7DnwuWl/oV+DM2UEYl0z5WhdPMpfswSyt/kjuPOzcVF/7u/skMLaoA== +"@date-io/core@^2.11.0": + version "2.11.0" + resolved "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz#28580cda1c8228ab2c7ed6aee673ef0495f913e6" + integrity sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw== "@date-io/date-fns@^2.10.6": - version "2.10.11" - resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.10.11.tgz#1f3b40c6f2ea2e659260ca329fef80cb6dc64704" - integrity sha512-QG9IAZ4bvwkJftoSVKtdb5ISH+Qp4zilrjhzcL4RXaeqkfIWiFeXqQPgJljvPl6gQ04zf2SjGkWjdh1eJxxwmQ== + version "2.11.0" + resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.11.0.tgz#142fbf954eda7ad66514af7a2802d78c4ea40053" + integrity sha512-mPQ71plBeFrArvBSHtjWMHXA89IUbZ6kuo2dsjlRC/1uNOybo91spIb+wTu03NxKTl8ut07s0jJ9svF71afpRg== dependencies: - "@date-io/core" "^2.10.11" + "@date-io/core" "^2.11.0" "@discoveryjs/json-ext@^0.5.0": version "0.5.3" @@ -1186,12 +1186,17 @@ integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== "@hapi/topo@^5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" - integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== + "@hypnosphi/create-react-context@^0.3.1": version "0.3.1" resolved "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" @@ -1393,9 +1398,9 @@ chalk "^4.0.0" "@microsoft/load-themed-styles@^1.10.26": - version "1.10.185" - resolved "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.185.tgz#a04fb80c558d105a3ced7f7166231caf4e4fd303" - integrity sha512-IyjxBy64JnmlOPjI0F/J+JoeQu/gDCoqLQ4zEmWgd2EDCg2Sd03CrkwqR40q1B5QzC2bUbP3KwnFhoaTS4pBsA== + version "1.10.196" + resolved "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.196.tgz#2bf255f6c57bdd602d1e1b942d38480d62c0c1c3" + integrity sha512-eImlYYB/ZJH8Y3t2d/JbjxwSwWVeiQ7x+Xl5mTlTAlByzAiEs7tB3LUOEEz0XrlasvYV9ynq2i8b1+Gi/+KlMQ== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.2": version "2.1.8-no-fsevents.2" @@ -1428,9 +1433,9 @@ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.7" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz#94c23db18ee4653e129abd26fb06f870ac9e1ee2" - integrity sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA== + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" @@ -1481,29 +1486,29 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^7.3.2": - version "7.3.2" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-7.3.2.tgz#065ce49b338043ec7f741316ce06afd4d459d944" - integrity sha512-oJhK/yhl9Gt430OrZOzAl2wJqR0No9445vmZ9Ey8GjUZUpwuu/vmEFP0TDhDXdpGDoxD6/EIFHJEcY8nHXpDTA== +"@octokit/openapi-types@^9.1.1": + version "9.1.1" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.1.1.tgz#fb87f2e2f44b95a5720d61dee409a9f1fbc59217" + integrity sha512-xmyPP9tVb4T4A6Lk6SL6ScnIqAHpPV4jfMZI8VtY286212ri9J/6IFGuLsZ26daADUmriuLejake4k+azEfnaw== "@octokit/plugin-paginate-rest@^2.6.2": - version "2.13.5" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.5.tgz#e459f9b5dccbe0a53f039a355d5b80c0a2b0dc57" - integrity sha512-3WSAKBLa1RaR/7GG+LQR/tAZ9fp9H9waE9aPXallidyci9oZsfgsLn5M836d3LuDC6Fcym+2idRTBpssHZePVg== + version "2.14.0" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.14.0.tgz#f469cb4a908792fb44679c5973d8bba820c88b0f" + integrity sha512-S2uEu2uHeI7Vf+Lvj8tv3O5/5TCAa8GHS0dUQN7gdM7vKA6ZHAbR6HkAVm5yMb1mbedLEbxOuQ+Fa0SQ7tCDLA== dependencies: - "@octokit/types" "^6.13.0" + "@octokit/types" "^6.18.0" "@octokit/plugin-request-log@^1.0.2": version "1.0.4" resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@5.3.1": - version "5.3.1" - resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.3.1.tgz#deddce769b4ec3179170709ab42e4e9e6195aaa9" - integrity sha512-3B2iguGmkh6bQQaVOtCsS0gixrz8Lg0v4JuXPqBcFqLKuJtxAUf3K88RxMEf/naDOI73spD+goJ/o7Ie7Cvdjg== +"@octokit/plugin-rest-endpoint-methods@5.5.1": + version "5.5.1" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.5.1.tgz#31cce8fc3eda4d186bd90828cb7a2203ad95e3d1" + integrity sha512-Al57+OZmO65JpiPk4JS6u6kQ2y9qjoZtY1IWiSshc4N+F7EcrK8Rgy/cUJBB4WIcSFUQyF66EJQK1oKgXWeRNw== dependencies: - "@octokit/types" "^6.16.2" + "@octokit/types" "^6.21.1" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -1527,22 +1532,22 @@ node-fetch "^2.6.1" universal-user-agent "^6.0.0" -"@octokit/rest@18.6.0": - version "18.6.0" - resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.6.0.tgz#9a8457374c78c2773d3ab3f50aaffc62f3ed4f76" - integrity sha512-MdHuXHDJM7e5sUBe3K9tt7th0cs4csKU5Bb52LRi2oHAeIMrMZ4XqaTrEv660HoUPoM1iDlnj27Ab/Nh3MtwlA== +"@octokit/rest@18.7.1": + version "18.7.1" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.7.1.tgz#575ecf8b881b79540daa28b0fa3a2b3ae8ef2649" + integrity sha512-790Yv8Xpbqs3BtnMAO5hlOftVICHPdgZ/3qlTmeOoqrQGzT25BIpHkg/KKMeKG9Fg8d598PLxGhf80RswElv9g== dependencies: "@octokit/core" "^3.5.0" "@octokit/plugin-paginate-rest" "^2.6.2" "@octokit/plugin-request-log" "^1.0.2" - "@octokit/plugin-rest-endpoint-methods" "5.3.1" + "@octokit/plugin-rest-endpoint-methods" "5.5.1" -"@octokit/types@^6.0.3", "@octokit/types@^6.13.0", "@octokit/types@^6.16.1", "@octokit/types@^6.16.2": - version "6.16.4" - resolved "https://registry.npmjs.org/@octokit/types/-/types-6.16.4.tgz#d24f5e1bacd2fe96d61854b5bda0e88cf8288dfe" - integrity sha512-UxhWCdSzloULfUyamfOg4dJxV9B+XjgrIZscI0VCbp4eNrjmorGEw+4qdwcpTsu6DIrm9tQsFQS2pK5QkqQ04A== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.18.0", "@octokit/types@^6.21.1": + version "6.21.1" + resolved "https://registry.npmjs.org/@octokit/types/-/types-6.21.1.tgz#d0f2b7598c88e13d0bd87e330d975e3fb2a90180" + integrity sha512-PP+m3T5EWZKawru4zi/FvX8KL2vkO5f1fLthx78/7743p7RtJUevt3z7698k+7oAYRA7YuVqfXthSEHqkDvZ8g== dependencies: - "@octokit/openapi-types" "^7.3.2" + "@octokit/openapi-types" "^9.1.1" "@payloadcms/config-provider@0.0.23": version "0.0.23" @@ -1640,9 +1645,9 @@ defer-to-connect "^1.0.1" "@szmarczak/http-timer@^4.0.5": - version "4.0.5" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" - integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== + version "4.0.6" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== dependencies: defer-to-connect "^2.0.0" @@ -1712,9 +1717,9 @@ anymatch "*" "@types/aria-query@^4.2.0": - version "4.2.1" - resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b" - integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg== + version "4.2.2" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" + integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== "@types/asap@^2.0.0": version "2.0.0" @@ -1730,9 +1735,9 @@ postcss "7.x.x" "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.12", "@types/babel__core@^7.1.7": - version "7.1.14" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== + version "7.1.15" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz#2ccfb1ad55a02c83f8e0ad327cbc332f55eb1024" + integrity sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1741,41 +1746,41 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.2" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" - integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + version "7.6.3" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== dependencies: "@babel/types" "^7.0.0" "@types/babel__plugin-transform-runtime@^7.9.1": - version "7.9.1" - resolved "https://registry.npmjs.org/@types/babel__plugin-transform-runtime/-/babel__plugin-transform-runtime-7.9.1.tgz#af4ce1e1ec0413391fb537c765196a8199137027" - integrity sha512-9tmPrE1Emf22D1Na7AZIS5nCVJkCGNY80dIZaWt2Pxe+oAdQnJXl9ztxS360kyLzU7EniiUFRnT5906JRiaayw== + version "7.9.2" + resolved "https://registry.npmjs.org/@types/babel__plugin-transform-runtime/-/babel__plugin-transform-runtime-7.9.2.tgz#3ed32f10cde185b1c24d5f151644914f6a457027" + integrity sha512-8azy76n2Br3fsNK8O+Czy6nwqjV9lWI+k8bPxbAN3fLCALjH3xwjPoq9/yXfPzSs2bz3Wf9OwRsMm5WpsETYaQ== "@types/babel__preset-env@^7.9.1": - version "7.9.1" - resolved "https://registry.npmjs.org/@types/babel__preset-env/-/babel__preset-env-7.9.1.tgz#ba6bc73bfaa2050ca5459235fb73e146d0f66aa6" - integrity sha512-kkCHo5fk24m3gcH7oVhRLdw6xGF2tog5rc8/CbXIyTSYSO0NhStjEYCaEmRjs5VB5Jy5Wbj+0QvuGdxuGdvAfQ== + version "7.9.2" + resolved "https://registry.npmjs.org/@types/babel__preset-env/-/babel__preset-env-7.9.2.tgz#815ad399ff33e4a1be1228e1ecece5f00ce40bea" + integrity sha512-epEgKQiqTDZdPgYwtriYK1GVAGcyVZVvvw2UatX3+95mogKGimebApcMEWLF12uhUbNIvX284CSQEavnV/OIgw== "@types/babel__template@*": - version "7.4.0" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" - integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.11.1" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" - integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== + version "7.14.2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" "@types/body-parser@*", "@types/body-parser@^1.19.0": - version "1.19.0" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" - integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + version "1.19.1" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" + integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== dependencies: "@types/connect" "*" "@types/node" "*" @@ -1788,16 +1793,16 @@ browserslist "*" "@types/bson@*": - version "4.0.3" - resolved "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz#30889d2ffde6262abbe38659364c631454999fbf" - integrity sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw== + version "4.0.4" + resolved "https://registry.npmjs.org/@types/bson/-/bson-4.0.4.tgz#79d2d26e81070044db2a1a8b2cc2f673c840e1e5" + integrity sha512-awqorHvQS0DqxkHQ/FxcPX9E+H7Du51Qw/2F+5TBMSaE3G0hm+8D3eXJ6MAzFw75nE8V7xF0QvzUSdxIjJb/GA== dependencies: "@types/node" "*" "@types/cacheable-request@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" - integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== + version "6.0.2" + resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== dependencies: "@types/http-cache-semantics" "*" "@types/keyv" "*" @@ -1805,32 +1810,32 @@ "@types/responselike" "*" "@types/clean-css@*": - version "4.2.4" - resolved "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.4.tgz#4fe4705c384e6ec9ee8454bc3d49089f38dc038a" - integrity sha512-x8xEbfTtcv5uyQDrBXKg9Beo5QhTPqO4vM0uq4iU27/nhyRRWNEMKHjxvAb0WDvp2Mnt4Sw0jKmIi5yQF/k2Ag== + version "4.2.5" + resolved "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.5.tgz#69ce62cc13557c90ca40460133f672dc52ceaf89" + integrity sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw== dependencies: "@types/node" "*" source-map "^0.6.0" "@types/compression@^1.7.0": - version "1.7.0" - resolved "https://registry.npmjs.org/@types/compression/-/compression-1.7.0.tgz#8dc2a56604873cf0dd4e746d9ae4d31ae77b2390" - integrity sha512-3LzWUM+3k3XdWOUk/RO+uSjv7YWOatYq2QADJntK1pjkk4DfVP0KrIEPDnXRJxAAGKe0VpIPRmlINLDuCedZWw== + version "1.7.1" + resolved "https://registry.npmjs.org/@types/compression/-/compression-1.7.1.tgz#d935a1cd6f5cd9a4dc8b0d8aadf2ee91a2975acc" + integrity sha512-d6K1bU3qIjtfB2u+A1N0WDf62LpewRjrvbqY79qlPwk2otgQ4mWB4+LzPCWTvGmcuVwo+zAroEhsNlJavRcFvg== dependencies: "@types/express" "*" "@types/connect-history-api-fallback@^1.3.3": - version "1.3.4" - resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.4.tgz#8c0f0e6e5d8252b699f5a662f51bdf82fd9d8bb8" - integrity sha512-Kf8v0wljR5GSCOCF/VQWdV3ZhKOVA73drXtY3geMTQgHy9dgqQ0dLrf31M0hcuWkhFzK5sP0kkS3mJzcKVtZbw== + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.34" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" - integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ== + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" @@ -1840,17 +1845,17 @@ integrity sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA== "@types/eslint-scope@^3.7.0": - version "3.7.0" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" - integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== + version "3.7.1" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.2.6": - version "7.2.13" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz#e0ca7219ba5ded402062ad6f926d491ebb29dd53" - integrity sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg== + version "7.28.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" + integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -1860,20 +1865,15 @@ resolved "https://registry.npmjs.org/@types/esrever/-/esrever-0.2.0.tgz#96404a2284b2c7527f08a1e957f8a31705f9880f" integrity sha512-5NI6TeGzVEy/iBcuYtcPzzIC6EqlfQ2+UZ54vT0ulq8bPNGAy8UJD+XcsAyEOcnYFUjOVWuUV+k4/rVkxt9/XQ== -"@types/estree@*": - version "0.0.48" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz#18dc8091b285df90db2f25aa7d906cfc394b7f74" - integrity sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew== - -"@types/estree@^0.0.47": - version "0.0.47" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" - integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== "@types/express-fileupload@^1.1.5": - version "1.1.6" - resolved "https://registry.npmjs.org/@types/express-fileupload/-/express-fileupload-1.1.6.tgz#fdc3b1d6f54fe4522867f8550f0acf24bcbf5c45" - integrity sha512-8z92PCVgvWvG1TpxucRU9oRz3hZc5cUz+CkeDe4XwVmg2DJDdd/7QASMsJzIo+9Pbfp7LfTEWSeEFUJZBohv9g== + version "1.1.7" + resolved "https://registry.npmjs.org/@types/express-fileupload/-/express-fileupload-1.1.7.tgz#9b65d323a189045ed509026f829b164eab0c070d" + integrity sha512-NNWCjXh2IgyNBkFBZuY6HJAZQfvBm+L/Yz6HEv2NOmKLvFytcQeRSqXOB7/UFboeyi4p00tRh6SZd4yi+gWctQ== dependencies: "@types/express" "*" @@ -1885,25 +1885,25 @@ express-graphql "*" "@types/express-rate-limit@^5.1.0": - version "5.1.2" - resolved "https://registry.npmjs.org/@types/express-rate-limit/-/express-rate-limit-5.1.2.tgz#51f030ce722fe298269f85378b49a34837a1d2ca" - integrity sha512-loN1dcr0WEKsbVtXNQKDef4Fmh25prfy+gESrwTDofIhAt17ngTxrsDiEZxLemmfHH279x206CdUB9XHXS9E6Q== + version "5.1.3" + resolved "https://registry.npmjs.org/@types/express-rate-limit/-/express-rate-limit-5.1.3.tgz#79f2ca40d90455a5798da6f8e06d8a3d35f4a1d6" + integrity sha512-H+TYy3K53uPU2TqPGFYaiWc2xJV6+bIFkDd/Ma2/h67Pa6ARk9kWE0p/K9OH1Okm0et9Sfm66fmXoAxsH2PHXg== dependencies: "@types/express" "*" "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.21" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz#a427278e106bca77b83ad85221eae709a3414d42" - integrity sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA== + version "4.17.24" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@*", "@types/express@^4.17.9": - version "4.17.12" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz#4bc1bf3cd0cfe6d3f6f2853648b40db7d54de350" - integrity sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q== + version "4.17.13" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.18" @@ -1911,9 +1911,9 @@ "@types/serve-static" "*" "@types/extract-text-webpack-plugin@^3.0.4": - version "3.0.5" - resolved "https://registry.npmjs.org/@types/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.5.tgz#1b65f1913382225bb6f798b2c103175a7065560d" - integrity sha512-TH021cSbocn+1rfP3Bw6jJi3vcmgHMcQMSkXseIzwGU95qA1Nu7iEpzkHdpM4rBvxFzdeVuRgv+Nv7Ayx/K4qg== + version "3.0.6" + resolved "https://registry.npmjs.org/@types/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.6.tgz#4736730b5ca237523c700bd6e3311ef359924e7a" + integrity sha512-JkXVEafhJ/OtrUiiJr4Yn9j4tq48fK/CtDZJcwCL/g92yLlVB/t5X52K2n6c9Ux1qZ5H2ZJbbOBRZTWuzCqELA== dependencies: "@types/webpack" "^4" @@ -1939,14 +1939,14 @@ "@types/node" "*" "@types/hapi__joi@~17.1.6": - version "17.1.6" - resolved "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-17.1.6.tgz#b84663676aa9753c17183718338dd40ddcbd3754" - integrity sha512-y3A1MzNC0FmzD5+ys59RziE1WqKrL13nxtJgrSzjoO7boue5B7zZD2nZLPwrSuUviFjpKFQtgHYSvhDGfIE4jA== + version "17.1.7" + resolved "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-17.1.7.tgz#a479bc593823fb7bd5600fea37917c8e5c71629c" + integrity sha512-byC9slpuqyDeEKegl/ViT8PCQRSp0CYkhLzz0cPxqxV6QC53Ht1cr2jG5iwOvtt/RxylUbTpXNqpgbf9Qu8QFw== "@types/history@*": - version "4.7.8" - resolved "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" - integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== + version "4.7.9" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" + integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== "@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" @@ -1957,32 +1957,32 @@ hoist-non-react-statics "^3.3.0" "@types/html-minifier-terser@^5.0.0": - version "5.1.1" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" - integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== + version "5.1.2" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== "@types/html-minifier@*": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-4.0.0.tgz#2065cb9944f2d1b241146707c6935aa7b947d279" - integrity sha512-eFnGhrKmjWBlnSGNtunetE3UU2Tc/LUl92htFslSSTmpp9EKHQVcYQadCyYfnzUEFB5G/3wLWo/USQS/mEPKrA== + version "4.0.1" + resolved "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-4.0.1.tgz#9486ffc144f8d7b8f75b07939c500ac3d73617a0" + integrity sha512-6u58FWQbWP45bsxVeMJo0yk2LEsjjZsCwn0JDe/i5Edk3L+b9TR5eZ2FGaMCrLdtGYpME5AGxUqv8o+3hWKogw== dependencies: "@types/clean-css" "*" "@types/relateurl" "*" "@types/uglify-js" "*" "@types/html-webpack-plugin@^3.2.4": - version "3.2.5" - resolved "https://registry.npmjs.org/@types/html-webpack-plugin/-/html-webpack-plugin-3.2.5.tgz#58e94c0d57801903b2b77674d2b9ef6c4a65a6db" - integrity sha512-DhC7NTte+Ikw/zxp2w9qjcWtHqpShbUx7ASPUZ00trn1EOftoRtMmy8nS7F/mW8ASTA2JGMFX2bbuqqxiqs6mQ== + version "3.2.6" + resolved "https://registry.npmjs.org/@types/html-webpack-plugin/-/html-webpack-plugin-3.2.6.tgz#07951aaf0fa260dbf626f9644f1d13106d537625" + integrity sha512-U8uJSvlf9lwrKG6sKFnMhqY4qJw2QXad+PHlX9sqEXVUMilVt96aVvFde73tzsdXD+QH9JS6kEytuGO2JcYZog== dependencies: "@types/html-minifier" "*" "@types/tapable" "^1" "@types/webpack" "^4" "@types/http-cache-semantics@*": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" - integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== + version "4.0.1" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== "@types/ignore-styles@^5.0.0": version "5.0.0" @@ -1992,9 +1992,9 @@ "@types/node" "*" "@types/is-hotkey@^0.1.1", "@types/is-hotkey@^0.1.2": - version "0.1.2" - resolved "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.2.tgz#94f00793b5a297a7f7e69c1ef49613da2243a987" - integrity sha512-SUw9LpI3AIwbRNXS7FYy9AlXrTPIdBZGI7y4XxfIEYqgSW1UfFCUM9cMwHE/yCfTl0qeI0UQ/q8TdIxsIFgKPg== + version "0.1.3" + resolved "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.3.tgz#1e86be048d3af160e8e676d5cd463f6f7061589a" + integrity sha512-Hz+eHHpMWLBX1CpDXSuQre9nYXN2e2VGVHvkkldxDzo9eFtRpHm5iOlJlZvnNGvele5584cUSkRnFRQb+Wcu0w== "@types/isomorphic-fetch@^0.0.35": version "0.0.35" @@ -2021,9 +2021,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*", "@types/jest@^26.0.15": - version "26.0.23" - resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" - integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== + version "26.0.24" + resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" + integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" @@ -2038,39 +2038,34 @@ resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7": - version "7.0.7" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": + version "7.0.8" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" + integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== "@types/jsonwebtoken@*", "@types/jsonwebtoken@^8.5.0": - version "8.5.2" - resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.2.tgz#eb71c717b3b8681bb85fbd2950c9c4c5d4506748" - integrity sha512-X8BOCkp+WJVNYCYIBugREtVZa4Y09Or9HDx6xqRZem5F8jJV8FuJgNessXyMuv9+U8pjnvdezASwU28uw+1scw== + version "8.5.4" + resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz#50ccaf0aa6f5d7b9956e70fe323b76e582991913" + integrity sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg== dependencies: "@types/node" "*" "@types/keyv@*": - version "3.1.1" - resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" - integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== + version "3.1.2" + resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.2.tgz#5d97bb65526c20b6e0845f6b0d2ade4f28604ee5" + integrity sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg== dependencies: "@types/node" "*" "@types/lodash@^4.14.149": - version "4.14.170" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" - integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== + version "4.14.171" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz#f01b3a5fe3499e34b622c362a46a609fdb23573b" + integrity sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg== "@types/mdast@^3.0.0": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" - integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + version "3.0.7" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz#cba63d0cc11eb1605cea5c0ad76e02684394166b" + integrity sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg== dependencies: "@types/unist" "*" @@ -2101,29 +2096,36 @@ webpack "^5" "@types/minimist@^1.2.0", "@types/minimist@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" - integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + version "1.2.2" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/mkdirp@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz#0930b948914a78587de35458b86c907b6e98bbf6" - integrity sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q== + version "1.0.2" + resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz#8d0bad7aa793abe551860be1f7ae7f3198c16666" + integrity sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ== dependencies: "@types/node" "*" -"@types/mongodb@*", "@types/mongodb@^3.5.27", "@types/mongodb@^3.5.34": - version "3.6.18" - resolved "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.18.tgz#7524c462fc7e3b67892afda8211cd045edee65eb" - integrity sha512-JSVFt9p0rTfZ4EgzXmVHUB3ue00xe3CRbQho8nXfImzEDDM4O7I3po1bwbWl/EIbLENxUreZxqLOc8lvcnLVPA== +"@types/mongodb@*": + version "4.0.7" + resolved "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz#ebaa80c53b684ea52ccfe7721c0f5c9ef7b4f511" + integrity sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw== + dependencies: + mongodb "*" + +"@types/mongodb@^3.5.27", "@types/mongodb@^3.5.34": + version "3.6.20" + resolved "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz#b7c5c580644f6364002b649af1c06c3c0454e1d2" + integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ== dependencies: "@types/bson" "*" "@types/node" "*" "@types/mongoose-paginate-v2@^1.3.8": - version "1.3.10" - resolved "https://registry.npmjs.org/@types/mongoose-paginate-v2/-/mongoose-paginate-v2-1.3.10.tgz#fbd5987a559b8d5e2cfb9cb7164a1bcb262479d6" - integrity sha512-YKagPxOjDTV5PupJvQPzpMpNGyB0d5g3Z/+6K7j5jFQyE9zz1LLWN79dy0vi4VFNwIbCREqA4SSb6xN6HNOtdw== + version "1.3.11" + resolved "https://registry.npmjs.org/@types/mongoose-paginate-v2/-/mongoose-paginate-v2-1.3.11.tgz#2a73581a71aa45950ef59380e4331dc668b00a04" + integrity sha512-ht3pjiOB3ZFB7jYfjQAXGrMZDqNlLGxA+Z7O7uMugsa1YgncE5qoaW2WkL9IYtytklHJpn8QvahJxzJv9hgMiA== dependencies: "@types/mongoose" "5.10.5" @@ -2151,53 +2153,53 @@ mongoose "*" "@types/node-fetch@^2.5.7": - version "2.5.10" - resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" - integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== + version "2.5.12" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node-sass@^4.11.1": - version "4.11.1" - resolved "https://registry.npmjs.org/@types/node-sass/-/node-sass-4.11.1.tgz#bda27c5181cbf7c090c3058e119633dfb2b6504c" - integrity sha512-wPOmOEEtbwQiPTIgzUuRSQZ3H5YHinsxRGeZzPSDefAm4ylXWnZG9C0adses8ymyplKK0gwv3JkDNO8GGxnWfg== + version "4.11.2" + resolved "https://registry.npmjs.org/@types/node-sass/-/node-sass-4.11.2.tgz#ecdaa44a1ba8847bf7dea2aadbfe33a91a263514" + integrity sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw== dependencies: "@types/node" "*" "@types/node@*": - version "15.12.4" - resolved "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz#e1cf817d70a1e118e81922c4ff6683ce9d422e26" - integrity sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA== + version "16.4.5" + resolved "https://registry.npmjs.org/@types/node/-/node-16.4.5.tgz#eac95d4e52775190c405f0b9061ddcfb0304f7fc" + integrity sha512-+0GPv/hIFNoy8r5MFf7vRpBjnqNYNrlHdetoy23E7TYc7JB2ctwyi3GMKpviozaHQ/Sy2kBNUTvG9ywN66zV1g== "@types/node@14.x || 15.x": - version "15.14.1" - resolved "https://registry.npmjs.org/@types/node/-/node-15.14.1.tgz#4f9d3689532499fdda1c898e19f4593718655e36" - integrity sha512-wF6hazbsnwaW3GhK4jFuw5NaLDQVRQ6pWQUGAUrJzxixFkTaODSiAKMPXuHwPEPkAKQWHAzj6uJ5h+3zU9gQxg== + version "15.14.3" + resolved "https://registry.npmjs.org/@types/node/-/node-15.14.3.tgz#330763b973d0acacb7fdccc7594e1fb281ed1b1c" + integrity sha512-gliNP92vLGGha1nioYHIIT2WrZ450sxpRgyPCEyog2hMVi6LEbhY/Pkj+EDiGWrCXntZ9lrnE2+lTIlyYtaxCg== "@types/nodemailer@^6.4.0": - version "6.4.2" - resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.2.tgz#d8ee254c969e6ad83fb9a0a0df3a817406a3fa3b" - integrity sha512-yhsqg5Xbr8aWdwjFS3QjkniW5/tLpWXtOYQcJdo9qE3DolBxsKzgRCQrteaMY0hos8MklJNSEsMqDpZynGzMNg== + version "6.4.4" + resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz#c265f7e7a51df587597b3a49a023acaf0c741f4b" + integrity sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw== dependencies: "@types/node" "*" "@types/nodemon@^1.19.0": - version "1.19.0" - resolved "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.0.tgz#7ff8e53c61e7a21f9f8dc65444d5904621afc080" - integrity sha512-nf0PKjNv3wo0pyhlPkHjfpU2oUYMdOIsCXceiFG6kvhYxbTwn2ne9mz2iWvJ/4QtCrJUEPJLNXuyGleyTacdaw== + version "1.19.1" + resolved "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.1.tgz#00b2b931e240112dff30fc9cadbe3de02b5f3abc" + integrity sha512-3teAFqCFba3W9zk4dAGUZ+rW/nrQBrSGXWyK9HfJuWxmITk2z2d3u/5cy7oFqNG2fZxPwSAWkP+a8q/QC6UU5Q== dependencies: "@types/node" "*" "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/optimize-css-assets-webpack-plugin@^5.0.1": - version "5.0.3" - resolved "https://registry.npmjs.org/@types/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#9bf5bdbb57b379f59a37a6775336f42cd6701852" - integrity sha512-PJgbI4KplJfyxKWVrBbEL+rePEBqeozJRMT0mBL3ynhvngASBV/XJ+BneLuJN74RjjMzO0gA5ns80mgubQdZAA== + version "5.0.4" + resolved "https://registry.npmjs.org/@types/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#eb2c8b9d3f9f14b72639ac18a1a72998a4313083" + integrity sha512-dpRBcoyUD1uJLzyrnEl0LCwqPc/vprmOrl6fkk0dZEZe0b28rsB6t4WsbFNitFhD4oS8lRZO1+MiKzslfCTTNQ== dependencies: "@types/webpack" "^4" @@ -2214,26 +2216,26 @@ "@types/passport" "*" "@types/passport-jwt@^3.0.3": - version "3.0.5" - resolved "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.5.tgz#bb0b412130f2739bc223180634295d8d6f767df4" - integrity sha512-O6zZ4WKzQUwg3OU0MnOA2AIEQ6KfHyGdLoi4fqBLyb+kV7miGKNA2KNJRtiq45EsQ2QEDO8rKqORjXpWV7UJNg== + version "3.0.6" + resolved "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.6.tgz#41cc8b5803d5f5f06eb33e19c453b42716def4f1" + integrity sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ== dependencies: "@types/express" "*" "@types/jsonwebtoken" "*" "@types/passport-strategy" "*" "@types/passport-local-mongoose@^4.0.13": - version "4.0.14" - resolved "https://registry.npmjs.org/@types/passport-local-mongoose/-/passport-local-mongoose-4.0.14.tgz#11de85b01f6998e4ebc1bcc7500128f7e4d62a41" - integrity sha512-EvaVpWw57tyOH3eJsZi+3YWv/8lMM79zd+3Wydak5BXBBoUSQTNvGQHt+P6vYR/k0z94TuezskhwelzO7no/AA== + version "4.0.15" + resolved "https://registry.npmjs.org/@types/passport-local-mongoose/-/passport-local-mongoose-4.0.15.tgz#2bc9718f242e7cf9840d20923cc638fe823517e4" + integrity sha512-wg1ri5Tyl8c/FLzm57efHlHJVwr7RcbsqORcQBOI7XWSw6PEtt75qX0OQept3/4k0vV/GYTdeTWnTzSFyZtwEA== dependencies: "@types/mongoose" "4.*" "@types/passport-local" "*" "@types/passport-local@*", "@types/passport-local@^1.0.33": - version "1.0.33" - resolved "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.33.tgz#d245b60c5b801cb3aeca1ffab557d5fe1534260d" - integrity sha512-+rn6ZIxje0jZ2+DAiWFI8vGG7ZFKB0hXx2cUdMmudSWsigSq6ES7Emso46r4HJk0qCgrZVfI8sJiM7HIYf4SbA== + version "1.0.34" + resolved "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz#84d3b35b2fd4d36295039ded17fe5f3eaa62f4f6" + integrity sha512-PSc07UdYx+jhadySxxIYWuv6sAnY5e+gesn/5lkPKfBeGuIYn9OPR+AAEDq73VRUh6NBTpvE/iPE62rzZUslog== dependencies: "@types/express" "*" "@types/passport" "*" @@ -2248,16 +2250,16 @@ "@types/passport" "*" "@types/passport@*", "@types/passport@^1.0.4": - version "1.0.6" - resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.6.tgz#72343e49d65efa98cb328163cff5f127981947d7" - integrity sha512-9oKfrJXuAxvyxdrtMCxKkHgmd6DMO8NDOLvMJ1LvIWd6/xP+i81PAkpTaEca7VhJX9S009RciwZL/j6dsLsHrA== + version "1.0.7" + resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.7.tgz#85892f14932168158c86aecafd06b12f5439467a" + integrity sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw== dependencies: "@types/express" "*" "@types/pino-pretty@*": - version "4.7.0" - resolved "https://registry.npmjs.org/@types/pino-pretty/-/pino-pretty-4.7.0.tgz#e4a18541f8464d1cc48216f5593cc6a0e62dc2c3" - integrity sha512-fIZ+VXf9gJoJR4tiiM7G+j/bZkPoZEfFGzA4d8tAWCTpTVyvVaBwnmdLs3wEXYpMjw8eXulrOzNCjmGHT3FgHw== + version "4.7.1" + resolved "https://registry.npmjs.org/@types/pino-pretty/-/pino-pretty-4.7.1.tgz#2ce3f56f3cf4f9632374419d616ae2e6c933b935" + integrity sha512-l1ntNXdpVWsnPYUk5HyO5Lxfr38zLCgxVfEn/9Zhhm+nGF04/BiIou/m8XPwvoVZLV+livUo79VdHXMJPfUYxA== dependencies: "@types/pino" "*" @@ -2269,14 +2271,14 @@ "@types/node" "*" "@types/pino@*", "@types/pino@^6.3.4": - version "6.3.8" - resolved "https://registry.npmjs.org/@types/pino/-/pino-6.3.8.tgz#ec589318c2798216a0f39882845c5e40b7151b56" - integrity sha512-E47CmRy1FNMaCN8r0d8ECQOjXen9O0p6GGsUjLfmawlxRKosZ82WP1oWVKj+ikTkMDHxWzN5BuKmplo44ynrIg== + version "6.3.11" + resolved "https://registry.npmjs.org/@types/pino/-/pino-6.3.11.tgz#83652799e76b3ad692aaf68f6fbf994e83af5db2" + integrity sha512-S7+fLONqSpHeW9d7TApUqO6VN47KYgOXhCNKwGBVLHObq8HhaAYlVqUNdfnvoXjCMiwE5xcPm/5R2ZUh8bgaXQ== dependencies: "@types/node" "*" "@types/pino-pretty" "*" "@types/pino-std-serializers" "*" - "@types/sonic-boom" "*" + sonic-boom "^2.1.0" "@types/pluralize@^0.0.29": version "0.0.29" @@ -2284,24 +2286,24 @@ integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA== "@types/prettier@^2.0.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz#2e8332cc7363f887d32ec5496b207d26ba8052bb" - integrity sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw== + version "2.3.2" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" + integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== "@types/prismjs@^1.16.2": - version "1.16.5" - resolved "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.16.5.tgz#378f491ff02304ce50924b05283111d4a286ecba" - integrity sha512-nSU7U6FQDJJCraFNwaHmH5YDsd/VA9rTnJ7B7AGFdn+m+VSt3FjLWN7+AbqxZ67dbFazqtrDFUto3HK4ljrHIg== + version "1.16.6" + resolved "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.16.6.tgz#377054f72f671b36dbe78c517ce2b279d83ecc40" + integrity sha512-dTvnamRITNqNkqhlBd235kZl3KfVJQQoT5jkXeiWSBK7i4/TLKBNLV0S1wOt8gy4E2TY722KLtdmv2xc6+Wevg== "@types/prop-types@*", "@types/prop-types@^15.7.3": - version "15.7.3" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + version "15.7.4" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== "@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + version "1.5.5" + resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/qs-middleware@^1.0.1": version "1.0.1" @@ -2312,19 +2314,19 @@ "@types/qs" "*" "@types/qs@*", "@types/qs@^6.9.5": - version "6.9.6" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" - integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": - version "1.2.3" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-beautiful-dnd@^13.0.0": - version "13.0.0" - resolved "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#e60d3d965312fcf1516894af92dc3e9249587db4" - integrity sha512-by80tJ8aTTDXT256Gl+RfLRtFjYbUWOnZuEigJgNsJrSEGxvFe5eY6k3g4VIvf0M/6+xoLgfYWoWonlOo6Wqdg== + version "13.1.1" + resolved "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#fb3fe24a334cc757d290e75722e4d3c8368ce3a3" + integrity sha512-1lBBxVSutE8CQM37Jq7KvJwuA94qaEEqsx+G0dnwzG6Sfwf6JGcNeFk5jjjhJli1q2naeMZm+D/dvT/zyX4QPw== dependencies: "@types/react" "*" @@ -2338,23 +2340,23 @@ popper.js "^1.14.1" "@types/react-dom@*", "@types/react-dom@^17.0.0": - version "17.0.8" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.8.tgz#3180de6d79bf53762001ad854e3ce49f36dd71fc" - integrity sha512-0ohAiJAx1DAUEcY9UopnfwCE9sSMDGnY/oXjWMax6g3RpzmTt2GMyMVAXcbn0mo8XAff0SbQJl2/SBU+hjSZ1A== + version "17.0.9" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== dependencies: "@types/react" "*" "@types/react-helmet@^6.1.0": - version "6.1.1" - resolved "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.1.tgz#4fde22cbcaa1b461642e1d719cc6162d95acb110" - integrity sha512-VmSCMz6jp/06DABoY60vQa++h1YFt0PfAI23llxBJHbowqFgLUL0dhS1AQeVPNqYfRp9LAfokrfWACTNeobOrg== + version "6.1.2" + resolved "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.2.tgz#e9d7d16b29e4ec5716711c52c35c3cec45819eac" + integrity sha512-dcfAZNlWb5JYFbO9CGfrPWLJAyFcT6UeR3u35eBbv8liY2Rg4K7fM1G5+HnwVgot+C+kVwXAZ8pLEn2jsMfTDg== dependencies: "@types/react" "*" "@types/react-redux@^7.1.16": - version "7.1.16" - resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21" - integrity sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw== + version "7.1.18" + resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.18.tgz#2bf8fd56ebaae679a90ebffe48ff73717c438e04" + integrity sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -2362,18 +2364,18 @@ redux "^4.0.0" "@types/react-router-dom@^5.1.6": - version "5.1.7" - resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz#a126d9ea76079ffbbdb0d9225073eb5797ab7271" - integrity sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg== + version "5.1.8" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.8.tgz#bf3e1c8149b3d62eaa206d58599de82df0241192" + integrity sha512-03xHyncBzG0PmDmf8pf3rehtjY0NpUj7TIN46FrT5n1ZWHPZvXz32gUyNboJ+xsL8cpg8bQVLcllptcQHvocrw== dependencies: "@types/history" "*" "@types/react" "*" "@types/react-router" "*" "@types/react-router@*": - version "5.1.15" - resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.15.tgz#c1069e0da4617fd315e381b56b18b89490e14e2a" - integrity sha512-z3UlMG/x91SFEVmmvykk9FLTliDvfdIUky4k2rCfXWQ0NKbrP8o9BTCaCTPuYsB8gDkUnUmkcA2vYlm2DR+HAA== + version "5.1.16" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.16.tgz#f3ba045fb96634e38b21531c482f9aeb37608a99" + integrity sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg== dependencies: "@types/history" "*" "@types/react" "*" @@ -2388,25 +2390,25 @@ "@types/react-transition-group" "*" "@types/react-transition-group@*": - version "4.4.1" - resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz#e1a3cb278df7f47f17b5082b1b3da17170bd44b1" - integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ== + version "4.4.2" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz#38890fd9db68bf1f2252b99a942998dc7877c5b3" + integrity sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^17.0.0": - version "17.0.11" - resolved "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz#67fcd0ddbf5a0b083a0f94e926c7d63f3b836451" - integrity sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA== + version "17.0.15" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.15.tgz#c7533dc38025677e312606502df7656a6ea626d0" + integrity sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/relateurl@*": - version "0.2.28" - resolved "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6" - integrity sha1-a9p9uGU/piZD9e5p6facEaOS46Y= + version "0.2.29" + resolved "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.29.tgz#68ccecec3d4ffdafb9c577fe764f912afc050fe6" + integrity sha512-QSvevZ+IRww2ldtfv1QskYsqVVVwCKQf1XbwtcyyoRvLIQzfyPhj/C+3+PKzSDRdiyejaiLgnq//XTkleorpLg== "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" @@ -2416,21 +2418,21 @@ "@types/node" "*" "@types/sass@^1.16.0": - version "1.16.0" - resolved "https://registry.npmjs.org/@types/sass/-/sass-1.16.0.tgz#b41ac1c17fa68ffb57d43e2360486ef526b3d57d" - integrity sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA== + version "1.16.1" + resolved "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz#cf465bd1fea486d0331f760db023de14daf4980d" + integrity sha512-iZUcRrGuz/Tbg3loODpW7vrQJkUtpY2fFSf4ELqqkApcS2TkZ1msk7ie8iZPB86lDOP8QOTTmuvWjc5S0R9OjQ== dependencies: "@types/node" "*" "@types/scheduler@*": - version "0.16.1" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" - integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/serve-static@*": - version "1.13.9" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e" - integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA== + version "1.13.10" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== dependencies: "@types/mime" "^1" "@types/node" "*" @@ -2442,22 +2444,15 @@ dependencies: "@types/node" "*" -"@types/sonic-boom@*": - version "0.7.0" - resolved "https://registry.npmjs.org/@types/sonic-boom/-/sonic-boom-0.7.0.tgz#38337036293992a1df65dd3161abddf8fb9b7176" - integrity sha512-AfqR0fZMoUXUNwusgXKxcE9DPlHNDHQp6nKYUd4PSRpLobF5CCevSpyTEBcVZreqaWKCnGBr9KI1fHMTttoB7A== - dependencies: - "@types/node" "*" - "@types/source-list-map@*": version "0.1.2" resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== "@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/tapable@*": version "2.2.2" @@ -2467,22 +2462,22 @@ tapable "^2.2.0" "@types/tapable@^1": - version "1.0.7" - resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" - integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ== + version "1.0.8" + resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/terser-webpack-plugin@^5.0.2": - version "5.0.3" - resolved "https://registry.npmjs.org/@types/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz#9194c24dee3a9d5dcfd67b58edffc1d66653d16b" - integrity sha512-Ef60BOY9hV+yXjkMCuJI17cu1R8/H31n5Rnt1cElJFyBSkbRV3UWyBIYn8YpijsOG05R4bZf3G2azyBHkksu/A== + version "5.0.4" + resolved "https://registry.npmjs.org/@types/terser-webpack-plugin/-/terser-webpack-plugin-5.0.4.tgz#852949e1d124e6c895cfa8cb17eb6265e4fdfe59" + integrity sha512-1iyfZpMNNA/h/Q8uBpwuVhxKfKQHc98PD9NaCTrg22nj6d8aUvT79KBMtRLmR43v1PtCB0r1/gWGdNXrrMEK7A== dependencies: terser "^5.3.8" webpack "^5.1.0" "@types/testing-library__jest-dom@^5.9.1", "@types/testing-library__jest-dom@^5.9.5": - version "5.14.0" - resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz#98eb7537cb5502bcca7a0d82acf5f245a2e6c322" - integrity sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A== + version "5.14.1" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.1.tgz#014162a5cee6571819d48e999980694e2f657c3c" + integrity sha512-Gk9vaXfbzc5zCXI9eYE9BI5BNHEp4D3FWjgqBE/ePGYElLAP+KvxBcsdkwfIVvezs605oiyd/VrpiHe3Oeg+Aw== dependencies: "@types/jest" "*" @@ -2492,26 +2487,26 @@ integrity sha512-7cTXwKP/HLOPVgjg+YhBdQ7bMiobGMuoBmrGmqwIWJv8elC6t1DfVc/mn4fD9UE1IjhwmhaQ5pGVXkmXbH0rhg== "@types/uglify-js@*": - version "3.13.0" - resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124" - integrity sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q== + version "3.13.1" + resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== dependencies: source-map "^0.6.1" "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + version "2.0.6" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== "@types/uuid@^8.3.0": - version "8.3.0" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" - integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== + version "8.3.1" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz#1a32969cf8f0364b3d8c8af9cc3555b7805df14f" + integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== "@types/webpack-bundle-analyzer@^4.4.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.0.tgz#cd7cc5c24e17044023bc6d26dd060287fcf370f4" - integrity sha512-8evCbPtT2jOUhVGgVDSzk3Y2g4oaxIkakqTj66vRrYjbOoIGmKJSnS4COObwffByiOEYxW7U8ymq9ae9qlH62Q== + version "4.4.1" + resolved "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.1.tgz#bcc2501be10c8cdd1d170bc6b7847b3321f20440" + integrity sha512-yQAj3l7bIYL+QRRlNJt6gyP+zrXZOlgaR4wsX0WY4yzZIbv41ZibREfZvuYjxY0iVtvQQlbhx0AeokkCuqUAQg== dependencies: "@types/node" "*" tapable "^2.2.0" @@ -2526,9 +2521,9 @@ "@types/webpack" "*" "@types/webpack-env@^1.15.3": - version "1.16.0" - resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.0.tgz#8c0a9435dfa7b3b1be76562f3070efb3f92637b4" - integrity sha512-Fx+NpfOO0CpeYX2g9bkvX8O5qh9wrU1sOF4g8sft4Mu7z+qfe387YlyY8w8daDyDsKY5vUxM0yxkAYnbkRbZEw== + version "1.16.2" + resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.2.tgz#8db514b059c1b2ae14ce9d7bb325296de6a9a0fa" + integrity sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw== "@types/webpack-hot-middleware@2.25.3": version "2.25.3" @@ -2539,9 +2534,9 @@ "@types/webpack" "*" "@types/webpack-sources@*": - version "2.1.0" - resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz#8882b0bd62d1e0ce62f183d0d01b72e6e82e8c10" - integrity sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg== + version "2.1.1" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.1.tgz#6af17e3a3ded71eec2b98008d7c12f498a0a4506" + integrity sha512-MjM1R6iuw8XaVbtkCBz0N349cyqBjJHCbQiOeppe3VBeFvxqs74RKHAVt9LkxTnUWc7YLZOEsUfPUnmK6SBPKQ== dependencies: "@types/node" "*" "@types/source-list-map" "*" @@ -2569,9 +2564,9 @@ source-map "^0.6.0" "@types/webpack@^4": - version "4.41.29" - resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz#2e66c1de8223c440366469415c50a47d97625773" - integrity sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q== + version "4.41.30" + resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz#fd3db6d0d41e145a8eeeafcd3c4a7ccde9068ddc" + integrity sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -2581,40 +2576,39 @@ source-map "^0.6.0" "@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + version "20.2.1" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + version "15.0.14" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^4.8.1": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz#0b7fc974e8bc9b2b5eb98ed51427b0be529b4ad0" - integrity sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ== + version "4.28.5" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.5.tgz#8197f1473e7da8218c6a37ff308d695707835684" + integrity sha512-m31cPEnbuCqXtEZQJOXAHsHvtoDi9OVaeL5wZnO2KZTnkvELk+u6J6jHg+NzvWQxk+87Zjbc4lJS4NHmgImz6Q== dependencies: - "@typescript-eslint/experimental-utils" "4.27.0" - "@typescript-eslint/scope-manager" "4.27.0" + "@typescript-eslint/experimental-utils" "4.28.5" + "@typescript-eslint/scope-manager" "4.28.5" debug "^4.3.1" functional-red-black-tree "^1.0.1" - lodash "^4.17.21" regexpp "^3.1.0" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz#78192a616472d199f084eab8f10f962c0757cd1c" - integrity sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ== +"@typescript-eslint/experimental-utils@4.28.5": + version "4.28.5" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.5.tgz#66c28bef115b417cf9d80812a713e0e46bb42a64" + integrity sha512-bGPLCOJAa+j49hsynTaAtQIWg6uZd8VLiPcyDe4QPULsvQwLHGLSGKKcBN8/lBxIX14F74UEMK2zNDI8r0okwA== dependencies: "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.27.0" - "@typescript-eslint/types" "4.27.0" - "@typescript-eslint/typescript-estree" "4.27.0" + "@typescript-eslint/scope-manager" "4.28.5" + "@typescript-eslint/types" "4.28.5" + "@typescript-eslint/typescript-estree" "4.28.5" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -2646,23 +2640,23 @@ "@typescript-eslint/types" "4.0.1" "@typescript-eslint/visitor-keys" "4.0.1" -"@typescript-eslint/scope-manager@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz#b0b1de2b35aaf7f532e89c8e81d0fa298cae327d" - integrity sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw== +"@typescript-eslint/scope-manager@4.28.5": + version "4.28.5" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.5.tgz#3a1b70c50c1535ac33322786ea99ebe403d3b923" + integrity sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ== dependencies: - "@typescript-eslint/types" "4.27.0" - "@typescript-eslint/visitor-keys" "4.27.0" + "@typescript-eslint/types" "4.28.5" + "@typescript-eslint/visitor-keys" "4.28.5" "@typescript-eslint/types@4.0.1": version "4.0.1" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.0.1.tgz#1cf72582f764931f085cb8230ff215980fe467b2" integrity sha512-S+gD3fgbkZYW2rnbjugNMqibm9HpEjqZBZkTiI3PwbbNGWmAcxolWIUwZ0SKeG4Dy2ktpKKaI/6+HGYVH8Qrlg== -"@typescript-eslint/types@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz#712b408519ed699baff69086bc59cd2fc13df8d8" - integrity sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA== +"@typescript-eslint/types@4.28.5": + version "4.28.5" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.5.tgz#d33edf8e429f0c0930a7c3d44e9b010354c422e9" + integrity sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA== "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" @@ -2691,13 +2685,13 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz#189a7b9f1d0717d5cccdcc17247692dedf7a09da" - integrity sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g== +"@typescript-eslint/typescript-estree@4.28.5": + version "4.28.5" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.5.tgz#4906d343de693cf3d8dcc301383ed638e0441cd1" + integrity sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw== dependencies: - "@typescript-eslint/types" "4.27.0" - "@typescript-eslint/visitor-keys" "4.27.0" + "@typescript-eslint/types" "4.28.5" + "@typescript-eslint/visitor-keys" "4.28.5" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" @@ -2712,12 +2706,12 @@ "@typescript-eslint/types" "4.0.1" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz#f56138b993ec822793e7ebcfac6ffdce0a60cb81" - integrity sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg== +"@typescript-eslint/visitor-keys@4.28.5": + version "4.28.5" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.5.tgz#ffee2c602762ed6893405ee7c1144d9cc0a29675" + integrity sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg== dependencies: - "@typescript-eslint/types" "4.27.0" + "@typescript-eslint/types" "4.28.5" eslint-visitor-keys "^2.0.0" "@udecode/slate-plugins-core@^0.71.11": @@ -2785,125 +2779,125 @@ prop-types "^15.7.2" tslib "^1.10.0" -"@webassemblyjs/ast@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" - integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg== +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== dependencies: - "@webassemblyjs/helper-numbers" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" -"@webassemblyjs/floating-point-hex-parser@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c" - integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA== +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== -"@webassemblyjs/helper-api-error@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4" - integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w== +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== -"@webassemblyjs/helper-buffer@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642" - integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA== +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== -"@webassemblyjs/helper-numbers@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9" - integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ== +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.0" - "@webassemblyjs/helper-api-error" "1.11.0" + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1" - integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA== +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== -"@webassemblyjs/helper-wasm-section@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b" - integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew== +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" -"@webassemblyjs/ieee754@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf" - integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA== +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b" - integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g== +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf" - integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw== +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== -"@webassemblyjs/wasm-edit@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78" - integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ== +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/helper-wasm-section" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - "@webassemblyjs/wasm-opt" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - "@webassemblyjs/wast-printer" "1.11.0" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" -"@webassemblyjs/wasm-gen@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe" - integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ== +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/ieee754" "1.11.0" - "@webassemblyjs/leb128" "1.11.0" - "@webassemblyjs/utf8" "1.11.0" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" -"@webassemblyjs/wasm-opt@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978" - integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg== +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" -"@webassemblyjs/wasm-parser@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754" - integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw== +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-api-error" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/ieee754" "1.11.0" - "@webassemblyjs/leb128" "1.11.0" - "@webassemblyjs/utf8" "1.11.0" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" -"@webassemblyjs/wast-printer@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e" - integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ== +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== dependencies: - "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.4": @@ -2973,9 +2967,9 @@ acorn-globals@^6.0.0: acorn-walk "^7.1.1" acorn-jsx@^5.2.0: - version "5.3.1" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" @@ -2983,19 +2977,19 @@ acorn-walk@^7.1.1: integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.0.0: - version "8.1.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.0.tgz#d3c6a9faf00987a5e2b9bdb506c2aa76cd707f83" - integrity sha512-mjmzmv12YIG/G8JQdQuz2MUDShEJ6teYpT5bmWA4q7iwoGen8xtt3twF3OvzIUl+Q06aWIjvnwQUKvQ6TtMRjg== + version "8.1.1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc" + integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w== acorn@^7.1.1: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.2.1, acorn@^8.2.4: - version "8.4.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz#af53266e698d7cffa416714b503066a82221be60" - integrity sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w== +acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1: + version "8.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== add-stream@^1.0.0: version "1.0.0" @@ -3169,11 +3163,6 @@ arr-union@^3.1.0: resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3346,9 +3335,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.0.2: - version "4.2.2" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.2.2.tgz#0c987d82c8b82b4b9b7a945f1b5ef0d8fed586ed" - integrity sha512-OKRkKM4ojMEZRJ5UNJHmq9tht7cEnRnqKG6KyB/trYws00Xtkv12mHtlJ0SK7cmuNbrU8dPUova3ELTuilfBbw== + version "4.3.2" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.3.2.tgz#fcf8777b82c62cfc69c7e9f32c0d2226287680e7" + integrity sha512-5LMaDRWm8ZFPAEdzTYmgjjEdj1YnQcpfrVajO/sn/LhbpGp0Y0H64c2hLZI1gRMxfA+w1S71Uc/nHaOXgcCvGg== axobject-query@^2.2.0: version "2.2.0" @@ -3699,6 +3688,13 @@ bson@^1.1.4: resolved "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a" integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== +bson@^4.4.0: + version "4.4.1" + resolved "https://registry.npmjs.org/bson/-/bson-4.4.1.tgz#682c3cb8b90b222414ce14ef8398154ba2cc21bc" + integrity sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg== + dependencies: + buffer "^5.6.0" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -3714,7 +3710,7 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer@^5.5.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3848,14 +3844,6 @@ camel-case@^4.1.1: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -3870,11 +3858,6 @@ camelcase@5.0.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3896,9 +3879,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: - version "1.0.30001239" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz#66e8669985bb2cb84ccb10f68c25ce6dd3e4d2b8" - integrity sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ== + version "1.0.30001248" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz#26ab45e340f155ea5da2920dadb76a533cb8ebce" + integrity sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw== capture-exit@^2.0.0: version "2.0.0" @@ -4067,15 +4050,6 @@ cli-width@^3.0.0: resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -clipboard@^2.0.0: - version "2.0.8" - resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" - integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -4161,7 +4135,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -4185,21 +4159,21 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.4: - version "1.5.5" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" color@^3.0.0, color@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" + color-convert "^1.9.3" + color-string "^1.6.0" colorette@^1.2.1, colorette@^1.2.2: version "1.2.2" @@ -4362,15 +4336,15 @@ conventional-changelog-conventionalcommits@^4.5.0: q "^1.5.1" conventional-changelog-core@^4.2.1: - version "4.2.2" - resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz#f0897df6d53b5d63dec36b9442bd45354f8b3ce5" - integrity sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg== + version "4.2.3" + resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.3.tgz#ce44d4bbba4032e3dc14c00fcd5b53fc00b66433" + integrity sha512-MwnZjIoMRL3jtPH5GywVNqetGILC7g6RQFvdb8LRU/fA/338JbeWAku3PZ8yQ+mtVRViiISqJlb0sOz0htBZig== dependencies: add-stream "^1.0.0" - conventional-changelog-writer "^4.0.18" + conventional-changelog-writer "^5.0.0" conventional-commits-parser "^3.2.0" dateformat "^3.0.0" - get-pkg-repo "^1.0.0" + get-pkg-repo "^4.0.0" git-raw-commits "^2.0.8" git-remote-origin-url "^2.0.0" git-semver-tags "^4.1.1" @@ -4379,7 +4353,6 @@ conventional-changelog-core@^4.2.1: q "^1.5.1" read-pkg "^3.0.0" read-pkg-up "^3.0.0" - shelljs "^0.8.3" through2 "^4.0.0" conventional-changelog-ember@^2.0.9: @@ -4423,12 +4396,11 @@ conventional-changelog-preset-loader@^2.3.4: resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== -conventional-changelog-writer@^4.0.18: - version "4.1.0" - resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz#1ca7880b75aa28695ad33312a1f2366f4b12659f" - integrity sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw== +conventional-changelog-writer@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.0.tgz#c4042f3f1542f2f41d7d2e0d6cad23aba8df8eec" + integrity sha512-HnDh9QHLNWfL6E1uHz6krZEQOgm8hN7z/m7tT16xwd802fwgMN0Wqd7AQYVkhpsjDUx/99oo+nGgvKF657XP5g== dependencies: - compare-func "^2.0.0" conventional-commits-filter "^2.0.7" dateformat "^3.0.0" handlebars "^4.7.6" @@ -4533,23 +4505,23 @@ copyfiles@^2.4.0: untildify "^4.0.0" yargs "^16.1.0" -core-js-compat@^3.14.0: - version "3.15.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.0.tgz#e14a371123db9d1c5b41206d3f420643d238b8fa" - integrity sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw== +core-js-compat@^3.14.0, core-js-compat@^3.15.0: + version "3.15.2" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" + integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== dependencies: browserslist "^4.16.6" semver "7.0.0" -core-js-pure@^3.14.0: - version "3.15.0" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.0.tgz#c19349ae0be197b8bcf304acf4d91c5e29ae2091" - integrity sha512-RO+LFAso8DB6OeBX9BAcEGvyth36QtxYon1OyVsITNVtSKr/Hos0BXZwnsOJ7o+O6KHtK+O+cJIEj9NGg6VwFA== +core-js-pure@^3.15.0: + version "3.15.2" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce" + integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA== -core-js@^3.14.0: - version "3.15.0" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.15.0.tgz#db9554ebce0b6fd90dc9b1f2465c841d2d055044" - integrity sha512-GUbtPllXMYRzIgHNZ4dTYTcUemls2cni83Q4Q/TrFONHfhcg9oEGOtaGHfb0cpzec60P96UKPvMkjX1jET8rUw== +core-js@^3.15.0: + version "3.15.2" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" + integrity sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -4671,9 +4643,9 @@ css-in-js-utils@^2.0.0: isobject "^3.0.1" css-loader@^5.0.1: - version "5.2.6" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz#c3c82ab77fea1f360e587d871a6811f4450cc8d1" - integrity sha512-0wyN5vXMQZu6BvjbrPdUJvkCzGEO24HC7IS7nW4llc6BBFC+zwR9CKtYGv63Puzsg10L/o12inMY5/2ByzfD6w== + version "5.2.7" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== dependencies: icss-utils "^5.1.0" loader-utils "^2.0.0" @@ -4896,13 +4868,6 @@ csstype@^3.0.2, csstype@^3.0.6: resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - damerau-levenshtein@^1.0.6: version "1.0.7" resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" @@ -4930,9 +4895,9 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.0.1, date-fns@^2.14.0: - version "2.22.1" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz#1e5af959831ebb1d82992bf67b765052d8f0efc4" - integrity sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg== + version "2.23.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" + integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== dateformat@^3.0.0: version "3.0.3" @@ -4958,10 +4923,10 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@4.3.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@4, debug@4.3.2, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" @@ -4972,13 +4937,6 @@ debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.2.0, debug@^4.3.2: - version "4.3.2" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -4987,15 +4945,15 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + version "10.3.1" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decode-uri-component@^0.2.0: version "0.2.0" @@ -5101,17 +5059,12 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - delegates@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -denque@^1.4.1: +denque@^1.4.1, denque@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== @@ -5333,9 +5286,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.723: - version "1.3.752" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz#0728587f1b9b970ec9ffad932496429aef750d09" - integrity sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A== + version "1.3.789" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.789.tgz#c3ea060ba1e36e41c87943a47ed2daadc545be2b" + integrity sha512-lK4xn6C6ZF1kgLaC/EhOtC1MSKENExj3rMwGVnBTfHW81Z/Hb1Rge5YaWawN/YOXy3xCaESuE4KWSD50kOZ9rQ== emittery@^0.7.1: version "0.7.2" @@ -5397,7 +5350,7 @@ envinfo@^7.7.3: resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -5433,10 +5386,10 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es- string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" -es-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.6.0.tgz#e72ab05b7412e62b9be37c37a09bdb6000d706f0" - integrity sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA== +es-module-lexer@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d" + integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== es-to-primitive@^1.2.1: version "1.2.1" @@ -5823,9 +5776,9 @@ express-graphql@*, express-graphql@0.12.0: raw-body "^2.4.1" express-rate-limit@^5.1.3: - version "5.2.6" - resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.2.6.tgz#b454e1be8a252081bda58460e0a25bf43ee0f7b0" - integrity sha512-nE96xaxGfxiS5jP3tD3kIW1Jg9yQgX0rXCs3rCkZtmbWHEGyotwaezkLj7bnB41Z0uaOLM8W4AX6qHao4IZ2YA== + version "5.3.0" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.3.0.tgz#e7b9d3c2e09ece6e0406a869b2ce00d03fe48aea" + integrity sha512-qJhfEgCnmteSeZAeuOKQ2WEIFTX5ajrzE0xS6gCOBCoRQcU+xEzQmgYQQTpzCcqUAAzTEtu4YEih4pnLfvNtew== express@^4.17.1: version "4.17.1" @@ -5932,16 +5885,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.1.1: - version "3.2.5" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + version "3.2.7" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -5958,10 +5910,10 @@ fast-redact@^3.0.0: resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.1.tgz#d6015b971e933d03529b01333ba7f22c29961e92" integrity sha512-kYpn4Y/valC9MdrISg47tZOpYBNoTXKgT9GYXFpHN/jYFs+lFkPoisY+LcBODdKVMY96ATzvzsWv+ES/4Kmufw== -fast-safe-stringify@^2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== +fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f" + integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag== fast-shallow-equal@^1.0.0: version "1.0.0" @@ -5979,9 +5931,9 @@ fastest-stable-stringify@^2.0.2: integrity sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q== fastq@^1.6.0: - version "1.11.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" - integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + version "1.11.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" + integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== dependencies: reusify "^1.0.4" @@ -6087,14 +6039,6 @@ find-up@*, find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -6304,15 +6248,14 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-pkg-repo@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" - integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= +get-pkg-repo@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.1.2.tgz#c4ffd60015cf091be666a0212753fc158f01a4c0" + integrity sha512-/FjamZL9cBYllEbReZkxF2IMh80d8TJoC4e3bmLNif8ibHw95aj0N/tzqK0kZz9eU/3w3dL6lF4fnnX/sDdW3A== dependencies: - hosted-git-info "^2.1.4" - meow "^3.3.0" - normalize-package-data "^2.3.0" - parse-github-repo-url "^1.3.0" + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" + meow "^7.0.0" through2 "^2.0.0" get-port@^5.1.1: @@ -6384,17 +6327,17 @@ git-semver-tags@^4.1.1: semver "^6.0.0" git-up@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" - integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== + version "4.0.5" + resolved "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" + integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== dependencies: is-ssh "^1.3.0" - parse-url "^5.0.0" + parse-url "^6.0.0" -git-url-parse@11.4.4: - version "11.4.4" - resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.4.tgz#5d747debc2469c17bc385719f7d0427802d83d77" - integrity sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw== +git-url-parse@11.5.0: + version "11.5.0" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.5.0.tgz#acaaf65239cb1536185b19165a24bbc754b3f764" + integrity sha512-TZYSMDeM37r71Lqg1mbnMlOqlHd7BSij9qN7XwTkRqSAYFMihGLGhfHwgqQob3GUhEneKnV4nskN9rbQw2KGxA== dependencies: git-up "^4.0.0" @@ -6410,7 +6353,7 @@ github-from-package@0.0.0: resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -6481,13 +6424,6 @@ globule@^1.0.0: lodash "~4.17.10" minimatch "~3.0.2" -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" - got@11.8.2: version "11.8.2" resolved "https://registry.npmjs.org/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" @@ -6549,9 +6485,9 @@ graphql-query-complexity@^0.7.0: lodash.get "^4.4.2" graphql-request@^3.4.0: - version "3.4.0" - resolved "https://registry.npmjs.org/graphql-request/-/graphql-request-3.4.0.tgz#3a400cd5511eb3c064b1873afb059196bbea9c2b" - integrity sha512-acrTzidSlwAj8wBNO7Q/UQHS8T+z5qRGquCQRv9J1InwR01BBWV9ObnoE+JS5nCCEj8wSGS0yrDXVDoRiKZuOg== + version "3.5.0" + resolved "https://registry.npmjs.org/graphql-request/-/graphql-request-3.5.0.tgz#7e69574e15875fb3f660a4b4be3996ecd0bbc8b7" + integrity sha512-Io89QpfU4rqiMbqM/KwMBzKaDLOppi8FU8sEccCE4JqCgz95W9Q8bvxQ4NfPALLSMvg9nafgg8AkYRmgKSlukA== dependencies: cross-fetch "^3.0.6" extract-files "^9.0.0" @@ -6737,7 +6673,7 @@ hosted-git-info@^2.1.4: resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.1: +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== @@ -6785,14 +6721,14 @@ html-minifier-terser@^5.0.1: terser "^4.6.3" html-webpack-plugin@^5.0.0-alpha.14: - version "5.3.1" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.1.tgz#8797327548e3de438e3494e0c6d06f181a7f20d1" - integrity sha512-rZsVvPXUYFyME0cuGkyOHfx9hmkFa4pWfxY/mdY38PsBEaVNsRoA+Id+8z6DBDgyv3zaw6XQszdF8HLwfQvcdQ== + version "5.3.2" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz#7b04bf80b1f6fe84a6d3f66c8b79d64739321b08" + integrity sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ== dependencies: "@types/html-minifier-terser" "^5.0.0" html-minifier-terser "^5.0.1" - lodash "^4.17.20" - pretty-error "^2.1.1" + lodash "^4.17.21" + pretty-error "^3.0.4" tapable "^2.0.0" htmlparser2@^6.1.0: @@ -6987,13 +6923,6 @@ imurmurhash@^0.1.4: resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -7049,10 +6978,10 @@ inline-style-prefixer@^6.0.0: dependencies: css-in-js-utils "^2.0.0" -inquirer@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.1.1.tgz#7c53d94c6d03011c7bb2a947f0dca3b98246c26a" - integrity sha512-hUDjc3vBkh/uk1gPfMAD/7Z188Q8cvTGl0nxwaCdwSbzFh6ZKkZh+s2ozVxbE5G9ZNRyeY0+lgbAIOUFsFf98w== +inquirer@8.1.2: + version "8.1.2" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d" + integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -7064,7 +6993,7 @@ inquirer@8.1.1: mute-stream "0.0.8" ora "^5.3.0" run-async "^2.4.0" - rxjs "^6.6.6" + rxjs "^7.2.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" @@ -7229,9 +7158,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.2.0, is-core-module@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + version "2.5.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" + integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== dependencies: has "^1.0.3" @@ -7304,11 +7233,6 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -7487,9 +7411,9 @@ is-stream@^1.1.0: integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.6: version "1.0.6" @@ -7531,11 +7455,6 @@ is-unicode-supported@^0.1.0: resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -7999,9 +7918,9 @@ jest-worker@^26.3.0, jest-worker@^26.6.2: supports-color "^7.0.0" jest-worker@^27.0.2: - version "27.0.2" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz#4ebeb56cef48b3e7514552f80d0d80c0129f0b05" - integrity sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg== + version "27.0.6" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz#a5fdb1e14ad34eb228cfe162d9f729cdbfa28aed" + integrity sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA== dependencies: "@types/node" "*" merge-stream "^2.0.0" @@ -8022,9 +7941,9 @@ jmespath@^0.15.0: integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= joi@^17.3.0: - version "17.4.0" - resolved "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" - integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg== + version "17.4.1" + resolved "https://registry.npmjs.org/joi/-/joi-17.4.1.tgz#15d2f23c8cbe4d1baded2dd190c58f8dbe11cca0" + integrity sha512-gDPOwQ5sr+BUxXuPDGrC1pSNcVR/yGGcTI0aCnjYxZEa3za60K/iCQ+OFIkEHWZGVCUcUlXlFKvMmrlmxrG6UQ== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -8155,7 +8074,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: +json5@^2.1.2, json5@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== @@ -8326,17 +8245,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -8480,14 +8388,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -8556,7 +8456,7 @@ map-cache@^0.2.2: resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= @@ -8634,21 +8534,22 @@ memory-pager@^1.0.2: resolved "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== -meow@^3.3.0, meow@^3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= +meow@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" meow@^8.0.0: version "8.1.2" @@ -8667,6 +8568,24 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8729,7 +8648,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== @@ -8737,18 +8656,30 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.48.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.48.0: version "1.48.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-types@2.1.31, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@~2.1.19, mime-types@~2.1.24: +mime-db@1.49.0, "mime-db@>= 1.43.0 < 2": + version "1.49.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== + +mime-types@2.1.31: version "2.1.31" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== dependencies: mime-db "1.48.0" +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.32" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + dependencies: + mime-db "1.49.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -8822,7 +8753,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -8893,10 +8824,17 @@ modify-values@^1.0.0: resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -mongodb-memory-server-core@7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-7.2.0.tgz#c7c403b729b861df3b4989224bb9cbbbcec5e618" - integrity sha512-GCdCaVIVipxHW5PrhhVXZIVgfa4Rht+95RwRdSFXp9MwZaGqAU+aUlcRJkE02RSdITvI6dHmXG3X+Uz7yB1ChA== +mongodb-connection-string-url@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-1.0.1.tgz#1509b44570851f5331f9ca7052b723789d63f8dc" + integrity sha512-sXi8w9nwbMrErWbOK+8nofHz531rboasDbYAMS+sQ+W+2YnHN980RlMr+t5SDL6uKEU/kw/wG6jcjCTLiJltoA== + dependencies: + whatwg-url "^8.4.0" + +mongodb-memory-server-core@7.3.4: + version "7.3.4" + resolved "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-7.3.4.tgz#10dae40e21162406a3a643b82c1a348dcd943299" + integrity sha512-bryHNy34LWuXJui2Hs0sTWWtU5svqVragHtvKuUqLuaXirTgGGhmW5/qsnEAMa/7eZnxDJW5jle9yfM7wiBIKA== dependencies: "@types/tmp" "^0.2.0" async-mutex "^0.3.0" @@ -8917,27 +8855,25 @@ mongodb-memory-server-core@7.2.0: yauzl "^2.10.0" mongodb-memory-server@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-7.2.0.tgz#b425b0014841d1d18134de8e08e6d3c6affa13e9" - integrity sha512-bTVzkHwNgEQHt8pRZF8Fca96eghd/72RHn0kEsnYjf0XjY5Vvg8/PvxOEWRd4Oa15tUJ6rW5eMsQhRfb1FPCFg== + version "7.3.4" + resolved "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-7.3.4.tgz#044596bac7b291a727aa4b6316dc2facbdb75f24" + integrity sha512-W3VXLKnZZX5pdfSrLcer7m4RKISiQ8AMG4TTcfl7SMGvKELsUcSGwIWYXP7TeCQ8RkZpj9riz0OxphQow5qi3g== dependencies: - mongodb-memory-server-core "7.2.0" + mongodb-memory-server-core "7.3.4" tslib "^2.3.0" -mongodb@3.6.8: - version "3.6.8" - resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.6.8.tgz#3e2632af81915b3ff99b7681121ca0895e8ed407" - integrity sha512-sDjJvI73WjON1vapcbyBD3Ao9/VN3TKYY8/QX9EPbs22KaCSrQ5rXo5ZZd44tWJ3wl3FlnrFZ+KyUtNH6+1ZPQ== +mongodb@*: + version "4.0.1" + resolved "https://registry.npmjs.org/mongodb/-/mongodb-4.0.1.tgz#e7fa8de3448492097b3c67a0d980c4816907aa83" + integrity sha512-Ll2YCciRgbFN2jdfSqW1vhxvAcnqu+5ZlrTZNaEg+hZqKREg4xiUV56ZAtTjC02skfoTirHY5jQwtg7mBxqfug== dependencies: - bl "^2.2.1" - bson "^1.1.4" - denque "^1.4.1" - optional-require "^1.0.3" - safe-buffer "^5.1.2" + bson "^4.4.0" + denque "^1.5.0" + mongodb-connection-string-url "^1.0.1" optionalDependencies: saslprep "^1.0.0" -mongodb@^3.6.2, mongodb@^3.6.9: +mongodb@3.6.10, mongodb@^3.6.2, mongodb@^3.6.9: version "3.6.10" resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.6.10.tgz#f10e990113c86b195c8af0599b9b3a90748b6ee4" integrity sha512-fvIBQBF7KwCJnDZUnFFy4WqEFP8ibdXeFANnylW19+vOwdjOAvqIzPdsNCEMT6VKTHnYu4K64AWRih0mkFms6Q== @@ -8960,34 +8896,16 @@ mongoose-paginate-v2@^1.3.6: resolved "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.4.1.tgz#63c2ac249f9767626d3d044e3ab2847b21071edf" integrity sha512-MOmcD6TWPkrLCy4D6iq8/P9GqwSzSq6HZjMWuMnKPOANCDFeHdd7KHuce5tYMlpQ5G9E4Co5meOfEnhpZzL/SQ== -mongoose@*: - version "5.12.14" - resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.12.14.tgz#610460f0725acf67b3eefcd92f0a48a08919d51b" - integrity sha512-1lMRY8cfGYFWHqe5DLnVgNQDyD0fEbSoWIQe9Mllt/ZtayZ5XUFQt+o5VKrB44vsT5cLNzgwEFO0NvwTwqLluQ== - dependencies: - "@types/mongodb" "^3.5.27" - bson "^1.1.4" - kareem "2.3.2" - mongodb "3.6.8" - mongoose-legacy-pluralize "1.0.2" - mpath "0.8.3" - mquery "3.2.5" - ms "2.1.2" - regexp-clone "1.0.0" - safe-buffer "5.2.1" - sift "13.5.2" - sliced "1.0.1" - -mongoose@^5.8.9: - version "5.13.2" - resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.2.tgz#1b9095fc6bbbb015ea3bc2a79d6f56025406c769" - integrity sha512-sBUKJGpdwZCq9102Lj6ZOaLcW4z/T4TI9aGWrNX5ZlICwChKWG4Wo5qriLImdww3H7bETPW9vYtSiADNlA4wSQ== +mongoose@*, mongoose@^5.8.9: + version "5.13.3" + resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.3.tgz#42cb40207bbcaca9c6fa94b0a8c0a38181c1965e" + integrity sha512-q+zX6kqHAvwxf5speMWhq6qF4vdj+x6/kfD5RSKdZKNm52yGmaUygN+zgrtQjBZPFEzG0B3vF6GP0PoAGadE+w== dependencies: "@types/mongodb" "^3.5.27" "@types/node" "14.x || 15.x" bson "^1.1.4" kareem "2.3.2" - mongodb "3.6.8" + mongodb "3.6.10" mongoose-legacy-pluralize "1.0.2" mpath "0.8.3" mquery "3.2.5" @@ -9049,9 +8967,9 @@ nan@^2.13.2: integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nano-css@^5.2.1: - version "5.3.1" - resolved "https://registry.npmjs.org/nano-css/-/nano-css-5.3.1.tgz#b709383e07ad3be61f64edffacb9d98250b87a1f" - integrity sha512-ENPIyNzANQRyYVvb62ajDd7PAyIgS2LIUnT9ewih4yrXSZX4hKoUwssy8WjUH++kEOA5wUTMgNnV7ko5n34kUA== + version "5.3.4" + resolved "https://registry.npmjs.org/nano-css/-/nano-css-5.3.4.tgz#40af6a83a76f84204f346e8ccaa9169cdae9167b" + integrity sha512-wfcviJB6NOxDIDfr7RFn/GlaN7I/Bhe4d39ZRCJ3xvZX60LVe2qZ+rDqM49nm4YT81gAjzS+ZklhKP/Gnfnubg== dependencies: css-tree "^1.1.2" csstype "^3.0.6" @@ -9095,9 +9013,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.5.2: - version "2.6.0" - resolved "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" - integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== + version "2.8.0" + resolved "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz#1c8ef9c1a2c29dcc1e83d73809d7bc681c80a048" + integrity sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -9203,9 +9121,9 @@ node-releases@^1.1.71: integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== node-sass@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/node-sass/-/node-sass-6.0.0.tgz#f30da3e858ad47bfd138bc0e0c6f924ed2f734af" - integrity sha512-GDzDmNgWNc9GNzTcSLTi6DU6mzSPupVJoStIi7cF3GjwSE9q1cVakbvAAVSt59vzUjV9JJoSZFKoo9krbjKd2g== + version "6.0.1" + resolved "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz#cad1ccd0ce63e35c7181f545d8b986f3a9a887fe" + integrity sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -9214,8 +9132,7 @@ node-sass@^6.0.0: get-stdin "^4.0.1" glob "^7.0.3" lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" + meow "^9.0.0" nan "^2.13.2" node-gyp "^7.1.0" npmlog "^4.0.0" @@ -9225,14 +9142,14 @@ node-sass@^6.0.0: "true-case-path" "^1.0.2" nodemailer@^6.4.2: - version "6.6.2" - resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.2.tgz#e184c9ed5bee245a3e0bcabc7255866385757114" - integrity sha512-YSzu7TLbI+bsjCis/TZlAXBoM4y93HhlIgo0P5oiA2ua9Z4k+E2Fod//ybIzdJxOlXGRcHIh/WaeCBehvxZb/Q== + version "6.6.3" + resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz#31fb53dd4d8ae16fc088a65cb9ffa8d928a69b48" + integrity sha512-faZFufgTMrphYoDjvyVpbpJcYzwyFnbAMmQtj1lVBYAUSm3SOy2fIdd9+Mr4UxPosBa0JRw9bJoIwQn+nswiew== nodemon@^2.0.6: - version "2.0.7" - resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz#6f030a0a0ebe3ea1ba2a38f71bf9bab4841ced32" - integrity sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== + version "2.0.12" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz#5dae4e162b617b91f1873b3bfea215dd71e144d5" + integrity sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA== dependencies: chokidar "^3.2.2" debug "^3.2.6" @@ -9267,7 +9184,7 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -9314,10 +9231,10 @@ normalize-url@^4.1.0: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -normalize-url@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.0.1.tgz#a4f27f58cf8c7b287b440b8a8201f42d0b00d256" - integrity sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ== +normalize-url@^6.0.1, normalize-url@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== npm-run-path@^2.0.0: version "2.0.2" @@ -9377,7 +9294,7 @@ oauth-sign@~0.9.0: resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -9392,9 +9309,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.10.3, object-inspect@^1.9.0: - version "1.10.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" - integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + version "1.11.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== object-is@^1.0.1: version "1.1.5" @@ -9507,17 +9424,19 @@ opener@^1.5.2: integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== optimize-css-assets-webpack-plugin@^5.0.4: - version "5.0.6" - resolved "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.6.tgz#abad0c6c11a632201794f75ddba3ce13e32ae80e" - integrity sha512-JAYw7WrIAIuHWoKeSBB3lJ6ZG9PSDK3JJduv/FMpIY060wvbA8Lqn/TCtxNGICNlg0X5AGshLzIhpYrkltdq+A== + version "5.0.8" + resolved "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz#cbccdcf5a6ef61d4f8cc78cf083a67446e5f402a" + integrity sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q== dependencies: cssnano "^4.1.10" last-call-webpack-plugin "^3.0.0" optional-require@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz#275b8e9df1dc6a17ad155369c2422a440f89cb07" - integrity sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA== + version "1.1.0" + resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.1.0.tgz#01dfbafbbc2e8d79e33558f5af3917f22cc35c2c" + integrity sha512-5/7ee3eTFg1P+F9usTubuNCLfWRK6DjV0EFHLlbp7MmV5UlWqpWIVSnH6xo4u+fc5WHXaJuvJi6iuYnfDyj6oQ== + dependencies: + require-at "^1.0.6" optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" @@ -9687,11 +9606,6 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" -parse-github-repo-url@^1.3.0: - version "1.4.1" - resolved "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" - integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= - parse-json@5.2.0, parse-json@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -9702,13 +9616,6 @@ parse-json@5.2.0, parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -9732,13 +9639,13 @@ parse-path@^4.0.0: qs "^6.9.4" query-string "^6.13.8" -parse-url@^5.0.0: - version "5.0.3" - resolved "https://registry.npmjs.org/parse-url/-/parse-url-5.0.3.tgz#c158560f14cb1560917e0b7fd8b01adc1e9d3cab" - integrity sha512-nrLCVMJpqo12X8uUJT4GJPd5AFaTOrGx/QpJy3HNcVtq0AZSstVIsnxS5fqNPuoqMUs3MyfBoOP6Zvu2Arok5A== +parse-url@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-6.0.0.tgz#f5dd262a7de9ec00914939220410b66cff09107d" + integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw== dependencies: is-ssh "^1.3.0" - normalize-url "^6.0.1" + normalize-url "^6.1.0" parse-path "^4.0.0" protocols "^1.4.0" @@ -9822,13 +9729,6 @@ path-browserify@^1.0.1: resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -9871,15 +9771,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -9912,7 +9803,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pify@^2.0.0, pify@^2.3.0: +pify@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -9927,18 +9818,6 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - pino-pretty@^4.3.0: version "4.8.0" resolved "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.8.0.tgz#f2f3055bf222456217b14ffb04d8be0a0cc17fce" @@ -9963,12 +9842,12 @@ pino-std-serializers@^3.1.0: integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== pino@^6.4.1: - version "6.11.3" - resolved "https://registry.npmjs.org/pino/-/pino-6.11.3.tgz#0c02eec6029d25e6794fdb6bbea367247d74bc29" - integrity sha512-drPtqkkSf0ufx2gaea3TryFiBHdNIdXKf5LN0hTM82SXI4xVIve2wLwNg92e1MT6m3jASLu6VO7eGY6+mmGeyw== + version "6.13.0" + resolved "https://registry.npmjs.org/pino/-/pino-6.13.0.tgz#41810b9be213af6f8f7c23a1b17058d880267e7b" + integrity sha512-mRXSTfa34tbfrWqCIp1sUpZLqBhcoaGapoyxfEwaWwJGMpLijlRdDKIQUyvq4M3DUfFH5vEglwSw8POZYwbThA== dependencies: fast-redact "^3.0.0" - fast-safe-stringify "^2.0.7" + fast-safe-stringify "^2.0.8" flatstr "^1.0.12" pino-std-serializers "^3.1.0" quick-format-unescaped "^4.0.3" @@ -10630,9 +10509,9 @@ postcss@7.x.x, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, supports-color "^6.1.0" postcss@^8.2.15: - version "8.3.5" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" - integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== + version "8.3.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" + integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== dependencies: colorette "^1.2.2" nanoid "^3.1.23" @@ -10675,13 +10554,13 @@ prepend-http@^2.0.0: resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== +pretty-error@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz#94b1d54f76c1ed95b9c604b9de2194838e5b574e" + integrity sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ== dependencies: lodash "^4.17.20" - renderkid "^2.0.4" + renderkid "^2.0.6" pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" @@ -10694,11 +10573,9 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: react-is "^17.0.1" prismjs@^1.20.0, prismjs@^1.21.0: - version "1.23.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" - integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== - optionalDependencies: - clipboard "^2.0.0" + version "1.24.1" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz#c4d7895c4d6500289482fa8936d9cdd192684036" + integrity sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow== probe-image-size@^6.0.0: version "6.0.0" @@ -11039,9 +10916,9 @@ react-router-dom@^5.1.2: tiny-warning "^1.0.0" react-router-navigation-prompt@^1.8.11: - version "1.8.13" - resolved "https://registry.npmjs.org/react-router-navigation-prompt/-/react-router-navigation-prompt-1.8.13.tgz#eb315f8d4c3a0b35103249f628d1045049b8b5f4" - integrity sha512-1aBJvNX1sGe5eeUQ+e9OKPk4BLG6UifP08RT8ihbUSerYMv/0YLH25Q9CxzAGYEDDL1BNWU0oEkOS/qg16cXWw== + version "1.8.14" + resolved "https://registry.npmjs.org/react-router-navigation-prompt/-/react-router-navigation-prompt-1.8.14.tgz#d099616ed223fe0e65108ab43b365f96e26818a1" + integrity sha512-WDqatk1FJb5EOAJXvBkppY/gqOficIgXTH+lQ8sBJ4H73iveDCWa7za2NKbjZpHgb1owuV3grehvS2QLgnVnBQ== react-router@5.2.0: version "5.2.0" @@ -11135,14 +11012,6 @@ react@^17.0.1: loose-envify "^1.1.0" object-assign "^4.1.1" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -11160,15 +11029,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -11244,20 +11104,12 @@ rechoir@^0.6.2: resolve "^1.1.6" rechoir@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" - integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + version "0.7.1" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== dependencies: resolve "^1.9.0" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - redent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -11286,9 +11138,9 @@ regenerate@^1.4.0: integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" @@ -11372,25 +11224,25 @@ relateurl@^0.2.7: integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= release-it@^14.2.2: - version "14.10.0" - resolved "https://registry.npmjs.org/release-it/-/release-it-14.10.0.tgz#2ad9aa5357f257ee92d4c632a0c64dfe8286bff0" - integrity sha512-BwL7W3VPILma+MwO2kEtZaAL0/G/mZafg4xgpfxy4MVxLd+28lBp22EDF2gS4GXHmcblawyV2IdbWo/56QIyJw== + version "14.10.1" + resolved "https://registry.npmjs.org/release-it/-/release-it-14.10.1.tgz#5416887e6568347bd9b19de88b5371b0466dfb23" + integrity sha512-uC+LtV9vlcFOAkclJYnANNlufLoESZPjC5wGeKoW/Y91jJp0bfQv6/iU44a7rmZ4LHy3q52JD54jNe45RUOPYw== dependencies: "@iarna/toml" "2.2.5" - "@octokit/rest" "18.6.0" + "@octokit/rest" "18.7.1" async-retry "1.3.1" chalk "4.1.1" cosmiconfig "7.0.0" - debug "4.3.1" + debug "4.3.2" deprecated-obj "2.0.0" execa "5.1.1" find-up "5.0.0" form-data "4.0.0" - git-url-parse "11.4.4" + git-url-parse "11.5.0" globby "11.0.4" got "11.8.2" import-cwd "3.0.0" - inquirer "8.1.1" + inquirer "8.1.2" is-ci "3.0.0" lodash "4.17.21" mime-types "2.1.31" @@ -11403,7 +11255,7 @@ release-it@^14.2.2: url-join "4.0.1" uuid "8.3.2" yaml "1.10.2" - yargs-parser "20.2.7" + yargs-parser "20.2.9" remark-parse@^9.0.0: version "9.0.0" @@ -11425,7 +11277,7 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -renderkid@^2.0.4: +renderkid@^2.0.6: version "2.0.7" resolved "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== @@ -11446,13 +11298,6 @@ repeat-string@^1.6.1: resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -11479,6 +11324,11 @@ request@^2.88.0, request@^2.88.2: tunnel-agent "^0.6.0" uuid "^3.3.2" +require-at@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz#9eb7e3c5e00727f5a4744070a7f560d4de4f6e6a" + integrity sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -11500,9 +11350,9 @@ resize-observer-polyfill@^1.5.1: integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== resolve-alpn@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.1.2.tgz#30b60cfbb0c0b8dc897940fe13fe255afcdd4d28" - integrity sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA== + version "1.2.0" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.0.tgz#058bb0888d1cd4d12474e9a4b6eb17bdd5addc44" + integrity sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA== resolve-cwd@^3.0.0: version "3.0.0" @@ -11642,13 +11492,20 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.0, rxjs@^6.6.6: +rxjs@^6.6.0: version "6.6.7" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" +rxjs@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.2.0.tgz#5cd12409639e9514a71c9f5f9192b2c4ae94de31" + integrity sha512-aX8w9OpKrQmiPKfT1bqETtUr9JygIz6GZ+gql8v7CijClsP0laoFUdKzxFAoWuRdSlOdU2+crss+cMf+cqMTnw== + dependencies: + tslib "~2.1.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -11722,9 +11579,9 @@ sass-loader@^10.1.0: semver "^7.3.2" sass@^1.29.0: - version "1.35.1" - resolved "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz#90ecf774dfe68f07b6193077e3b42fb154b9e1cd" - integrity sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ== + version "1.36.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz#5912ef9d5d16714171ba11cb17edb274c4bbc07e" + integrity sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -11757,12 +11614,12 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" - integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== +schema-utils@^3.0.0, schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: - "@types/json-schema" "^7.0.6" + "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" @@ -11791,11 +11648,6 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -select@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= - semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -11851,6 +11703,13 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + serve-static@1.14.1: version "1.14.1" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -11936,7 +11795,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@0.8.4, shelljs@^0.8.3: +shelljs@0.8.4: version "0.8.4" resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== @@ -12105,7 +11964,14 @@ sonic-boom@^1.0.2: atomic-sleep "^1.0.0" flatstr "^1.0.12" -source-list-map@^2.0.0, source-list-map@^2.0.1: +sonic-boom@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.1.0.tgz#07b7b181b078aeb5f202019769e4088c70c4f0eb" + integrity sha512-x2j9LXx27EDlyZEC32gBM+scNVMdPutU7FIKV2BOTKCnPrp7bY5BsplCMQ4shYYR3IhDSIrEXoqb6GlS+z7KyQ== + dependencies: + atomic-sleep "^1.0.0" + +source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== @@ -12463,13 +12329,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -12490,13 +12349,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -12638,9 +12490,9 @@ tar-stream@^2.1.4: readable-stream "^3.1.1" tar@^6.0.2: - version "6.1.0" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + version "6.1.2" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.2.tgz#1f045a90a6eb23557a603595f41a16c57d47adc6" + integrity sha512-EwKEgqJ7nJoS+s8QfLYVGMDmAsj+StbI2AM/RTHeUSsOw6Z8bwNBRv5z3CY0m7laC5qUAqruLX5AhMuc5deY3Q== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -12679,14 +12531,14 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^5.0.3, terser-webpack-plugin@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz#30033e955ca28b55664f1e4b30a1347e61aa23af" - integrity sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A== + version "5.1.4" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz#c369cf8a47aa9922bd0d8a94fe3d3da11a7678a1" + integrity sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA== dependencies: jest-worker "^27.0.2" p-limit "^3.1.0" schema-utils "^3.0.0" - serialize-javascript "^5.0.1" + serialize-javascript "^6.0.0" source-map "^0.6.1" terser "^5.7.0" @@ -12700,9 +12552,9 @@ terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.8, terser@^5.7.0: - version "5.7.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" - integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== + version "5.7.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" + integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -12762,11 +12614,6 @@ timsort@^0.3.0: resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: version "1.1.0" resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" @@ -12891,11 +12738,6 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -12936,12 +12778,11 @@ ts-essentials@^7.0.1: integrity sha512-qWPVC1xZGdefbsgFP7tPo+bsgSA2ZIXL1XeEe5M2WoMZxIOr/HbsHxP/Iv75IFhiMHMDGL7cOOwi5SXcgx9mHw== tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + version "3.10.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" + integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q== dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^2.2.0" minimist "^1.2.0" strip-bom "^3.0.0" @@ -12955,6 +12796,11 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tslib@~2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" @@ -12991,6 +12837,11 @@ type-detect@4.0.8: resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.18.0: version "0.18.1" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -13047,9 +12898,9 @@ typescript@^4.1.2: integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== uglify-js@^3.1.4: - version "3.13.9" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz#4d8d21dcd497f29cfd8e9378b9df123ad025999b" - integrity sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g== + version "3.14.1" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz#e2cb9fe34db9cb4cf7e35d1d26dfea28e09a7d06" + integrity sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g== unbox-primitive@^1.0.1: version "1.0.1" @@ -13092,9 +12943,9 @@ unicode-property-aliases-ecmascript@^1.0.4: integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== unified@^9.1.0: - version "9.2.1" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" - integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== + version "9.2.2" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -13524,29 +13375,26 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.3: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz#9ed2de69b25143a4c18847586ad9eccb19278cfa" - integrity sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ== - dependencies: - source-list-map "^2.0.1" - source-map "^0.6.1" +webpack-sources@^3.0.1: + version "3.0.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.0.3.tgz#33c478e1f67bf5577d3ec5ced4bded0a06ec88d0" + integrity sha512-/Qgfp3i1FT2z/tpNj+d/ZeDTbdOWG5V6DdTjIvMLVhrhtpFxmMTZrGnEQEa0J7HF8Plls5kGa7TZ7IsvgnFdtA== webpack@^5, webpack@^5.1.0, webpack@^5.6.0: - version "5.40.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.40.0.tgz#3182cfd324759d715252cf541901a226e57b5061" - integrity sha512-c7f5e/WWrxXWUzQqTBg54vBs5RgcAgpvKE4F4VegVgfo4x660ZxYUF2/hpMkZUnLjgytVTitjeXaN4IPlXCGIw== + version "5.47.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.47.0.tgz#3c13862b5d7b428792bfe76c5f67a0f43ba685f8" + integrity sha512-soKLGwcUM1R3YEbJhJNiZzy7T43TnI7ENda/ywfDp9G1mDlDTpO+qfc8I5b0AzMr9xM3jyvQ0n7ctJyiXuXW6Q== dependencies: "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.47" - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/wasm-edit" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - acorn "^8.2.1" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" browserslist "^4.14.5" chrome-trace-event "^1.0.2" enhanced-resolve "^5.8.0" - es-module-lexer "^0.6.0" + es-module-lexer "^0.7.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -13555,11 +13403,11 @@ webpack@^5, webpack@^5.1.0, webpack@^5.6.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.0.0" + schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" watchpack "^2.2.0" - webpack-sources "^2.3.0" + webpack-sources "^3.0.1" whatwg-encoding@^1.0.5: version "1.0.5" @@ -13578,10 +13426,10 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.6.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" - integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== +whatwg-url@^8.0.0, whatwg-url@^8.4.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" tr46 "^2.1.0" @@ -13716,9 +13564,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.3.1, ws@^7.4.5: - version "7.5.0" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" - integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== + version "7.5.3" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== xdg-basedir@^4.0.0: version "4.0.0" @@ -13768,10 +13616,10 @@ yaml@1.10.2, yaml@^1.10.0, yaml@^1.7.2: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@20.2.7: - version "20.2.7" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== +yargs-parser@20.2.9, yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^13.1.2: version "13.1.2" @@ -13781,7 +13629,7 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.2: +yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -13789,11 +13637,6 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs@^13.3.2: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" From a002b7105f5c312e846c80032a350046db10236c Mon Sep 17 00:00:00 2001 From: James Date: Thu, 29 Jul 2021 07:15:47 -0400 Subject: [PATCH 031/115] feat: improves plugin writability --- docs/plugins/overview.mdx | 2 ++ src/config/build.ts | 3 ++- src/config/types.ts | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/plugins/overview.mdx b/docs/plugins/overview.mdx index 75e7e7e1b9..0622ccd25c 100644 --- a/docs/plugins/overview.mdx +++ b/docs/plugins/overview.mdx @@ -78,6 +78,8 @@ export default config; Payload Plugins are executed _after_ the incoming config is validated, sanitized, and default options are merged in. +However, after all plugins are executed, the full config with all plugins will be re-sanitized. + ## Simple example Here is an example for how to automatically add a `lastModifiedBy` field to all Payload collections using a Plugin written in TypeScript. diff --git a/src/config/build.ts b/src/config/build.ts index cd8480c50c..e91e8859a5 100644 --- a/src/config/build.ts +++ b/src/config/build.ts @@ -10,7 +10,8 @@ export function buildConfig(config: Config): SanitizedConfig { const sanitized = sanitize(config); if (Array.isArray(config.plugins)) { - return sanitized.plugins.reduce((configWithPlugins, plugin) => plugin(configWithPlugins), sanitized); + const configWithPlugins = sanitized.plugins.reduce((updatedConfig, plugin) => plugin(updatedConfig), sanitized); + return sanitize(configWithPlugins); } return sanitized; diff --git a/src/config/types.ts b/src/config/types.ts index 7bee5cdd1e..cb719b4de2 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -18,7 +18,7 @@ type Email = { } // eslint-disable-next-line no-use-before-define -type Plugin = (config: SanitizedConfig) => SanitizedConfig; +type Plugin = (config: Config) => Config; type GeneratePreviewURLOptions = { locale: string From e6575600cb93125d6507162a44cd728f47ebc27e Mon Sep 17 00:00:00 2001 From: James Date: Thu, 29 Jul 2021 07:17:30 -0400 Subject: [PATCH 032/115] chore(release): v0.8.1 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 430a87eddc..6e9fa18aba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.8.1](https://github.com/payloadcms/payload/compare/v0.8.0...v0.8.1) (2021-07-29) + + +### Features + +* improves plugin writability ([a002b71](https://github.com/payloadcms/payload/commit/a002b7105f5c312e846c80032a350046db10236c)) + # [0.8.0](https://github.com/payloadcms/payload/compare/v0.7.10...v0.8.0) (2021-07-28) ### BREAKING CHANGES diff --git a/package.json b/package.json index c5ab837581..061fda6923 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.8.0", + "version": "0.8.1", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From cb6fbd7160ce83d091050162e5d65a97c56d56b5 Mon Sep 17 00:00:00 2001 From: James Mikrut Date: Thu, 29 Jul 2021 07:48:38 -0400 Subject: [PATCH 033/115] Update CHANGELOG.md --- CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e9fa18aba..e2fc6989f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,37 @@ ### Features +### BREAKING CHANGES + +* If you have any plugins that are written in TypeScript, we have changed plugin types to make them more flexible. Whereas before you needed to take in a fully sanitized config, and return a fully sanitized config, we now have simplified that requirement so that you can write configs in your own plugins just as an end user of Payload can write their own configs. + +Now, configs will be sanitized **_before_** plugins are executed **_as well as_** after plugins are executed. + +So, where your plugin may have been typed like this before: + +```ts + import { SanitizedConfig } from 'payload/config'; + + const plugin = (config: SanitizedConfig): SanitizedConfig => { + return { + ...config, + } + } +``` + +It can now be written like this: + +```ts + import { Config } from 'payload/config'; + + const plugin = (config: Config): Config => { + return { + ...config, + } + } +``` + + * improves plugin writability ([a002b71](https://github.com/payloadcms/payload/commit/a002b7105f5c312e846c80032a350046db10236c)) # [0.8.0](https://github.com/payloadcms/payload/compare/v0.7.10...v0.8.0) (2021-07-28) From be69b5892a5e1fad8b0468d75c2bb5961de8632b Mon Sep 17 00:00:00 2001 From: James Mikrut Date: Thu, 29 Jul 2021 07:49:03 -0400 Subject: [PATCH 034/115] Update CHANGELOG.md --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2fc6989f8..b914e690e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,6 @@ ## [0.8.1](https://github.com/payloadcms/payload/compare/v0.8.0...v0.8.1) (2021-07-29) -### Features - ### BREAKING CHANGES * If you have any plugins that are written in TypeScript, we have changed plugin types to make them more flexible. Whereas before you needed to take in a fully sanitized config, and return a fully sanitized config, we now have simplified that requirement so that you can write configs in your own plugins just as an end user of Payload can write their own configs. @@ -33,6 +31,7 @@ It can now be written like this: } ``` +### Features * improves plugin writability ([a002b71](https://github.com/payloadcms/payload/commit/a002b7105f5c312e846c80032a350046db10236c)) From 12cba62930b8d35b22e3a7a99cf06df29bd4964a Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Sun, 1 Aug 2021 09:48:59 -0400 Subject: [PATCH 035/115] feat: export error types --- errors.d.ts | 1 + src/errors/types.ts | 1 + 2 files changed, 2 insertions(+) create mode 100644 errors.d.ts create mode 100644 src/errors/types.ts diff --git a/errors.d.ts b/errors.d.ts new file mode 100644 index 0000000000..ce2f651937 --- /dev/null +++ b/errors.d.ts @@ -0,0 +1 @@ +export * from './dist/errors/types'; diff --git a/src/errors/types.ts b/src/errors/types.ts new file mode 100644 index 0000000000..dc0dc8965a --- /dev/null +++ b/src/errors/types.ts @@ -0,0 +1 @@ +export * from '.'; From 33983deb3761813506348f8ff804a2117d1324ef Mon Sep 17 00:00:00 2001 From: James Date: Thu, 29 Jul 2021 11:17:49 -0400 Subject: [PATCH 036/115] fix: more advanced conditional logic edge cases --- .../forms/Form/buildStateFromSchema.ts | 22 ++++++++------- .../components/forms/Form/fieldReducer.ts | 27 ++++++++++++++----- src/admin/components/forms/Form/types.ts | 3 +++ .../forms/field-types/Array/Array.tsx | 2 ++ .../forms/field-types/Blocks/Blocks.tsx | 2 ++ .../forms/field-types/Checkbox/index.tsx | 2 ++ .../forms/field-types/Code/Code.tsx | 2 ++ .../forms/field-types/DateTime/index.tsx | 2 ++ .../forms/field-types/Email/index.tsx | 2 ++ .../forms/field-types/Number/index.tsx | 2 ++ .../forms/field-types/RadioGroup/index.tsx | 2 ++ .../forms/field-types/Relationship/index.tsx | 2 ++ .../forms/field-types/RichText/RichText.tsx | 2 ++ .../forms/field-types/Select/index.tsx | 2 ++ .../forms/field-types/Text/index.tsx | 2 ++ .../forms/field-types/Textarea/index.tsx | 2 ++ .../forms/field-types/Upload/index.tsx | 2 ++ .../components/forms/useFieldType/index.tsx | 4 ++- .../components/forms/useFieldType/types.ts | 3 ++- 19 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/admin/components/forms/Form/buildStateFromSchema.ts b/src/admin/components/forms/Form/buildStateFromSchema.ts index 6b7ae209c7..0ffcb0f3e0 100644 --- a/src/admin/components/forms/Form/buildStateFromSchema.ts +++ b/src/admin/components/forms/Form/buildStateFromSchema.ts @@ -23,7 +23,7 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = if (fieldSchema) { const validationPromises = []; - const structureFieldState = (field, data = {}) => { + const structureFieldState = (field, passesCondition, data = {}) => { const value = typeof data?.[field.name] !== 'undefined' ? data[field.name] : field.defaultValue; const fieldState = { @@ -31,6 +31,8 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = initialValue: value, valid: true, validate: field.validate, + condition: field.admin?.condition, + passesCondition, }; validationPromises.push(buildValidationPromise(fieldState, field)); @@ -38,7 +40,7 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = return fieldState; }; - const iterateFields = (fields: FieldSchema[], data: Data, path = '') => fields.reduce((state, field) => { + const iterateFields = (fields: FieldSchema[], data: Data, parentPassesCondition: boolean, path = '') => fields.reduce((state, field) => { let initialData = data; if (!field?.admin?.disabled) { @@ -46,6 +48,8 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = initialData = { [field.name]: field.defaultValue }; } + const passesCondition = (field?.admin?.condition ? field.admin.condition(fullData || {}, initialData || {}) : true) && parentPassesCondition; + if (field.name) { if (field.type === 'relationship' && initialData?.[field.name] === null) { initialData[field.name] = 'null'; @@ -68,7 +72,7 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = initialValue: row.id || new ObjectID().toHexString(), valid: true, }, - ...iterateFields(field.fields, row, rowPath), + ...iterateFields(field.fields, row, passesCondition, rowPath), }; }, {}), }; @@ -97,7 +101,7 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = initialValue: row.id || new ObjectID().toHexString(), valid: true, }, - ...(block?.fields ? iterateFields(block.fields, row, rowPath) : {}), + ...(block?.fields ? iterateFields(block.fields, row, passesCondition, rowPath) : {}), }; }, {}), }; @@ -113,13 +117,13 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = return { ...state, - ...iterateFields(field.fields, subFieldData, `${path}${field.name}.`), + ...iterateFields(field.fields, subFieldData, passesCondition, `${path}${field.name}.`), }; } return { ...state, - [`${path}${field.name}`]: structureFieldState(field, data), + [`${path}${field.name}`]: structureFieldState(field, passesCondition, data), }; } @@ -127,21 +131,21 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = if (field.type === 'row') { return { ...state, - ...iterateFields(field.fields, data, path), + ...iterateFields(field.fields, data, passesCondition, path), }; } // Handle normal fields return { ...state, - [`${path}${field.name}`]: structureFieldState(field, data), + [`${path}${field.name}`]: structureFieldState(field, passesCondition, data), }; } return state; }, {}); - const resultingState = iterateFields(fieldSchema, fullData); + const resultingState = iterateFields(fieldSchema, fullData, true); await Promise.all(validationPromises); return resultingState; } diff --git a/src/admin/components/forms/Form/fieldReducer.ts b/src/admin/components/forms/Form/fieldReducer.ts index e42bacc876..32bb88e87f 100644 --- a/src/admin/components/forms/Form/fieldReducer.ts +++ b/src/admin/components/forms/Form/fieldReducer.ts @@ -1,5 +1,7 @@ import { unflatten, flatten } from 'flatley'; import flattenFilters from './flattenFilters'; +import getSiblingData from './getSiblingData'; +import reduceFieldsToValues from './reduceFieldsToValues'; import { Fields } from './types'; const unflattenRowsFromState = (state: Fields, path) => { @@ -106,21 +108,31 @@ function fieldReducer(state: Fields, action): Fields { case 'MODIFY_CONDITION': { const { path, result } = action; - return Object.entries(state).reduce((newState, [key, val]) => { - if (key === path || key.indexOf(`${path}.`) === 0) { + return Object.entries(state).reduce((newState, [fieldPath, field]) => { + if (fieldPath === path || fieldPath.indexOf(`${path}.`) === 0) { + let passesCondition = result; + + // If a condition is being set to true, + // Set all conditions to true + // Besides those who still fail their own conditions + + if (passesCondition && field.condition) { + passesCondition = field.condition(reduceFieldsToValues(state), getSiblingData(state, path)); + } + return { ...newState, - [key]: { - ...val, - passesCondition: result, + [fieldPath]: { + ...field, + passesCondition, }, }; } return { ...newState, - [key]: { - ...val, + [fieldPath]: { + ...field, }, }; }, {}); @@ -136,6 +148,7 @@ function fieldReducer(state: Fields, action): Fields { initialValue: action.initialValue, stringify: action.stringify, validate: action.validate, + condition: action.condition, passesCondition: action.passesCondition, }; diff --git a/src/admin/components/forms/Form/types.ts b/src/admin/components/forms/Form/types.ts index 50c6d6de89..930e6492f1 100644 --- a/src/admin/components/forms/Form/types.ts +++ b/src/admin/components/forms/Form/types.ts @@ -1,3 +1,5 @@ +import { Condition } from '../../../../fields/config/types'; + export type Field = { value: unknown initialValue: unknown @@ -7,6 +9,7 @@ export type Field = { disableFormData?: boolean ignoreWhileFlattening?: boolean stringify?: boolean + condition?: Condition passesCondition?: boolean } diff --git a/src/admin/components/forms/field-types/Array/Array.tsx b/src/admin/components/forms/field-types/Array/Array.tsx index 2bae7b0562..a51001e277 100644 --- a/src/admin/components/forms/field-types/Array/Array.tsx +++ b/src/admin/components/forms/field-types/Array/Array.tsx @@ -32,6 +32,7 @@ const ArrayFieldType: React.FC = (props) => { admin: { readOnly, description, + condition, }, } = props; @@ -70,6 +71,7 @@ const ArrayFieldType: React.FC = (props) => { validate: memoizedValidate, disableFormData, ignoreWhileFlattening: true, + condition, }); const addRow = useCallback(async (rowIndex) => { diff --git a/src/admin/components/forms/field-types/Blocks/Blocks.tsx b/src/admin/components/forms/field-types/Blocks/Blocks.tsx index f6579c5ad6..7cc49cd83a 100644 --- a/src/admin/components/forms/field-types/Blocks/Blocks.tsx +++ b/src/admin/components/forms/field-types/Blocks/Blocks.tsx @@ -46,6 +46,7 @@ const Blocks: React.FC = (props) => { admin: { readOnly, description, + condition, }, } = props; @@ -80,6 +81,7 @@ const Blocks: React.FC = (props) => { validate: memoizedValidate, disableFormData, ignoreWhileFlattening: true, + condition, }); const addRow = useCallback(async (rowIndex, blockType) => { diff --git a/src/admin/components/forms/field-types/Checkbox/index.tsx b/src/admin/components/forms/field-types/Checkbox/index.tsx index 4a0c5ac8d1..d49342318c 100644 --- a/src/admin/components/forms/field-types/Checkbox/index.tsx +++ b/src/admin/components/forms/field-types/Checkbox/index.tsx @@ -25,6 +25,7 @@ const Checkbox: React.FC = (props) => { style, width, description, + condition, } = {}, } = props; @@ -44,6 +45,7 @@ const Checkbox: React.FC = (props) => { path, validate: memoizedValidate, disableFormData, + condition, }); return ( diff --git a/src/admin/components/forms/field-types/Code/Code.tsx b/src/admin/components/forms/field-types/Code/Code.tsx index a5b3acda65..5c4f4b2acd 100644 --- a/src/admin/components/forms/field-types/Code/Code.tsx +++ b/src/admin/components/forms/field-types/Code/Code.tsx @@ -25,6 +25,7 @@ const Code: React.FC = (props) => { width, language, description, + condition, } = {}, label, minLength, @@ -55,6 +56,7 @@ const Code: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, + condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/DateTime/index.tsx b/src/admin/components/forms/field-types/DateTime/index.tsx index dea5e7f201..f336b2dea0 100644 --- a/src/admin/components/forms/field-types/DateTime/index.tsx +++ b/src/admin/components/forms/field-types/DateTime/index.tsx @@ -27,6 +27,7 @@ const DateTime: React.FC = (props) => { width, date, description, + condition, } = {}, } = props; @@ -45,6 +46,7 @@ const DateTime: React.FC = (props) => { } = useFieldType({ path, validate: memoizedValidate, + condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Email/index.tsx b/src/admin/components/forms/field-types/Email/index.tsx index 3d2986d498..e857da0980 100644 --- a/src/admin/components/forms/field-types/Email/index.tsx +++ b/src/admin/components/forms/field-types/Email/index.tsx @@ -22,6 +22,7 @@ const Email: React.FC = (props) => { placeholder, autoComplete, description, + condition, } = {}, label, } = props; @@ -37,6 +38,7 @@ const Email: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, + condition, }); const { diff --git a/src/admin/components/forms/field-types/Number/index.tsx b/src/admin/components/forms/field-types/Number/index.tsx index 68b3ab708d..f0af81f922 100644 --- a/src/admin/components/forms/field-types/Number/index.tsx +++ b/src/admin/components/forms/field-types/Number/index.tsx @@ -25,6 +25,7 @@ const NumberField: React.FC = (props) => { step, placeholder, description, + condition, } = {}, } = props; @@ -44,6 +45,7 @@ const NumberField: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, + condition, }); const handleChange = useCallback((e) => { diff --git a/src/admin/components/forms/field-types/RadioGroup/index.tsx b/src/admin/components/forms/field-types/RadioGroup/index.tsx index 8a38ee48e0..e6aa893cd1 100644 --- a/src/admin/components/forms/field-types/RadioGroup/index.tsx +++ b/src/admin/components/forms/field-types/RadioGroup/index.tsx @@ -27,6 +27,7 @@ const RadioGroup: React.FC = (props) => { style, width, description, + condition, } = {}, options, } = props; @@ -46,6 +47,7 @@ const RadioGroup: React.FC = (props) => { } = useFieldType({ path, validate: memoizedValidate, + condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Relationship/index.tsx b/src/admin/components/forms/field-types/Relationship/index.tsx index e559cc2c97..059eec0553 100644 --- a/src/admin/components/forms/field-types/Relationship/index.tsx +++ b/src/admin/components/forms/field-types/Relationship/index.tsx @@ -37,6 +37,7 @@ const Relationship: React.FC = (props) => { style, width, description, + condition, } = {}, } = props; @@ -73,6 +74,7 @@ const Relationship: React.FC = (props) => { } = useFieldType({ path: path || name, validate: memoizedValidate, + condition, }); const addOptions = useCallback((data, relation) => { diff --git a/src/admin/components/forms/field-types/RichText/RichText.tsx b/src/admin/components/forms/field-types/RichText/RichText.tsx index e4a00d4c47..f1dc3056de 100644 --- a/src/admin/components/forms/field-types/RichText/RichText.tsx +++ b/src/admin/components/forms/field-types/RichText/RichText.tsx @@ -46,6 +46,7 @@ const RichText: React.FC = (props) => { placeholder, description, hideGutter, + condition, } = {}, } = props; @@ -106,6 +107,7 @@ const RichText: React.FC = (props) => { path, validate: memoizedValidate, stringify: true, + condition, }); const { diff --git a/src/admin/components/forms/field-types/Select/index.tsx b/src/admin/components/forms/field-types/Select/index.tsx index 4eac744113..097da0f50f 100644 --- a/src/admin/components/forms/field-types/Select/index.tsx +++ b/src/admin/components/forms/field-types/Select/index.tsx @@ -38,6 +38,7 @@ const Select: React.FC = (props) => { style, width, description, + condition, } = {}, } = props; @@ -58,6 +59,7 @@ const Select: React.FC = (props) => { } = useFieldType({ path, validate: memoizedValidate, + condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Text/index.tsx b/src/admin/components/forms/field-types/Text/index.tsx index ff6b1ab8ee..1854ca7d9b 100644 --- a/src/admin/components/forms/field-types/Text/index.tsx +++ b/src/admin/components/forms/field-types/Text/index.tsx @@ -22,6 +22,7 @@ const Text: React.FC = (props) => { style, width, description, + condition, } = {}, } = props; @@ -31,6 +32,7 @@ const Text: React.FC = (props) => { path, validate, enableDebouncedValue: true, + condition, }); const { diff --git a/src/admin/components/forms/field-types/Textarea/index.tsx b/src/admin/components/forms/field-types/Textarea/index.tsx index 0a7221886d..e221b48484 100644 --- a/src/admin/components/forms/field-types/Textarea/index.tsx +++ b/src/admin/components/forms/field-types/Textarea/index.tsx @@ -22,6 +22,7 @@ const Textarea: React.FC = (props) => { placeholder, rows, description, + condition, } = {}, label, minLength, @@ -44,6 +45,7 @@ const Textarea: React.FC = (props) => { path, validate: memoizedValidate, enableDebouncedValue: true, + condition, }); const classes = [ diff --git a/src/admin/components/forms/field-types/Upload/index.tsx b/src/admin/components/forms/field-types/Upload/index.tsx index d52e1ac6d8..d687ef5551 100644 --- a/src/admin/components/forms/field-types/Upload/index.tsx +++ b/src/admin/components/forms/field-types/Upload/index.tsx @@ -32,6 +32,7 @@ const Upload: React.FC = (props) => { style, width, description, + condition, } = {}, label, validate = upload, @@ -53,6 +54,7 @@ const Upload: React.FC = (props) => { const fieldType = useFieldType({ path, validate: memoizedValidate, + condition, }); const { diff --git a/src/admin/components/forms/useFieldType/index.tsx b/src/admin/components/forms/useFieldType/index.tsx index f3ca248378..9de075b9f3 100644 --- a/src/admin/components/forms/useFieldType/index.tsx +++ b/src/admin/components/forms/useFieldType/index.tsx @@ -13,6 +13,7 @@ const useFieldType = (options: Options): FieldType => { disableFormData, ignoreWhileFlattening, stringify, + condition, } = options; const formContext = useForm(); @@ -48,6 +49,7 @@ const useFieldType = (options: Options): FieldType => { ignoreWhileFlattening, initialValue, validate, + condition, value: valueToSend, valid: false, errorMessage: undefined, @@ -63,7 +65,7 @@ const useFieldType = (options: Options): FieldType => { } dispatchFields(fieldToDispatch); - }, [path, dispatchFields, validate, disableFormData, ignoreWhileFlattening, initialValue, stringify]); + }, [path, dispatchFields, validate, disableFormData, ignoreWhileFlattening, initialValue, stringify, condition]); // Method to return from `useFieldType`, used to // update internal field values from field component(s) diff --git a/src/admin/components/forms/useFieldType/types.ts b/src/admin/components/forms/useFieldType/types.ts index cb0ca529b0..6b65ef267c 100644 --- a/src/admin/components/forms/useFieldType/types.ts +++ b/src/admin/components/forms/useFieldType/types.ts @@ -1,4 +1,4 @@ -import { Validate } from '../../../../fields/config/types'; +import { Condition, Validate } from '../../../../fields/config/types'; export type Options = { path: string @@ -7,6 +7,7 @@ export type Options = { disableFormData?: boolean ignoreWhileFlattening?: boolean stringify?: boolean + condition?: Condition } export type FieldType = { From a105a486e8cf79806774f9764836a4274d7c14d3 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Mon, 2 Aug 2021 09:40:45 -0400 Subject: [PATCH 037/115] chore(release): v0.8.2 --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b914e690e5..b0b9fdd2ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [0.8.2](https://github.com/payloadcms/payload/compare/v0.8.1...v0.8.2) (2021-08-02) + + +### Bug Fixes + +* more advanced conditional logic edge cases ([33983de](https://github.com/payloadcms/payload/commit/33983deb3761813506348f8ff804a2117d1324ef)) + + +### Features + +* export error types ([12cba62](https://github.com/payloadcms/payload/commit/12cba62930b8d35b22e3a7a99cf06df29bd4964a)) + ## [0.8.1](https://github.com/payloadcms/payload/compare/v0.8.0...v0.8.1) (2021-07-29) diff --git a/package.json b/package.json index 061fda6923..b447f4a925 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.8.1", + "version": "0.8.2", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From 8af39472e19a26453647d1c1ab0bbce15db2c642 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 2 Aug 2021 16:38:52 -0400 Subject: [PATCH 038/115] feat: removes sanitization of configs before plugins are instantiated --- src/config/build.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/config/build.ts b/src/config/build.ts index e91e8859a5..d7d9a82f4c 100644 --- a/src/config/build.ts +++ b/src/config/build.ts @@ -7,12 +7,10 @@ import sanitize from './sanitize'; * @returns Built and sanitized Payload Config */ export function buildConfig(config: Config): SanitizedConfig { - const sanitized = sanitize(config); - if (Array.isArray(config.plugins)) { - const configWithPlugins = sanitized.plugins.reduce((updatedConfig, plugin) => plugin(updatedConfig), sanitized); + const configWithPlugins = config.plugins.reduce((updatedConfig, plugin) => plugin(updatedConfig), config); return sanitize(configWithPlugins); } - return sanitized; + return sanitize(config); } From 387bfea00831e5e881b42049ad50489d47f32550 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 2 Aug 2021 16:45:40 -0400 Subject: [PATCH 039/115] chore(release): v0.9.0 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0b9fdd2ae..654ca6cca8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [0.9.0](https://github.com/payloadcms/payload/compare/v0.8.2...v0.9.0) (2021-08-02) + + +### Features + +* removes sanitization of configs before plugins are instantiated ([8af3947](https://github.com/payloadcms/payload/commit/8af39472e19a26453647d1c1ab0bbce15db2c642)) + ## [0.8.2](https://github.com/payloadcms/payload/compare/v0.8.1...v0.8.2) (2021-08-02) diff --git a/package.json b/package.json index b447f4a925..564bec8c03 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.8.2", + "version": "0.9.0", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From 02c7ef11be5ea6ee5cf560dfddc954fcbf7e9f24 Mon Sep 17 00:00:00 2001 From: James Mikrut Date: Mon, 2 Aug 2021 17:17:02 -0400 Subject: [PATCH 040/115] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 654ca6cca8..ac0ec7dad8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # [0.9.0](https://github.com/payloadcms/payload/compare/v0.8.2...v0.9.0) (2021-08-02) +### BREAKING CHANGES + +* Due to greater plugin possibilities and performance enhancements, plugins themselves no longer accept a completely sanitized config. Instead, they accept a _validated_ config as-provided, but sanitization is now only performed after all plugins have been initialized. By config santitization, we refer to merging in default values and ensuring that the config has its full, required shape. What this now means for plugins is that within plugin code, deeply nested properties like `config.graphQL.mutations` will need to be accessed safely (optional chaining is great for this), because a user's config may not have defined `config.graphQL`. So, the only real breaking change here is are that plugins now need to safely access properties from an incoming config. ### Features From 4b51e9d9a15a7e49bc3d9525f4b383807a8e22c7 Mon Sep 17 00:00:00 2001 From: James Mikrut Date: Mon, 2 Aug 2021 17:17:56 -0400 Subject: [PATCH 041/115] Update overview.mdx --- docs/plugins/overview.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/plugins/overview.mdx b/docs/plugins/overview.mdx index 0622ccd25c..fcff43b9ea 100644 --- a/docs/plugins/overview.mdx +++ b/docs/plugins/overview.mdx @@ -76,9 +76,9 @@ export default config; #### When Plugins are initialized -Payload Plugins are executed _after_ the incoming config is validated, sanitized, and default options are merged in. +Payload Plugins are executed _after_ the incoming config is validated, but before it is sanitized and had default options merged in. -However, after all plugins are executed, the full config with all plugins will be re-sanitized. +After all plugins are executed, the full config with all plugins will be sanitized. ## Simple example From 01a191a13967d98ebf57891efd21b2607804e4e3 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 2 Aug 2021 21:57:50 -0400 Subject: [PATCH 042/115] feat: exposes collection after read hook type --- types.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/types.d.ts b/types.d.ts index fcc3a4473b..5f42216a2a 100644 --- a/types.d.ts +++ b/types.d.ts @@ -7,6 +7,7 @@ export { BeforeValidateHook as CollectionBeforeValidateHook, BeforeChangeHook as CollectionBeforeChangeHook, AfterChangeHook as CollectionAfterChangeHook, + AfterReadHook as CollectionAfterReadHook, BeforeReadHook as CollectionBeforeReadHook, BeforeDeleteHook as CollectionBeforeDeleteHook, AfterDeleteHook as CollectionAfterDeleteHook, From 4cc0ea1d81cd7579cb330091eb111a27262ff031 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 2 Aug 2021 21:58:44 -0400 Subject: [PATCH 043/115] fix: groups with failing conditions being incorrectly required on backend --- src/mongoose/buildSchema.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mongoose/buildSchema.ts b/src/mongoose/buildSchema.ts index f8c33d2ac1..3c1df5dba2 100644 --- a/src/mongoose/buildSchema.ts +++ b/src/mongoose/buildSchema.ts @@ -383,9 +383,12 @@ const fieldToSchemaMap = { }; }, group: (field: GroupField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { + let { required } = field; + if (field?.admin?.condition || field?.localized || field?.access?.create) required = false; + const baseSchema = { ...formatBaseSchema(field), - required: field.fields.some((subField) => subField.required === true), + required: required && field.fields.some((subField) => (subField.required && !subField.localized && !subField?.admin?.condition && !subField?.access?.create)), type: buildSchema(config, field.fields, { _id: false, id: false }), }; From 65db8d9fc2c8b556cc284966b9b69f5d6512aca5 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 2 Aug 2021 21:59:10 -0400 Subject: [PATCH 044/115] fix: relationship field access control in admin UI --- src/auth/operations/access.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auth/operations/access.ts b/src/auth/operations/access.ts index ed7db3dcfe..1f39c2f17b 100644 --- a/src/auth/operations/access.ts +++ b/src/auth/operations/access.ts @@ -30,7 +30,7 @@ async function accessOperation(args: Arguments): Promise { permission: true, where: result, }; - } else { + } else if (updatedObj[operation]?.permission !== false) { updatedObj[operation] = { permission: !!(result), }; From bb7e069b2b87e02588fb577d7769c07e758ea0fa Mon Sep 17 00:00:00 2001 From: James Date: Mon, 2 Aug 2021 22:03:18 -0400 Subject: [PATCH 045/115] chore(release): v0.9.1 --- CHANGELOG.md | 13 +++++++++++++ package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac0ec7dad8..e5800b8272 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [0.9.1](https://github.com/payloadcms/payload/compare/v0.9.0...v0.9.1) (2021-08-03) + + +### Bug Fixes + +* groups with failing conditions being incorrectly required on backend ([4cc0ea1](https://github.com/payloadcms/payload/commit/4cc0ea1d81cd7579cb330091eb111a27262ff031)) +* relationship field access control in admin UI ([65db8d9](https://github.com/payloadcms/payload/commit/65db8d9fc2c8b556cc284966b9b69f5d6512aca5)) + + +### Features + +* exposes collection after read hook type ([01a191a](https://github.com/payloadcms/payload/commit/01a191a13967d98ebf57891efd21b2607804e4e3)) + # [0.9.0](https://github.com/payloadcms/payload/compare/v0.8.2...v0.9.0) (2021-08-02) ### BREAKING CHANGES diff --git a/package.json b/package.json index 564bec8c03..cbb56d7362 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.9.0", + "version": "0.9.1", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From 907f8fd94d7e6cfa7eac0040c134cc714f29800d Mon Sep 17 00:00:00 2001 From: James Date: Wed, 4 Aug 2021 14:23:23 -0400 Subject: [PATCH 046/115] feat: reduces group heading from h2 to h3 --- src/admin/components/forms/field-types/Group/index.scss | 1 + src/admin/components/forms/field-types/Group/index.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/admin/components/forms/field-types/Group/index.scss b/src/admin/components/forms/field-types/Group/index.scss index 8fe4316e1d..f4e265db3c 100644 --- a/src/admin/components/forms/field-types/Group/index.scss +++ b/src/admin/components/forms/field-types/Group/index.scss @@ -4,6 +4,7 @@ margin-top: base(2); margin-bottom: base(2); display: flex; + position: relative; &__header { margin-bottom: base(1); diff --git a/src/admin/components/forms/field-types/Group/index.tsx b/src/admin/components/forms/field-types/Group/index.tsx index f7cef62acf..acbb3e0c8a 100644 --- a/src/admin/components/forms/field-types/Group/index.tsx +++ b/src/admin/components/forms/field-types/Group/index.tsx @@ -47,7 +47,7 @@ const Group: React.FC = (props) => { {(label || description) && (
{label && ( -

{label}

+

{label}

)} Date: Fri, 6 Aug 2021 10:40:40 -0400 Subject: [PATCH 047/115] feat: exposes auto-sized uploads on payload req --- docs/upload/overview.mdx | 6 ++++++ src/collections/operations/create.ts | 3 ++- src/collections/operations/update.ts | 2 +- src/express/types.ts | 1 + src/uploads/imageResizer.ts | 14 ++++++++++---- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index abcc7601fd..7a08cae598 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -113,6 +113,12 @@ The Payload Admin panel will also automatically display all available files, inc Behind the scenes, Payload relies on [`sharp`](https://sharp.pixelplumbing.com/api-resize#resize) to perform its image resizing. You can specify additional options for `sharp` to use while resizing your images. +##### Accessing the resized images in hooks + +All auto-resized images are exposed to be re-used in hooks and similar via an object that is bound to `req.payloadUploadSizes`. + +The object will have keys for each size generated, and each key will be set equal to a buffer containing the file data. + ### Admin thumbnails You can specify how Payload retrieves admin thumbnails for your upload-enabled Collections. This property accepts two different configurations: diff --git a/src/collections/operations/create.ts b/src/collections/operations/create.ts index 343c02da4f..3256df6d1d 100644 --- a/src/collections/operations/create.ts +++ b/src/collections/operations/create.ts @@ -104,7 +104,8 @@ async function create(this: Payload, incomingArgs: Arguments): Promise fileData.height = dimensions.height; if (Array.isArray(imageSizes) && file.mimetype !== 'image/svg+xml') { - fileData.sizes = await resizeAndSave(staticPath, collectionConfig, fsSafeName, fileData.mimeType); + req.payloadUploadSizes = {}; + fileData.sizes = await resizeAndSave(req, staticPath, collectionConfig, fsSafeName, fileData.mimeType); } } } catch (err) { diff --git a/src/collections/operations/update.ts b/src/collections/operations/update.ts index e37f4c7aed..d1a461514a 100644 --- a/src/collections/operations/update.ts +++ b/src/collections/operations/update.ts @@ -150,7 +150,7 @@ async function update(incomingArgs: Arguments): Promise { fileData.height = dimensions.height; if (Array.isArray(imageSizes) && file.mimetype !== 'image/svg+xml') { - fileData.sizes = await resizeAndSave(staticPath, collectionConfig, fsSafeName, fileData.mimeType); + fileData.sizes = await resizeAndSave(req, staticPath, collectionConfig, fsSafeName, fileData.mimeType); } } } catch (err) { diff --git a/src/express/types.ts b/src/express/types.ts index 741c66438b..e8b6644519 100644 --- a/src/express/types.ts +++ b/src/express/types.ts @@ -13,6 +13,7 @@ export type PayloadRequest = Request & { payloadAPI: 'REST' | 'local' | 'graphQL' file?: UploadedFile user: User | null + payloadUploadSizes?: Record findByID?: { [slug: string]: (q: unknown) => Document } diff --git a/src/uploads/imageResizer.ts b/src/uploads/imageResizer.ts index 7eb5cfe821..48766a21d5 100644 --- a/src/uploads/imageResizer.ts +++ b/src/uploads/imageResizer.ts @@ -5,6 +5,7 @@ import getImageSize from './getImageSize'; import fileExists from './fileExists'; import { SanitizedCollectionConfig } from '../collections/config/types'; import { FileSizes, ImageSize } from './types'; +import { PayloadRequest } from '../express/types'; function getOutputImage(sourceImage: string, size: ImageSize) { const extension = sourceImage.split('.').pop(); @@ -27,6 +28,7 @@ function getOutputImage(sourceImage: string, size: ImageSize) { * @returns image sizes keyed to strings */ export default async function resizeAndSave( + req: PayloadRequest, staticPath: string, config: SanitizedCollectionConfig, savedFilename: string, @@ -50,16 +52,20 @@ export default async function resizeAndSave( fs.unlinkSync(imagePath); } - const output = await sharp(sourceImage) + const resized = await sharp(sourceImage) .resize(desiredSize.width, desiredSize.height, { position: desiredSize.crop || 'centre', - }) - .toFile(imagePath); + }); + + const file = await resized.toFile(imagePath); + const buffer = await resized.toBuffer(); + + req.payloadUploadSizes[desiredSize.name] = buffer; return { ...desiredSize, filename: imageNameWithDimensions, - filesize: output.size, + filesize: file.size, mimeType, }; }); From dea54a4cccead86e6ffc9f20457f295e1c08405b Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 11:08:48 -0400 Subject: [PATCH 048/115] feat: allows upload resizing to maintain aspect ratio --- demo/collections/Media.ts | 6 ++++++ src/collections/config/schema.ts | 4 ++-- src/uploads/imageResizer.ts | 23 +++++++++++++++-------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/demo/collections/Media.ts b/demo/collections/Media.ts index 15eaadb168..7a8cf4f8ee 100644 --- a/demo/collections/Media.ts +++ b/demo/collections/Media.ts @@ -18,6 +18,12 @@ const Media: PayloadCollectionConfig = { staticDir: './media', adminThumbnail: ({ doc }) => `/media/${doc.filename}`, imageSizes: [ + { + name: 'maintainedAspectRatio', + width: 1024, + height: null, + crop: 'center', + }, { name: 'tablet', width: 640, diff --git a/src/collections/config/schema.ts b/src/collections/config/schema.ts index 65544af3cd..1fe0d31511 100644 --- a/src/collections/config/schema.ts +++ b/src/collections/config/schema.ts @@ -84,8 +84,8 @@ const collectionSchema = joi.object().keys({ imageSizes: joi.array().items( joi.object().keys({ name: joi.string(), - width: joi.number(), - height: joi.number(), + width: joi.number().allow(null), + height: joi.number().allow(null), crop: joi.string(), // TODO: add further specificity with joi.xor }), ), diff --git a/src/uploads/imageResizer.ts b/src/uploads/imageResizer.ts index 7eb5cfe821..69ecf66d30 100644 --- a/src/uploads/imageResizer.ts +++ b/src/uploads/imageResizer.ts @@ -41,8 +41,17 @@ export default async function resizeAndSave( const sizes = imageSizes .filter((desiredSize) => desiredSize.width < dimensions.width) .map(async (desiredSize) => { + const resized = await sharp(sourceImage) + .resize(desiredSize.width, desiredSize.height, { + position: desiredSize.crop || 'centre', + }); + + const bufferObject = await resized.toBuffer({ + resolveWithObject: true, + }); + const outputImage = getOutputImage(savedFilename, desiredSize); - const imageNameWithDimensions = `${outputImage.name}-${outputImage.width}x${outputImage.height}.${outputImage.extension}`; + const imageNameWithDimensions = `${outputImage.name}-${bufferObject.info.width}x${bufferObject.info.height}.${outputImage.extension}`; const imagePath = `${staticPath}/${imageNameWithDimensions}`; const fileAlreadyExists = await fileExists(imagePath); @@ -50,16 +59,14 @@ export default async function resizeAndSave( fs.unlinkSync(imagePath); } - const output = await sharp(sourceImage) - .resize(desiredSize.width, desiredSize.height, { - position: desiredSize.crop || 'centre', - }) - .toFile(imagePath); + await resized.toFile(imagePath); return { - ...desiredSize, + name: desiredSize.name, + width: bufferObject.info.width, + height: bufferObject.info.height, filename: imageNameWithDimensions, - filesize: output.size, + filesize: bufferObject.info.size, mimeType, }; }); From 8a022e3c55dc6d2bc81c558df53faee84f21f50b Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 11:11:51 -0400 Subject: [PATCH 049/115] docs: adds detail about maintaining aspect ratio --- docs/upload/overview.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index abcc7601fd..19267139f9 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -66,6 +66,16 @@ const Media = { width: 768, height: 1024, crop: 'centre', + }, + { + name: 'tablet', + width: 1024, + // By specifying `null` or leaving a height undefined, + // the image will be sized to a certain width, + // but it will retain its original aspect ratio + // and calculate a height automatically. + height: null, + crop: 'centre', } ], adminThumbnail: 'thumbnail', From d0982bf33295e42babbc90f4ad717efba3484090 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 11:36:51 -0400 Subject: [PATCH 050/115] chore: adds test for req.payloadUploadSizes --- demo/collections/Media.ts | 24 ++++++++++++++++++++++-- src/collections/operations/update.ts | 2 ++ src/collections/tests/uploads.spec.js | 6 ++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/demo/collections/Media.ts b/demo/collections/Media.ts index 7a8cf4f8ee..ae2962cf45 100644 --- a/demo/collections/Media.ts +++ b/demo/collections/Media.ts @@ -1,6 +1,17 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig, BeforeChangeHook } from '../../src/collections/config/types'; -const Media: PayloadCollectionConfig = { +const checkForUploadSizesHook: BeforeChangeHook = ({ req: { payloadUploadSizes }, data }) => { + if (typeof payloadUploadSizes === 'object') { + return { + ...data, + foundUploadSizes: true, + }; + } + + return data; +}; + +const Media: CollectionConfig = { slug: 'media', labels: { singular: 'Media', @@ -13,6 +24,11 @@ const Media: PayloadCollectionConfig = { enableRichTextRelationship: true, description: 'No selfies please', }, + hooks: { + beforeChange: [ + checkForUploadSizesHook, + ], + }, upload: { staticURL: '/media', staticDir: './media', @@ -51,6 +67,10 @@ const Media: PayloadCollectionConfig = { required: true, localized: true, }, + { + name: 'foundUploadSizes', + type: 'checkbox', + }, ], timestamps: true, }; diff --git a/src/collections/operations/update.ts b/src/collections/operations/update.ts index d1a461514a..0f60a23eb1 100644 --- a/src/collections/operations/update.ts +++ b/src/collections/operations/update.ts @@ -150,10 +150,12 @@ async function update(incomingArgs: Arguments): Promise { fileData.height = dimensions.height; if (Array.isArray(imageSizes) && file.mimetype !== 'image/svg+xml') { + req.payloadUploadSizes = {}; fileData.sizes = await resizeAndSave(req, staticPath, collectionConfig, fsSafeName, fileData.mimeType); } } } catch (err) { + console.error(err); throw new FileUploadError(); } diff --git a/src/collections/tests/uploads.spec.js b/src/collections/tests/uploads.spec.js index 3213c32b24..c8f1b1526b 100644 --- a/src/collections/tests/uploads.spec.js +++ b/src/collections/tests/uploads.spec.js @@ -99,6 +99,12 @@ describe('Collections - REST', () => { height: 480, }, }, + + // We have a hook to check if upload sizes + // are properly bound to the Payload `req`. + // This field should be automatically set + // if they are found. + foundUploadSizes: true, }, }); }); From f61643ac32617af0b09990f263018da2ba42591d Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 11:38:20 -0400 Subject: [PATCH 051/115] chore: revises types in demo --- demo/collections/Admin.ts | 4 ++-- demo/collections/AllFields.ts | 4 ++-- demo/collections/AutoLabel.ts | 4 ++-- demo/collections/Blocks.ts | 4 ++-- demo/collections/Code.ts | 4 ++-- demo/collections/Conditions.ts | 4 ++-- demo/collections/CustomComponents/index.ts | 4 ++-- demo/collections/DefaultValues.ts | 4 ++-- demo/collections/File.ts | 4 ++-- demo/collections/HiddenFields.ts | 4 ++-- demo/collections/Hooks.ts | 4 ++-- demo/collections/LocalOperations.ts | 4 ++-- demo/collections/Localized.ts | 4 ++-- demo/collections/LocalizedArray.ts | 4 ++-- demo/collections/NestedArrays.ts | 4 ++-- demo/collections/Preview.ts | 4 ++-- demo/collections/PublicUsers.ts | 4 ++-- demo/collections/RelationshipA.ts | 4 ++-- demo/collections/RelationshipB.ts | 4 ++-- demo/collections/RichText.ts | 4 ++-- demo/collections/Select.ts | 4 ++-- demo/collections/StrictPolicies.ts | 4 ++-- demo/collections/Uniques.ts | 4 ++-- demo/collections/Validations.ts | 4 ++-- demo/globals/BlocksGlobal.ts | 4 ++-- demo/globals/GlobalWithStrictAccess.ts | 4 ++-- demo/globals/NavigationArray.ts | 4 ++-- 27 files changed, 54 insertions(+), 54 deletions(-) diff --git a/demo/collections/Admin.ts b/demo/collections/Admin.ts index 9fdef8f80b..d89783ee78 100644 --- a/demo/collections/Admin.ts +++ b/demo/collections/Admin.ts @@ -1,4 +1,4 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import roles from '../access/roles'; import checkRole from '../access/checkRole'; @@ -7,7 +7,7 @@ const access = ({ req: { user } }) => { return result; }; -const Admin: PayloadCollectionConfig = { +const Admin: CollectionConfig = { slug: 'admins', labels: { singular: 'Admin', diff --git a/demo/collections/AllFields.ts b/demo/collections/AllFields.ts index d69518f41b..81569f3c62 100644 --- a/demo/collections/AllFields.ts +++ b/demo/collections/AllFields.ts @@ -1,4 +1,4 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import checkRole from '../access/checkRole'; import Email from '../blocks/Email'; import Quote from '../blocks/Quote'; @@ -6,7 +6,7 @@ import NumberBlock from '../blocks/Number'; import CallToAction from '../blocks/CallToAction'; import CollectionDescription from '../customComponents/CollectionDescription'; -const AllFields: PayloadCollectionConfig = { +const AllFields: CollectionConfig = { slug: 'all-fields', labels: { singular: 'All Fields', diff --git a/demo/collections/AutoLabel.ts b/demo/collections/AutoLabel.ts index cac61262f3..1dce0679bc 100644 --- a/demo/collections/AutoLabel.ts +++ b/demo/collections/AutoLabel.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const AutoLabel: PayloadCollectionConfig = { +const AutoLabel: CollectionConfig = { slug: 'auto-label', admin: { useAsTitle: 'autoLabelField', diff --git a/demo/collections/Blocks.ts b/demo/collections/Blocks.ts index 7c9a27ddd2..8bb338a8c3 100644 --- a/demo/collections/Blocks.ts +++ b/demo/collections/Blocks.ts @@ -1,10 +1,10 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import Email from '../blocks/Email'; import Quote from '../blocks/Quote'; import NumberBlock from '../blocks/Number'; import CallToAction from '../blocks/CallToAction'; -const Blocks: PayloadCollectionConfig = { +const Blocks: CollectionConfig = { slug: 'blocks', labels: { singular: 'Blocks', diff --git a/demo/collections/Code.ts b/demo/collections/Code.ts index 2bb4a87a2e..92593d0a23 100644 --- a/demo/collections/Code.ts +++ b/demo/collections/Code.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const Code: PayloadCollectionConfig = { +const Code: CollectionConfig = { slug: 'code', labels: { singular: 'Code', diff --git a/demo/collections/Conditions.ts b/demo/collections/Conditions.ts index 45e90687de..8bdc63e707 100644 --- a/demo/collections/Conditions.ts +++ b/demo/collections/Conditions.ts @@ -1,10 +1,10 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import Email from '../blocks/Email'; import Quote from '../blocks/Quote'; import NumberBlock from '../blocks/Number'; import CallToAction from '../blocks/CallToAction'; -const Conditions: PayloadCollectionConfig = { +const Conditions: CollectionConfig = { slug: 'conditions', labels: { singular: 'Conditions', diff --git a/demo/collections/CustomComponents/index.ts b/demo/collections/CustomComponents/index.ts index 804a028725..2320a8bc1a 100644 --- a/demo/collections/CustomComponents/index.ts +++ b/demo/collections/CustomComponents/index.ts @@ -1,4 +1,4 @@ -import { PayloadCollectionConfig } from '../../../src/collections/config/types'; +import { CollectionConfig } from '../../../src/collections/config/types'; import DescriptionField from './components/fields/Description/Field'; import DescriptionCell from './components/fields/Description/Cell'; import DescriptionFilter from './components/fields/Description/Filter'; @@ -9,7 +9,7 @@ import NestedText1Field from './components/fields/NestedText1/Field'; import ListView from './components/views/List'; import CustomDescriptionComponent from '../../customComponents/Description'; -const CustomComponents: PayloadCollectionConfig = { +const CustomComponents: CollectionConfig = { slug: 'custom-components', labels: { singular: 'Custom Component', diff --git a/demo/collections/DefaultValues.ts b/demo/collections/DefaultValues.ts index 2274fc5b62..0ca5882a30 100644 --- a/demo/collections/DefaultValues.ts +++ b/demo/collections/DefaultValues.ts @@ -1,11 +1,11 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import checkRole from '../access/checkRole'; import Email from '../blocks/Email'; import Quote from '../blocks/Quote'; import NumberBlock from '../blocks/Number'; import CallToAction from '../blocks/CallToAction'; -const DefaultValues: PayloadCollectionConfig = { +const DefaultValues: CollectionConfig = { slug: 'default-values', labels: { singular: 'Default Value Test', diff --git a/demo/collections/File.ts b/demo/collections/File.ts index be27ed319d..d7957a86c5 100644 --- a/demo/collections/File.ts +++ b/demo/collections/File.ts @@ -1,4 +1,4 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import checkRole from '../access/checkRole'; const access = ({ req: { user } }) => { @@ -19,7 +19,7 @@ const access = ({ req: { user } }) => { return false; }; -const Files: PayloadCollectionConfig = { +const Files: CollectionConfig = { slug: 'files', labels: { singular: 'File', diff --git a/demo/collections/HiddenFields.ts b/demo/collections/HiddenFields.ts index 7f71314157..98da52aa44 100644 --- a/demo/collections/HiddenFields.ts +++ b/demo/collections/HiddenFields.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const HiddenFields: PayloadCollectionConfig = { +const HiddenFields: CollectionConfig = { slug: 'hidden-fields', labels: { singular: 'Hidden Fields', diff --git a/demo/collections/Hooks.ts b/demo/collections/Hooks.ts index 94ee285896..89aa279872 100644 --- a/demo/collections/Hooks.ts +++ b/demo/collections/Hooks.ts @@ -1,8 +1,8 @@ /* eslint-disable no-param-reassign */ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const Hooks: PayloadCollectionConfig = { +const Hooks: CollectionConfig = { slug: 'hooks', labels: { singular: 'Hook', diff --git a/demo/collections/LocalOperations.ts b/demo/collections/LocalOperations.ts index 85fa205e59..2f2a2ba4e1 100644 --- a/demo/collections/LocalOperations.ts +++ b/demo/collections/LocalOperations.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const LocalOperations: PayloadCollectionConfig = { +const LocalOperations: CollectionConfig = { slug: 'local-operations', labels: { singular: 'Local Operation', diff --git a/demo/collections/Localized.ts b/demo/collections/Localized.ts index a2b561fcff..f222bb2a30 100644 --- a/demo/collections/Localized.ts +++ b/demo/collections/Localized.ts @@ -1,4 +1,4 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import { Block } from '../../src/fields/config/types'; const RichTextBlock: Block = { @@ -19,7 +19,7 @@ const RichTextBlock: Block = { ], }; -const LocalizedPosts: PayloadCollectionConfig = { +const LocalizedPosts: CollectionConfig = { slug: 'localized-posts', labels: { singular: 'Localized Post', diff --git a/demo/collections/LocalizedArray.ts b/demo/collections/LocalizedArray.ts index c37d404e37..f3881d9893 100644 --- a/demo/collections/LocalizedArray.ts +++ b/demo/collections/LocalizedArray.ts @@ -1,4 +1,4 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import { FieldAccess } from '../../src/fields/config/types'; import checkRole from '../access/checkRole'; @@ -12,7 +12,7 @@ const PublicReadabilityAccess: FieldAccess = ({ req: { user }, siblingData }) => return false; }; -const LocalizedArrays: PayloadCollectionConfig = { +const LocalizedArrays: CollectionConfig = { slug: 'localized-arrays', labels: { singular: 'Localized Array', diff --git a/demo/collections/NestedArrays.ts b/demo/collections/NestedArrays.ts index 0c2b8a4697..fc597d0509 100644 --- a/demo/collections/NestedArrays.ts +++ b/demo/collections/NestedArrays.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const NestedArray: PayloadCollectionConfig = { +const NestedArray: CollectionConfig = { slug: 'nested-arrays', labels: { singular: 'Nested Array', diff --git a/demo/collections/Preview.ts b/demo/collections/Preview.ts index abcfb2f12b..81c7c241fc 100644 --- a/demo/collections/Preview.ts +++ b/demo/collections/Preview.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const Preview: PayloadCollectionConfig = { +const Preview: CollectionConfig = { slug: 'previewable-post', labels: { singular: 'Previewable Post', diff --git a/demo/collections/PublicUsers.ts b/demo/collections/PublicUsers.ts index 2f6b3c2845..996b7fa382 100644 --- a/demo/collections/PublicUsers.ts +++ b/demo/collections/PublicUsers.ts @@ -1,9 +1,9 @@ import checkRole from '../access/checkRole'; -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; const access = ({ req: { user } }) => checkRole(['admin'], user); -const PublicUsers: PayloadCollectionConfig = { +const PublicUsers: CollectionConfig = { slug: 'public-users', labels: { singular: 'Public User', diff --git a/demo/collections/RelationshipA.ts b/demo/collections/RelationshipA.ts index 986e66a69f..0da9cbb70d 100644 --- a/demo/collections/RelationshipA.ts +++ b/demo/collections/RelationshipA.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const RelationshipA: PayloadCollectionConfig = { +const RelationshipA: CollectionConfig = { slug: 'relationship-a', access: { read: () => true, diff --git a/demo/collections/RelationshipB.ts b/demo/collections/RelationshipB.ts index f8203f349b..9b77ab92ea 100644 --- a/demo/collections/RelationshipB.ts +++ b/demo/collections/RelationshipB.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const RelationshipB: PayloadCollectionConfig = { +const RelationshipB: CollectionConfig = { slug: 'relationship-b', access: { read: () => true, diff --git a/demo/collections/RichText.ts b/demo/collections/RichText.ts index 632e8bbef0..e51996dfaa 100644 --- a/demo/collections/RichText.ts +++ b/demo/collections/RichText.ts @@ -1,8 +1,8 @@ import Button from '../client/components/richText/elements/Button'; import PurpleBackground from '../client/components/richText/leaves/PurpleBackground'; -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const RichText: PayloadCollectionConfig = { +const RichText: CollectionConfig = { slug: 'rich-text', labels: { singular: 'Rich Text', diff --git a/demo/collections/Select.ts b/demo/collections/Select.ts index ba04d84121..aa85c5cce3 100644 --- a/demo/collections/Select.ts +++ b/demo/collections/Select.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const Select: PayloadCollectionConfig = { +const Select: CollectionConfig = { slug: 'select', labels: { singular: 'Select', diff --git a/demo/collections/StrictPolicies.ts b/demo/collections/StrictPolicies.ts index 86ff0adc25..2164d877f0 100644 --- a/demo/collections/StrictPolicies.ts +++ b/demo/collections/StrictPolicies.ts @@ -1,7 +1,7 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; import checkRole from '../access/checkRole'; -const StrictAccess: PayloadCollectionConfig = { +const StrictAccess: CollectionConfig = { slug: 'strict-access', labels: { singular: 'Strict Access', diff --git a/demo/collections/Uniques.ts b/demo/collections/Uniques.ts index 2438397add..1ac59a60d4 100644 --- a/demo/collections/Uniques.ts +++ b/demo/collections/Uniques.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const Uniques: PayloadCollectionConfig = { +const Uniques: CollectionConfig = { slug: 'uniques', labels: { singular: 'Unique', diff --git a/demo/collections/Validations.ts b/demo/collections/Validations.ts index c2982b7572..cf8bd95253 100644 --- a/demo/collections/Validations.ts +++ b/demo/collections/Validations.ts @@ -1,6 +1,6 @@ -import { PayloadCollectionConfig } from '../../src/collections/config/types'; +import { CollectionConfig } from '../../src/collections/config/types'; -const Validations: PayloadCollectionConfig = { +const Validations: CollectionConfig = { slug: 'validations', labels: { singular: 'Validation', diff --git a/demo/globals/BlocksGlobal.ts b/demo/globals/BlocksGlobal.ts index afbadfefa3..ddd7066bf1 100644 --- a/demo/globals/BlocksGlobal.ts +++ b/demo/globals/BlocksGlobal.ts @@ -1,7 +1,7 @@ import checkRole from '../access/checkRole'; import Quote from '../blocks/Quote'; import CallToAction from '../blocks/CallToAction'; -import { PayloadGlobalConfig } from '../../src/globals/config/types'; +import { GlobalConfig } from '../../src/globals/config/types'; export default { slug: 'blocks-global', @@ -19,4 +19,4 @@ export default { localized: true, }, ], -} as PayloadGlobalConfig; +} as GlobalConfig; diff --git a/demo/globals/GlobalWithStrictAccess.ts b/demo/globals/GlobalWithStrictAccess.ts index 772abf3945..aacbab889d 100644 --- a/demo/globals/GlobalWithStrictAccess.ts +++ b/demo/globals/GlobalWithStrictAccess.ts @@ -1,4 +1,4 @@ -import { PayloadGlobalConfig } from '../../src/globals/config/types'; +import { GlobalConfig } from '../../src/globals/config/types'; import checkRole from '../access/checkRole'; export default { @@ -32,4 +32,4 @@ export default { required: true, }, ], -} as PayloadGlobalConfig; +} as GlobalConfig; diff --git a/demo/globals/NavigationArray.ts b/demo/globals/NavigationArray.ts index f7384ffd33..e9da709b88 100644 --- a/demo/globals/NavigationArray.ts +++ b/demo/globals/NavigationArray.ts @@ -1,4 +1,4 @@ -import { PayloadGlobalConfig } from '../../src/globals/config/types'; +import { GlobalConfig } from '../../src/globals/config/types'; import checkRole from '../access/checkRole'; export default { @@ -27,4 +27,4 @@ export default { }], }, ], -} as PayloadGlobalConfig; +} as GlobalConfig; From 9661c6d40acc41d21eebc42b0cc1871f28d35a73 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 12:18:20 -0400 Subject: [PATCH 052/115] feat: allow completely disabling local file storage --- demo/collections/UnstoredMedia.ts | 35 +++++++++++++++++++++++++ demo/payload.config.ts | 2 ++ docs/upload/overview.mdx | 25 +++++++++++++----- src/collections/config/schema.ts | 1 + src/collections/operations/create.ts | 15 ++++++----- src/collections/operations/update.ts | 10 +++++--- src/collections/tests/uploads.spec.js | 37 +++++++++++++++++++++++++++ src/uploads/getImageSize.ts | 9 +++---- src/uploads/imageResizer.ts | 16 ++++++------ src/uploads/types.ts | 2 ++ 10 files changed, 122 insertions(+), 30 deletions(-) create mode 100644 demo/collections/UnstoredMedia.ts diff --git a/demo/collections/UnstoredMedia.ts b/demo/collections/UnstoredMedia.ts new file mode 100644 index 0000000000..2ef589f0e1 --- /dev/null +++ b/demo/collections/UnstoredMedia.ts @@ -0,0 +1,35 @@ +import { CollectionConfig } from '../../src/collections/config/types'; + +const UnstoredMedia: CollectionConfig = { + slug: 'unstored-media', + labels: { + singular: 'Unstored Media', + plural: 'Unstored Media', + }, + access: { + read: () => true, + }, + upload: { + staticURL: '/unstored-media', + disableLocalStorage: true, + imageSizes: [ + { + name: 'tablet', + width: 640, + height: 480, + crop: 'left top', + }, + ], + }, + fields: [ + { + name: 'alt', + label: 'Alt Text', + type: 'text', + required: true, + localized: true, + }, + ], +}; + +export default UnstoredMedia; diff --git a/demo/payload.config.ts b/demo/payload.config.ts index ba43ea5e92..b621c7ed21 100644 --- a/demo/payload.config.ts +++ b/demo/payload.config.ts @@ -30,6 +30,7 @@ import Uniques from './collections/Uniques'; import BlocksGlobal from './globals/BlocksGlobal'; import NavigationArray from './globals/NavigationArray'; import GlobalWithStrictAccess from './globals/GlobalWithStrictAccess'; +import UnstoredMedia from './collections/UnstoredMedia'; export default buildConfig({ cookiePrefix: 'payload', @@ -81,6 +82,7 @@ export default buildConfig({ StrictPolicies, Validations, Uniques, + UnstoredMedia, ], globals: [ NavigationArray, diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index c9bd17e533..248398e3e3 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -37,13 +37,14 @@ Every Payload Collection can opt-in to supporting Uploads by specifying the `upl #### Collection Upload Options -| Option | Description | -| ---------------------- | -------------| -| **`staticURL`** * | The base URL path to use to access you uploads. Example: `/media` | -| **`staticDir`** * | The folder directory to use to store media in. Can be either an absolute path or relative to the directory that contains your config. | -| **`imageSizes`** | If specified, image uploads will be automatically resized in accordance to these image sizes. [More](#image-sizes) | -| **`adminThumbnail`** | Set the way that the Admin panel will display thumbnails for this Collection. [More](#admin-thumbnails) | -| **`mimeTypes`** | Restrict mimeTypes in the file picker. Array of valid mimetypes or mimetype wildcards [More](#mimetypes) | +| Option | Description | +| ------------------------- | -------------| +| **`staticURL`** * | The base URL path to use to access you uploads. Example: `/media` | +| **`staticDir`** * | The folder directory to use to store media in. Can be either an absolute path or relative to the directory that contains your config. | +| **`imageSizes`** | If specified, image uploads will be automatically resized in accordance to these image sizes. [More](#image-sizes) | +| **`adminThumbnail`** | Set the way that the Admin panel will display thumbnails for this Collection. [More](#admin-thumbnails) | +| **`mimeTypes`** | Restrict mimeTypes in the file picker. Array of valid mimetypes or mimetype wildcards [More](#mimetypes) | +| **`disableLocalStorage`** | Completely disable uploading files to disk locally. [More](#disabling-local-upload-storage) | *An asterisk denotes that a property above is required.* @@ -129,6 +130,16 @@ All auto-resized images are exposed to be re-used in hooks and similar via an ob The object will have keys for each size generated, and each key will be set equal to a buffer containing the file data. +### Disabling Local Upload Storage + +If you are using a plugin to send your files off to a third-party file storage host or CDN, like Amazon S3 or similar, you may not want to store your files locally at all. You can prevent Payload from writing files to disk by specifying `disableLocalStorage: true` on your collection's upload config. + + + Note:
+ This is a fairly advanced feature. If you do disable local file storage, by default, your admin panel's thumbnails will be broken as you will not have stored a file. It will be totally up to you to use either a plugin or your own hooks to store your files in a permanent manner, as well as provide your own admin thumbnail using upload.adminThumbnail. +
+Note: you need to manually provide + ### Admin thumbnails You can specify how Payload retrieves admin thumbnails for your upload-enabled Collections. This property accepts two different configurations: diff --git a/src/collections/config/schema.ts b/src/collections/config/schema.ts index 1fe0d31511..a516fbe698 100644 --- a/src/collections/config/schema.ts +++ b/src/collections/config/schema.ts @@ -77,6 +77,7 @@ const collectionSchema = joi.object().keys({ joi.object({ staticURL: joi.string(), staticDir: joi.string(), + disableLocalStorage: joi.bool(), adminThumbnail: joi.alternatives().try( joi.string(), joi.func(), diff --git a/src/collections/operations/create.ts b/src/collections/operations/create.ts index 3256df6d1d..7c0a9a2d9d 100644 --- a/src/collections/operations/create.ts +++ b/src/collections/operations/create.ts @@ -77,7 +77,7 @@ async function create(this: Payload, incomingArgs: Arguments): Promise if (collectionConfig.upload) { const fileData: Partial = {}; - const { staticDir, imageSizes } = collectionConfig.upload; + const { staticDir, imageSizes, disableLocalStorage } = collectionConfig.upload; const file = ((req.files && req.files.file) ? req.files.file : req.file) as UploadedFile; @@ -91,21 +91,25 @@ async function create(this: Payload, incomingArgs: Arguments): Promise staticPath = path.join(config.paths.configDir, staticDir); } - mkdirp.sync(staticPath); + if (!disableLocalStorage) { + mkdirp.sync(staticPath); + } const fsSafeName = await getSafeFilename(staticPath, file.name); try { - await saveBufferToFile(file.data, `${staticPath}/${fsSafeName}`); + if (!disableLocalStorage) { + await saveBufferToFile(file.data, `${staticPath}/${fsSafeName}`); + } if (isImage(file.mimetype)) { - const dimensions = await getImageSize(`${staticPath}/${fsSafeName}`); + const dimensions = await getImageSize(file); fileData.width = dimensions.width; fileData.height = dimensions.height; if (Array.isArray(imageSizes) && file.mimetype !== 'image/svg+xml') { req.payloadUploadSizes = {}; - fileData.sizes = await resizeAndSave(req, staticPath, collectionConfig, fsSafeName, fileData.mimeType); + fileData.sizes = await resizeAndSave(req, file.data, dimensions, staticPath, collectionConfig, fsSafeName, fileData.mimeType); } } } catch (err) { @@ -113,7 +117,6 @@ async function create(this: Payload, incomingArgs: Arguments): Promise throw new FileUploadError(); } - fileData.filename = fsSafeName; fileData.filesize = file.size; fileData.mimeType = file.mimetype; diff --git a/src/collections/operations/update.ts b/src/collections/operations/update.ts index 0f60a23eb1..a0f6517c44 100644 --- a/src/collections/operations/update.ts +++ b/src/collections/operations/update.ts @@ -124,7 +124,7 @@ async function update(incomingArgs: Arguments): Promise { if (collectionConfig.upload) { const fileData: Partial = {}; - const { staticDir, imageSizes } = collectionConfig.upload; + const { staticDir, imageSizes, disableLocalStorage } = collectionConfig.upload; let staticPath = staticDir; @@ -138,20 +138,22 @@ async function update(incomingArgs: Arguments): Promise { const fsSafeName = await getSafeFilename(staticPath, file.name); try { - await saveBufferToFile(file.data, `${staticPath}/${fsSafeName}`); + if (!disableLocalStorage) { + await saveBufferToFile(file.data, `${staticPath}/${fsSafeName}`); + } fileData.filename = fsSafeName; fileData.filesize = file.size; fileData.mimeType = file.mimetype; if (isImage(file.mimetype)) { - const dimensions = await getImageSize(`${staticPath}/${fsSafeName}`); + const dimensions = await getImageSize(file); fileData.width = dimensions.width; fileData.height = dimensions.height; if (Array.isArray(imageSizes) && file.mimetype !== 'image/svg+xml') { req.payloadUploadSizes = {}; - fileData.sizes = await resizeAndSave(req, staticPath, collectionConfig, fsSafeName, fileData.mimeType); + fileData.sizes = await resizeAndSave(req, file.data, dimensions, staticPath, collectionConfig, fsSafeName, fileData.mimeType); } } } catch (err) { diff --git a/src/collections/tests/uploads.spec.js b/src/collections/tests/uploads.spec.js index c8f1b1526b..ffb04c185f 100644 --- a/src/collections/tests/uploads.spec.js +++ b/src/collections/tests/uploads.spec.js @@ -109,6 +109,43 @@ describe('Collections - REST', () => { }); }); + it('creates media without storing a file', async () => { + const formData = new FormData(); + formData.append('file', fs.createReadStream(path.join(__dirname, '../../..', 'tests/api/assets/image.png'))); + formData.append('alt', 'test media'); + formData.append('locale', 'en'); + + const response = await fetch(`${url}/api/unstored-media`, { + body: formData, + headers, + method: 'post', + }); + + const data = await response.json(); + + expect(response.status).toBe(201); + + // Check for files + expect(await !fileExists(path.join(mediaDir, 'image.png'))).toBe(false); + expect(await !fileExists(path.join(mediaDir, 'image-640x480.png'))).toBe(false); + + // Check api response + expect(data).toMatchObject({ + doc: { + alt: 'test media', + filename: 'image.png', + mimeType: 'image/png', + sizes: { + tablet: { + filename: 'image-640x480.png', + width: 640, + height: 480, + }, + }, + }, + }); + }); + it('creates with same name', async () => { const formData = new FormData(); formData.append('file', fs.createReadStream(path.join(__dirname, '../../..', 'tests/api/assets/samename.png'))); diff --git a/src/uploads/getImageSize.ts b/src/uploads/getImageSize.ts index 805d9dcf3d..4a24c86ce5 100644 --- a/src/uploads/getImageSize.ts +++ b/src/uploads/getImageSize.ts @@ -1,14 +1,13 @@ -import fs from 'fs'; +import { UploadedFile } from 'express-fileupload'; import probeImageSize from 'probe-image-size'; -type ProbedImageSize = { +export type ProbedImageSize = { width: number, height: number, type: string, mime: string, } -export default async function (path: string): Promise { - const image = fs.createReadStream(path); - return probeImageSize(image); +export default async function (image: UploadedFile): Promise { + return probeImageSize.sync(image.data); } diff --git a/src/uploads/imageResizer.ts b/src/uploads/imageResizer.ts index 0af840e3db..a6706c5066 100644 --- a/src/uploads/imageResizer.ts +++ b/src/uploads/imageResizer.ts @@ -1,7 +1,7 @@ import fs from 'fs'; import sharp from 'sharp'; import sanitize from 'sanitize-filename'; -import getImageSize from './getImageSize'; +import { ProbedImageSize } from './getImageSize'; import fileExists from './fileExists'; import { SanitizedCollectionConfig } from '../collections/config/types'; import { FileSizes, ImageSize } from './types'; @@ -29,21 +29,19 @@ function getOutputImage(sourceImage: string, size: ImageSize) { */ export default async function resizeAndSave( req: PayloadRequest, + file: Buffer, + dimensions: ProbedImageSize, staticPath: string, config: SanitizedCollectionConfig, savedFilename: string, mimeType: string, ): Promise { - const { imageSizes } = config.upload; - - const sourceImage = `${staticPath}/${savedFilename}`; - - const dimensions = await getImageSize(sourceImage); + const { imageSizes, disableLocalStorage } = config.upload; const sizes = imageSizes .filter((desiredSize) => desiredSize.width < dimensions.width) .map(async (desiredSize) => { - const resized = await sharp(sourceImage) + const resized = await sharp(file) .resize(desiredSize.width, desiredSize.height, { position: desiredSize.crop || 'centre', }); @@ -63,7 +61,9 @@ export default async function resizeAndSave( fs.unlinkSync(imagePath); } - await resized.toFile(imagePath); + if (!disableLocalStorage) { + await resized.toFile(imagePath); + } return { name: desiredSize.name, diff --git a/src/uploads/types.ts b/src/uploads/types.ts index f2e4c981d5..1eee67e616 100644 --- a/src/uploads/types.ts +++ b/src/uploads/types.ts @@ -33,6 +33,7 @@ export type IncomingUploadType = { imageSizes?: ImageSize[]; staticURL?: string; staticDir?: string; + disableLocalStorage?: boolean adminThumbnail?: string | GetAdminThumbnail; mimeTypes?: string[]; } @@ -42,6 +43,7 @@ export type Upload = { imageSizes?: ImageSize[] staticURL: string staticDir: string + disableLocalStorage: boolean adminThumbnail?: string | GetAdminThumbnail mimeTypes?: string[]; } From 3cf01964deadc37f8683f5eae51a5467830993f1 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 12:26:18 -0400 Subject: [PATCH 053/115] chore(release): v0.9.2 --- CHANGELOG.md | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5800b8272..079b691873 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## [0.9.2](https://github.com/payloadcms/payload/compare/v0.9.1...v0.9.2) (2021-08-06) + + +### Bug Fixes + +* row admin type ([deef520](https://github.com/payloadcms/payload/commit/deef5202c15301b685fe5efc8a6ff59b012ea1d4)) + + +### Features + +* allow completely disabling local file storage ([9661c6d](https://github.com/payloadcms/payload/commit/9661c6d40acc41d21eebc42b0cc1871f28d35a73)) +* allows upload resizing to maintain aspect ratio ([dea54a4](https://github.com/payloadcms/payload/commit/dea54a4cccead86e6ffc9f20457f295e1c08405b)) +* exposes auto-sized uploads on payload req ([9c8935f](https://github.com/payloadcms/payload/commit/9c8935fd51439627cccf3f6625236375f5909445)) +* reduces group heading from h2 to h3 ([907f8fd](https://github.com/payloadcms/payload/commit/907f8fd94d7e6cfa7eac0040c134cc714f29800d)) + ## [0.9.1](https://github.com/payloadcms/payload/compare/v0.9.0...v0.9.1) (2021-08-03) diff --git a/package.json b/package.json index cbb56d7362..f3ec03a534 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.9.1", + "version": "0.9.2", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From a5ea0ff61945f3da106f0d9dbb6a90fb1d884061 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 12:38:31 -0400 Subject: [PATCH 054/115] fix: args no longer optional in collection and global hooks --- src/collections/config/types.ts | 22 +++++++++++----------- src/globals/config/types.ts | 10 +++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/collections/config/types.ts b/src/collections/config/types.ts index 20821d8321..30d6cc79b7 100644 --- a/src/collections/config/types.ts +++ b/src/collections/config/types.ts @@ -25,49 +25,49 @@ export type HookOperationType = | 'login' | 'forgotPassword'; -export type BeforeOperationHook = (args?: { +export type BeforeOperationHook = (args: { args?: any; operation: HookOperationType; }) => any; -export type BeforeValidateHook = (args?: { +export type BeforeValidateHook = (args: { data?: any; req?: PayloadRequest; operation: 'create' | 'update'; originalDoc?: any; // undefined on 'create' operation }) => any; -export type BeforeChangeHook = (args?: { +export type BeforeChangeHook = (args: { data: any; req: PayloadRequest; operation: 'create' | 'update' originalDoc?: any; // undefined on 'create' operation }) => any; -export type AfterChangeHook = (args?: { +export type AfterChangeHook = (args: { doc: any; req: PayloadRequest; operation: 'create' | 'update'; }) => any; -export type BeforeReadHook = (args?: { +export type BeforeReadHook = (args: { doc: any; req: PayloadRequest; query: { [key: string]: any }; }) => any; -export type AfterReadHook = (args?: { +export type AfterReadHook = (args: { doc: any; req: PayloadRequest; query?: { [key: string]: any }; }) => any; -export type BeforeDeleteHook = (args?: { +export type BeforeDeleteHook = (args: { req: PayloadRequest; id: string; }) => any; -export type AfterDeleteHook = (args?: { +export type AfterDeleteHook = (args: { req: PayloadRequest; id: string; doc: any; @@ -75,17 +75,17 @@ export type AfterDeleteHook = (args?: { export type AfterErrorHook = (err: Error, res: unknown) => { response: any, status: number } | void; -export type BeforeLoginHook = (args?: { +export type BeforeLoginHook = (args: { req: PayloadRequest; }) => any; -export type AfterLoginHook = (args?: { +export type AfterLoginHook = (args: { req: PayloadRequest; doc: any; token: string; }) => any; -export type AfterForgotPasswordHook = (args?: { +export type AfterForgotPasswordHook = (args: { args?: any; }) => any; diff --git a/src/globals/config/types.ts b/src/globals/config/types.ts index e74851e7e1..1a7edc2bb0 100644 --- a/src/globals/config/types.ts +++ b/src/globals/config/types.ts @@ -5,30 +5,30 @@ import { PayloadRequest } from '../../express/types'; import { Access, GeneratePreviewURL } from '../../config/types'; import { Field } from '../../fields/config/types'; -export type BeforeValidateHook = (args?: { +export type BeforeValidateHook = (args: { data?: any; req?: PayloadRequest; originalDoc?: any; }) => any; -export type BeforeChangeHook = (args?: { +export type BeforeChangeHook = (args: { data: any; req: PayloadRequest; originalDoc?: any; }) => any; -export type AfterChangeHook = (args?: { +export type AfterChangeHook = (args: { doc: any; req: PayloadRequest; }) => any; -export type BeforeReadHook = (args?: { +export type BeforeReadHook = (args: { doc: any; req: PayloadRequest; query: { [key: string]: any }; }) => any; -export type AfterReadHook = (args?: { +export type AfterReadHook = (args: { doc: any; req: PayloadRequest; query?: { [key: string]: any }; From 1d4f604270bc8c05d2355a25dd37a1d8c30b3360 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 12:41:05 -0400 Subject: [PATCH 055/115] chore(release): v0.9.3 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 079b691873..c768840676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [0.9.3](https://github.com/payloadcms/payload/compare/v0.9.2...v0.9.3) (2021-08-06) + + +### Bug Fixes + +* args no longer optional in collection and global hooks ([a5ea0ff](https://github.com/payloadcms/payload/commit/a5ea0ff61945f3da106f0d9dbb6a90fb1d884061)) + ## [0.9.2](https://github.com/payloadcms/payload/compare/v0.9.1...v0.9.2) (2021-08-06) diff --git a/package.json b/package.json index f3ec03a534..b50f5907a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.9.2", + "version": "0.9.3", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From 8534eeea85ee808fcb129a1748221fed1c88a534 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 12:53:45 -0400 Subject: [PATCH 056/115] docs: typo --- docs/upload/overview.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index 248398e3e3..f465f3ac28 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -138,7 +138,6 @@ If you are using a plugin to send your files off to a third-party file storage h Note:
This is a fairly advanced feature. If you do disable local file storage, by default, your admin panel's thumbnails will be broken as you will not have stored a file. It will be totally up to you to use either a plugin or your own hooks to store your files in a permanent manner, as well as provide your own admin thumbnail using upload.adminThumbnail. -Note: you need to manually provide ### Admin thumbnails From 20a1ed7da87867d20e264d38e0026427b620217f Mon Sep 17 00:00:00 2001 From: James Date: Fri, 6 Aug 2021 12:56:02 -0400 Subject: [PATCH 057/115] chore(release): v0.9.4 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c768840676..b47dbcc077 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +## [0.9.4](https://github.com/payloadcms/payload/compare/v0.9.3...v0.9.4) (2021-08-06) + ## [0.9.3](https://github.com/payloadcms/payload/compare/v0.9.2...v0.9.3) (2021-08-06) diff --git a/package.json b/package.json index b50f5907a6..b3c0a13312 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.9.3", + "version": "0.9.4", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From cb422bb4c6758607592127f1bc4e0d1a20378945 Mon Sep 17 00:00:00 2001 From: James Date: Thu, 12 Aug 2021 23:05:21 -0400 Subject: [PATCH 058/115] docs: accuracy improvements --- docs/configuration/collections.mdx | 5 +---- docs/configuration/globals.mdx | 5 +---- docs/configuration/overview.mdx | 7 ++----- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index d3db66be14..05fc8c031c 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -127,8 +127,5 @@ import { CollectionConfig } from 'payload/types'; import { SanitizedCollectionConfig } from 'payload/types'; // This is the type used after an incoming collection config is fully sanitized. - -// If you are building a plugin, you might benefit from this type, -// as plugins interact will fully defaulted, sanitized, and validated -// collection configs. +// Generally, this is only used internally by Payload. ``` diff --git a/docs/configuration/globals.mdx b/docs/configuration/globals.mdx index ac180e4b5a..c807b92cb8 100644 --- a/docs/configuration/globals.mdx +++ b/docs/configuration/globals.mdx @@ -87,8 +87,5 @@ import { GlobalConfig } from 'payload/types'; import { SanitizedGlobalConfig } from 'payload/types'; // This is the type used after an incoming global config is fully sanitized. - -// If you are building a plugin, you might benefit from this type, -// as plugins interact will fully defaulted, sanitized, and validated -// global configs. +// Generally, this is only used internally by Payload. ``` diff --git a/docs/configuration/overview.mdx b/docs/configuration/overview.mdx index 50eb3e62e0..c18434afa5 100644 --- a/docs/configuration/overview.mdx +++ b/docs/configuration/overview.mdx @@ -148,7 +148,7 @@ import { config } from 'payload/babel'; ### TypeScript -You can import collection types as follows: +You can import config types as follows: ```js import { Config } from 'payload/config'; @@ -161,8 +161,5 @@ import { Config } from 'payload/config'; import { SanitizedConfig } from 'payload/config'; // This is the type used after an incoming Payload config is fully sanitized. - -// If you are building a plugin, you might benefit from this type, -// as plugins interact will fully defaulted, sanitized, and validated -// Payload configs. +// Generally, this is only used internally by Payload. ``` From b21316b6cc392c793614024648c5301c7e03c326 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 18 Aug 2021 14:30:58 -0400 Subject: [PATCH 059/115] fix: windows compatible absolute paths for staticDir --- src/collections/operations/create.ts | 2 +- src/collections/operations/update.ts | 2 +- yarn.lock | 1079 ++++++++++++++------------ 3 files changed, 596 insertions(+), 487 deletions(-) diff --git a/src/collections/operations/create.ts b/src/collections/operations/create.ts index 7c0a9a2d9d..2e3533adb4 100644 --- a/src/collections/operations/create.ts +++ b/src/collections/operations/create.ts @@ -88,7 +88,7 @@ async function create(this: Payload, incomingArgs: Arguments): Promise let staticPath = staticDir; if (staticDir.indexOf('/') !== 0) { - staticPath = path.join(config.paths.configDir, staticDir); + staticPath = path.resolve(config.paths.configDir, staticDir); } if (!disableLocalStorage) { diff --git a/src/collections/operations/update.ts b/src/collections/operations/update.ts index a0f6517c44..c516696f98 100644 --- a/src/collections/operations/update.ts +++ b/src/collections/operations/update.ts @@ -129,7 +129,7 @@ async function update(incomingArgs: Arguments): Promise { let staticPath = staticDir; if (staticDir.indexOf('/') !== 0) { - staticPath = path.join(config.paths.configDir, staticDir); + staticPath = path.resolve(config.paths.configDir, staticDir); } const file = ((req.files && req.files.file) ? req.files.file : req.file) as UploadedFile; diff --git a/yarn.lock b/yarn.lock index 7454b593c1..0feabca4bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,25 +25,25 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": - version "7.14.7" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" - integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== "@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.7.5": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz#20cdf7c84b5d86d83fac8710a8bc605a7ba3f010" - integrity sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q== + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8" + integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.8" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.8" + "@babel/generator" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" + "@babel/helper-module-transforms" "^7.15.0" "@babel/helpers" "^7.14.8" - "@babel/parser" "^7.14.8" + "@babel/parser" "^7.15.0" "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.8" - "@babel/types" "^7.14.8" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -51,12 +51,12 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.14.8": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz#bf86fd6af96cf3b74395a8ca409515f89423e070" - integrity sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg== +"@babel/generator@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" + integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== dependencies: - "@babel/types" "^7.14.8" + "@babel/types" "^7.15.0" jsesc "^2.5.1" source-map "^0.5.0" @@ -75,26 +75,26 @@ "@babel/helper-explode-assignable-expression" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" - integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" + integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.15.0" "@babel/helper-validator-option" "^7.14.5" browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz#a6f8c3de208b1e5629424a9a63567f56501955fc" - integrity sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ== +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz#c9a137a4d137b2d0e2c649acf536d7ba1a76c0f7" + integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q== dependencies: "@babel/helper-annotate-as-pure" "^7.14.5" "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.14.7" + "@babel/helper-member-expression-to-functions" "^7.15.0" "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" "@babel/helper-split-export-declaration" "^7.14.5" "@babel/helper-create-regexp-features-plugin@^7.14.5": @@ -149,12 +149,12 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-member-expression-to-functions@^7.14.5", "@babel/helper-member-expression-to-functions@^7.14.7": - version "7.14.7" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" - integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== +"@babel/helper-member-expression-to-functions@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" + integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.0" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": version "7.14.5" @@ -163,19 +163,19 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.14.8": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz#d4279f7e3fd5f4d5d342d833af36d4dd87d7dc49" - integrity sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA== +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" + integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== dependencies: "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" "@babel/helper-simple-access" "^7.14.8" "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.8" + "@babel/helper-validator-identifier" "^7.14.9" "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.8" - "@babel/types" "^7.14.8" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" @@ -198,17 +198,17 @@ "@babel/helper-wrap-function" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-replace-supers@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" - integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" + integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.15.0" "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" -"@babel/helper-simple-access@^7.14.5", "@babel/helper-simple-access@^7.14.8": +"@babel/helper-simple-access@^7.14.8": version "7.14.8" resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== @@ -229,10 +229,10 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.8": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" - integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== "@babel/helper-validator-option@^7.14.5": version "7.14.5" @@ -250,13 +250,13 @@ "@babel/types" "^7.14.5" "@babel/helpers@^7.14.8": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz#839f88f463025886cff7f85a35297007e2da1b77" - integrity sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw== + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357" + integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g== dependencies: "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.8" - "@babel/types" "^7.14.8" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" "@babel/highlight@^7.14.5": version "7.14.5" @@ -268,21 +268,21 @@ js-tokens "^4.0.0" "@babel/node@^7.12.6": - version "7.14.7" - resolved "https://registry.npmjs.org/@babel/node/-/node-7.14.7.tgz#0090e83e726027ea682240718ca39e4b625b15ad" - integrity sha512-QghINtVgOUCrSpE7z4IXPTGJfRYyjoY7ny5Qz0cuUlsThQv6WSn1xJk217WlEDucPLP2o5HwGXPSkxD4LWOZxQ== + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/node/-/node-7.14.9.tgz#c15b1c8ecb33c079cb7666c8b4861791150c7aa1" + integrity sha512-7QJvGn3ID2TjoFst3UdLu3LOxn/Q6Nhr/mo0MENstbPHehl/0wnod2gmVDB+zDxRL6pFFS7z0WeBK3b94k4CLg== dependencies: "@babel/register" "^7.14.5" commander "^4.0.1" - core-js "^3.15.0" + core-js "^3.16.0" node-environment-flags "^1.0.5" regenerator-runtime "^0.13.4" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.8", "@babel/parser@^7.7.0": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz#66fd41666b2d7b840bd5ace7f7416d5ac60208d4" - integrity sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.7.0": + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" + integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": version "7.14.5" @@ -293,10 +293,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.14.7": - version "7.14.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" - integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== +"@babel/plugin-proposal-async-generator-functions@^7.14.9": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz#7028dc4fa21dc199bbacf98b39bab1267d0eaf9a" + integrity sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" @@ -571,16 +571,16 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-block-scoping@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" - integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" - integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== +"@babel/plugin-transform-classes@^7.14.9": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz#2a391ffb1e5292710b00f2e2c210e1435e7d449f" + integrity sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A== dependencies: "@babel/helper-annotate-as-pure" "^7.14.5" "@babel/helper-function-name" "^7.14.5" @@ -665,14 +665,14 @@ "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" - integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== +"@babel/plugin-transform-modules-commonjs@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz#3305896e5835f953b5cdb363acd9e8c2219a5281" + integrity sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig== dependencies: - "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-module-transforms" "^7.15.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-simple-access" "^7.14.8" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.14.5": @@ -694,10 +694,10 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": - version "7.14.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" - integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -731,9 +731,9 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-react-display-name@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz#baa92d15c4570411301a85a74c13534873885b65" - integrity sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ== + version "7.15.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -745,15 +745,15 @@ "@babel/plugin-transform-react-jsx" "^7.14.5" "@babel/plugin-transform-react-jsx@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz#39749f0ee1efd8a1bd729152cf5f78f1d247a44a" - integrity sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q== + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== dependencies: "@babel/helper-annotate-as-pure" "^7.14.5" "@babel/helper-module-imports" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-jsx" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/types" "^7.14.9" "@babel/plugin-transform-react-pure-annotations@^7.14.5": version "7.14.5" @@ -778,9 +778,9 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-runtime@^7.11.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz#30491dad49c6059f8f8fa5ee8896a0089e987523" - integrity sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg== + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz#d3aa650d11678ca76ce294071fda53d7804183b3" + integrity sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw== dependencies: "@babel/helper-module-imports" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" @@ -825,12 +825,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typescript@^7.14.5": - version "7.14.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" - integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== +"@babel/plugin-transform-typescript@^7.15.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz#553f230b9d5385018716586fc48db10dd228eb7e" + integrity sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.6" + "@babel/helper-create-class-features-plugin" "^7.15.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript" "^7.14.5" @@ -850,16 +850,16 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/preset-env@^7.8.3": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz#254942f5ca80ccabcfbb2a9f524c74bca574005b" - integrity sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg== + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz#e2165bf16594c9c05e52517a194bf6187d6fe464" + integrity sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q== dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.7" + "@babel/plugin-proposal-async-generator-functions" "^7.14.9" "@babel/plugin-proposal-class-properties" "^7.14.5" "@babel/plugin-proposal-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import" "^7.14.5" @@ -892,7 +892,7 @@ "@babel/plugin-transform-async-to-generator" "^7.14.5" "@babel/plugin-transform-block-scoped-functions" "^7.14.5" "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-classes" "^7.14.5" + "@babel/plugin-transform-classes" "^7.14.9" "@babel/plugin-transform-computed-properties" "^7.14.5" "@babel/plugin-transform-destructuring" "^7.14.7" "@babel/plugin-transform-dotall-regex" "^7.14.5" @@ -903,10 +903,10 @@ "@babel/plugin-transform-literals" "^7.14.5" "@babel/plugin-transform-member-expression-literals" "^7.14.5" "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.0" "@babel/plugin-transform-modules-systemjs" "^7.14.5" "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" "@babel/plugin-transform-new-target" "^7.14.5" "@babel/plugin-transform-object-super" "^7.14.5" "@babel/plugin-transform-parameters" "^7.14.5" @@ -921,11 +921,11 @@ "@babel/plugin-transform-unicode-escapes" "^7.14.5" "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.8" + "@babel/types" "^7.15.0" babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.15.0" + core-js-compat "^3.16.0" semver "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -952,18 +952,18 @@ "@babel/plugin-transform-react-pure-annotations" "^7.14.5" "@babel/preset-typescript@^7.12.1": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" - integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" + integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.15.0" "@babel/register@^7.11.5", "@babel/register@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/register/-/register-7.14.5.tgz#d0eac615065d9c2f1995842f85d6e56c345f3233" - integrity sha512-TjJpGz/aDjFGWsItRBQMOFTrmTI9tr79CHOK+KIvLeCkbxuOAk2M5QHjvruIMGoo9OuccMh5euplPzc5FjAKGg== + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.15.3.tgz#6b40a549e06ec06c885b2ec42c3dd711f55fe752" + integrity sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -972,17 +972,17 @@ source-map-support "^0.5.16" "@babel/runtime-corejs3@^7.10.2": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.8.tgz#68539e0129f13eb1ed9a9aa273d3542b93c88384" - integrity sha512-4dMD5QRBkumn45oweR0SxoNtt15oz3BUBAQ8cIx7HJqZTtE8zjpM0My8aHJHVnyf4XfRg6DNzaE1080WLBiC1w== + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz#28754263988198f2a928c09733ade2fb4d28089d" + integrity sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A== dependencies: - core-js-pure "^3.15.0" + core-js-pure "^3.16.0" regenerator-runtime "^0.13.4" "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" - integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" + integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== dependencies: regenerator-runtime "^0.13.4" @@ -995,27 +995,27 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.14.8", "@babel/traverse@^7.7.0": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz#c0253f02677c5de1a8ff9df6b0aacbec7da1a8ce" - integrity sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0", "@babel/traverse@^7.7.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" + integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.8" + "@babel/generator" "^7.15.0" "@babel/helper-function-name" "^7.14.5" "@babel/helper-hoist-variables" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.8" - "@babel/types" "^7.14.8" + "@babel/parser" "^7.15.0" + "@babel/types" "^7.15.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz#38109de8fcadc06415fbd9b74df0065d4d41c728" - integrity sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q== +"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.14.9", "@babel/types@^7.15.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== dependencies: - "@babel/helper-validator-identifier" "^7.14.8" + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1397,10 +1397,21 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^27.0.6": + version "27.0.6" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz#9a992bc517e0c49f035938b8549719c2de40706b" + integrity sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@microsoft/load-themed-styles@^1.10.26": - version "1.10.196" - resolved "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.196.tgz#2bf255f6c57bdd602d1e1b942d38480d62c0c1c3" - integrity sha512-eImlYYB/ZJH8Y3t2d/JbjxwSwWVeiQ7x+Xl5mTlTAlByzAiEs7tB3LUOEEz0XrlasvYV9ynq2i8b1+Gi/+KlMQ== + version "1.10.202" + resolved "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.202.tgz#89cbdf4649eb65d9b250844abaeb8eafea1a6ac2" + integrity sha512-pWoN9hl1vfXnPfu2tS5VndXXKMe+UEWLJXDKNGXSNpmfszVLzG8Ns0TlZHlwtgpSaSD3f0kdVDfqAek8aflD4w== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.2": version "2.1.8-no-fsevents.2" @@ -1486,29 +1497,29 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^9.1.1": - version "9.1.1" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.1.1.tgz#fb87f2e2f44b95a5720d61dee409a9f1fbc59217" - integrity sha512-xmyPP9tVb4T4A6Lk6SL6ScnIqAHpPV4jfMZI8VtY286212ri9J/6IFGuLsZ26daADUmriuLejake4k+azEfnaw== +"@octokit/openapi-types@^9.5.0": + version "9.7.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.7.0.tgz#9897cdefd629cd88af67b8dbe2e5fb19c63426b2" + integrity sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg== "@octokit/plugin-paginate-rest@^2.6.2": - version "2.14.0" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.14.0.tgz#f469cb4a908792fb44679c5973d8bba820c88b0f" - integrity sha512-S2uEu2uHeI7Vf+Lvj8tv3O5/5TCAa8GHS0dUQN7gdM7vKA6ZHAbR6HkAVm5yMb1mbedLEbxOuQ+Fa0SQ7tCDLA== + version "2.15.1" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.15.1.tgz#264189dd3ce881c6c33758824aac05a4002e056a" + integrity sha512-47r52KkhQDkmvUKZqXzA1lKvcyJEfYh3TKAIe5+EzMeyDM3d+/s5v11i2gTk8/n6No6DPi3k5Ind6wtDbo/AEg== dependencies: - "@octokit/types" "^6.18.0" + "@octokit/types" "^6.24.0" "@octokit/plugin-request-log@^1.0.2": version "1.0.4" resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@5.5.1": - version "5.5.1" - resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.5.1.tgz#31cce8fc3eda4d186bd90828cb7a2203ad95e3d1" - integrity sha512-Al57+OZmO65JpiPk4JS6u6kQ2y9qjoZtY1IWiSshc4N+F7EcrK8Rgy/cUJBB4WIcSFUQyF66EJQK1oKgXWeRNw== +"@octokit/plugin-rest-endpoint-methods@5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.7.0.tgz#80b69452c17597738d4692c79829b72d9e72ccec" + integrity sha512-G7sgccWRYQMwcHJXkDY/sDxbXeKiZkFQqUtzBCwmrzCNj2GQf3VygQ4T/BFL2crLVpIbenkE/c0ErhYOte2MPw== dependencies: - "@octokit/types" "^6.21.1" + "@octokit/types" "^6.24.0" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -1521,9 +1532,9 @@ once "^1.4.0" "@octokit/request@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@octokit/request/-/request-5.6.0.tgz#6084861b6e4fa21dc40c8e2a739ec5eff597e672" - integrity sha512-4cPp/N+NqmaGQwbh3vUsYqokQIzt7VjsgTYVXiwpUP2pxd5YiZB2XuTedbb0SPtv9XS7nzAKjAuQxmY8/aZkiA== + version "5.6.1" + resolved "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz#f97aff075c37ab1d427c49082fefeef0dba2d8ce" + integrity sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.1.0" @@ -1532,22 +1543,22 @@ node-fetch "^2.6.1" universal-user-agent "^6.0.0" -"@octokit/rest@18.7.1": - version "18.7.1" - resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.7.1.tgz#575ecf8b881b79540daa28b0fa3a2b3ae8ef2649" - integrity sha512-790Yv8Xpbqs3BtnMAO5hlOftVICHPdgZ/3qlTmeOoqrQGzT25BIpHkg/KKMeKG9Fg8d598PLxGhf80RswElv9g== +"@octokit/rest@18.9.0": + version "18.9.0" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.9.0.tgz#e5cc23fa199a2bdeea9efbe6096f81d7d6156fe9" + integrity sha512-VrmrE8gjpuOoDAGjrQq2j9ZhOE6LxaqxaQg0yMrrEnnQZy2ZcAnr5qbVfKsMF0up/48PRV/VFS/2GSMhA7nTdA== dependencies: "@octokit/core" "^3.5.0" "@octokit/plugin-paginate-rest" "^2.6.2" "@octokit/plugin-request-log" "^1.0.2" - "@octokit/plugin-rest-endpoint-methods" "5.5.1" + "@octokit/plugin-rest-endpoint-methods" "5.7.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.18.0", "@octokit/types@^6.21.1": - version "6.21.1" - resolved "https://registry.npmjs.org/@octokit/types/-/types-6.21.1.tgz#d0f2b7598c88e13d0bd87e330d975e3fb2a90180" - integrity sha512-PP+m3T5EWZKawru4zi/FvX8KL2vkO5f1fLthx78/7743p7RtJUevt3z7698k+7oAYRA7YuVqfXthSEHqkDvZ8g== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.24.0": + version "6.25.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-6.25.0.tgz#c8e37e69dbe7ce55ed98ee63f75054e7e808bf1a" + integrity sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q== dependencies: - "@octokit/openapi-types" "^9.1.1" + "@octokit/openapi-types" "^9.5.0" "@payloadcms/config-provider@^0.1.0": version "0.1.0" @@ -1556,15 +1567,15 @@ dependencies: jwt-decode "^3.1.2" -"@polka/url@^1.0.0-next.15": - version "1.0.0-next.15" - resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz#6a9d143f7f4f49db2d782f9e1c8839a29b43ae23" - integrity sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA== +"@polka/url@^1.0.0-next.17": + version "1.0.0-next.17" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.17.tgz#25fdbdfd282c2f86ddf3fcefbd98be99cd2627e2" + integrity sha512-0p1rCgM3LLbAdwBnc7gqgnvjHg9KpbhcSphergHShlkWz8EdPawoMJ3/VbezI0mGC5eKCDzMaPgF9Yca6cKvrg== "@popperjs/core@^2.8.3": - version "2.9.2" - resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" - integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== + version "2.9.3" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz#8b68da1ebd7fc603999cf6ebee34a4899a14b88e" + integrity sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ== "@react-dnd/asap@^4.0.0": version "4.0.0" @@ -1793,9 +1804,9 @@ browserslist "*" "@types/bson@*": - version "4.0.4" - resolved "https://registry.npmjs.org/@types/bson/-/bson-4.0.4.tgz#79d2d26e81070044db2a1a8b2cc2f673c840e1e5" - integrity sha512-awqorHvQS0DqxkHQ/FxcPX9E+H7Du51Qw/2F+5TBMSaE3G0hm+8D3eXJ6MAzFw75nE8V7xF0QvzUSdxIjJb/GA== + version "4.0.5" + resolved "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz#9e0e1d1a6f8866483f96868a9b33bc804926b1fc" + integrity sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg== dependencies: "@types/node" "*" @@ -2020,7 +2031,15 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^26.0.15": +"@types/jest@*": + version "27.0.1" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.0.1.tgz#fafcc997da0135865311bb1215ba16dba6bdf4ca" + integrity sha512-HTLpVXHrY69556ozYkcq47TtQJXpcWAWfkoqz+ZGz2JnmZhzlRjprCIyFnetSy8gpDWwTTGBcRVv1J1I1vBrHw== + dependencies: + jest-diff "^27.0.0" + pretty-format "^27.0.0" + +"@types/jest@^26.0.15": version "26.0.24" resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== @@ -2039,9 +2058,9 @@ integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": - version "7.0.8" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" - integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== + version "7.0.9" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/jsonwebtoken@*", "@types/jsonwebtoken@^8.5.0": version "8.5.4" @@ -2058,9 +2077,9 @@ "@types/node" "*" "@types/lodash@^4.14.149": - version "4.14.171" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz#f01b3a5fe3499e34b622c362a46a609fdb23573b" - integrity sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg== + version "4.14.172" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz#aad774c28e7bfd7a67de25408e03ee5a8c3d028a" + integrity sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw== "@types/mdast@^3.0.0": version "3.0.7" @@ -2168,14 +2187,9 @@ "@types/node" "*" "@types/node@*": - version "16.4.5" - resolved "https://registry.npmjs.org/@types/node/-/node-16.4.5.tgz#eac95d4e52775190c405f0b9061ddcfb0304f7fc" - integrity sha512-+0GPv/hIFNoy8r5MFf7vRpBjnqNYNrlHdetoy23E7TYc7JB2ctwyi3GMKpviozaHQ/Sy2kBNUTvG9ywN66zV1g== - -"@types/node@14.x || 15.x": - version "15.14.3" - resolved "https://registry.npmjs.org/@types/node/-/node-15.14.3.tgz#330763b973d0acacb7fdccc7594e1fb281ed1b1c" - integrity sha512-gliNP92vLGGha1nioYHIIT2WrZ450sxpRgyPCEyog2hMVi6LEbhY/Pkj+EDiGWrCXntZ9lrnE2+lTIlyYtaxCg== + version "16.6.1" + resolved "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz#aee62c7b966f55fc66c7b6dfa1d58db2a616da61" + integrity sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw== "@types/nodemailer@^6.4.0": version "6.4.4" @@ -2397,9 +2411,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^17.0.0": - version "17.0.15" - resolved "https://registry.npmjs.org/@types/react/-/react-17.0.15.tgz#c7533dc38025677e312606502df7656a6ea626d0" - integrity sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw== + version "17.0.18" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.18.tgz#4109cbbd901be9582e5e39e3d77acd7b66bb7fbe" + integrity sha512-YTLgu7oS5zvSqq49X5Iue5oAbVGhgPc5Au29SJC4VeE17V6gASoOxVkUDy9pXFMRFxCWCD9fLeweNFizo3UzOg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2503,6 +2517,11 @@ resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz#1a32969cf8f0364b3d8c8af9cc3555b7805df14f" integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== +"@types/webidl-conversions@*": + version "6.1.1" + resolved "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e" + integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q== + "@types/webpack-bundle-analyzer@^4.4.0": version "4.4.1" resolved "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.1.tgz#bcc2501be10c8cdd1d170bc6b7847b3321f20440" @@ -2534,9 +2553,9 @@ "@types/webpack" "*" "@types/webpack-sources@*": - version "2.1.1" - resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.1.tgz#6af17e3a3ded71eec2b98008d7c12f498a0a4506" - integrity sha512-MjM1R6iuw8XaVbtkCBz0N349cyqBjJHCbQiOeppe3VBeFvxqs74RKHAVt9LkxTnUWc7YLZOEsUfPUnmK6SBPKQ== + version "3.2.0" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== dependencies: "@types/node" "*" "@types/source-list-map" "*" @@ -2575,6 +2594,14 @@ anymatch "^3.0.0" source-map "^0.6.0" +"@types/whatwg-url@^8.0.0": + version "8.2.1" + resolved "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz#f1aac222dab7c59e011663a0cb0a3117b2ef05d4" + integrity sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ== + dependencies: + "@types/node" "*" + "@types/webidl-conversions" "*" + "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" @@ -2587,28 +2614,35 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.8.1": - version "4.28.5" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.5.tgz#8197f1473e7da8218c6a37ff308d695707835684" - integrity sha512-m31cPEnbuCqXtEZQJOXAHsHvtoDi9OVaeL5wZnO2KZTnkvELk+u6J6jHg+NzvWQxk+87Zjbc4lJS4NHmgImz6Q== +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: - "@typescript-eslint/experimental-utils" "4.28.5" - "@typescript-eslint/scope-manager" "4.28.5" + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.8.1": + version "4.29.2" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.2.tgz#f54dc0a32b8f61c6024ab8755da05363b733838d" + integrity sha512-x4EMgn4BTfVd9+Z+r+6rmWxoAzBaapt4QFqE+d8L8sUtYZYLDTK6VG/y/SMMWA5t1/BVU5Kf+20rX4PtWzUYZg== + dependencies: + "@typescript-eslint/experimental-utils" "4.29.2" + "@typescript-eslint/scope-manager" "4.29.2" debug "^4.3.1" functional-red-black-tree "^1.0.1" regexpp "^3.1.0" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.28.5": - version "4.28.5" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.5.tgz#66c28bef115b417cf9d80812a713e0e46bb42a64" - integrity sha512-bGPLCOJAa+j49hsynTaAtQIWg6uZd8VLiPcyDe4QPULsvQwLHGLSGKKcBN8/lBxIX14F74UEMK2zNDI8r0okwA== +"@typescript-eslint/experimental-utils@4.29.2": + version "4.29.2" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.2.tgz#5f67fb5c5757ef2cb3be64817468ba35c9d4e3b7" + integrity sha512-P6mn4pqObhftBBPAv4GQtEK7Yos1fz/MlpT7+YjH9fTxZcALbiiPKuSIfYP/j13CeOjfq8/fr9Thr2glM9ub7A== dependencies: "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.28.5" - "@typescript-eslint/types" "4.28.5" - "@typescript-eslint/typescript-estree" "4.28.5" + "@typescript-eslint/scope-manager" "4.29.2" + "@typescript-eslint/types" "4.29.2" + "@typescript-eslint/typescript-estree" "4.29.2" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -2640,23 +2674,23 @@ "@typescript-eslint/types" "4.0.1" "@typescript-eslint/visitor-keys" "4.0.1" -"@typescript-eslint/scope-manager@4.28.5": - version "4.28.5" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.5.tgz#3a1b70c50c1535ac33322786ea99ebe403d3b923" - integrity sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ== +"@typescript-eslint/scope-manager@4.29.2": + version "4.29.2" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.2.tgz#442b0f029d981fa402942715b1718ac7fcd5aa1b" + integrity sha512-mfHmvlQxmfkU8D55CkZO2sQOueTxLqGvzV+mG6S/6fIunDiD2ouwsAoiYCZYDDK73QCibYjIZmGhpvKwAB5BOA== dependencies: - "@typescript-eslint/types" "4.28.5" - "@typescript-eslint/visitor-keys" "4.28.5" + "@typescript-eslint/types" "4.29.2" + "@typescript-eslint/visitor-keys" "4.29.2" "@typescript-eslint/types@4.0.1": version "4.0.1" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.0.1.tgz#1cf72582f764931f085cb8230ff215980fe467b2" integrity sha512-S+gD3fgbkZYW2rnbjugNMqibm9HpEjqZBZkTiI3PwbbNGWmAcxolWIUwZ0SKeG4Dy2ktpKKaI/6+HGYVH8Qrlg== -"@typescript-eslint/types@4.28.5": - version "4.28.5" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.5.tgz#d33edf8e429f0c0930a7c3d44e9b010354c422e9" - integrity sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA== +"@typescript-eslint/types@4.29.2": + version "4.29.2" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.2.tgz#fc0489c6b89773f99109fb0aa0aaddff21f52fcd" + integrity sha512-K6ApnEXId+WTGxqnda8z4LhNMa/pZmbTFkDxEBLQAbhLZL50DjeY0VIDCml/0Y3FlcbqXZrABqrcKxq+n0LwzQ== "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" @@ -2685,13 +2719,13 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.28.5": - version "4.28.5" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.5.tgz#4906d343de693cf3d8dcc301383ed638e0441cd1" - integrity sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw== +"@typescript-eslint/typescript-estree@4.29.2": + version "4.29.2" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.2.tgz#a0ea8b98b274adbb2577100ba545ddf8bf7dc219" + integrity sha512-TJ0/hEnYxapYn9SGn3dCnETO0r+MjaxtlWZ2xU+EvytF0g4CqTpZL48SqSNn2hXsPolnewF30pdzR9a5Lj3DNg== dependencies: - "@typescript-eslint/types" "4.28.5" - "@typescript-eslint/visitor-keys" "4.28.5" + "@typescript-eslint/types" "4.29.2" + "@typescript-eslint/visitor-keys" "4.29.2" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" @@ -2706,12 +2740,12 @@ "@typescript-eslint/types" "4.0.1" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@4.28.5": - version "4.28.5" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.5.tgz#ffee2c602762ed6893405ee7c1144d9cc0a29675" - integrity sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg== +"@typescript-eslint/visitor-keys@4.29.2": + version "4.29.2" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.2.tgz#d2da7341f3519486f50655159f4e5ecdcb2cd1df" + integrity sha512-bDgJLQ86oWHJoZ1ai4TZdgXzJxsea3Ee9u9wsTAvjChdj2WLcVsgWYAPeY7RQMn16tKrlQaBnpKv7KBfs4EQag== dependencies: - "@typescript-eslint/types" "4.28.5" + "@typescript-eslint/types" "4.29.2" eslint-visitor-keys "^2.0.0" "@udecode/slate-plugins-core@^0.71.11": @@ -2912,10 +2946,10 @@ dependencies: envinfo "^7.7.3" -"@webpack-cli/serve@^1.5.1": - version "1.5.1" - resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278" - integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw== +"@webpack-cli/serve@^1.5.2": + version "1.5.2" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz#ea584b637ff63c5a477f6f21604b5a205b72c9ec" + integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw== "@xobotyi/scrollbar-width@1.9.5": version "1.9.5" @@ -2966,6 +3000,11 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" +acorn-import-assertions@^1.7.6: + version "1.7.6" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78" + integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA== + acorn-jsx@^5.2.0: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -3094,6 +3133,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + anymatch@*, anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -3319,7 +3363,7 @@ autoprefixer@^9.6.1: postcss "^7.0.32" postcss-value-parser "^4.1.0" -available-typed-arrays@^1.0.2: +available-typed-arrays@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9" integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA== @@ -3448,9 +3492,9 @@ babel-plugin-polyfill-corejs2@^0.2.2: semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" - integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== + version "0.2.4" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" + integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.14.0" @@ -3660,16 +3704,16 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@*, browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.6.4: - version "4.16.6" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== +browserslist@*, browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.16.7, browserslist@^4.6.4: + version "4.16.8" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0" + integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" + caniuse-lite "^1.0.30001251" + colorette "^1.3.0" + electron-to-chromium "^1.3.811" escalade "^3.1.1" - node-releases "^1.1.71" + node-releases "^1.1.75" bser@2.1.1: version "2.1.1" @@ -3706,9 +3750,9 @@ buffer-equal-constant-time@1.0.1: integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" @@ -3878,10 +3922,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: - version "1.0.30001248" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz#26ab45e340f155ea5da2920dadb76a533cb8ebce" - integrity sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001251: + version "1.0.30001251" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz#6853a606ec50893115db660f82c094d18f096d85" + integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A== capture-exit@^2.0.0: version "2.0.0" @@ -3904,10 +3948,10 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@4.1.1, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -4175,10 +4219,10 @@ color@^3.0.0, color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" -colorette@^1.2.1, colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +colorette@^1.2.1, colorette@^1.2.2, colorette@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" + integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" @@ -4505,23 +4549,23 @@ copyfiles@^2.4.0: untildify "^4.0.0" yargs "^16.1.0" -core-js-compat@^3.14.0, core-js-compat@^3.15.0: - version "3.15.2" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" - integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== +core-js-compat@^3.14.0, core-js-compat@^3.16.0: + version "3.16.2" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.2.tgz#442ef1d933ca6fc80859bd5a1db7a3ba716aaf56" + integrity sha512-4lUshXtBXsdmp8cDWh6KKiHUg40AjiuPD3bOWkNVsr1xkAhpUqCjaZ8lB1bKx9Gb5fXcbRbFJ4f4qpRIRTuJqQ== dependencies: - browserslist "^4.16.6" + browserslist "^4.16.7" semver "7.0.0" -core-js-pure@^3.15.0: - version "3.15.2" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce" - integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA== +core-js-pure@^3.16.0: + version "3.16.2" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.2.tgz#0ef4b79cabafb251ea86eb7d139b42bd98c533e8" + integrity sha512-oxKe64UH049mJqrKkynWp6Vu0Rlm/BTXO/bJZuN2mmR3RtOFNepLlSWDd1eo16PzHpQAoNG97rLU1V/YxesJjw== -core-js@^3.15.0: - version "3.15.2" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" - integrity sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q== +core-js@^3.16.0: + version "3.16.2" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.16.2.tgz#3f485822889c7fc48ef463e35be5cc2a4a01a1f4" + integrity sha512-P0KPukO6OjMpjBtHSceAZEWlDD1M2Cpzpg6dBbrjFqFhBHe/BwhxaP820xKOjRn/lZRQirrCusIpLS/n2sgXLQ== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -5065,9 +5109,9 @@ delegates@^1.0.0: integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= denque@^1.4.1, denque@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" - integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== + version "1.5.1" + resolved "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" + integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== depd@~1.1.2: version "1.1.2" @@ -5122,6 +5166,11 @@ diff-sequences@^26.6.2: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff-sequences@^27.0.6: + version "27.0.6" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" + integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5158,9 +5207,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6: - version "0.5.6" - resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz#3f5d43b52c7a3bd68b5fb63fa47b4e4c1fdf65a9" - integrity sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw== + version "0.5.7" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.7.tgz#8c2aa6325968f2933160a0b7dbb380893ddf3e7d" + integrity sha512-ml3lJIq9YjUfM9TUnEPvEYWFSwivwIGBPKpewX7tii7fwCazA8yCioGdqQcNsItPpfFvSJ3VIdMQPj60LJhcQA== dom-converter@^0.2.0: version "0.2.0" @@ -5285,10 +5334,10 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.723: - version "1.3.789" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.789.tgz#c3ea060ba1e36e41c87943a47ed2daadc545be2b" - integrity sha512-lK4xn6C6ZF1kgLaC/EhOtC1MSKENExj3rMwGVnBTfHW81Z/Hb1Rge5YaWawN/YOXy3xCaESuE4KWSD50kOZ9rQ== +electron-to-chromium@^1.3.811: + version "1.3.811" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.811.tgz#df5a7b18267a0b8b6ffed0dde63b9fb701f777f8" + integrity sha512-hv3kgf6YSd+jQ7J+7Kdm44yux/1vxcAwfGV/6M6Nq4E9zJ3Bml/P2+vULCvqLS6Lh9knBCQ7iEMvyeDiGe5EbA== emittery@^0.7.1: version "0.7.2" @@ -5364,10 +5413,10 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: - version "1.18.3" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" - integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== +es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2, es-abstract@^1.18.5: + version "1.18.5" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19" + integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -5375,11 +5424,12 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es- get-intrinsic "^1.1.1" has "^1.0.3" has-symbols "^1.0.2" + internal-slot "^1.0.3" is-callable "^1.2.3" is-negative-zero "^2.0.1" is-regex "^1.1.3" is-string "^1.0.6" - object-inspect "^1.10.3" + object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" @@ -5442,33 +5492,33 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.5: + version "0.3.6" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" -eslint-module-utils@^2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" - integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== +eslint-module-utils@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" + integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== dependencies: debug "^3.2.7" pkg-dir "^2.0.0" eslint-plugin-import@^2.20.0: - version "2.23.4" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" - integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== + version "2.24.0" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.0.tgz#697ffd263e24da5e84e03b282f5fb62251777177" + integrity sha512-Kc6xqT9hiYi2cgybOc0I2vC9OgAYga5o/rAFinam/yF/t5uBqxQbauNPMC6fgb640T/89P0gFoO27FOilJ/Cqg== dependencies: array-includes "^3.1.3" array.prototype.flat "^1.2.4" debug "^2.6.9" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.1" + eslint-import-resolver-node "^0.3.5" + eslint-module-utils "^2.6.2" find-up "^2.0.0" has "^1.0.3" is-core-module "^2.4.0" @@ -6031,7 +6081,7 @@ find-root@^1.1.0: resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@*, find-up@5.0.0, find-up@^5.0.0: +find-up@*, find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -6416,9 +6466,9 @@ globby@11.0.4, globby@^11.0.1, globby@^11.0.3: slash "^3.0.0" globule@^1.0.0: - version "1.3.2" - resolved "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" - integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== + version "1.3.3" + resolved "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz#811919eeac1ab7344e905f2e3be80a13447973c2" + integrity sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg== dependencies: glob "~7.1.1" lodash "~4.17.10" @@ -6459,9 +6509,9 @@ got@^9.6.0: url-parse-lax "^3.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.8" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== graphql-playground-html@^1.6.29: version "1.6.29" @@ -6584,6 +6634,13 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -7074,11 +7131,12 @@ is-alphanumerical@^1.0.0: is-decimal "^1.0.0" is-arguments@^1.0.4: - version "1.1.0" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" - integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -7091,9 +7149,11 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" @@ -7110,11 +7170,12 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-buffer@^1.1.5, is-buffer@^1.1.6: version "1.1.6" @@ -7127,9 +7188,9 @@ is-buffer@^2.0.0: integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + version "1.2.4" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@3.0.0: version "3.0.0" @@ -7157,10 +7218,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0, is-core-module@^2.4.0: - version "2.5.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" - integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== +is-core-module@^2.2.0, is-core-module@^2.4.0, is-core-module@^2.5.0: + version "2.6.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" + integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== dependencies: has "^1.0.3" @@ -7179,9 +7240,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" - integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-decimal@^1.0.0: version "1.0.4" @@ -7256,9 +7319,11 @@ is-generator-fn@^2.0.0: integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.7: - version "1.0.9" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c" - integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" @@ -7327,9 +7392,11 @@ is-npm@^5.0.0: integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + version "1.0.6" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" @@ -7386,12 +7453,12 @@ is-potential-custom-element-name@^1.0.1: integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-regex@^1.0.4, is-regex@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" - integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.2" + has-tostringtag "^1.0.0" is-resolvable@^1.0.0: version "1.1.0" @@ -7416,9 +7483,11 @@ is-stream@^2.0.0: integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" - integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" @@ -7434,16 +7503,16 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.3: - version "1.1.5" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" - integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== +is-typed-array@^1.1.3, is-typed-array@^1.1.6: + version "1.1.7" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.7.tgz#881ddc660b13cb8423b2090fa88c0fe37a83eb2f" + integrity sha512-VxlpTBGknhQ3o7YiVjIhdLU6+oD8dPz/79vvvH4F+S/c8608UCVa9fgDpa1kZgFoUST2DCgacc70UszKgzKuvA== dependencies: - available-typed-arrays "^1.0.2" + available-typed-arrays "^1.0.4" call-bind "^1.0.2" - es-abstract "^1.18.0-next.2" + es-abstract "^1.18.5" foreach "^2.0.5" - has-symbols "^1.0.1" + has-tostringtag "^1.0.0" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -7460,7 +7529,7 @@ is-windows@^1.0.2: resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -7615,6 +7684,16 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" +jest-diff@^27.0.0: + version "27.0.6" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz#4a7a19ee6f04ad70e0e3388f35829394a44c7b5e" + integrity sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.0.6" + jest-get-type "^27.0.6" + pretty-format "^27.0.6" + jest-docblock@^26.0.0: version "26.0.0" resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" @@ -7663,6 +7742,11 @@ jest-get-type@^26.3.0: resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^27.0.6: + version "27.0.6" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" + integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== + jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" @@ -7941,9 +8025,9 @@ jmespath@^0.15.0: integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= joi@^17.3.0: - version "17.4.1" - resolved "https://registry.npmjs.org/joi/-/joi-17.4.1.tgz#15d2f23c8cbe4d1baded2dd190c58f8dbe11cca0" - integrity sha512-gDPOwQ5sr+BUxXuPDGrC1pSNcVR/yGGcTI0aCnjYxZEa3za60K/iCQ+OFIkEHWZGVCUcUlXlFKvMmrlmxrG6UQ== + version "17.4.2" + resolved "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz#02f4eb5cf88e515e614830239379dcbbe28ce7f7" + integrity sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -7985,9 +8069,9 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.4.0: - version "16.6.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== + version "16.7.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" acorn "^8.2.4" @@ -8014,7 +8098,7 @@ jsdom@^16.4.0: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.5" + ws "^7.4.6" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -8417,7 +8501,7 @@ lz-string@^1.4.4: resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= -macos-release@^2.2.0: +macos-release@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2" integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g== @@ -8656,24 +8740,12 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== - mime-db@1.49.0, "mime-db@>= 1.43.0 < 2": version "1.49.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== -mime-types@2.1.31: - version "2.1.31" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== - dependencies: - mime-db "1.48.0" - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@2.1.32, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.32" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== @@ -8825,16 +8897,17 @@ modify-values@^1.0.0: integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== mongodb-connection-string-url@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-1.0.1.tgz#1509b44570851f5331f9ca7052b723789d63f8dc" - integrity sha512-sXi8w9nwbMrErWbOK+8nofHz531rboasDbYAMS+sQ+W+2YnHN980RlMr+t5SDL6uKEU/kw/wG6jcjCTLiJltoA== + version "1.1.2" + resolved "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-1.1.2.tgz#a115902fee402b9b24a80c16ced94818daedad91" + integrity sha512-mp5lv4guWuykOpkwNNqQ0tKKytuJUjL/aC/bu/DqoJVWL5NSh4j/u+gJ+EiOdweLujHyq6JZZqcTVipHhL5xRg== dependencies: + "@types/whatwg-url" "^8.0.0" whatwg-url "^8.4.0" -mongodb-memory-server-core@7.3.4: - version "7.3.4" - resolved "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-7.3.4.tgz#10dae40e21162406a3a643b82c1a348dcd943299" - integrity sha512-bryHNy34LWuXJui2Hs0sTWWtU5svqVragHtvKuUqLuaXirTgGGhmW5/qsnEAMa/7eZnxDJW5jle9yfM7wiBIKA== +mongodb-memory-server-core@7.3.6: + version "7.3.6" + resolved "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-7.3.6.tgz#9c16cf120e498011a8702e7735271cbe878dd6e5" + integrity sha512-dxprJ5Xqb0y/9nqv709BGf8Cz4dnInhG3sTuYvMJijK4cAHYxk0xkKrvZX2X9PrYiCQqKix59hHMBGyBetN3hg== dependencies: "@types/tmp" "^0.2.0" async-mutex "^0.3.0" @@ -8855,17 +8928,17 @@ mongodb-memory-server-core@7.3.4: yauzl "^2.10.0" mongodb-memory-server@^7.2.0: - version "7.3.4" - resolved "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-7.3.4.tgz#044596bac7b291a727aa4b6316dc2facbdb75f24" - integrity sha512-W3VXLKnZZX5pdfSrLcer7m4RKISiQ8AMG4TTcfl7SMGvKELsUcSGwIWYXP7TeCQ8RkZpj9riz0OxphQow5qi3g== + version "7.3.6" + resolved "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-7.3.6.tgz#6df78425aaa01439556ba3f53e3042f82b3fa5c4" + integrity sha512-JfuY7uJD9TZxq6C4YVuCjiP2v0V/NYb19Wki6rFovdJvkgxGp5/KXKaazu47leECYAtJc2ajW1c009M3hRM+6A== dependencies: - mongodb-memory-server-core "7.3.4" + mongodb-memory-server-core "7.3.6" tslib "^2.3.0" mongodb@*: - version "4.0.1" - resolved "https://registry.npmjs.org/mongodb/-/mongodb-4.0.1.tgz#e7fa8de3448492097b3c67a0d980c4816907aa83" - integrity sha512-Ll2YCciRgbFN2jdfSqW1vhxvAcnqu+5ZlrTZNaEg+hZqKREg4xiUV56ZAtTjC02skfoTirHY5jQwtg7mBxqfug== + version "4.1.0" + resolved "https://registry.npmjs.org/mongodb/-/mongodb-4.1.0.tgz#f491de5d52003f41dffbc6ebfd8b95be21174d63" + integrity sha512-Gx9U9MsFWgJ3E0v4oHAdWvYTGBznNYPCkhmD/3i/kPTY/URnPfHD5/6VoKUFrdgQTK3icFiM9976hVbqCRBO9Q== dependencies: bson "^4.4.0" denque "^1.5.0" @@ -8873,10 +8946,10 @@ mongodb@*: optionalDependencies: saslprep "^1.0.0" -mongodb@3.6.10, mongodb@^3.6.2, mongodb@^3.6.9: - version "3.6.10" - resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.6.10.tgz#f10e990113c86b195c8af0599b9b3a90748b6ee4" - integrity sha512-fvIBQBF7KwCJnDZUnFFy4WqEFP8ibdXeFANnylW19+vOwdjOAvqIzPdsNCEMT6VKTHnYu4K64AWRih0mkFms6Q== +mongodb@3.6.11, mongodb@^3.6.2, mongodb@^3.6.9: + version "3.6.11" + resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.6.11.tgz#8a59a0491a92b00a8c925f72ed9d9a5b054aebb2" + integrity sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw== dependencies: bl "^2.2.1" bson "^1.1.4" @@ -8892,24 +8965,24 @@ mongoose-legacy-pluralize@1.0.2: integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== mongoose-paginate-v2@^1.3.6: - version "1.4.1" - resolved "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.4.1.tgz#63c2ac249f9767626d3d044e3ab2847b21071edf" - integrity sha512-MOmcD6TWPkrLCy4D6iq8/P9GqwSzSq6HZjMWuMnKPOANCDFeHdd7KHuce5tYMlpQ5G9E4Co5meOfEnhpZzL/SQ== + version "1.4.2" + resolved "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.4.2.tgz#482cea73f4a0bd49131ef9004694c73cae93b73e" + integrity sha512-b7FBe7fasJazhlTIfMSPyIST04yvobASXKmUt3ducnvYThulCyGSPhPcSYOzXcPmqBR4tpMnafIJxv+8GjM+UA== mongoose@*, mongoose@^5.8.9: - version "5.13.3" - resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.3.tgz#42cb40207bbcaca9c6fa94b0a8c0a38181c1965e" - integrity sha512-q+zX6kqHAvwxf5speMWhq6qF4vdj+x6/kfD5RSKdZKNm52yGmaUygN+zgrtQjBZPFEzG0B3vF6GP0PoAGadE+w== + version "5.13.7" + resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz#b6938390e93807a6f2ea91a054af2faa67f17218" + integrity sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ== dependencies: "@types/mongodb" "^3.5.27" - "@types/node" "14.x || 15.x" bson "^1.1.4" kareem "2.3.2" - mongodb "3.6.10" + mongodb "3.6.11" mongoose-legacy-pluralize "1.0.2" mpath "0.8.3" mquery "3.2.5" ms "2.1.2" + optional-require "1.0.x" regexp-clone "1.0.0" safe-buffer "5.2.1" sift "13.5.2" @@ -8962,9 +9035,9 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.13.2: - version "2.14.2" - resolved "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + version "2.15.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nano-css@^5.2.1: version "5.3.4" @@ -8981,9 +9054,9 @@ nano-css@^5.2.1: stylis "^4.0.6" nanoid@^3.1.23: - version "3.1.23" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" - integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + version "3.1.25" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== nanomatch@^1.2.9: version "1.2.13" @@ -9039,6 +9112,13 @@ new-find-package-json@^1.1.0: debug "^4.3.2" tslib "^2.3.0" +new-github-release-url@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz#493847e6fecce39c247e9d89929be773d2e7f777" + integrity sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A== + dependencies: + type-fest "^0.4.1" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -9115,10 +9195,10 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== +node-releases@^1.1.75: + version "1.1.75" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" + integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== node-sass@^6.0.0: version "6.0.1" @@ -9195,12 +9275,12 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: validate-npm-package-license "^3.0.1" normalize-package-data@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" - integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== + version "3.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" - resolve "^1.20.0" + is-core-module "^2.5.0" semver "^7.3.4" validate-npm-package-license "^3.0.1" @@ -9308,7 +9388,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.10.3, object-inspect@^1.9.0: +object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== @@ -9418,6 +9498,14 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +open@7.4.2: + version "7.4.2" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + opener@^1.5.2: version "1.5.2" resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -9431,10 +9519,15 @@ optimize-css-assets-webpack-plugin@^5.0.4: cssnano "^4.1.10" last-call-webpack-plugin "^3.0.0" +optional-require@1.0.x: + version "1.0.3" + resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz#275b8e9df1dc6a17ad155369c2422a440f89cb07" + integrity sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA== + optional-require@^1.0.3: - version "1.1.0" - resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.1.0.tgz#01dfbafbbc2e8d79e33558f5af3917f22cc35c2c" - integrity sha512-5/7ee3eTFg1P+F9usTubuNCLfWRK6DjV0EFHLlbp7MmV5UlWqpWIVSnH6xo4u+fc5WHXaJuvJi6iuYnfDyj6oQ== + version "1.1.7" + resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.1.7.tgz#9ab5b254f59534108d4b2201d9ae96a063abc015" + integrity sha512-cIeRZocXsZnZYn+SevbtSqNlLbeoS4mLzuNn4fvXRMDRNhTGg0sxuKXl0FnZCtnew85LorNxIbZp5OeliILhMw== dependencies: require-at "^1.0.6" @@ -9465,12 +9558,12 @@ ora@5.4.1, ora@^5.3.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-name@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/os-name/-/os-name-4.0.0.tgz#6c05c09c41c15848ea74658d12c9606f0f286599" - integrity sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg== +os-name@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz#32cee7823de85a8897647ba4d76db46bf845e555" + integrity sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw== dependencies: - macos-release "^2.2.0" + macos-release "^2.5.0" windows-release "^4.0.0" os-tmpdir@~1.0.2: @@ -10518,9 +10611,9 @@ postcss@^8.2.15: source-map-js "^0.6.2" prebuild-install@^6.1.2: - version "6.1.3" - resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz#8ea1f9d7386a0b30f7ef20247e36f8b2b82825a2" - integrity sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q== + version "6.1.4" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" + integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== dependencies: detect-libc "^1.0.3" expand-template "^2.0.3" @@ -10572,6 +10665,16 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^27.0.0, pretty-format@^27.0.6: + version "27.0.6" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz#ab770c47b2c6f893a21aefc57b75da63ef49a11f" + integrity sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ== + dependencies: + "@jest/types" "^27.0.6" + ansi-regex "^5.0.0" + ansi-styles "^5.0.0" + react-is "^17.0.1" + prismjs@^1.20.0, prismjs@^1.21.0: version "1.24.1" resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz#c4d7895c4d6500289482fa8936d9cdd192684036" @@ -11119,9 +11222,9 @@ redent@^3.0.0: strip-indent "^3.0.0" redux@^4.0.0, redux@^4.0.4: - version "4.1.0" - resolved "https://registry.npmjs.org/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4" - integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g== + version "4.1.1" + resolved "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz#76f1c439bb42043f985fbd9bf21990e60bd67f47" + integrity sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw== dependencies: "@babel/runtime" "^7.9.2" @@ -11224,19 +11327,18 @@ relateurl@^0.2.7: integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= release-it@^14.2.2: - version "14.10.1" - resolved "https://registry.npmjs.org/release-it/-/release-it-14.10.1.tgz#5416887e6568347bd9b19de88b5371b0466dfb23" - integrity sha512-uC+LtV9vlcFOAkclJYnANNlufLoESZPjC5wGeKoW/Y91jJp0bfQv6/iU44a7rmZ4LHy3q52JD54jNe45RUOPYw== + version "14.11.5" + resolved "https://registry.npmjs.org/release-it/-/release-it-14.11.5.tgz#1d705d458463ab55f86c286239ccf0303fcbab40" + integrity sha512-9BaPdq7ZKOwtzz3p1mRhg/tOH/cT/y2tUnPYzUwQiVdj42JaGI1Vo2l3WbgK8ICsbFyrhc0tri1+iqI8OvkI1A== dependencies: "@iarna/toml" "2.2.5" - "@octokit/rest" "18.7.1" + "@octokit/rest" "18.9.0" async-retry "1.3.1" - chalk "4.1.1" + chalk "4.1.2" cosmiconfig "7.0.0" debug "4.3.2" deprecated-obj "2.0.0" execa "5.1.1" - find-up "5.0.0" form-data "4.0.0" git-url-parse "11.5.0" globby "11.0.4" @@ -11245,9 +11347,11 @@ release-it@^14.2.2: inquirer "8.1.2" is-ci "3.0.0" lodash "4.17.21" - mime-types "2.1.31" + mime-types "2.1.32" + new-github-release-url "1.0.0" + open "7.4.2" ora "5.4.1" - os-name "4.0.0" + os-name "4.0.1" parse-json "5.2.0" semver "7.3.5" shelljs "0.8.4" @@ -11386,7 +11490,7 @@ resolve-url@^0.2.1: resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.9.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.9.0: version "1.20.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -11500,9 +11604,9 @@ rxjs@^6.6.0: tslib "^1.9.0" rxjs@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.2.0.tgz#5cd12409639e9514a71c9f5f9192b2c4ae94de31" - integrity sha512-aX8w9OpKrQmiPKfT1bqETtUr9JygIz6GZ+gql8v7CijClsP0laoFUdKzxFAoWuRdSlOdU2+crss+cMf+cqMTnw== + version "7.3.0" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6" + integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== dependencies: tslib "~2.1.0" @@ -11579,9 +11683,9 @@ sass-loader@^10.1.0: semver "^7.3.2" sass@^1.29.0: - version "1.36.0" - resolved "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz#5912ef9d5d16714171ba11cb17edb274c4bbc07e" - integrity sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg== + version "1.38.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.38.0.tgz#2f3e60a1efdcdc910586fa79dc89d3399a145b4f" + integrity sha512-WBccZeMigAGKoI+NgD7Adh0ab1HUq+6BmyBUEaGxtErbUtWUevEbdgo5EZiJQofLUGcKtlNaO2IdN73AHEua5g== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -11850,11 +11954,11 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" sirv@^1.0.7: - version "1.0.12" - resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz#d816c882b35489b3c63290e2f455ae3eccd5f652" - integrity sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg== + version "1.0.14" + resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.14.tgz#b826343f573e12653c5b3c3080a3a2a6a06595cd" + integrity sha512-czTFDFjK9lXj0u9mJ3OmJoXFztoilYS+NdRPcJoT182w44wSEkHSiO7A2517GLJ8wKM4GjCm2OXE66Dhngbzjg== dependencies: - "@polka/url" "^1.0.0-next.15" + "@polka/url" "^1.0.0-next.17" mime "^2.3.1" totalist "^1.0.0" @@ -12074,9 +12178,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.9" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" - integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== + version "3.0.10" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== split-on-first@^1.0.0: version "1.1.0" @@ -12490,9 +12594,9 @@ tar-stream@^2.1.4: readable-stream "^3.1.1" tar@^6.0.2: - version "6.1.2" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.2.tgz#1f045a90a6eb23557a603595f41a16c57d47adc6" - integrity sha512-EwKEgqJ7nJoS+s8QfLYVGMDmAsj+StbI2AM/RTHeUSsOw6Z8bwNBRv5z3CY0m7laC5qUAqruLX5AhMuc5deY3Q== + version "6.1.8" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.8.tgz#4fc50cfe56511c538ce15b71e05eebe66530cbd4" + integrity sha512-sb9b0cp855NbkMJcskdSYA7b11Q8JsX4qe4pyUAfHp+Y6jBjJeek2ZVlwEfWayshEIwlIzXx0Fain3QG9JPm2A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -12773,9 +12877,9 @@ ts-easing@^0.2.0: integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== ts-essentials@^7.0.1: - version "7.0.2" - resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.2.tgz#e21142df8034dbd444cb9573ed204d0b85fc64fb" - integrity sha512-qWPVC1xZGdefbsgFP7tPo+bsgSA2ZIXL1XeEe5M2WoMZxIOr/HbsHxP/Iv75IFhiMHMDGL7cOOwi5SXcgx9mHw== + version "7.0.3" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== tsconfig-paths@^3.9.0: version "3.10.1" @@ -12792,9 +12896,9 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + version "2.3.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tslib@~2.1.0: version "2.1.0" @@ -12857,6 +12961,11 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -13319,14 +13428,14 @@ webpack-bundle-analyzer@^4.4.1: ws "^7.3.1" webpack-cli@^4.3.1: - version "4.7.2" - resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.2.tgz#a718db600de6d3906a4357e059ae584a89f4c1a5" - integrity sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw== + version "4.8.0" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz#5fc3c8b9401d3c8a43e2afceacfa8261962338d1" + integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw== dependencies: "@discoveryjs/json-ext" "^0.5.0" "@webpack-cli/configtest" "^1.0.4" "@webpack-cli/info" "^1.3.0" - "@webpack-cli/serve" "^1.5.1" + "@webpack-cli/serve" "^1.5.2" colorette "^1.2.1" commander "^7.0.0" execa "^5.0.0" @@ -13375,15 +13484,15 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.3: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.0.3.tgz#33c478e1f67bf5577d3ec5ced4bded0a06ec88d0" - integrity sha512-/Qgfp3i1FT2z/tpNj+d/ZeDTbdOWG5V6DdTjIvMLVhrhtpFxmMTZrGnEQEa0J7HF8Plls5kGa7TZ7IsvgnFdtA== +webpack-sources@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz#b16973bcf844ebcdb3afde32eda1c04d0b90f89d" + integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw== webpack@^5, webpack@^5.1.0, webpack@^5.6.0: - version "5.47.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.47.0.tgz#3c13862b5d7b428792bfe76c5f67a0f43ba685f8" - integrity sha512-soKLGwcUM1R3YEbJhJNiZzy7T43TnI7ENda/ywfDp9G1mDlDTpO+qfc8I5b0AzMr9xM3jyvQ0n7ctJyiXuXW6Q== + version "5.50.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz#5562d75902a749eb4d75131f5627eac3a3192527" + integrity sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.50" @@ -13391,6 +13500,7 @@ webpack@^5, webpack@^5.1.0, webpack@^5.6.0: "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" acorn "^8.4.1" + acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" enhanced-resolve "^5.8.0" @@ -13407,7 +13517,7 @@ webpack@^5, webpack@^5.1.0, webpack@^5.6.0: tapable "^2.1.1" terser-webpack-plugin "^5.1.3" watchpack "^2.2.0" - webpack-sources "^3.0.1" + webpack-sources "^3.2.0" whatwg-encoding@^1.0.5: version "1.0.5" @@ -13452,17 +13562,16 @@ which-module@^2.0.0: integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= which-typed-array@^1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" - integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== + version "1.1.6" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.6.tgz#f3713d801da0720a7f26f50c596980a9f5c8b383" + integrity sha512-DdY984dGD5sQ7Tf+x1CkXzdg85b9uEel6nr4UkFg1LoE9OXv3uRuZhe5CoWdawhGACeFpEZXH8fFLQnDhbpm/Q== dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.0" - es-abstract "^1.18.0-next.1" + available-typed-arrays "^1.0.4" + call-bind "^1.0.2" + es-abstract "^1.18.5" foreach "^2.0.5" - function-bind "^1.1.1" - has-symbols "^1.0.1" - is-typed-array "^1.1.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.6" which@^1.2.9: version "1.3.1" @@ -13563,7 +13672,7 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.3.1, ws@^7.4.5: +ws@^7.3.1, ws@^7.4.6: version "7.5.3" resolved "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== From b0dc12560423af5083d36cfd16f464f08ab66d9d Mon Sep 17 00:00:00 2001 From: James Date: Mon, 23 Aug 2021 18:13:19 -0400 Subject: [PATCH 060/115] fix: obscure conditional logic bug --- src/admin/components/forms/Form/buildStateFromSchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/admin/components/forms/Form/buildStateFromSchema.ts b/src/admin/components/forms/Form/buildStateFromSchema.ts index 0ffcb0f3e0..d3e9758dcb 100644 --- a/src/admin/components/forms/Form/buildStateFromSchema.ts +++ b/src/admin/components/forms/Form/buildStateFromSchema.ts @@ -48,7 +48,7 @@ const buildStateFromSchema = async (fieldSchema: FieldSchema[], fullData: Data = initialData = { [field.name]: field.defaultValue }; } - const passesCondition = (field?.admin?.condition ? field.admin.condition(fullData || {}, initialData || {}) : true) && parentPassesCondition; + const passesCondition = Boolean((field?.admin?.condition ? field.admin.condition(fullData || {}, initialData || {}) : true) && parentPassesCondition); if (field.name) { if (field.type === 'relationship' && initialData?.[field.name] === null) { From 468408ff416750daa333b43c46528e1369b9c8f8 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 23 Aug 2021 18:18:23 -0400 Subject: [PATCH 061/115] chore(release): v0.9.5 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b47dbcc077..fddca9e41c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [0.9.5](https://github.com/payloadcms/payload/compare/v0.9.4...v0.9.5) (2021-08-23) + + +### Bug Fixes + +* obscure conditional logic bug ([b0dc125](https://github.com/payloadcms/payload/commit/b0dc12560423af5083d36cfd16f464f08ab66d9d)) +* windows compatible absolute paths for staticDir ([b21316b](https://github.com/payloadcms/payload/commit/b21316b6cc392c793614024648c5301c7e03c326)) + ## [0.9.4](https://github.com/payloadcms/payload/compare/v0.9.3...v0.9.4) (2021-08-06) ## [0.9.3](https://github.com/payloadcms/payload/compare/v0.9.2...v0.9.3) (2021-08-06) diff --git a/package.json b/package.json index b3c0a13312..70c9108feb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "0.9.4", + "version": "0.9.5", "description": "Node, React and MongoDB Headless CMS and Application Framework", "license": "SEE LICENSE IN license.md", "author": { From 7504155e17a2881b7a60f49e610c062665b46d21 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 23 Aug 2021 23:12:50 -0400 Subject: [PATCH 062/115] feat: add point field type --- demo/collections/Geolocation.ts | 59 +++++++++ demo/payload.config.ts | 2 + .../forms/field-types/Point/index.scss | 16 +++ .../forms/field-types/Point/index.tsx | 112 ++++++++++++++++++ .../forms/field-types/Point/types.ts | 5 + .../components/forms/field-types/index.tsx | 3 + src/collections/buildSchema.ts | 6 +- src/collections/tests/pointField.spec.js | 71 +++++++++++ src/fields/config/schema.ts | 6 + src/fields/config/types.ts | 10 ++ src/fields/performFieldOperations.ts | 10 ++ src/fields/traverseFields.ts | 22 ++++ src/fields/validations.ts | 19 +++ src/graphql/schema/buildMutationInputType.ts | 1 + src/graphql/schema/buildObjectType.ts | 1 + src/graphql/schema/buildWhereInputType.ts | 12 ++ src/mongoose/buildSchema.ts | 47 ++++++++ 17 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 demo/collections/Geolocation.ts create mode 100644 src/admin/components/forms/field-types/Point/index.scss create mode 100644 src/admin/components/forms/field-types/Point/index.tsx create mode 100644 src/admin/components/forms/field-types/Point/types.ts create mode 100644 src/collections/tests/pointField.spec.js diff --git a/demo/collections/Geolocation.ts b/demo/collections/Geolocation.ts new file mode 100644 index 0000000000..7773e4c542 --- /dev/null +++ b/demo/collections/Geolocation.ts @@ -0,0 +1,59 @@ +/* eslint-disable no-param-reassign */ +import { CollectionConfig } from '../../src/collections/config/types'; + +const Geolocation: CollectionConfig = { + slug: 'geolocation', + labels: { + singular: 'Geolocation', + plural: 'Geolocations', + }, + hooks: { + beforeRead: [ + (operation) => operation.doc, + ], + beforeChange: [ + (operation) => { + // eslint-disable-next-line no-param-reassign,operator-assignment + operation.data.beforeChange = !operation.data.location?.coordinates; + return operation.data; + }, + ], + afterRead: [ + (operation) => { + const { doc } = operation; + // console.log(doc); + doc.afterReadHook = !doc.location?.coordinates; + return doc; + }, + ], + afterChange: [ + (operation) => { + const { doc } = operation; + operation.doc.afterChangeHook = !doc.location?.coordinates; + return operation.doc; + }, + ], + afterDelete: [ + (operation) => { + const { doc } = operation; + operation.doc.afterDeleteHook = !doc.location?.coordinates; + return operation.doc; + }, + ], + }, + fields: [ + { + name: 'location', + type: 'point', + label: 'Location', + }, + { + name: 'localizedPoint', + type: 'point', + label: 'Localized Point', + localized: true, + }, + ], +}; + +export default Geolocation; diff --git a/demo/payload.config.ts b/demo/payload.config.ts index b621c7ed21..49530cee28 100644 --- a/demo/payload.config.ts +++ b/demo/payload.config.ts @@ -26,6 +26,7 @@ import Select from './collections/Select'; import StrictPolicies from './collections/StrictPolicies'; import Validations from './collections/Validations'; import Uniques from './collections/Uniques'; +import Geolocation from './collections/Geolocation'; import BlocksGlobal from './globals/BlocksGlobal'; import NavigationArray from './globals/NavigationArray'; @@ -83,6 +84,7 @@ export default buildConfig({ Validations, Uniques, UnstoredMedia, + Geolocation, ], globals: [ NavigationArray, diff --git a/src/admin/components/forms/field-types/Point/index.scss b/src/admin/components/forms/field-types/Point/index.scss new file mode 100644 index 0000000000..59644ecd09 --- /dev/null +++ b/src/admin/components/forms/field-types/Point/index.scss @@ -0,0 +1,16 @@ +@import '../../../../scss/styles.scss'; + +.field-type.number { + position: relative; + margin-bottom: $baseline; + + input { + @include formInput; + } + + &.error { + input { + background-color: lighten($color-red, 20%); + } + } +} diff --git a/src/admin/components/forms/field-types/Point/index.tsx b/src/admin/components/forms/field-types/Point/index.tsx new file mode 100644 index 0000000000..f14e1a7ffd --- /dev/null +++ b/src/admin/components/forms/field-types/Point/index.tsx @@ -0,0 +1,112 @@ +import React, { useCallback } from 'react'; +import useFieldType from '../../useFieldType'; +import Label from '../../Label'; +import Error from '../../Error'; +import FieldDescription from '../../FieldDescription'; +import withCondition from '../../withCondition'; +import { point } from '../../../../../fields/validations'; +import { Props } from './types'; + +import './index.scss'; + +const PointField: React.FC = (props) => { + const { + name, + path: pathFromProps, + required, + validate = point, + label, + admin: { + readOnly, + style, + width, + step, + placeholder, + description, + condition, + } = {}, + } = props; + + const path = pathFromProps || name; + + const memoizedValidate = useCallback((value) => { + const validationResult = validate(value, { required }); + return validationResult; + }, [validate, required]); + + const { + value = [null, null], + showError, + setValue, + errorMessage, + } = useFieldType<[number, number]>({ + path, + validate: memoizedValidate, + enableDebouncedValue: true, + condition, + }); + + const handleChange = useCallback((e, index: 0 | 1) => { + let val = parseFloat(e.target.value); + if (Number.isNaN(val)) { + val = e.target.value; + } + const coordinates = [...value]; + coordinates[index] = val; + setValue(coordinates); + }, [setValue, value]); + + const classes = [ + 'field-type', + 'number', + showError && 'error', + readOnly && 'read-only', + ].filter(Boolean).join(' '); + + return ( +
+ +
+ ); +}; + +export default withCondition(PointField); diff --git a/src/admin/components/forms/field-types/Point/types.ts b/src/admin/components/forms/field-types/Point/types.ts new file mode 100644 index 0000000000..d7a3d32371 --- /dev/null +++ b/src/admin/components/forms/field-types/Point/types.ts @@ -0,0 +1,5 @@ +import { NumberField } from '../../../../../fields/config/types'; + +export type Props = Omit & { + path?: string +} diff --git a/src/admin/components/forms/field-types/index.tsx b/src/admin/components/forms/field-types/index.tsx index 91ddad3e1c..30e9b9d851 100644 --- a/src/admin/components/forms/field-types/index.tsx +++ b/src/admin/components/forms/field-types/index.tsx @@ -13,6 +13,7 @@ import number from './Number'; import checkbox from './Checkbox'; import richText from './RichText'; import radio from './RadioGroup'; +import point from './Point'; import blocks from './Blocks'; import group from './Group'; @@ -32,6 +33,7 @@ export type FieldTypes = { textarea: React.ComponentType select: React.ComponentType number: React.ComponentType + point: React.ComponentType checkbox: React.ComponentType richText: React.ComponentType radio: React.ComponentType @@ -56,6 +58,7 @@ const fieldTypes: FieldTypes = { number, checkbox, richText, + point, radio, blocks, group, diff --git a/src/collections/buildSchema.ts b/src/collections/buildSchema.ts index 6a3be5edee..0453693782 100644 --- a/src/collections/buildSchema.ts +++ b/src/collections/buildSchema.ts @@ -3,7 +3,11 @@ import buildQueryPlugin from '../mongoose/buildQuery'; import buildSchema from '../mongoose/buildSchema'; const buildCollectionSchema = (collection, config, schemaOptions = {}) => { - const schema = buildSchema(config, collection.fields, { timestamps: collection.timestamps !== false, ...schemaOptions }); + const schema = buildSchema( + config, + collection.fields, + { timestamps: collection.timestamps !== false, ...schemaOptions }, + ); schema.plugin(paginate) .plugin(buildQueryPlugin); diff --git a/src/collections/tests/pointField.spec.js b/src/collections/tests/pointField.spec.js new file mode 100644 index 0000000000..981b552e03 --- /dev/null +++ b/src/collections/tests/pointField.spec.js @@ -0,0 +1,71 @@ +import getConfig from '../../config/load'; +import { email, password } from '../../mongoose/testCredentials'; + +require('isomorphic-fetch'); + +const { serverURL: url } = getConfig(); + +let token = null; +let headers = null; + +describe('GeoJSON', () => { + beforeAll(async (done) => { + const response = await fetch(`${url}/api/admins/login`, { + body: JSON.stringify({ + email, + password, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'post', + }); + + const data = await response.json(); + + ({ token } = data); + headers = { + Authorization: `JWT ${token}`, + 'Content-Type': 'application/json', + }; + + done(); + }); + + describe('Point Field', () => { + const location = { + coordinates: [100, 200], + }; + let doc; + + beforeAll(async (done) => { + // create document a + const create = await fetch(`${url}/api/geolocation`, { + body: JSON.stringify({ location }), + headers, + method: 'post', + }); + ({ doc } = await create.json()); + + done(); + }); + + it('should create and read collections with points', async () => { + expect(doc).not.toBeNull(); + console.log(doc); + }); + + it('should query for nearest point', async () => { + const q = `${url}/api/geolocation?location[near]=${location.coordinates}`; + console.log(q); + const response = await fetch(`${url}/api/geolocation?where[location][near]=${location.coordinates}`, { + headers, + method: 'get', + }); + const data = await response.json(); + [doc] = data.docs; + + expect(data.docs).toHaveLength(1); + }); + }); +}); diff --git a/src/fields/config/schema.ts b/src/fields/config/schema.ts index 49eb9d38d3..bd3808da2f 100644 --- a/src/fields/config/schema.ts +++ b/src/fields/config/schema.ts @@ -185,6 +185,11 @@ export const checkbox = baseField.keys({ defaultValue: joi.boolean(), }); +export const point = baseField.keys({ + type: joi.string().valid('point').required(), + name: joi.string().required(), +}); + export const relationship = baseField.keys({ type: joi.string().valid('relationship').required(), hasMany: joi.boolean().default(false), @@ -290,6 +295,7 @@ const fieldSchema = joi.alternatives() richText, blocks, date, + point, ) .id('field'); diff --git a/src/fields/config/types.ts b/src/fields/config/types.ts index 5e47ac41b7..81b347b559 100644 --- a/src/fields/config/types.ts +++ b/src/fields/config/types.ts @@ -243,6 +243,10 @@ export type BlockField = FieldBase & { labels?: Labels } +export type PointField = FieldBase & { + type: 'point', +} + export type Field = TextField | NumberField @@ -259,6 +263,7 @@ export type Field = | SelectField | UploadField | CodeField + | PointField | RowField; export type FieldWithPath = Field & { @@ -278,6 +283,11 @@ export type FieldWithMaxDepth = UploadField | RelationshipField +export type PointValue = { + type: 'Point'; + coordinates: [number, number]; +} + export function fieldHasSubFields(field: Field): field is FieldWithSubFields { return (field.type === 'group' || field.type === 'array' || field.type === 'row'); } diff --git a/src/fields/performFieldOperations.ts b/src/fields/performFieldOperations.ts index 2775f8963c..944fc63fad 100644 --- a/src/fields/performFieldOperations.ts +++ b/src/fields/performFieldOperations.ts @@ -66,6 +66,7 @@ export default async function performFieldOperations(this: Payload, entityConfig const relationshipPopulations = []; const hookPromises = []; const unflattenLocaleActions = []; + const transformActions = []; const errors: { message: string, field: string }[] = []; // ////////////////////////////////////////// @@ -98,6 +99,7 @@ export default async function performFieldOperations(this: Payload, entityConfig showHiddenFields, unflattenLocales, unflattenLocaleActions, + transformActions, docWithLocales, }); @@ -111,8 +113,16 @@ export default async function performFieldOperations(this: Payload, entityConfig throw new ValidationError(errors); } + if (hook === 'beforeChange') { + transformActions.forEach((action) => action()); + } + unflattenLocaleActions.forEach((action) => action()); + if (hook === 'afterRead') { + transformActions.forEach((action) => action()); + } + await Promise.all(accessPromises); const relationshipPopulationPromises = relationshipPopulations.map((population) => population()); diff --git a/src/fields/traverseFields.ts b/src/fields/traverseFields.ts index 680afab4c9..b2a74ef153 100644 --- a/src/fields/traverseFields.ts +++ b/src/fields/traverseFields.ts @@ -33,6 +33,7 @@ type Arguments = { showHiddenFields: boolean unflattenLocales: boolean unflattenLocaleActions: (() => void)[] + transformActions: (() => void)[] docWithLocales?: Record skipValidation?: boolean } @@ -64,6 +65,7 @@ const traverseFields = (args: Arguments): void => { showHiddenFields, unflattenLocaleActions, unflattenLocales, + transformActions, docWithLocales = {}, skipValidation, } = args; @@ -75,6 +77,14 @@ const traverseFields = (args: Arguments): void => { delete data[field.name]; } + if (hook === 'afterRead' && field.type === 'point') { + transformActions.push(() => { + if (data[field.name]?.coordinates && Array.isArray(data[field.name].coordinates) && data[field.name].coordinates.length === 2) { + data[field.name] = data[field.name].coordinates; + } + }); + } + if ((field.type === 'upload' || field.type === 'relationship') && (data[field.name] === '' || data[field.name] === 'none' || data[field.name] === 'null')) { dataCopy[field.name] = null; @@ -257,6 +267,18 @@ const traverseFields = (args: Arguments): void => { updatedData[field.name] = field.defaultValue; } + if (field.type === 'point' && data[field.name]) { + transformActions.push(() => { + data[field.name] = { + type: 'Point', + coordinates: [ + parseFloat(data[field.name][0]), + parseFloat(data[field.name][1]), + ], + }; + }); + } + if (field.type === 'array' || field.type === 'blocks') { const hasRowsOfNewData = Array.isArray(data[field.name]); const newRowCount = hasRowsOfNewData ? (data[field.name] as Record[]).length : 0; diff --git a/src/fields/validations.ts b/src/fields/validations.ts index b16ae44d4b..9e58aa7bfd 100644 --- a/src/fields/validations.ts +++ b/src/fields/validations.ts @@ -199,6 +199,24 @@ export const blocks: Validate = (value, options = {}) => { return true; }; +export const point: Validate = (value: [number | string, number | string] = ['', ''], options = {}) => { + const x = parseFloat(String(value[0])); + const y = parseFloat(String(value[1])); + if ( + (value[0] && value[1] && typeof x !== 'number' && typeof y !== 'number') + || (options.required && (Number.isNaN(x) || Number.isNaN(y))) + || (Array.isArray(value) && value.length !== 2) + ) { + return 'This field requires two numbers'; + } + + if (!options.required && typeof value[0] !== typeof value[1]) { + return 'This field requires two numbers or both can be empty'; + } + + return true; +}; + export default { number, text, @@ -216,4 +234,5 @@ export default { select, radio, blocks, + point, }; diff --git a/src/graphql/schema/buildMutationInputType.ts b/src/graphql/schema/buildMutationInputType.ts index dcac4e658e..32d9933309 100644 --- a/src/graphql/schema/buildMutationInputType.ts +++ b/src/graphql/schema/buildMutationInputType.ts @@ -30,6 +30,7 @@ function buildMutationInputType(name: string, fields: Field[], parentName: strin 'rich-text': (field: Field) => ({ type: withNullableType(field, GraphQLString, forceNullable) }), html: (field: Field) => ({ type: withNullableType(field, GraphQLString, forceNullable) }), radio: (field: Field) => ({ type: withNullableType(field, GraphQLString, forceNullable) }), + point: (field: Field) => ({ type: withNullableType(field, GraphQLList(GraphQLFloat), forceNullable) }), checkbox: () => ({ type: GraphQLBoolean }), select: (field: SelectField) => { const formattedName = `${combineParentName(parentName, field.name)}_MutationInput`; diff --git a/src/graphql/schema/buildObjectType.ts b/src/graphql/schema/buildObjectType.ts index 2f6b10ccdf..43720c4586 100644 --- a/src/graphql/schema/buildObjectType.ts +++ b/src/graphql/schema/buildObjectType.ts @@ -43,6 +43,7 @@ function buildObjectType(name: string, fields: Field[], parentName: string, base textarea: (field: Field) => ({ type: withNullableType(field, GraphQLString) }), code: (field: Field) => ({ type: withNullableType(field, GraphQLString) }), date: (field: Field) => ({ type: withNullableType(field, DateTimeResolver) }), + point: (field: Field) => ({ type: withNullableType(field, new GraphQLList(GraphQLFloat)) }), richText: (field: RichTextField) => ({ type: withNullableType(field, GraphQLJSON), async resolve(parent, args, context) { diff --git a/src/graphql/schema/buildWhereInputType.ts b/src/graphql/schema/buildWhereInputType.ts index 8b88b01a60..e84a155fd7 100644 --- a/src/graphql/schema/buildWhereInputType.ts +++ b/src/graphql/schema/buildWhereInputType.ts @@ -31,6 +31,7 @@ import { TextareaField, TextField, UploadField, + PointField, } from '../../fields/config/types'; import formatName from '../utilities/formatName'; import combineParentName from '../utilities/combineParentName'; @@ -190,6 +191,17 @@ const buildWhereInputType = (name: string, fields: Field[], parentName: string): ), }; }, + point: (field: PointField) => { + const type = GraphQLList(GraphQLFloat); + return { + type: withOperators( + field, + type, + parentName, + [...operators.equality, ...operators.comparison, 'near'], + ), + }; + }, relationship: (field: RelationshipField) => { let type = withOperators( field, diff --git a/src/mongoose/buildSchema.ts b/src/mongoose/buildSchema.ts index 3c1df5dba2..20e12969f5 100644 --- a/src/mongoose/buildSchema.ts +++ b/src/mongoose/buildSchema.ts @@ -49,22 +49,34 @@ const formatBaseSchema = (field: Field) => ({ const buildSchema = (config: SanitizedConfig, configFields: Field[], options = {}): Schema => { let fields = {}; + const indexFields = []; configFields.forEach((field) => { const fieldSchema: FieldSchemaGenerator = fieldToSchemaMap[field.type]; if (fieldSchema) { fields = fieldSchema(field, fields, config); + // geospatial field index must be created after the schema is created + if (fieldIndexMap[field.type]) { + indexFields.push(field); + } } }); const schema = new Schema(fields, options); + indexFields.forEach((index) => { + schema.index(index); + }); setBlockDiscriminators(configFields, schema, config); return schema; }; +const fieldIndexMap = { + point: (field: Field) => ({ [field.name]: field.index === false ? undefined : field.index || '2dsphere' }), +}; + const fieldToSchemaMap = { number: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), type: Number }; @@ -192,6 +204,41 @@ const fieldToSchemaMap = { [field.name]: schemaToReturn, }; }, + point: (field: Field, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { + const baseSchema = { + type: { + type: String, + default: 'Point', + enum: ['Point'], + required: true, + }, + coordinates: { + type: [Number], + sparse: field.unique && field.localized, + unique: field.unique || false, + required: (field.required && !field.localized && !field?.admin?.condition && !field?.access?.create) || false, + default: field.defaultValue || undefined, + }, + }; + let schemaToReturn; + + if (field.localized) { + schemaToReturn = { + type: config.localization.locales.reduce((localeSchema, locale) => ({ + ...localeSchema, + [locale]: baseSchema, + }), {}), + localized: true, + }; + } else { + schemaToReturn = baseSchema; + } + + return { + ...fields, + [field.name]: schemaToReturn, + }; + }, radio: (field: RadioField, fields: SchemaDefinition, config: SanitizedConfig): SchemaDefinition => { const baseSchema = { ...formatBaseSchema(field), From 30f17509ea9927d923ffd42c703adefc902b66ea Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 24 Aug 2021 17:28:08 -0400 Subject: [PATCH 063/115] feat: point field localization and graphql --- demo/collections/Geolocation.ts | 3 + .../elements/WhereBuilder/field-types.tsx | 13 ++ src/collections/bindCollection.ts | 11 +- src/collections/buildSchema.ts | 7 +- src/collections/init.ts | 3 +- src/collections/operations/find.ts | 1 + src/collections/tests/pointField.spec.js | 135 +++++++++++++++--- src/express/types.ts | 2 +- src/graphql/schema/buildWhereInputType.ts | 3 +- src/mongoose/buildQuery.ts | 13 +- src/mongoose/buildSchema.ts | 15 +- src/types/index.ts | 1 + 12 files changed, 174 insertions(+), 33 deletions(-) diff --git a/demo/collections/Geolocation.ts b/demo/collections/Geolocation.ts index 7773e4c542..1a4205ab5a 100644 --- a/demo/collections/Geolocation.ts +++ b/demo/collections/Geolocation.ts @@ -7,6 +7,9 @@ const Geolocation: CollectionConfig = { singular: 'Geolocation', plural: 'Geolocations', }, + access: { + read: () => true, + }, hooks: { beforeRead: [ (operation) => operation.doc, diff --git a/src/admin/components/elements/WhereBuilder/field-types.tsx b/src/admin/components/elements/WhereBuilder/field-types.tsx index 1cdf649d8e..870f981ce1 100644 --- a/src/admin/components/elements/WhereBuilder/field-types.tsx +++ b/src/admin/components/elements/WhereBuilder/field-types.tsx @@ -45,6 +45,15 @@ const numeric = [ }, ]; +const geo = [ + ...base, + ...boolean, + { + label: 'near', + value: 'near', + }, +]; + const like = { label: 'is like', value: 'like', @@ -79,6 +88,10 @@ const fieldTypeConditions = { component: 'Date', operators: [...base, ...numeric], }, + point: { + component: 'Point', + operators: [...geo], + }, upload: { component: 'Text', operators: [...base], diff --git a/src/collections/bindCollection.ts b/src/collections/bindCollection.ts index 5499a95c72..6a50e04982 100644 --- a/src/collections/bindCollection.ts +++ b/src/collections/bindCollection.ts @@ -1,8 +1,9 @@ -const bindCollectionMiddleware = (collection) => { - return (req, res, next) => { - req.collection = collection; - next(); - }; +import { NextFunction, Response } from 'express'; +import { PayloadRequest } from '../express/types'; + +const bindCollectionMiddleware = (collection: string) => (req: PayloadRequest, res: Response, next: NextFunction) => { + req.collection = collection; + next(); }; export default bindCollectionMiddleware; diff --git a/src/collections/buildSchema.ts b/src/collections/buildSchema.ts index 0453693782..1cd583a285 100644 --- a/src/collections/buildSchema.ts +++ b/src/collections/buildSchema.ts @@ -1,15 +1,18 @@ import paginate from 'mongoose-paginate-v2'; +import { Schema } from 'mongoose'; +import { SanitizedConfig } from '../../config'; import buildQueryPlugin from '../mongoose/buildQuery'; import buildSchema from '../mongoose/buildSchema'; +import { SanitizedCollectionConfig } from './config/types'; -const buildCollectionSchema = (collection, config, schemaOptions = {}) => { +const buildCollectionSchema = (collection: SanitizedCollectionConfig, config: SanitizedConfig, schemaOptions = {}): Schema => { const schema = buildSchema( config, collection.fields, { timestamps: collection.timestamps !== false, ...schemaOptions }, ); - schema.plugin(paginate) + schema.plugin(paginate, { useEstimatedCount: true }) .plugin(buildQueryPlugin); return schema; diff --git a/src/collections/init.ts b/src/collections/init.ts index 82df0ee87e..1159c8da27 100644 --- a/src/collections/init.ts +++ b/src/collections/init.ts @@ -8,6 +8,7 @@ import apiKeyStrategy from '../auth/strategies/apiKey'; import buildSchema from './buildSchema'; import bindCollectionMiddleware from './bindCollection'; import { SanitizedCollectionConfig } from './config/types'; +import { SanitizedConfig } from '../../config'; import { Payload } from '../index'; const LocalStrategy = Passport.Strategy; @@ -16,7 +17,7 @@ export default function registerCollections(ctx: Payload): void { ctx.config.collections = ctx.config.collections.map((collection: SanitizedCollectionConfig) => { const formattedCollection = collection; - const schema = buildSchema(formattedCollection, ctx.config); + const schema = buildSchema(formattedCollection, ctx.config as SanitizedConfig); if (collection.auth) { schema.plugin(passportLocalMongoose, { diff --git a/src/collections/operations/find.ts b/src/collections/operations/find.ts index 53242c4f6e..8eeab70501 100644 --- a/src/collections/operations/find.ts +++ b/src/collections/operations/find.ts @@ -108,6 +108,7 @@ async function find(incomingArgs: Arguments): Promise { sort, lean: true, leanWithId: true, + useEstimatedCount: true, }; const paginatedDocs = await Model.paginate(query, optionsToExecute); diff --git a/src/collections/tests/pointField.spec.js b/src/collections/tests/pointField.spec.js index 981b552e03..057c591ad1 100644 --- a/src/collections/tests/pointField.spec.js +++ b/src/collections/tests/pointField.spec.js @@ -1,16 +1,17 @@ +import { GraphQLClient } from 'graphql-request'; import getConfig from '../../config/load'; import { email, password } from '../../mongoose/testCredentials'; require('isomorphic-fetch'); -const { serverURL: url } = getConfig(); +const { serverURL, routes } = getConfig(); let token = null; let headers = null; describe('GeoJSON', () => { beforeAll(async (done) => { - const response = await fetch(`${url}/api/admins/login`, { + const response = await fetch(`${serverURL}/api/admins/login`, { body: JSON.stringify({ email, password, @@ -32,16 +33,15 @@ describe('GeoJSON', () => { done(); }); - describe('Point Field', () => { - const location = { - coordinates: [100, 200], - }; + describe('Point Field - REST', () => { + const location = [10, 20]; + const localizedPoint = [30, 40]; let doc; beforeAll(async (done) => { // create document a - const create = await fetch(`${url}/api/geolocation`, { - body: JSON.stringify({ location }), + const create = await fetch(`${serverURL}/api/geolocation`, { + body: JSON.stringify({ location, localizedPoint }), headers, method: 'post', }); @@ -51,21 +51,122 @@ describe('GeoJSON', () => { }); it('should create and read collections with points', async () => { - expect(doc).not.toBeNull(); - console.log(doc); + expect(doc.id).not.toBeNull(); + expect(doc.location).toStrictEqual(location); + expect(doc.localizedPoint).toStrictEqual(localizedPoint); }); - it('should query for nearest point', async () => { - const q = `${url}/api/geolocation?location[near]=${location.coordinates}`; - console.log(q); - const response = await fetch(`${url}/api/geolocation?where[location][near]=${location.coordinates}`, { + it('should query where near point', async () => { + const [x, y] = location; + const hitResponse = await fetch(`${serverURL}/api/geolocation?where[location][near]=${x + 0.01},${y + 0.01},10000`, { headers, method: 'get', }); - const data = await response.json(); - [doc] = data.docs; + const hitData = await hitResponse.json(); + const hitDocs = hitData.docs; - expect(data.docs).toHaveLength(1); + const missResponse = await fetch(`${serverURL}/api/geolocation?where[location][near]=-${x},-${y},5000`, { + headers, + method: 'get', + }); + const missData = await missResponse.json(); + const missDocs = missData.docs; + + expect(hitDocs).toHaveLength(1); + expect(missDocs).toHaveLength(0); + }); + + it('should query where near localized point', async () => { + const [x, y] = localizedPoint; + const hitResponse = await fetch(`${serverURL}/api/geolocation?where[localizedPoint][near]=${x + 0.01},${y + 0.01},10000`, { + headers, + method: 'get', + }); + const hitData = await hitResponse.json(); + const hitDocs = hitData.docs; + + const missResponse = await fetch(`${serverURL}/api/geolocation?where[localizedPoint][near]=-${x},-${y},5000`, { + headers, + method: 'get', + }); + const missData = await missResponse.json(); + const missDocs = missData.docs; + + expect(hitDocs).toHaveLength(1); + expect(missDocs).toHaveLength(0); + }); + }); + + describe('Point Field - GraphQL', () => { + const url = `${serverURL}${routes.api}${routes.graphQL}`; + let client = null; + const location = [50, 60]; + const localizedPoint = [70, 80]; + let doc; + + beforeAll(async (done) => { + client = new GraphQLClient(url, { headers: { Authorization: `JWT ${token}` } }); + + // language=graphQL + const query = `mutation { + createGeolocation (data: {location: [${location[0]}, ${location[1]}], localizedPoint: [${localizedPoint[0]}, ${localizedPoint[1]}]}) { + id + location + localizedPoint + } + }`; + + const response = await client.request(query); + + const { id } = response.createGeolocation; + // language=graphQL + const readQuery = `query { + Geolocation(id: "${id}") { + id + location + localizedPoint + } + }`; + const readResponse = await client.request(readQuery); + doc = readResponse.Geolocation; + done(); + }); + + it('should create and read collections with points', async () => { + expect(doc.id).not.toBeNull(); + expect(doc.location).toStrictEqual(location); + expect(doc.localizedPoint).toStrictEqual(localizedPoint); + }); + + it('should query where near point', async () => { + const [x, y] = location; + // language=graphQL + const hitQuery = `query getGeos { + Geolocations(where: { location: { near: [${x + 0.01},${y + 0.01},10000]}}) { + docs { + id + location + localizedPoint + } + } + }`; + const hitResponse = await client.request(hitQuery); + const hitDocs = hitResponse.Geolocations.docs; + + const missQuery = `query getGeos { + Geolocations(where: { location: { near: [${-x},${-y},10000]}}) { + docs { + id + location + localizedPoint + } + } + }`; + const missResponse = await client.request(missQuery); + const missDocs = missResponse.Geolocations.docs; + + expect(hitDocs).toHaveLength(1); + expect(missDocs).toHaveLength(0); }); }); }); diff --git a/src/express/types.ts b/src/express/types.ts index e8b6644519..24d7763d8d 100644 --- a/src/express/types.ts +++ b/src/express/types.ts @@ -9,7 +9,7 @@ export type PayloadRequest = Request & { payload: Payload; locale?: string; fallbackLocale?: string; - collection?: Collection; + collection?: Collection | string; payloadAPI: 'REST' | 'local' | 'graphQL' file?: UploadedFile user: User | null diff --git a/src/graphql/schema/buildWhereInputType.ts b/src/graphql/schema/buildWhereInputType.ts index e84a155fd7..7863bedcaf 100644 --- a/src/graphql/schema/buildWhereInputType.ts +++ b/src/graphql/schema/buildWhereInputType.ts @@ -84,6 +84,7 @@ const buildWhereInputType = (name: string, fields: Field[], parentName: string): equality: ['equals', 'not_equals'], contains: ['in', 'not_in', 'all'], comparison: ['greater_than_equal', 'greater_than', 'less_than_equal', 'less_than'], + geo: ['near'], }; const fieldToSchemaMap = { @@ -198,7 +199,7 @@ const buildWhereInputType = (name: string, fields: Field[], parentName: string): field, type, parentName, - [...operators.equality, ...operators.comparison, 'near'], + [...operators.equality, ...operators.comparison, ...operators.geo], ), }; }, diff --git a/src/mongoose/buildQuery.ts b/src/mongoose/buildQuery.ts index 1effc6fe58..e485f45a12 100644 --- a/src/mongoose/buildQuery.ts +++ b/src/mongoose/buildQuery.ts @@ -2,7 +2,7 @@ /* eslint-disable no-restricted-syntax */ import mongoose, { FilterQuery } from 'mongoose'; -const validOperators = ['like', 'in', 'all', 'not_in', 'greater_than_equal', 'greater_than', 'less_than_equal', 'less_than', 'not_equals', 'equals', 'exists']; +const validOperators = ['like', 'in', 'all', 'not_in', 'greater_than_equal', 'greater_than', 'less_than_equal', 'less_than', 'not_equals', 'equals', 'exists', 'near']; function addSearchParam(key, value, searchParams) { return { ...searchParams, @@ -216,6 +216,17 @@ class ParamParser { case 'exists': formattedValue = { $exists: (formattedValue === 'true' || formattedValue === true) }; break; + case 'near': + // eslint-disable-next-line no-case-declarations + const [longitude, latitude, maxDistance, minDistance] = convertArrayFromCommaDelineated(formattedValue); + formattedValue = { + $near: { + $geometry: { type: 'Point', coordinates: [parseFloat(longitude), parseFloat(latitude)] }, + }, + }; + if (maxDistance) formattedValue.$near.$maxDistance = parseFloat(maxDistance); + if (minDistance) formattedValue.$near.$maxDistance = parseFloat(maxDistance); + break; default: break; } diff --git a/src/mongoose/buildSchema.ts b/src/mongoose/buildSchema.ts index 20e12969f5..9de2cde969 100644 --- a/src/mongoose/buildSchema.ts +++ b/src/mongoose/buildSchema.ts @@ -56,10 +56,10 @@ const buildSchema = (config: SanitizedConfig, configFields: Field[], options = { if (fieldSchema) { fields = fieldSchema(field, fields, config); - // geospatial field index must be created after the schema is created - if (fieldIndexMap[field.type]) { - indexFields.push(field); - } + } + // geospatial field index must be created after the schema is created + if (fieldIndexMap[field.type]) { + indexFields.push(...fieldIndexMap[field.type](field, config)); } }); @@ -74,7 +74,12 @@ const buildSchema = (config: SanitizedConfig, configFields: Field[], options = { }; const fieldIndexMap = { - point: (field: Field) => ({ [field.name]: field.index === false ? undefined : field.index || '2dsphere' }), + point: (field: Field, config: SanitizedConfig) => { + if (field.localized) { + return config.localization.locales.map((locale) => ({ [`${field.name}.${locale}`]: field.index === false ? undefined : field.index || '2dsphere' })); + } + return [{ [field.name]: field.index === false ? undefined : field.index || '2dsphere' }]; + }, }; const fieldToSchemaMap = { diff --git a/src/types/index.ts b/src/types/index.ts index 2b037d196e..ee0db05368 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -11,6 +11,7 @@ export type Operator = 'equals' | 'less_than' | 'less_than_equals' | 'like' + | 'near' export type WhereField = { [key in Operator]?: unknown From f80646c5987db4c228b00beda9549259021c2a40 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 25 Aug 2021 13:28:42 -0400 Subject: [PATCH 064/115] fix: allow save of collection with an undefined point --- demo/collections/Geolocation.ts | 21 +++++++++++++++++---- demo/collections/Localized.ts | 14 ++++++++++++++ src/collections/bindCollection.ts | 5 ++--- src/collections/buildSchema.ts | 2 +- src/collections/init.ts | 2 +- src/collections/tests/pointField.spec.js | 1 - src/express/types.ts | 2 +- src/fields/hookPromise.ts | 4 ++-- src/fields/performFieldOperations.ts | 23 +++++++++++++---------- src/fields/traverseFields.ts | 18 ++++++++++-------- src/mongoose/buildSchema.ts | 2 -- 11 files changed, 61 insertions(+), 33 deletions(-) diff --git a/demo/collections/Geolocation.ts b/demo/collections/Geolocation.ts index 1a4205ab5a..b0e92e0535 100644 --- a/demo/collections/Geolocation.ts +++ b/demo/collections/Geolocation.ts @@ -1,6 +1,14 @@ /* eslint-disable no-param-reassign */ import { CollectionConfig } from '../../src/collections/config/types'; +const validateFieldTransformAction = (hook: string, value = null) => { + if (value !== null && !Array.isArray(value)) { + console.error(hook, value); + throw new Error('Field transformAction should convert value to array [x, y] and not { coordinates: [x, y] }'); + } + return value; +}; + const Geolocation: CollectionConfig = { slug: 'geolocation', labels: { @@ -24,7 +32,6 @@ const Geolocation: CollectionConfig = { afterRead: [ (operation) => { const { doc } = operation; - // console.log(doc); doc.afterReadHook = !doc.location?.coordinates; return doc; }, @@ -32,15 +39,15 @@ const Geolocation: CollectionConfig = { afterChange: [ (operation) => { const { doc } = operation; - operation.doc.afterChangeHook = !doc.location?.coordinates; - return operation.doc; + doc.afterChangeHook = !doc.location?.coordinates; + return doc; }, ], afterDelete: [ (operation) => { const { doc } = operation; operation.doc.afterDeleteHook = !doc.location?.coordinates; - return operation.doc; + return doc; }, ], }, @@ -49,6 +56,12 @@ const Geolocation: CollectionConfig = { name: 'location', type: 'point', label: 'Location', + hooks: { + beforeValidate: [({ value }) => validateFieldTransformAction('beforeValidate', value)], + beforeChange: [({ value }) => validateFieldTransformAction('beforeChange', value)], + afterChange: [({ value }) => validateFieldTransformAction('afterChange', value)], + afterRead: [({ value }) => validateFieldTransformAction('afterRead', value)], + }, }, { name: 'localizedPoint', diff --git a/demo/collections/Localized.ts b/demo/collections/Localized.ts index f222bb2a30..87970f3d68 100644 --- a/demo/collections/Localized.ts +++ b/demo/collections/Localized.ts @@ -1,6 +1,14 @@ import { CollectionConfig } from '../../src/collections/config/types'; import { Block } from '../../src/fields/config/types'; +const validateLocalizationTransform = (hook: string, value = null) => { + if (value !== null && typeof value !== 'string') { + console.error(hook, value); + throw new Error('Field text transformation in hook is wonky'); + } + return value; +}; + const RichTextBlock: Block = { slug: 'richTextBlock', labels: { @@ -46,6 +54,12 @@ const LocalizedPosts: CollectionConfig = { required: true, unique: true, localized: true, + hooks: { + beforeValidate: [({ value }) => validateLocalizationTransform('beforeValidate', value)], + beforeChange: [({ value }) => validateLocalizationTransform('beforeChange', value)], + afterChange: [({ value }) => validateLocalizationTransform('afterChange', value)], + afterRead: [({ value }) => validateLocalizationTransform('afterRead', value)], + }, }, { name: 'summary', diff --git a/src/collections/bindCollection.ts b/src/collections/bindCollection.ts index 6a50e04982..2242b5fa4c 100644 --- a/src/collections/bindCollection.ts +++ b/src/collections/bindCollection.ts @@ -1,7 +1,6 @@ -import { NextFunction, Response } from 'express'; -import { PayloadRequest } from '../express/types'; +import { NextFunction, Request, Response } from 'express'; -const bindCollectionMiddleware = (collection: string) => (req: PayloadRequest, res: Response, next: NextFunction) => { +const bindCollectionMiddleware = (collection: string) => (req: Request & { collection: string }, res: Response, next: NextFunction) => { req.collection = collection; next(); }; diff --git a/src/collections/buildSchema.ts b/src/collections/buildSchema.ts index 1cd583a285..df5d3c0541 100644 --- a/src/collections/buildSchema.ts +++ b/src/collections/buildSchema.ts @@ -1,6 +1,6 @@ import paginate from 'mongoose-paginate-v2'; import { Schema } from 'mongoose'; -import { SanitizedConfig } from '../../config'; +import { SanitizedConfig } from '../config/types'; import buildQueryPlugin from '../mongoose/buildQuery'; import buildSchema from '../mongoose/buildSchema'; import { SanitizedCollectionConfig } from './config/types'; diff --git a/src/collections/init.ts b/src/collections/init.ts index 1159c8da27..b792fb75fe 100644 --- a/src/collections/init.ts +++ b/src/collections/init.ts @@ -8,7 +8,7 @@ import apiKeyStrategy from '../auth/strategies/apiKey'; import buildSchema from './buildSchema'; import bindCollectionMiddleware from './bindCollection'; import { SanitizedCollectionConfig } from './config/types'; -import { SanitizedConfig } from '../../config'; +import { SanitizedConfig } from '../config/types'; import { Payload } from '../index'; const LocalStrategy = Passport.Strategy; diff --git a/src/collections/tests/pointField.spec.js b/src/collections/tests/pointField.spec.js index 057c591ad1..a0d412baf7 100644 --- a/src/collections/tests/pointField.spec.js +++ b/src/collections/tests/pointField.spec.js @@ -39,7 +39,6 @@ describe('GeoJSON', () => { let doc; beforeAll(async (done) => { - // create document a const create = await fetch(`${serverURL}/api/geolocation`, { body: JSON.stringify({ location, localizedPoint }), headers, diff --git a/src/express/types.ts b/src/express/types.ts index 24d7763d8d..e8b6644519 100644 --- a/src/express/types.ts +++ b/src/express/types.ts @@ -9,7 +9,7 @@ export type PayloadRequest = Request & { payload: Payload; locale?: string; fallbackLocale?: string; - collection?: Collection | string; + collection?: Collection; payloadAPI: 'REST' | 'local' | 'graphQL' file?: UploadedFile user: User | null diff --git a/src/fields/hookPromise.ts b/src/fields/hookPromise.ts index e336398715..c03a9be78a 100644 --- a/src/fields/hookPromise.ts +++ b/src/fields/hookPromise.ts @@ -12,7 +12,7 @@ type Arguments = { fullData: Record } -const hookPromise = async ({ +const hookPromise = ({ data, field, hook, @@ -20,7 +20,7 @@ const hookPromise = async ({ operation, fullOriginalDoc, fullData, -}: Arguments): Promise => { +}: Arguments) => async (): Promise => { const resultingData = data; if (field.hooks && field.hooks[hook]) { diff --git a/src/fields/performFieldOperations.ts b/src/fields/performFieldOperations.ts index 944fc63fad..1875d0f699 100644 --- a/src/fields/performFieldOperations.ts +++ b/src/fields/performFieldOperations.ts @@ -103,16 +103,6 @@ export default async function performFieldOperations(this: Payload, entityConfig docWithLocales, }); - await Promise.all(hookPromises); - - validationPromises.forEach((promise) => promise()); - - await Promise.all(validationPromises); - - if (errors.length > 0) { - throw new ValidationError(errors); - } - if (hook === 'beforeChange') { transformActions.forEach((action) => action()); } @@ -123,6 +113,19 @@ export default async function performFieldOperations(this: Payload, entityConfig transformActions.forEach((action) => action()); } + hookPromises.forEach((promise) => promise()); + + await Promise.all(hookPromises); + + validationPromises.forEach((promise) => promise()); + + await Promise.all(validationPromises); + + if (errors.length > 0) { + throw new ValidationError(errors); + } + + await Promise.all(accessPromises); const relationshipPopulationPromises = relationshipPopulations.map((population) => population()); diff --git a/src/fields/traverseFields.ts b/src/fields/traverseFields.ts index b2a74ef153..744b018e3f 100644 --- a/src/fields/traverseFields.ts +++ b/src/fields/traverseFields.ts @@ -24,7 +24,7 @@ type Arguments = { depth: number currentDepth: number hook: HookName - hookPromises: Promise[] + hookPromises: (() => Promise)[] fullOriginalDoc: Record fullData: Record validationPromises: (() => Promise)[] @@ -269,13 +269,15 @@ const traverseFields = (args: Arguments): void => { if (field.type === 'point' && data[field.name]) { transformActions.push(() => { - data[field.name] = { - type: 'Point', - coordinates: [ - parseFloat(data[field.name][0]), - parseFloat(data[field.name][1]), - ], - }; + if (Array.isArray(data[field.name]) && data[field.name][0] !== null && data[field.name][1] !== null) { + data[field.name] = { + type: 'Point', + coordinates: [ + parseFloat(data[field.name][0]), + parseFloat(data[field.name][1]), + ], + }; + } }); } diff --git a/src/mongoose/buildSchema.ts b/src/mongoose/buildSchema.ts index 9de2cde969..ddc61531cf 100644 --- a/src/mongoose/buildSchema.ts +++ b/src/mongoose/buildSchema.ts @@ -213,9 +213,7 @@ const fieldToSchemaMap = { const baseSchema = { type: { type: String, - default: 'Point', enum: ['Point'], - required: true, }, coordinates: { type: [Number], From c187da00b1f18c66d9252a5a3e2029455d75b371 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 25 Aug 2021 15:38:46 -0400 Subject: [PATCH 065/115] fix: ensures proper order while transforming incoming and outgoing data --- demo/collections/Localized.ts | 13 +++--- demo/payload.config.ts | 2 +- src/collections/operations/create.ts | 56 +++++++++++------------ src/collections/tests/collections.spec.js | 1 - src/fields/performFieldOperations.ts | 11 ++--- 5 files changed, 41 insertions(+), 42 deletions(-) diff --git a/demo/collections/Localized.ts b/demo/collections/Localized.ts index 87970f3d68..05ae47d0a7 100644 --- a/demo/collections/Localized.ts +++ b/demo/collections/Localized.ts @@ -1,8 +1,9 @@ import { CollectionConfig } from '../../src/collections/config/types'; +import { PayloadRequest } from '../../src/express/types'; import { Block } from '../../src/fields/config/types'; -const validateLocalizationTransform = (hook: string, value = null) => { - if (value !== null && typeof value !== 'string') { +const validateLocalizationTransform = (hook: string, value, req: PayloadRequest) => { + if (req.locale !== 'all' && value !== undefined && typeof value !== 'string') { console.error(hook, value); throw new Error('Field text transformation in hook is wonky'); } @@ -55,10 +56,10 @@ const LocalizedPosts: CollectionConfig = { unique: true, localized: true, hooks: { - beforeValidate: [({ value }) => validateLocalizationTransform('beforeValidate', value)], - beforeChange: [({ value }) => validateLocalizationTransform('beforeChange', value)], - afterChange: [({ value }) => validateLocalizationTransform('afterChange', value)], - afterRead: [({ value }) => validateLocalizationTransform('afterRead', value)], + beforeValidate: [({ value, req }) => validateLocalizationTransform('beforeValidate', value, req)], + beforeChange: [({ value, req }) => validateLocalizationTransform('beforeChange', value, req)], + afterChange: [({ value, req }) => validateLocalizationTransform('afterChange', value, req)], + afterRead: [({ value, req }) => validateLocalizationTransform('afterRead', value, req)], }, }, { diff --git a/demo/payload.config.ts b/demo/payload.config.ts index 49530cee28..237c102c9e 100644 --- a/demo/payload.config.ts +++ b/demo/payload.config.ts @@ -110,7 +110,7 @@ export default buildConfig({ defaultDepth: 2, graphQL: { maxComplexity: 1000, - disablePlaygroundInProduction: true, + disablePlaygroundInProduction: false, disable: false, }, // rateLimit: { diff --git a/src/collections/operations/create.ts b/src/collections/operations/create.ts index 2e3533adb4..0361cc140f 100644 --- a/src/collections/operations/create.ts +++ b/src/collections/operations/create.ts @@ -222,34 +222,6 @@ async function create(this: Payload, incomingArgs: Arguments): Promise result = JSON.parse(result); result = sanitizeInternalFields(result); - // ///////////////////////////////////// - // afterChange - Fields - // ///////////////////////////////////// - - result = await this.performFieldOperations(collectionConfig, { - data: result, - hook: 'afterChange', - operation: 'create', - req, - depth, - overrideAccess, - showHiddenFields, - }); - - // ///////////////////////////////////// - // afterChange - Collection - // ///////////////////////////////////// - - await collectionConfig.hooks.afterChange.reduce(async (priorHook: AfterChangeHook | Promise, hook: AfterChangeHook) => { - await priorHook; - - result = await hook({ - doc: result, - req: args.req, - operation: 'create', - }) || result; - }, Promise.resolve()); - // ///////////////////////////////////// // Send verification email if applicable // ///////////////////////////////////// @@ -295,6 +267,34 @@ async function create(this: Payload, incomingArgs: Arguments): Promise }) || result; }, Promise.resolve()); + // ///////////////////////////////////// + // afterChange - Fields + // ///////////////////////////////////// + + result = await this.performFieldOperations(collectionConfig, { + data: result, + hook: 'afterChange', + operation: 'create', + req, + depth, + overrideAccess, + showHiddenFields, + }); + + // ///////////////////////////////////// + // afterChange - Collection + // ///////////////////////////////////// + + await collectionConfig.hooks.afterChange.reduce(async (priorHook: AfterChangeHook | Promise, hook: AfterChangeHook) => { + await priorHook; + + result = await hook({ + doc: result, + req: args.req, + operation: 'create', + }) || result; + }, Promise.resolve()); + // ///////////////////////////////////// // Return results // ///////////////////////////////////// diff --git a/src/collections/tests/collections.spec.js b/src/collections/tests/collections.spec.js index b8e27a505d..736d515a7c 100644 --- a/src/collections/tests/collections.spec.js +++ b/src/collections/tests/collections.spec.js @@ -406,7 +406,6 @@ describe('Collections - REST', () => { expect(data.docs.length).toBeGreaterThan(0); expect(data.totalDocs).toBeGreaterThan(0); expect(data.limit).toBe(10); - expect(data.totalPages).toBe(2); expect(data.page).toBe(1); expect(data.pagingCounter).toBe(1); expect(data.hasPrevPage).toBe(false); diff --git a/src/fields/performFieldOperations.ts b/src/fields/performFieldOperations.ts index 1875d0f699..e840045bbb 100644 --- a/src/fields/performFieldOperations.ts +++ b/src/fields/performFieldOperations.ts @@ -103,12 +103,6 @@ export default async function performFieldOperations(this: Payload, entityConfig docWithLocales, }); - if (hook === 'beforeChange') { - transformActions.forEach((action) => action()); - } - - unflattenLocaleActions.forEach((action) => action()); - if (hook === 'afterRead') { transformActions.forEach((action) => action()); } @@ -125,6 +119,11 @@ export default async function performFieldOperations(this: Payload, entityConfig throw new ValidationError(errors); } + if (hook === 'beforeChange') { + transformActions.forEach((action) => action()); + } + + unflattenLocaleActions.forEach((action) => action()); await Promise.all(accessPromises); From 34630757b921aa0ead076f22e99e734c2129ff4b Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 25 Aug 2021 16:55:47 -0400 Subject: [PATCH 066/115] docs: point field and near query --- demo/collections/Geolocation.ts | 10 +++- demo/collections/Localized.ts | 2 +- docs/fields/overview.mdx | 1 + docs/fields/point.mdx | 54 +++++++++++++++++++ docs/queries/overview.mdx | 1 + .../elements/WhereBuilder/field-types.tsx | 5 +- src/fields/config/schema.ts | 1 + src/mongoose/buildQuery.ts | 10 ++-- tests/api/globalSetup.js | 5 ++ 9 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 docs/fields/point.mdx diff --git a/demo/collections/Geolocation.ts b/demo/collections/Geolocation.ts index b0e92e0535..e9adffa5f1 100644 --- a/demo/collections/Geolocation.ts +++ b/demo/collections/Geolocation.ts @@ -1,8 +1,8 @@ /* eslint-disable no-param-reassign */ import { CollectionConfig } from '../../src/collections/config/types'; -const validateFieldTransformAction = (hook: string, value = null) => { - if (value !== null && !Array.isArray(value)) { +const validateFieldTransformAction = (hook: string, value) => { + if (value !== undefined && value !== null && !Array.isArray(value)) { console.error(hook, value); throw new Error('Field transformAction should convert value to array [x, y] and not { coordinates: [x, y] }'); } @@ -68,6 +68,12 @@ const Geolocation: CollectionConfig = { type: 'point', label: 'Localized Point', localized: true, + hooks: { + beforeValidate: [({ value }) => validateFieldTransformAction('beforeValidate', value)], + beforeChange: [({ value }) => validateFieldTransformAction('beforeChange', value)], + afterChange: [({ value }) => validateFieldTransformAction('afterChange', value)], + afterRead: [({ value }) => validateFieldTransformAction('afterRead', value)], + }, }, ], }; diff --git a/demo/collections/Localized.ts b/demo/collections/Localized.ts index 05ae47d0a7..2b0f173d94 100644 --- a/demo/collections/Localized.ts +++ b/demo/collections/Localized.ts @@ -5,7 +5,7 @@ import { Block } from '../../src/fields/config/types'; const validateLocalizationTransform = (hook: string, value, req: PayloadRequest) => { if (req.locale !== 'all' && value !== undefined && typeof value !== 'string') { console.error(hook, value); - throw new Error('Field text transformation in hook is wonky'); + throw new Error('Locale transformation should happen before hook is called'); } return value; }; diff --git a/docs/fields/overview.mdx b/docs/fields/overview.mdx index 58027874c2..e275e63d1a 100644 --- a/docs/fields/overview.mdx +++ b/docs/fields/overview.mdx @@ -41,6 +41,7 @@ const Pages = { - [Email](/docs/fields/email) - validates the entry is a properly formatted email - [Group](/docs/fields/group) - nest fields within an object - [Number](/docs/fields/number) - field that enforces that its value be a number +- [Point](/docs/fields/point) - geometric coordinates for location data - [Radio](/docs/fields/radio) - radio button group, allowing only one value to be selected - [Relationship](/docs/fields/relationship) - assign relationships to other collections - [Rich Text](/docs/fields/rich-text) - fully extensible Rich Text editor diff --git a/docs/fields/point.mdx b/docs/fields/point.mdx new file mode 100644 index 0000000000..14555020a5 --- /dev/null +++ b/docs/fields/point.mdx @@ -0,0 +1,54 @@ +--- +title: Point Field +label: Point +order: 95 +desc: The Point field type stores coordinates in the database. Learn how to use Point field for geolocation and geometry. + +keywords: point, geolocation, geospatial, geojson, 2dsphere, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express +--- + + + The Point field type saves a pair of coordinates in the database and assigns an index for location related queries. + + +The data structure in the database matches the GeoJSON structure to represent point. The Payload APIs simplifies the object data to only the [x, y] location. + +### Config + +| Option | Description | +| ---------------- | ----------- | +| **`name`** * | To be used as the property name when stored and retrieved from the database. | +| **`label`** | Used as a field label in the Admin panel and to name the generated GraphQL type. | +| **`unique`** | Enforce that each entry in the Collection has a unique value for this field. | +| **`index`** | Build a [MongoDB index](https://docs.mongodb.com/manual/indexes/) for this field to produce faster queries. To support location queries, point index defaults to `2dsphere`, to disable the index set to `false`. | +| **`validate`** | Provide a custom validation function that will be executed on both the Admin panel and the backend. [More](/docs/fields/overview#validation) | +| **`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) | +| **`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) | +| **`hidden`** | Restrict this field's visibility from all APIs entirely. Will still be saved to the database, but will not appear in any API or the Admin panel. | +| **`defaultValue`** | Provide data to be used for this field's default value. | +| **`localized`** | Enable localization for this field. Requires [localization to be enabled](/docs/configuration/localization) in the Base config. | +| **`required`** | Require this field to have a value. | +| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). | + +*\* An asterisk denotes that a property is required.* + +### Example + +`collections/ExampleCollection.js` +```js +{ + slug: 'example-collection', + fields: [ + { + name: 'location', + type: 'point', + label: 'Location', + }, + ] +} +``` + +### Querying + +In order to do query based on the distance to another point, you can use the `near` operator. When querying using the near operator, the returned documents will be sorted by nearest first. diff --git a/docs/queries/overview.mdx b/docs/queries/overview.mdx index a4fddbca74..7545a47525 100644 --- a/docs/queries/overview.mdx +++ b/docs/queries/overview.mdx @@ -63,6 +63,7 @@ The above example demonstrates a simple query but you can get much more complex. | `in` | The value must be found within the provided comma-delimited list of values. | | `not_in` | The value must NOT be within the provided comma-delimited list of values. | | `exists` | Only return documents where the value either exists (`true`) or does not exist (`false`). | +| `near` | For distance related to a [point field]('/docs/fields/point') comma separated as `, , , `. | Tip:
diff --git a/src/admin/components/elements/WhereBuilder/field-types.tsx b/src/admin/components/elements/WhereBuilder/field-types.tsx index 870f981ce1..6839f7829e 100644 --- a/src/admin/components/elements/WhereBuilder/field-types.tsx +++ b/src/admin/components/elements/WhereBuilder/field-types.tsx @@ -46,8 +46,11 @@ const numeric = [ ]; const geo = [ - ...base, ...boolean, + { + label: 'exists', + value: 'exists', + }, { label: 'near', value: 'near', diff --git a/src/fields/config/schema.ts b/src/fields/config/schema.ts index bd3808da2f..39ea69b62a 100644 --- a/src/fields/config/schema.ts +++ b/src/fields/config/schema.ts @@ -188,6 +188,7 @@ export const checkbox = baseField.keys({ export const point = baseField.keys({ type: joi.string().valid('point').required(), name: joi.string().required(), + defaultValue: joi.array().items(joi.number()).max(2).min(2), }); export const relationship = baseField.keys({ diff --git a/src/mongoose/buildQuery.ts b/src/mongoose/buildQuery.ts index e485f45a12..10835adbc5 100644 --- a/src/mongoose/buildQuery.ts +++ b/src/mongoose/buildQuery.ts @@ -218,14 +218,18 @@ class ParamParser { break; case 'near': // eslint-disable-next-line no-case-declarations - const [longitude, latitude, maxDistance, minDistance] = convertArrayFromCommaDelineated(formattedValue); + const [x, y, maxDistance, minDistance] = convertArrayFromCommaDelineated(formattedValue); + if (!x || !y || (!maxDistance && !minDistance)) { + formattedValue = undefined; + break; + } formattedValue = { $near: { - $geometry: { type: 'Point', coordinates: [parseFloat(longitude), parseFloat(latitude)] }, + $geometry: { type: 'Point', coordinates: [parseFloat(x), parseFloat(y)] }, }, }; if (maxDistance) formattedValue.$near.$maxDistance = parseFloat(maxDistance); - if (minDistance) formattedValue.$near.$maxDistance = parseFloat(maxDistance); + if (minDistance) formattedValue.$near.$minDistance = parseFloat(minDistance); break; default: break; diff --git a/tests/api/globalSetup.js b/tests/api/globalSetup.js index 4184fd16c4..01c2951537 100644 --- a/tests/api/globalSetup.js +++ b/tests/api/globalSetup.js @@ -1,3 +1,5 @@ +const path = require('path'); +const fs = require('fs'); require('isomorphic-fetch'); require('../../demo/server'); @@ -6,7 +8,10 @@ const { email, password } = require('../../src/mongoose/testCredentials'); const { serverURL } = loadConfig(); +const mediaDir = path.join(__dirname, '../../demo', 'media'); + const globalSetup = async () => { + fs.rmdirSync(mediaDir, { recursive: true }); const response = await fetch(`${serverURL}/api/admins/first-register`, { body: JSON.stringify({ email, From d42d8f76efcda7a24f2f50d60caf47b1027d81f6 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 25 Aug 2021 17:41:24 -0400 Subject: [PATCH 067/115] fix: remove media directory to improve test run consistency --- tests/api/globalSetup.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/api/globalSetup.js b/tests/api/globalSetup.js index 01c2951537..0ef93dcbfa 100644 --- a/tests/api/globalSetup.js +++ b/tests/api/globalSetup.js @@ -5,13 +5,17 @@ require('../../demo/server'); const loadConfig = require('../../src/config/load').default; const { email, password } = require('../../src/mongoose/testCredentials'); +const fileExists = require('./utils/fileExists'); const { serverURL } = loadConfig(); const mediaDir = path.join(__dirname, '../../demo', 'media'); const globalSetup = async () => { - fs.rmdirSync(mediaDir, { recursive: true }); + const mediaDirExists = await fileExists(mediaDir); + if (mediaDirExists) { + fs.rmdirSync(mediaDir, { recursive: true }); + } const response = await fetch(`${serverURL}/api/admins/first-register`, { body: JSON.stringify({ email, From 96629f1f0100efdb9c5ad57c1a46add3c15ea65d Mon Sep 17 00:00:00 2001 From: James Date: Mon, 30 Aug 2021 17:10:06 -0400 Subject: [PATCH 068/115] fix: ensures hooks run before access --- src/fields/hookPromise.ts | 4 ++-- src/fields/performFieldOperations.ts | 14 ++++++-------- src/fields/traverseFields.ts | 6 +++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/fields/hookPromise.ts b/src/fields/hookPromise.ts index c03a9be78a..e336398715 100644 --- a/src/fields/hookPromise.ts +++ b/src/fields/hookPromise.ts @@ -12,7 +12,7 @@ type Arguments = { fullData: Record } -const hookPromise = ({ +const hookPromise = async ({ data, field, hook, @@ -20,7 +20,7 @@ const hookPromise = ({ operation, fullOriginalDoc, fullData, -}: Arguments) => async (): Promise => { +}: Arguments): Promise => { const resultingData = data; if (field.hooks && field.hooks[hook]) { diff --git a/src/fields/performFieldOperations.ts b/src/fields/performFieldOperations.ts index e840045bbb..02f4b25cf3 100644 --- a/src/fields/performFieldOperations.ts +++ b/src/fields/performFieldOperations.ts @@ -107,12 +107,10 @@ export default async function performFieldOperations(this: Payload, entityConfig transformActions.forEach((action) => action()); } - hookPromises.forEach((promise) => promise()); - - await Promise.all(hookPromises); + const hookResults = hookPromises.map((promise) => promise()); + await Promise.all(hookResults); validationPromises.forEach((promise) => promise()); - await Promise.all(validationPromises); if (errors.length > 0) { @@ -125,11 +123,11 @@ export default async function performFieldOperations(this: Payload, entityConfig unflattenLocaleActions.forEach((action) => action()); - await Promise.all(accessPromises); + const accessResults = accessPromises.map((promise) => promise()); + await Promise.all(accessResults); - const relationshipPopulationPromises = relationshipPopulations.map((population) => population()); - - await Promise.all(relationshipPopulationPromises); + const relationshipPopulationResults = relationshipPopulations.map((population) => population()); + await Promise.all(relationshipPopulationResults); return fullData; } diff --git a/src/fields/traverseFields.ts b/src/fields/traverseFields.ts index 744b018e3f..8364d48eb9 100644 --- a/src/fields/traverseFields.ts +++ b/src/fields/traverseFields.ts @@ -15,7 +15,7 @@ type Arguments = { flattenLocales: boolean locale: string fallbackLocale: string - accessPromises: Promise[] + accessPromises: (() => Promise)[] operation: Operation overrideAccess: boolean req: PayloadRequest @@ -173,7 +173,7 @@ const traverseFields = (args: Arguments): void => { }); } - accessPromises.push(accessPromise({ + accessPromises.push(() => accessPromise({ data, fullData, originalDoc, @@ -189,7 +189,7 @@ const traverseFields = (args: Arguments): void => { payload, })); - hookPromises.push(hookPromise({ + hookPromises.push(() => hookPromise({ data, field, hook, From 41e7febf6a21d2fff39a335c033d9e9582294147 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 31 Aug 2021 11:43:07 -0400 Subject: [PATCH 069/115] fix: config validation correctly prevents empty strings for option values --- src/fields/config/schema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fields/config/schema.ts b/src/fields/config/schema.ts index 49eb9d38d3..d245bc0746 100644 --- a/src/fields/config/schema.ts +++ b/src/fields/config/schema.ts @@ -111,7 +111,7 @@ export const select = baseField.keys({ options: joi.array().items(joi.alternatives().try( joi.string(), joi.object({ - value: joi.string().allow('').required(), + value: joi.string().required(), label: joi.string().required(), }), )).required(), @@ -128,7 +128,7 @@ export const radio = baseField.keys({ options: joi.array().items(joi.alternatives().try( joi.string(), joi.object({ - value: joi.string().allow('').required(), + value: joi.string().required(), label: joi.string().required(), }), )).required(), From 8675481343ef45fefc2eaaea939eda8ed0a2577f Mon Sep 17 00:00:00 2001 From: James Date: Tue, 31 Aug 2021 13:01:26 -0400 Subject: [PATCH 070/115] feat: allows user to pass req through local findByID --- src/collections/operations/local/findByID.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/collections/operations/local/findByID.ts b/src/collections/operations/local/findByID.ts index f03b846edb..b8edcc96f4 100644 --- a/src/collections/operations/local/findByID.ts +++ b/src/collections/operations/local/findByID.ts @@ -1,3 +1,4 @@ +import { PayloadRequest } from '../../../express/types'; import { Document } from '../../../types'; export type Options = { @@ -10,6 +11,7 @@ export type Options = { overrideAccess?: boolean showHiddenFields?: boolean disableErrors?: boolean + req: PayloadRequest } export default async function findByID(options: Options): Promise { @@ -23,6 +25,7 @@ export default async function findByID(options: Options): Promise { overrideAccess = true, disableErrors = false, showHiddenFields, + req, } = options; const collection = this.collections[collectionSlug]; @@ -35,6 +38,7 @@ export default async function findByID(options: Options): Promise { disableErrors, showHiddenFields, req: { + ...req, user, payloadAPI: 'local', locale, From 64ad6a30a56969127dfb592a7e0c8807e9f3d8f7 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 31 Aug 2021 13:29:17 -0400 Subject: [PATCH 071/115] feat: frontend polish to point field --- .../forms/field-types/Point/index.scss | 16 ++++- .../forms/field-types/Point/index.tsx | 66 +++++++++++-------- src/fields/config/types.ts | 5 -- 3 files changed, 54 insertions(+), 33 deletions(-) diff --git a/src/admin/components/forms/field-types/Point/index.scss b/src/admin/components/forms/field-types/Point/index.scss index 59644ecd09..aa6cd53533 100644 --- a/src/admin/components/forms/field-types/Point/index.scss +++ b/src/admin/components/forms/field-types/Point/index.scss @@ -1,9 +1,23 @@ @import '../../../../scss/styles.scss'; -.field-type.number { +.point { position: relative; margin-bottom: $baseline; + &__wrap { + display: flex; + width: calc(100% + #{base(1)}); + margin-left: base(-.5); + margin-right: base(-.5); + list-style: none; + padding: 0; + + li { + padding: 0 base(.5); + width: 50%; + } + } + input { @include formInput; } diff --git a/src/admin/components/forms/field-types/Point/index.tsx b/src/admin/components/forms/field-types/Point/index.tsx index f14e1a7ffd..62f0cc1759 100644 --- a/src/admin/components/forms/field-types/Point/index.tsx +++ b/src/admin/components/forms/field-types/Point/index.tsx @@ -9,6 +9,8 @@ import { Props } from './types'; import './index.scss'; +const baseClass = 'point'; + const PointField: React.FC = (props) => { const { name, @@ -58,7 +60,7 @@ const PointField: React.FC = (props) => { const classes = [ 'field-type', - 'number', + baseClass, showError && 'error', readOnly && 'read-only', ].filter(Boolean).join(' '); @@ -75,32 +77,42 @@ const PointField: React.FC = (props) => { showError={showError} message={errorMessage} /> -
-
- - - Add upload - - -
+ enableColumns={false} + setSort={setSort} + enableSort + /> + { + insertUpload(editor, { + value: { + id: doc.id, + }, + relationTo: modalCollection.slug, + }); + setRenderModal(false); + closeAll(); + }} + /> +
+ + {data?.totalDocs > 0 && ( +
+ {data.page} + - + {data.totalPages > 1 ? data.limit : data.totalDocs} + {' '} + of + {' '} + {data.totalDocs} +
+ )} +
+ + )} )} diff --git a/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss b/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss index bdcf2c5aaf..5fcc63764a 100644 --- a/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss +++ b/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss @@ -40,36 +40,4 @@ box-shadow: $focus-box-shadow; outline: none; } - - &__modal { - @include blur-bg; - display: flex; - align-items: center; - - .template-minimal { - padding-top: base(4); - align-items: flex-start; - } - } - - &__modal-header { - margin-bottom: $baseline; - display: flex; - - h1 { - margin: 0 auto 0 0; - } - - .btn { - margin: 0 0 0 $baseline; - } - } - - &__modal-sub-header { - margin-top: base(.25); - } - - &__select-collection-wrap { - margin-bottom: base(1); - } } diff --git a/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.tsx b/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.tsx index 366720baa7..60ec0b80b7 100644 --- a/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.tsx +++ b/src/admin/components/forms/field-types/RichText/elements/upload/Element/index.tsx @@ -17,8 +17,10 @@ import { SanitizedCollectionConfig } from '../../../../../../../../collections/c import Label from '../../../../../Label'; import './index.scss'; +import '../modal.scss'; const baseClass = 'rich-text-upload'; +const baseModalClass = 'rich-text-upload-modal'; const initialParams = { depth: 0, @@ -145,14 +147,13 @@ const Element = ({ attributes, children, element, path }) => { {children} {renderModal && ( {isOpen && ( -
+

- {' '} Choose {' '} {modalCollection.labels.singular} @@ -169,7 +170,7 @@ const Element = ({ attributes, children, element, path }) => { />

{moreThanOneAvailableCollection && ( -
+