diff --git a/apps/formbricks-com/.env.example b/apps/formbricks-com/.env.example index 4ce4f05a17..26b2ce211f 100644 --- a/apps/formbricks-com/.env.example +++ b/apps/formbricks-com/.env.example @@ -1,3 +1,6 @@ NEXT_PUBLIC_FORMBRICKS_COM_API_HOST=http://localhost:3000 NEXT_PUBLIC_FORMBRICKS_COM_ENVIRONMENT_ID= -NEXT_PUBLIC_FORMBRICKS_COM_DOCS_FEEDBACK_SURVEY_ID= \ No newline at end of file +NEXT_PUBLIC_FORMBRICKS_COM_DOCS_FEEDBACK_SURVEY_ID= + +# Strapi API Key +STRAPI_API_KEY= diff --git a/apps/formbricks-com/components/shared/LayoutMdx.tsx b/apps/formbricks-com/components/shared/LayoutMdx.tsx index dffad54af3..585f9d2107 100644 --- a/apps/formbricks-com/components/shared/LayoutMdx.tsx +++ b/apps/formbricks-com/components/shared/LayoutMdx.tsx @@ -1,8 +1,8 @@ +import { useEffect } from "react"; import Footer from "./Footer"; import Header from "./Header"; import MetaInformation from "./MetaInformation"; import { Prose } from "./Prose"; -import { useEffect } from "react"; const useExternalLinks = (selector: string) => { useEffect(() => { diff --git a/apps/formbricks-com/components/shared/MetaInformation.tsx b/apps/formbricks-com/components/shared/MetaInformation.tsx index 57ab4a8e16..39961f3c52 100644 --- a/apps/formbricks-com/components/shared/MetaInformation.tsx +++ b/apps/formbricks-com/components/shared/MetaInformation.tsx @@ -4,6 +4,7 @@ interface Props { title: string; description: string; publishedTime?: string; + updatedTime?: string; authors?: string[]; section?: string; tags?: string[]; @@ -13,6 +14,7 @@ export default function MetaInformation({ title, description, publishedTime, + updatedTime, authors, section, tags, @@ -31,9 +33,10 @@ export default function MetaInformation({ - - + + {publishedTime && } + {updatedTime && } {authors && } {section && } {tags && } diff --git a/apps/formbricks-com/next.config.mjs b/apps/formbricks-com/next.config.mjs index 60309722c6..339e699170 100644 --- a/apps/formbricks-com/next.config.mjs +++ b/apps/formbricks-com/next.config.mjs @@ -1,14 +1,23 @@ /** @type {import('next').NextConfig} */ +import rehypePrism from "@mapbox/rehype-prism"; import nextMDX from "@next/mdx"; import { withPlausibleProxy } from "next-plausible"; import remarkGfm from "remark-gfm"; -import rehypePrism from "@mapbox/rehype-prism"; const nextConfig = { reactStrictMode: true, pageExtensions: ["ts", "tsx", "js", "jsx", "md", "mdx"], transpilePackages: ["@formbricks/ui", "@formbricks/lib"], + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "seo-strapi-aws-s3.s3.eu-central-1.amazonaws.com", + port: "", + }, + ], + }, async redirects() { return [ { diff --git a/apps/formbricks-com/package.json b/apps/formbricks-com/package.json index fc1d6087ad..4b3f02d7da 100644 --- a/apps/formbricks-com/package.json +++ b/apps/formbricks-com/package.json @@ -27,12 +27,15 @@ "lottie-web": "^5.12.2", "next": "13.4.12", "next-plausible": "^3.10.1", + "next-seo": "^6.1.0", "next-sitemap": "^4.1.8", + "node-fetch": "^3.3.2", "prism-react-renderer": "^2.0.6", "prismjs": "^1.29.0", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "^4.10.1", + "react-markdown": "^8.0.7", "react-responsive-embed": "^2.1.0", "remark-gfm": "^3.0.1", "sharp": "^0.32.4" diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/index.mdx b/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/index.mdx index 79233124ae..fcb738a7c5 100644 --- a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/index.mdx +++ b/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/index.mdx @@ -1,12 +1,12 @@ import Image from "next/image"; import LayoutMdx from "@/components/shared/LayoutMdx"; +import AuthorBox from "@/components/shared/AuthorBox"; import Formbricks from "./open-source-survey-software-free-2023-formbricks-typeform-alternative.png"; import Typebot from "./typebot-open-source-free-conversational-form-builder-survey-software-opensource.jpg"; import LimeSurvey from "./free-survey-tool-limesurvey-open-source-software-opensource.png"; import OpnForm from "./opnform-free-open-source-form-survey-tools-builder-2023-self-hostign.jpg"; import HeaderImage from "./2023-title-best-open-source-survey-software-tools-and-alternatives.png"; import SurveyJS from "./surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png"; -import AuthorBox from "@/components/shared/AuthorBox"; export const meta = { title: "5 Open Source Survey and Form Tools maintained in 2023", diff --git a/apps/formbricks-com/pages/learn/[slug].tsx b/apps/formbricks-com/pages/learn/[slug].tsx new file mode 100644 index 0000000000..6462e0b78e --- /dev/null +++ b/apps/formbricks-com/pages/learn/[slug].tsx @@ -0,0 +1,141 @@ +import LayoutMdx from "@/components/shared/LayoutMdx"; +import { FAQPageJsonLd } from "next-seo"; +import Image from "next/image"; +import fetch from "node-fetch"; +import ReactMarkdown from "react-markdown"; + +type Article = { + id?: number; + attributes?: { + author?: string; + title?: string; + text?: string; + slug?: string; + createdAt?: string; + updatedAt?: string; + publishedAt?: string; + meta?: { + id?: number; + description?: string; + title?: string; + publisher?: string; + section?: string; + tags?: { + id?: number; + tag?: string; + }[]; + }; + faq?: { + id?: number; + question?: string; + answer?: string; + }[]; + }; +}; + +type ArticlePageProps = { + article?: Article; +}; + +interface ArticleResponse { + data: Article[]; + meta: { + pagination: { + page: number; + pageSize: number; + pageCount: number; + total: number; + }; + }; +} + +export async function getStaticPaths() { + const response = await fetch( + "https://strapi.formbricks.com/api/articles?populate[meta][populate]=*&filters[category][name][$eq]=learn", + { + headers: { + Authorization: `Bearer ${process.env.STRAPI_API_KEY}`, + }, + } + ); + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + const articles = (await response.json()) as ArticleResponse; + + const paths = articles.data.map((article) => ({ + params: { slug: article.attributes.slug }, + })); + + return { paths, fallback: true }; +} + +export async function getStaticProps({ params }) { + const res = await fetch( + `https://strapi.formbricks.com/api/articles?populate[meta][populate]=*&populate[faq][populate]=*&filters[slug][$eq]=${params.slug}`, + { + headers: { + Authorization: `Bearer ${process.env.STRAPI_API_KEY}`, + }, + } + ); + if (!res.ok) { + throw new Error("Something went wrong"); + } + const resData = (await res.json()) as ArticleResponse; + const article = resData.data[0]; + return { props: { article } }; +} + +export default function ArticlePage({ article = {} }: ArticlePageProps) { + if (!article || !article.attributes) return
Loading...
; + + // Use next/image to render images in markdown + const renderers = { + img: (image) => { + return {image.alt}; + }, + }; + + const { + attributes: { + author, + publishedAt, + text, + faq, + meta: { + title, + description, + section, + tags = [], // default empty array if tags are not provided + } = {}, // default empty object if meta is not provided + } = {}, // default empty object if attributes are not provided + } = article; + + const metaTags = tags.map((tag) => tag.tag); + + const meta = { + title, + description, + publishedTime: publishedAt, + authors: [author], + section, + tags: metaTags, + }; + + // Convert the FAQ details into the desired format for FAQPageJsonLd + const faqEntities = faq.map(({ question, answer }) => ({ + questionName: question, + acceptedAnswerText: answer, + })); + + return ( + + <> + {text} + + + + ); +} diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/members/DeleteTeam.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/members/DeleteTeam.tsx index 48271ea936..15b420cfd6 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/members/DeleteTeam.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/members/DeleteTeam.tsx @@ -1,15 +1,15 @@ "use client"; -import toast from "react-hot-toast"; import DeleteDialog from "@/components/shared/DeleteDialog"; import LoadingSpinner from "@/components/shared/LoadingSpinner"; -import { useState, Dispatch, SetStateAction } from "react"; -import { useRouter } from "next/navigation"; import { useMembers } from "@/lib/members"; -import { useProfile } from "@/lib/profile"; -import { Button, ErrorComponent, Input } from "@formbricks/ui"; -import { useTeam, deleteTeam } from "@/lib/teams/teams"; import { useMemberships } from "@/lib/memberships"; +import { useProfile } from "@/lib/profile"; +import { deleteTeam, useTeam } from "@/lib/teams/teams"; +import { Button, ErrorComponent, Input } from "@formbricks/ui"; +import { useRouter } from "next/navigation"; +import { Dispatch, SetStateAction, useState } from "react"; +import toast from "react-hot-toast"; export default function DeleteTeam({ environmentId }) { const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/profile/DeleteAccount.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/profile/DeleteAccount.tsx index 55d25dcb8c..0d4ece1b1c 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/profile/DeleteAccount.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/profile/DeleteAccount.tsx @@ -3,6 +3,7 @@ import DeleteDialog from "@/components/shared/DeleteDialog"; import AvatarPlaceholder from "@/images/avatar-placeholder.png"; import { formbricksLogout } from "@/lib/formbricks"; +import { TProfile } from "@formbricks/types/v1/profile"; import { Button, Input, ProfileAvatar } from "@formbricks/ui"; import { Session } from "next-auth"; import { signOut } from "next-auth/react"; @@ -10,7 +11,6 @@ import Image from "next/image"; import { Dispatch, SetStateAction, useState } from "react"; import toast from "react-hot-toast"; import { profileDeleteAction } from "./actions"; -import { TProfile } from "@formbricks/types/v1/profile"; export function EditAvatar({ session }) { return ( diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/PreviewSurvey.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/PreviewSurvey.tsx index f972bd9ec2..310732b295 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/PreviewSurvey.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/PreviewSurvey.tsx @@ -451,7 +451,7 @@ export default function PreviewSurvey({ ) : (
-
+
Back -

{product.name} /

+

{product.name} /

{ @@ -180,9 +180,11 @@ export default function SurveyMenuBar({ />
{!!localSurvey?.responseRate && ( -
- - This survey received responses. To keep the data consistent, make changes with caution. +
+ +

+ This survey received responses. To keep the data consistent, make changes with caution. +

)}
diff --git a/packages/eslint-config-formbricks/package.json b/packages/eslint-config-formbricks/package.json index d35b480d23..5f75b78479 100644 --- a/packages/eslint-config-formbricks/package.json +++ b/packages/eslint-config-formbricks/package.json @@ -11,7 +11,7 @@ "eslint": "^8.46.0", "eslint-config-next": "^13.4.12", "eslint-config-prettier": "^8.10.0", - "eslint-plugin-react": "7.33.1", - "eslint-config-turbo": "latest" + "eslint-config-turbo": "latest", + "eslint-plugin-react": "7.33.1" } } diff --git a/packages/js/src/lib/sync.ts b/packages/js/src/lib/sync.ts index f60d4dac9d..0b755b0336 100644 --- a/packages/js/src/lib/sync.ts +++ b/packages/js/src/lib/sync.ts @@ -2,8 +2,10 @@ import { TJsState } from "@formbricks/types/v1/js"; import { trackAction } from "./actions"; import { Config } from "./config"; import { NetworkError, Result, err, ok } from "./errors"; +import { Logger } from "./logger"; const config = Config.getInstance(); +const logger = Logger.getInstance(); const syncWithBackend = async (): Promise> => { const url = `${config.get().apiHost}/api/v1/js/sync`; @@ -42,6 +44,9 @@ export const sync = async (): Promise => { const state = syncResult.value; const oldState = config.get().state; config.update({ state }); + const surveyNames = state.surveys.map((s) => s.name); + logger.debug("Fetched " + surveyNames.length + " surveys during sync: " + surveyNames); + // if session is new, track action if (!oldState?.session || oldState.session.id !== state.session.id) { const trackActionResult = await trackAction("New Session"); diff --git a/packages/lib/package.json b/packages/lib/package.json index d3aa8a6594..fca9c1eaaa 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -15,12 +15,12 @@ "@formbricks/database": "*", "@formbricks/errors": "*", "@formbricks/types": "*", + "@paralleldrive/cuid2": "^2.2.1", "date-fns": "^2.30.0", "markdown-it": "^13.0.1", "posthog-node": "^3.1.1", "server-only": "^0.0.1", - "tailwind-merge": "^1.14.0", - "@paralleldrive/cuid2": "^2.2.1" + "tailwind-merge": "^1.14.0" }, "devDependencies": { "@formbricks/tsconfig": "*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b99627b33..b2c472cd2f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,7 +50,7 @@ importers: version: 1.3.0(react-dom@18.2.0)(react@18.2.0) '@docsearch/react': specifier: ^3.5.1 - version: 3.5.1(@algolia/client-search@4.14.2)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.6.0) + version: 3.5.1(@algolia/client-search@4.14.2)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.6.0) '@formbricks/lib': specifier: workspace:* version: link:../../packages/lib @@ -93,9 +93,15 @@ importers: next-plausible: specifier: ^3.10.1 version: 3.10.1(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) + next-seo: + specifier: ^6.1.0 + version: 6.1.0(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) next-sitemap: specifier: ^4.1.8 version: 4.1.8(next@13.4.12) + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 prism-react-renderer: specifier: ^2.0.6 version: 2.0.6(react@18.2.0) @@ -111,6 +117,9 @@ importers: react-icons: specifier: ^4.10.1 version: 4.10.1(react@18.2.0) + react-markdown: + specifier: ^8.0.7 + version: 8.0.7(@types/react@18.2.18)(react@18.2.0) react-responsive-embed: specifier: ^2.1.0 version: 2.1.0(prop-types@15.8.1)(react@18.2.0) @@ -2586,7 +2595,7 @@ packages: resolution: {integrity: sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==} dev: false - /@docsearch/react@3.5.1(@algolia/client-search@4.14.2)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.6.0): + /@docsearch/react@3.5.1(@algolia/client-search@4.14.2)(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.6.0): resolution: {integrity: sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -2603,6 +2612,7 @@ packages: '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.14.2)(algoliasearch@4.14.2)(search-insights@2.6.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.14.2)(algoliasearch@4.14.2) '@docsearch/css': 3.5.1 + '@types/react': 18.2.18 algoliasearch: 4.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -6617,6 +6627,7 @@ packages: /anymatch@2.0.0: resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + requiresBuild: true dependencies: micromatch: 3.1.10 normalize-path: 2.1.1 @@ -6835,6 +6846,7 @@ packages: /async-each@1.0.3: resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} + requiresBuild: true dev: true optional: true @@ -7154,6 +7166,7 @@ packages: /binary-extensions@1.13.1: resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -7754,6 +7767,7 @@ packages: /chokidar@2.1.8: resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + requiresBuild: true dependencies: anymatch: 2.0.0 async-each: 1.0.3 @@ -8852,6 +8866,11 @@ packages: assert-plus: 1.0.0 dev: true + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + /data-urls@1.1.0: resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} dependencies: @@ -10457,6 +10476,14 @@ packages: bser: 2.1.1 dev: true + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + /fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} dev: false @@ -10678,6 +10705,13 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -10938,6 +10972,7 @@ packages: /glob-parent@3.1.0: resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + requiresBuild: true dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 @@ -11801,6 +11836,7 @@ packages: /is-binary-path@1.0.1: resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: binary-extensions: 1.13.1 dev: true @@ -11956,6 +11992,7 @@ packages: /is-glob@3.1.0: resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: is-extglob: 2.1.1 dev: true @@ -12219,7 +12256,7 @@ packages: /isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.12 whatwg-fetch: 3.6.2 transitivePeerDependencies: - encoding @@ -14648,6 +14685,18 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /next-seo@6.1.0(next@13.4.12)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA==} + peerDependencies: + next: ^8.1.1-canary.54 || >=9.0.0 + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + next: 13.4.12(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /next-sitemap@4.1.8(next@13.4.12): resolution: {integrity: sha512-XAXpBHX4o89JfMgvrm0zimlZwpu2iBPXHpimJMUrqOZSc4C2oB1Lv89mxuVON9IE8HOezaM+w4GjJxcYCuGPTQ==} engines: {node: '>=14.18'} @@ -14765,6 +14814,11 @@ packages: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} dev: false + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + /node-fetch@2.6.12: resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} @@ -14788,6 +14842,15 @@ packages: whatwg-url: 5.0.0 dev: true + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -14849,6 +14912,7 @@ packages: /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: remove-trailing-separator: 1.1.0 dev: true @@ -15396,6 +15460,7 @@ packages: /path-dirname@1.0.2: resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + requiresBuild: true dev: true optional: true @@ -17331,7 +17396,33 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + + /react-markdown@8.0.7(@types/react@18.2.18)(react@18.2.0): + resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + dependencies: + '@types/hast': 2.3.4 + '@types/prop-types': 15.7.5 + '@types/react': 18.2.18 + '@types/unist': 2.0.6 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 2.0.0 + prop-types: 15.8.1 + property-information: 6.2.0 + react: 18.2.0 + react-is: 18.2.0 + remark-parse: 10.0.1 + remark-rehype: 10.1.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unified: 10.1.2 + unist-util-visit: 4.1.1 + vfile: 5.3.6 + transitivePeerDependencies: + - supports-color + dev: false /react-radio-group@3.0.3(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-MUNRRjZqQ2y+1K6rBuH0zO+gLVmCnWIcc5GnNwr9WNoUwZ9FUAKJ1UfsKXwYS93whR6/qrZKoVgiOltRkbzezw==} @@ -17553,6 +17644,7 @@ packages: /readdirp@2.2.1: resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} engines: {node: '>=0.10'} + requiresBuild: true dependencies: graceful-fs: 4.2.10 micromatch: 3.1.10 @@ -17731,6 +17823,7 @@ packages: /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + requiresBuild: true dev: true optional: true @@ -19070,6 +19163,12 @@ packages: inline-style-parser: 0.1.1 dev: false + /style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + /styled-jsx@5.1.1(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -20588,6 +20687,11 @@ packages: defaults: 1.0.4 dev: true + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} diff --git a/turbo.json b/turbo.json index 765445a672..a4ae57e237 100644 --- a/turbo.json +++ b/turbo.json @@ -75,6 +75,7 @@ "RAILWAY_STATIC_URL", "RENDER_EXTERNAL_URL", "SENTRY_DSN", + "STRAPI_API_KEY", "STRIPE_SECRET_KEY", "STRIPE_WEBHOOK_SECRET", "TELEMETRY_DISABLED",