From b8143f0a5acbf38d113b80736a74f4ea845c932e Mon Sep 17 00:00:00 2001 From: Kevin Koech Date: Mon, 24 Jun 2024 13:33:16 +0300 Subject: [PATCH 1/5] Added Payload CMS Set up for Roboshield. Added Navigations globals and some footer globals --- apps/roboshield/.env | 5 + apps/roboshield/.env.template | 10 + apps/roboshield/package.json | 26 +- apps/roboshield/payload.config.ts | 117 ++ apps/roboshield/server.ts | 92 + apps/roboshield/src/lib/data/common/index.js | 52 + apps/roboshield/src/lib/data/index.js | 1 + apps/roboshield/src/lib/data/local/index.js | 13 + apps/roboshield/src/lib/payload/index.js | 64 + apps/roboshield/src/pages/index.tsx | 78 +- apps/roboshield/src/payload/access/isAdmin.js | 11 + .../src/payload/access/isAdminOrPublished.js | 14 + .../src/payload/access/isAdminOrSelf.js | 24 + apps/roboshield/src/payload/access/roles.js | 7 + .../src/payload/collections/Media.js | 29 + .../src/payload/collections/Pages.js | 39 + .../src/payload/collections/Users.js | 59 + .../src/payload/fields/fullTitle/index.js | 22 + .../fields/fullTitle/populateFullTitle.js | 17 + apps/roboshield/src/payload/fields/image.js | 16 + .../src/payload/fields/links/link.js | 149 ++ .../src/payload/fields/links/linkArray.js | 26 + .../src/payload/fields/links/linkGroup.js | 19 + .../roboshield/src/payload/fields/richText.js | 57 + .../src/payload/fields/slug/formatSlug.js | 34 + .../src/payload/fields/slug/index.js | 22 + .../src/payload/fields/socialLinks.js | 81 + apps/roboshield/src/payload/fields/url.js | 25 + .../src/payload/globals/Site/EngagementTab.js | 60 + .../src/payload/globals/Site/GeneralTab.js | 53 + .../src/payload/globals/Site/NavigationTab.js | 80 + .../src/payload/globals/Site/index.js | 22 + .../src/payload/utils/formatPagePath.js | 33 + apps/roboshield/src/payload/utils/locales.js | 5 + .../src/payload/utils/mapLinkTypeToHref.js | 18 + apps/roboshield/tsconfig.server.json | 8 +- pnpm-lock.yaml | 1602 ++++++++++++++--- 37 files changed, 2644 insertions(+), 346 deletions(-) create mode 100644 apps/roboshield/payload.config.ts create mode 100644 apps/roboshield/server.ts create mode 100644 apps/roboshield/src/lib/data/common/index.js create mode 100644 apps/roboshield/src/lib/data/index.js create mode 100644 apps/roboshield/src/lib/data/local/index.js create mode 100644 apps/roboshield/src/lib/payload/index.js create mode 100644 apps/roboshield/src/payload/access/isAdmin.js create mode 100644 apps/roboshield/src/payload/access/isAdminOrPublished.js create mode 100644 apps/roboshield/src/payload/access/isAdminOrSelf.js create mode 100644 apps/roboshield/src/payload/access/roles.js create mode 100644 apps/roboshield/src/payload/collections/Media.js create mode 100644 apps/roboshield/src/payload/collections/Pages.js create mode 100644 apps/roboshield/src/payload/collections/Users.js create mode 100644 apps/roboshield/src/payload/fields/fullTitle/index.js create mode 100644 apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.js create mode 100644 apps/roboshield/src/payload/fields/image.js create mode 100644 apps/roboshield/src/payload/fields/links/link.js create mode 100644 apps/roboshield/src/payload/fields/links/linkArray.js create mode 100644 apps/roboshield/src/payload/fields/links/linkGroup.js create mode 100644 apps/roboshield/src/payload/fields/richText.js create mode 100644 apps/roboshield/src/payload/fields/slug/formatSlug.js create mode 100644 apps/roboshield/src/payload/fields/slug/index.js create mode 100644 apps/roboshield/src/payload/fields/socialLinks.js create mode 100644 apps/roboshield/src/payload/fields/url.js create mode 100644 apps/roboshield/src/payload/globals/Site/EngagementTab.js create mode 100644 apps/roboshield/src/payload/globals/Site/GeneralTab.js create mode 100644 apps/roboshield/src/payload/globals/Site/NavigationTab.js create mode 100644 apps/roboshield/src/payload/globals/Site/index.js create mode 100644 apps/roboshield/src/payload/utils/formatPagePath.js create mode 100644 apps/roboshield/src/payload/utils/locales.js create mode 100644 apps/roboshield/src/payload/utils/mapLinkTypeToHref.js diff --git a/apps/roboshield/.env b/apps/roboshield/.env index 627b03da3..d57dda945 100644 --- a/apps/roboshield/.env +++ b/apps/roboshield/.env @@ -1,3 +1,8 @@ +MIGRATIONS_DIR=./migrations + +PAYLOAD_PUBLIC_DEFAULT_LOCALE=en +PAYLOAD_PUBLIC_LOCALES="en, fr, pt" + SENTRY_ENVIRONMENT=local SENTRY_ORG=code-for-africa SENTRY_PROJECT=roboshield diff --git a/apps/roboshield/.env.template b/apps/roboshield/.env.template index 9e65c883b..d88963366 100644 --- a/apps/roboshield/.env.template +++ b/apps/roboshield/.env.template @@ -17,3 +17,13 @@ SENTRY_ENVIRONMENT=local|development|staging|production SENTRY_ORG= # Defaults to roboshield SENTRY_PROJECT= + +# Payload +MONGODB_URL= +PAYLOAD_SECRET= +PAYLOAD_PUBLIC_APP_URL= + +S3_ACCESS_KEY_ID= +S3_SECRET_ACCESS_KEY= +S3_BUCKET= +S3_REGION= diff --git a/apps/roboshield/package.json b/apps/roboshield/package.json index 04659e330..c92eccb0b 100644 --- a/apps/roboshield/package.json +++ b/apps/roboshield/package.json @@ -3,13 +3,15 @@ "version": "0.1.0", "private": true, "scripts": { - "build": "next build", + "build-server": "tsc --project tsconfig.server.json", + "build-next": "NEXT_BUILD=true pnpm build-server && NEXT_BUILD=true PAYLOAD_CONFIG_PATH=${PAYLOAD_CONFIG_PATH:-dist/payload.config.js} node dist/server.js", + "build-payload": "payload build", + "start": "PAYLOAD_CONFIG_PATH=${PAYLOAD_CONFIG_PATH:-dist/payload.config.js} NODE_ENV=${NODE_ENV:-production} node dist/server.js", + "dev": "NODE_OPTIONS='--inspect' ts-node --project tsconfig.server.json server.ts", "clean": "rm -rf .next .turbo node_modules", - "dev": "next dev", "jest": "jest --passWithNoTests", "lint-check": "TIMING=1 next lint './'", - "lint": "TIMING=1 next lint --fix './'", - "start": "next start" + "lint": "TIMING=1 next lint --fix './'" }, "dependencies": { "@commons-ui/core": "workspace:*", @@ -23,11 +25,22 @@ "@mui/utils": "^5.15.14", "@mui/x-date-pickers": "^7.6.2", "@next/env": "^14.2.3", + "@payloadcms/bundler-webpack": "^1.0.7", + "@payloadcms/db-mongodb": "^1.5.2", + "@payloadcms/plugin-cloud-storage": "^1.1.3", + "@payloadcms/plugin-nested-docs": "^1.0.12", + "@payloadcms/plugin-sentry": "^0.0.6", + "@payloadcms/plugin-seo": "^2.3.2", + "@payloadcms/richtext-slate": "^1.5.2", "@sentry/nextjs": "^8.10.0", "ace-builds": "^1.34.2", "crawler-user-agents": "^1.0.142", "date-fns": "^3.6.0", + "dotenv": "^16.4.5", + "express": "^4.18.2", "next": "14.2.4", + "nodemailer-sendgrid": "^1.0.3", + "payload": "2.22.0", "react": "^18.3.1", "react-ace": "^11.0.1", "react-dom": "^18.3.1", @@ -41,7 +54,9 @@ "devDependencies": { "@commons-ui/testing-library": "workspace:*", "@svgr/webpack": "^8.1.0", - "@types/node": "^20.14.2", + "@types/express": "^4.17.21", + "@types/node": "^20.14.7", + "@types/nodemailer-sendgrid": "^1.0.3", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "babel-jest": "^29.7.0", @@ -52,6 +67,7 @@ "eslint-plugin-import": "^2.29.1", "jest": "^29.7.0", "jest-config-commons-ui": "workspace:*", + "prettier": "3.1.1", "typescript": "^5.4.5" } } diff --git a/apps/roboshield/payload.config.ts b/apps/roboshield/payload.config.ts new file mode 100644 index 000000000..34f6a118d --- /dev/null +++ b/apps/roboshield/payload.config.ts @@ -0,0 +1,117 @@ +import path from "path"; + +import { buildConfig } from "payload/config"; +import { slateEditor } from "@payloadcms/richtext-slate"; +import { mongooseAdapter } from "@payloadcms/db-mongodb"; +import { webpackBundler } from "@payloadcms/bundler-webpack"; +import { CollectionConfig, GlobalConfig } from "payload/types"; +import { cloudStorage } from "@payloadcms/plugin-cloud-storage"; +import Site from "./src/payload/globals/Site"; +import dotenv from "dotenv"; +import Media from "./src/payload/collections/Media"; +import Pages from "./src/payload/collections/Pages"; +import seo from "@payloadcms/plugin-seo"; +import nestedDocs from "@payloadcms/plugin-nested-docs"; +import { s3Adapter } from "@payloadcms/plugin-cloud-storage/s3"; +import Users from "./src/payload/collections/Users"; +import { defaultLocale, locales } from "./src/payload/utils/locales"; + +dotenv.config(); +dotenv.config({ path: "./.env.local" }); + +const appURL = process?.env?.PAYLOAD_PUBLIC_APP_URL; + +const cors = + process?.env?.PAYLOAD_CORS?.split(",") + ?.map((d) => d.trim()) + ?.filter(Boolean) ?? []; + +const csrf = + process?.env?.PAYLOAD_CSRF?.split(",") + ?.map((d) => d.trim()) + ?.filter(Boolean) ?? []; + +const adapter = s3Adapter({ + config: { + region: process?.env?.S3_REGION, + credentials: { + accessKeyId: process?.env?.S3_ACCESS_KEY_ID, + secretAccessKey: process?.env?.S3_SECRET_ACCESS_KEY, + }, + }, + bucket: process?.env?.S3_BUCKET, +} as any); + +export default buildConfig({ + serverURL: appURL, + editor: slateEditor({}), + db: mongooseAdapter({ + url: process.env.MONGODB_URL ?? false, + migrationDir: process.env.MIGRATIONS_DIR, + }), + collections: [Media, Pages, Users] as CollectionConfig[], + globals: [Site] as GlobalConfig[], + ...(locales?.length + ? { + localization: { + locales, + defaultLocale, + fallback: true, + }, + } + : undefined), + admin: { + user: Users.slug, + webpack: (config) => ({ + ...config, + resolve: { + ...config.resolve, + fallback: { + ...config?.resolve?.fallback, + fs: false, + os: false, + "process/browser": false, + }, + }, + }), + bundler: webpackBundler(), + }, + cors, + csrf, + i18n: { + fallbackLng: "en", // default + debug: false, // default + resources: { + en: { + "codeforafrica.validation": { + uniquePlatforms: "Please select a unique platform", + }, + }, + }, + }, + plugins: [ + cloudStorage({ + collections: { + media: { + adapter, + prefix: "media", + }, + }, + }), + seo({ + collections: ["pages", "posts"], + globals: [], + uploadsCollection: "media", + generateTitle: ({ doc }: any) => doc?.title?.value as string, + generateURL: ({ doc }: any) => + doc?.slug?.value ? `${appURL}/${doc.slug.value}` : undefined, + } as any), + nestedDocs({ + collections: ["pages"], + generateLabel: (_, doc) => doc.title as string, + generateURL: (docs) => + docs.reduce((url, doc) => `${url}/${doc.slug}`, ""), + }), + ] as any[], + telemetry: process?.env?.NODE_ENV !== "production", +}); diff --git a/apps/roboshield/server.ts b/apps/roboshield/server.ts new file mode 100644 index 000000000..63566cca1 --- /dev/null +++ b/apps/roboshield/server.ts @@ -0,0 +1,92 @@ +import path from "path"; +import { spawn } from "child_process"; +import express from "express"; +import next from "next"; +import nodemailerSendgrid from "nodemailer-sendgrid"; +import payload from "payload"; +import { Payload } from "payload/dist/payload"; +import { loadEnvConfig } from "@next/env"; + +const projectDir = process.cwd(); +loadEnvConfig(projectDir); + +const dev = process.env.NODE_ENV !== "production"; +const hostname = process.env.NEXT_HOSTNAME || "localhost"; +const port = parseInt(process.env.PORT || "3000", 10); +const sendGridAPIKey = process.env.SENDGRID_API_KEY; + +if (!process.env.NEXT_MANUAL_SIG_HANDLE) { + process.on("SIGTERM", () => process.exit(0)); + process.on("SIGINT", () => process.exit(0)); +} + +const app = express(); + +const start = async (): Promise => { + let localPayload: Payload; + try { + localPayload = await payload.init({ + ...(sendGridAPIKey + ? { + email: { + transportOptions: nodemailerSendgrid({ + apiKey: sendGridAPIKey, + }), + fromName: process.env.SENDGRID_FROM_NAME || "Code for Africa CMS", + fromAddress: + process.env.SENDGRID_FROM_EMAIL || "noreply@dodeforafrica.org", + }, + } + : undefined), + secret: process.env.PAYLOAD_SECRET ?? "", + express: app, + onInit: (initPayload: { logger: { info: (arg0: string) => void } }) => { + initPayload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`); + }, + }); + } catch (e: any) { + console.error(e); + process.exit(); + } + + if (process.env.NEXT_BUILD) { + app.listen(port, async () => { + localPayload.logger.info("NextJS is now building..."); + const nextBuild = spawn( + "pnpm", + ["next", "build", path.resolve(projectDir)], + { + shell: true, + stdio: "inherit", + }, + ); + nextBuild.on("close", (code) => { + process.exit(code); + }); + nextBuild.on("error", (err) => { + localPayload.logger.error(err); + process.exit(1); + }); + }); + + return; + } + + const nextApp = next({ dev, hostname, port }); + const nextHandler = nextApp.getRequestHandler(); + nextApp.prepare().then(() => { + localPayload.logger.info("NextJS started"); + + app.get("*", (req: any, res: any) => nextHandler(req, res)); + app.post("*", (req: any, res: any) => nextHandler(req, res)); + app.put("*", (req: any, res: any) => nextHandler(req, res)); + + app.listen(port, async () => { + localPayload.logger.info( + `Next.js App URL: ${process.env.NEXT_PUBLIC_APP_URL}`, + ); + }); + }); +}; + +start(); diff --git a/apps/roboshield/src/lib/data/common/index.js b/apps/roboshield/src/lib/data/common/index.js new file mode 100644 index 000000000..9898a0c73 --- /dev/null +++ b/apps/roboshield/src/lib/data/common/index.js @@ -0,0 +1,52 @@ +export function imageFromMedia({ alt = null, url = null }) { + return { alt, src: url }; +} + +function getNavBar(settings) { + const { + connect: { links = [] }, + primaryLogo: media, + primaryNavigation: { menus = null, connect }, + title, + } = settings; + const socialLinks = links.filter((link) => link.platform === connect); + + return { + logo: imageFromMedia({ alt: title, ...media }), + menus, + socialLinks, + }; +} + +function getFooter(settings) { + const { + primaryLogo, + primaryNavigation, + secondaryLogo, + secondaryNavigation, + title, + ...footer + } = settings; + const media = secondaryLogo || primaryLogo; + + return { + ...footer, + logo: imageFromMedia({ alt: title, ...media }), + primaryMenus: primaryNavigation?.menus || null, + secondaryMenus: secondaryNavigation?.menus || null, + }; +} + +export async function getPageProps(api, context) { + const siteSettings = await api.findGlobal("settings-site"); + const navbar = getNavBar(siteSettings); + const footer = getFooter(siteSettings); + + return { + blocks: [], + footer, + navbar, + }; +} + +export default getPageProps; diff --git a/apps/roboshield/src/lib/data/index.js b/apps/roboshield/src/lib/data/index.js new file mode 100644 index 000000000..d299fa14b --- /dev/null +++ b/apps/roboshield/src/lib/data/index.js @@ -0,0 +1 @@ +export { getPageServerSideProps } from "./local"; diff --git a/apps/roboshield/src/lib/data/local/index.js b/apps/roboshield/src/lib/data/local/index.js new file mode 100644 index 000000000..ba0357dd3 --- /dev/null +++ b/apps/roboshield/src/lib/data/local/index.js @@ -0,0 +1,13 @@ +import { getPageProps } from "@/roboshield/lib/data/common"; +import api from "@/roboshield/lib/payload"; + +export async function getPageServerSideProps(context) { + const props = await getPageProps(api, context); + if (!props) { + return { notFound: true }; + } + + return { + props, + }; +} diff --git a/apps/roboshield/src/lib/payload/index.js b/apps/roboshield/src/lib/payload/index.js new file mode 100644 index 000000000..8bb041faf --- /dev/null +++ b/apps/roboshield/src/lib/payload/index.js @@ -0,0 +1,64 @@ +import payload from "payload"; + +async function findPage(slug, options) { + return payload.find({ + ...options, + collection: "pages", + where: { + ...options?.where, + slug: { + equals: slug, + }, + }, + }); +} + +async function getCollection(collection, options) { + return payload.find({ + limit: 0, + ...options, + collection, + }); +} + +async function findGlobal(slug, options) { + return payload.findGlobal({ + ...options, + slug, + }); +} + +async function createCollection(collection, data, options) { + return payload.create({ + collection, + data, + ...options, + }); +} + +async function deleteCollection(collection, options) { + return payload.delete({ + ...options, + collection, + }); +} + +async function updateCollection(collection, id, data, options) { + const args = { + ...options, + collection, + id, + data, + }; + return payload.update(args); +} +const api = { + createCollection, + deleteCollection, + findGlobal, + findPage, + getCollection, + updateCollection, +}; + +export default api; diff --git a/apps/roboshield/src/pages/index.tsx b/apps/roboshield/src/pages/index.tsx index df5828dd1..695b5045a 100644 --- a/apps/roboshield/src/pages/index.tsx +++ b/apps/roboshield/src/pages/index.tsx @@ -32,6 +32,7 @@ import { defaultState, } from "@/roboshield/context/GlobalContext"; import { generateRobots } from "@/roboshield/lib/robots"; +import { getPageServerSideProps } from "@/roboshield/lib/data"; interface Step { label: string; @@ -293,76 +294,16 @@ export default function Home() { ); } -export async function getStaticProps() { +export async function getServerSideProps(context: any) { + const { props } = await getPageServerSideProps(context); return { props: { - navbar: { - logo: { - alt: "CfA logo", - prefix: "media", - filename: "cfa-logo.svg", - mimeType: "image/svg+xml", - filesize: 6029, - width: 136, - height: 61, - url: "https://cfa.dev.codeforafrica.org/media/cfa-logo.svg", - src: "https://cfa.dev.codeforafrica.org/media/cfa-logo.svg", - }, - menus: [{ label: "ABOUT", href: "#" }], - socialLinks: [ - { - platform: "Twitter", - url: "https://twitter.com/Code4Africa", - id: "651e88dbc938b817cab85671", - }, - ], - }, + ...props, footer: { - logo: { - alt: "CfA logo", - prefix: "media", - filename: "cfalogobw.svg", - priority: "true", - url: "https://cfa.dev.codeforafrica.org/media/cfalogobw.svg", - src: "https://cfa.dev.codeforafrica.org/media/cfalogobw.svg", - }, + logo: props?.footer?.logo, + newsletter: props?.footer?.newsletter, description: `This site is an open source code built by Code for Africa, the continent's largest network of civic technology and data journalism labs. All content is released under a Creative Commons 4 Attribution License. Reuse it to help empower your own community.`, - connect: { - title: "STAY IN TOUCH:", - links: [ - { - platform: "Twitter", - url: "https://twitter.com/Code4Africa", - id: "651e88dbc938b817cab85671", - }, - { - platform: "Slack", - url: "https://code4africa.slack.com/", - id: "651e8995c938b817cab85672", - }, - { - platform: "Linkedin", - url: "https://www.linkedin.com/company/code-for-africa/", - id: "651e89a5c938b817cab85673", - }, - { - platform: "Facebook", - url: "https://www.facebook.com/CodeForAfrica/", - id: "651e89afc938b817cab85674", - }, - { - platform: "Instagram", - url: "https://www.instagram.com/code4africa__/", - id: "651e89c3c938b817cab85675", - }, - - { - platform: "Github", - url: "https://github.com/CodeForAfrica", - id: "651e89dec938b817cab85676", - }, - ], - }, + connect: props?.footer?.connect, partners: [ { name: "DW Africa", @@ -396,11 +337,6 @@ export async function getStaticProps() { CivicSignal MediaData database. `, - newsletter: { - title: "Subscribe to our Newsletter", - embedCode: - '\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n\n', - }, }, }, }; diff --git a/apps/roboshield/src/payload/access/isAdmin.js b/apps/roboshield/src/payload/access/isAdmin.js new file mode 100644 index 000000000..08301afd9 --- /dev/null +++ b/apps/roboshield/src/payload/access/isAdmin.js @@ -0,0 +1,11 @@ +import { ROLE_ADMIN } from "./roles"; + +export const isAdmin = ({ req: { user } }) => { + // Return true or false based on if the user has an admin role + return Boolean(user?.roles?.includes(ROLE_ADMIN)); +}; + +export const isAdminFieldLevel = ({ req: { user } }) => { + // Return true or false based on if the user has an admin role + return Boolean(user?.roles?.includes(ROLE_ADMIN)); +}; diff --git a/apps/roboshield/src/payload/access/isAdminOrPublished.js b/apps/roboshield/src/payload/access/isAdminOrPublished.js new file mode 100644 index 000000000..c006014ec --- /dev/null +++ b/apps/roboshield/src/payload/access/isAdminOrPublished.js @@ -0,0 +1,14 @@ +import { ROLE_ADMIN } from "./roles"; + +export const isAdminOrPublished = ({ req: { user } }) => { + if (user?.roles?.includes(ROLE_ADMIN)) { + return true; + } + return { + _status: { + equals: "published", + }, + }; +}; + +export default undefined; diff --git a/apps/roboshield/src/payload/access/isAdminOrSelf.js b/apps/roboshield/src/payload/access/isAdminOrSelf.js new file mode 100644 index 000000000..4dfae4152 --- /dev/null +++ b/apps/roboshield/src/payload/access/isAdminOrSelf.js @@ -0,0 +1,24 @@ +import { ROLE_ADMIN } from "./roles"; + +export const isAdminOrSelf = ({ req: { user } }) => { + // Need to be logged in + if (user) { + // If user has role of 'admin' + if (user.roles?.includes(ROLE_ADMIN)) { + return true; + } + // If any other type of user, only provide access to themselves + return { + id: { + equals: user.id, + }, + }; + } + + // Reject everyone else + return false; +}; + +export const isAdminOrSelfFieldLevel = ({ id, req: { user } }) => { + return user?.roles?.includes(ROLE_ADMIN) || id === user?.id; +}; diff --git a/apps/roboshield/src/payload/access/roles.js b/apps/roboshield/src/payload/access/roles.js new file mode 100644 index 000000000..d060bbf8e --- /dev/null +++ b/apps/roboshield/src/payload/access/roles.js @@ -0,0 +1,7 @@ +export const ROLE_ADMIN = "admin"; +export const ROLE_EDITOR = "editor"; +export const ROLE_DEFAULT = ROLE_EDITOR; +export const ROLE_OPTIONS = [ + { label: "Admin", value: ROLE_ADMIN }, + { label: "Editor", value: ROLE_EDITOR }, +]; diff --git a/apps/roboshield/src/payload/collections/Media.js b/apps/roboshield/src/payload/collections/Media.js new file mode 100644 index 000000000..bbd5b3040 --- /dev/null +++ b/apps/roboshield/src/payload/collections/Media.js @@ -0,0 +1,29 @@ +const Media = { + slug: "media", + admin: { + defaultColumns: ["alt", "updatedAt"], + enableRichTextLink: false, + group: "Publication", + useAsTitle: "alt", + }, + access: { + read: () => true, // Everyone can read Media + }, + upload: { + staticURL: "/media", + staticDir: "media", + }, + fields: [ + { + name: "alt", + label: "Alt Text", + type: "text", + required: true, + }, + ], + hooks: { + afterRead: [({ doc }) => ({ ...doc, src: doc.url })], + }, +}; + +export default Media; diff --git a/apps/roboshield/src/payload/collections/Pages.js b/apps/roboshield/src/payload/collections/Pages.js new file mode 100644 index 000000000..286643b53 --- /dev/null +++ b/apps/roboshield/src/payload/collections/Pages.js @@ -0,0 +1,39 @@ +import fullTitle from "../fields/fullTitle"; +import slug from "../fields/slug"; + +const Pages = { + slug: "pages", + access: { + read: () => true, + create: () => true, + update: () => true, + }, + admin: { + group: "Publication", + useAsTitle: "title", + }, + fields: [ + { + name: "title", + type: "text", + required: true, + localized: true, + }, + fullTitle({ overrides: { localized: true } }), + slug(), + { + name: "blocks", + type: "blocks", + blocks: [], + localized: true, + admin: { + initCollapsed: true, + }, + }, + ], + versions: { + drafts: true, + }, +}; + +export default Pages; diff --git a/apps/roboshield/src/payload/collections/Users.js b/apps/roboshield/src/payload/collections/Users.js new file mode 100644 index 000000000..daeeef760 --- /dev/null +++ b/apps/roboshield/src/payload/collections/Users.js @@ -0,0 +1,59 @@ +import { isAdmin, isAdminFieldLevel } from "../access/isAdmin"; +import { + isAdminOrSelf, + isAdminOrSelfFieldLevel, +} from "../access/isAdminOrSelf"; +import { ROLE_DEFAULT, ROLE_OPTIONS } from "../access/roles"; + +const Users = { + slug: "users", + access: { + create: isAdmin, + read: () => true, + update: isAdminOrSelf, + delete: isAdminOrSelf, + }, + admin: { + defaultColumns: ["firstName", "lastName", "email", "updatedAt"], + enableRichTextLink: false, + group: "Settings", + useAsTitle: "email", + }, + auth: { + verify: true, + }, + fields: [ + { + type: "row", + fields: [ + { + name: "firstName", + type: "text", + required: true, + }, + { + name: "lastName", + type: "text", + required: true, + }, + ], + }, + { + name: "roles", + type: "select", + // Save this field to JWT so we can use from `req.user` + saveToJWT: true, + required: true, + defaultValue: [ROLE_DEFAULT], + hasMany: true, + access: { + read: isAdminOrSelfFieldLevel, + create: isAdminFieldLevel, + update: isAdminFieldLevel, + }, + options: ROLE_OPTIONS, + }, + ], +}; + +export default Users; diff --git a/apps/roboshield/src/payload/fields/fullTitle/index.js b/apps/roboshield/src/payload/fields/fullTitle/index.js new file mode 100644 index 000000000..8074aadae --- /dev/null +++ b/apps/roboshield/src/payload/fields/fullTitle/index.js @@ -0,0 +1,22 @@ +import { deepmerge } from "@mui/utils"; + +import populateFullTitle from "./populateFullTitle"; + +function fullTitle({ overrides = undefined } = {}) { + const fullTitleResult = { + name: "fullTitle", + type: "text", + hooks: { + beforeChange: [populateFullTitle], + }, + admin: { + components: { + Field: () => null, + }, + }, + }; + + return deepmerge(fullTitleResult, overrides); +} + +export default fullTitle; diff --git a/apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.js b/apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.js new file mode 100644 index 000000000..703529fe8 --- /dev/null +++ b/apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.js @@ -0,0 +1,17 @@ +export function generateFullTitle(breadcrumbs) { + if (Array.isArray(breadcrumbs)) { + return breadcrumbs.reduce((title, breadcrumb, i) => { + if (i === 0) { + return `${breadcrumb.label}`; + } + return `${title} > ${breadcrumb.label}`; + }, ""); + } + return undefined; +} + +async function populateFullTitle({ data, originalDoc }) { + return generateFullTitle(data?.breadcrumbs || originalDoc?.breadcrumbs); +} + +export default populateFullTitle; diff --git a/apps/roboshield/src/payload/fields/image.js b/apps/roboshield/src/payload/fields/image.js new file mode 100644 index 000000000..c6ef5f402 --- /dev/null +++ b/apps/roboshield/src/payload/fields/image.js @@ -0,0 +1,16 @@ +import { deepmerge } from "@mui/utils"; + +function image({ overrides = undefined } = {}) { + const imageResult = { + name: "image", + type: "upload", + relationTo: "media", + filterOptions: { + mimeType: { contains: "image" }, + }, + }; + + return deepmerge(imageResult, overrides); +} + +export default image; diff --git a/apps/roboshield/src/payload/fields/links/link.js b/apps/roboshield/src/payload/fields/links/link.js new file mode 100644 index 000000000..88d80d0a7 --- /dev/null +++ b/apps/roboshield/src/payload/fields/links/link.js @@ -0,0 +1,149 @@ +import { deepmerge } from "@mui/utils"; + +import mapLinkTypeToHref from "../../utils/mapLinkTypeToHref"; + +export async function mapLinkToHrefBeforeValidate({ + siblingData, + req: { payload }, +}) { + // Don't modify original doc. + const doc = { ...siblingData.doc }; + if (typeof doc.value === "string") { + const { relationTo: collection, value: id } = doc; + doc.value = await payload.findByID({ + collection, + id, + // We only need slug from the collection don't expand the whole + // relationship. We may end up getting stuck on infinite recursion if + // collection contain other links. + depth: 0, + }); + } + const href = mapLinkTypeToHref({ ...siblingData, doc }); + + return href; +} + +const link = ({ + defaultValue = "internal", + disableLabel = false, + disableLinkTypeSelection = false, + disableOpenInNewTab = false, + overrides = {}, + required = true, +} = {}) => { + const linkResult = { + type: "row", + fields: [ + { + name: "linkType", + type: "radio", + options: [ + { + label: { + en: "Custom URL", + }, + value: "custom", + }, + { + label: { + en: "Internal link", + }, + value: "internal", + }, + ], + defaultValue, + admin: { + hidden: disableLinkTypeSelection, + }, + }, + ], + }; + + const linkTypes = [ + { + type: "row", + fields: [ + { + name: "doc", + label: { + en: "Document to link to", + fr: "Document pour lien vers", + pt: "Documento para link para", + }, + type: "relationship", + relationTo: ["pages"], + required, + maxDepth: 1, + admin: { + condition: (_, siblingData) => siblingData?.linkType === "internal", + }, + }, + { + name: "url", + label: { + en: "Custom URL", + fr: "URL personnalisée", + pt: "URL personalizado", + }, + type: "text", + required, + admin: { + condition: (_, siblingData) => siblingData?.linkType === "custom", + }, + }, + { + name: "href", + type: "text", + required, + admin: { + hidden: true, + }, + hooks: { + beforeValidate: [mapLinkToHrefBeforeValidate], + }, + }, + ], + }, + ]; + let labelFields = []; + if (!disableLabel) { + labelFields = [ + { + type: "row", + fields: [ + { + name: "label", + label: { + en: "Label", + pt: "Rótulo", + }, + type: "text", + required, + }, + ], + }, + ]; + } + linkResult.fields = [...labelFields, ...linkResult.fields, ...linkTypes]; + if (!disableOpenInNewTab) { + linkResult.fields.push({ + type: "row", + fields: [ + { + name: "newTab", + label: { + en: "Open in new tab", + fr: "Ouvrir dans un nouvel onglet", + pt: "Abrir num novo separador", + }, + type: "checkbox", + }, + ], + }); + } + + return deepmerge(linkResult, overrides); +}; + +export default link; diff --git a/apps/roboshield/src/payload/fields/links/linkArray.js b/apps/roboshield/src/payload/fields/links/linkArray.js new file mode 100644 index 000000000..b3d617785 --- /dev/null +++ b/apps/roboshield/src/payload/fields/links/linkArray.js @@ -0,0 +1,26 @@ +import { deepmerge } from "@mui/utils"; + +import link from "./link"; + +/** + * array field consisting of link fields . + */ +function linkArray({ linkConfig, overrides = {} } = {}) { + const generatedLinkArray = { + name: "links", + type: "array", + fields: [link(linkConfig)], + admin: { + initCollapsed: true, + components: { + RowLabel: ({ data }) => { + return data?.label || data?.reference?.title || data?.url || data?.id; + }, + }, + }, + }; + + return deepmerge(generatedLinkArray, overrides); +} + +export default linkArray; diff --git a/apps/roboshield/src/payload/fields/links/linkGroup.js b/apps/roboshield/src/payload/fields/links/linkGroup.js new file mode 100644 index 000000000..654b4e05f --- /dev/null +++ b/apps/roboshield/src/payload/fields/links/linkGroup.js @@ -0,0 +1,19 @@ +import { deepmerge } from "@mui/utils"; + +import link from "./link"; + +/** + * group field consisting of a link field. + */ +function linkGroup({ linkConfig, overrides = {} } = {}) { + const generatedLinkGroup = { + name: "link", + type: "group", + required: true, + fields: [link(linkConfig)], + }; + + return deepmerge(generatedLinkGroup, overrides); +} + +export default linkGroup; diff --git a/apps/roboshield/src/payload/fields/richText.js b/apps/roboshield/src/payload/fields/richText.js new file mode 100644 index 000000000..e84a3fa92 --- /dev/null +++ b/apps/roboshield/src/payload/fields/richText.js @@ -0,0 +1,57 @@ +import { deepmerge } from "@mui/utils"; + +import mapLinkTypeToHref from "../utils/mapLinkTypeToHref"; + +async function insertHref(nodes, payload) { + if (!nodes?.length) { + // Front-end needs `null` for serialization + return null; + } + return Promise.all( + nodes.map(async (node) => { + let newNode = node; + // The most important thing is not to change the doc structure + // since the admin UI expects it to be in certain why. But of course, + // we can add href prop for front-end. + if (node.type === "link") { + let { doc } = node; + if (typeof doc?.value === "string") { + const { relationTo: collection, value: id } = doc; + const value = await payload.findByID({ + collection, + id, + // We only need slug from the collection don't expand the whole + // relationship. We may end up getting stuck on infinite recursion if + // collection contain other links. + depth: 0, + }); + doc = { ...doc, value }; + } + const href = mapLinkTypeToHref({ ...node, doc }); + newNode = { ...node, href }; + } + newNode.children = await insertHref(node.children, payload); + return newNode; + }), + ); +} + +async function mapLinkToHrefAfterRead({ req: { payload }, value }) { + if (!value?.length) { + return value; + } + return insertHref(value, payload); +} + +function richText(overrides) { + const richTextResult = { + type: "richText", + hooks: { + afterRead: [mapLinkToHrefAfterRead], + }, + }; + + return deepmerge(richTextResult, overrides); +} + +export default richText; diff --git a/apps/roboshield/src/payload/fields/slug/formatSlug.js b/apps/roboshield/src/payload/fields/slug/formatSlug.js new file mode 100644 index 000000000..e1b07e3a6 --- /dev/null +++ b/apps/roboshield/src/payload/fields/slug/formatSlug.js @@ -0,0 +1,34 @@ +const format = (val) => + val + .replace(/ /g, "-") + .replace(/[^\w-]+/g, "") + .toLowerCase(); + +const getFallbackData = ({ fallback, originalDoc, data }) => { + const fallbackValues = fallback.map( + (value) => (data && data[value]) || (originalDoc && originalDoc[value]), + ); + return fallbackValues.join("-"); +}; + +const formatSlug = + (fallback) => + ({ value, originalDoc, data }) => { + if (value && typeof value === "string") { + return format(value); + } + + const validFallback = typeof fallback === "string" ? [fallback] : fallback; + const fallbackData = getFallbackData({ + fallback: validFallback, + originalDoc, + data, + }); + + if (fallbackData && typeof fallbackData === "string") { + return format(fallbackData); + } + return value; + }; + +export default formatSlug; diff --git a/apps/roboshield/src/payload/fields/slug/index.js b/apps/roboshield/src/payload/fields/slug/index.js new file mode 100644 index 000000000..ef953b843 --- /dev/null +++ b/apps/roboshield/src/payload/fields/slug/index.js @@ -0,0 +1,22 @@ +import { deepmerge } from "@mui/utils"; + +import formatSlug from "./formatSlug"; + +function slug({ fieldToUse = "title", overrides = undefined } = {}) { + const slugResult = { + name: "slug", + type: "text", + index: true, + unique: true, + admin: { + position: "sidebar", + }, + hooks: { + beforeValidate: [formatSlug(fieldToUse)], + }, + }; + + return deepmerge(slugResult, overrides); +} + +export default slug; diff --git a/apps/roboshield/src/payload/fields/socialLinks.js b/apps/roboshield/src/payload/fields/socialLinks.js new file mode 100644 index 000000000..566c9cc70 --- /dev/null +++ b/apps/roboshield/src/payload/fields/socialLinks.js @@ -0,0 +1,81 @@ +import { deepmerge } from "@mui/utils"; +import { select } from "payload/dist/fields/validations"; + +import url from "./url"; + +export const socialMediaOptions = [ + "Facebook", + "Twitter", + "Instagram", + "Linkedin", + "Github", + "Slack", +]; + +function socialLinks(overrides = {}) { + const defaults = { + name: "links", + type: "array", + labels: { + singular: { + en: "Link", + }, + plural: { + en: "Links", + }, + }, + minRows: 1, + admin: { + className: "array-field-nested", + components: { + RowLabel: ({ data, index }) => { + let label = ""; + if (data.platform) { + label = data.platform; + } + if (data.url) { + label = label ? `${label} (${data.url})` : data.url; + } + if (!label) { + label = `Link ${String(index).padStart(2, "0")}`; + } + return label; + }, + }, + initCollapsed: true, + }, + fields: [ + { + name: "platform", + type: "select", + label: "Platform", + options: socialMediaOptions, + required: true, + validate: (val, args) => { + const { data, t } = args || {}; + const { name: linksName = "links" } = overrides; + if ( + data?.[linksName]?.filter((l) => l.platform === val)?.length > 1 + ) { + return t("codeforafrica.validation:uniquePlatforms"); + } + + const { + hasMany, + options = socialMediaOptions, + required = true, + } = args; + return select(val, { hasMany, options, required, t }); + }, + }, + url({ + overrides: { + required: true, + }, + }), + ], + }; + return deepmerge(defaults, overrides); +} + +export default socialLinks; diff --git a/apps/roboshield/src/payload/fields/url.js b/apps/roboshield/src/payload/fields/url.js new file mode 100644 index 000000000..49d638adb --- /dev/null +++ b/apps/roboshield/src/payload/fields/url.js @@ -0,0 +1,25 @@ +import { deepmerge } from "@mui/utils"; +import { text } from "payload/dist/fields/validations"; + +function url({ overrides = undefined } = {}) { + const urlResult = { + name: "url", + type: "text", + label: "URL", + validate: (val, options) => { + try { + // eslint-disable-next-line no-new + new URL(val); + } catch (e) { + if (e instanceof TypeError) { + return "Please enter valid URL"; + } + } + return text(val, options); + }, + }; + + return deepmerge(urlResult, overrides); +} + +export default url; diff --git a/apps/roboshield/src/payload/globals/Site/EngagementTab.js b/apps/roboshield/src/payload/globals/Site/EngagementTab.js new file mode 100644 index 000000000..d7dc53f33 --- /dev/null +++ b/apps/roboshield/src/payload/globals/Site/EngagementTab.js @@ -0,0 +1,60 @@ +import socialLinks from "../../fields/socialLinks"; + +const EngagementTab = { + label: "Engagement", + fields: [ + { + name: "connect", + type: "group", + label: "Social Accounts", + localized: true, + fields: [ + { + type: "collapsible", + label: "Title & Links", + fields: [ + { + name: "title", + type: "text", + admin: { + description: + "Text that appears on contact links e.g Stay in Touch", + }, + required: true, + }, + socialLinks(), + ], + }, + ], + }, + { + name: "newsletter", + type: "group", + label: "Email Newsletter", + localized: true, + fields: [ + { + type: "collapsible", + label: "Title & Embed Code", + fields: [ + { + name: "title", + type: "text", + required: true, + }, + { + name: "embedCode", + type: "code", + required: true, + admin: { + language: "html", + }, + }, + ], + }, + ], + }, + ], +}; + +export default EngagementTab; diff --git a/apps/roboshield/src/payload/globals/Site/GeneralTab.js b/apps/roboshield/src/payload/globals/Site/GeneralTab.js new file mode 100644 index 000000000..a1fa6fb64 --- /dev/null +++ b/apps/roboshield/src/payload/globals/Site/GeneralTab.js @@ -0,0 +1,53 @@ +import image from "../../fields/image"; +import richText from "../../fields/richText"; + +const GeneralTab = { + label: "General", + fields: [ + { + type: "collapsible", + label: "Title & Description", + fields: [ + { + name: "title", + type: "text", + required: true, + localized: true, + }, + richText({ + name: "description", + required: true, + localized: true, + }), + ], + }, + { + type: "collapsible", + label: "Logo", + fields: [ + image({ + overrides: { + name: "primaryLogo", + required: true, + localized: true, + admin: { + description: "Shown on main navigation bar.", + }, + }, + }), + image({ + overrides: { + name: "secondaryLogo", + localized: true, + admin: { + description: + "Shown on main footer. If not provided, primary logo will be reused.", + }, + }, + }), + ], + }, + ], +}; + +export default GeneralTab; diff --git a/apps/roboshield/src/payload/globals/Site/NavigationTab.js b/apps/roboshield/src/payload/globals/Site/NavigationTab.js new file mode 100644 index 000000000..6c2a3cf8b --- /dev/null +++ b/apps/roboshield/src/payload/globals/Site/NavigationTab.js @@ -0,0 +1,80 @@ +import link from "../../fields/links/link"; +import linkArray from "../../fields/links/linkArray"; +import { socialMediaOptions } from "../../fields/socialLinks"; + +const linkField = link({ + disableOpenInNewTab: true, +}); + +const NavigationTab = { + label: "Navigation", + fields: [ + { + name: "primaryNavigation", + type: "group", + localized: true, + fields: [ + { + type: "collapsible", + label: "Title & Links", + fields: [ + linkArray({ + overrides: { + name: "menus", + labels: { + singular: { + en: "Menu", + }, + plural: { + en: "Menus", + }, + }, + fields: [linkField], + admin: { + className: "array-field-nested", + }, + }, + }), + { + name: "connect", + type: "select", + options: socialMediaOptions, + }, + ], + }, + ], + }, + { + name: "secondaryNavigation", + type: "group", + localized: true, + fields: [ + { + type: "collapsible", + label: "Title & Links", + fields: [ + linkArray({ + overrides: { + name: "menus", + labels: { + singular: { + en: "Menu", + }, + plural: { + en: "Menus", + }, + }, + fields: [linkField], + admin: { + className: "array-field-nested", + }, + }, + }), + ], + }, + ], + }, + ], +}; + +export default NavigationTab; diff --git a/apps/roboshield/src/payload/globals/Site/index.js b/apps/roboshield/src/payload/globals/Site/index.js new file mode 100644 index 000000000..207b83587 --- /dev/null +++ b/apps/roboshield/src/payload/globals/Site/index.js @@ -0,0 +1,22 @@ +import EngagementTab from "./EngagementTab"; +import GeneralTab from "./GeneralTab"; +import NavigationTab from "./NavigationTab"; + +const Site = { + slug: "settings-site", + label: "Site", + access: { + read: () => true, + }, + admin: { + group: "Settings", + }, + fields: [ + { + type: "tabs", + tabs: [GeneralTab, NavigationTab, EngagementTab], + }, + ], +}; + +export default Site; diff --git a/apps/roboshield/src/payload/utils/formatPagePath.js b/apps/roboshield/src/payload/utils/formatPagePath.js new file mode 100644 index 000000000..7ff21f882 --- /dev/null +++ b/apps/roboshield/src/payload/utils/formatPagePath.js @@ -0,0 +1,33 @@ +function fullSlugFromParents(doc) { + const { slug, parent } = doc; + if (!parent) { + return slug; + } + return `${fullSlugFromParents(parent)}/${slug}`; +} + +function fullSlugFromBreadcrumbs({ breadcrumbs } = {}) { + const fullSlug = breadcrumbs?.[breadcrumbs.length - 1]?.url?.slice(1); + return fullSlug; +} + +function formatPagePath(collection, doc) { + let pageSlug = fullSlugFromBreadcrumbs(doc) || fullSlugFromParents(doc) || ""; + if (pageSlug === "index") { + pageSlug = ""; + } + let prefix = ""; + if (collection) { + switch (collection) { + case "pages": + // Empty prefix for pages + break; + default: + prefix = `/${collection}`; + } + } + + return `${prefix}/${pageSlug}`; +} + +export default formatPagePath; diff --git a/apps/roboshield/src/payload/utils/locales.js b/apps/roboshield/src/payload/utils/locales.js new file mode 100644 index 000000000..11cf08c91 --- /dev/null +++ b/apps/roboshield/src/payload/utils/locales.js @@ -0,0 +1,5 @@ +export const locales = process.env.PAYLOAD_PUBLIC_LOCALES?.split(",") + ?.map((l) => l.trim()) + .filter(Boolean) || ["en"]; +export const defaultLocale = + process.env.PAYLOAD_PUBLIC_DEFAULT_LOCALE?.trim() || locales?.[0]; diff --git a/apps/roboshield/src/payload/utils/mapLinkTypeToHref.js b/apps/roboshield/src/payload/utils/mapLinkTypeToHref.js new file mode 100644 index 000000000..ab5c938c9 --- /dev/null +++ b/apps/roboshield/src/payload/utils/mapLinkTypeToHref.js @@ -0,0 +1,18 @@ +import formatPagePath from "./formatPagePath"; + +const mapLinkTypeToHref = ({ doc: linkDoc, linkType, url }) => { + // default to `null` for serialization. + let href = null; + if (linkType === "internal") { + const { relationTo: collection, value: doc } = linkDoc; + if (doc?.slug) { + href = formatPagePath(collection, doc); + } + } else { + // custom link + href = url; + } + return href; +}; + +export default mapLinkTypeToHref; diff --git a/apps/roboshield/tsconfig.server.json b/apps/roboshield/tsconfig.server.json index 3155ccdca..9760dfa52 100644 --- a/apps/roboshield/tsconfig.server.json +++ b/apps/roboshield/tsconfig.server.json @@ -8,5 +8,11 @@ "outDir": "./dist", "rootDir": "./" }, - "include": ["src/lib/**/*.ts", "src/utils/**/*.ts", "scripts/**/*.ts"] + "include": [ + "src/lib/**/*.ts", + "src/utils/**/*.ts", + "scripts/**/*.ts", + "payload.config.ts", + "server.ts" + ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea80cc2c2..db0e68efd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,31 +94,31 @@ importers: version: 0.84.0(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@payloadcms/bundler-webpack': specifier: ^1.0.6 - version: 1.0.7(@swc/core@1.6.3(@swc/helpers@0.5.5))(ajv@8.16.0)(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(sass@1.69.4) + version: 1.0.7(@swc/core@1.6.3(@swc/helpers@0.5.5))(ajv@6.12.6)(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(sass@1.69.4) '@payloadcms/db-mongodb': specifier: ^1.5.1 - version: 1.5.2(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) + version: 1.5.2(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)))) '@payloadcms/plugin-cloud-storage': specifier: ^1.1.2 - version: 1.1.3(@aws-sdk/client-s3@3.600.0)(@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) + version: 1.1.3(@aws-sdk/client-s3@3.600.0)(@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)))) '@payloadcms/plugin-nested-docs': specifier: ^1.0.12 - version: 1.0.12(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) + version: 1.0.12(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)))) '@payloadcms/plugin-sentry': specifier: ^0.0.6 - version: 0.0.6(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1) + version: 0.0.6(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(react@18.3.1) '@payloadcms/plugin-seo': specifier: ^2.3.2 - version: 2.3.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1) + version: 2.3.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(react@18.3.1) '@payloadcms/richtext-slate': specifier: ^1.5.2 - version: 1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-spring/web': specifier: ^9.7.3 version: 9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sentry/nextjs': specifier: ^8.10.0 - version: 8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(encoding@0.1.13)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(react@18.3.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + version: 8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(encoding@0.1.13)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(react@18.3.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) airtable: specifier: ^0.12.2 version: 0.12.2(encoding@0.1.13) @@ -148,7 +148,7 @@ importers: version: 1.0.3 payload: specifier: ^2.22.0 - version: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + version: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) prop-types: specifier: ^15.8.1 version: 15.8.1 @@ -233,10 +233,10 @@ importers: version: link:../../packages/eslint-config-commons-ui eslint-import-resolver-webpack: specifier: ^0.13.8 - version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) eslint-plugin-import: specifier: ^2.29.0 - version: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) identity-obj-proxy: specifier: ^3.0.0 version: 3.0.0 @@ -263,7 +263,7 @@ importers: version: 5.5.2 webpack: specifier: ^5.89.0 - version: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + version: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) apps/codeforafrica: dependencies: @@ -308,7 +308,7 @@ importers: version: 1.0.7(@swc/core@1.3.96(@swc/helpers@0.5.5))(ajv@8.16.0)(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))))(sass@1.69.4) '@payloadcms/db-mongodb': specifier: ^1.4.0 - version: 1.5.2(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5)))) + version: 1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5)))) '@payloadcms/plugin-cloud-storage': specifier: ^1.1.1 version: 1.1.3(@aws-sdk/client-s3@3.600.0)(@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5)))) @@ -426,7 +426,7 @@ importers: version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))) eslint-plugin-import: specifier: ^2.29.0 - version: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) identity-obj-proxy: specifier: ^3.0.0 version: 3.0.0 @@ -547,7 +547,7 @@ importers: version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.20.2)) eslint-plugin-import: specifier: ^2.29.0 - version: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) prettier: specifier: ^3.1.1 version: 3.3.2 @@ -710,7 +710,7 @@ importers: version: 8.1.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(encoding@0.1.13)(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@storybook/addon-interactions': specifier: ^8.1.5 - version: 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)) + version: 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2))) '@storybook/addon-links': specifier: ^8.1.5 version: 8.1.10(react@18.3.1) @@ -722,13 +722,13 @@ importers: version: 8.1.10(@babel/preset-env@7.24.7(@babel/core@7.24.7))(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@storybook/nextjs': specifier: ^8.1.5 - version: 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0))(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4)(type-fest@4.20.1)(typescript@5.5.2)(webpack-hot-middleware@2.26.1)(webpack@5.92.1) + version: 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)))(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4)(type-fest@4.20.1)(typescript@5.5.2)(webpack-hot-middleware@2.26.1)(webpack@5.92.1) '@storybook/react': specifier: ^8.1.5 version: 8.1.10(encoding@0.1.13)(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2) '@storybook/test': specifier: ^8.1.5 - version: 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)) + version: 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2))) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.5.2) @@ -767,7 +767,7 @@ importers: version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1) eslint-plugin-import: specifier: ^2.29.0 - version: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) eslint-plugin-module-resolver: specifier: ^1.5.0 version: 1.5.0 @@ -785,7 +785,7 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) jest-config-commons-ui: specifier: workspace:* version: link:../../packages/jest-config-commons-ui @@ -951,13 +951,13 @@ importers: version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1) eslint-plugin-import: specifier: ^2.29.0 - version: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) identity-obj-proxy: specifier: ^3.0.0 version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) jest-config-commons-ui: specifier: workspace:* version: link:../../packages/jest-config-commons-ui @@ -1012,9 +1012,30 @@ importers: '@next/env': specifier: ^14.2.3 version: 14.2.4 + '@payloadcms/bundler-webpack': + specifier: ^1.0.7 + version: 1.0.7(@swc/core@1.6.1(@swc/helpers@0.5.5))(ajv@8.16.0)(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(sass@1.69.4) + '@payloadcms/db-mongodb': + specifier: ^1.5.2 + version: 1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) + '@payloadcms/plugin-cloud-storage': + specifier: ^1.1.3 + version: 1.1.3(@aws-sdk/client-s3@3.600.0)(@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) + '@payloadcms/plugin-nested-docs': + specifier: ^1.0.12 + version: 1.0.12(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) + '@payloadcms/plugin-sentry': + specifier: ^0.0.6 + version: 0.0.6(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1) + '@payloadcms/plugin-seo': + specifier: ^2.3.2 + version: 2.3.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1) + '@payloadcms/richtext-slate': + specifier: ^1.5.2 + version: 1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sentry/nextjs': specifier: ^8.10.0 - version: 8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(encoding@0.1.13)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(react@18.3.1)(webpack@5.92.1) + version: 8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(encoding@0.1.13)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(react@18.3.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) ace-builds: specifier: ^1.34.2 version: 1.35.0 @@ -1024,9 +1045,21 @@ importers: date-fns: specifier: ^3.6.0 version: 3.6.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + express: + specifier: ^4.18.2 + version: 4.19.2 next: specifier: 14.2.4 version: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4) + nodemailer-sendgrid: + specifier: ^1.0.3 + version: 1.0.3 + payload: + specifier: 2.22.0 + version: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) react: specifier: ^18.3.1 version: 18.3.1 @@ -1061,9 +1094,15 @@ importers: '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.5.2) + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 '@types/node': - specifier: ^20.14.2 + specifier: ^20.14.7 version: 20.14.7 + '@types/nodemailer-sendgrid': + specifier: ^1.0.3 + version: 1.0.3 '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -1078,22 +1117,25 @@ importers: version: 8.57.0 eslint-config-next: specifier: 14.2.3 - version: 14.2.3(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0)(typescript@5.5.2) + version: 14.2.3(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0)(typescript@5.5.2) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) eslint-import-resolver-webpack: specifier: ^0.13.8 - version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1) + version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)) jest-config-commons-ui: specifier: workspace:* version: link:../../packages/jest-config-commons-ui + prettier: + specifier: 3.1.1 + version: 3.1.1 typescript: specifier: ^5.4.5 version: 5.5.2 @@ -1150,7 +1192,7 @@ importers: version: 133.0.0(encoding@0.1.13) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) next: specifier: 14.1.3 version: 14.1.3(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4) @@ -1236,7 +1278,7 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + version: 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) jest-config-commons-ui: specifier: workspace:* version: link:../jest-config-commons-ui @@ -1294,7 +1336,7 @@ importers: version: link:../eslint-config-commons-ui jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + version: 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) jest-config-commons-ui: specifier: workspace:* version: link:../jest-config-commons-ui @@ -1324,7 +1366,7 @@ importers: dependencies: '@testing-library/jest-dom': specifier: ^6.1.5 - version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(babel-plugin-macros@3.1.0)) + version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2))) '@testing-library/react': specifier: ^14.1.2 version: 14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1364,7 +1406,7 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + version: 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) jest-config-commons-ui: specifier: workspace:* version: link:../jest-config-commons-ui @@ -1412,7 +1454,7 @@ importers: version: 1.1.0 eslint-plugin-import: specifier: ^2.29.0 - version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) eslint-plugin-jest: specifier: ^27.6.0 version: 27.9.0(eslint@8.57.0)(jest@29.7.0)(typescript@5.5.2) @@ -1486,7 +1528,7 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + version: 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) prettier: specifier: ^3.1.1 version: 3.3.2 @@ -5414,6 +5456,12 @@ packages: '@types/node@20.14.7': resolution: {integrity: sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==} + '@types/nodemailer-sendgrid@1.0.3': + resolution: {integrity: sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==} + + '@types/nodemailer@6.4.15': + resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -10658,6 +10706,11 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + engines: {node: '>=14'} + hasBin: true + prettier@3.3.2: resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} engines: {node: '>=14'} @@ -13256,7 +13309,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -13304,7 +13357,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-bucket-endpoint': 3.598.0 '@aws-sdk/middleware-expect-continue': 3.598.0 '@aws-sdk/middleware-flexible-checksums': 3.598.0 @@ -13365,7 +13418,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -13454,7 +13507,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -13533,7 +13586,25 @@ snapshots: '@smithy/util-stream': 3.0.4 tslib: 2.6.3 - '@aws-sdk/credential-provider-ini@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0)': + '@aws-sdk/credential-provider-ini@3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0)': + dependencies: + '@aws-sdk/client-sts': 3.600.0 + '@aws-sdk/credential-provider-env': 3.598.0 + '@aws-sdk/credential-provider-http': 3.598.0 + '@aws-sdk/credential-provider-process': 3.598.0 + '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/types': 3.598.0 + '@smithy/credential-provider-imds': 3.1.2 + '@smithy/property-provider': 3.1.2 + '@smithy/shared-ini-file-loader': 3.1.2 + '@smithy/types': 3.2.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-ini@3.598.0(@aws-sdk/client-sts@3.600.0)': dependencies: '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/credential-provider-env': 3.598.0 @@ -13550,12 +13621,32 @@ snapshots: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt + optional: true + + '@aws-sdk/credential-provider-node@3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.598.0 + '@aws-sdk/credential-provider-http': 3.598.0 + '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-process': 3.598.0 + '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/types': 3.598.0 + '@smithy/credential-provider-imds': 3.1.2 + '@smithy/property-provider': 3.1.2 + '@smithy/shared-ini-file-loader': 3.1.2 + '@smithy/types': 3.2.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt - '@aws-sdk/credential-provider-node@3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0)': + '@aws-sdk/credential-provider-node@3.600.0(@aws-sdk/client-sts@3.600.0)': dependencies: '@aws-sdk/credential-provider-env': 3.598.0 '@aws-sdk/credential-provider-http': 3.598.0 - '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/credential-provider-process': 3.598.0 '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.600.0) @@ -13569,6 +13660,7 @@ snapshots: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' - aws-crt + optional: true '@aws-sdk/credential-provider-process@3.598.0': dependencies: @@ -13578,6 +13670,19 @@ snapshots: '@smithy/types': 3.2.0 tslib: 2.6.3 + '@aws-sdk/credential-provider-sso@3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))': + dependencies: + '@aws-sdk/client-sso': 3.598.0 + '@aws-sdk/token-providers': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + '@aws-sdk/types': 3.598.0 + '@smithy/property-provider': 3.1.2 + '@smithy/shared-ini-file-loader': 3.1.2 + '@smithy/types': 3.2.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + '@aws-sdk/credential-provider-sso@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)': dependencies: '@aws-sdk/client-sso': 3.598.0 @@ -13590,6 +13695,7 @@ snapshots: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt + optional: true '@aws-sdk/credential-provider-web-identity@3.598.0(@aws-sdk/client-sts@3.600.0)': dependencies: @@ -13599,7 +13705,7 @@ snapshots: '@smithy/types': 3.2.0 tslib: 2.6.3 - '@aws-sdk/credential-providers@3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))': + '@aws-sdk/credential-providers@3.600.0': dependencies: '@aws-sdk/client-cognito-identity': 3.600.0 '@aws-sdk/client-sso': 3.598.0 @@ -13607,8 +13713,8 @@ snapshots: '@aws-sdk/credential-provider-cognito-identity': 3.600.0 '@aws-sdk/credential-provider-env': 3.598.0 '@aws-sdk/credential-provider-http': 3.598.0 - '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/credential-provider-process': 3.598.0 '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.600.0) @@ -13622,6 +13728,29 @@ snapshots: - aws-crt optional: true + '@aws-sdk/credential-providers@3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))': + dependencies: + '@aws-sdk/client-cognito-identity': 3.600.0 + '@aws-sdk/client-sso': 3.598.0 + '@aws-sdk/client-sts': 3.600.0 + '@aws-sdk/credential-provider-cognito-identity': 3.600.0 + '@aws-sdk/credential-provider-env': 3.598.0 + '@aws-sdk/credential-provider-http': 3.598.0 + '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-process': 3.598.0 + '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/types': 3.598.0 + '@smithy/credential-provider-imds': 3.1.2 + '@smithy/property-provider': 3.1.2 + '@smithy/types': 3.2.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + '@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0)': dependencies: '@aws-sdk/client-s3': 3.600.0 @@ -13741,6 +13870,15 @@ snapshots: '@smithy/types': 3.2.0 tslib: 2.6.3 + '@aws-sdk/token-providers@3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/types': 3.598.0 + '@smithy/property-provider': 3.1.2 + '@smithy/shared-ini-file-loader': 3.1.2 + '@smithy/types': 3.2.0 + tslib: 2.6.3 + '@aws-sdk/token-providers@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)': dependencies: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) @@ -13749,6 +13887,7 @@ snapshots: '@smithy/shared-ini-file-loader': 3.1.2 '@smithy/types': 3.2.0 tslib: 2.6.3 + optional: true '@aws-sdk/types@3.598.0': dependencies: @@ -15507,7 +15646,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2))': + '@jest/core@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -15521,7 +15660,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-config: 29.7.0(@types/node@20.14.7) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -15541,8 +15680,9 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -15556,7 +15696,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -15577,121 +15717,296 @@ snapshots: - supports-color - ts-node - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.7 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2))': dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 '@types/node': 20.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + jest-haste-map: 29.7.0 jest-message-util: 29.7.0 - jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 transitivePeerDependencies: + - babel-plugin-macros - supports-color + - ts-node - '@jest/reporters@29.7.0': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2))': dependencies: - '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 '@types/node': 20.14.7 + ansi-escapes: 4.3.2 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + ci-info: 3.9.0 exit: 0.1.2 - glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-haste-map: 29.7.0 jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 jest-util: 29.7.0 - jest-worker: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 slash: 3.0.0 - string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 transitivePeerDependencies: + - babel-plugin-macros - supports-color + - ts-node - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2))': dependencies: '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@29.7.0': - dependencies: + '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.24.7 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 + '@types/node': 20.14.7 + ansi-escapes: 4.3.2 chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 + ci-info: 3.9.0 + exit: 0.1.2 graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 micromatch: 4.0.7 - pirates: 4.0.6 + pretty-format: 29.7.0 slash: 3.0.0 - write-file-atomic: 4.0.2 + strip-ansi: 6.0.1 transitivePeerDependencies: + - babel-plugin-macros - supports-color + - ts-node - '@jest/types@29.6.3': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))': dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.7 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.7 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.14.7 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.14.7 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.24.7 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.14.7 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -16446,11 +16761,55 @@ snapshots: - utf-8-validate - webpack-dev-server - '@payloadcms/bundler-webpack@1.0.7(@swc/core@1.6.3(@swc/helpers@0.5.5))(ajv@8.16.0)(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(sass@1.69.4)': + '@payloadcms/bundler-webpack@1.0.7(@swc/core@1.6.1(@swc/helpers@0.5.5))(ajv@8.16.0)(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(sass@1.69.4)': dependencies: ajv: 8.16.0 compression: 1.7.4 connect-history-api-fallback: 1.6.0 + css-loader: 5.2.7(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + file-loader: 6.2.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + find-node-modules: 2.1.3 + html-webpack-plugin: 5.6.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + md5: 2.3.0 + mini-css-extract-plugin: 1.6.2(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + path-browserify: 1.0.1 + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + postcss: 8.4.31 + postcss-loader: 6.2.1(postcss@8.4.31)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + postcss-preset-env: 9.0.0(postcss@8.4.31) + process: 0.11.10 + sass-loader: 12.6.0(sass@1.69.4)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + style-loader: 2.0.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + swc-loader: 0.2.6(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + swc-minify-webpack-plugin: 2.1.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + terser-webpack-plugin: 5.3.10(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack-bundle-analyzer: 4.10.2 + webpack-cli: 4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1) + webpack-dev-middleware: 6.1.2(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + webpack-hot-middleware: 2.26.1 + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - '@webpack-cli/generators' + - '@webpack-cli/migrate' + - bufferutil + - esbuild + - fibers + - node-sass + - sass + - sass-embedded + - supports-color + - uglify-js + - utf-8-validate + - webpack-dev-server + + '@payloadcms/bundler-webpack@1.0.7(@swc/core@1.6.3(@swc/helpers@0.5.5))(ajv@6.12.6)(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(sass@1.69.4)': + dependencies: + ajv: 6.12.6 + compression: 1.7.4 + connect-history-api-fallback: 1.6.0 css-loader: 5.2.7(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) file-loader: 6.2.0(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) find-node-modules: 2.1.3 @@ -16458,7 +16817,7 @@ snapshots: md5: 2.3.0 mini-css-extract-plugin: 1.6.2(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) path-browserify: 1.0.1 - payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) postcss: 8.4.31 postcss-loader: 6.2.1(postcss@8.4.31)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) postcss-preset-env: 9.0.0(postcss@8.4.31) @@ -16490,7 +16849,7 @@ snapshots: - utf-8-validate - webpack-dev-server - '@payloadcms/db-mongodb@1.5.2(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))))': + '@payloadcms/db-mongodb@1.5.2(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))': dependencies: bson-objectid: 2.0.4 deepmerge: 4.3.1 @@ -16499,6 +16858,23 @@ snapshots: mongoose: 6.12.3(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) mongoose-aggregate-paginate-v2: 1.0.6 mongoose-paginate-v2: 1.7.22 + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) + prompts: 2.4.2 + uuid: 9.0.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color + + '@payloadcms/db-mongodb@1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))))': + dependencies: + bson-objectid: 2.0.4 + deepmerge: 4.3.1 + get-port: 5.1.1 + http-status: 1.6.2 + mongoose: 6.12.3 + mongoose-aggregate-paginate-v2: 1.0.6 + mongoose-paginate-v2: 1.7.22 payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))) prompts: 2.4.2 uuid: 9.0.0 @@ -16507,16 +16883,16 @@ snapshots: - aws-crt - supports-color - '@payloadcms/db-mongodb@1.5.2(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': + '@payloadcms/db-mongodb@1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': dependencies: bson-objectid: 2.0.4 deepmerge: 4.3.1 get-port: 5.1.1 http-status: 1.6.2 - mongoose: 6.12.3(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + mongoose: 6.12.3 mongoose-aggregate-paginate-v2: 1.0.6 mongoose-paginate-v2: 1.7.22 - payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) prompts: 2.4.2 uuid: 9.0.0 transitivePeerDependencies: @@ -16533,10 +16909,19 @@ snapshots: '@aws-sdk/client-s3': 3.600.0 '@aws-sdk/lib-storage': 3.600.0(@aws-sdk/client-s3@3.600.0) - '@payloadcms/plugin-cloud-storage@1.1.3(@aws-sdk/client-s3@3.600.0)(@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': + '@payloadcms/plugin-cloud-storage@1.1.3(@aws-sdk/client-s3@3.600.0)(@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': dependencies: find-node-modules: 2.1.3 - payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + range-parser: 1.2.1 + optionalDependencies: + '@aws-sdk/client-s3': 3.600.0 + '@aws-sdk/lib-storage': 3.600.0(@aws-sdk/client-s3@3.600.0) + + '@payloadcms/plugin-cloud-storage@1.1.3(@aws-sdk/client-s3@3.600.0)(@aws-sdk/lib-storage@3.600.0(@aws-sdk/client-s3@3.600.0))(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))': + dependencies: + find-node-modules: 2.1.3 + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) range-parser: 1.2.1 optionalDependencies: '@aws-sdk/client-s3': 3.600.0 @@ -16546,9 +16931,13 @@ snapshots: dependencies: payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))) - '@payloadcms/plugin-nested-docs@1.0.12(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': + '@payloadcms/plugin-nested-docs@1.0.12(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': + dependencies: + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + + '@payloadcms/plugin-nested-docs@1.0.12(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))': dependencies: - payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) '@payloadcms/plugin-sentry@0.0.6(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))))(react@18.3.1)': dependencies: @@ -16560,12 +16949,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@payloadcms/plugin-sentry@0.0.6(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1)': + '@payloadcms/plugin-sentry@0.0.6(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1)': dependencies: '@sentry/node': 7.118.0 '@sentry/types': 7.118.0 express: 4.19.2 - payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + react: 18.3.1 + transitivePeerDependencies: + - supports-color + + '@payloadcms/plugin-sentry@0.0.6(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(react@18.3.1)': + dependencies: + '@sentry/node': 7.118.0 + '@sentry/types': 7.118.0 + express: 4.19.2 + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) react: 18.3.1 transitivePeerDependencies: - supports-color @@ -16575,9 +16974,14 @@ snapshots: payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))) react: 18.3.1 - '@payloadcms/plugin-seo@2.3.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1)': + '@payloadcms/plugin-seo@2.3.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react@18.3.1)': + dependencies: + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + react: 18.3.1 + + '@payloadcms/plugin-seo@2.3.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(react@18.3.1)': dependencies: - payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) react: 18.3.1 '@payloadcms/richtext-slate@1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -16596,12 +17000,28 @@ snapshots: - react-dom - react-native - '@payloadcms/richtext-slate@1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@payloadcms/richtext-slate@1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@faceless-ui/modal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) i18next: 22.5.1 is-hotkey: 0.2.0 - payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + react: 18.3.1 + react-i18next: 11.18.6(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + slate: 0.91.4 + slate-history: 0.86.0(slate@0.91.4) + slate-hyperscript: 0.81.3(slate@0.91.4) + slate-react: 0.92.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.91.4) + transitivePeerDependencies: + - react-dom + - react-native + + '@payloadcms/richtext-slate@1.5.2(payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@faceless-ui/modal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + i18next: 22.5.1 + is-hotkey: 0.2.0 + payload: 2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) react: 18.3.1 react-i18next: 11.18.6(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) slate: 0.91.4 @@ -17088,7 +17508,7 @@ snapshots: - encoding - supports-color - '@sentry/nextjs@8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(encoding@0.1.13)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(react@18.3.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0))': + '@sentry/nextjs@8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(encoding@0.1.13)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(react@18.3.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0))': dependencies: '@opentelemetry/instrumentation-http': 0.52.0(@opentelemetry/api@1.9.0) '@rollup/plugin-commonjs': 26.0.1(rollup@3.29.4) @@ -17099,7 +17519,7 @@ snapshots: '@sentry/types': 8.11.0 '@sentry/utils': 8.11.0 '@sentry/vercel-edge': 8.11.0 - '@sentry/webpack-plugin': 2.18.0(encoding@0.1.13)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + '@sentry/webpack-plugin': 2.18.0(encoding@0.1.13)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) chalk: 3.0.0 next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4) react: 18.3.1 @@ -17107,7 +17527,36 @@ snapshots: rollup: 3.29.4 stacktrace-parser: 0.1.10 optionalDependencies: - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/core' + - '@opentelemetry/instrumentation' + - '@opentelemetry/sdk-trace-base' + - '@opentelemetry/semantic-conventions' + - encoding + - supports-color + + '@sentry/nextjs@8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(encoding@0.1.13)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(react@18.3.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)))': + dependencies: + '@opentelemetry/instrumentation-http': 0.52.0(@opentelemetry/api@1.9.0) + '@rollup/plugin-commonjs': 26.0.1(rollup@3.29.4) + '@sentry/core': 8.11.0 + '@sentry/node': 8.11.0 + '@sentry/opentelemetry': 8.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1) + '@sentry/react': 8.11.0(react@18.3.1) + '@sentry/types': 8.11.0 + '@sentry/utils': 8.11.0 + '@sentry/vercel-edge': 8.11.0 + '@sentry/webpack-plugin': 2.18.0(encoding@0.1.13)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) + chalk: 3.0.0 + next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4) + react: 18.3.1 + resolve: 1.22.8 + rollup: 3.29.4 + stacktrace-parser: 0.1.10 + optionalDependencies: + webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/core' @@ -17236,12 +17685,22 @@ snapshots: - encoding - supports-color - '@sentry/webpack-plugin@2.18.0(encoding@0.1.13)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0))': + '@sentry/webpack-plugin@2.18.0(encoding@0.1.13)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0))': dependencies: '@sentry/bundler-plugin-core': 2.18.0(encoding@0.1.13) unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/webpack-plugin@2.18.0(encoding@0.1.13)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)))': + dependencies: + '@sentry/bundler-plugin-core': 2.18.0(encoding@0.1.13) + unplugin: 1.0.1 + uuid: 9.0.1 + webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) transitivePeerDependencies: - encoding - supports-color @@ -17691,11 +18150,11 @@ snapshots: dependencies: '@storybook/global': 5.0.0 - '@storybook/addon-interactions@8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0))': + '@storybook/addon-interactions@8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)))': dependencies: '@storybook/global': 5.0.0 '@storybook/instrumenter': 8.1.10 - '@storybook/test': 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)) + '@storybook/test': 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2))) '@storybook/types': 8.1.10 polished: 4.3.1 ts-dedent: 2.2.0 @@ -18018,7 +18477,7 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) picomatch: 2.3.1 pkg-dir: 5.0.0 - prettier-fallback: prettier@3.3.2 + prettier-fallback: prettier@3.1.1 pretty-hrtime: 1.0.3 resolve-from: 5.0.0 semver: 7.6.2 @@ -18187,7 +18646,7 @@ snapshots: '@storybook/manager@8.1.10': {} - '@storybook/nextjs@8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0))(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4)(type-fest@4.20.1)(typescript@5.5.2)(webpack-hot-middleware@2.26.1)(webpack@5.92.1)': + '@storybook/nextjs@8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)))(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4))(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4)(type-fest@4.20.1)(typescript@5.5.2)(webpack-hot-middleware@2.26.1)(webpack@5.92.1)': dependencies: '@babel/core': 7.24.7 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) @@ -18210,7 +18669,7 @@ snapshots: '@storybook/preset-react-webpack': 8.1.10(encoding@0.1.13)(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2) '@storybook/preview-api': 8.1.10 '@storybook/react': 8.1.10(encoding@0.1.13)(prettier@3.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2) - '@storybook/test': 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)) + '@storybook/test': 8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2))) '@storybook/types': 8.1.10 '@types/node': 18.19.38 '@types/semver': 7.5.8 @@ -18512,14 +18971,14 @@ snapshots: - prettier - supports-color - '@storybook/test@8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0))': + '@storybook/test@8.1.10(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)))': dependencies: '@storybook/client-logger': 8.1.10 '@storybook/core-events': 8.1.10 '@storybook/instrumenter': 8.1.10 '@storybook/preview-api': 8.1.10 '@testing-library/dom': 9.3.4 - '@testing-library/jest-dom': 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(babel-plugin-macros@3.1.0)) + '@testing-library/jest-dom': 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2))) '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) '@vitest/expect': 1.3.1 '@vitest/spy': 1.6.0 @@ -18833,6 +19292,21 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)))': + dependencies: + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.24.7 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + optionalDependencies: + '@jest/globals': 29.7.0 + '@types/jest': 29.5.12 + jest: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) + '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@18.19.38))': dependencies: '@adobe/css-tools': 4.4.0 @@ -18848,7 +19322,7 @@ snapshots: '@types/jest': 29.5.12 jest: 29.7.0(@types/node@18.19.38) - '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(babel-plugin-macros@3.1.0))': + '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.24.7 @@ -18861,7 +19335,7 @@ snapshots: optionalDependencies: '@jest/globals': 29.7.0 '@types/jest': 29.5.12 - jest: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + jest: 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) '@testing-library/react@14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -19137,6 +19611,14 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/nodemailer-sendgrid@1.0.3': + dependencies: + '@types/nodemailer': 6.4.15 + + '@types/nodemailer@6.4.15': + dependencies: + '@types/node': 20.14.7 + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -19441,9 +19923,9 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0))': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0))': dependencies: - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) webpack-cli: 4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1))': @@ -20598,6 +21080,22 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 + create-jest@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.7) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + optional: true + create-jest@29.7.0(@types/node@18.19.38): dependencies: '@jest/types': 29.6.3 @@ -20620,7 +21118,7 @@ snapshots: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-config: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -20644,13 +21142,58 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0): + create-jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-config: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -20719,6 +21262,20 @@ snapshots: semver: 7.6.2 webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + css-loader@5.2.7(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + icss-utils: 5.1.0(postcss@8.4.31) + loader-utils: 2.0.4 + postcss: 8.4.31 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.31) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.31) + postcss-modules-scope: 3.2.0(postcss@8.4.31) + postcss-modules-values: 4.0.0(postcss@8.4.31) + postcss-value-parser: 4.2.0 + schema-utils: 3.3.0 + semver: 7.6.2 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + css-loader@5.2.7(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: icss-utils: 5.1.0(postcss@8.4.31) @@ -21574,7 +22131,7 @@ snapshots: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -21583,22 +22140,22 @@ snapshots: dependencies: eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.34.3(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 - eslint-config-next@14.2.3(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0)(typescript@5.5.2): + eslint-config-next@14.2.3(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0)(typescript@5.5.2): dependencies: '@next/eslint-plugin-next': 14.2.3 '@rushstack/eslint-patch': 1.10.3 '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.34.3(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -21656,13 +22213,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.5 enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.14.0 @@ -21695,7 +22252,7 @@ snapshots: array.prototype.find: 2.2.3 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 @@ -21708,12 +22265,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: array.prototype.find: 2.2.3 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 @@ -21722,16 +22279,16 @@ snapshots: lodash: 4.17.21 resolve: 2.0.0-next.5 semver: 5.7.2 - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.20.2)): + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))): dependencies: array.prototype.find: 2.2.3 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 @@ -21740,16 +22297,16 @@ snapshots: lodash: 4.17.21 resolve: 2.0.0-next.5 semver: 5.7.2 - webpack: 5.92.1(esbuild@0.20.2) + webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1): + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.20.2)): dependencies: array.prototype.find: 2.2.3 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 @@ -21758,71 +22315,52 @@ snapshots: lodash: 4.17.21 resolve: 2.0.0-next.5 semver: 5.7.2 - webpack: 5.92.1 + webpack: 5.92.1(esbuild@0.20.2) transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0): + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1): dependencies: + array.prototype.find: 2.2.3 debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1) + enhanced-resolve: 0.9.1 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) + find-root: 1.1.0 + hasown: 2.0.2 + interpret: 1.4.0 + is-core-module: 2.14.0 + is-regex: 1.1.4 + lodash: 4.17.21 + resolve: 2.0.0-next.5 + semver: 5.7.2 + webpack: 5.92.1 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) transitivePeerDependencies: - supports-color - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1))(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.14.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 + + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -21832,7 +22370,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.14.0 is-glob: 4.0.3 @@ -21849,7 +22387,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -21859,7 +22397,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.14.0 is-glob: 4.0.3 @@ -21869,6 +22407,8 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -21887,7 +22427,7 @@ snapshots: '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.2) eslint: 8.57.0 optionalDependencies: - jest: 29.7.0(@types/node@18.19.38) + jest: 29.7.0 transitivePeerDependencies: - supports-color - typescript @@ -22286,6 +22826,12 @@ snapshots: schema-utils: 3.3.0 webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + file-loader@6.2.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + file-loader@6.2.0(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: loader-utils: 2.0.4 @@ -23033,14 +23579,23 @@ snapshots: tapable: 2.2.1 webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5)) - html-webpack-plugin@5.5.3(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + html-webpack-plugin@5.5.3(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + + html-webpack-plugin@5.5.3(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) html-webpack-plugin@5.6.0(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: @@ -23052,6 +23607,16 @@ snapshots: optionalDependencies: webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + html-webpack-plugin@5.6.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + html-webpack-plugin@5.6.0(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -23624,16 +24189,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.19.38): + jest-cli@29.7.0: dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.38) + create-jest: 29.7.0 exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.38) + jest-config: 29.7.0(@types/node@20.14.7) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23644,16 +24209,16 @@ snapshots: - ts-node optional: true - jest-cli@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0): + jest-cli@29.7.0(@types/node@18.19.38): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + create-jest: 29.7.0(@types/node@18.19.38) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-config: 29.7.0(@types/node@18.19.38) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23662,6 +24227,7 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true jest-cli@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)): dependencies: @@ -23672,7 +24238,7 @@ snapshots: create-jest: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-config: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23701,16 +24267,73 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0): + jest-cli@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + jest-config: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -23751,7 +24374,7 @@ snapshots: - supports-color optional: true - jest-config@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)): + jest-config@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)): dependencies: '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 @@ -23777,12 +24400,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.38 - ts-node: 10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2) + ts-node: 10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)): + jest-config@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)): dependencies: '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 @@ -23808,12 +24431,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.38 - ts-node: 10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2) + ts-node: 10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)): + jest-config@29.7.0(@types/node@20.14.7): dependencies: '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 @@ -23839,10 +24462,10 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.14.7 - ts-node: 10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2) transitivePeerDependencies: - babel-plugin-macros - supports-color + optional: true jest-config@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)): dependencies: @@ -23875,6 +24498,99 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)): + dependencies: + '@babel/core': 7.24.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.7 + ts-node: 10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)): + dependencies: + '@babel/core': 7.24.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.7 + ts-node: 10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)): + dependencies: + '@babel/core': 7.24.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.7 + ts-node: 10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -24111,12 +24827,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@18.19.38): + jest@29.7.0: dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.19.38) + jest-cli: 29.7.0 transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -24124,17 +24840,18 @@ snapshots: - ts-node optional: true - jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0): + jest@29.7.0(@types/node@18.19.38): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0) + jest-cli: 29.7.0(@types/node@18.19.38) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + optional: true jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.3.96(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)): dependencies: @@ -24160,12 +24877,48 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0): + jest@29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@18.19.38)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.38)(typescript@5.5.2)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.7)(babel-plugin-macros@3.1.0) + jest-cli: 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(typescript@5.5.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -24850,6 +25603,13 @@ snapshots: webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) webpack-sources: 1.4.3 + mini-css-extract-plugin@1.6.2(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack-sources: 1.4.3 + mini-css-extract-plugin@1.6.2(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: loader-utils: 2.0.4 @@ -24950,6 +25710,18 @@ snapshots: '@types/whatwg-url': 8.2.2 whatwg-url: 11.0.0 + mongodb@4.17.1: + dependencies: + bson: 4.7.2 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.3 + optionalDependencies: + '@aws-sdk/credential-providers': 3.600.0 + '@mongodb-js/saslprep': 1.1.7 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + mongodb@4.17.1(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)): dependencies: bson: 4.7.2 @@ -24961,10 +25733,24 @@ snapshots: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - - mongoose-aggregate-paginate-v2@1.0.6: {} - - mongoose-paginate-v2@1.7.22: {} + + mongoose-aggregate-paginate-v2@1.0.6: {} + + mongoose-paginate-v2@1.7.22: {} + + mongoose@6.12.3: + dependencies: + bson: 4.7.2 + kareem: 2.5.1 + mongodb: 4.17.1 + mpath: 0.9.0 + mquery: 4.0.3 + ms: 2.1.3 + sift: 16.0.1 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color mongoose@6.12.3(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)): dependencies: @@ -25702,7 +26488,108 @@ snapshots: - uglify-js - webpack - payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + '@date-io/date-fns': 2.16.0(date-fns@2.30.0) + '@dnd-kit/core': 6.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@faceless-ui/modal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@faceless-ui/scroll-info': 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@faceless-ui/window-info': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@monaco-editor/react': 4.5.1(monaco-editor@0.38.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@swc/core': 1.6.1(@swc/helpers@0.5.5) + '@swc/register': 0.1.10(@swc/core@1.6.1(@swc/helpers@0.5.5)) + body-parser: 1.20.2 + body-scroll-lock: 4.0.0-beta.0 + bson-objectid: 2.0.4 + compression: 1.7.4 + conf: 10.2.0 + connect-history-api-fallback: 1.6.0 + console-table-printer: 2.11.2 + dataloader: 2.2.2 + date-fns: 2.30.0 + deep-equal: 2.2.2 + deepmerge: 4.3.1 + dotenv: 8.6.0 + express: 4.18.2 + express-fileupload: 1.4.0 + express-rate-limit: 5.5.1 + file-type: 16.5.4 + find-up: 4.1.0 + fs-extra: 10.1.0 + get-tsconfig: 4.6.2 + graphql: 16.8.1 + graphql-http: 1.21.0(graphql@16.8.1) + graphql-playground-middleware-express: 1.7.23(express@4.18.2) + graphql-query-complexity: 0.12.0(graphql@16.8.1) + graphql-scalars: 1.22.2(graphql@16.8.1) + graphql-type-json: 0.3.2(graphql@16.8.1) + html-webpack-plugin: 5.5.3(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + http-status: 1.6.2 + i18next: 22.5.1 + i18next-browser-languagedetector: 6.1.8 + i18next-http-middleware: 3.3.2 + is-buffer: 2.0.5 + is-hotkey: 0.2.0 + is-plain-object: 5.0.0 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + joi: 17.9.2 + json-schema-to-typescript: 11.0.3 + jsonwebtoken: 9.0.1 + jwt-decode: 3.1.2 + md5: 2.3.0 + method-override: 3.0.0 + minimist: 1.2.8 + mkdirp: 1.0.4 + monaco-editor: 0.38.0 + nodemailer: 6.9.8 + object-to-formdata: 4.5.1 + passport: 0.6.0 + passport-anonymous: 1.0.1 + passport-headerapikey: 1.2.2 + passport-jwt: 4.0.1 + passport-local: 1.0.0 + pino: 8.15.0 + pino-pretty: 10.2.0 + pluralize: 8.0.0 + probe-image-size: 6.0.0 + process: 0.11.10 + qs: 6.11.2 + qs-middleware: 1.0.3 + react: 18.3.1 + react-animate-height: 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-datepicker: 4.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-diff-viewer-continued: 3.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-helmet: 6.1.0(react@18.3.1) + react-i18next: 11.18.6(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-image-crop: 10.1.8(react@18.3.1) + react-router-dom: 5.3.4(react@18.3.1) + react-router-navigation-prompt: 1.9.6(react-router-dom@5.3.4(react@18.3.1))(react@18.3.1) + react-select: 5.7.4(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-toastify: 8.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sanitize-filename: 1.6.3 + sass: 1.69.4 + scheduler: 0.23.0 + scmp: 2.1.0 + sharp: 0.33.4 + swc-loader: 0.2.3(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + terser-webpack-plugin: 5.3.9(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + ts-essentials: 7.0.3(typescript@5.5.2) + use-context-selector: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.0) + uuid: 9.0.1 + transitivePeerDependencies: + - '@swc/helpers' + - '@types/react' + - encoding + - esbuild + - react-native + - supports-color + - typescript + - uglify-js + - webpack + + payload@2.22.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.2)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))): dependencies: '@date-io/date-fns': 2.16.0(date-fns@2.30.0) '@dnd-kit/core': 6.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -25738,7 +26625,7 @@ snapshots: graphql-query-complexity: 0.12.0(graphql@16.8.1) graphql-scalars: 1.22.2(graphql@16.8.1) graphql-type-json: 0.3.2(graphql@16.8.1) - html-webpack-plugin: 5.5.3(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + html-webpack-plugin: 5.5.3(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) http-status: 1.6.2 i18next: 22.5.1 i18next-browser-languagedetector: 6.1.8 @@ -25787,8 +26674,8 @@ snapshots: scheduler: 0.23.0 scmp: 2.1.0 sharp: 0.33.4 - swc-loader: 0.2.3(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) - terser-webpack-plugin: 5.3.9(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + swc-loader: 0.2.3(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.9(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) ts-essentials: 7.0.3(typescript@5.5.2) use-context-selector: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.0) uuid: 9.0.1 @@ -26058,6 +26945,14 @@ snapshots: semver: 7.6.2 webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + postcss-loader@6.2.1(postcss@8.4.31)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + cosmiconfig: 7.1.0 + klona: 2.0.6 + postcss: 8.4.31 + semver: 7.6.2 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + postcss-loader@6.2.1(postcss@8.4.31)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: cosmiconfig: 7.1.0 @@ -26300,6 +27195,8 @@ snapshots: prettier@2.8.8: {} + prettier@3.1.1: {} + prettier@3.3.2: {} pretty-error@4.0.0: @@ -27121,6 +28018,14 @@ snapshots: optionalDependencies: sass: 1.69.4 + sass-loader@12.6.0(sass@1.69.4)(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + klona: 2.0.6 + neo-async: 2.6.2 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + optionalDependencies: + sass: 1.69.4 + sass-loader@12.6.0(sass@1.69.4)(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: klona: 2.0.6 @@ -27700,6 +28605,12 @@ snapshots: schema-utils: 3.3.0 webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + style-loader@2.0.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + style-loader@2.0.0(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: loader-utils: 2.0.4 @@ -27760,10 +28671,15 @@ snapshots: '@swc/core': 1.6.1(@swc/helpers@0.5.5) webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5)) - swc-loader@0.2.3(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + swc-loader@0.2.3(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: '@swc/core': 1.6.1(@swc/helpers@0.5.5) - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + + swc-loader@0.2.3(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))): + dependencies: + '@swc/core': 1.6.1(@swc/helpers@0.5.5) + webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) swc-loader@0.2.6(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: @@ -27771,6 +28687,12 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + swc-loader@0.2.6(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + '@swc/core': 1.6.1(@swc/helpers@0.5.5) + '@swc/counter': 0.1.3 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + swc-loader@0.2.6(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: '@swc/core': 1.6.3(@swc/helpers@0.5.5) @@ -27782,6 +28704,11 @@ snapshots: '@swc/core': 1.3.96(@swc/helpers@0.5.5) webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + swc-minify-webpack-plugin@2.1.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + '@swc/core': 1.6.1(@swc/helpers@0.5.5) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + swc-minify-webpack-plugin@2.1.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: '@swc/core': 1.6.3(@swc/helpers@0.5.5) @@ -27873,6 +28800,17 @@ snapshots: optionalDependencies: '@swc/core': 1.3.96(@swc/helpers@0.5.5) + terser-webpack-plugin@5.3.10(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + optionalDependencies: + '@swc/core': 1.6.1(@swc/helpers@0.5.5) + terser-webpack-plugin@5.3.10(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -27884,6 +28822,17 @@ snapshots: optionalDependencies: '@swc/core': 1.6.3(@swc/helpers@0.5.5) + terser-webpack-plugin@5.3.10(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) + optionalDependencies: + '@swc/core': 1.6.3(@swc/helpers@0.5.5) + terser-webpack-plugin@5.3.10(esbuild@0.20.2)(webpack@5.92.1(esbuild@0.20.2)): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -27915,14 +28864,25 @@ snapshots: optionalDependencies: '@swc/core': 1.6.1(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.9(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + terser-webpack-plugin@5.3.9(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + optionalDependencies: + '@swc/core': 1.6.1(@swc/helpers@0.5.5) + + terser-webpack-plugin@5.3.9(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)) optionalDependencies: '@swc/core': 1.6.1(@swc/helpers@0.5.5) @@ -28081,6 +29041,27 @@ snapshots: optionalDependencies: '@swc/core': 1.3.96(@swc/helpers@0.5.5) + ts-node@10.9.2(@swc/core@1.6.1(@swc/helpers@0.5.5))(@types/node@20.14.7)(typescript@5.5.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.14.7 + acorn: 8.12.0 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.6.1(@swc/helpers@0.5.5) + optional: true + ts-node@10.9.2(@swc/core@1.6.3(@swc/helpers@0.5.5))(@types/node@18.19.38)(typescript@5.5.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -28355,6 +29336,15 @@ snapshots: optionalDependencies: file-loader: 6.2.0(webpack@5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + url-loader@4.1.1(file-loader@6.2.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + optionalDependencies: + file-loader: 6.2.0(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + url-loader@4.1.1(file-loader@6.2.0(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: loader-utils: 2.0.4 @@ -29121,7 +30111,7 @@ snapshots: webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1)) '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1)) colorette: 2.0.20 @@ -29131,7 +30121,7 @@ snapshots: import-local: 3.1.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: webpack-bundle-analyzer: 4.10.2 @@ -29146,6 +30136,16 @@ snapshots: optionalDependencies: webpack: 5.92.1(@swc/core@1.3.96(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack-dev-middleware@6.1.2(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + optionalDependencies: + webpack: 5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0) + webpack-dev-middleware@6.1.2(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0)): dependencies: colorette: 2.0.20 @@ -29294,6 +30294,70 @@ snapshots: - esbuild - uglify-js + webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.0 + acorn-import-attributes: 1.9.5(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.1(@swc/helpers@0.5.5))(webpack-cli@4.10.0)) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 4.10.0(webpack-bundle-analyzer@4.10.2)(webpack@5.92.1) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5)): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.0 + acorn-import-attributes: 1.9.5(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + webpack@5.92.1(@swc/core@1.6.3(@swc/helpers@0.5.5))(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 From 09bc1828aa6df2acabe6fd71de5a419c4899643b Mon Sep 17 00:00:00 2001 From: Kevin Koech Date: Mon, 24 Jun 2024 15:32:38 +0300 Subject: [PATCH 2/5] Mongo URL update --- apps/roboshield/.env | 2 +- apps/roboshield/.env.template | 2 +- apps/roboshield/payload.config.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/roboshield/.env b/apps/roboshield/.env index d57dda945..5105a7b8b 100644 --- a/apps/roboshield/.env +++ b/apps/roboshield/.env @@ -1,7 +1,7 @@ MIGRATIONS_DIR=./migrations PAYLOAD_PUBLIC_DEFAULT_LOCALE=en -PAYLOAD_PUBLIC_LOCALES="en, fr, pt" +PAYLOAD_PUBLIC_LOCALES="en" SENTRY_ENVIRONMENT=local SENTRY_ORG=code-for-africa diff --git a/apps/roboshield/.env.template b/apps/roboshield/.env.template index d88963366..41eb1edb4 100644 --- a/apps/roboshield/.env.template +++ b/apps/roboshield/.env.template @@ -19,7 +19,7 @@ SENTRY_ORG= SENTRY_PROJECT= # Payload -MONGODB_URL= +MONGO_URL= PAYLOAD_SECRET= PAYLOAD_PUBLIC_APP_URL= diff --git a/apps/roboshield/payload.config.ts b/apps/roboshield/payload.config.ts index 34f6a118d..7bc788338 100644 --- a/apps/roboshield/payload.config.ts +++ b/apps/roboshield/payload.config.ts @@ -46,7 +46,7 @@ export default buildConfig({ serverURL: appURL, editor: slateEditor({}), db: mongooseAdapter({ - url: process.env.MONGODB_URL ?? false, + url: process.env.MONGO_URL ?? false, migrationDir: process.env.MIGRATIONS_DIR, }), collections: [Media, Pages, Users] as CollectionConfig[], From 2568195326a9c16b125ac7476dbc638885186810 Mon Sep 17 00:00:00 2001 From: Kevin Koech Date: Mon, 24 Jun 2024 19:08:02 +0300 Subject: [PATCH 3/5] Convert to Typescript --- apps/roboshield/src/lib/config.ts | 12 +-- .../lib/data/common/{index.js => index.ts} | 15 ++- .../src/lib/data/{index.js => index.ts} | 0 .../src/lib/data/local/{index.js => index.ts} | 3 +- apps/roboshield/src/lib/data/payload.types.ts | 101 ++++++++++++++++++ apps/roboshield/src/lib/payload/index.js | 64 ----------- apps/roboshield/src/lib/payload/index.ts | 81 ++++++++++++++ .../payload/access/{isAdmin.js => isAdmin.ts} | 9 +- ...inOrPublished.js => isAdminOrPublished.ts} | 7 +- .../{isAdminOrSelf.js => isAdminOrSelf.ts} | 11 +- .../src/payload/access/{roles.js => roles.ts} | 0 .../collections/{Media.js => Media.ts} | 4 +- .../collections/{Pages.js => Pages.ts} | 3 +- .../collections/{Users.js => Users.ts} | 0 .../fields/fullTitle/{index.js => index.ts} | 9 +- ...ulateFullTitle.js => populateFullTitle.ts} | 6 +- .../src/payload/fields/{image.js => image.ts} | 8 +- .../payload/fields/links/{link.js => link.ts} | 28 ++++- .../src/payload/fields/links/linkArray.js | 26 ----- .../src/payload/fields/links/linkArray.ts | 41 +++++++ .../src/payload/fields/links/linkGroup.js | 19 ---- .../src/payload/fields/links/linkGroup.ts | 34 ++++++ .../roboshield/src/payload/fields/richText.js | 57 ---------- .../roboshield/src/payload/fields/richText.ts | 67 ++++++++++++ .../slug/{formatSlug.js => formatSlug.ts} | 14 ++- .../fields/slug/{index.js => index.ts} | 5 +- .../fields/{socialLinks.js => socialLinks.ts} | 23 +++- .../src/payload/fields/{url.js => url.ts} | 8 +- .../{EngagementTab.js => EngagementTab.ts} | 0 .../Site/{GeneralTab.js => GeneralTab.ts} | 0 .../{NavigationTab.js => NavigationTab.ts} | 0 .../globals/Site/{index.js => index.ts} | 0 .../{formatPagePath.js => formatPagePath.ts} | 22 +++- .../payload/utils/{locales.js => locales.ts} | 1 + ...LinkTypeToHref.js => mapLinkTypeToHref.ts} | 15 ++- 35 files changed, 479 insertions(+), 214 deletions(-) rename apps/roboshield/src/lib/data/common/{index.js => index.ts} (67%) rename apps/roboshield/src/lib/data/{index.js => index.ts} (100%) rename apps/roboshield/src/lib/data/local/{index.js => index.ts} (68%) create mode 100644 apps/roboshield/src/lib/data/payload.types.ts delete mode 100644 apps/roboshield/src/lib/payload/index.js create mode 100644 apps/roboshield/src/lib/payload/index.ts rename apps/roboshield/src/payload/access/{isAdmin.js => isAdmin.ts} (57%) rename apps/roboshield/src/payload/access/{isAdminOrPublished.js => isAdminOrPublished.ts} (58%) rename apps/roboshield/src/payload/access/{isAdminOrSelf.js => isAdminOrSelf.ts} (64%) rename apps/roboshield/src/payload/access/{roles.js => roles.ts} (100%) rename apps/roboshield/src/payload/collections/{Media.js => Media.ts} (85%) rename apps/roboshield/src/payload/collections/{Pages.js => Pages.ts} (88%) rename apps/roboshield/src/payload/collections/{Users.js => Users.ts} (100%) rename apps/roboshield/src/payload/fields/fullTitle/{index.js => index.ts} (59%) rename apps/roboshield/src/payload/fields/fullTitle/{populateFullTitle.js => populateFullTitle.ts} (67%) rename apps/roboshield/src/payload/fields/{image.js => image.ts} (58%) rename apps/roboshield/src/payload/fields/links/{link.js => link.ts} (83%) delete mode 100644 apps/roboshield/src/payload/fields/links/linkArray.js create mode 100644 apps/roboshield/src/payload/fields/links/linkArray.ts delete mode 100644 apps/roboshield/src/payload/fields/links/linkGroup.js create mode 100644 apps/roboshield/src/payload/fields/links/linkGroup.ts delete mode 100644 apps/roboshield/src/payload/fields/richText.js create mode 100644 apps/roboshield/src/payload/fields/richText.ts rename apps/roboshield/src/payload/fields/slug/{formatSlug.js => formatSlug.ts} (62%) rename apps/roboshield/src/payload/fields/slug/{index.js => index.ts} (83%) rename apps/roboshield/src/payload/fields/{socialLinks.js => socialLinks.ts} (74%) rename apps/roboshield/src/payload/fields/{url.js => url.ts} (73%) rename apps/roboshield/src/payload/globals/Site/{EngagementTab.js => EngagementTab.ts} (100%) rename apps/roboshield/src/payload/globals/Site/{GeneralTab.js => GeneralTab.ts} (100%) rename apps/roboshield/src/payload/globals/Site/{NavigationTab.js => NavigationTab.ts} (100%) rename apps/roboshield/src/payload/globals/Site/{index.js => index.ts} (100%) rename apps/roboshield/src/payload/utils/{formatPagePath.js => formatPagePath.ts} (54%) rename apps/roboshield/src/payload/utils/{locales.js => locales.ts} (99%) rename apps/roboshield/src/payload/utils/{mapLinkTypeToHref.js => mapLinkTypeToHref.ts} (58%) diff --git a/apps/roboshield/src/lib/config.ts b/apps/roboshield/src/lib/config.ts index 9c0fe4b7a..efece1104 100644 --- a/apps/roboshield/src/lib/config.ts +++ b/apps/roboshield/src/lib/config.ts @@ -137,9 +137,9 @@ export const configureBot = (bot: Robot) => { (path) => path.trim() !== "", ); if (validDisallowedPaths.length > 0) { - robots += `User-agent: ${bot.userAgent}\nDisallow: ${validDisallowedPaths.join( - "\nDisallow: ", - )}\n\n`; + robots += `User-agent: ${ + bot.userAgent + }\nDisallow: ${validDisallowedPaths.join("\nDisallow: ")}\n\n`; } } @@ -148,9 +148,9 @@ export const configureBot = (bot: Robot) => { (path) => path.trim() !== "", ); if (validAllowedPaths.length > 0) { - robots += `User-agent: ${bot.userAgent}\nAllow: ${validAllowedPaths.join( - "\nAllow: ", - )}\n\n`; + robots += `User-agent: ${ + bot.userAgent + }\nAllow: ${validAllowedPaths.join("\nAllow: ")}\n\n`; } } } diff --git a/apps/roboshield/src/lib/data/common/index.js b/apps/roboshield/src/lib/data/common/index.ts similarity index 67% rename from apps/roboshield/src/lib/data/common/index.js rename to apps/roboshield/src/lib/data/common/index.ts index 9898a0c73..daa5d7c41 100644 --- a/apps/roboshield/src/lib/data/common/index.js +++ b/apps/roboshield/src/lib/data/common/index.ts @@ -1,8 +1,11 @@ -export function imageFromMedia({ alt = null, url = null }) { +import { Api, MediaData, Settings } from "../payload.types"; +import { AppContext } from "next/app"; + +export function imageFromMedia({ alt = null, url = null }: Partial) { return { alt, src: url }; } -function getNavBar(settings) { +function getNavBar(settings: Settings) { const { connect: { links = [] }, primaryLogo: media, @@ -18,7 +21,7 @@ function getNavBar(settings) { }; } -function getFooter(settings) { +function getFooter(settings: Settings) { const { primaryLogo, primaryNavigation, @@ -37,8 +40,10 @@ function getFooter(settings) { }; } -export async function getPageProps(api, context) { - const siteSettings = await api.findGlobal("settings-site"); +export async function getPageProps(api: Api, context: AppContext) { + const siteSettings: Settings = (await api.findGlobal( + "settings-site", + )) as Settings; const navbar = getNavBar(siteSettings); const footer = getFooter(siteSettings); diff --git a/apps/roboshield/src/lib/data/index.js b/apps/roboshield/src/lib/data/index.ts similarity index 100% rename from apps/roboshield/src/lib/data/index.js rename to apps/roboshield/src/lib/data/index.ts diff --git a/apps/roboshield/src/lib/data/local/index.js b/apps/roboshield/src/lib/data/local/index.ts similarity index 68% rename from apps/roboshield/src/lib/data/local/index.js rename to apps/roboshield/src/lib/data/local/index.ts index ba0357dd3..d2639d104 100644 --- a/apps/roboshield/src/lib/data/local/index.js +++ b/apps/roboshield/src/lib/data/local/index.ts @@ -1,7 +1,8 @@ import { getPageProps } from "@/roboshield/lib/data/common"; import api from "@/roboshield/lib/payload"; +import { AppContext } from "next/app"; -export async function getPageServerSideProps(context) { +export async function getPageServerSideProps(context: AppContext) { const props = await getPageProps(api, context); if (!props) { return { notFound: true }; diff --git a/apps/roboshield/src/lib/data/payload.types.ts b/apps/roboshield/src/lib/data/payload.types.ts new file mode 100644 index 000000000..99eecb769 --- /dev/null +++ b/apps/roboshield/src/lib/data/payload.types.ts @@ -0,0 +1,101 @@ +interface TextNode { + children: TextNode | null; + text?: string; +} + +interface BreadCrumbs { + doc: string; + url: string; + label: string; + id: string; +} + +interface Document { + id: string; + title: string; + fullTitle: string; + slug: string; + blocks: any[]; + meta: any; + breadcrumbs: BreadCrumbs[]; + createdAt: string; + updatedAt: string; +} + +interface Link { + label: string; + linkType: string; + doc: { + value: Document; + }; + relationTo: string; +} + +interface SocialMediaLink { + platform: string; + url: string; + id: string; +} + +interface StayInTouchData { + title: string; + links: SocialMediaLink[]; +} + +export interface MediaData { + id: string; + alt?: string | null; + prefix: string; + filename: string; + mimeType: string; + filesize: number; + width: number; + height: number; + createdAt: string; + updatedAt: string; + url: string | null; + src: string | null; +} + +export interface Settings { + title: string; + description: TextNode; + connect: StayInTouchData; + primaryLogo: MediaData; + secondaryLogo: MediaData; + primaryNavigation: { + menus: Link[]; + connect: string; + }; + secondaryNavigation: { + menus: Link[]; + }; + newsletter: { + title: string; + embedCode: string; + }; +} + +export interface CollectionQuery { + collection: string; + depth: number; + page: number; + limit: number; + pagination: boolean; + where: Record; + sort: string; + locale: string; + fallbackLocale: boolean | string; + user: string; + overrideAccess: boolean; + showHiddenFields: boolean; +} + +export interface Api { + createCollection: (...args: any) => Promise; + deleteCollection: (...args: any) => Promise; + findGlobal: (...args: any) => Promise; + findPage: (...args: any) => Promise; + getCollection: (...args: any) => Promise; + updateCollection: (...args: any) => Promise; +} diff --git a/apps/roboshield/src/lib/payload/index.js b/apps/roboshield/src/lib/payload/index.js deleted file mode 100644 index 8bb041faf..000000000 --- a/apps/roboshield/src/lib/payload/index.js +++ /dev/null @@ -1,64 +0,0 @@ -import payload from "payload"; - -async function findPage(slug, options) { - return payload.find({ - ...options, - collection: "pages", - where: { - ...options?.where, - slug: { - equals: slug, - }, - }, - }); -} - -async function getCollection(collection, options) { - return payload.find({ - limit: 0, - ...options, - collection, - }); -} - -async function findGlobal(slug, options) { - return payload.findGlobal({ - ...options, - slug, - }); -} - -async function createCollection(collection, data, options) { - return payload.create({ - collection, - data, - ...options, - }); -} - -async function deleteCollection(collection, options) { - return payload.delete({ - ...options, - collection, - }); -} - -async function updateCollection(collection, id, data, options) { - const args = { - ...options, - collection, - id, - data, - }; - return payload.update(args); -} -const api = { - createCollection, - deleteCollection, - findGlobal, - findPage, - getCollection, - updateCollection, -}; - -export default api; diff --git a/apps/roboshield/src/lib/payload/index.ts b/apps/roboshield/src/lib/payload/index.ts new file mode 100644 index 000000000..d37400192 --- /dev/null +++ b/apps/roboshield/src/lib/payload/index.ts @@ -0,0 +1,81 @@ +import payload from "payload"; +import { CollectionQuery } from "../data/payload.types"; +import { ByIDOptions } from "payload/dist/collections/operations/local/update"; + +async function findPage(slug: string, options: ByIDOptions) { + return payload.find({ + ...options, + collection: "pages", + where: { + ...(options?.where || {}), + slug: { + equals: slug, + }, + }, + }); +} + +async function getCollection( + collection: string, + options: Partial>, +) { + return payload.find({ + limit: 0, + ...options, + collection, + }); +} + +async function findGlobal(slug: string, options: ByIDOptions) { + return payload.findGlobal({ + ...options, + slug, + }); +} + +async function createCollection( + collection: string, + data: any, + options: Partial>, +) { + return payload.create({ + collection, + data, + ...options, + }); +} + +async function deleteCollection( + collection: string, + options: ByIDOptions, +) { + return payload.delete({ + ...options, + collection, + }); +} + +async function updateCollection( + collection: string, + id: string, + data: any, + options: ByIDOptions, +) { + const args = { + ...options, + collection, + id, + data, + }; + return payload.update(args); +} +const api = { + createCollection, + deleteCollection, + findGlobal, + findPage, + getCollection, + updateCollection, +}; + +export default api; diff --git a/apps/roboshield/src/payload/access/isAdmin.js b/apps/roboshield/src/payload/access/isAdmin.ts similarity index 57% rename from apps/roboshield/src/payload/access/isAdmin.js rename to apps/roboshield/src/payload/access/isAdmin.ts index 08301afd9..72db22d0f 100644 --- a/apps/roboshield/src/payload/access/isAdmin.js +++ b/apps/roboshield/src/payload/access/isAdmin.ts @@ -1,11 +1,16 @@ +import { PayloadRequest } from "payload/types"; import { ROLE_ADMIN } from "./roles"; -export const isAdmin = ({ req: { user } }) => { +export const isAdmin = ({ req: { user } }: { req: PayloadRequest }) => { // Return true or false based on if the user has an admin role return Boolean(user?.roles?.includes(ROLE_ADMIN)); }; -export const isAdminFieldLevel = ({ req: { user } }) => { +export const isAdminFieldLevel = ({ + req: { user }, +}: { + req: PayloadRequest; +}) => { // Return true or false based on if the user has an admin role return Boolean(user?.roles?.includes(ROLE_ADMIN)); }; diff --git a/apps/roboshield/src/payload/access/isAdminOrPublished.js b/apps/roboshield/src/payload/access/isAdminOrPublished.ts similarity index 58% rename from apps/roboshield/src/payload/access/isAdminOrPublished.js rename to apps/roboshield/src/payload/access/isAdminOrPublished.ts index c006014ec..0075b114b 100644 --- a/apps/roboshield/src/payload/access/isAdminOrPublished.js +++ b/apps/roboshield/src/payload/access/isAdminOrPublished.ts @@ -1,6 +1,11 @@ +import { PayloadRequest } from "payload/types"; import { ROLE_ADMIN } from "./roles"; -export const isAdminOrPublished = ({ req: { user } }) => { +export const isAdminOrPublished = ({ + req: { user }, +}: { + req: PayloadRequest; +}) => { if (user?.roles?.includes(ROLE_ADMIN)) { return true; } diff --git a/apps/roboshield/src/payload/access/isAdminOrSelf.js b/apps/roboshield/src/payload/access/isAdminOrSelf.ts similarity index 64% rename from apps/roboshield/src/payload/access/isAdminOrSelf.js rename to apps/roboshield/src/payload/access/isAdminOrSelf.ts index 4dfae4152..ed4590be0 100644 --- a/apps/roboshield/src/payload/access/isAdminOrSelf.js +++ b/apps/roboshield/src/payload/access/isAdminOrSelf.ts @@ -1,6 +1,7 @@ +import { PayloadRequest } from "payload/types"; import { ROLE_ADMIN } from "./roles"; -export const isAdminOrSelf = ({ req: { user } }) => { +export const isAdminOrSelf = ({ req: { user } }: { req: PayloadRequest }) => { // Need to be logged in if (user) { // If user has role of 'admin' @@ -19,6 +20,12 @@ export const isAdminOrSelf = ({ req: { user } }) => { return false; }; -export const isAdminOrSelfFieldLevel = ({ id, req: { user } }) => { +export const isAdminOrSelfFieldLevel = ({ + id, + req: { user }, +}: { + id: string; + req: PayloadRequest; +}) => { return user?.roles?.includes(ROLE_ADMIN) || id === user?.id; }; diff --git a/apps/roboshield/src/payload/access/roles.js b/apps/roboshield/src/payload/access/roles.ts similarity index 100% rename from apps/roboshield/src/payload/access/roles.js rename to apps/roboshield/src/payload/access/roles.ts diff --git a/apps/roboshield/src/payload/collections/Media.js b/apps/roboshield/src/payload/collections/Media.ts similarity index 85% rename from apps/roboshield/src/payload/collections/Media.js rename to apps/roboshield/src/payload/collections/Media.ts index bbd5b3040..e242f8692 100644 --- a/apps/roboshield/src/payload/collections/Media.js +++ b/apps/roboshield/src/payload/collections/Media.ts @@ -1,4 +1,6 @@ -const Media = { +import { CollectionConfig } from "payload/types"; + +const Media: CollectionConfig = { slug: "media", admin: { defaultColumns: ["alt", "updatedAt"], diff --git a/apps/roboshield/src/payload/collections/Pages.js b/apps/roboshield/src/payload/collections/Pages.ts similarity index 88% rename from apps/roboshield/src/payload/collections/Pages.js rename to apps/roboshield/src/payload/collections/Pages.ts index 286643b53..e9c31e747 100644 --- a/apps/roboshield/src/payload/collections/Pages.js +++ b/apps/roboshield/src/payload/collections/Pages.ts @@ -1,7 +1,8 @@ +import { CollectionConfig } from "payload/types"; import fullTitle from "../fields/fullTitle"; import slug from "../fields/slug"; -const Pages = { +const Pages: CollectionConfig = { slug: "pages", access: { read: () => true, diff --git a/apps/roboshield/src/payload/collections/Users.js b/apps/roboshield/src/payload/collections/Users.ts similarity index 100% rename from apps/roboshield/src/payload/collections/Users.js rename to apps/roboshield/src/payload/collections/Users.ts diff --git a/apps/roboshield/src/payload/fields/fullTitle/index.js b/apps/roboshield/src/payload/fields/fullTitle/index.ts similarity index 59% rename from apps/roboshield/src/payload/fields/fullTitle/index.js rename to apps/roboshield/src/payload/fields/fullTitle/index.ts index 8074aadae..2a57c759e 100644 --- a/apps/roboshield/src/payload/fields/fullTitle/index.js +++ b/apps/roboshield/src/payload/fields/fullTitle/index.ts @@ -1,8 +1,13 @@ import { deepmerge } from "@mui/utils"; import populateFullTitle from "./populateFullTitle"; +import { Field } from "payload/types"; -function fullTitle({ overrides = undefined } = {}) { +interface Args { + overrides?: Partial; +} +function fullTitle(args: Args): Field { + const { overrides = undefined } = args ?? {}; const fullTitleResult = { name: "fullTitle", type: "text", @@ -16,7 +21,7 @@ function fullTitle({ overrides = undefined } = {}) { }, }; - return deepmerge(fullTitleResult, overrides); + return deepmerge(fullTitleResult, overrides) as Field; } export default fullTitle; diff --git a/apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.js b/apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.ts similarity index 67% rename from apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.js rename to apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.ts index 703529fe8..ffb6b690e 100644 --- a/apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.js +++ b/apps/roboshield/src/payload/fields/fullTitle/populateFullTitle.ts @@ -1,4 +1,6 @@ -export function generateFullTitle(breadcrumbs) { +import { FieldHookArgs } from "payload/types"; + +export function generateFullTitle(breadcrumbs: any) { if (Array.isArray(breadcrumbs)) { return breadcrumbs.reduce((title, breadcrumb, i) => { if (i === 0) { @@ -10,7 +12,7 @@ export function generateFullTitle(breadcrumbs) { return undefined; } -async function populateFullTitle({ data, originalDoc }) { +async function populateFullTitle({ data, originalDoc }: FieldHookArgs) { return generateFullTitle(data?.breadcrumbs || originalDoc?.breadcrumbs); } diff --git a/apps/roboshield/src/payload/fields/image.js b/apps/roboshield/src/payload/fields/image.ts similarity index 58% rename from apps/roboshield/src/payload/fields/image.js rename to apps/roboshield/src/payload/fields/image.ts index c6ef5f402..237202a7e 100644 --- a/apps/roboshield/src/payload/fields/image.js +++ b/apps/roboshield/src/payload/fields/image.ts @@ -1,7 +1,11 @@ import { deepmerge } from "@mui/utils"; +import { Field } from "payload/types"; -function image({ overrides = undefined } = {}) { - const imageResult = { +interface Args { + overrides?: Partial; +} +function image({ overrides = undefined }: Args = {}) { + const imageResult: Field = { name: "image", type: "upload", relationTo: "media", diff --git a/apps/roboshield/src/payload/fields/links/link.js b/apps/roboshield/src/payload/fields/links/link.ts similarity index 83% rename from apps/roboshield/src/payload/fields/links/link.js rename to apps/roboshield/src/payload/fields/links/link.ts index 88d80d0a7..083865de4 100644 --- a/apps/roboshield/src/payload/fields/links/link.js +++ b/apps/roboshield/src/payload/fields/links/link.ts @@ -1,11 +1,27 @@ import { deepmerge } from "@mui/utils"; import mapLinkTypeToHref from "../../utils/mapLinkTypeToHref"; +import { + RowField, + SanitizedCollectionConfig, + PayloadRequest, + Condition, +} from "payload/types"; + +interface CollectionBeforeReadHookArgs { + collection: SanitizedCollectionConfig; + siblingData: any; + doc: any; + query: { + [key: string]: any; + }; + req: PayloadRequest; +} export async function mapLinkToHrefBeforeValidate({ siblingData, req: { payload }, -}) { +}: CollectionBeforeReadHookArgs) { // Don't modify original doc. const doc = { ...siblingData.doc }; if (typeof doc.value === "string") { @@ -32,7 +48,7 @@ const link = ({ overrides = {}, required = true, } = {}) => { - const linkResult = { + const linkResult: RowField = { type: "row", fields: [ { @@ -76,7 +92,8 @@ const link = ({ required, maxDepth: 1, admin: { - condition: (_, siblingData) => siblingData?.linkType === "internal", + condition: ((_, siblingData) => + siblingData?.linkType === "internal") as Condition, }, }, { @@ -89,7 +106,8 @@ const link = ({ type: "text", required, admin: { - condition: (_, siblingData) => siblingData?.linkType === "custom", + condition: ((_, siblingData) => + siblingData?.linkType === "custom") as Condition, }, }, { @@ -106,7 +124,7 @@ const link = ({ ], }, ]; - let labelFields = []; + let labelFields: any = []; if (!disableLabel) { labelFields = [ { diff --git a/apps/roboshield/src/payload/fields/links/linkArray.js b/apps/roboshield/src/payload/fields/links/linkArray.js deleted file mode 100644 index b3d617785..000000000 --- a/apps/roboshield/src/payload/fields/links/linkArray.js +++ /dev/null @@ -1,26 +0,0 @@ -import { deepmerge } from "@mui/utils"; - -import link from "./link"; - -/** - * array field consisting of link fields . - */ -function linkArray({ linkConfig, overrides = {} } = {}) { - const generatedLinkArray = { - name: "links", - type: "array", - fields: [link(linkConfig)], - admin: { - initCollapsed: true, - components: { - RowLabel: ({ data }) => { - return data?.label || data?.reference?.title || data?.url || data?.id; - }, - }, - }, - }; - - return deepmerge(generatedLinkArray, overrides); -} - -export default linkArray; diff --git a/apps/roboshield/src/payload/fields/links/linkArray.ts b/apps/roboshield/src/payload/fields/links/linkArray.ts new file mode 100644 index 000000000..570edd262 --- /dev/null +++ b/apps/roboshield/src/payload/fields/links/linkArray.ts @@ -0,0 +1,41 @@ +import { deepmerge } from "@mui/utils"; + +import link from "./link"; +import { Field } from "payload/types"; + +type LinkConfig = { + defaultValue: string; + disableLabel: boolean; + disableLinkTypeSelection: boolean; + disableOpenInNewTab: boolean; + overrides: Partial; + required: boolean; +}; + +interface Args { + linkConfig?: LinkConfig; + overrides: Partial; +} +/** + * array field consisting of link fields . + */ +function linkArray(args: Args) { + const { linkConfig, overrides = {} } = args ?? {}; + const generatedLinkArray: Field = { + name: "links", + type: "array", + fields: [link(linkConfig)], + admin: { + initCollapsed: true, + components: { + RowLabel: ({ data }: any) => { + return data?.label || data?.reference?.title || data?.url || data?.id; + }, + }, + }, + }; + + return deepmerge(generatedLinkArray, overrides); +} + +export default linkArray; diff --git a/apps/roboshield/src/payload/fields/links/linkGroup.js b/apps/roboshield/src/payload/fields/links/linkGroup.js deleted file mode 100644 index 654b4e05f..000000000 --- a/apps/roboshield/src/payload/fields/links/linkGroup.js +++ /dev/null @@ -1,19 +0,0 @@ -import { deepmerge } from "@mui/utils"; - -import link from "./link"; - -/** - * group field consisting of a link field. - */ -function linkGroup({ linkConfig, overrides = {} } = {}) { - const generatedLinkGroup = { - name: "link", - type: "group", - required: true, - fields: [link(linkConfig)], - }; - - return deepmerge(generatedLinkGroup, overrides); -} - -export default linkGroup; diff --git a/apps/roboshield/src/payload/fields/links/linkGroup.ts b/apps/roboshield/src/payload/fields/links/linkGroup.ts new file mode 100644 index 000000000..cde423f2a --- /dev/null +++ b/apps/roboshield/src/payload/fields/links/linkGroup.ts @@ -0,0 +1,34 @@ +import { deepmerge } from "@mui/utils"; + +import link from "./link"; +import { Field } from "payload/types"; + +type LinkConfig = { + defaultValue: string; + disableLabel: boolean; + disableLinkTypeSelection: boolean; + disableOpenInNewTab: boolean; + overrides: Partial; + required: boolean; +}; + +interface Args { + linkConfig?: LinkConfig; + overrides: Partial; +} +/** + * group field consisting of a link field. + */ +function linkGroup(args: Args) { + const { linkConfig, overrides = {} } = args ?? {}; + const generatedLinkGroup = { + name: "link", + type: "group", + required: true, + fields: [link(linkConfig)], + }; + + return deepmerge(generatedLinkGroup, overrides); +} + +export default linkGroup; diff --git a/apps/roboshield/src/payload/fields/richText.js b/apps/roboshield/src/payload/fields/richText.js deleted file mode 100644 index e84a3fa92..000000000 --- a/apps/roboshield/src/payload/fields/richText.js +++ /dev/null @@ -1,57 +0,0 @@ -import { deepmerge } from "@mui/utils"; - -import mapLinkTypeToHref from "../utils/mapLinkTypeToHref"; - -async function insertHref(nodes, payload) { - if (!nodes?.length) { - // Front-end needs `null` for serialization - return null; - } - return Promise.all( - nodes.map(async (node) => { - let newNode = node; - // The most important thing is not to change the doc structure - // since the admin UI expects it to be in certain why. But of course, - // we can add href prop for front-end. - if (node.type === "link") { - let { doc } = node; - if (typeof doc?.value === "string") { - const { relationTo: collection, value: id } = doc; - const value = await payload.findByID({ - collection, - id, - // We only need slug from the collection don't expand the whole - // relationship. We may end up getting stuck on infinite recursion if - // collection contain other links. - depth: 0, - }); - doc = { ...doc, value }; - } - const href = mapLinkTypeToHref({ ...node, doc }); - newNode = { ...node, href }; - } - newNode.children = await insertHref(node.children, payload); - return newNode; - }), - ); -} - -async function mapLinkToHrefAfterRead({ req: { payload }, value }) { - if (!value?.length) { - return value; - } - return insertHref(value, payload); -} - -function richText(overrides) { - const richTextResult = { - type: "richText", - hooks: { - afterRead: [mapLinkToHrefAfterRead], - }, - }; - - return deepmerge(richTextResult, overrides); -} - -export default richText; diff --git a/apps/roboshield/src/payload/fields/richText.ts b/apps/roboshield/src/payload/fields/richText.ts new file mode 100644 index 000000000..a5c67f60a --- /dev/null +++ b/apps/roboshield/src/payload/fields/richText.ts @@ -0,0 +1,67 @@ +import { deepmerge } from "@mui/utils"; + +import mapLinkTypeToHref, { NodeType } from "../utils/mapLinkTypeToHref"; +import { Field, PayloadRequest } from "payload/types"; + +async function insertHref(nodes: NodeType[] | null, payload: PayloadRequest) { + if (!nodes?.length) { + // Front-end needs `null` for serialization + return null; + } + return Promise.all( + nodes.map(async (node) => { + let newNode = node; + // The most important thing is not to change the doc structure + // since the admin UI expects it to be in certain why. But of course, + // we can add href prop for front-end. + if (node.type === "link") { + let { doc } = node; + if (typeof doc?.value === "string") { + const { relationTo: collection, value: id } = doc; + if (payload.findByID) { + // @ts-ignore + const value = await payload.findByID({ + collection, + id, + // We only need slug from the collection don't expand the whole + // relationship. We may end up getting stuck on infinite recursion if + // collection contain other links. + depth: 0, + }); + doc = { ...doc, value }; + } + } + const href: string = mapLinkTypeToHref({ ...node, doc }) as string; + newNode = { ...node, href }; + } + newNode.children = await insertHref(node.children as NodeType[], payload); + return newNode; + }), + ); +} + +async function mapLinkToHrefAfterRead({ + req: { payload }, + value, +}: { + value?: any; + req: { payload: PayloadRequest }; +}) { + if (!value?.length) { + return value; + } + return insertHref(value, payload); +} + +function richText(overrides: Partial) { + const richTextResult = { + type: "richText", + hooks: { + afterRead: [mapLinkToHrefAfterRead], + }, + }; + + return deepmerge(richTextResult, overrides); +} + +export default richText; diff --git a/apps/roboshield/src/payload/fields/slug/formatSlug.js b/apps/roboshield/src/payload/fields/slug/formatSlug.ts similarity index 62% rename from apps/roboshield/src/payload/fields/slug/formatSlug.js rename to apps/roboshield/src/payload/fields/slug/formatSlug.ts index e1b07e3a6..b27f12c09 100644 --- a/apps/roboshield/src/payload/fields/slug/formatSlug.js +++ b/apps/roboshield/src/payload/fields/slug/formatSlug.ts @@ -1,18 +1,24 @@ -const format = (val) => +import { FieldHook, FieldHookArgs } from "payload/types"; + +interface FieldArgs extends Partial> { + fallback: string[]; +} +const format = (val: string) => val .replace(/ /g, "-") .replace(/[^\w-]+/g, "") .toLowerCase(); -const getFallbackData = ({ fallback, originalDoc, data }) => { +const getFallbackData = ({ fallback, originalDoc, data }: FieldArgs) => { const fallbackValues = fallback.map( - (value) => (data && data[value]) || (originalDoc && originalDoc[value]), + (value: string) => + (data && data[value]) || (originalDoc && originalDoc[value]), ); return fallbackValues.join("-"); }; const formatSlug = - (fallback) => + (fallback: string): FieldHook => ({ value, originalDoc, data }) => { if (value && typeof value === "string") { return format(value); diff --git a/apps/roboshield/src/payload/fields/slug/index.js b/apps/roboshield/src/payload/fields/slug/index.ts similarity index 83% rename from apps/roboshield/src/payload/fields/slug/index.js rename to apps/roboshield/src/payload/fields/slug/index.ts index ef953b843..b9ad9c4db 100644 --- a/apps/roboshield/src/payload/fields/slug/index.js +++ b/apps/roboshield/src/payload/fields/slug/index.ts @@ -1,9 +1,10 @@ import { deepmerge } from "@mui/utils"; import formatSlug from "./formatSlug"; +import { Field } from "payload/types"; -function slug({ fieldToUse = "title", overrides = undefined } = {}) { - const slugResult = { +function slug({ fieldToUse = "title", overrides = undefined } = {}): Field { + const slugResult: Field = { name: "slug", type: "text", index: true, diff --git a/apps/roboshield/src/payload/fields/socialLinks.js b/apps/roboshield/src/payload/fields/socialLinks.ts similarity index 74% rename from apps/roboshield/src/payload/fields/socialLinks.js rename to apps/roboshield/src/payload/fields/socialLinks.ts index 566c9cc70..4cf84a921 100644 --- a/apps/roboshield/src/payload/fields/socialLinks.js +++ b/apps/roboshield/src/payload/fields/socialLinks.ts @@ -2,6 +2,7 @@ import { deepmerge } from "@mui/utils"; import { select } from "payload/dist/fields/validations"; import url from "./url"; +import { Field } from "payload/types"; export const socialMediaOptions = [ "Facebook", @@ -12,8 +13,12 @@ export const socialMediaOptions = [ "Slack", ]; -function socialLinks(overrides = {}) { - const defaults = { +type Overrides = { + name: string; +} & Partial; + +function socialLinks(overrides: Overrides = { name: "links" }) { + const defaults: Field = { name: "links", type: "array", labels: { @@ -28,7 +33,14 @@ function socialLinks(overrides = {}) { admin: { className: "array-field-nested", components: { - RowLabel: ({ data, index }) => { + // @ts-ignore + RowLabel: ({ + data, + index, + }: { + index: number; + data: { platform: string; url: string }; + }) => { let label = ""; if (data.platform) { label = data.platform; @@ -53,9 +65,10 @@ function socialLinks(overrides = {}) { required: true, validate: (val, args) => { const { data, t } = args || {}; - const { name: linksName = "links" } = overrides; + const { name: linksName = "links" } = overrides as Overrides; if ( - data?.[linksName]?.filter((l) => l.platform === val)?.length > 1 + data?.[linksName]?.filter((l: any) => l.platform === val)?.length > + 1 ) { return t("codeforafrica.validation:uniquePlatforms"); } diff --git a/apps/roboshield/src/payload/fields/url.js b/apps/roboshield/src/payload/fields/url.ts similarity index 73% rename from apps/roboshield/src/payload/fields/url.js rename to apps/roboshield/src/payload/fields/url.ts index 49d638adb..5b5fce8dd 100644 --- a/apps/roboshield/src/payload/fields/url.js +++ b/apps/roboshield/src/payload/fields/url.ts @@ -1,8 +1,12 @@ import { deepmerge } from "@mui/utils"; import { text } from "payload/dist/fields/validations"; +import { Field } from "payload/types"; -function url({ overrides = undefined } = {}) { - const urlResult = { +interface Args { + overrides?: Partial; +} +function url({ overrides = undefined }: Args = {}): Field { + const urlResult: Field = { name: "url", type: "text", label: "URL", diff --git a/apps/roboshield/src/payload/globals/Site/EngagementTab.js b/apps/roboshield/src/payload/globals/Site/EngagementTab.ts similarity index 100% rename from apps/roboshield/src/payload/globals/Site/EngagementTab.js rename to apps/roboshield/src/payload/globals/Site/EngagementTab.ts diff --git a/apps/roboshield/src/payload/globals/Site/GeneralTab.js b/apps/roboshield/src/payload/globals/Site/GeneralTab.ts similarity index 100% rename from apps/roboshield/src/payload/globals/Site/GeneralTab.js rename to apps/roboshield/src/payload/globals/Site/GeneralTab.ts diff --git a/apps/roboshield/src/payload/globals/Site/NavigationTab.js b/apps/roboshield/src/payload/globals/Site/NavigationTab.ts similarity index 100% rename from apps/roboshield/src/payload/globals/Site/NavigationTab.js rename to apps/roboshield/src/payload/globals/Site/NavigationTab.ts diff --git a/apps/roboshield/src/payload/globals/Site/index.js b/apps/roboshield/src/payload/globals/Site/index.ts similarity index 100% rename from apps/roboshield/src/payload/globals/Site/index.js rename to apps/roboshield/src/payload/globals/Site/index.ts diff --git a/apps/roboshield/src/payload/utils/formatPagePath.js b/apps/roboshield/src/payload/utils/formatPagePath.ts similarity index 54% rename from apps/roboshield/src/payload/utils/formatPagePath.js rename to apps/roboshield/src/payload/utils/formatPagePath.ts index 7ff21f882..89a51459d 100644 --- a/apps/roboshield/src/payload/utils/formatPagePath.js +++ b/apps/roboshield/src/payload/utils/formatPagePath.ts @@ -1,4 +1,17 @@ -function fullSlugFromParents(doc) { +import { Breadcrumbs } from "@mui/material"; + +interface BreadCrumbs { + doc: string; + url: string; + label: string; + id: string; +} +interface Doc { + slug: string; + parent?: Doc; + breadcrumbs: BreadCrumbs[]; +} +function fullSlugFromParents(doc: Doc): string { const { slug, parent } = doc; if (!parent) { return slug; @@ -6,12 +19,13 @@ function fullSlugFromParents(doc) { return `${fullSlugFromParents(parent)}/${slug}`; } -function fullSlugFromBreadcrumbs({ breadcrumbs } = {}) { - const fullSlug = breadcrumbs?.[breadcrumbs.length - 1]?.url?.slice(1); +function fullSlugFromBreadcrumbs(doc: Doc) { + const fullSlug = + doc?.breadcrumbs?.[doc?.breadcrumbs.length - 1]?.url?.slice(1); return fullSlug; } -function formatPagePath(collection, doc) { +function formatPagePath(collection: string, doc: Doc) { let pageSlug = fullSlugFromBreadcrumbs(doc) || fullSlugFromParents(doc) || ""; if (pageSlug === "index") { pageSlug = ""; diff --git a/apps/roboshield/src/payload/utils/locales.js b/apps/roboshield/src/payload/utils/locales.ts similarity index 99% rename from apps/roboshield/src/payload/utils/locales.js rename to apps/roboshield/src/payload/utils/locales.ts index 11cf08c91..4e23a4508 100644 --- a/apps/roboshield/src/payload/utils/locales.js +++ b/apps/roboshield/src/payload/utils/locales.ts @@ -1,5 +1,6 @@ export const locales = process.env.PAYLOAD_PUBLIC_LOCALES?.split(",") ?.map((l) => l.trim()) .filter(Boolean) || ["en"]; + export const defaultLocale = process.env.PAYLOAD_PUBLIC_DEFAULT_LOCALE?.trim() || locales?.[0]; diff --git a/apps/roboshield/src/payload/utils/mapLinkTypeToHref.js b/apps/roboshield/src/payload/utils/mapLinkTypeToHref.ts similarity index 58% rename from apps/roboshield/src/payload/utils/mapLinkTypeToHref.js rename to apps/roboshield/src/payload/utils/mapLinkTypeToHref.ts index ab5c938c9..ee1f4526d 100644 --- a/apps/roboshield/src/payload/utils/mapLinkTypeToHref.js +++ b/apps/roboshield/src/payload/utils/mapLinkTypeToHref.ts @@ -1,6 +1,19 @@ import formatPagePath from "./formatPagePath"; -const mapLinkTypeToHref = ({ doc: linkDoc, linkType, url }) => { +export interface NodeType { + type: string; + children?: NodeType[] | null; + doc: any; + linkType?: "custom" | "internal"; + url?: string; + href?: string; +} + +const mapLinkTypeToHref = ({ + doc: linkDoc, + linkType, + url, +}: NodeType): string | null | undefined => { // default to `null` for serialization. let href = null; if (linkType === "internal") { From ad5370cccc49837bcdb3cdb08b20551afa8b6b7c Mon Sep 17 00:00:00 2001 From: Kevin Koech Date: Tue, 25 Jun 2024 10:34:55 +0300 Subject: [PATCH 4/5] Added Docker file to Multi stage --- Dockerfile | 90 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 20 ++++++++++- 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 41e5aa852..969db3ab8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -229,6 +229,96 @@ USER nextjs # Custom server to run Payload and Next.js in the same app CMD ["node", "dist/server.js"] +# ============================================================================ +# Roboshield +# ============================================================================ +FROM base-deps as roboshield-deps + +COPY apps/roboshield/package.json ./apps/roboshield/package.json + +RUN pnpm --filter "./apps/roboshield/" install --offline --frozen-lockfile +FROM base-builder as roboshield-builder +ARG NEXT_TELEMETRY_DISABLED \ + # Next.js / Payload (build time) + PORT \ + # Next.js (runtime) + NEXT_PUBLIC_APP_NAME="RoboShield" \ + NEXT_PUBLIC_APP_URL=http://localhost:3000 \ + NEXT_PUBLIC_SENTRY_DSN="" \ + # Payload (runtime) + MONGO_URL \ + PAYLOAD_SECRET \ + # Sentry (build time) + SENTRY_AUTH_TOKEN \ + SENTRY_ENVIRONMENT \ + SENTRY_ORG="" \ + SENTRY_PROJECT="" + +COPY --from=roboshield-deps /workspace/node_modules ./node_modules + +COPY packages ./packages + +COPY --from=roboshield-deps /workspace/apps/roboshield/node_modules ./apps/roboshield/node_modules + +COPY apps/roboshield ./apps/roboshield/ + +RUN pnpm --filter "./apps/roboshield/" build-next + +ARG PAYLOAD_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL} + +RUN pnpm --filter "./apps/roboshield/" build-payload + +# +# roboshield-runner: final deployable image +# -------------------------------------------- + FROM base-runner as roboshield-runner + + ARG MONGO_URL \ + NEXT_PUBLIC_APP_LOGO_URL \ + PAYLOAD_CONFIG_PATH="dist/payload.config.js" \ + PAYLOAD_PUBLIC_APP_URL + + ENV MONGO_URL=${MONGO_URL} \ + # TODO(koech): Standadise naming of GA MEASUREMENT ID. Our options: + # - GA_MEASUREMENT_ID (charterafrica, roboshield) + # - GOOGLE_ANALYTICS (pesayetu, vpnmanager) + # This is only needed at runtime + NEXT_PUBLIC_APP_LOGO_URL=${NEXT_PUBLIC_APP_LOGO_URL} \ + PAYLOAD_PUBLIC_APP_URL=${PAYLOAD_PUBLIC_APP_URL} \ + PAYLOAD_CONFIG_PATH=${PAYLOAD_CONFIG_PATH} \ + PAYLOAD_SECRET=${PAYLOAD_SECRET} + + RUN set -ex \ + # Create nextjs cache dir w/ correct permissions + && mkdir -p ./apps/roboshield//.next \ + && chown nextjs:nodejs ./apps/roboshield/.next + + # PNPM + # symlink some dependencies + COPY --from=roboshield-builder --chown=nextjs:nodejs /workspace/node_modules ./node_modules + + # Since we can't use output: "standalone", copy all app's dependencies + COPY --from=roboshield-builder --chown=nextjs:nodejs /workspace/apps/roboshield/node_modules ./apps/roboshield/node_modules + + # Next.js + # Public assets + COPY --from=roboshield-builder --chown=nextjs:nodejs /workspace/apps/roboshield/public ./apps/roboshield/public + + # Since we can't use output: "standalone", copy the whole app's .next folder + # TODO(kilemensi): Figure out which files in .next folder are not needed + COPY --from=roboshield-builder --chown=nextjs:nodejs /workspace/apps/roboshield/.next ./apps/roboshield/.next + + # Payload + COPY --from=roboshield-builder /workspace/apps/roboshield/dist ./apps/roboshield/dist + COPY --from=roboshield-builder /workspace/apps/roboshield/build ./apps/roboshield/build + + # Since we can't use output: "standalone", switch to specific app's folder + WORKDIR /workspace/apps/roboshield + + USER nextjs + + # Custom server to run Payload and Next.js in the same app + CMD ["node", "dist/server.js"] # ============================================================================ # PesaYetu # ============================================================================ diff --git a/docker-compose.yml b/docker-compose.yml index 5d8a7a862..8599325af 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,7 +83,25 @@ services: roboshield: build: context: . - dockerfile: roboshield.Dockerfile + target: roboshield-runner + args: + - MONGO_URL + - PAYLOAD_SECRET + - SENTRY_AUTH_TOKEN + - SENTRY_ORG + - SENTRY_ENV + - SENTRY_PROJECT + environment: + S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID} + S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY} + S3_BUCKET: ${S3_BUCKET} + S3_REGION: ${S3_REGION} + MONGO_URL: ${MONGO_URL} + PAYLOAD_SECRET: ${PAYLOAD_SECRET} + SENTRY_AUTH_TOKEN: ${SENTRY_AUTH_TOKEN} + SENTRY_ORG: ${SENTRY_ORG} + SENTRY_ENVIRONMENT: ${SENTRY_ENVIRONMENT} + SENTRY_PROJECT: ${SENTRY_PROJECT} ports: - 3000:3000 From a761a55709d14836c5fe3fe4ecaa5f51a6a61ad8 Mon Sep 17 00:00:00 2001 From: Kevin Koech Date: Tue, 25 Jun 2024 10:37:31 +0300 Subject: [PATCH 5/5] Updated workflow file --- .github/workflows/roboshield-deploy-dev.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/roboshield-deploy-dev.yml b/.github/workflows/roboshield-deploy-dev.yml index 82d8e2c9a..5f8ab17e8 100644 --- a/.github/workflows/roboshield-deploy-dev.yml +++ b/.github/workflows/roboshield-deploy-dev.yml @@ -5,7 +5,7 @@ on: branches: [main] paths: - "apps/roboshield/**" - - "roboshield.Dockerfile" + - "Dockerfile" - ".github/workflows/roboshield-dev.yml" concurrency: @@ -66,7 +66,8 @@ jobs: cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new context: . - file: roboshield.Dockerfile + target: charterafrica-runner + file: Dockerfile push: true tags: "${{ env.IMAGE_NAME }}:${{ github.sha }}"