mirror of
https://github.com/twentyhq/twenty.git
synced 2024-12-23 03:51:36 +03:00
35f2d7a004
**TLDR** Added Billing Entitlement table, based on stripe customer.ActiveEntitlements webhook event. In this table it has a key value pair with each key being the stripe feature lookup key and the value a boolean. We use this table in order to see if SSO or other feaures are enabled by workspace. **In order to test: twenty-server** Billing: - Set IS_BILLING_ENABLED to true - Add your BILLING_STRIPE_SECRET and BILLING_STRIPE_API_KEY - Add your BILLING_STRIPE_BASE_PLAN_PRODUCT_ID (use the one in testMode > Base Plan) Auth: - Set AUTH_SSO_ENABLED to true - Set your ACCESS_TOKEN_SECRET, LOGIN_TOKEN_SECRET, REFRESH_TOKEN_SECRET and FILE_TOKEN_SECRET - Set IS_SSO_ENABLED feature flag to true Stripe Webhook: - Authenticate with your account in the stripe CLI - Run the command: stripe listen --forward-to http://localhost:3000/billing/webhooks Migration: - npx nx typeorm -- migration:run -d src/database/typeorm/core/core.datasource.ts **In order to test: twenty site** - Buy a subscription (you can use the card 4242...42 with expiration date later in the future) - Go to SSO and create an OICD subscription - Change the value in the entitlement table in order to put it in false - An error should occur saying that the current workspace has no entitlement **Considerations** The data from the Entitlement table is updated based on the stripe webhook responses, and we use the customerActiveEntitlemet response to update the info on the table, however this event doesnt have the metadata containing the workspaceId. Because we cannot control at wich order the webhook send events, we force a server error if the entitlements are updated before the BillingSubscription. Stripe resends the event based on a exponential backoff (for more info see https://docs.stripe.com/webhooks#retries ) because we are in test mode Stripe retries three times over a few hours. So if the BillingEntitlement is not updated it is completely normal and it will be updated when stripe resends the event. --------- Co-authored-by: Félix Malfait <felix@twenty.com>
372 lines
12 KiB
JSON
372 lines
12 KiB
JSON
{
|
|
"dependencies": {
|
|
"@air/react-drag-to-select": "^5.0.8",
|
|
"@apollo/client": "^3.7.17",
|
|
"@apollo/server": "^4.7.3",
|
|
"@aws-sdk/client-lambda": "^3.614.0",
|
|
"@aws-sdk/client-s3": "^3.363.0",
|
|
"@aws-sdk/credential-providers": "^3.363.0",
|
|
"@blocknote/mantine": "^0.15.3",
|
|
"@blocknote/react": "^0.15.3",
|
|
"@codesandbox/sandpack-react": "^2.13.5",
|
|
"@dagrejs/dagre": "^1.1.2",
|
|
"@emotion/react": "^11.11.1",
|
|
"@emotion/styled": "^11.11.0",
|
|
"@envelop/on-resolve": "^4.1.0",
|
|
"@floating-ui/react": "^0.24.3",
|
|
"@google-cloud/local-auth": "2.1.0",
|
|
"@graphiql/plugin-explorer": "^1.0.2",
|
|
"@graphql-tools/schema": "^10.0.0",
|
|
"@hello-pangea/dnd": "^16.2.0",
|
|
"@hookform/resolvers": "^3.1.1",
|
|
"@jsdevtools/rehype-toc": "^3.0.2",
|
|
"@linaria/core": "^6.2.0",
|
|
"@linaria/react": "^6.2.1",
|
|
"@mdx-js/react": "^3.0.0",
|
|
"@microsoft/microsoft-graph-client": "^3.0.7",
|
|
"@nestjs/apollo": "^11.0.5",
|
|
"@nestjs/axios": "^3.0.1",
|
|
"@nestjs/cli": "^9.0.0",
|
|
"@nestjs/common": "^9.0.0",
|
|
"@nestjs/config": "^2.3.2",
|
|
"@nestjs/core": "^9.0.0",
|
|
"@nestjs/event-emitter": "^2.0.3",
|
|
"@nestjs/jwt": "^10.0.3",
|
|
"@nestjs/passport": "^9.0.3",
|
|
"@nestjs/platform-express": "^9.0.0",
|
|
"@nestjs/serve-static": "^4.0.1",
|
|
"@nestjs/terminus": "^9.2.2",
|
|
"@nestjs/typeorm": "^10.0.0",
|
|
"@nx/eslint-plugin": "^17.2.8",
|
|
"@octokit/graphql": "^7.0.2",
|
|
"@ptc-org/nestjs-query-core": "^4.2.0",
|
|
"@ptc-org/nestjs-query-typeorm": "4.2.1-alpha.2",
|
|
"@react-email/components": "0.0.12",
|
|
"@react-email/render": "0.0.10",
|
|
"@sentry/node": "^8",
|
|
"@sentry/profiling-node": "^8",
|
|
"@sentry/react": "^8",
|
|
"@sniptt/guards": "^0.2.0",
|
|
"@stoplight/elements": "^8.0.5",
|
|
"@swc/jest": "^0.2.29",
|
|
"@tabler/icons-react": "^2.44.0",
|
|
"@tiptap/extension-hard-break": "^2.9.1",
|
|
"@types/dompurify": "^3.0.5",
|
|
"@types/facepaint": "^1.2.5",
|
|
"@types/lodash.camelcase": "^4.3.7",
|
|
"@types/lodash.chunk": "^4.2.9",
|
|
"@types/lodash.merge": "^4.6.7",
|
|
"@types/lodash.pick": "^4.3.7",
|
|
"@types/nodemailer": "^6.4.14",
|
|
"@types/passport-microsoft": "^1.0.3",
|
|
"@wyw-in-js/vite": "^0.5.3",
|
|
"add": "^2.0.6",
|
|
"addressparser": "^1.0.1",
|
|
"afterframe": "^1.0.2",
|
|
"apollo-server-express": "^3.12.0",
|
|
"apollo-upload-client": "^17.0.0",
|
|
"archiver": "^7.0.1",
|
|
"axios": "^1.6.2",
|
|
"bcrypt": "^5.1.1",
|
|
"better-sqlite3": "^9.2.2",
|
|
"body-parser": "^1.20.2",
|
|
"bullmq": "^4.14.0",
|
|
"bytes": "^3.1.2",
|
|
"class-transformer": "^0.5.1",
|
|
"clsx": "^2.1.1",
|
|
"cross-env": "^7.0.3",
|
|
"css-loader": "^7.1.2",
|
|
"danger-plugin-todos": "^1.3.1",
|
|
"dataloader": "^2.2.2",
|
|
"date-fns": "^2.30.0",
|
|
"date-fns-tz": "^2.0.0",
|
|
"debounce": "^2.0.0",
|
|
"deep-equal": "^2.2.2",
|
|
"dompurify": "^3.0.11",
|
|
"dotenv-cli": "^7.2.1",
|
|
"drizzle-orm": "^0.29.3",
|
|
"esbuild-plugin-svgr": "^2.1.0",
|
|
"facepaint": "^1.2.1",
|
|
"file-type": "16.5.4",
|
|
"framer-motion": "^10.12.17",
|
|
"googleapis": "105",
|
|
"graphiql": "^3.1.1",
|
|
"graphql": "16.8.0",
|
|
"graphql-fields": "^2.0.3",
|
|
"graphql-middleware": "^6.1.35",
|
|
"graphql-rate-limit": "^3.3.0",
|
|
"graphql-scalars": "^1.23.0",
|
|
"graphql-subscriptions": "2.0.0",
|
|
"graphql-tag": "^2.12.6",
|
|
"graphql-type-json": "^0.3.2",
|
|
"graphql-upload": "^13.0.0",
|
|
"graphql-yoga": "^4.0.4",
|
|
"hex-rgb": "^5.0.0",
|
|
"iframe-resizer-react": "^1.1.0",
|
|
"immer": "^10.0.2",
|
|
"jest-mock-extended": "^3.0.4",
|
|
"js-cookie": "^3.0.5",
|
|
"js-levenshtein": "^1.1.6",
|
|
"json-2-csv": "^5.4.0",
|
|
"jsonwebtoken": "^9.0.0",
|
|
"libphonenumber-js": "^1.10.26",
|
|
"lodash.camelcase": "^4.3.0",
|
|
"lodash.chunk": "^4.2.0",
|
|
"lodash.compact": "^3.0.1",
|
|
"lodash.debounce": "^4.0.8",
|
|
"lodash.groupby": "^4.6.0",
|
|
"lodash.identity": "^3.0.0",
|
|
"lodash.isempty": "^4.4.0",
|
|
"lodash.isequal": "^4.5.0",
|
|
"lodash.isobject": "^3.0.2",
|
|
"lodash.kebabcase": "^4.1.1",
|
|
"lodash.mapvalues": "^4.6.0",
|
|
"lodash.merge": "^4.6.2",
|
|
"lodash.omit": "^4.5.0",
|
|
"lodash.pick": "^4.4.0",
|
|
"lodash.pickby": "^4.6.0",
|
|
"lodash.snakecase": "^4.1.1",
|
|
"lodash.upperfirst": "^4.3.1",
|
|
"luxon": "^3.3.0",
|
|
"microdiff": "^1.3.2",
|
|
"moize": "^6.1.6",
|
|
"nest-commander": "^3.12.0",
|
|
"next": "14.0.4",
|
|
"next-mdx-remote": "^4.4.1",
|
|
"nodemailer": "^6.9.8",
|
|
"openapi-types": "^12.1.3",
|
|
"overlayscrollbars": "^2.6.1",
|
|
"overlayscrollbars-react": "^0.5.4",
|
|
"passport": "^0.7.0",
|
|
"passport-google-oauth20": "^2.0.0",
|
|
"passport-jwt": "^4.0.1",
|
|
"passport-local": "^1.0.0",
|
|
"passport-microsoft": "^2.0.0",
|
|
"patch-package": "^8.0.0",
|
|
"pg": "^8.11.3",
|
|
"pg-boss": "^9.0.3",
|
|
"planer": "^1.2.0",
|
|
"pluralize": "^8.0.0",
|
|
"prettier": "^3.0.3",
|
|
"prism-react-renderer": "^2.1.0",
|
|
"qs": "^6.11.2",
|
|
"react": "^18.2.0",
|
|
"react-data-grid": "7.0.0-beta.13",
|
|
"react-datepicker": "^6.7.1",
|
|
"react-dom": "^18.2.0",
|
|
"react-dropzone": "^14.2.3",
|
|
"react-error-boundary": "^4.0.11",
|
|
"react-helmet-async": "^1.3.0",
|
|
"react-hook-form": "^7.45.1",
|
|
"react-hotkeys-hook": "^4.4.4",
|
|
"react-icons": "^4.12.0",
|
|
"react-imask": "^7.6.0",
|
|
"react-intersection-observer": "^9.5.2",
|
|
"react-loading-skeleton": "^3.3.1",
|
|
"react-phone-number-input": "^3.3.4",
|
|
"react-responsive": "^9.0.2",
|
|
"react-router-dom": "^6.4.4",
|
|
"react-textarea-autosize": "^8.4.1",
|
|
"react-tooltip": "^5.13.1",
|
|
"reactflow": "^11.11.3",
|
|
"recoil": "^0.7.7",
|
|
"rehype-slug": "^6.0.0",
|
|
"remark-behead": "^3.1.0",
|
|
"remark-gfm": "^3.0.1",
|
|
"rimraf": "^3.0.2",
|
|
"rxjs": "^7.2.0",
|
|
"scroll-into-view": "^1.16.2",
|
|
"semver": "^7.5.4",
|
|
"sharp": "^0.32.1",
|
|
"slash": "^5.1.0",
|
|
"stripe": "^17.3.1",
|
|
"ts-key-enum": "^2.0.12",
|
|
"tslib": "^2.3.0",
|
|
"tsup": "^8.2.4",
|
|
"type-fest": "4.10.1",
|
|
"typescript": "5.3.3",
|
|
"use-context-selector": "^2.0.0",
|
|
"use-debounce": "^10.0.0",
|
|
"uuid": "^9.0.0",
|
|
"vite-tsconfig-paths": "^4.2.1",
|
|
"xlsx-ugnis": "^0.19.3",
|
|
"zod": "3.23.8"
|
|
},
|
|
"devDependencies": {
|
|
"@babel/core": "^7.14.5",
|
|
"@babel/preset-react": "^7.14.5",
|
|
"@babel/preset-typescript": "^7.24.6",
|
|
"@crxjs/vite-plugin": "^1.0.14",
|
|
"@graphql-codegen/cli": "^3.3.1",
|
|
"@graphql-codegen/client-preset": "^4.1.0",
|
|
"@graphql-codegen/typescript": "^3.0.4",
|
|
"@graphql-codegen/typescript-operations": "^3.0.4",
|
|
"@graphql-codegen/typescript-react-apollo": "^3.3.7",
|
|
"@microsoft/microsoft-graph-types": "^2.40.0",
|
|
"@nestjs/cli": "^9.0.0",
|
|
"@nestjs/schematics": "^9.0.0",
|
|
"@nestjs/testing": "^9.0.0",
|
|
"@next/eslint-plugin-next": "^14.1.4",
|
|
"@nx/eslint": "18.3.3",
|
|
"@nx/eslint-plugin": "18.3.3",
|
|
"@nx/jest": "18.3.3",
|
|
"@nx/js": "18.3.3",
|
|
"@nx/react": "18.3.3",
|
|
"@nx/storybook": "18.3.3",
|
|
"@nx/vite": "18.3.3",
|
|
"@nx/web": "18.3.3",
|
|
"@playwright/test": "^1.46.0",
|
|
"@sentry/types": "^7.109.0",
|
|
"@storybook/addon-actions": "^7.6.3",
|
|
"@storybook/addon-coverage": "^1.0.0",
|
|
"@storybook/addon-essentials": "^7.6.7",
|
|
"@storybook/addon-interactions": "^7.6.7",
|
|
"@storybook/addon-links": "^7.6.7",
|
|
"@storybook/addon-onboarding": "^1.0.10",
|
|
"@storybook/blocks": "^7.6.3",
|
|
"@storybook/core-server": "7.6.3",
|
|
"@storybook/icons": "^1.2.9",
|
|
"@storybook/jest": "^0.2.3",
|
|
"@storybook/react": "^7.6.3",
|
|
"@storybook/react-vite": "^7.6.3",
|
|
"@storybook/test": "^7.6.3",
|
|
"@storybook/test-runner": "^0.16.0",
|
|
"@storybook/testing-library": "^0.2.2",
|
|
"@stylistic/eslint-plugin": "^1.5.0",
|
|
"@swc-node/register": "1.8.0",
|
|
"@swc/cli": "^0.3.12",
|
|
"@swc/core": "~1.3.100",
|
|
"@swc/helpers": "~0.5.2",
|
|
"@testing-library/jest-dom": "^6.1.5",
|
|
"@testing-library/react": "14.0.0",
|
|
"@types/addressparser": "^1.0.3",
|
|
"@types/apollo-upload-client": "^17.0.2",
|
|
"@types/bcrypt": "^5.0.0",
|
|
"@types/better-sqlite3": "^7.6.8",
|
|
"@types/bytes": "^3.1.1",
|
|
"@types/chrome": "^0.0.267",
|
|
"@types/deep-equal": "^1.0.1",
|
|
"@types/express": "^4.17.13",
|
|
"@types/graphql-fields": "^1.3.6",
|
|
"@types/graphql-upload": "^8.0.12",
|
|
"@types/jest": "^29.5.11",
|
|
"@types/js-cookie": "^3.0.3",
|
|
"@types/js-levenshtein": "^1.1.3",
|
|
"@types/lodash.camelcase": "^4.3.7",
|
|
"@types/lodash.compact": "^3.0.9",
|
|
"@types/lodash.debounce": "^4.0.7",
|
|
"@types/lodash.groupby": "^4.6.9",
|
|
"@types/lodash.identity": "^3.0.9",
|
|
"@types/lodash.isempty": "^4.4.7",
|
|
"@types/lodash.isequal": "^4.5.7",
|
|
"@types/lodash.isobject": "^3.0.7",
|
|
"@types/lodash.kebabcase": "^4.1.7",
|
|
"@types/lodash.mapvalues": "^4.6.9",
|
|
"@types/lodash.omit": "^4.5.9",
|
|
"@types/lodash.pickby": "^4.6.9",
|
|
"@types/lodash.snakecase": "^4.1.7",
|
|
"@types/lodash.upperfirst": "^4.3.7",
|
|
"@types/luxon": "^3.3.0",
|
|
"@types/ms": "^0.7.31",
|
|
"@types/node": "18.19.26",
|
|
"@types/passport-google-oauth20": "^2.0.11",
|
|
"@types/passport-jwt": "^3.0.8",
|
|
"@types/pluralize": "^0.0.33",
|
|
"@types/react": "^18.2.39",
|
|
"@types/react-datepicker": "^6.2.0",
|
|
"@types/react-dom": "^18.2.15",
|
|
"@types/scroll-into-view": "^1.16.0",
|
|
"@types/supertest": "^2.0.11",
|
|
"@types/uuid": "^9.0.2",
|
|
"@typescript-eslint/eslint-plugin": "6.21.0",
|
|
"@typescript-eslint/experimental-utils": "^5.62.0",
|
|
"@typescript-eslint/parser": "6.21.0",
|
|
"@typescript-eslint/utils": "6.21.0",
|
|
"@vitejs/plugin-react-swc": "^3.5.0",
|
|
"@vitest/ui": "1.4.0",
|
|
"chromatic": "^6.18.0",
|
|
"concurrently": "^8.2.2",
|
|
"cross-var": "^1.1.0",
|
|
"danger": "^11.3.0",
|
|
"dotenv-cli": "^7.2.1",
|
|
"drizzle-kit": "^0.20.14",
|
|
"esbuild": "^0.23.0",
|
|
"eslint": "^8.53.0",
|
|
"eslint-config-next": "14.0.4",
|
|
"eslint-config-prettier": "^9.1.0",
|
|
"eslint-plugin-import": "2.29.1",
|
|
"eslint-plugin-jsx-a11y": "^6.8.0",
|
|
"eslint-plugin-prefer-arrow": "^1.2.3",
|
|
"eslint-plugin-prettier": "^5.1.2",
|
|
"eslint-plugin-project-structure": "^3.9.1",
|
|
"eslint-plugin-react": "^7.33.2",
|
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
"eslint-plugin-react-refresh": "^0.4.4",
|
|
"eslint-plugin-simple-import-sort": "^10.0.0",
|
|
"eslint-plugin-storybook": "^0.6.15",
|
|
"eslint-plugin-unicorn": "^51.0.1",
|
|
"eslint-plugin-unused-imports": "^3.0.0",
|
|
"http-server": "^14.1.1",
|
|
"jest": "29.7.0",
|
|
"jest-environment-jsdom": "29.7.0",
|
|
"jest-environment-node": "^29.4.1",
|
|
"jest-fetch-mock": "^3.0.3",
|
|
"jsdom": "~22.1.0",
|
|
"msw": "^2.0.11",
|
|
"msw-storybook-addon": "2.0.0--canary.122.b3ed3b1.0",
|
|
"nx": "18.3.3",
|
|
"playwright": "^1.46.0",
|
|
"prettier": "^3.1.1",
|
|
"raw-loader": "^4.0.2",
|
|
"rimraf": "^5.0.5",
|
|
"source-map-support": "^0.5.20",
|
|
"storybook": "^7.6.3",
|
|
"storybook-addon-cookie": "^3.2.0",
|
|
"storybook-addon-pseudo-states": "^2.1.2",
|
|
"storybook-dark-mode": "^3.0.3",
|
|
"supertest": "^6.1.3",
|
|
"ts-jest": "^29.1.1",
|
|
"ts-loader": "^9.2.3",
|
|
"ts-node": "10.9.1",
|
|
"tsconfig-paths": "^4.2.0",
|
|
"tsx": "^4.17.0",
|
|
"vite": "^5.4.0",
|
|
"vite-plugin-checker": "^0.6.2",
|
|
"vite-plugin-dts": "3.8.1",
|
|
"vite-plugin-svgr": "^4.2.0",
|
|
"vitest": "1.4.0"
|
|
},
|
|
"engines": {
|
|
"node": "^18.17.1",
|
|
"npm": "please-use-yarn",
|
|
"yarn": ">=4.0.2"
|
|
},
|
|
"license": "AGPL-3.0",
|
|
"name": "twenty",
|
|
"packageManager": "yarn@4.4.0",
|
|
"resolutions": {
|
|
"graphql": "16.8.0",
|
|
"type-fest": "4.10.1",
|
|
"typescript": "5.3.3"
|
|
},
|
|
"version": "0.2.1",
|
|
"nx": {},
|
|
"scripts": {
|
|
"start": "npx concurrently --kill-others 'npx nx run-many -t start -p twenty-server twenty-front' 'npx wait-on tcp:3000 && npx nx run twenty-server:worker'"
|
|
},
|
|
"workspaces": {
|
|
"packages": [
|
|
"packages/twenty-chrome-extension",
|
|
"packages/twenty-front",
|
|
"packages/twenty-server",
|
|
"packages/twenty-emails",
|
|
"packages/twenty-ui",
|
|
"packages/twenty-utils",
|
|
"packages/twenty-zapier",
|
|
"packages/twenty-website",
|
|
"packages/twenty-e2e-testing",
|
|
"tools/eslint-rules"
|
|
]
|
|
}
|
|
}
|