Migrate to a monorepo structure (#2909)
7
packages/twenty-front/.env.example
Normal file
@ -0,0 +1,7 @@
|
||||
REACT_APP_SERVER_BASE_URL=http://localhost:3000
|
||||
GENERATE_SOURCEMAP=false
|
||||
|
||||
# ———————— Optional ————————
|
||||
# REACT_APP_SERVER_AUTH_URL=http://localhost:3000/auth
|
||||
# REACT_APP_SERVER_FILES_URL=http://localhost:3000/files
|
||||
# CHROMATIC_PROJECT_TOKEN=
|
||||
16
packages/twenty-front/.eslintrc-ci.cjs
Normal file
@ -0,0 +1,16 @@
|
||||
module.exports = {
|
||||
overrides: [
|
||||
{
|
||||
files: ['*.stories.tsx', '*.test.ts'],
|
||||
rules: {
|
||||
'no-console': 'off',
|
||||
}
|
||||
},
|
||||
],
|
||||
extends: [
|
||||
'./.eslintrc.cjs'
|
||||
],
|
||||
rules: {
|
||||
'no-console': 'error',
|
||||
}
|
||||
};
|
||||
152
packages/twenty-front/.eslintrc.cjs
Normal file
@ -0,0 +1,152 @@
|
||||
module.exports = {
|
||||
parser: '@typescript-eslint/parser',
|
||||
root: true,
|
||||
env: {
|
||||
browser: true,
|
||||
node: true,
|
||||
jest: true,
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 'latest',
|
||||
sourceType: 'module',
|
||||
project: ['./tsconfig.json', './tsconfig.node.json'],
|
||||
tsconfigRootDir: __dirname,
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/interface-name-prefix': 'off',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
'simple-import-sort/imports': 'error',
|
||||
'simple-import-sort/exports': 'error',
|
||||
'twenty/effect-components': 'error',
|
||||
'twenty/no-hardcoded-colors': 'error',
|
||||
'twenty/matching-state-variable': 'error',
|
||||
'twenty/component-props-naming': 'error',
|
||||
'twenty/sort-css-properties-alphabetically': 'error',
|
||||
'twenty/styled-components-prefixed-with-styled': 'error',
|
||||
'twenty/no-state-useref': 'error',
|
||||
'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
|
||||
'no-unused-vars': 'off',
|
||||
'react/jsx-props-no-spreading': [
|
||||
'error',
|
||||
{
|
||||
explicitSpread: 'ignore',
|
||||
},
|
||||
],
|
||||
'react-hooks/exhaustive-deps': [
|
||||
'warn',
|
||||
{
|
||||
additionalHooks: 'useRecoilCallback',
|
||||
},
|
||||
],
|
||||
'unused-imports/no-unused-imports': 'warn',
|
||||
'unused-imports/no-unused-vars': [
|
||||
'warn',
|
||||
{
|
||||
vars: 'all',
|
||||
varsIgnorePattern: '^_',
|
||||
args: 'after-used',
|
||||
argsIgnorePattern: '^_',
|
||||
},
|
||||
],
|
||||
'no-restricted-imports': [
|
||||
'error',
|
||||
{
|
||||
patterns: [
|
||||
{
|
||||
group: ['@tabler/icons-react'],
|
||||
message: 'Icon imports are only allowed for `@/ui/icon`',
|
||||
},
|
||||
{
|
||||
group: ['react-hotkeys-web-hook'],
|
||||
importNames: ['useHotkeys'],
|
||||
message: 'Please use the custom wrapper: `useScopedHotkeys`',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
'@typescript-eslint/consistent-type-imports': [
|
||||
'error',
|
||||
{ prefer: 'no-type-imports' },
|
||||
],
|
||||
'no-console': ['warn', { allow: ['group', 'groupCollapsed', 'groupEnd'] }],
|
||||
// 'react-refresh/only-export-components': [
|
||||
// 'warn',
|
||||
// { allowConstantExport: true },
|
||||
// ],
|
||||
},
|
||||
settings: {
|
||||
react: {
|
||||
version: 'detect',
|
||||
},
|
||||
},
|
||||
extends: [
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'eslint:recommended',
|
||||
'plugin:react/recommended',
|
||||
'plugin:react-hooks/recommended',
|
||||
'plugin:prettier/recommended',
|
||||
'plugin:storybook/recommended',
|
||||
],
|
||||
plugins: [
|
||||
'@typescript-eslint/eslint-plugin',
|
||||
'simple-import-sort',
|
||||
'unused-imports',
|
||||
'prefer-arrow',
|
||||
'twenty',
|
||||
'react-refresh',
|
||||
],
|
||||
ignorePatterns: [
|
||||
'mockServiceWorker.js',
|
||||
'**/generated*/*',
|
||||
'.eslintrc.cjs',
|
||||
'*.config.cjs',
|
||||
'*.config.ts',
|
||||
'*config.js',
|
||||
'codegen*',
|
||||
],
|
||||
overrides: [
|
||||
{
|
||||
files: ['*.stories.tsx', '*.test.ts'],
|
||||
rules: {
|
||||
'no-console': 'off',
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['*.js', '*.jsx', '*.ts', '*.tsx'],
|
||||
rules: {
|
||||
'react/no-unescaped-entities': 'off',
|
||||
'react/prop-types': 'off',
|
||||
'react/jsx-key': 'off',
|
||||
'react/display-name': 'off',
|
||||
'react/jsx-uses-react': 'off',
|
||||
'react/react-in-jsx-scope': 'off',
|
||||
'no-control-regex': 0,
|
||||
'no-undef': 'off',
|
||||
'simple-import-sort/imports': [
|
||||
'error',
|
||||
{
|
||||
groups: [
|
||||
['^react', '^@?\\w'],
|
||||
['^(@|~)(/.*|$)'],
|
||||
['^\\u0000'],
|
||||
['^\\.\\.(?!/?$)', '^\\.\\./?$'],
|
||||
['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'],
|
||||
['^.+\\.?(css)$'],
|
||||
],
|
||||
},
|
||||
],
|
||||
'prefer-arrow/prefer-arrow-functions': [
|
||||
'error',
|
||||
{
|
||||
disallowPrototype: true,
|
||||
singleReturnOnly: false,
|
||||
classPropertiesAllowed: false,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
41
packages/twenty-front/.gitignore
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/coverage*
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
storybook-static
|
||||
build-storybook.log
|
||||
|
||||
# production
|
||||
/build
|
||||
dist
|
||||
dist-ssr
|
||||
|
||||
# env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
1
packages/twenty-front/.nvmrc
Normal file
@ -0,0 +1 @@
|
||||
18.16.0
|
||||
3
packages/twenty-front/.prettierignore
Normal file
@ -0,0 +1,3 @@
|
||||
**/generated*/
|
||||
*.lock
|
||||
*.yaml
|
||||
5
packages/twenty-front/.prettierrc
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"singleQuote": true,
|
||||
"trailingComma": "all",
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
45
packages/twenty-front/.storybook/main.ts
Normal file
@ -0,0 +1,45 @@
|
||||
import type { StorybookConfig } from '@storybook/react-vite';
|
||||
|
||||
const computeStoriesGlob = () => {
|
||||
if (process.env.STORYBOOK_SCOPE === 'pages') {
|
||||
return [
|
||||
'../src/pages/**/*.stories.@(js|jsx|ts|tsx)',
|
||||
'../src/__stories__/*.stories.@(js|jsx|ts|tsx)',
|
||||
'../src/pages/**/*.docs.mdx',
|
||||
'../src/__stories__/*.docs.mdx'
|
||||
]
|
||||
}
|
||||
|
||||
if (process.env.STORYBOOK_SCOPE === 'modules') {
|
||||
return ['../src/modules/**/*.stories.@(js|jsx|ts|tsx)', '../src/modules/**/*.docs.mdx']
|
||||
}
|
||||
|
||||
if (process.env.STORYBOOK_SCOPE === 'ui-docs') {
|
||||
return ['../src/modules/ui/**/*.docs.mdx'];
|
||||
}
|
||||
|
||||
return ['../src/**/*.docs.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)']
|
||||
};
|
||||
|
||||
const config: StorybookConfig = {
|
||||
stories: computeStoriesGlob(),
|
||||
staticDirs: ['../public'],
|
||||
addons: [
|
||||
'@storybook/addon-links',
|
||||
'@storybook/addon-essentials',
|
||||
'@storybook/addon-onboarding',
|
||||
'@storybook/addon-interactions',
|
||||
'@storybook/addon-coverage',
|
||||
'@storybook/addon-themes',
|
||||
'storybook-addon-cookie',
|
||||
'storybook-addon-pseudo-states',
|
||||
],
|
||||
framework: {
|
||||
name: '@storybook/react-vite',
|
||||
options: {},
|
||||
},
|
||||
docs: {
|
||||
autodocs: false,
|
||||
},
|
||||
};
|
||||
export default config;
|
||||
37
packages/twenty-front/.storybook/preview-head.html
Normal file
@ -0,0 +1,37 @@
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.7/iframeResizer.contentWindow.min.js"></script>
|
||||
<!-- <script>
|
||||
window.global = window;
|
||||
</script> -->
|
||||
|
||||
<style type="text/css">
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: 'Inter', sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
html {
|
||||
font-size: 13px;
|
||||
}
|
||||
.sbdocs-wrapper {
|
||||
padding: 0 !important;
|
||||
}
|
||||
*::-webkit-scrollbar {
|
||||
height: 4px;
|
||||
width: 4px;
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar-corner {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar-thumb {
|
||||
background-color: transparent;
|
||||
border-radius: 2px;
|
||||
}
|
||||
</style>
|
||||
46
packages/twenty-front/.storybook/preview.ts
Normal file
@ -0,0 +1,46 @@
|
||||
import { ThemeProvider } from '@emotion/react';
|
||||
import { Preview, ReactRenderer } from '@storybook/react';
|
||||
import { withThemeFromJSXProvider } from "@storybook/addon-themes";
|
||||
import { initialize, mswLoader } from 'msw-storybook-addon';
|
||||
|
||||
import { RootDecorator } from '../src/testing/decorators/RootDecorator';
|
||||
import { mockedUserJWT } from '../src/testing/mock-data/jwt';
|
||||
|
||||
import { lightTheme, darkTheme } from '../src/modules/ui/theme/constants/theme';
|
||||
import 'react-loading-skeleton/dist/skeleton.css';
|
||||
|
||||
initialize({ onUnhandledRequest: 'bypass' });
|
||||
|
||||
const preview: Preview = {
|
||||
decorators: [
|
||||
withThemeFromJSXProvider<ReactRenderer>({
|
||||
themes: {
|
||||
light: lightTheme,
|
||||
dark: darkTheme,
|
||||
},
|
||||
defaultTheme: 'light',
|
||||
Provider: ThemeProvider,
|
||||
}),
|
||||
RootDecorator,
|
||||
],
|
||||
parameters: {
|
||||
actions: { argTypesRegex: '^on[A-Z].*' },
|
||||
controls: {
|
||||
matchers: {
|
||||
color: /(background|color)$/i,
|
||||
date: /Date$/,
|
||||
},
|
||||
},
|
||||
options: {
|
||||
storySort: {
|
||||
order: ['UI', 'Modules', 'Pages'],
|
||||
},
|
||||
},
|
||||
cookie: {
|
||||
tokenPair: `{%22accessToken%22:{%22token%22:%22${mockedUserJWT}%22%2C%22expiresAt%22:%222023-07-18T15:06:40.704Z%22%2C%22__typename%22:%22AuthToken%22}%2C%22refreshToken%22:{%22token%22:%22${mockedUserJWT}%22%2C%22expiresAt%22:%222023-10-15T15:06:41.558Z%22%2C%22__typename%22:%22AuthToken%22}%2C%22__typename%22:%22AuthTokenPair%22}`,
|
||||
},
|
||||
loaders: [mswLoader],
|
||||
},
|
||||
};
|
||||
|
||||
export default preview;
|
||||
13
packages/twenty-front/.storybook/test-runner-jest.config.js
Normal file
@ -0,0 +1,13 @@
|
||||
import { getJestConfig } from "@storybook/test-runner";
|
||||
|
||||
/**
|
||||
* @type {import('@jest/types').Config.InitialOptions}
|
||||
*/
|
||||
export default {
|
||||
// The default configuration comes from @storybook/test-runner
|
||||
...getJestConfig(),
|
||||
/** Add your own overrides below
|
||||
* @see https://jestjs.io/docs/configuration
|
||||
*/
|
||||
testTimeout: process.env.STORYBOOK_SCOPE === 'pages' ? 60000 : 15000,
|
||||
};
|
||||
31
packages/twenty-front/.swcrc
Normal file
@ -0,0 +1,31 @@
|
||||
{
|
||||
"jsc": {
|
||||
"target": "es2017",
|
||||
"parser": {
|
||||
"syntax": "typescript",
|
||||
"tsx": true,
|
||||
"decorators": false,
|
||||
"dynamicImport": false
|
||||
},
|
||||
"transform": {
|
||||
"react": {
|
||||
"pragma": "React.createElement",
|
||||
"pragmaFrag": "React.Fragment",
|
||||
"throwIfNamespace": true,
|
||||
"development": false,
|
||||
"useBuiltins": false,
|
||||
"runtime": "automatic"
|
||||
},
|
||||
"hidden": {
|
||||
"jest": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"module": {
|
||||
"type": "commonjs",
|
||||
"strict": false,
|
||||
"strictMode": true,
|
||||
"lazy": false,
|
||||
"noInterop": false
|
||||
}
|
||||
}
|
||||
1
packages/twenty-front/README.md
Normal file
@ -0,0 +1 @@
|
||||
Run `yarn dev` while server running on port `3000`
|
||||
13
packages/twenty-front/codegen-metadata.cjs
Normal file
@ -0,0 +1,13 @@
|
||||
module.exports = {
|
||||
schema: process.env.REACT_APP_SERVER_BASE_URL + "/metadata",
|
||||
documents: ['./src/modules/object-metadata/graphql/*.ts', './src/modules/object-record/graphql/*.tsx', './src/modules/metadata/graphql/*.ts'],
|
||||
overwrite: true,
|
||||
generates: {
|
||||
'./src/generated-metadata/': {
|
||||
preset: 'client',
|
||||
presetConfig: {
|
||||
fragmentMasking: false
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
23
packages/twenty-front/codegen.cjs
Normal file
@ -0,0 +1,23 @@
|
||||
module.exports = {
|
||||
schema: process.env.REACT_APP_SERVER_BASE_URL + "/graphql",
|
||||
documents: ['!./src/modules/object-metadata/**', '!./src/modules/object-record/**', './src/modules/**/*.tsx', './src/modules/**/*.ts'],
|
||||
overwrite: true,
|
||||
generates: {
|
||||
'./src/generated/graphql.tsx': {
|
||||
plugins: [
|
||||
'typescript',
|
||||
'typescript-operations',
|
||||
'typescript-react-apollo',
|
||||
],
|
||||
config: {
|
||||
skipTypename: false,
|
||||
withHooks: true,
|
||||
withHOC: false,
|
||||
withComponent: false,
|
||||
scalars: {
|
||||
DateTime: 'string',
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
39
packages/twenty-front/index.html
Normal file
@ -0,0 +1,39 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
|
||||
<link rel="icon" href="/icons/android/android-launchericon-48-48.png" />
|
||||
<link rel="apple-touch-icon" href="/icons/ios/192.png" />
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta name="description" content="A modern open-source CRM" />
|
||||
<meta
|
||||
property="og:image"
|
||||
content="https://raw.githubusercontent.com/twentyhq/twenty/main/docs/static/img/social-card.png"
|
||||
/>
|
||||
<meta property="og:description" content="A modern open-source CRM" />
|
||||
<meta property="og:title" content="Twenty" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta
|
||||
name="twitter:image"
|
||||
content="https://raw.githubusercontent.com/twentyhq/twenty/main/docs/static/img/social-card.png"
|
||||
/>
|
||||
|
||||
<meta name="twitter:description" content="A modern open-source CRM" />
|
||||
<meta name="twitter:title" content="Twenty" />
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"
|
||||
/>
|
||||
|
||||
<title>Twenty</title>
|
||||
<script src="/env-config.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/index.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
17
packages/twenty-front/jest.config.js
Normal file
@ -0,0 +1,17 @@
|
||||
export default {
|
||||
setupFilesAfterEnv: ["./src/setupTests.ts"],
|
||||
testEnvironment: "jsdom",
|
||||
transform: {
|
||||
"^.+\\.(ts|js|tsx|jsx)$": "@swc/jest",
|
||||
},
|
||||
moduleNameMapper: {
|
||||
'~/(.+)': "<rootDir>/src/$1",
|
||||
'@/(.+)': "<rootDir>/src/modules/$1",
|
||||
'@testing/(.+)': "<rootDir>/src/testing/$1",
|
||||
},
|
||||
extensionsToTreatAsEsm: ['.ts', '.tsx'],
|
||||
// collectCoverage: true,
|
||||
// collectCoverageFrom: ['<rootDir>/src/**/*.{ts,tsx}'],
|
||||
// coveragePathIgnorePatterns: ['(tests/.*.mock).(jsx?|tsx?)$', '(.*).d.ts$'],
|
||||
// coverageDirectory: '<rootDir>/coverage/',
|
||||
}
|
||||
35
packages/twenty-front/nyc.config.cjs
Normal file
@ -0,0 +1,35 @@
|
||||
const globalCoverage = {
|
||||
"statements": 60,
|
||||
"lines": 60,
|
||||
"functions": 60,
|
||||
"exclude": [
|
||||
"src/generated/**/*",
|
||||
]
|
||||
};
|
||||
|
||||
const modulesCoverage = {
|
||||
"statements": 50,
|
||||
"lines": 50,
|
||||
"functions": 45,
|
||||
"include": [
|
||||
"src/modules/**/*",
|
||||
]
|
||||
};
|
||||
|
||||
const pagesCoverage = {
|
||||
"statements": 50,
|
||||
"lines": 50,
|
||||
"functions": 45,
|
||||
"exclude": [
|
||||
"src/generated/**/*",
|
||||
"src/modules/**/*",
|
||||
]
|
||||
};
|
||||
|
||||
const storybookStoriesFolders = process.env.STORYBOOK_SCOPE;
|
||||
|
||||
module.exports = storybookStoriesFolders === 'pages'
|
||||
? pagesCoverage
|
||||
: storybookStoriesFolders === 'modules'
|
||||
? modulesCoverage
|
||||
: globalCoverage;
|
||||
177
packages/twenty-front/package.json
Normal file
@ -0,0 +1,177 @@
|
||||
{
|
||||
"name": "twenty-front",
|
||||
"version": "0.2.1",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"dev:clean": "yarn dev --force",
|
||||
"build": "tsc && vite build && yarn build:inject-runtime-env",
|
||||
"build:inject-runtime-env": "./scripts/inject-runtime-env.sh",
|
||||
"preview": "vite preview",
|
||||
"eslint-plugin:setup": "cd ../packages/eslint-plugin-twenty/ && yarn && yarn build && cd ../../front/ && yarn upgrade eslint-plugin-twenty",
|
||||
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
||||
"fmt:fix": "prettier --cache --write \"src/**/*.ts\" \"src/**/*.tsx\"",
|
||||
"fmt": "prettier --check \"src/**/*.ts\" \"src/**/*.tsx\"",
|
||||
"test": "jest",
|
||||
"coverage": "jest --coverage",
|
||||
"storybook:modules:dev": "STORYBOOK_SCOPE=modules yarn storybook:dev",
|
||||
"storybook:dev": "storybook dev -p 6006 --no-open",
|
||||
"storybook:pages:dev": "STORYBOOK_SCOPE=pages yarn storybook:dev",
|
||||
"storybook:docs:dev": "STORYBOOK_SCOPE=ui-docs yarn storybook:dev",
|
||||
"storybook:build": "storybook build",
|
||||
"storybook:modules:build": "STORYBOOK_SCOPE=modules yarn storybook:build",
|
||||
"storybook:pages:build": "STORYBOOK_SCOPE=pages yarn storybook:build",
|
||||
"storybook:docs:build": "STORYBOOK_SCOPE=ui-docs yarn storybook:build",
|
||||
"storybook:test": "test-storybook",
|
||||
"storybook:test-slow": "test-storybook --maxWorkers=3",
|
||||
"storybook:coverage": "yarn storybook:test-slow --coverage && npx nyc report --reporter=lcov -t coverage/storybook --report-dir coverage/storybook --check-coverage",
|
||||
"storybook:modules:coverage": "STORYBOOK_SCOPE=modules yarn storybook:coverage",
|
||||
"storybook:pages:coverage": "STORYBOOK_SCOPE=pages yarn storybook:coverage",
|
||||
"graphql:data:generate": "dotenv cross-var graphql-codegen -- --config codegen.cjs",
|
||||
"graphql:metadata:generate": "dotenv cross-var graphql-codegen -- --config codegen-metadata.cjs",
|
||||
"chromatic": "dotenv cross-var npx chromatic --project-token=$CHROMATIC_PROJECT_TOKEN"
|
||||
},
|
||||
"dependencies": {
|
||||
"@air/react-drag-to-select": "^5.0.8",
|
||||
"@apollo/client": "^3.7.17",
|
||||
"@blocknote/core": "^0.10.1",
|
||||
"@blocknote/react": "^0.10.1",
|
||||
"@chakra-ui/accordion": "^2.3.0",
|
||||
"@chakra-ui/system": "^2.6.0",
|
||||
"@emotion/react": "^11.10.6",
|
||||
"@emotion/styled": "^11.10.5",
|
||||
"@floating-ui/react": "^0.24.3",
|
||||
"@hello-pangea/dnd": "^16.2.0",
|
||||
"@hookform/resolvers": "^3.1.1",
|
||||
"@sniptt/guards": "^0.2.0",
|
||||
"@swc/core": "^1.3.100",
|
||||
"@swc/jest": "^0.2.29",
|
||||
"@tabler/icons-react": "^2.30.0",
|
||||
"afterframe": "^1.0.2",
|
||||
"apollo-upload-client": "^17.0.0",
|
||||
"date-fns": "^2.30.0",
|
||||
"deep-equal": "^2.2.2",
|
||||
"framer-motion": "^10.12.17",
|
||||
"graphql": "^16.6.0",
|
||||
"hex-rgb": "^5.0.0",
|
||||
"immer": "^10.0.2",
|
||||
"js-cookie": "^3.0.5",
|
||||
"js-levenshtein": "^1.1.6",
|
||||
"libphonenumber-js": "^1.10.26",
|
||||
"lodash.camelcase": "^4.3.0",
|
||||
"lodash.debounce": "^4.0.8",
|
||||
"lodash.kebabcase": "^4.1.1",
|
||||
"lodash.snakecase": "^4.1.1",
|
||||
"luxon": "^3.3.0",
|
||||
"react": "^18.2.0",
|
||||
"react-data-grid": "7.0.0-beta.13",
|
||||
"react-datepicker": "^4.11.0",
|
||||
"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.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",
|
||||
"recoil": "^0.7.7",
|
||||
"scroll-into-view": "^1.16.2",
|
||||
"ts-key-enum": "^2.0.12",
|
||||
"type-fest": "^4.1.0",
|
||||
"uuid": "^9.0.0",
|
||||
"vite-tsconfig-paths": "^4.2.1",
|
||||
"xlsx-ugnis": "^0.19.3",
|
||||
"zod": "^3.22.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@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",
|
||||
"@storybook/addon-actions": "^7.6.3",
|
||||
"@storybook/addon-coverage": "^1.0.0",
|
||||
"@storybook/addon-essentials": "^7.6.3",
|
||||
"@storybook/addon-interactions": "^7.6.3",
|
||||
"@storybook/addon-links": "^7.6.3",
|
||||
"@storybook/addon-onboarding": "^1.0.9",
|
||||
"@storybook/addon-themes": "^7.6.3",
|
||||
"@storybook/blocks": "^7.6.3",
|
||||
"@storybook/react": "^7.6.3",
|
||||
"@storybook/react-vite": "^7.6.3",
|
||||
"@storybook/test": "^7.6.3",
|
||||
"@storybook/test-runner": "^0.16.0",
|
||||
"@testing-library/jest-dom": "^6.1.5",
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@types/apollo-upload-client": "^17.0.2",
|
||||
"@types/deep-equal": "^1.0.1",
|
||||
"@types/jest": "^29.5.10",
|
||||
"@types/js-cookie": "^3.0.3",
|
||||
"@types/lodash.camelcase": "^4.3.7",
|
||||
"@types/lodash.debounce": "^4.0.7",
|
||||
"@types/lodash.kebabcase": "^4.1.7",
|
||||
"@types/lodash.snakecase": "^4.1.9",
|
||||
"@types/luxon": "^3.3.0",
|
||||
"@types/node": "^20.10.0",
|
||||
"@types/react": "^18.2.39",
|
||||
"@types/react-datepicker": "^4.11.2",
|
||||
"@types/react-dom": "^18.2.15",
|
||||
"@types/scroll-into-view": "^1.16.0",
|
||||
"@types/uuid": "^9.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^6.10.0",
|
||||
"@typescript-eslint/parser": "^6.10.0",
|
||||
"@vitejs/plugin-react-swc": "^3.5.0",
|
||||
"chromatic": "^6.18.0",
|
||||
"concurrently": "^8.0.1",
|
||||
"cross-var": "^1.1.0",
|
||||
"dotenv-cli": "^7.2.1",
|
||||
"eslint": "^8.53.0",
|
||||
"eslint-config-prettier": "^9.0.0",
|
||||
"eslint-plugin-prefer-arrow": "^1.2.3",
|
||||
"eslint-plugin-prettier": "^5.0.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-twenty": "file:../eslint-plugin-twenty",
|
||||
"eslint-plugin-unused-imports": "^3.0.0",
|
||||
"http-server": "^14.1.1",
|
||||
"jest": "29.7.0",
|
||||
"jest-environment-jsdom": "29.7.0",
|
||||
"msw": "1.3.2",
|
||||
"msw-storybook-addon": "^1.10.0",
|
||||
"prettier": "^3.1.0",
|
||||
"storybook": "^7.6.3",
|
||||
"storybook-addon-cookie": "^3.1.0",
|
||||
"storybook-addon-pseudo-states": "^2.1.2",
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^5.0.0",
|
||||
"vite-plugin-svgr": "^4.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.16.0",
|
||||
"npm": "please-use-yarn"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
},
|
||||
"msw": {
|
||||
"workerDirectory": "public"
|
||||
}
|
||||
}
|
||||
3
packages/twenty-front/public/env-config.js
Normal file
@ -0,0 +1,3 @@
|
||||
window._env_ = {
|
||||
// This file should stay empty. It will be overwritten by the build process.
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 1014 B |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
BIN
packages/twenty-front/public/icons/ios/100.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
packages/twenty-front/public/icons/ios/1024.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
packages/twenty-front/public/icons/ios/114.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
packages/twenty-front/public/icons/ios/120.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
packages/twenty-front/public/icons/ios/128.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
packages/twenty-front/public/icons/ios/144.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
packages/twenty-front/public/icons/ios/152.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
packages/twenty-front/public/icons/ios/16.png
Normal file
|
After Width: | Height: | Size: 432 B |
BIN
packages/twenty-front/public/icons/ios/167.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
packages/twenty-front/public/icons/ios/180.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
packages/twenty-front/public/icons/ios/192.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
packages/twenty-front/public/icons/ios/20.png
Normal file
|
After Width: | Height: | Size: 471 B |
BIN
packages/twenty-front/public/icons/ios/256.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
packages/twenty-front/public/icons/ios/29.png
Normal file
|
After Width: | Height: | Size: 618 B |
BIN
packages/twenty-front/public/icons/ios/32.png
Normal file
|
After Width: | Height: | Size: 701 B |
BIN
packages/twenty-front/public/icons/ios/40.png
Normal file
|
After Width: | Height: | Size: 850 B |
BIN
packages/twenty-front/public/icons/ios/50.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
packages/twenty-front/public/icons/ios/512.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
packages/twenty-front/public/icons/ios/57.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
packages/twenty-front/public/icons/ios/58.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
packages/twenty-front/public/icons/ios/60.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
packages/twenty-front/public/icons/ios/64.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
packages/twenty-front/public/icons/ios/72.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
packages/twenty-front/public/icons/ios/76.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
packages/twenty-front/public/icons/ios/80.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
packages/twenty-front/public/icons/ios/87.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 432 B |
|
After Width: | Height: | Size: 471 B |
|
After Width: | Height: | Size: 594 B |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 660 B |
|
After Width: | Height: | Size: 701 B |
|
After Width: | Height: | Size: 859 B |
|
After Width: | Height: | Size: 850 B |
|
After Width: | Height: | Size: 917 B |
|
After Width: | Height: | Size: 1014 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 432 B |
|
After Width: | Height: | Size: 471 B |
|
After Width: | Height: | Size: 594 B |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 660 B |
|
After Width: | Height: | Size: 701 B |
|
After Width: | Height: | Size: 859 B |
|
After Width: | Height: | Size: 850 B |
|
After Width: | Height: | Size: 917 B |
|
After Width: | Height: | Size: 1014 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |