diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 5ec2fa7ced..727789afc0 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -22,7 +22,7 @@
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "cp .env.example .env && sed -i '/^ENCRYPTION_KEY=/c\\ENCRYPTION_KEY='$(openssl rand -hex 32) .env && sed -i '/^NEXTAUTH_SECRET=/c\\NEXTAUTH_SECRET='$(openssl rand -hex 32) .env && pnpm install && pnpm db:migrate:dev",
- "postAttachCommand": "pnpm dev --filter=web... --filter=demo...",
+ "postAttachCommand": "pnpm dev --filter=@formbricks/web... --filter=@formbricks/demo...",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "node"
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000000..d7776edad8
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,2 @@
+node_modules/
+packages/config-eslint/
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index 9b81a3a7d8..0000000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,10 +0,0 @@
-module.exports = {
- root: true,
- // This tells ESLint to load the config from the package `eslint-config-formbricks`
- extends: ["formbricks"],
- settings: {
- next: {
- rootDir: ["apps/*/"],
- },
- },
-};
diff --git a/.github/actions/cache-build-web/action.yml b/.github/actions/cache-build-web/action.yml
index 185bf49fbd..637dddc154 100644
--- a/.github/actions/cache-build-web/action.yml
+++ b/.github/actions/cache-build-web/action.yml
@@ -49,20 +49,16 @@ runs:
run: cp .env.example .env
shell: bash
- - name: Add E2E Testing Mode
+ - name: Fill ENCRYPTION_KE, ENTERPRISE_LICENSE_KEY and E2E_TESTING in .env
run: |
- echo "E2E_TESTING=${{ inputs.e2e_testing_mode }}" >> $GITHUB_ENV
- shell: bash
-
- - name: Generate Random ENCRYPTION_KEY
- run: |
- SECRET=$(openssl rand -hex 32)
- echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV
- echo "ENTERPRISE_LICENSE_KEY=$SECRET" >> $GITHUB_ENV
+ RANDOM_KEY=$(openssl rand -hex 32)
+ sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
+ sed -i "s/ENTERPRISE_LICENSE_KEY=.*/ENTERPRISE_LICENSE_KEY=${RANDOM_KEY}/" .env
+ echo "E2E_TESTING=${{ inputs.e2e_testing_mode }}" >> .env
shell: bash
- run: |
- pnpm build --filter=web...
+ pnpm build --filter=@formbricks/web...
if: steps.cache-build.outputs.cache-hit != 'true'
shell: bash
diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml
index 58c8503c6f..cbd50feb70 100644
--- a/.github/workflows/build-web.yml
+++ b/.github/workflows/build-web.yml
@@ -31,4 +31,4 @@ jobs:
echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV
- name: Build Formbricks-web
- run: pnpm build --filter=web...
+ run: pnpm build --filter=@formbricks/web...
diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index 85493a8339..8696058676 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -40,7 +40,7 @@ jobs:
- name: Run App
run: |
- NODE_ENV=test pnpm start --filter=web &
+ NODE_ENV=test pnpm start --filter=@formbricks/web &
for attempt in {1..20}; do
if [ $(curl -o /dev/null -s -w "%{http_code}" http://localhost:3000/health) -eq 200 ]; then
echo "Ready"
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index faff0cd5ec..b58cc540f3 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -25,10 +25,10 @@ jobs:
- name: create .env
run: cp .env.example .env
- - name: Generate Random ENCRYPTION_KEY
+ - name: Generate Random ENCRYPTION_KEY and fill in .env
run: |
- SECRET=$(openssl rand -hex 32)
- echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV
+ ENCRYPTION_KEY=$(openssl rand -hex 32)
+ sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${ENCRYPTION_KEY}/" .env
- name: Lint
run: pnpm lint
diff --git a/.github/workflows/release-docker-github-experimental.yml b/.github/workflows/release-docker-github-experimental.yml
new file mode 100644
index 0000000000..ea3dcbdef7
--- /dev/null
+++ b/.github/workflows/release-docker-github-experimental.yml
@@ -0,0 +1,91 @@
+name: Docker Release to Github Experimental
+
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+on:
+ workflow_dispatch:
+
+env:
+ # Use docker.io for Docker Hub if empty
+ REGISTRY: ghcr.io
+ # github.repository as /
+ IMAGE_NAME: ${{ github.repository }}-experimental
+ TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
+ TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
+ DATABASE_URL: "postgresql://postgres:postgres@localhost:5432/formbricks?schema=public"
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ # This is used to complete the identity challenge
+ # with sigstore/fulcio when running outside of PRs.
+ id-token: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Set up Depot CLI
+ uses: depot/setup-action@v1
+
+ # Install the cosign tool except on PR
+ # https://github.com/sigstore/cosign-installer
+ - name: Install cosign
+ if: github.event_name != 'pull_request'
+ uses: sigstore/cosign-installer@v3.5.0
+
+ # Login against a Docker registry except on PR
+ # https://github.com/docker/login-action
+ - name: Log into registry ${{ env.REGISTRY }}
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v3 # v3.0.0
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ # Extract metadata (tags, labels) for Docker
+ # https://github.com/docker/metadata-action
+ - name: Extract Docker metadata
+ id: meta
+ uses: docker/metadata-action@v5 # v5.0.0
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+ # Build and push Docker image with Buildx (don't push on PR)
+ # https://github.com/docker/build-push-action
+ - name: Build and push Docker image
+ id: build-and-push
+ uses: depot/build-push-action@v1
+ with:
+ project: tw0fqmsx3c
+ token: ${{ secrets.DEPOT_PROJECT_TOKEN }}
+ context: .
+ file: ./apps/web/Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ # Sign the resulting Docker image digest except on PRs.
+ # This will only write to the public Rekor transparency log when the Docker
+ # repository is public to avoid leaking data. If you would like to publish
+ # transparency data even for private images, pass --force to cosign below.
+ # https://github.com/sigstore/cosign
+ - name: Sign the published Docker image
+ if: ${{ github.event_name != 'pull_request' }}
+ env:
+ # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
+ TAGS: ${{ steps.meta.outputs.tags }}
+ DIGEST: ${{ steps.build-and-push.outputs.digest }}
+ # This step uses the identity token to provision an ephemeral certificate
+ # against the sigstore community Fulcio instance.
+ run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 71c6de2fce..fb27f1af6d 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -25,10 +25,10 @@ jobs:
- name: create .env
run: cp .env.example .env
- - name: Generate Random ENCRYPTION_KEY
+ - name: Generate Random ENCRYPTION_KEY and fill in .env
run: |
- SECRET=$(openssl rand -hex 32)
- echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV
+ ENCRYPTION_KEY=$(openssl rand -hex 32)
+ sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${ENCRYPTION_KEY}/" .env
- name: Test
run: pnpm test
diff --git a/.prettierrc.js b/.prettierrc.js
index 5430f66ec3..e09241f398 100644
--- a/.prettierrc.js
+++ b/.prettierrc.js
@@ -1,4 +1,4 @@
-const baseConfig = require("./packages/prettier-config/prettier-preset");
+const baseConfig = require("./packages/config-prettier/prettier-preset");
module.exports = {
...baseConfig,
diff --git a/apps/demo/.eslintrc.js b/apps/demo/.eslintrc.js
index bcf4aad3a3..64a6e29852 100644
--- a/apps/demo/.eslintrc.js
+++ b/apps/demo/.eslintrc.js
@@ -1,4 +1,3 @@
module.exports = {
- root: true,
- extends: ["formbricks"],
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
};
diff --git a/apps/demo/package.json b/apps/demo/package.json
index 9feb2b8386..a7f1665a0b 100644
--- a/apps/demo/package.json
+++ b/apps/demo/package.json
@@ -19,7 +19,7 @@
"react-dom": "18.3.1"
},
"devDependencies": {
- "eslint-config-formbricks": "workspace:*",
- "@formbricks/tsconfig": "workspace:*"
+ "@formbricks/eslint-config": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*"
}
}
diff --git a/apps/demo/pages/app/index.tsx b/apps/demo/pages/app/index.tsx
index 913d307d53..c4a0fad695 100644
--- a/apps/demo/pages/app/index.tsx
+++ b/apps/demo/pages/app/index.tsx
@@ -59,7 +59,7 @@ const AppPage = ({}) => {
router.events.off("routeChangeComplete", handleRouteChange);
};
}
- });
+ }, []);
return (
diff --git a/apps/demo/tsconfig.json b/apps/demo/tsconfig.json
index 6c36451d9b..f1063c0342 100644
--- a/apps/demo/tsconfig.json
+++ b/apps/demo/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/nextjs.json",
+ "extends": "@formbricks/config-typescript/nextjs.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}
diff --git a/apps/docs/.eslintrc.js b/apps/docs/.eslintrc.js
index bcf4aad3a3..64a6e29852 100644
--- a/apps/docs/.eslintrc.js
+++ b/apps/docs/.eslintrc.js
@@ -1,4 +1,3 @@
module.exports = {
- root: true,
- extends: ["formbricks"],
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
};
diff --git a/apps/docs/app/developer-docs/contributing/page.mdx b/apps/docs/app/developer-docs/contributing/page.mdx
index ad1a6f54eb..bd526ad2a1 100644
--- a/apps/docs/app/developer-docs/contributing/page.mdx
+++ b/apps/docs/app/developer-docs/contributing/page.mdx
@@ -43,7 +43,6 @@ To be able to keep working on Formbricks over the coming years, we need to colle
Once you open a PR, you will get a message from the CLA bot to fill out the form. Please note that we can only get your contribution merged when we have a CLA signed by you.
-
## Setup Dev Environment
We currently officially support the below methods to set up your development environment for Formbricks.
@@ -425,7 +424,7 @@ This usually happens when the Formbricks Widget wasn't correctly or completely b
```bash
-pnpm build --filter=js
+pnpm build --filter=@formbricks/js
// Run the app again
pnpm dev
@@ -441,15 +440,15 @@ Since we're working with a monorepo structure, the repository can get quite big.
```bash {{ title: 'Formbricks Web-App' }}
-pnpm dev --filter=web...
+pnpm dev --filter=@formbricks/web...
```
-```bash {{ title: 'Formbricks Landing Page' }}
-pnpm dev --filter=formbricks-com...
+```bash {{ title: 'Formbricks Docs' }}
+pnpm dev --filter=@formbricks/docs...
```
```bash {{ title: 'Formbricks Demo App' }}
-pnpm dev --filter=demo...
+pnpm dev --filter=@formbricks/demo...
```
@@ -468,4 +467,3 @@ However, in our experience it's better to run `pnpm dev` than having two termina
This happens when you're using the Demo App and delete the Person within the Formbricks app which the widget is currently connected with. We're fixing it, but you can also just logout your test person and reload the page to get rid of it.
-
diff --git a/apps/docs/app/global/show-survey-to-percent-of-users/images/StepTwo.webp b/apps/docs/app/global/show-survey-to-percent-of-users/images/StepTwo.webp
index eab18b693e..b37dda4e3f 100644
Binary files a/apps/docs/app/global/show-survey-to-percent-of-users/images/StepTwo.webp and b/apps/docs/app/global/show-survey-to-percent-of-users/images/StepTwo.webp differ
diff --git a/apps/docs/app/global/show-survey-to-percent-of-users/page.mdx b/apps/docs/app/global/show-survey-to-percent-of-users/page.mdx
index dd0219b92d..f1001caef9 100644
--- a/apps/docs/app/global/show-survey-to-percent-of-users/page.mdx
+++ b/apps/docs/app/global/show-survey-to-percent-of-users/page.mdx
@@ -43,7 +43,7 @@ Set up this feature to control how many users see your survey, using a simple sl
4. **Adjust User Visibility Percentage**:
- Find the **`Show Survey to % of Users`** toggle. Enable it.
- - Use the slider to select the desired percentage (from 1% to 100%) of users to whom the survey will be shown.
+ - Enter the desired percentage (from 0.01% to 100%) of users to whom the survey will be shown.
{" "}
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 5576029fca..b0aae1c5d1 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -65,9 +65,9 @@
"zustand": "^4.5.2"
},
"devDependencies": {
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@types/dompurify": "^3.0.5",
"@types/react-highlight-words": "^0.16.7",
- "eslint-config-formbricks": "workspace:*"
+ "@formbricks/eslint-config": "workspace:*"
}
}
diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json
index c36afde61e..f623ea6a7a 100644
--- a/apps/docs/tsconfig.json
+++ b/apps/docs/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/nextjs.json",
+ "extends": "@formbricks/config-typescript/nextjs.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "../../packages/types/*.d.ts"],
"exclude": ["../../.env", "node_modules"],
"compilerOptions": {
diff --git a/apps/storybook/.storybook/preview.ts b/apps/storybook/.storybook/preview.ts
index 8eee712bbd..4ed6d23aec 100644
--- a/apps/storybook/.storybook/preview.ts
+++ b/apps/storybook/.storybook/preview.ts
@@ -1,6 +1,6 @@
import type { Preview } from "@storybook/react";
-import "../src/index.css";
+import "../../web/app/globals.css";
const preview: Preview = {
parameters: {
diff --git a/apps/storybook/package.json b/apps/storybook/package.json
index 37c04d5e95..f1b2064a64 100644
--- a/apps/storybook/package.json
+++ b/apps/storybook/package.json
@@ -12,12 +12,13 @@
},
"dependencies": {
"@formbricks/ui": "workspace:*",
+ "eslint-plugin-react-refresh": "^0.4.7",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
"devDependencies": {
"@chromatic-com/storybook": "^1.5.0",
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@storybook/addon-essentials": "^8.1.5",
"@storybook/addon-interactions": "^8.1.5",
"@storybook/addon-links": "^8.1.5",
diff --git a/apps/storybook/src/index.css b/apps/storybook/src/index.css
deleted file mode 100644
index bd6213e1df..0000000000
--- a/apps/storybook/src/index.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
\ No newline at end of file
diff --git a/apps/storybook/tailwind.config.js b/apps/storybook/tailwind.config.js
index aa3030de20..06a26e3d9c 100644
--- a/apps/storybook/tailwind.config.js
+++ b/apps/storybook/tailwind.config.js
@@ -1,5 +1,5 @@
/** @type {import('tailwindcss').Config} */
-import base from "../../packages/tailwind-config/tailwind.config";
+import base from "../../packages/config-tailwind/tailwind.config";
export default {
...base,
diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js
index bcf4aad3a3..64a6e29852 100644
--- a/apps/web/.eslintrc.js
+++ b/apps/web/.eslintrc.js
@@ -1,4 +1,3 @@
module.exports = {
- root: true,
- extends: ["formbricks"],
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
};
diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile
index f14121d1eb..e3fdbc7b67 100644
--- a/apps/web/Dockerfile
+++ b/apps/web/Dockerfile
@@ -48,8 +48,8 @@ COPY --from=builder /app/out/full/ .
RUN touch /app/apps/web/.env
# Build the project
-RUN pnpm post-install --filter=web...
-RUN pnpm turbo run build --filter=web...
+RUN pnpm post-install --filter=@formbricks/web...
+RUN pnpm turbo run build --filter=@formbricks/web...
# Extract Prisma version
RUN jq -r '.devDependencies.prisma' packages/database/package.json > /prisma_version.txt
diff --git a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/RecontactOptionsCard.tsx b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/RecontactOptionsCard.tsx
index 8c2f12f2bd..36c8fce4f2 100644
--- a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/RecontactOptionsCard.tsx
+++ b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/RecontactOptionsCard.tsx
@@ -12,7 +12,7 @@ import { Label } from "@formbricks/ui/Label";
import { RadioGroup, RadioGroupItem } from "@formbricks/ui/RadioGroup";
interface DisplayOption {
- id: "displayOnce" | "displayMultiple" | "respondMultiple";
+ id: "displayOnce" | "displayMultiple" | "respondMultiple" | "displaySome";
name: string;
description: string;
}
@@ -23,6 +23,11 @@ const displayOptions: DisplayOption[] = [
name: "Show only once",
description: "The survey will be shown once, even if person doesn't respond.",
},
+ {
+ id: "displaySome",
+ name: "Show multiple times",
+ description: "The survey will be shown multiple times until they respond",
+ },
{
id: "displayMultiple",
name: "Until they submit a response",
@@ -51,6 +56,7 @@ export const RecontactOptionsCard = ({
const [inputDays, setInputDays] = useState(
localSurvey.recontactDays !== null ? localSurvey.recontactDays : 1
);
+ const [displayLimit, setDisplayLimit] = useState(localSurvey.displayLimit ?? 1);
const handleCheckMark = () => {
if (ignoreWaiting) {
@@ -70,6 +76,14 @@ export const RecontactOptionsCard = ({
setLocalSurvey(updatedSurvey);
};
+ const handleRecontactSessionDaysChange = (event) => {
+ const value = Number(event.target.value);
+ setDisplayLimit(value);
+
+ const updatedSurvey = { ...localSurvey, displayLimit: value } satisfies TSurvey;
+ setLocalSurvey(updatedSurvey);
+ };
+
useEffect(() => {
if (localSurvey.type === "link") {
setOpen(false);
@@ -115,24 +129,49 @@ export const RecontactOptionsCard = ({
if (v === "displayOnce" || v === "displayMultiple" || v === "respondMultiple") {
const updatedSurvey: TSurvey = { ...localSurvey, displayOption: v };
setLocalSurvey(updatedSurvey);
+ } else if (v === "displaySome") {
+ const updatedSurvey: TSurvey = {
+ ...localSurvey,
+ displayOption: v,
+ displayLimit,
+ };
+ setLocalSurvey(updatedSurvey);
}
}}>
{displayOptions.map((option) => (
-
-
-
-
{option.name}
+ <>
+
+
+
+
{option.name}
-
{option.description}
-
-
+
{option.description}
+
+
+ {option.id === "displaySome" && localSurvey.displayOption === "displaySome" && (
+
+
+ Show survey maximum of
+ handleRecontactSessionDaysChange(e)}
+ className="mx-2 inline w-16 bg-white text-center text-sm"
+ />
+ times.
+
+
+ )}
+ >
))}
diff --git a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/WhenToSendCard.tsx b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/WhenToSendCard.tsx
index 4954784316..85a843e387 100644
--- a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/WhenToSendCard.tsx
+++ b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/WhenToSendCard.tsx
@@ -101,7 +101,23 @@ export const WhenToSendCard = ({
};
const handleRandomizerInput = (e) => {
- const updatedSurvey = { ...localSurvey, displayPercentage: parseInt(e.target.value) };
+ let value: number | null = null;
+
+ if (e.target.value !== "") {
+ value = parseFloat(e.target.value);
+
+ if (Number.isNaN(value)) {
+ value = 1;
+ }
+
+ if (value < 0.01) value = 0.01;
+ if (value > 100) value = 100;
+
+ // Round value to two decimal places. eg: 10.555(and higher like 10.556) -> 10.56 and 10.554(and lower like 10.553) ->10.55
+ value = Math.round(value * 100) / 100;
+ }
+
+ const updatedSurvey = { ...localSurvey, displayPercentage: value };
setLocalSurvey(updatedSurvey);
};
@@ -294,22 +310,21 @@ export const WhenToSendCard = ({
title="Show survey to % of users"
description="Only display the survey to a subset of the users"
childBorder={true}>
-
+
+
diff --git a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/lib/minimalSurvey.ts b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/lib/minimalSurvey.ts
index fdef970050..8786b6f6a0 100644
--- a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/lib/minimalSurvey.ts
+++ b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/lib/minimalSurvey.ts
@@ -14,6 +14,7 @@ export const minimalSurvey: TSurvey = {
triggers: [],
redirectUrl: null,
recontactDays: null,
+ displayLimit: null,
welcomeCard: {
enabled: false,
headline: { default: "Welcome!" },
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/members/components/BulkInviteTab.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/members/components/BulkInviteTab.tsx
index ed44018a7a..d793d8bc68 100644
--- a/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/members/components/BulkInviteTab.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/settings/(organization)/members/components/BulkInviteTab.tsx
@@ -86,9 +86,9 @@ export const BulkInviteTab = ({ setOpen, onSubmit, canDoRoleManagement }: BulkIn
{!canDoRoleManagement && (
-
+
-
+
Warning: Please note that on the Free Plan, all organization members are
automatically assigned the "Admin" role regardless of the role specified in the CSV
file.
diff --git a/apps/web/app/(auth)/auth/components/Testimonial.tsx b/apps/web/app/(auth)/auth/components/Testimonial.tsx
index 7e1433c8c8..f5e10e39af 100644
--- a/apps/web/app/(auth)/auth/components/Testimonial.tsx
+++ b/apps/web/app/(auth)/auth/components/Testimonial.tsx
@@ -40,7 +40,7 @@ export const Testimonial = () => {
Peer Richelsen, Co-Founder Cal.com
diff --git a/apps/web/app/api/v1/client/[environmentId]/app/sync/[userId]/route.ts b/apps/web/app/api/v1/client/[environmentId]/app/sync/[userId]/route.ts
index c6b217698e..a5b153308f 100644
--- a/apps/web/app/api/v1/client/[environmentId]/app/sync/[userId]/route.ts
+++ b/apps/web/app/api/v1/client/[environmentId]/app/sync/[userId]/route.ts
@@ -199,11 +199,7 @@ export const GET = async (
};
}
- return responses.successResponse(
- { ...state },
- true,
- "public, s-maxage=100, max-age=110, stale-while-revalidate=100, stale-if-error=100"
- );
+ return responses.successResponse({ ...state }, true);
} catch (error) {
console.error(error);
return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true);
diff --git a/apps/web/package.json b/apps/web/package.json
index 2f00247832..260af3c299 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -23,7 +23,7 @@
"@formbricks/js-core": "workspace:*",
"@formbricks/lib": "workspace:*",
"@formbricks/surveys": "workspace:*",
- "@formbricks/tailwind-config": "workspace:*",
+ "@formbricks/config-tailwind": "workspace:*",
"@formbricks/types": "workspace:*",
"@formbricks/ui": "workspace:*",
"@hookform/resolvers": "^3.4.2",
@@ -69,13 +69,13 @@
"xlsx": "^0.18.5"
},
"devDependencies": {
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@neshca/cache-handler": "^1.3.2",
"@types/bcryptjs": "^2.4.6",
"@types/lodash": "^4.17.4",
"@types/markdown-it": "^14.1.1",
"@types/papaparse": "^5.3.14",
"@types/qrcode": "^1.5.5",
- "eslint-config-formbricks": "workspace:*"
+ "@formbricks/eslint-config": "workspace:*"
}
}
diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js
index a3050ce04d..bbdbf017f5 100644
--- a/apps/web/tailwind.config.js
+++ b/apps/web/tailwind.config.js
@@ -1,4 +1,4 @@
-const base = require("../../packages/tailwind-config/tailwind.config");
+const base = require("../../packages/config-tailwind/tailwind.config");
/** @type {import('tailwindcss').Config} */
module.exports = {
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
index 820efa0142..4ec35640bb 100644
--- a/apps/web/tsconfig.json
+++ b/apps/web/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/nextjs.json",
+ "extends": "@formbricks/config-typescript/nextjs.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "../../packages/types/*.d.ts"],
"exclude": ["../../.env", "node_modules"],
"compilerOptions": {
diff --git a/package.json b/package.json
index 0d8e05e091..0e5e77e470 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,7 @@
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
"generate": "turbo run generate",
"lint": "turbo run lint",
- "release": "turbo run build --filter=js... && turbo run build --filter=n8n-node... && changeset publish",
+ "release": "turbo run build --filter=@formbricks/js... && changeset publish",
"test": "turbo run test --no-cache",
"test:e2e": "playwright test",
"prepare": "husky install",
@@ -34,12 +34,13 @@
},
"devDependencies": {
"@playwright/test": "^1.44.1",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
+ "eslint": "^8.57.0",
"husky": "^9.0.11",
"lint-staged": "^15.2.5",
"rimraf": "^5.0.7",
"tsx": "^4.11.0",
- "turbo": "^1.13.3"
+ "turbo": "^2.0.1"
},
"lint-staged": {
"(apps|packages)/**/*.{js,ts,jsx,tsx}": [
@@ -56,7 +57,7 @@
"engines": {
"node": ">=16.0.0"
},
- "packageManager": "pnpm@9.1.3",
+ "packageManager": "pnpm@8.15.8",
"nextBundleAnalysis": {
"budget": 358400,
"budgetPercentIncreaseRed": 20,
diff --git a/packages/api/.eslintrc.cjs b/packages/api/.eslintrc.cjs
index d6151a6966..ed6059c25b 100644
--- a/packages/api/.eslintrc.cjs
+++ b/packages/api/.eslintrc.cjs
@@ -1,3 +1,4 @@
module.exports = {
- extends: [ "turbo", "prettier"],
-};
\ No newline at end of file
+ extends: ["@formbricks/eslint-config/legacy-library.js"],
+ parser: "@typescript-eslint/parser",
+};
diff --git a/packages/api/package.json b/packages/api/package.json
index b44b94d583..586e6f764f 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -30,13 +30,13 @@
"build": "tsc && vite build",
"build:dev": "pnpm build",
"go": "vite build --watch",
- "lint": "eslint ./src --fix",
+ "lint": "eslint . --ext .ts,.js,.tsx,.jsx",
"clean": "rimraf .turbo node_modules dist"
},
"devDependencies": {
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@formbricks/types": "workspace:*",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
"terser": "^5.31.0",
"vite": "^5.2.11",
"vite-plugin-dts": "^3.9.1"
diff --git a/packages/api/src/utils/makeRequest.ts b/packages/api/src/utils/makeRequest.ts
index b756a43339..1df4d4d57b 100644
--- a/packages/api/src/utils/makeRequest.ts
+++ b/packages/api/src/utils/makeRequest.ts
@@ -7,7 +7,7 @@ export const makeRequest = async
(
method: "GET" | "POST" | "PUT" | "DELETE",
data?: any
): Promise> => {
- const url = new URL(endpoint, apiHost);
+ const url = new URL(apiHost + endpoint);
const body = JSON.stringify(data);
const res = wrapThrows(fetch)(url.toString(), {
diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json
index 19822a663c..7143d2849e 100644
--- a/packages/api/tsconfig.json
+++ b/packages/api/tsconfig.json
@@ -1,6 +1,7 @@
{
- "extends": "@formbricks/tsconfig/js-library.json",
- "include": ["src", "package.json"],
+ "extends": "@formbricks/config-typescript/js-library.json",
+ "include": ["src"],
+ "exclude": ["dist", "build", "node_modules"],
"compilerOptions": {
"allowImportingTsExtensions": true,
"isolatedModules": true,
diff --git a/packages/config-eslint/README.md b/packages/config-eslint/README.md
new file mode 100644
index 0000000000..8b42d901b0
--- /dev/null
+++ b/packages/config-eslint/README.md
@@ -0,0 +1,3 @@
+# `@turbo/eslint-config`
+
+Collection of internal eslint configurations.
diff --git a/packages/config-eslint/legacy-library.js b/packages/config-eslint/legacy-library.js
new file mode 100644
index 0000000000..80997af8c2
--- /dev/null
+++ b/packages/config-eslint/legacy-library.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ["turbo", "prettier"],
+};
diff --git a/packages/eslint-config-formbricks/index.js b/packages/config-eslint/legacy-next.js
similarity index 100%
rename from packages/eslint-config-formbricks/index.js
rename to packages/config-eslint/legacy-next.js
diff --git a/packages/config-eslint/legacy-react.js b/packages/config-eslint/legacy-react.js
new file mode 100644
index 0000000000..8a9a9329d4
--- /dev/null
+++ b/packages/config-eslint/legacy-react.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ["turbo", "prettier", "plugin:react-hooks/recommended"],
+};
diff --git a/packages/config-eslint/library.js b/packages/config-eslint/library.js
new file mode 100644
index 0000000000..4994e71a29
--- /dev/null
+++ b/packages/config-eslint/library.js
@@ -0,0 +1,34 @@
+const { resolve } = require("node:path");
+
+const project = resolve(process.cwd(), "tsconfig.json");
+
+/*
+ * This is a custom ESLint configuration for use with
+ * typescript packages.
+ *
+ * This config extends the Vercel Engineering Style Guide.
+ * For more information, see https://github.com/vercel/style-guide
+ *
+ */
+
+module.exports = {
+ extends: ["@vercel/style-guide/eslint/node", "@vercel/style-guide/eslint/typescript"].map(require.resolve),
+ parserOptions: {
+ project,
+ },
+ globals: {
+ React: true,
+ JSX: true,
+ },
+ settings: {
+ "import/resolver": {
+ typescript: {
+ project,
+ },
+ node: {
+ extensions: [".mjs", ".js", ".jsx", ".ts", ".tsx"],
+ },
+ },
+ },
+ ignorePatterns: ["node_modules/", "dist/"],
+};
diff --git a/packages/config-eslint/next.js b/packages/config-eslint/next.js
new file mode 100644
index 0000000000..4a025e925f
--- /dev/null
+++ b/packages/config-eslint/next.js
@@ -0,0 +1,45 @@
+const { resolve } = require("node:path");
+
+const project = resolve(process.cwd(), "tsconfig.json");
+
+/*
+ * This is a custom ESLint configuration for use with
+ * Next.js apps.
+ *
+ * This config extends the Vercel Engineering Style Guide.
+ * For more information, see https://github.com/vercel/style-guide
+ *
+ */
+
+module.exports = {
+ extends: [
+ "@vercel/style-guide/eslint/node",
+ "@vercel/style-guide/eslint/typescript",
+ "@vercel/style-guide/eslint/browser",
+ "@vercel/style-guide/eslint/react",
+ "@vercel/style-guide/eslint/next",
+ "eslint-config-turbo",
+ ].map(require.resolve),
+ parserOptions: {
+ project,
+ },
+ globals: {
+ React: true,
+ JSX: true,
+ },
+ settings: {
+ "import/resolver": {
+ typescript: {
+ project,
+ },
+ node: {
+ extensions: [".mjs", ".js", ".jsx", ".ts", ".tsx"],
+ },
+ },
+ },
+ ignorePatterns: ["node_modules/", "dist/"],
+ // add rules configurations here
+ rules: {
+ "import/no-default-export": "off",
+ },
+};
diff --git a/packages/config-eslint/package.json b/packages/config-eslint/package.json
new file mode 100644
index 0000000000..ae2253d8e8
--- /dev/null
+++ b/packages/config-eslint/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@formbricks/eslint-config",
+ "version": "0.0.0",
+ "private": true,
+ "devDependencies": {
+ "@next/eslint-plugin-next": "^14.2.3",
+ "@typescript-eslint/eslint-plugin": "^7.10.0",
+ "@typescript-eslint/parser": "^7.10.0",
+ "@vercel/style-guide": "^5.2.0",
+ "eslint-config-next": "^14.2.3",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-config-turbo": "^2.0.0",
+ "eslint-plugin-react": "7.34.1",
+ "eslint-plugin-react-hooks": "^4.6.2",
+ "eslint-plugin-react-refresh": "^0.4.7"
+ }
+}
diff --git a/packages/config-eslint/react.js b/packages/config-eslint/react.js
new file mode 100644
index 0000000000..c5585c6b06
--- /dev/null
+++ b/packages/config-eslint/react.js
@@ -0,0 +1,49 @@
+const { resolve } = require("node:path");
+
+const project = resolve(process.cwd(), "tsconfig.json");
+
+/*
+ * This is a custom ESLint configuration for use a library
+ * that utilizes React.
+ *
+ * This config extends the Vercel Engineering Style Guide.
+ * For more information, see https://github.com/vercel/style-guide
+ *
+ */
+
+module.exports = {
+ extends: [
+ "@vercel/style-guide/eslint/browser",
+ "@vercel/style-guide/eslint/typescript",
+ "@vercel/style-guide/eslint/react",
+ ].map(require.resolve),
+ parserOptions: {
+ project,
+ },
+ globals: {
+ JSX: true,
+ },
+ settings: {
+ "import/resolver": {
+ typescript: {
+ project,
+ },
+ node: {
+ extensions: [".mjs", ".js", ".jsx", ".ts", ".tsx"],
+ },
+ },
+ },
+ ignorePatterns: ["node_modules/", "dist/", ".eslintrc.js", "**/*.css"],
+ // add rules configurations here
+ rules: {
+ "import/no-default-export": "off",
+ },
+ overrides: [
+ {
+ files: ["*.config.js"],
+ env: {
+ node: true,
+ },
+ },
+ ],
+};
diff --git a/packages/prettier-config/package.json b/packages/config-prettier/package.json
similarity index 87%
rename from packages/prettier-config/package.json
rename to packages/config-prettier/package.json
index 7d0bb43b2c..a88e74e2af 100644
--- a/packages/prettier-config/package.json
+++ b/packages/config-prettier/package.json
@@ -1,5 +1,5 @@
{
- "name": "@formbricks/prettier-config",
+ "name": "@formbricks/config-prettier",
"version": "1.0.0",
"private": true,
"license": "MIT",
diff --git a/packages/prettier-config/prettier-preset.js b/packages/config-prettier/prettier-preset.js
similarity index 100%
rename from packages/prettier-config/prettier-preset.js
rename to packages/config-prettier/prettier-preset.js
diff --git a/packages/tailwind-config/package.json b/packages/config-tailwind/package.json
similarity index 88%
rename from packages/tailwind-config/package.json
rename to packages/config-tailwind/package.json
index 8ab8dac2c3..7afb875df9 100644
--- a/packages/tailwind-config/package.json
+++ b/packages/config-tailwind/package.json
@@ -1,5 +1,5 @@
{
- "name": "@formbricks/tailwind-config",
+ "name": "@formbricks/config-tailwind",
"version": "0.0.0",
"private": true,
"main": "index.js",
diff --git a/packages/tailwind-config/tailwind.config.js b/packages/config-tailwind/tailwind.config.js
similarity index 94%
rename from packages/tailwind-config/tailwind.config.js
rename to packages/config-tailwind/tailwind.config.js
index 68f8a3663d..e5e402cfca 100644
--- a/packages/tailwind-config/tailwind.config.js
+++ b/packages/config-tailwind/tailwind.config.js
@@ -35,25 +35,22 @@ module.exports = {
dark: "#00C4B8",
},
focus: "var(--formbricks-focus, #1982fc)",
- error: "var(--formbricks-error, #d13a3a)",
+ error: "rgb(from var(--formbricks-error) r g b / )",
brandnew: "var(--formbricks-brand, #038178)",
borderColor: {
primary: "var(--formbricks-border-primary, #e0e0e0)",
secondary: "var(--formbricks-border-secondary, #0f172a)",
disabled: "var(--formbricks-border-disabled, #ececec)",
- error: "var(--formbricks-error, #d13a3a)",
},
labelColor: {
primary: "var(--formbricks-label-primary, #0f172a)",
secondary: "var(--formbricks-label-secondary, #384258)",
disabled: "var(--formbricks-label-disabled, #bdbdbd)",
- error: "var(--formbricks-error, #d13a3a)",
},
fill: {
primary: "var(--formbricks-fill-primary, #fefefe)",
secondary: "var(--formbricks-fill-secondary, #0f172a)",
disabled: "var(--formbricks-fill-disabled, #e0e0e0)",
- error: "var(--formbricks-error, #d13a3a)",
},
},
keyframes: {
diff --git a/packages/tsconfig/base.json b/packages/config-typescript/base.json
similarity index 100%
rename from packages/tsconfig/base.json
rename to packages/config-typescript/base.json
diff --git a/packages/tsconfig/js-library.json b/packages/config-typescript/js-library.json
similarity index 70%
rename from packages/tsconfig/js-library.json
rename to packages/config-typescript/js-library.json
index 1b478da36c..61e59489d2 100644
--- a/packages/tsconfig/js-library.json
+++ b/packages/config-typescript/js-library.json
@@ -5,10 +5,10 @@
"compilerOptions": {
"outDir": "./dist",
"declaration": true,
- "moduleResolution": "Bundler",
- "lib": ["ESNext", "DOM"],
- "module": "esnext",
- "target": "ES2021",
+ "moduleResolution": "node",
+ "lib": ["es2022", "dom", "dom.iterable"],
+ "module": "ESNext",
+ "target": "ES2022",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
diff --git a/packages/tsconfig/nextjs.json b/packages/config-typescript/nextjs.json
similarity index 100%
rename from packages/tsconfig/nextjs.json
rename to packages/config-typescript/nextjs.json
diff --git a/packages/tsconfig/node16.json b/packages/config-typescript/node16.json
similarity index 100%
rename from packages/tsconfig/node16.json
rename to packages/config-typescript/node16.json
diff --git a/packages/tsconfig/package.json b/packages/config-typescript/package.json
similarity index 86%
rename from packages/tsconfig/package.json
rename to packages/config-typescript/package.json
index ab2e9fcca8..538222532e 100644
--- a/packages/tsconfig/package.json
+++ b/packages/config-typescript/package.json
@@ -1,5 +1,5 @@
{
- "name": "@formbricks/tsconfig",
+ "name": "@formbricks/config-typescript",
"version": "1.0.0",
"private": true,
"sideEffects": false,
diff --git a/packages/tsconfig/react-library.json b/packages/config-typescript/react-library.json
similarity index 100%
rename from packages/tsconfig/react-library.json
rename to packages/config-typescript/react-library.json
diff --git a/packages/database/.eslintrc.js b/packages/database/.eslintrc.js
index bcf4aad3a3..64a6e29852 100644
--- a/packages/database/.eslintrc.js
+++ b/packages/database/.eslintrc.js
@@ -1,4 +1,3 @@
module.exports = {
- root: true,
- extends: ["formbricks"],
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
};
diff --git a/packages/database/migrations/20240603130103_display_percentage_to_decimal/migration.sql b/packages/database/migrations/20240603130103_display_percentage_to_decimal/migration.sql
new file mode 100644
index 0000000000..4a693e7339
--- /dev/null
+++ b/packages/database/migrations/20240603130103_display_percentage_to_decimal/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE "Survey" ALTER COLUMN "displayPercentage" SET DATA TYPE DECIMAL(65,30);
diff --git a/packages/database/migrations/20240605104525_added_display_some_and_recontact_sessions/migration.sql b/packages/database/migrations/20240605104525_added_display_some_and_recontact_sessions/migration.sql
new file mode 100644
index 0000000000..5532947ac6
--- /dev/null
+++ b/packages/database/migrations/20240605104525_added_display_some_and_recontact_sessions/migration.sql
@@ -0,0 +1,5 @@
+-- AlterEnum
+ALTER TYPE "displayOptions" ADD VALUE 'displaySome';
+
+-- AlterTable
+ALTER TABLE "Survey" ADD COLUMN "displayLimit" INTEGER;
diff --git a/packages/database/package.json b/packages/database/package.json
index 39bd041370..4f1036158e 100644
--- a/packages/database/package.json
+++ b/packages/database/package.json
@@ -41,10 +41,10 @@
"dotenv-cli": "^7.4.2"
},
"devDependencies": {
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@formbricks/types": "workspace:*",
"@paralleldrive/cuid2": "^2.2.2",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
"prisma": "^5.14.0",
"prisma-dbml-generator": "^0.12.0",
"prisma-json-types-generator": "^3.0.4",
diff --git a/packages/database/schema.prisma b/packages/database/schema.prisma
index 6347d987da..49c6baab4d 100644
--- a/packages/database/schema.prisma
+++ b/packages/database/schema.prisma
@@ -248,6 +248,7 @@ enum SurveyType {
enum displayOptions {
displayOnce
displayMultiple
+ displaySome
respondMultiple
}
@@ -278,6 +279,7 @@ model Survey {
responses Response[]
displayOption displayOptions @default(displayOnce)
recontactDays Int?
+ displayLimit Int?
triggers SurveyTrigger[]
/// @zod.custom(imports.ZSurveyInlineTriggers)
/// [SurveyInlineTriggers]
@@ -312,7 +314,7 @@ model Survey {
verifyEmail Json?
pin String?
resultShareKey String? @unique
- displayPercentage Int?
+ displayPercentage Decimal?
languages SurveyLanguage[]
@@index([environmentId, updatedAt])
diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json
index eb408c5485..5a99f96816 100644
--- a/packages/database/tsconfig.json
+++ b/packages/database/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/node16.json",
+ "extends": "@formbricks/config-typescript/node16.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "tsup.config.ts"],
"exclude": ["node_modules", "dist", "zod"]
}
diff --git a/packages/ee/.eslintrc.js b/packages/ee/.eslintrc.js
new file mode 100644
index 0000000000..64a6e29852
--- /dev/null
+++ b/packages/ee/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
+};
diff --git a/packages/ee/lib/service.ts b/packages/ee/lib/service.ts
index c1e358cda1..dc105a43ac 100644
--- a/packages/ee/lib/service.ts
+++ b/packages/ee/lib/service.ts
@@ -1,5 +1,7 @@
import "server-only";
+import axios from "axios";
+
import { cache, revalidateTag } from "@formbricks/lib/cache";
import { E2E_TESTING, ENTERPRISE_LICENSE_KEY, IS_FORMBRICKS_CLOUD } from "@formbricks/lib/constants";
import { hashString } from "@formbricks/lib/hashString";
@@ -82,17 +84,13 @@ export const getIsEnterpriseEdition = async (): Promise => {
},
});
- const res = await fetch("https://ee.formbricks.com/api/licenses/check", {
- body: JSON.stringify({
- licenseKey: ENTERPRISE_LICENSE_KEY,
- usage: { responseCount: responseCount },
- }),
- headers: { "Content-Type": "application/json" },
- method: "POST",
+ const response = await axios.post("https://ee.formbricks.com/api/licenses/check", {
+ licenseKey: process.env.ENTERPRISE_LICENSE_KEY,
+ usage: { responseCount: responseCount },
});
- if (res.ok) {
- const responseJson = await res.json();
+ if (response.status === 200) {
+ const responseJson = response.data;
return responseJson.data.status === "active";
}
diff --git a/packages/ee/package.json b/packages/ee/package.json
index eeebf118b2..b11fe619aa 100644
--- a/packages/ee/package.json
+++ b/packages/ee/package.json
@@ -11,13 +11,14 @@
},
"devDependencies": {
"@formbricks/lib": "*",
- "@formbricks/tsconfig": "*",
+ "@formbricks/config-typescript": "*",
"@formbricks/types": "*",
"@formbricks/ui": "*",
- "eslint-config-formbricks": "workspace:*"
+ "@formbricks/eslint-config": "workspace:*"
},
"dependencies": {
"@formbricks/lib": "workspace:*",
+ "axios": "^1.7.2",
"stripe": "^15.8.0"
}
}
diff --git a/packages/ee/tsconfig.json b/packages/ee/tsconfig.json
index 58909315d9..98f957b9d2 100644
--- a/packages/ee/tsconfig.json
+++ b/packages/ee/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/react-library.json",
+ "extends": "@formbricks/config-typescript/react-library.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
diff --git a/packages/email/.eslintrc.js b/packages/email/.eslintrc.js
new file mode 100644
index 0000000000..64a6e29852
--- /dev/null
+++ b/packages/email/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
+};
diff --git a/packages/email/index.tsx b/packages/email/index.tsx
index 11e9487308..76ea7f1828 100644
--- a/packages/email/index.tsx
+++ b/packages/email/index.tsx
@@ -30,8 +30,7 @@ import { ResponseFinishedEmail } from "./components/survey/ResponseFinishedEmail
import { NoLiveSurveyNotificationEmail } from "./components/weekly-summary/NoLiveSurveyNotificationEmail";
import { WeeklySummaryNotificationEmail } from "./components/weekly-summary/WeeklySummaryNotificationEmail";
-export const IS_SMTP_CONFIGURED: boolean =
- SMTP_HOST && SMTP_PORT && SMTP_USER && SMTP_PASSWORD ? true : false;
+export const IS_SMTP_CONFIGURED: boolean = SMTP_HOST && SMTP_PORT ? true : false;
interface sendEmailData {
to: string;
diff --git a/packages/eslint-config-formbricks/package.json b/packages/eslint-config-formbricks/package.json
deleted file mode 100644
index 0082c4966a..0000000000
--- a/packages/eslint-config-formbricks/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "eslint-config-formbricks",
- "version": "1.0.0",
- "private": true,
- "main": "index.js",
- "license": "MIT",
- "scripts": {
- "clean": "rimraf node_modules .turbo"
- },
- "devDependencies": {
- "@typescript-eslint/eslint-plugin": "^7.10.0",
- "@typescript-eslint/parser": "^7.10.0",
- "eslint": "^8.57.0",
- "eslint-config-next": "^14.2.3",
- "eslint-config-prettier": "^9.1.0",
- "eslint-config-turbo": "1.10.12",
- "eslint-plugin-react": "7.34.1",
- "eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.7",
- "eslint-plugin-storybook": "^0.8.0"
- }
-}
diff --git a/packages/js-core/.eslintrc.cjs b/packages/js-core/.eslintrc.cjs
index 80997af8c2..ed6059c25b 100644
--- a/packages/js-core/.eslintrc.cjs
+++ b/packages/js-core/.eslintrc.cjs
@@ -1,3 +1,4 @@
module.exports = {
- extends: ["turbo", "prettier"],
+ extends: ["@formbricks/eslint-config/legacy-library.js"],
+ parser: "@typescript-eslint/parser",
};
diff --git a/packages/js-core/package.json b/packages/js-core/package.json
index cd6a316684..3d92923558 100644
--- a/packages/js-core/package.json
+++ b/packages/js-core/package.json
@@ -29,6 +29,17 @@
"import": "./dist/website.js",
"require": "./dist/website.umd.cjs",
"types": "./dist/website.d.ts"
+ },
+ "./*": "./dist/*"
+ },
+ "typesVersions": {
+ "*": {
+ "app": [
+ "./dist/app.d.ts"
+ ],
+ "website": [
+ "./dist/website.d.ts"
+ ]
}
},
"scripts": {
@@ -38,16 +49,16 @@
"build": "pnpm build:app && pnpm build:website",
"build:dev": "tsc && vite build --mode dev",
"go": "vite build --watch --mode dev",
- "lint": "eslint ./src --fix",
+ "lint": "eslint . --ext .ts,.js,.tsx,.jsx",
"clean": "rimraf .turbo node_modules dist coverage"
},
"author": "Formbricks ",
"devDependencies": {
"@formbricks/api": "workspace:*",
"@formbricks/lib": "workspace:*",
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@formbricks/types": "workspace:*",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
"terser": "^5.31.0",
"vite": "^5.2.11",
"vite-plugin-dts": "^3.9.1"
diff --git a/packages/js-core/src/app/lib/widget.ts b/packages/js-core/src/app/lib/widget.ts
index ae05160f8e..d686f4424c 100644
--- a/packages/js-core/src/app/lib/widget.ts
+++ b/packages/js-core/src/app/lib/widget.ts
@@ -27,7 +27,7 @@ export const setIsSurveyRunning = (value: boolean) => {
};
const shouldDisplayBasedOnPercentage = (displayPercentage: number) => {
- const randomNum = Math.floor(Math.random() * 100) + 1;
+ const randomNum = Math.floor(Math.random() * 10000) / 100;
return randomNum <= displayPercentage;
};
diff --git a/packages/js-core/src/website/lib/sync.ts b/packages/js-core/src/website/lib/sync.ts
index 85b490efac..213f975b52 100644
--- a/packages/js-core/src/website/lib/sync.ts
+++ b/packages/js-core/src/website/lib/sync.ts
@@ -98,16 +98,36 @@ export const filterPublicSurveys = (state: TJsWebsiteState): TJsWebsiteState =>
return state;
}
- // filter surveys that meet the displayOption criteria
- let filteredSurveys = surveys.filter((survey) => {
- if (survey.displayOption === "respondMultiple") {
- return true;
- } else if (survey.displayOption === "displayOnce") {
- return displays.filter((display) => display.surveyId === survey.id).length === 0;
- } else if (survey.displayOption === "displayMultiple") {
- return displays.filter((display) => display.surveyId === survey.id && display.responded).length === 0;
- } else {
- throw Error("Invalid displayOption");
+ // Function to filter surveys based on displayOption criteria
+ let filteredSurveys = surveys.filter((survey: TSurvey) => {
+ switch (survey.displayOption) {
+ case "respondMultiple":
+ return true;
+ case "displayOnce":
+ return displays.filter((display) => display.surveyId === survey.id).length === 0;
+ case "displayMultiple":
+ return (
+ displays.filter((display) => display.surveyId === survey.id).filter((display) => display.responded)
+ .length === 0
+ );
+
+ case "displaySome":
+ if (survey.displayLimit === null) {
+ return true;
+ }
+
+ // Check if any display has responded, if so, stop here
+ if (
+ displays.filter((display) => display.surveyId === survey.id).some((display) => display.responded)
+ ) {
+ return false;
+ }
+
+ // Otherwise, check if displays length is less than displayLimit
+ return displays.filter((display) => display.surveyId === survey.id).length < survey.displayLimit;
+
+ default:
+ throw Error("Invalid displayOption");
}
});
diff --git a/packages/js-core/src/website/lib/widget.ts b/packages/js-core/src/website/lib/widget.ts
index f92c63b4c4..c78f6b41ee 100644
--- a/packages/js-core/src/website/lib/widget.ts
+++ b/packages/js-core/src/website/lib/widget.ts
@@ -25,7 +25,7 @@ export const setIsSurveyRunning = (value: boolean) => {
};
const shouldDisplayBasedOnPercentage = (displayPercentage: number) => {
- const randomNum = Math.floor(Math.random() * 100) + 1;
+ const randomNum = Math.floor(Math.random() * 10000) / 100;
return randomNum <= displayPercentage;
};
diff --git a/packages/js-core/tsconfig.json b/packages/js-core/tsconfig.json
index 5579512245..3147c2971c 100644
--- a/packages/js-core/tsconfig.json
+++ b/packages/js-core/tsconfig.json
@@ -1,10 +1,8 @@
{
- "extends": "@formbricks/tsconfig/js-library.json",
+ "extends": "@formbricks/config-typescript/js-library.json",
"include": ["src", "package.json", "../types/surveys.d.ts"],
"compilerOptions": {
"strict": true,
- "module": "ESNext",
- "moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
diff --git a/packages/js-core/website.vite.config.ts.timestamp-1715613168360-369b1d363be3d.mjs b/packages/js-core/website.vite.config.ts.timestamp-1715613168360-369b1d363be3d.mjs
index 6b094817f5..14a2bd9ebf 100644
--- a/packages/js-core/website.vite.config.ts.timestamp-1715613168360-369b1d363be3d.mjs
+++ b/packages/js-core/website.vite.config.ts.timestamp-1715613168360-369b1d363be3d.mjs
@@ -1,7 +1,7 @@
// website.vite.config.ts
-import { resolve } from "path";
-import { defineConfig } from "file:///Users/piyush/Desktop/code/formbricks/formbricks/node_modules/vite/dist/node/index.js";
import dts from "file:///Users/piyush/Desktop/code/formbricks/formbricks/node_modules/vite-plugin-dts/dist/index.mjs";
+import { defineConfig } from "file:///Users/piyush/Desktop/code/formbricks/formbricks/node_modules/vite/dist/node/index.js";
+import { resolve } from "path";
// ../../apps/web/package.json
var package_default = {
@@ -15,7 +15,7 @@ var package_default = {
build: "next build",
"build:dev": "next build",
start: "next start",
- lint: "next lint"
+ lint: "next lint",
},
dependencies: {
"@formbricks/api": "workspace:*",
@@ -25,7 +25,7 @@ var package_default = {
"@formbricks/js-core": "workspace:*",
"@formbricks/lib": "workspace:*",
"@formbricks/surveys": "workspace:*",
- "@formbricks/tailwind-config": "workspace:*",
+ "@formbricks/config-tailwind": "workspace:*",
"@formbricks/types": "workspace:*",
"@formbricks/ui": "workspace:*",
"@formbricks/email": "workspace:*",
@@ -69,18 +69,18 @@ var package_default = {
sharp: "^0.33.3",
"ua-parser-js": "^1.0.37",
webpack: "^5.91.0",
- xlsx: "^0.18.5"
+ xlsx: "^0.18.5",
},
devDependencies: {
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@neshca/cache-handler": "^1.3.1",
"@types/bcryptjs": "^2.4.6",
"@types/lodash": "^4.17.1",
"@types/markdown-it": "^14.1.1",
"@types/papaparse": "^5.3.14",
"@types/qrcode": "^1.5.5",
- "eslint-config-formbricks": "workspace:*"
- }
+ "@formbricks/eslint-config": "workspace:*",
+ },
};
// website.vite.config.ts
@@ -88,11 +88,11 @@ var __vite_injected_original_dirname = "/Users/piyush/Desktop/code/formbricks/fo
var config = () => {
return defineConfig({
define: {
- "import.meta.env.VERSION": JSON.stringify(package_default.version)
+ "import.meta.env.VERSION": JSON.stringify(package_default.version),
},
build: {
rollupOptions: {
- output: { inlineDynamicImports: true }
+ output: { inlineDynamicImports: true },
},
emptyOutDir: false,
// keep the dist folder to avoid errors with pnpm go when folder is empty during build
@@ -102,18 +102,16 @@ var config = () => {
entry: resolve(__vite_injected_original_dirname, "src/website/index.ts"),
name: "formbricks",
formats: ["umd"],
- fileName: "website"
- }
+ fileName: "website",
+ },
},
plugins: [
dts({
rollupTypes: true,
- bundledPackages: ["@formbricks/api", "@formbricks/types"]
- })
- ]
+ bundledPackages: ["@formbricks/api", "@formbricks/types"],
+ }),
+ ],
});
};
-export {
- config
-};
+export { config };
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsid2Vic2l0ZS52aXRlLmNvbmZpZy50cyIsICIuLi8uLi9hcHBzL3dlYi9wYWNrYWdlLmpzb24iXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvcGl5dXNoL0Rlc2t0b3AvY29kZS9mb3JtYnJpY2tzL2Zvcm1icmlja3MvcGFja2FnZXMvanMtY29yZVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BpeXVzaC9EZXNrdG9wL2NvZGUvZm9ybWJyaWNrcy9mb3JtYnJpY2tzL3BhY2thZ2VzL2pzLWNvcmUvd2Vic2l0ZS52aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vVXNlcnMvcGl5dXNoL0Rlc2t0b3AvY29kZS9mb3JtYnJpY2tzL2Zvcm1icmlja3MvcGFja2FnZXMvanMtY29yZS93ZWJzaXRlLnZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IGR0cyBmcm9tIFwidml0ZS1wbHVnaW4tZHRzXCI7XG5cbmltcG9ydCB3ZWJQYWNrYWdlSnNvbiBmcm9tIFwiLi4vLi4vYXBwcy93ZWIvcGFja2FnZS5qc29uXCI7XG5cbmV4cG9ydCBjb25zdCBjb25maWcgPSAoKSA9PiB7XG4gIHJldHVybiBkZWZpbmVDb25maWcoe1xuICAgIGRlZmluZToge1xuICAgICAgXCJpbXBvcnQubWV0YS5lbnYuVkVSU0lPTlwiOiBKU09OLnN0cmluZ2lmeSh3ZWJQYWNrYWdlSnNvbi52ZXJzaW9uKSxcbiAgICB9LFxuICAgIGJ1aWxkOiB7XG4gICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgIG91dHB1dDogeyBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIGVtcHR5T3V0RGlyOiBmYWxzZSwgLy8ga2VlcCB0aGUgZGlzdCBmb2xkZXIgdG8gYXZvaWQgZXJyb3JzIHdpdGggcG5wbSBnbyB3aGVuIGZvbGRlciBpcyBlbXB0eSBkdXJpbmcgYnVpbGRcbiAgICAgIG1pbmlmeTogXCJ0ZXJzZXJcIixcbiAgICAgIHNvdXJjZW1hcDogdHJ1ZSxcbiAgICAgIGxpYjoge1xuICAgICAgICBlbnRyeTogcmVzb2x2ZShfX2Rpcm5hbWUsIFwic3JjL3dlYnNpdGUvaW5kZXgudHNcIiksXG4gICAgICAgIG5hbWU6IFwiZm9ybWJyaWNrc1wiLFxuICAgICAgICBmb3JtYXRzOiBbXCJ1bWRcIl0sXG4gICAgICAgIGZpbGVOYW1lOiBcIndlYnNpdGVcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBkdHMoe1xuICAgICAgICByb2xsdXBUeXBlczogdHJ1ZSxcbiAgICAgICAgYnVuZGxlZFBhY2thZ2VzOiBbXCJAZm9ybWJyaWNrcy9hcGlcIiwgXCJAZm9ybWJyaWNrcy90eXBlc1wiXSxcbiAgICAgIH0pLFxuICAgIF0sXG4gIH0pO1xufTtcbiIsICJ7XG4gIFwibmFtZVwiOiBcIkBmb3JtYnJpY2tzL3dlYlwiLFxuICBcInZlcnNpb25cIjogXCIyLjAuMFwiLFxuICBcInByaXZhdGVcIjogdHJ1ZSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNsZWFuXCI6IFwicmltcmFmIC50dXJibyBub2RlX21vZHVsZXMgLm5leHRcIixcbiAgICBcImRldlwiOiBcIm5leHQgZGV2IC1wIDMwMDBcIixcbiAgICBcImdvXCI6IFwibmV4dCBkZXYgLXAgMzAwMFwiLFxuICAgIFwiYnVpbGRcIjogXCJuZXh0IGJ1aWxkXCIsXG4gICAgXCJidWlsZDpkZXZcIjogXCJuZXh0IGJ1aWxkXCIsXG4gICAgXCJzdGFydFwiOiBcIm5leHQgc3RhcnRcIixcbiAgICBcImxpbnRcIjogXCJuZXh0IGxpbnRcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAZm9ybWJyaWNrcy9hcGlcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3MvZGF0YWJhc2VcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3MvZWVcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3MvanNcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3MvanMtY29yZVwiOiBcIndvcmtzcGFjZToqXCIsXG4gICAgXCJAZm9ybWJyaWNrcy9saWJcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3Mvc3VydmV5c1wiOiBcIndvcmtzcGFjZToqXCIsXG4gICAgXCJAZm9ybWJyaWNrcy90YWlsd2luZC1jb25maWdcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3MvdHlwZXNcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3MvdWlcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGZvcm1icmlja3MvZW1haWxcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQGhlYWRsZXNzdWkvcmVhY3RcIjogXCJeMi4wLjNcIixcbiAgICBcIkBqc29uMmNzdi9ub2RlXCI6IFwiXjcuMC42XCIsXG4gICAgXCJAb3BlbnRlbGVtZXRyeS9hdXRvLWluc3RydW1lbnRhdGlvbnMtbm9kZVwiOiBcIl4wLjQ2LjBcIixcbiAgICBcIkBvcGVudGVsZW1ldHJ5L2V4cG9ydGVyLXRyYWNlLW90bHAtaHR0cFwiOiBcIl4wLjUxLjFcIixcbiAgICBcIkBvcGVudGVsZW1ldHJ5L3Jlc291cmNlc1wiOiBcIl4xLjI0LjFcIixcbiAgICBcIkBvcGVudGVsZW1ldHJ5L3Nkay1ub2RlXCI6IFwiXjAuNTEuMVwiLFxuICAgIFwiQG9wZW50ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnNcIjogXCJeMS4yNC4xXCIsXG4gICAgXCJAcGFyYWxsZWxkcml2ZS9jdWlkMlwiOiBcIl4yLjIuMlwiLFxuICAgIFwiQHJhZGl4LXVpL3JlYWN0LWNvbGxhcHNpYmxlXCI6IFwiXjEuMC4zXCIsXG4gICAgXCJAcmVhY3QtZW1haWwvY29tcG9uZW50c1wiOiBcIl4wLjAuMTdcIixcbiAgICBcIkBzZW50cnkvbmV4dGpzXCI6IFwiXjcuMTEzLjBcIixcbiAgICBcIkB2ZXJjZWwvb2dcIjogXCJeMC42LjJcIixcbiAgICBcIkB2ZXJjZWwvc3BlZWQtaW5zaWdodHNcIjogXCJeMS4wLjEwXCIsXG4gICAgXCJiY3J5cHRqc1wiOiBcIl4yLjQuM1wiLFxuICAgIFwiZG90ZW52XCI6IFwiXjE2LjQuNVwiLFxuICAgIFwiZW5jb2RpbmdcIjogXCJeMC4xLjEzXCIsXG4gICAgXCJmcmFtZXItbW90aW9uXCI6IFwiMTEuMS45XCIsXG4gICAgXCJnb29nbGVhcGlzXCI6IFwiXjEzNy4xLjBcIixcbiAgICBcImppdGlcIjogXCJeMS4yMS4wXCIsXG4gICAgXCJqc29ud2VidG9rZW5cIjogXCJeOS4wLjJcIixcbiAgICBcImxvZGFzaFwiOiBcIl40LjE3LjIxXCIsXG4gICAgXCJscnUtY2FjaGVcIjogXCJeMTAuMi4yXCIsXG4gICAgXCJsdWNpZGUtcmVhY3RcIjogXCJeMC4zNzguMFwiLFxuICAgIFwibWltZVwiOiBcIl40LjAuM1wiLFxuICAgIFwibmV4dFwiOiBcIjE0LjIuM1wiLFxuICAgIFwibm9kZW1haWxlclwiOiBcIl42LjkuMTNcIixcbiAgICBcIm90cGxpYlwiOiBcIl4xMi4wLjFcIixcbiAgICBcInBhcGFwYXJzZVwiOiBcIl41LjQuMVwiLFxuICAgIFwicG9zdGhvZy1qc1wiOiBcIl4xLjEzMS4wXCIsXG4gICAgXCJwcmlzbWpzXCI6IFwiXjEuMjkuMFwiLFxuICAgIFwicXJjb2RlXCI6IFwiXjEuNS4zXCIsXG4gICAgXCJyZWFjdFwiOiBcIjE4LjMuMVwiLFxuICAgIFwicmVhY3QtYmVhdXRpZnVsLWRuZFwiOiBcIl4xMy4xLjFcIixcbiAgICBcInJlYWN0LWRvbVwiOiBcIjE4LjMuMVwiLFxuICAgIFwicmVhY3QtaG9vay1mb3JtXCI6IFwiXjcuNTEuNFwiLFxuICAgIFwicmVhY3QtaG90LXRvYXN0XCI6IFwiXjIuNC4xXCIsXG4gICAgXCJyZWRpc1wiOiBcIl40LjYuMTNcIixcbiAgICBcInNoYXJwXCI6IFwiXjAuMzMuM1wiLFxuICAgIFwidWEtcGFyc2VyLWpzXCI6IFwiXjEuMC4zN1wiLFxuICAgIFwid2VicGFja1wiOiBcIl41LjkxLjBcIixcbiAgICBcInhsc3hcIjogXCJeMC4xOC41XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGZvcm1icmlja3MvdHNjb25maWdcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQG5lc2hjYS9jYWNoZS1oYW5kbGVyXCI6IFwiXjEuMy4xXCIsXG4gICAgXCJAdHlwZXMvYmNyeXB0anNcIjogXCJeMi40LjZcIixcbiAgICBcIkB0eXBlcy9sb2Rhc2hcIjogXCJeNC4xNy4xXCIsXG4gICAgXCJAdHlwZXMvbWFya2Rvd24taXRcIjogXCJeMTQuMS4xXCIsXG4gICAgXCJAdHlwZXMvcGFwYXBhcnNlXCI6IFwiXjUuMy4xNFwiLFxuICAgIFwiQHR5cGVzL3FyY29kZVwiOiBcIl4xLjUuNVwiLFxuICAgIFwiZXNsaW50LWNvbmZpZy1mb3JtYnJpY2tzXCI6IFwid29ya3NwYWNlOipcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXFZLFNBQVMsZUFBZTtBQUM3WixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFNBQVM7OztBQ0ZoQjtBQUFBLEVBQ0UsTUFBUTtBQUFBLEVBQ1IsU0FBVztBQUFBLEVBQ1gsU0FBVztBQUFBLEVBQ1gsU0FBVztBQUFBLElBQ1QsT0FBUztBQUFBLElBQ1QsS0FBTztBQUFBLElBQ1AsSUFBTTtBQUFBLElBQ04sT0FBUztBQUFBLElBQ1QsYUFBYTtBQUFBLElBQ2IsT0FBUztBQUFBLElBQ1QsTUFBUTtBQUFBLEVBQ1Y7QUFBQSxFQUNBLGNBQWdCO0FBQUEsSUFDZCxtQkFBbUI7QUFBQSxJQUNuQix3QkFBd0I7QUFBQSxJQUN4QixrQkFBa0I7QUFBQSxJQUNsQixrQkFBa0I7QUFBQSxJQUNsQix1QkFBdUI7QUFBQSxJQUN2QixtQkFBbUI7QUFBQSxJQUNuQix1QkFBdUI7QUFBQSxJQUN2QiwrQkFBK0I7QUFBQSxJQUMvQixxQkFBcUI7QUFBQSxJQUNyQixrQkFBa0I7QUFBQSxJQUNsQixxQkFBcUI7QUFBQSxJQUNyQixxQkFBcUI7QUFBQSxJQUNyQixrQkFBa0I7QUFBQSxJQUNsQiw2Q0FBNkM7QUFBQSxJQUM3QywyQ0FBMkM7QUFBQSxJQUMzQyw0QkFBNEI7QUFBQSxJQUM1QiwyQkFBMkI7QUFBQSxJQUMzQix1Q0FBdUM7QUFBQSxJQUN2Qyx3QkFBd0I7QUFBQSxJQUN4QiwrQkFBK0I7QUFBQSxJQUMvQiwyQkFBMkI7QUFBQSxJQUMzQixrQkFBa0I7QUFBQSxJQUNsQixjQUFjO0FBQUEsSUFDZCwwQkFBMEI7QUFBQSxJQUMxQixVQUFZO0FBQUEsSUFDWixRQUFVO0FBQUEsSUFDVixVQUFZO0FBQUEsSUFDWixpQkFBaUI7QUFBQSxJQUNqQixZQUFjO0FBQUEsSUFDZCxNQUFRO0FBQUEsSUFDUixjQUFnQjtBQUFBLElBQ2hCLFFBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxJQUNiLGdCQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxJQUNSLE1BQVE7QUFBQSxJQUNSLFlBQWM7QUFBQSxJQUNkLFFBQVU7QUFBQSxJQUNWLFdBQWE7QUFBQSxJQUNiLGNBQWM7QUFBQSxJQUNkLFNBQVc7QUFBQSxJQUNYLFFBQVU7QUFBQSxJQUNWLE9BQVM7QUFBQSxJQUNULHVCQUF1QjtBQUFBLElBQ3ZCLGFBQWE7QUFBQSxJQUNiLG1CQUFtQjtBQUFBLElBQ25CLG1CQUFtQjtBQUFBLElBQ25CLE9BQVM7QUFBQSxJQUNULE9BQVM7QUFBQSxJQUNULGdCQUFnQjtBQUFBLElBQ2hCLFNBQVc7QUFBQSxJQUNYLE1BQVE7QUFBQSxFQUNWO0FBQUEsRUFDQSxpQkFBbUI7QUFBQSxJQUNqQix3QkFBd0I7QUFBQSxJQUN4Qix5QkFBeUI7QUFBQSxJQUN6QixtQkFBbUI7QUFBQSxJQUNuQixpQkFBaUI7QUFBQSxJQUNqQixzQkFBc0I7QUFBQSxJQUN0QixvQkFBb0I7QUFBQSxJQUNwQixpQkFBaUI7QUFBQSxJQUNqQiw0QkFBNEI7QUFBQSxFQUM5QjtBQUNGOzs7QUQ3RUEsSUFBTSxtQ0FBbUM7QUFNbEMsSUFBTSxTQUFTLE1BQU07QUFDMUIsU0FBTyxhQUFhO0FBQUEsSUFDbEIsUUFBUTtBQUFBLE1BQ04sMkJBQTJCLEtBQUssVUFBVSxnQkFBZSxPQUFPO0FBQUEsSUFDbEU7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLGVBQWU7QUFBQSxRQUNiLFFBQVEsRUFBRSxzQkFBc0IsS0FBSztBQUFBLE1BQ3ZDO0FBQUEsTUFDQSxhQUFhO0FBQUE7QUFBQSxNQUNiLFFBQVE7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLEtBQUs7QUFBQSxRQUNILE9BQU8sUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxRQUNoRCxNQUFNO0FBQUEsUUFDTixTQUFTLENBQUMsS0FBSztBQUFBLFFBQ2YsVUFBVTtBQUFBLE1BQ1o7QUFBQSxJQUNGO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxJQUFJO0FBQUEsUUFDRixhQUFhO0FBQUEsUUFDYixpQkFBaUIsQ0FBQyxtQkFBbUIsbUJBQW1CO0FBQUEsTUFDMUQsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
diff --git a/packages/js/.eslintrc.cjs b/packages/js/.eslintrc.cjs
index 80997af8c2..ed6059c25b 100644
--- a/packages/js/.eslintrc.cjs
+++ b/packages/js/.eslintrc.cjs
@@ -1,3 +1,4 @@
module.exports = {
- extends: ["turbo", "prettier"],
+ extends: ["@formbricks/eslint-config/legacy-library.js"],
+ parser: "@typescript-eslint/parser",
};
diff --git a/packages/js/package.json b/packages/js/package.json
index 7b5766f614..b9441c9269 100644
--- a/packages/js/package.json
+++ b/packages/js/package.json
@@ -1,7 +1,7 @@
{
"name": "@formbricks/js",
"license": "MIT",
- "version": "2.0.1",
+ "version": "2.1.0",
"description": "Formbricks-js allows you to connect your app to Formbricks, display surveys and trigger events.",
"homepage": "https://formbricks.com",
"repository": {
@@ -28,6 +28,17 @@
"import": "./dist/website.js",
"require": "./dist/website.cjs",
"types": "./dist/website.d.ts"
+ },
+ "./*": "./dist/*"
+ },
+ "typesVersions": {
+ "*": {
+ "app": [
+ "./dist/app.d.ts"
+ ],
+ "website": [
+ "./dist/website.d.ts"
+ ]
}
},
"scripts": {
@@ -35,14 +46,14 @@
"build": "tsc && vite build",
"build:dev": "tsc && vite build --mode dev",
"go": "vite build --watch --mode dev",
- "lint": "eslint ./src --fix",
+ "lint": "eslint . --ext .ts,.js,.tsx,.jsx",
"clean": "rimraf .turbo node_modules dist coverage"
},
"author": "Formbricks ",
"devDependencies": {
"@formbricks/js-core": "workspace:*",
- "@formbricks/tsconfig": "workspace:*",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
"terser": "^5.31.0",
"vite": "^5.2.11",
"vite-plugin-dts": "^3.9.1"
diff --git a/packages/js/tsconfig.json b/packages/js/tsconfig.json
index 05e134760c..e0b6bf95a1 100644
--- a/packages/js/tsconfig.json
+++ b/packages/js/tsconfig.json
@@ -1,10 +1,8 @@
{
- "extends": "@formbricks/tsconfig/js-library.json",
+ "extends": "@formbricks/config-typescript/js-library.json",
"include": ["src", "package.json"],
"compilerOptions": {
"strict": true,
- "module": "ESNext",
- "moduleResolution": "Bundler",
"declaration": true,
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
diff --git a/packages/lib/.eslintrc.js b/packages/lib/.eslintrc.js
index bcf4aad3a3..64a6e29852 100644
--- a/packages/lib/.eslintrc.js
+++ b/packages/lib/.eslintrc.js
@@ -1,4 +1,3 @@
module.exports = {
- root: true,
- extends: ["formbricks"],
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
};
diff --git a/packages/lib/i18n/i18n.mock.ts b/packages/lib/i18n/i18n.mock.ts
index a0269c58e5..457b1725d3 100644
--- a/packages/lib/i18n/i18n.mock.ts
+++ b/packages/lib/i18n/i18n.mock.ts
@@ -287,6 +287,7 @@ export const mockSurvey: TSurvey = {
},
displayOption: "displayOnce",
recontactDays: null,
+ displayLimit: null,
autoClose: null,
runOnDate: null,
closeOnDate: null,
diff --git a/packages/lib/package.json b/packages/lib/package.json
index 3f76d8fd4b..c40bbc6fb0 100644
--- a/packages/lib/package.json
+++ b/packages/lib/package.json
@@ -36,12 +36,12 @@
"tailwind-merge": "^2.3.0"
},
"devDependencies": {
- "@formbricks/tsconfig": "*",
+ "@formbricks/config-typescript": "*",
"@types/jsonwebtoken": "^9.0.6",
"@types/mime-types": "^2.1.4",
"@types/ungap__structured-clone": "^1.2.0",
"dotenv": "^16.4.5",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
"ts-node": "^10.9.2",
"vitest": "^1.6.0",
"vitest-mock-extended": "^1.3.1"
diff --git a/packages/lib/response/service.ts b/packages/lib/response/service.ts
index 6086f9264f..5e25de8814 100644
--- a/packages/lib/response/service.ts
+++ b/packages/lib/response/service.ts
@@ -101,7 +101,7 @@ export const responseSelection = {
},
};
-export const getResponsesByPersonId = (personId: string, page?: number): Promise | null> =>
+export const getResponsesByPersonId = (personId: string, page?: number): Promise =>
cache(
async () => {
validateInputs([personId, ZId], [page, ZOptionalNumber]);
@@ -123,7 +123,7 @@ export const getResponsesByPersonId = (personId: string, page?: number): Promise
throw new ResourceNotFoundError("Response from PersonId", personId);
}
- let responses: Array = [];
+ let responses: TResponse[] = [];
await Promise.all(
responsePrisma.map(async (response) => {
diff --git a/packages/lib/styling/constants.ts b/packages/lib/styling/constants.ts
index 8bab6e8ef4..47c22e2443 100644
--- a/packages/lib/styling/constants.ts
+++ b/packages/lib/styling/constants.ts
@@ -113,6 +113,7 @@ export const PREVIEW_SURVEY = {
},
displayOption: "displayOnce",
recontactDays: null,
+ displayLimit: null,
autoClose: null,
runOnDate: null,
closeOnDate: null,
diff --git a/packages/lib/survey/service.ts b/packages/lib/survey/service.ts
index 20e45fb439..fc3ea76c17 100644
--- a/packages/lib/survey/service.ts
+++ b/packages/lib/survey/service.ts
@@ -60,6 +60,7 @@ export const selectSurvey = {
hiddenFields: true,
displayOption: true,
recontactDays: true,
+ displayLimit: true,
autoClose: true,
runOnDate: true,
closeOnDate: true,
@@ -499,6 +500,7 @@ export const updateSurvey = async (updatedSurvey: TSurvey): Promise =>
// @ts-expect-error
const modifiedSurvey: TSurvey = {
...prismaSurvey, // Properties from prismaSurvey
+ displayPercentage: Number(prismaSurvey.displayPercentage) || null,
segment: surveySegment,
};
@@ -851,17 +853,35 @@ export const getSyncSurveys = (
// filter surveys that meet the displayOption criteria
surveys = surveys.filter((survey) => {
- if (survey.displayOption === "respondMultiple") {
- return true;
- } else if (survey.displayOption === "displayOnce") {
- return displays.filter((display) => display.surveyId === survey.id).length === 0;
- } else if (survey.displayOption === "displayMultiple") {
- return (
- displays.filter((display) => display.surveyId === survey.id && display.responseId !== null)
- .length === 0
- );
- } else {
- throw Error("Invalid displayOption");
+ switch (survey.displayOption) {
+ case "respondMultiple":
+ return true;
+ case "displayOnce":
+ return displays.filter((display) => display.surveyId === survey.id).length === 0;
+ case "displayMultiple":
+ return (
+ displays
+ .filter((display) => display.surveyId === survey.id)
+ .filter((display) => display.responseId).length === 0
+ );
+ case "displaySome":
+ if (survey.displayLimit === null) {
+ return true;
+ }
+
+ if (
+ displays
+ .filter((display) => display.surveyId === survey.id)
+ .some((display) => display.responseId)
+ ) {
+ return false;
+ }
+
+ return (
+ displays.filter((display) => display.surveyId === survey.id).length < survey.displayLimit
+ );
+ default:
+ throw Error("Invalid displayOption");
}
});
diff --git a/packages/lib/survey/tests/__mock__/survey.mock.ts b/packages/lib/survey/tests/__mock__/survey.mock.ts
index ee3eb087eb..4b979b9945 100644
--- a/packages/lib/survey/tests/__mock__/survey.mock.ts
+++ b/packages/lib/survey/tests/__mock__/survey.mock.ts
@@ -66,6 +66,7 @@ export const mockProduct: TProduct = {
brandColor: "#000000",
highlightBorderColor: "#000000",
recontactDays: 0,
+ displayLimit: 0,
linkSurveyBranding: false,
inAppSurveyBranding: false,
placement: "bottomRight",
@@ -169,6 +170,7 @@ const baseSurveyProperties = {
closeOnDate: currentDate,
redirectUrl: "http://github.com/formbricks/formbricks",
recontactDays: 3,
+ displayLimit: 3,
welcomeCard: mockWelcomeCard,
questions: [mockQuestion],
thankYouCard: { enabled: false },
diff --git a/packages/lib/survey/utils.ts b/packages/lib/survey/utils.ts
index e924deb816..419c3d7a90 100644
--- a/packages/lib/survey/utils.ts
+++ b/packages/lib/survey/utils.ts
@@ -18,6 +18,7 @@ export const transformPrismaSurvey = (surveyPrisma: any): TSurvey => {
const transformedSurvey: TSurvey = {
...surveyPrisma,
+ displayPercentage: Number(surveyPrisma.displayPercentage) || null,
segment,
};
diff --git a/packages/lib/tsconfig.json b/packages/lib/tsconfig.json
index db0da1358a..440281cf4d 100644
--- a/packages/lib/tsconfig.json
+++ b/packages/lib/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/nextjs.json",
+ "extends": "@formbricks/config-typescript/nextjs.json",
"include": ["."],
"exclude": ["dist", "build", "node_modules", "../../packages/types/surveys.d.ts"],
"compilerOptions": {
diff --git a/packages/surveys/.eslintrc.cjs b/packages/surveys/.eslintrc.cjs
index d6151a6966..e7209435ab 100644
--- a/packages/surveys/.eslintrc.cjs
+++ b/packages/surveys/.eslintrc.cjs
@@ -1,3 +1,4 @@
module.exports = {
- extends: [ "turbo", "prettier"],
-};
\ No newline at end of file
+ extends: ["@formbricks/eslint-config/legacy-react.js"],
+ parser: "@typescript-eslint/parser",
+};
diff --git a/packages/surveys/package.json b/packages/surveys/package.json
index 74367de4c5..5145731f5e 100644
--- a/packages/surveys/package.json
+++ b/packages/surveys/package.json
@@ -38,12 +38,12 @@
"devDependencies": {
"@calcom/embed-snippet": "1.3.0",
"@formbricks/lib": "workspace:*",
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@formbricks/types": "workspace:*",
"@preact/preset-vite": "^2.8.2",
"autoprefixer": "^10.4.19",
"concurrently": "8.2.2",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
"isomorphic-dompurify": "^2.11.0",
"postcss": "^8.4.38",
"preact": "^10.22.0",
diff --git a/packages/surveys/src/components/general/FileInput.tsx b/packages/surveys/src/components/general/FileInput.tsx
index a49842cb87..58e272ea58 100644
--- a/packages/surveys/src/components/general/FileInput.tsx
+++ b/packages/surveys/src/components/general/FileInput.tsx
@@ -1,5 +1,4 @@
import { useMemo, useState } from "preact/hooks";
-// @ts-expect-error
import { JSXInternal } from "preact/src/jsx";
import { getOriginalFileNameFromUrl } from "@formbricks/lib/storage/utils";
@@ -101,6 +100,7 @@ export const FileInput = ({
const handleDragOver = (e: JSXInternal.TargetedDragEvent) => {
e.preventDefault();
e.stopPropagation();
+ // @ts-expect-error
e.dataTransfer.dropEffect = "copy";
};
@@ -108,6 +108,7 @@ export const FileInput = ({
e.preventDefault();
e.stopPropagation();
+ // @ts-expect-error
handleFileSelection(e.dataTransfer.files);
};
diff --git a/packages/surveys/src/components/general/QuestionMedia.tsx b/packages/surveys/src/components/general/QuestionMedia.tsx
index f3e08cd899..d9d2e53efd 100644
--- a/packages/surveys/src/components/general/QuestionMedia.tsx
+++ b/packages/surveys/src/components/general/QuestionMedia.tsx
@@ -34,7 +34,6 @@ export const QuestionMedia = ({ imgUrl, videoUrl, altText = "Image" }: QuestionM
return (
- {/* eslint-disable-next-line @next/next/no-img-element */}
{imgUrl &&
}
{videoUrlWithParams && (
diff --git a/packages/surveys/src/components/general/WelcomeCard.tsx b/packages/surveys/src/components/general/WelcomeCard.tsx
index 824c7743cb..0506cce79d 100644
--- a/packages/surveys/src/components/general/WelcomeCard.tsx
+++ b/packages/surveys/src/components/general/WelcomeCard.tsx
@@ -107,7 +107,6 @@ export const WelcomeCard = ({
{fileUrl && (
- /* eslint-disable-next-line @next/next/no-img-element */
)}
diff --git a/packages/surveys/src/components/questions/PictureSelectionQuestion.tsx b/packages/surveys/src/components/questions/PictureSelectionQuestion.tsx
index c99a131dd0..f3322a8c8a 100644
--- a/packages/surveys/src/components/questions/PictureSelectionQuestion.tsx
+++ b/packages/surveys/src/components/questions/PictureSelectionQuestion.tsx
@@ -132,7 +132,6 @@ export const PictureSelectionQuestion = ({
: "",
"focus:border-brand group/image rounded-custom relative inline-block h-28 w-full cursor-pointer overflow-hidden border focus:border-4 focus:outline-none"
)}>
- {/* eslint-disable-next-line @next/next/no-img-element */}
;
-export const ZSurveyDisplayOption = z.enum(["displayOnce", "displayMultiple", "respondMultiple"]);
+export const ZSurveyDisplayOption = z.enum([
+ "displayOnce",
+ "displayMultiple",
+ "respondMultiple",
+ "displaySome",
+]);
export type TSurveyDisplayOption = z.infer
;
@@ -478,6 +483,7 @@ export const ZSurvey = z.object({
triggers: z.array(z.object({ actionClass: ZActionClass })),
redirectUrl: z.string().url().nullable(),
recontactDays: z.number().nullable(),
+ displayLimit: z.number().nullable(),
welcomeCard: ZSurveyWelcomeCard,
questions: ZSurveyQuestions,
thankYouCard: ZSurveyThankYouCard,
@@ -494,7 +500,7 @@ export const ZSurvey = z.object({
verifyEmail: ZSurveyVerifyEmail.nullable(),
pin: z.string().nullish(),
resultShareKey: z.string().nullable(),
- displayPercentage: z.number().min(1).max(100).nullable(),
+ displayPercentage: z.number().min(0.01).max(100).nullable(),
languages: z.array(ZSurveyLanguage),
});
@@ -521,7 +527,7 @@ export const ZSurveyInput = z.object({
verifyEmail: ZSurveyVerifyEmail.optional(),
pin: z.string().nullish(),
resultShareKey: z.string().nullish(),
- displayPercentage: z.number().min(1).max(100).nullish(),
+ displayPercentage: z.number().min(0.01).max(100).nullish(),
triggers: z.array(z.object({ actionClass: ZActionClass })).optional(),
});
diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json
index 05a2c887bf..424e81695f 100644
--- a/packages/types/tsconfig.json
+++ b/packages/types/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/base.json",
+ "extends": "@formbricks/config-typescript/base.json",
"include": ["."],
"exclude": ["dist", "build", "node_modules"],
"compilerOptions": {
diff --git a/packages/ui/.eslintrc.js b/packages/ui/.eslintrc.js
new file mode 100644
index 0000000000..64a6e29852
--- /dev/null
+++ b/packages/ui/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ["@formbricks/eslint-config/legacy-next.js"],
+};
diff --git a/packages/ui/Alert/index.tsx b/packages/ui/Alert/index.tsx
index 87774db367..7065d5ddf4 100644
--- a/packages/ui/Alert/index.tsx
+++ b/packages/ui/Alert/index.tsx
@@ -4,14 +4,12 @@ import * as React from "react";
import { cn } from "@formbricks/lib/cn";
const alertVariants = cva(
- "relative w-full rounded-lg border p-3 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11",
+ "relative w-full rounded-lg border p-3 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-3 [&>svg]:top-3 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-9",
{
variants: {
variant: {
default: "bg-background text-foreground",
- destructive:
- "text-destructive border-destructive/50 dark:border-destructive [&>svg]:text-destructive text-destructive",
- info: "text-slate-800 bg-brand/5",
+ error: "border-error/50 dark:border-error [&>svg]:text-error text-error",
},
},
defaultVariants: {
diff --git a/packages/ui/Alert/stories.tsx b/packages/ui/Alert/stories.tsx
new file mode 100644
index 0000000000..8ca4e700a4
--- /dev/null
+++ b/packages/ui/Alert/stories.tsx
@@ -0,0 +1,50 @@
+import type { Meta, StoryObj } from "@storybook/react";
+import { AlertCircle } from "lucide-react";
+
+import { Alert, AlertDescription, AlertTitle } from "./index";
+
+const meta = {
+ title: "ui/Alert",
+ component: Alert,
+ tags: ["autodocs"],
+ argTypes: {
+ variant: {
+ control: "radio",
+ options: ["default", "error"],
+ },
+ },
+ args: {
+ variant: "default",
+ },
+ render: (args) => (
+
+ This is an alert
+ This is a description
+
+ ),
+} satisfies Meta;
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {};
+
+export const Error: Story = {
+ args: {
+ variant: "error",
+ },
+};
+
+export const WithIcon: Story = {
+ args: {
+ variant: "error",
+ },
+ render: (args) => (
+
+
+ This is an alert
+ This is a description
+
+ ),
+};
diff --git a/packages/ui/package.json b/packages/ui/package.json
index c999661d4a..fdcdee8f51 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -5,13 +5,14 @@
"version": "1.0.0",
"main": "./index.tsx",
"scripts": {
- "clean": "rimraf .turbo node_modules dist"
+ "clean": "rimraf .turbo node_modules dist",
+ "lint": "eslint . --ext .ts,.js,.tsx,.jsx"
},
"devDependencies": {
- "@formbricks/tsconfig": "workspace:*",
+ "@formbricks/config-typescript": "workspace:*",
"@formbricks/types": "workspace:*",
"concurrently": "^8.2.2",
- "eslint-config-formbricks": "workspace:*",
+ "@formbricks/eslint-config": "workspace:*",
"postcss": "^8.4.38",
"react": "18.3.1"
},
diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json
index 261feee946..8d01a321c2 100644
--- a/packages/ui/tsconfig.json
+++ b/packages/ui/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@formbricks/tsconfig/react-library.json",
+ "extends": "@formbricks/config-typescript/react-library.json",
"include": [".", "../types/*.d.ts", "../lib/templates.ts"],
"exclude": ["build", "node_modules"],
"compilerOptions": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4126ca9b1b..c2a5677871 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -15,12 +15,15 @@ importers:
specifier: ^1.44.1
version: 1.44.1
devDependencies:
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:packages/config-eslint
'@playwright/test':
specifier: ^1.44.1
version: 1.44.1
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:packages/eslint-config-formbricks
+ eslint:
+ specifier: ^8.57.0
+ version: 8.57.0
husky:
specifier: ^9.0.11
version: 9.0.11
@@ -34,8 +37,8 @@ importers:
specifier: ^4.11.0
version: 4.11.0
turbo:
- specifier: ^1.13.3
- version: 1.13.3
+ specifier: ^2.0.1
+ version: 2.0.1
apps/demo:
dependencies:
@@ -58,12 +61,12 @@ importers:
specifier: 18.3.1
version: 18.3.1(react@18.3.1)
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../../packages/tsconfig
- eslint-config-formbricks:
+ version: link:../../packages/config-typescript
+ '@formbricks/eslint-config':
specifier: workspace:*
- version: link:../../packages/eslint-config-formbricks
+ version: link:../../packages/config-eslint
apps/docs:
dependencies:
@@ -221,24 +224,27 @@ importers:
specifier: ^4.5.2
version: 4.5.2(@types/react@18.3.3)(react@18.3.1)
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../../packages/tsconfig
+ version: link:../../packages/config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../../packages/config-eslint
'@types/dompurify':
specifier: ^3.0.5
version: 3.0.5
'@types/react-highlight-words':
specifier: ^0.16.7
version: 0.16.7
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../../packages/eslint-config-formbricks
apps/storybook:
dependencies:
'@formbricks/ui':
specifier: workspace:*
version: link:../../packages/ui
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.7
+ version: 0.4.7(eslint@8.57.0)
react:
specifier: ^18.3.1
version: 18.3.1
@@ -249,9 +255,9 @@ importers:
'@chromatic-com/storybook':
specifier: ^1.5.0
version: 1.5.0(react@18.3.1)
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../../packages/tsconfig
+ version: link:../../packages/config-typescript
'@storybook/addon-essentials':
specifier: ^8.1.5
version: 8.1.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1)
@@ -318,6 +324,9 @@ importers:
'@formbricks/api':
specifier: workspace:*
version: link:../../packages/api
+ '@formbricks/config-tailwind':
+ specifier: workspace:*
+ version: link:../../packages/config-tailwind
'@formbricks/database':
specifier: workspace:*
version: link:../../packages/database
@@ -339,9 +348,6 @@ importers:
'@formbricks/surveys':
specifier: workspace:*
version: link:../../packages/surveys
- '@formbricks/tailwind-config':
- specifier: workspace:*
- version: link:../../packages/tailwind-config
'@formbricks/types':
specifier: workspace:*
version: link:../../packages/types
@@ -472,9 +478,12 @@ importers:
specifier: ^0.18.5
version: 0.18.5
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../../packages/tsconfig
+ version: link:../../packages/config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../../packages/config-eslint
'@neshca/cache-handler':
specifier: ^1.3.2
version: 1.3.2(next@15.0.0-rc.0)(redis@4.6.14)
@@ -493,21 +502,18 @@ importers:
'@types/qrcode':
specifier: ^1.5.5
version: 1.5.5
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../../packages/eslint-config-formbricks
packages/api:
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../tsconfig
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@formbricks/types':
specifier: workspace:*
version: link:../types
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
terser:
specifier: ^5.31.0
version: 5.31.0
@@ -518,6 +524,84 @@ importers:
specifier: ^3.9.1
version: 3.9.1(typescript@5.4.5)(vite@5.2.11)
+ packages/config-eslint:
+ devDependencies:
+ '@next/eslint-plugin-next':
+ specifier: ^14.2.3
+ version: 14.2.3
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^7.10.0
+ version: 7.12.0(@typescript-eslint/parser@7.12.0)(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser':
+ specifier: ^7.10.0
+ version: 7.12.0(eslint@8.57.0)(typescript@5.4.5)
+ '@vercel/style-guide':
+ specifier: ^5.2.0
+ version: 5.2.0(@next/eslint-plugin-next@14.2.3)(eslint@8.57.0)(typescript@5.4.5)
+ eslint-config-next:
+ specifier: ^14.2.3
+ version: 14.2.3(eslint@8.57.0)(typescript@5.4.5)
+ eslint-config-prettier:
+ specifier: ^9.1.0
+ version: 9.1.0(eslint@8.57.0)
+ eslint-config-turbo:
+ specifier: ^2.0.0
+ version: 2.0.1(eslint@8.57.0)
+ eslint-plugin-react:
+ specifier: 7.34.1
+ version: 7.34.1(eslint@8.57.0)
+ eslint-plugin-react-hooks:
+ specifier: ^4.6.2
+ version: 4.6.2(eslint@8.57.0)
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.7
+ version: 0.4.7(eslint@8.57.0)
+
+ packages/config-prettier:
+ devDependencies:
+ '@trivago/prettier-plugin-sort-imports':
+ specifier: ^4.3.0
+ version: 4.3.0(prettier@3.2.5)
+ prettier:
+ specifier: ^3.2.5
+ version: 3.2.5
+ prettier-plugin-tailwindcss:
+ specifier: ^0.5.14
+ version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0)(prettier@3.2.5)
+
+ packages/config-tailwind:
+ devDependencies:
+ '@tailwindcss/forms':
+ specifier: ^0.5.7
+ version: 0.5.7(tailwindcss@3.4.3)
+ '@tailwindcss/typography':
+ specifier: ^0.5.13
+ version: 0.5.13(tailwindcss@3.4.3)
+ autoprefixer:
+ specifier: ^10.4.19
+ version: 10.4.19(postcss@8.4.38)
+ postcss:
+ specifier: ^8.4.38
+ version: 8.4.38
+ tailwindcss:
+ specifier: ^3.4.3
+ version: 3.4.3
+
+ packages/config-typescript:
+ devDependencies:
+ '@types/node':
+ specifier: 20.12.12
+ version: 20.12.12
+ '@types/react':
+ specifier: 18.3.3
+ version: 18.3.3
+ '@types/react-dom':
+ specifier: 18.3.0
+ version: 18.3.0
+ typescript:
+ specifier: 5.4.5
+ version: 5.4.5
+
packages/database:
dependencies:
'@prisma/client':
@@ -530,18 +614,18 @@ importers:
specifier: ^7.4.2
version: 7.4.2
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../tsconfig
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@formbricks/types':
specifier: workspace:*
version: link:../types
'@paralleldrive/cuid2':
specifier: ^2.2.2
version: 2.2.2
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
prisma:
specifier: ^5.14.0
version: 5.14.0
@@ -566,22 +650,25 @@ importers:
'@formbricks/lib':
specifier: workspace:*
version: link:../lib
+ axios:
+ specifier: ^1.7.2
+ version: 1.7.2
stripe:
specifier: ^15.8.0
version: 15.8.0
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: '*'
- version: link:../tsconfig
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@formbricks/types':
specifier: '*'
version: link:../types
'@formbricks/ui':
specifier: '*'
version: link:../ui
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
packages/email:
dependencies:
@@ -610,50 +697,17 @@ importers:
specifier: ^2.1.4
version: 2.1.4(eslint@8.57.0)
- packages/eslint-config-formbricks:
- devDependencies:
- '@typescript-eslint/eslint-plugin':
- specifier: ^7.10.0
- version: 7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.5)
- '@typescript-eslint/parser':
- specifier: ^7.10.0
- version: 7.11.0(eslint@8.57.0)(typescript@5.4.5)
- eslint:
- specifier: ^8.57.0
- version: 8.57.0
- eslint-config-next:
- specifier: ^14.2.3
- version: 14.2.3(eslint@8.57.0)(typescript@5.4.5)
- eslint-config-prettier:
- specifier: ^9.1.0
- version: 9.1.0(eslint@8.57.0)
- eslint-config-turbo:
- specifier: 1.10.12
- version: 1.10.12(eslint@8.57.0)
- eslint-plugin-react:
- specifier: 7.34.1
- version: 7.34.1(eslint@8.57.0)
- eslint-plugin-react-hooks:
- specifier: ^4.6.2
- version: 4.6.2(eslint@8.57.0)
- eslint-plugin-react-refresh:
- specifier: ^0.4.7
- version: 0.4.7(eslint@8.57.0)
- eslint-plugin-storybook:
- specifier: ^0.8.0
- version: 0.8.0(eslint@8.57.0)(typescript@5.4.5)
-
packages/js:
devDependencies:
+ '@formbricks/config-typescript':
+ specifier: workspace:*
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@formbricks/js-core':
specifier: workspace:*
version: link:../js-core
- '@formbricks/tsconfig':
- specifier: workspace:*
- version: link:../tsconfig
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
terser:
specifier: ^5.31.0
version: 5.31.0
@@ -669,18 +723,18 @@ importers:
'@formbricks/api':
specifier: workspace:*
version: link:../api
+ '@formbricks/config-typescript':
+ specifier: workspace:*
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@formbricks/lib':
specifier: workspace:*
version: link:../lib
- '@formbricks/tsconfig':
- specifier: workspace:*
- version: link:../tsconfig
'@formbricks/types':
specifier: workspace:*
version: link:../types
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
terser:
specifier: ^5.31.0
version: 5.31.0
@@ -754,9 +808,12 @@ importers:
specifier: ^2.3.0
version: 2.3.0
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: '*'
- version: link:../tsconfig
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@types/jsonwebtoken':
specifier: ^9.0.6
version: 9.0.6
@@ -769,9 +826,6 @@ importers:
dotenv:
specifier: ^16.4.5
version: 16.4.5
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
ts-node:
specifier: ^10.9.2
version: 10.9.2(@types/node@20.12.12)(typescript@5.4.5)
@@ -782,29 +836,20 @@ importers:
specifier: ^1.3.1
version: 1.3.1(typescript@5.4.5)(vitest@1.6.0)
- packages/prettier-config:
- devDependencies:
- '@trivago/prettier-plugin-sort-imports':
- specifier: ^4.3.0
- version: 4.3.0(prettier@3.2.5)
- prettier:
- specifier: ^3.2.5
- version: 3.2.5
- prettier-plugin-tailwindcss:
- specifier: ^0.5.14
- version: 0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0)(prettier@3.2.5)
-
packages/surveys:
devDependencies:
'@calcom/embed-snippet':
specifier: 1.3.0
version: 1.3.0
+ '@formbricks/config-typescript':
+ specifier: workspace:*
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@formbricks/lib':
specifier: workspace:*
version: link:../lib
- '@formbricks/tsconfig':
- specifier: workspace:*
- version: link:../tsconfig
'@formbricks/types':
specifier: workspace:*
version: link:../types
@@ -817,9 +862,6 @@ importers:
concurrently:
specifier: 8.2.2
version: 8.2.2
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
isomorphic-dompurify:
specifier: ^2.11.0
version: 2.11.0
@@ -851,48 +893,15 @@ importers:
specifier: ^4.3.2
version: 4.3.2(typescript@5.4.5)(vite@5.2.11)
- packages/tailwind-config:
- devDependencies:
- '@tailwindcss/forms':
- specifier: ^0.5.7
- version: 0.5.7(tailwindcss@3.4.3)
- '@tailwindcss/typography':
- specifier: ^0.5.13
- version: 0.5.13(tailwindcss@3.4.3)
- autoprefixer:
- specifier: ^10.4.19
- version: 10.4.19(postcss@8.4.38)
- postcss:
- specifier: ^8.4.38
- version: 8.4.38
- tailwindcss:
- specifier: ^3.4.3
- version: 3.4.3
-
- packages/tsconfig:
- devDependencies:
- '@types/node':
- specifier: 20.12.12
- version: 20.12.12
- '@types/react':
- specifier: 18.3.3
- version: 18.3.3
- '@types/react-dom':
- specifier: 18.3.0
- version: 18.3.0
- typescript:
- specifier: 5.4.5
- version: 5.4.5
-
packages/types:
dependencies:
zod:
specifier: ^3.23.8
version: 3.23.8
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../tsconfig
+ version: link:../config-typescript
packages/ui:
dependencies:
@@ -999,18 +1008,18 @@ importers:
specifier: ^17.5.0
version: 17.5.0(react-dom@18.3.1)(react@18.3.1)
devDependencies:
- '@formbricks/tsconfig':
+ '@formbricks/config-typescript':
specifier: workspace:*
- version: link:../tsconfig
+ version: link:../config-typescript
+ '@formbricks/eslint-config':
+ specifier: workspace:*
+ version: link:../config-eslint
'@formbricks/types':
specifier: workspace:*
version: link:../types
concurrently:
specifier: ^8.2.2
version: 8.2.2
- eslint-config-formbricks:
- specifier: workspace:*
- version: link:../eslint-config-formbricks
postcss:
specifier: ^8.4.38
version: 8.4.38
@@ -1924,7 +1933,7 @@ packages:
'@babel/helper-compilation-targets': 7.24.6
'@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.5)
'@babel/helpers': 7.24.6
- '@babel/parser': 7.24.5
+ '@babel/parser': 7.24.6
'@babel/template': 7.24.6
'@babel/traverse': 7.24.6
'@babel/types': 7.24.6
@@ -1959,11 +1968,25 @@ packages:
transitivePeerDependencies:
- supports-color
+ /@babel/eslint-parser@7.24.7(@babel/core@7.24.6)(eslint@8.57.0):
+ resolution: {integrity: sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==}
+ engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+ peerDependencies:
+ '@babel/core': ^7.11.0
+ eslint: ^7.5.0 || ^8.0.0 || ^9.0.0
+ dependencies:
+ '@babel/core': 7.24.6
+ '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+ eslint: 8.57.0
+ eslint-visitor-keys: 2.1.0
+ semver: 6.3.1
+ dev: true
+
/@babel/generator@7.17.7:
resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/types': 7.17.0
+ '@babel/types': 7.24.6
jsesc: 2.5.2
source-map: 0.5.7
dev: true
@@ -2208,7 +2231,7 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
- '@babel/types': 7.17.0
+ '@babel/types': 7.24.6
/@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6(@babel/core@7.24.6):
resolution: {integrity: sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==}
@@ -3263,6 +3286,7 @@ packages:
dependencies:
'@babel/helper-validator-identifier': 7.24.6
to-fast-properties: 2.0.0
+ dev: true
/@babel/types@7.24.6:
resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==}
@@ -5278,6 +5302,12 @@ packages:
requiresBuild: true
optional: true
+ /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
+ resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
+ dependencies:
+ eslint-scope: 5.1.1
+ dev: true
+
/@noble/hashes@1.4.0:
resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
engines: {node: '>= 16'}
@@ -6330,6 +6360,11 @@ packages:
requiresBuild: true
optional: true
+ /@pkgr/core@0.1.1:
+ resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ dev: true
+
/@playwright/test@1.44.1:
resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==}
engines: {node: '>=16'}
@@ -11149,27 +11184,29 @@ packages:
'@types/node': 20.12.12
dev: false
- /@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.5):
- resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
+ engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
- '@typescript-eslint/parser': ^7.0.0
- eslint: ^8.56.0
+ '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
+ eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@eslint-community/regexpp': 4.10.0
- '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5)
- '@typescript-eslint/scope-manager': 7.11.0
- '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5)
- '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5)
- '@typescript-eslint/visitor-keys': 7.11.0
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/visitor-keys': 6.21.0
+ debug: 4.3.4
eslint: 8.57.0
graphemer: 1.4.0
ignore: 5.3.1
natural-compare: 1.4.0
+ semver: 7.6.2
ts-api-utils: 1.3.0(typescript@5.4.5)
typescript: 5.4.5
transitivePeerDependencies:
@@ -11203,20 +11240,20 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5):
- resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
- eslint: ^8.56.0
+ eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
- '@typescript-eslint/scope-manager': 7.11.0
- '@typescript-eslint/types': 7.11.0
- '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5)
- '@typescript-eslint/visitor-keys': 7.11.0
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5)
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
eslint: 8.57.0
typescript: 5.4.5
@@ -11245,27 +11282,6 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5):
- resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/scope-manager': 7.2.0
- '@typescript-eslint/types': 7.2.0
- '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5)
- '@typescript-eslint/visitor-keys': 7.2.0
- debug: 4.3.4
- eslint: 8.57.0
- typescript: 5.4.5
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@typescript-eslint/scope-manager@5.62.0:
resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -11274,12 +11290,12 @@ packages:
'@typescript-eslint/visitor-keys': 5.62.0
dev: true
- /@typescript-eslint/scope-manager@7.11.0:
- resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ /@typescript-eslint/scope-manager@6.21.0:
+ resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
- '@typescript-eslint/types': 7.11.0
- '@typescript-eslint/visitor-keys': 7.11.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
dev: true
/@typescript-eslint/scope-manager@7.12.0:
@@ -11290,26 +11306,18 @@ packages:
'@typescript-eslint/visitor-keys': 7.12.0
dev: true
- /@typescript-eslint/scope-manager@7.2.0:
- resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==}
+ /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
engines: {node: ^16.0.0 || >=18.0.0}
- dependencies:
- '@typescript-eslint/types': 7.2.0
- '@typescript-eslint/visitor-keys': 7.2.0
- dev: true
-
- /@typescript-eslint/type-utils@7.11.0(eslint@8.57.0)(typescript@5.4.5):
- resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==}
- engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies:
- eslint: ^8.56.0
+ eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
- '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5)
- '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5)
+ '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
debug: 4.3.4
eslint: 8.57.0
ts-api-utils: 1.3.0(typescript@5.4.5)
@@ -11343,9 +11351,9 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
- /@typescript-eslint/types@7.11.0:
- resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ /@typescript-eslint/types@6.21.0:
+ resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
dev: true
/@typescript-eslint/types@7.12.0:
@@ -11353,11 +11361,6 @@ packages:
engines: {node: ^18.18.0 || >=20.0.0}
dev: true
- /@typescript-eslint/types@7.2.0:
- resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dev: true
-
/@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5):
resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -11379,21 +11382,21 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.5):
- resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5):
+ resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
- '@typescript-eslint/types': 7.11.0
- '@typescript-eslint/visitor-keys': 7.11.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
- minimatch: 9.0.4
+ minimatch: 9.0.3
semver: 7.6.2
ts-api-utils: 1.3.0(typescript@5.4.5)
typescript: 5.4.5
@@ -11423,28 +11426,6 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5):
- resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/types': 7.2.0
- '@typescript-eslint/visitor-keys': 7.2.0
- debug: 4.3.4
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.3
- semver: 7.6.2
- ts-api-utils: 1.3.0(typescript@5.4.5)
- typescript: 5.4.5
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5):
resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -11465,17 +11446,20 @@ packages:
- typescript
dev: true
- /@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@5.4.5):
- resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
- eslint: ^8.56.0
+ eslint: ^7.0.0 || ^8.0.0
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
- '@typescript-eslint/scope-manager': 7.11.0
- '@typescript-eslint/types': 7.11.0
- '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5)
+ '@types/json-schema': 7.0.15
+ '@types/semver': 7.5.8
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5)
eslint: 8.57.0
+ semver: 7.6.2
transitivePeerDependencies:
- supports-color
- typescript
@@ -11505,11 +11489,11 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
- /@typescript-eslint/visitor-keys@7.11.0:
- resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ /@typescript-eslint/visitor-keys@6.21.0:
+ resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
+ engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
- '@typescript-eslint/types': 7.11.0
+ '@typescript-eslint/types': 6.21.0
eslint-visitor-keys: 3.4.3
dev: true
@@ -11521,14 +11505,6 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
- /@typescript-eslint/visitor-keys@7.2.0:
- resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dependencies:
- '@typescript-eslint/types': 7.2.0
- eslint-visitor-keys: 3.4.3
- dev: true
-
/@ungap/structured-clone@1.2.0:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
@@ -11569,6 +11545,53 @@ packages:
react: 19.0.0-rc-935180c7e0-20240524
dev: false
+ /@vercel/style-guide@5.2.0(@next/eslint-plugin-next@14.2.3)(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-fNSKEaZvSkiBoF6XEefs8CcgAV9K9e+MbcsDZjUsktHycKdA0jvjAzQi1W/FzLS+Nr5zZ6oejCwq/97dHUKe0g==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ '@next/eslint-plugin-next': '>=12.3.0 <15'
+ eslint: '>=8.48.0 <9'
+ prettier: '>=3.0.0 <4'
+ typescript: '>=4.8.0 <6'
+ peerDependenciesMeta:
+ '@next/eslint-plugin-next':
+ optional: true
+ eslint:
+ optional: true
+ prettier:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@babel/core': 7.24.6
+ '@babel/eslint-parser': 7.24.7(@babel/core@7.24.6)(eslint@8.57.0)
+ '@next/eslint-plugin-next': 14.2.3
+ '@rushstack/eslint-patch': 1.10.3
+ '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
+ eslint: 8.57.0
+ eslint-config-prettier: 9.1.0(eslint@8.57.0)
+ eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
+ eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.5)
+ eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0)
+ eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0)(eslint@8.57.0)
+ eslint-plugin-react: 7.34.1(eslint@8.57.0)
+ eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
+ eslint-plugin-testing-library: 6.2.2(eslint@8.57.0)(typescript@5.4.5)
+ eslint-plugin-tsdoc: 0.2.17
+ eslint-plugin-unicorn: 48.0.1(eslint@8.57.0)
+ prettier-plugin-packagejson: 2.5.0
+ typescript: 5.4.5
+ transitivePeerDependencies:
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - jest
+ - supports-color
+ dev: true
+
/@vitejs/plugin-react@4.3.0(vite@5.2.12):
resolution: {integrity: sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==}
engines: {node: ^14.18.0 || >=16.0.0}
@@ -12614,6 +12637,11 @@ packages:
ieee754: 1.2.1
dev: false
+ /builtin-modules@3.3.0:
+ resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+ engines: {node: '>=6'}
+ dev: true
+
/bundle-require@4.1.0(esbuild@0.21.4):
resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -12869,7 +12897,6 @@ packages:
/ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
- dev: false
/citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
@@ -12887,6 +12914,13 @@ packages:
clsx: 2.0.0
dev: false
+ /clean-regexp@1.0.0:
+ resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+ engines: {node: '>=4'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
/clean-stack@2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
@@ -13652,10 +13686,20 @@ packages:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
+ /detect-indent@7.0.1:
+ resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==}
+ engines: {node: '>=12.20'}
+ dev: true
+
/detect-libc@2.0.3:
resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
engines: {node: '>=8'}
+ /detect-newline@4.0.1:
+ resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
/detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
@@ -14225,11 +14269,11 @@ packages:
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.4.5)
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
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-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.12.0)(eslint@8.57.0)
eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0)
eslint-plugin-react: 7.34.1(eslint@8.57.0)
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
@@ -14264,6 +14308,25 @@ packages:
dependencies:
eslint: 8.57.0
eslint-plugin-turbo: 1.10.12(eslint@8.57.0)
+ dev: false
+
+ /eslint-config-turbo@2.0.1(eslint@8.57.0):
+ resolution: {integrity: sha512-Z/TjALEtWvFmi7c2pszuyU8VMrp7KH1q3I4eNBLzlit5kybYDJhacUDYRDyIdGqXg6XljdyDpxNIOKQByScknw==}
+ peerDependencies:
+ eslint: '>6.6.0'
+ dependencies:
+ eslint: 8.57.0
+ eslint-plugin-turbo: 2.0.1(eslint@8.57.0)
+ dev: true
+
+ /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1):
+ resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==}
+ engines: {node: '>= 4'}
+ peerDependencies:
+ eslint-plugin-import: '>=1.4.0'
+ dependencies:
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ dev: true
/eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
@@ -14275,7 +14338,7 @@ packages:
- supports-color
dev: true
- /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0):
+ /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0):
resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
@@ -14285,8 +14348,8 @@ packages:
debug: 4.3.4
enhanced-resolve: 5.16.1
eslint: 8.57.0
- eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.12.0)(eslint@8.57.0)
fast-glob: 3.3.2
get-tsconfig: 4.7.5
is-core-module: 2.13.1
@@ -14298,7 +14361,30 @@ packages:
- supports-color
dev: true
- /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
+ /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0):
+ resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ dependencies:
+ debug: 4.3.4
+ enhanced-resolve: 5.16.1
+ eslint: 8.57.0
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ fast-glob: 3.3.2
+ get-tsconfig: 4.7.5
+ is-core-module: 2.13.1
+ is-glob: 4.0.3
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
engines: {node: '>=4'}
peerDependencies:
@@ -14319,15 +14405,16 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
- '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
debug: 3.2.7
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
transitivePeerDependencies:
- supports-color
dev: true
- /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
+ /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.12.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
engines: {node: '>=4'}
peerDependencies:
@@ -14348,16 +14435,26 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
- '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5)
debug: 3.2.7
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-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
transitivePeerDependencies:
- supports-color
dev: true
- /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0):
+ /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0):
+ resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==}
+ engines: {node: '>=6.5.0'}
+ peerDependencies:
+ eslint: '>=4.19.1'
+ dependencies:
+ escape-string-regexp: 1.0.5
+ eslint: 8.57.0
+ ignore: 5.3.1
+ dev: true
+
+ /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
engines: {node: '>=4'}
peerDependencies:
@@ -14367,7 +14464,7 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
- '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
array.prototype.flat: 1.3.2
@@ -14376,7 +14473,7 @@ packages:
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.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
hasown: 2.0.2
is-core-module: 2.13.1
is-glob: 4.0.3
@@ -14392,6 +14489,62 @@ packages:
- supports-color
dev: true
+ /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0)(eslint@8.57.0):
+ resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5)
+ 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.12.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
+ hasown: 2.0.2
+ is-core-module: 2.13.1
+ 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
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0
+ eslint: ^7.0.0 || ^8.0.0
+ jest: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+ jest:
+ optional: true
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5)
+ eslint: 8.57.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
/eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0):
resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==}
engines: {node: '>=4.0'}
@@ -14417,6 +14570,19 @@ packages:
object.fromentries: 2.0.8
dev: true
+ /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0)(eslint@8.57.0):
+ resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==}
+ peerDependencies:
+ eslint: '>=7'
+ eslint-plugin-jest: '>=25'
+ peerDependenciesMeta:
+ eslint-plugin-jest:
+ optional: true
+ dependencies:
+ eslint: 8.57.0
+ eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.5)
+ dev: true
+
/eslint-plugin-react-hooks@4.6.2(eslint@8.57.0):
resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==}
engines: {node: '>=10'}
@@ -14432,7 +14598,6 @@ packages:
eslint: '>=7'
dependencies:
eslint: 8.57.0
- dev: true
/eslint-plugin-react@7.34.1(eslint@8.57.0):
resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==}
@@ -14477,6 +14642,26 @@ packages:
- typescript
dev: true
+ /eslint-plugin-testing-library@6.2.2(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'}
+ peerDependencies:
+ eslint: ^7.5.0 || ^8.0.0
+ dependencies:
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5)
+ eslint: 8.57.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /eslint-plugin-tsdoc@0.2.17:
+ resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==}
+ dependencies:
+ '@microsoft/tsdoc': 0.14.2
+ '@microsoft/tsdoc-config': 0.16.2
+ dev: true
+
/eslint-plugin-turbo@1.10.12(eslint@8.57.0):
resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==}
peerDependencies:
@@ -14484,6 +14669,40 @@ packages:
dependencies:
dotenv: 16.0.3
eslint: 8.57.0
+ dev: false
+
+ /eslint-plugin-turbo@2.0.1(eslint@8.57.0):
+ resolution: {integrity: sha512-qe3WlGQXVKIZyWlONjvd3+YbtptK6KvfoLb6TrVzkT+mNYbDpjjbGZ3z12Oj0kUNW31n5Me3EVnrgxeyyw1V3g==}
+ peerDependencies:
+ eslint: '>6.6.0'
+ dependencies:
+ dotenv: 16.0.3
+ eslint: 8.57.0
+ dev: true
+
+ /eslint-plugin-unicorn@48.0.1(eslint@8.57.0):
+ resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ eslint: '>=8.44.0'
+ dependencies:
+ '@babel/helper-validator-identifier': 7.24.6
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+ ci-info: 3.9.0
+ clean-regexp: 1.0.0
+ eslint: 8.57.0
+ esquery: 1.5.0
+ indent-string: 4.0.0
+ is-builtin-module: 3.2.1
+ jsesc: 3.0.2
+ lodash: 4.17.21
+ pluralize: 8.0.0
+ read-pkg-up: 7.0.1
+ regexp-tree: 0.1.27
+ regjsparser: 0.10.0
+ semver: 7.6.2
+ strip-indent: 3.0.0
+ dev: true
/eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
@@ -14499,6 +14718,11 @@ packages:
esrecurse: 4.3.0
estraverse: 5.3.0
+ /eslint-visitor-keys@2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+ dev: true
+
/eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -15187,6 +15411,11 @@ packages:
engines: {node: '>=12.17'}
dev: true
+ /get-stdin@9.0.0:
+ resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==}
+ engines: {node: '>=12'}
+ dev: true
+
/get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@@ -15231,6 +15460,10 @@ packages:
tar: 6.2.1
dev: true
+ /git-hooks-list@3.1.0:
+ resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==}
+ dev: true
+
/github-slugger@2.0.0:
resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
dev: true
@@ -15362,6 +15595,17 @@ packages:
merge2: 1.4.1
slash: 3.0.0
+ /globby@13.2.2:
+ resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.1
+ merge2: 1.4.1
+ slash: 4.0.0
+ dev: true
+
/globby@14.0.1:
resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==}
engines: {node: '>=18'}
@@ -15963,6 +16207,13 @@ packages:
call-bind: 1.0.7
has-tostringtag: 1.0.2
+ /is-builtin-module@3.2.1:
+ resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
+ engines: {node: '>=6'}
+ dependencies:
+ builtin-modules: 3.3.0
+ dev: true
+
/is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
@@ -16102,7 +16353,6 @@ packages:
/is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
- dev: false
/is-plain-object@2.0.4:
resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
@@ -16460,6 +16710,12 @@ packages:
engines: {node: '>=4'}
hasBin: true
+ /jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
/json-bigint@1.0.0:
resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
dependencies:
@@ -18832,6 +19088,11 @@ packages:
optionalDependencies:
fsevents: 2.3.2
+ /pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+ dev: true
+
/pngjs@5.0.0:
resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
engines: {node: '>=10.13.0'}
@@ -18991,6 +19252,18 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
+ /prettier-plugin-packagejson@2.5.0:
+ resolution: {integrity: sha512-6XkH3rpin5QEQodBSVNg+rBo4r91g/1mCaRwS1YGdQJZ6jwqrg2UchBsIG9tpS1yK1kNBvOt84OILsX8uHzBGg==}
+ peerDependencies:
+ prettier: '>= 1.16.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ dependencies:
+ sort-package-json: 2.10.0
+ synckit: 0.9.0
+ dev: true
+
/prettier-plugin-tailwindcss@0.5.14(@trivago/prettier-plugin-sort-imports@4.3.0)(prettier@3.2.5):
resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==}
engines: {node: '>=14.21.3'}
@@ -19902,6 +20175,11 @@ packages:
'@babel/runtime': 7.24.6
dev: true
+ /regexp-tree@0.1.27:
+ resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+ hasBin: true
+ dev: true
+
/regexp.prototype.flags@1.5.2:
resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
engines: {node: '>= 0.4'}
@@ -19937,6 +20215,13 @@ packages:
rc: 1.2.8
dev: true
+ /regjsparser@0.10.0:
+ resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
+ hasBin: true
+ dependencies:
+ jsesc: 0.5.0
+ dev: true
+
/regjsparser@0.9.1:
resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
hasBin: true
@@ -20573,6 +20858,11 @@ packages:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
+ /slash@4.0.0:
+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+ engines: {node: '>=12'}
+ dev: true
+
/slash@5.1.0:
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
engines: {node: '>=14.16'}
@@ -20678,6 +20968,24 @@ packages:
react-dom: 18.3.1(react@18.3.1)
dev: false
+ /sort-object-keys@1.1.3:
+ resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==}
+ dev: true
+
+ /sort-package-json@2.10.0:
+ resolution: {integrity: sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g==}
+ hasBin: true
+ dependencies:
+ detect-indent: 7.0.1
+ detect-newline: 4.0.1
+ get-stdin: 9.0.0
+ git-hooks-list: 3.1.0
+ globby: 13.2.2
+ is-plain-obj: 4.1.0
+ semver: 7.6.2
+ sort-object-keys: 1.1.3
+ dev: true
+
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
@@ -21123,6 +21431,14 @@ packages:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: true
+ /synckit@0.9.0:
+ resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ dependencies:
+ '@pkgr/core': 0.1.1
+ tslib: 2.6.2
+ dev: true
+
/tabbable@6.2.0:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
dev: false
@@ -21664,64 +21980,64 @@ packages:
yargs: 17.7.2
dev: false
- /turbo-darwin-64@1.13.3:
- resolution: {integrity: sha512-glup8Qx1qEFB5jerAnXbS8WrL92OKyMmg5Hnd4PleLljAeYmx+cmmnsmLT7tpaVZIN58EAAwu8wHC6kIIqhbWA==}
+ /turbo-darwin-64@2.0.1:
+ resolution: {integrity: sha512-GO391pUmI6c6l/EpUIaXNzwbVDWRvYahm5oLB176dAWRYKYO+Osqs/XBdOM0G3l7ZFdR6nUtRJc8qinJp7qDUQ==}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
- /turbo-darwin-arm64@1.13.3:
- resolution: {integrity: sha512-/np2xD+f/+9qY8BVtuOQXRq5f9LehCFxamiQnwdqWm5iZmdjygC5T3uVSYuagVFsZKMvX3ycySwh8dylGTl6lg==}
+ /turbo-darwin-arm64@2.0.1:
+ resolution: {integrity: sha512-rmjJoxeq7nmH/F2aWKapahrDE2zE2Uc15rvs4Rz6qHOzSqC8R5uyLpQyTKIPIZ95O/z9nKfLfVPyiRENuk5vpw==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
- /turbo-linux-64@1.13.3:
- resolution: {integrity: sha512-G+HGrau54iAnbXLfl+N/PynqpDwi/uDzb6iM9hXEDG+yJnSJxaHMShhOkXYJPk9offm9prH33Khx2scXrYVW1g==}
+ /turbo-linux-64@2.0.1:
+ resolution: {integrity: sha512-vwTOc4v4jm6tM+9WlsiDlN+zwHP8A2wlsAYiNqz2u0DZL55aCWaVdivh2VpVLN36Mr9HgREGH0Fw+jx6ObcNRg==}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
- /turbo-linux-arm64@1.13.3:
- resolution: {integrity: sha512-qWwEl5VR02NqRyl68/3pwp3c/olZuSp+vwlwrunuoNTm6JXGLG5pTeme4zoHNnk0qn4cCX7DFrOboArlYxv0wQ==}
+ /turbo-linux-arm64@2.0.1:
+ resolution: {integrity: sha512-DkVt76fjwY940DfmqznWhpYIlKYduvKAoTtylkERrDlcWUpDYWwqNbcf9PRRIbnjnv9lIxvuom1KZmMY+cw/Ig==}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
- /turbo-windows-64@1.13.3:
- resolution: {integrity: sha512-Nudr4bRChfJzBPzEmpVV85VwUYRCGKecwkBFpbp2a4NtrJ3+UP1VZES653ckqCu2FRyRuS0n03v9euMbAvzH+Q==}
+ /turbo-windows-64@2.0.1:
+ resolution: {integrity: sha512-XskV34kYuXVIHbRbgH8jr35Y8uA6kJOQ0LJStU4jFk7piiyk0a4n2GNDymMtvIwAxYdbuTe+pKuPCThFdirHBQ==}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
- /turbo-windows-arm64@1.13.3:
- resolution: {integrity: sha512-ouJCgsVLd3icjRLmRvHQDDZnmGzT64GBupM1Y+TjtYn2LVaEBoV6hicFy8x5DUpnqdLy+YpCzRMkWlwhmkX7sQ==}
+ /turbo-windows-arm64@2.0.1:
+ resolution: {integrity: sha512-R2/RmKr2uQxkOCtXK5LNxdD3Iv7lUm56iy2FrDwTDgPI7X7K6WRjrxdirmFIu/fABYE5n6EampU3ejbG5mmGtg==}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
- /turbo@1.13.3:
- resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==}
+ /turbo@2.0.1:
+ resolution: {integrity: sha512-sJhxfBaN14pYj//xxAG6zAyStkE2j4HI9JVXVMob35SGob6dz/HuSqV/4QlVqw0uKAkwc1lXIsnykbe8RLmOOw==}
hasBin: true
optionalDependencies:
- turbo-darwin-64: 1.13.3
- turbo-darwin-arm64: 1.13.3
- turbo-linux-64: 1.13.3
- turbo-linux-arm64: 1.13.3
- turbo-windows-64: 1.13.3
- turbo-windows-arm64: 1.13.3
+ turbo-darwin-64: 2.0.1
+ turbo-darwin-arm64: 2.0.1
+ turbo-linux-64: 2.0.1
+ turbo-linux-arm64: 2.0.1
+ turbo-windows-64: 2.0.1
+ turbo-windows-arm64: 2.0.1
dev: true
/tween-functions@1.2.0:
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index f465b6c828..3ff5faaaf5 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,4 +1,3 @@
packages:
- "apps/*"
- "packages/*"
- - "!packages/n8n"
diff --git a/turbo.json b/turbo.json
index ebf4ef9e42..930707cca4 100644
--- a/turbo.json
+++ b/turbo.json
@@ -1,6 +1,6 @@
{
"$schema": "https://turborepo.org/schema.json",
- "pipeline": {
+ "tasks": {
"@formbricks/database#build": {
"cache": false,
"dependsOn": ["post-install"]
@@ -66,6 +66,7 @@
"CUSTOM_CACHE_DISABLED",
"CUSTOMER_IO_API_KEY",
"CUSTOMER_IO_SITE_ID",
+ "DATABASE_URL",
"DEBUG",
"E2E_TESTING",
"EMAIL_AUTH_DISABLED",
@@ -144,6 +145,7 @@
"UPLOADS_DIR",
"VERCEL",
"VERCEL_URL",
+ "VERSION",
"WEBAPP_URL",
"UNSPLASH_ACCESS_KEY"
]