From 866398111f424ff4f55b965ccf19254e19c01ad3 Mon Sep 17 00:00:00 2001 From: gustavoschaedler Date: Mon, 19 Jun 2023 23:02:06 +0100 Subject: [PATCH 01/91] WIP: Login auth and JWT encode/decode --- poetry.lock | 316 +++++++--------------------------- pyproject.toml | 3 + src/backend/langflow/login.py | 143 +++++++++++++++ src/backend/langflow/main.py | 142 ++++++++++++++- 4 files changed, 350 insertions(+), 254 deletions(-) create mode 100644 src/backend/langflow/login.py diff --git a/poetry.lock b/poetry.lock index 015f3caaf..7567c137e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "aiofiles" version = "23.1.0" description = "File support for asyncio." -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -16,7 +15,6 @@ files = [ name = "aiohttp" version = "3.8.4" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -125,7 +123,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -140,7 +137,6 @@ frozenlist = ">=1.1.0" name = "aiostream" version = "0.4.5" description = "Generator-based operators for asynchronous iteration" -category = "main" optional = false python-versions = "*" files = [ @@ -152,7 +148,6 @@ files = [ name = "anthropic" version = "0.2.10" description = "Library for accessing the anthropic API" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -173,7 +168,6 @@ dev = ["black (>=22.3.0)", "pytest"] name = "anyio" version = "3.7.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -195,7 +189,6 @@ trio = ["trio (<0.22)"] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -207,7 +200,6 @@ files = [ name = "argilla" version = "0.0.1" description = "" -category = "main" optional = false python-versions = "*" files = [ @@ -219,7 +211,6 @@ files = [ name = "asgiref" version = "3.7.2" description = "ASGI specs, helper code, and adapters" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -237,7 +228,6 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -255,7 +245,6 @@ test = ["astroid", "pytest"] name = "async-timeout" version = "4.0.2" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -267,7 +256,6 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -286,7 +274,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "authlib" version = "1.2.0" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." -category = "main" optional = false python-versions = "*" files = [ @@ -301,7 +288,6 @@ cryptography = ">=3.2" name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -313,7 +299,6 @@ files = [ name = "backoff" version = "2.2.1" description = "Function decoration for backoff and retry" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -321,11 +306,44 @@ files = [ {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] +[[package]] +name = "bcrypt" +version = "4.0.1" +description = "Modern password hashing for your software and your servers" +optional = false +python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + [[package]] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -344,7 +362,6 @@ lxml = ["lxml"] name = "black" version = "23.3.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -394,7 +411,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "cachetools" version = "5.3.1" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -406,7 +422,6 @@ files = [ name = "certifi" version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -418,7 +433,6 @@ files = [ name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -495,7 +509,6 @@ pycparser = "*" name = "chardet" version = "5.1.0" description = "Universal encoding detector for Python 3" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -507,7 +520,6 @@ files = [ name = "charset-normalizer" version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -592,7 +604,6 @@ files = [ name = "chromadb" version = "0.3.26" description = "Chroma." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -622,7 +633,6 @@ uvicorn = {version = ">=0.18.3", extras = ["standard"]} name = "click" version = "8.1.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -637,7 +647,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "clickhouse-connect" version = "0.6.3" description = "ClickHouse Database Core Driver for Python, Pandas, and Superset" -category = "main" optional = false python-versions = "~=3.7" files = [ @@ -726,7 +735,6 @@ sqlalchemy = ["sqlalchemy (>1.3.21,<2.0)"] name = "cohere" version = "4.9.0" description = "" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -743,7 +751,6 @@ requests = ">=2.0,<3.0" name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -755,7 +762,6 @@ files = [ name = "coloredlogs" version = "15.0.1" description = "Colored terminal output for Python's logging module" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -773,7 +779,6 @@ cron = ["capturer (>=2.4)"] name = "comm" version = "0.1.3" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -793,7 +798,6 @@ typing = ["mypy (>=0.990)"] name = "coverage" version = "7.2.7" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -869,7 +873,6 @@ toml = ["tomli"] name = "cryptography" version = "41.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -911,7 +914,6 @@ test-randomorder = ["pytest-randomly"] name = "ctransformers" version = "0.2.8" description = "Python bindings for the Transformer models implemented in C/C++ using GGML library." -category = "main" optional = false python-versions = "*" files = [ @@ -929,7 +931,6 @@ tests = ["pytest"] name = "dataclasses-json" version = "0.5.8" description = "Easily serialize dataclasses to and from JSON" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -949,7 +950,6 @@ dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest ( name = "debugpy" version = "1.6.7" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -977,7 +977,6 @@ files = [ name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -989,7 +988,6 @@ files = [ name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1007,7 +1005,6 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] name = "dill" version = "0.3.6" description = "serialize all of python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1022,7 +1019,6 @@ graph = ["objgraph (>=1.7.2)"] name = "docarray" version = "0.21.0" description = "The data structure for unstructured data" -category = "main" optional = false python-versions = "*" files = [ @@ -1051,7 +1047,6 @@ weaviate = ["weaviate-client (>=3.9.0,<3.10.0)"] name = "docker" version = "6.1.3" description = "A Python library for the Docker Engine API." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1073,7 +1068,6 @@ ssh = ["paramiko (>=2.4.3)"] name = "docstring-parser" version = "0.15" description = "Parse Python docstrings in reST, Google and Numpydoc format" -category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -1085,7 +1079,6 @@ files = [ name = "duckdb" version = "0.8.1" description = "DuckDB embedded database" -category = "main" optional = false python-versions = "*" files = [ @@ -1147,7 +1140,6 @@ files = [ name = "ecdsa" version = "0.18.0" description = "ECDSA cryptographic signature library (pure python)" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1166,7 +1158,6 @@ gmpy2 = ["gmpy2"] name = "et-xmlfile" version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1178,7 +1169,6 @@ files = [ name = "exceptiongroup" version = "1.1.1" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1193,7 +1183,6 @@ test = ["pytest (>=6)"] name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" files = [ @@ -1208,7 +1197,6 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] name = "faiss-cpu" version = "1.7.4" description = "A library for efficient similarity search and clustering of dense vectors." -category = "main" optional = false python-versions = "*" files = [ @@ -1243,7 +1231,6 @@ files = [ name = "fake-useragent" version = "1.1.3" description = "Up-to-date simple useragent faker with real world database" -category = "main" optional = false python-versions = "*" files = [ @@ -1258,7 +1245,6 @@ importlib-resources = {version = ">=5.0", markers = "python_version < \"3.10\""} name = "fastapi" version = "0.97.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1277,7 +1263,6 @@ all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" name = "filelock" version = "3.12.2" description = "A platform independent file lock." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1293,7 +1278,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p name = "flatbuffers" version = "23.5.26" description = "The FlatBuffers serialization format for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1305,7 +1289,6 @@ files = [ name = "frozenlist" version = "1.3.3" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1389,7 +1372,6 @@ files = [ name = "google-api-core" version = "2.11.1" description = "Google API client core library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1412,7 +1394,6 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] name = "google-api-python-client" version = "2.89.0" description = "Google API Client Library for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1421,7 +1402,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0.dev0" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" google-auth = ">=1.19.0,<3.0.0.dev0" google-auth-httplib2 = ">=0.1.0" httplib2 = ">=0.15.0,<1.dev0" @@ -1431,7 +1412,6 @@ uritemplate = ">=3.0.1,<5" name = "google-auth" version = "2.20.0" description = "Google Authentication Library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1457,7 +1437,6 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-auth-httplib2" version = "0.1.0" description = "Google Authentication Library: httplib2 transport" -category = "main" optional = false python-versions = "*" files = [ @@ -1474,7 +1453,6 @@ six = "*" name = "google-search-results" version = "2.4.2" description = "Scrape and search localized results from Google, Bing, Baidu, Yahoo, Yandex, Ebay, Homedepot, youtube at scale using SerpApi.com" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1488,7 +1466,6 @@ requests = "*" name = "googleapis-common-protos" version = "1.59.1" description = "Common protobufs used in Google APIs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1506,7 +1483,6 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -1580,7 +1556,6 @@ test = ["objgraph", "psutil"] name = "grpcio" version = "1.47.5" description = "HTTP/2-based RPC framework" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1642,7 +1617,6 @@ protobuf = ["grpcio-tools (>=1.47.5)"] name = "grpcio-health-checking" version = "1.47.5" description = "Standard Health Checking Service for gRPC" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1658,7 +1632,6 @@ protobuf = ">=3.12.0" name = "grpcio-reflection" version = "1.47.5" description = "Standard Protobuf Reflection Service for gRPC" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1674,7 +1647,6 @@ protobuf = ">=3.12.0" name = "grpcio-tools" version = "1.47.5" description = "Protobuf code generator for gRPC" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1735,7 +1707,6 @@ setuptools = "*" name = "gunicorn" version = "20.1.0" description = "WSGI HTTP Server for UNIX" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1756,7 +1727,6 @@ tornado = ["tornado (>=0.2)"] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1768,7 +1738,6 @@ files = [ name = "h2" version = "4.1.0" description = "HTTP/2 State-Machine based protocol implementation" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1784,7 +1753,6 @@ hyperframe = ">=6.0,<7" name = "hnswlib" version = "0.7.0" description = "hnswlib" -category = "main" optional = false python-versions = "*" files = [ @@ -1798,7 +1766,6 @@ numpy = "*" name = "hpack" version = "4.0.0" description = "Pure-Python HPACK header compression" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1810,7 +1777,6 @@ files = [ name = "httpcore" version = "0.16.3" description = "A minimal low-level HTTP client." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1822,17 +1788,16 @@ files = [ anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" +sniffio = "==1.*" [package.extras] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "httplib2" version = "0.22.0" description = "A comprehensive HTTP client library." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1847,7 +1812,6 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 name = "httptools" version = "0.5.0" description = "A collection of framework independent HTTP protocol utils." -category = "main" optional = false python-versions = ">=3.5.0" files = [ @@ -1901,7 +1865,6 @@ test = ["Cython (>=0.29.24,<0.30.0)"] name = "httpx" version = "0.23.3" description = "The next generation HTTP client." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1918,15 +1881,14 @@ sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" version = "0.13.4" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -1957,7 +1919,6 @@ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "t name = "humanfriendly" version = "10.0" description = "Human friendly output for text interfaces using Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1972,7 +1933,6 @@ pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_ve name = "hyperframe" version = "6.0.1" description = "HTTP/2 framing layer for Python" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1984,7 +1944,6 @@ files = [ name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1996,7 +1955,6 @@ files = [ name = "importlib-metadata" version = "4.13.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2016,7 +1974,6 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag name = "importlib-resources" version = "5.12.0" description = "Read resources from Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2035,7 +1992,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2047,7 +2003,6 @@ files = [ name = "ipykernel" version = "6.23.2" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2061,7 +2016,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -2081,7 +2036,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "8.14.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -2121,7 +2075,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "jcloud" version = "0.2.12" description = "Simplify deploying and managing Jina projects on Jina Cloud" -category = "main" optional = false python-versions = "*" files = [ @@ -2144,7 +2097,6 @@ test = ["black (==22.3.0)", "jina (>=3.7.0)", "mock", "pytest", "pytest-asyncio" name = "jedi" version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2164,7 +2116,6 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jina" version = "3.15.2" description = "Build multimodal AI services via cloud native technologies · Neural Search · Generative AI · MLOps" -category = "main" optional = false python-versions = "*" files = [ @@ -2282,7 +2233,6 @@ websockets = ["websockets"] name = "jina-hubble-sdk" version = "0.38.0" description = "SDK for Hubble API at Jina AI." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -2308,7 +2258,6 @@ full = ["aiohttp", "black (==22.3.0)", "docker", "filelock", "flake8 (==4.0.1)", name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2326,7 +2275,6 @@ i18n = ["Babel (>=2.7)"] name = "joblib" version = "1.2.0" description = "Lightweight pipelining with Python functions" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2338,7 +2286,6 @@ files = [ name = "jupyter-client" version = "8.2.0" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2348,7 +2295,7 @@ files = [ [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -2362,7 +2309,6 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt name = "jupyter-core" version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2383,7 +2329,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "langchain" version = "0.0.202" description = "Building applications with LLMs through composability" -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -2421,7 +2366,6 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] name = "langchain-serve" version = "0.0.45" description = "Langchain Serve - serve your langchain apps on Jina AI Cloud." -category = "main" optional = true python-versions = "*" files = [ @@ -2446,7 +2390,6 @@ test = ["psutil", "pytest", "pytest-asyncio"] name = "langchainplus-sdk" version = "0.0.10" description = "Client library to connect to the LangChainPlus LLM Tracing and Evaluation Platform." -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -2463,7 +2406,6 @@ tenacity = ">=8.1.0,<9.0.0" name = "llama-cpp-python" version = "0.1.55" description = "A Python wrapper for llama.cpp" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2477,7 +2419,6 @@ typing-extensions = ">=4.5.0,<5.0.0" name = "lxml" version = "4.9.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ @@ -2570,7 +2511,6 @@ source = ["Cython (>=0.29.7)"] name = "lz4" version = "4.3.2" description = "LZ4 Bindings for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2620,7 +2560,6 @@ tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] name = "markdown" version = "3.4.3" description = "Python implementation of John Gruber's Markdown." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2638,7 +2577,6 @@ testing = ["coverage", "pyyaml"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2663,7 +2601,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2723,7 +2660,6 @@ files = [ name = "marshmallow" version = "3.19.0" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2744,7 +2680,6 @@ tests = ["pytest", "pytz", "simplejson"] name = "marshmallow-enum" version = "1.5.1" description = "Enum field for Marshmallow" -category = "main" optional = false python-versions = "*" files = [ @@ -2759,7 +2694,6 @@ marshmallow = ">=2.0.0" name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2774,7 +2708,6 @@ traitlets = "*" name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2786,7 +2719,6 @@ files = [ name = "monotonic" version = "1.6" description = "An implementation of time.monotonic() for Python 2 & < 3.3" -category = "main" optional = false python-versions = "*" files = [ @@ -2798,7 +2730,6 @@ files = [ name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" -category = "main" optional = false python-versions = "*" files = [ @@ -2816,7 +2747,6 @@ tests = ["pytest (>=4.6)"] name = "msg-parser" version = "1.2.0" description = "This module enables reading, parsing and converting Microsoft Outlook MSG E-Mail files." -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -2834,7 +2764,6 @@ rtf = ["compressed-rtf (>=1.0.5)"] name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2918,7 +2847,6 @@ files = [ name = "multiprocess" version = "0.70.14" description = "better multiprocessing and multithreading in python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2945,7 +2873,6 @@ dill = ">=0.3.6" name = "mypy" version = "1.3.0" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2992,7 +2919,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -3004,7 +2930,6 @@ files = [ name = "nanoid" version = "2.0.0" description = "A tiny, secure, URL-friendly, unique string ID generator for Python" -category = "main" optional = true python-versions = "*" files = [ @@ -3016,7 +2941,6 @@ files = [ name = "nest-asyncio" version = "1.5.6" description = "Patch asyncio to allow nested event loops" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -3028,7 +2952,6 @@ files = [ name = "networkx" version = "3.1" description = "Python package for creating and manipulating graphs and networks" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3047,7 +2970,6 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] name = "nltk" version = "3.8.1" description = "Natural Language Toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3073,7 +2995,6 @@ twitter = ["twython"] name = "numexpr" version = "2.8.4" description = "Fast numerical expression evaluator for NumPy" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3116,7 +3037,6 @@ numpy = ">=1.13.3" name = "numpy" version = "1.25.0" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ @@ -3151,7 +3071,6 @@ files = [ name = "olefile" version = "0.46" description = "Python package to parse, read and write Microsoft OLE2 files (Structured Storage or Compound Document, Microsoft Office)" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3162,7 +3081,6 @@ files = [ name = "onnxruntime" version = "1.15.1" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" -category = "main" optional = false python-versions = "*" files = [ @@ -3204,7 +3122,6 @@ sympy = "*" name = "openai" version = "0.27.8" description = "Python client library for the OpenAI API" -category = "main" optional = false python-versions = ">=3.7.1" files = [ @@ -3219,7 +3136,7 @@ tqdm = "*" [package.extras] datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)", "pytest-asyncio", "pytest-mock"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] @@ -3227,7 +3144,6 @@ wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1 name = "openapi-schema-pydantic" version = "1.2.4" description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -3242,7 +3158,6 @@ pydantic = ">=1.8.2" name = "openpyxl" version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3257,7 +3172,6 @@ et-xmlfile = "*" name = "opentelemetry-api" version = "1.16.0" description = "OpenTelemetry Python API" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3273,7 +3187,6 @@ setuptools = ">=16.0" name = "opentelemetry-exporter-otlp" version = "1.16.0" description = "OpenTelemetry Collector Exporters" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3289,7 +3202,6 @@ opentelemetry-exporter-otlp-proto-http = "1.16.0" name = "opentelemetry-exporter-otlp-proto-grpc" version = "1.16.0" description = "OpenTelemetry Collector Protobuf over gRPC Exporter" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3312,7 +3224,6 @@ test = ["pytest-grpc"] name = "opentelemetry-exporter-otlp-proto-http" version = "1.16.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3335,7 +3246,6 @@ test = ["responses (==0.22.0)"] name = "opentelemetry-exporter-prometheus" version = "1.12.0rc1" description = "Prometheus Metric Exporter for OpenTelemetry" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3352,7 +3262,6 @@ prometheus-client = ">=0.5.0,<1.0.0" name = "opentelemetry-instrumentation" version = "0.37b0" description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3369,7 +3278,6 @@ wrapt = ">=1.0.0,<2.0.0" name = "opentelemetry-instrumentation-aiohttp-client" version = "0.37b0" description = "OpenTelemetry aiohttp client instrumentation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3392,7 +3300,6 @@ test = ["opentelemetry-instrumentation-aiohttp-client[instruments]"] name = "opentelemetry-instrumentation-asgi" version = "0.37b0" description = "ASGI instrumentation for OpenTelemetry" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3415,7 +3322,6 @@ test = ["opentelemetry-instrumentation-asgi[instruments]", "opentelemetry-test-u name = "opentelemetry-instrumentation-fastapi" version = "0.37b0" description = "OpenTelemetry FastAPI Instrumentation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3438,7 +3344,6 @@ test = ["httpx (>=0.22,<1.0)", "opentelemetry-instrumentation-fastapi[instrument name = "opentelemetry-instrumentation-grpc" version = "0.37b0" description = "OpenTelemetry gRPC instrumentation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3461,7 +3366,6 @@ test = ["opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-sdk (> name = "opentelemetry-proto" version = "1.16.0" description = "OpenTelemetry Python Proto" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3476,7 +3380,6 @@ protobuf = ">=3.19,<5.0" name = "opentelemetry-sdk" version = "1.16.0" description = "OpenTelemetry Python SDK" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3494,7 +3397,6 @@ typing-extensions = ">=3.7.4" name = "opentelemetry-semantic-conventions" version = "0.37b0" description = "OpenTelemetry Semantic Conventions" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3506,7 +3408,6 @@ files = [ name = "opentelemetry-util-http" version = "0.37b0" description = "Web util for OpenTelemetry" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3518,7 +3419,6 @@ files = [ name = "orjson" version = "3.9.1" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3574,7 +3474,6 @@ files = [ name = "overrides" version = "7.3.1" description = "A decorator to automatically detect mismatch when overriding a method." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3586,7 +3485,6 @@ files = [ name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3598,7 +3496,6 @@ files = [ name = "pandas" version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3647,7 +3544,6 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] name = "pandas-stubs" version = "2.0.2.230605" description = "Type annotations for pandas" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3663,7 +3559,6 @@ types-pytz = ">=2022.1.1" name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3675,11 +3570,27 @@ files = [ qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["docopt", "pytest (<6.0.0)"] +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +optional = false +python-versions = "*" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + [[package]] name = "pathspec" version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3691,7 +3602,6 @@ files = [ name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -3706,7 +3616,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -3718,7 +3627,6 @@ files = [ name = "pillow" version = "9.5.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3798,7 +3706,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "platformdirs" version = "3.6.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3814,7 +3721,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest- name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3830,7 +3736,6 @@ testing = ["pytest", "pytest-benchmark"] name = "portalocker" version = "2.7.0" description = "Wraps the portalocker recipe for easy usage" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -3850,7 +3755,6 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p name = "posthog" version = "3.0.1" description = "Integrate PostHog into any python application." -category = "main" optional = false python-versions = "*" files = [ @@ -3874,7 +3778,6 @@ test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint" name = "prometheus-client" version = "0.17.0" description = "Python client for the Prometheus monitoring system." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3889,7 +3792,6 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.38" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -3904,7 +3806,6 @@ wcwidth = "*" name = "protobuf" version = "3.20.3" description = "Protocol Buffers" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3936,7 +3837,6 @@ files = [ name = "psutil" version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3963,7 +3863,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "psycopg2-binary" version = "2.9.6" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4035,7 +3934,6 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -4047,7 +3945,6 @@ files = [ name = "pulsar-client" version = "3.2.0" description = "Apache Pulsar Python client library" -category = "main" optional = false python-versions = "*" files = [ @@ -4095,7 +3992,6 @@ functions = ["apache-bookkeeper-client (>=4.16.1)", "grpcio (>=1.8.2)", "prometh name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -4110,7 +4006,6 @@ tests = ["pytest"] name = "pyarrow" version = "12.0.1" description = "Python library for Apache Arrow" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4148,7 +4043,6 @@ numpy = ">=1.16.6" name = "pyasn1" version = "0.5.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -4160,7 +4054,6 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -4175,7 +4068,6 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -4187,7 +4079,6 @@ files = [ name = "pydantic" version = "1.10.9" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4240,7 +4131,6 @@ email = ["email-validator (>=1.0.3)"] name = "pygments" version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4255,7 +4145,6 @@ plugins = ["importlib-metadata"] name = "pypandoc" version = "1.11" description = "Thin wrapper for pandoc." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4267,7 +4156,6 @@ files = [ name = "pyparsing" version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" files = [ @@ -4282,7 +4170,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pypdf" version = "3.10.0" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4304,7 +4191,6 @@ image = ["Pillow"] name = "pyreadline3" version = "3.4.1" description = "A python implementation of GNU readline." -category = "main" optional = false python-versions = "*" files = [ @@ -4316,7 +4202,6 @@ files = [ name = "pysrt" version = "1.1.2" description = "SubRip (.srt) subtitle parser and writer" -category = "main" optional = false python-versions = "*" files = [ @@ -4330,7 +4215,6 @@ chardet = "*" name = "pytest" version = "7.3.2" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4353,7 +4237,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4372,7 +4255,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -4387,7 +4269,6 @@ six = ">=1.5" name = "python-docx" version = "0.8.11" description = "Create and update Microsoft Word .docx files." -category = "main" optional = false python-versions = "*" files = [ @@ -4401,7 +4282,6 @@ lxml = ">=2.3.2" name = "python-dotenv" version = "1.0.0" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4416,7 +4296,6 @@ cli = ["click (>=5.0)"] name = "python-jose" version = "3.3.0" description = "JOSE implementation in Python" -category = "main" optional = false python-versions = "*" files = [ @@ -4438,7 +4317,6 @@ pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] name = "python-magic" version = "0.4.27" description = "File type identification using libmagic" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -4450,7 +4328,6 @@ files = [ name = "python-multipart" version = "0.0.6" description = "A streaming multipart parser for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4465,7 +4342,6 @@ dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatc name = "python-pptx" version = "0.6.21" description = "Generate and manipulate Open XML PowerPoint (.pptx) files" -category = "main" optional = false python-versions = "*" files = [ @@ -4481,7 +4357,6 @@ XlsxWriter = ">=0.5.7" name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -4493,7 +4368,6 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -4517,7 +4391,6 @@ files = [ name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4567,7 +4440,6 @@ files = [ name = "pyzmq" version = "25.1.0" description = "Python bindings for 0MQ" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4657,7 +4529,6 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "qdrant-client" version = "1.2.0" description = "Client library for the Qdrant vector search engine" -category = "main" optional = false python-versions = ">=3.7,<3.12" files = [ @@ -4679,7 +4550,6 @@ urllib3 = ">=1.26.14,<2.0.0" name = "regex" version = "2023.6.3" description = "Alternative regular expression module, to replace re." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4777,7 +4647,6 @@ files = [ name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4799,7 +4668,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "rfc3986" version = "1.5.0" description = "Validating URI References per RFC 3986" -category = "main" optional = false python-versions = "*" files = [ @@ -4817,7 +4685,6 @@ idna2008 = ["idna"] name = "rich" version = "13.4.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -4836,7 +4703,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -4851,7 +4717,6 @@ pyasn1 = ">=0.1.3" name = "ruff" version = "0.0.254" description = "An extremely fast Python linter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4878,7 +4743,6 @@ files = [ name = "scikit-learn" version = "1.2.2" description = "A set of python modules for machine learning and data mining" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4921,7 +4785,6 @@ tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy ( name = "scipy" version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -4960,7 +4823,6 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo name = "sentence-transformers" version = "2.2.2" description = "Multilingual text embeddings" -category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -4983,7 +4845,6 @@ transformers = ">=4.6.0,<5.0.0" name = "sentencepiece" version = "0.1.99" description = "SentencePiece python wrapper" -category = "main" optional = false python-versions = "*" files = [ @@ -5038,7 +4899,6 @@ files = [ name = "setuptools" version = "67.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5055,7 +4915,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -5067,7 +4926,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5079,7 +4937,6 @@ files = [ name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5091,7 +4948,6 @@ files = [ name = "sqlalchemy" version = "1.4.41" description = "Database Abstraction Library" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -5139,7 +4995,7 @@ files = [ ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -5166,7 +5022,6 @@ sqlcipher = ["sqlcipher3-binary"] name = "sqlalchemy2-stubs" version = "0.0.2a34" description = "Typing Stubs for SQLAlchemy 1.4" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5181,7 +5036,6 @@ typing-extensions = ">=3.7.4" name = "sqlmodel" version = "0.0.8" description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." -category = "main" optional = false python-versions = ">=3.6.1,<4.0.0" files = [ @@ -5198,7 +5052,6 @@ sqlalchemy2-stubs = "*" name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -5218,7 +5071,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "starlette" version = "0.27.0" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5237,7 +5089,6 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam name = "sympy" version = "1.12" description = "Computer algebra system (CAS) in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -5252,7 +5103,6 @@ mpmath = ">=0.19" name = "tenacity" version = "8.2.2" description = "Retry code until it succeeds" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5267,7 +5117,6 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] name = "textual" version = "0.10.1" description = "Modern Text User Interface framework" -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ @@ -5288,7 +5137,6 @@ dev = ["aiohttp (>=3.8.1)", "click (>=8.1.2)", "msgpack (>=1.0.3)"] name = "threadpoolctl" version = "3.1.0" description = "threadpoolctl" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5300,7 +5148,6 @@ files = [ name = "tiktoken" version = "0.4.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -5346,7 +5193,6 @@ blobfile = ["blobfile (>=2)"] name = "tokenizers" version = "0.13.3" description = "Fast and Customizable Tokenizers" -category = "main" optional = false python-versions = "*" files = [ @@ -5401,7 +5247,6 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -5413,7 +5258,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5425,7 +5269,6 @@ files = [ name = "torch" version = "2.0.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -category = "main" optional = false python-versions = ">=3.8.0" files = [ @@ -5465,7 +5308,6 @@ opt-einsum = ["opt-einsum (>=3.3)"] name = "torchvision" version = "0.15.2" description = "image and video datasets and models for torch deep learning" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -5493,7 +5335,7 @@ files = [ [package.dependencies] numpy = "*" -pillow = ">=5.3.0,<8.3.0 || >=8.4.0" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" requests = "*" torch = "2.0.1" @@ -5504,7 +5346,6 @@ scipy = ["scipy"] name = "tornado" version = "6.3.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" optional = false python-versions = ">= 3.8" files = [ @@ -5525,7 +5366,6 @@ files = [ name = "tqdm" version = "4.65.0" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5546,7 +5386,6 @@ telegram = ["requests"] name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5562,7 +5401,6 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] name = "transformers" version = "4.29.0" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -5630,7 +5468,6 @@ vision = ["Pillow"] name = "typer" version = "0.9.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5652,7 +5489,6 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6. name = "types-cachetools" version = "5.3.0.5" description = "Typing stubs for cachetools" -category = "main" optional = false python-versions = "*" files = [ @@ -5664,7 +5500,6 @@ files = [ name = "types-pillow" version = "9.5.0.4" description = "Typing stubs for Pillow" -category = "dev" optional = false python-versions = "*" files = [ @@ -5676,7 +5511,6 @@ files = [ name = "types-pytz" version = "2023.3.0.0" description = "Typing stubs for pytz" -category = "dev" optional = false python-versions = "*" files = [ @@ -5688,7 +5522,6 @@ files = [ name = "types-pyyaml" version = "6.0.12.10" description = "Typing stubs for PyYAML" -category = "main" optional = false python-versions = "*" files = [ @@ -5700,7 +5533,6 @@ files = [ name = "types-requests" version = "2.31.0.1" description = "Typing stubs for requests" -category = "dev" optional = false python-versions = "*" files = [ @@ -5715,7 +5547,6 @@ types-urllib3 = "*" name = "types-urllib3" version = "1.26.25.13" description = "Typing stubs for urllib3" -category = "dev" optional = false python-versions = "*" files = [ @@ -5727,7 +5558,6 @@ files = [ name = "typing-extensions" version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5739,7 +5569,6 @@ files = [ name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -5755,7 +5584,6 @@ typing-extensions = ">=3.7.4" name = "unstructured" version = "0.5.13" description = "A library that prepares raw documents for downstream ML tasks." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -5795,7 +5623,6 @@ wikipedia = ["wikipedia"] name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5807,7 +5634,6 @@ files = [ name = "urllib3" version = "1.26.16" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -5824,7 +5650,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "uvicorn" version = "0.22.0" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5839,7 +5664,7 @@ h11 = ">=0.8" httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} @@ -5850,7 +5675,6 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", name = "uvloop" version = "0.17.0" description = "Fast implementation of asyncio event loop on top of libuv" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5895,7 +5719,6 @@ test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "my name = "validators" version = "0.20.0" description = "Python Data Validation for Humans™." -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -5912,7 +5735,6 @@ test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] name = "watchfiles" version = "0.19.0" description = "Simple, modern and high performance file watching and code reload in python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5947,7 +5769,6 @@ anyio = ">=3.0.0" name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -5959,7 +5780,6 @@ files = [ name = "weaviate-client" version = "3.21.0" description = "A python native Weaviate client" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -5980,7 +5800,6 @@ grpc = ["grpcio", "grpcio-tools"] name = "websocket-client" version = "1.6.0" description = "WebSocket client for Python with low level API options" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5997,7 +5816,6 @@ test = ["websockets"] name = "websockets" version = "11.0.3" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -6077,7 +5895,6 @@ files = [ name = "wikipedia" version = "1.4.0" description = "Wikipedia API for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -6092,7 +5909,6 @@ requests = ">=2.0.0,<3.0.0" name = "wrapt" version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -6177,7 +5993,6 @@ files = [ name = "xlsxwriter" version = "3.1.2" description = "A Python module for creating Excel XLSX files." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -6189,7 +6004,6 @@ files = [ name = "yarl" version = "1.9.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -6277,7 +6091,6 @@ multidict = ">=4.0" name = "zipp" version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -6293,7 +6106,6 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more name = "zstandard" version = "0.21.0" description = "Zstandard bindings for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -6354,4 +6166,4 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "6b382b428d0c1d43bd76917dccc88e524c5ae6ecbfea59d07ff977aa030fd7f4" +content-hash = "0693d2e0c5820f1729c551328f82ae5f02ccf3a6da15a806dccc63df8d7c7c8a" diff --git a/pyproject.toml b/pyproject.toml index 4a383f6fc..62d6d2687 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,6 +64,9 @@ orjson = "^3.9.1" multiprocess = "^0.70.14" cachetools = "^5.3.1" types-cachetools = "^5.3.0.5" +python-jose = "^3.3.0" +passlib = "^1.7.4" +bcrypt = "^4.0.1" [tool.poetry.group.dev.dependencies] diff --git a/src/backend/langflow/login.py b/src/backend/langflow/login.py new file mode 100644 index 000000000..c2782be56 --- /dev/null +++ b/src/backend/langflow/login.py @@ -0,0 +1,143 @@ +from datetime import datetime, timedelta +from typing import Annotated + +from fastapi import Depends, FastAPI, HTTPException, status +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from jose import JWTError, jwt +from passlib.context import CryptContext +from pydantic import BaseModel + +# to get a string like this run: +# openssl rand -hex 32 +SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 + + +fake_users_db = { + "johndoe": { + "username": "johndoe", + "full_name": "John Doe", + "email": "johndoe@example.com", + "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW", + "disabled": False, + } +} + + +class Token(BaseModel): + access_token: str + token_type: str + + +class TokenData(BaseModel): + username: str | None = None + + +class User(BaseModel): + username: str + email: str | None = None + full_name: str | None = None + disabled: bool | None = None + + +class UserInDB(User): + hashed_password: str + + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + + +def verify_password(plain_password, hashed_password): + return pwd_context.verify(plain_password, hashed_password) + + +def get_password_hash(password): + return pwd_context.hash(password) + + +def get_user(db, username: str): + if username in db: + user_dict = db[username] + return UserInDB(**user_dict) + + +def authenticate_user(fake_db, username: str, password: str): + user = get_user(fake_db, username) + if not user: + return False + if not verify_password(password, user.hashed_password): + return False + return user + + +def create_access_token(data: dict, expires_delta: timedelta | None = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + + +async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]): + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + token_data = TokenData(username=username) + except JWTError: + raise credentials_exception + user = get_user(fake_users_db, username=token_data.username) + if user is None: + raise credentials_exception + return user + + +async def get_current_active_user( + current_user: Annotated[User, Depends(get_current_user)] +): + if current_user.disabled: + raise HTTPException(status_code=400, detail="Inactive user") + return current_user + + +@app.post("/token", response_model=Token) +async def login_for_access_token( + form_data: Annotated[OAuth2PasswordRequestForm, Depends()] +): + user = authenticate_user(fake_users_db, form_data.username, form_data.password) + if not user: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + data={"sub": user.username}, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} + + +@app.get("/users/me/", response_model=User) +async def read_users_me( + current_user: Annotated[User, Depends(get_current_active_user)] +): + return current_user + + +@app.get("/users/me/items/") +async def read_own_items( + current_user: Annotated[User, Depends(get_current_active_user)] +): + return [{"item_id": "Foo", "owner": current_user.username}] \ No newline at end of file diff --git a/src/backend/langflow/main.py b/src/backend/langflow/main.py index ad3217eb5..78ac1e75f 100644 --- a/src/backend/langflow/main.py +++ b/src/backend/langflow/main.py @@ -4,15 +4,154 @@ from fastapi.middleware.cors import CORSMiddleware from langflow.api import router from langflow.database.base import create_db_and_tables +from datetime import datetime, timedelta +from typing import Annotated + +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from jose import JWTError, jwt +from passlib.context import CryptContext +from pydantic import BaseModel + +# to get a string like this run: +# openssl rand -hex 32 +SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 + + +fake_users_db = { + "johndoe": { + "username": "johndoe", + "full_name": "John Doe", + "email": "johndoe@example.com", + "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW", + "disabled": False, + } +} + + +class Token(BaseModel): + access_token: str + token_type: str + + +class TokenData(BaseModel): + username: str | None = None + + +class User(BaseModel): + username: str + email: str | None = None + full_name: str | None = None + disabled: bool | None = None + + +class UserInDB(User): + hashed_password: str + + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + + +def verify_password(plain_password, hashed_password): + return pwd_context.verify(plain_password, hashed_password) + + +def get_password_hash(password): + return pwd_context.hash(password) + + +def get_user(db, username: str): + if username in db: + user_dict = db[username] + return UserInDB(**user_dict) + + +def authenticate_user(fake_db, username: str, password: str): + user = get_user(fake_db, username) + if not user: + return False + if not verify_password(password, user.hashed_password): + return False + return user + + +def create_access_token(data: dict, expires_delta: timedelta | None = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + + +async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]): + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + token_data = TokenData(username=username) + except JWTError: + raise credentials_exception + user = get_user(fake_users_db, username=token_data.username) + if user is None: + raise credentials_exception + return user + + +async def get_current_active_user(current_user: Annotated[User, Depends(get_current_user)]): + if current_user.disabled: + raise HTTPException(status_code=400, detail="Inactive user") + return current_user + def create_app(): """Create the FastAPI app and include the router.""" - app = FastAPI() origins = [ "*", ] + + @app.post("/token", response_model=Token) + async def login_for_access_token(form_data: Annotated[OAuth2PasswordRequestForm, Depends()]): + user = authenticate_user(fake_users_db, form_data.username, form_data.password) + if not user: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + data={"sub": user.username}, + expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} + + + @app.get("/users/me/", response_model=User) + async def read_users_me( + current_user: Annotated[User, Depends(get_current_active_user)] + ): + return current_user + + + @app.get("/users/me/items/") + async def read_own_items( + current_user: Annotated[User, Depends(get_current_active_user)] + ): + return [{"item_id": "Foo", "owner": current_user.username}] @app.get("/health") def get_health(): @@ -36,5 +175,4 @@ app = create_app() if __name__ == "__main__": import uvicorn - uvicorn.run(app, host="127.0.0.1", port=7860) From ddd795b2f4667b1cc06b3b8499752252018322d7 Mon Sep 17 00:00:00 2001 From: gustavoschaedler Date: Mon, 19 Jun 2023 23:50:19 +0100 Subject: [PATCH 02/91] Add authentication and authorization functionality The commit adds the auth module and updates dependencies. It includes authentication and authorization functionality and models to create access tokens. The endpoints for login and users/me have been removed and moved to the appropriate modules. These changes have improved security and code organization. --- src/backend/langflow/auth/__init__.py | 0 src/backend/langflow/auth/auth.py | 72 +++++++++++ src/backend/langflow/login.py | 143 --------------------- src/backend/langflow/main.py | 154 ++--------------------- src/backend/langflow/models/__init__.py | 0 src/backend/langflow/models/token.py | 10 ++ src/backend/langflow/models/user.py | 29 +++++ src/backend/langflow/routers/__init__.py | 0 src/backend/langflow/routers/health.py | 8 ++ src/backend/langflow/routers/items.py | 12 ++ src/backend/langflow/routers/login.py | 35 ++++++ src/backend/langflow/routers/users.py | 10 ++ 12 files changed, 183 insertions(+), 290 deletions(-) create mode 100644 src/backend/langflow/auth/__init__.py create mode 100644 src/backend/langflow/auth/auth.py delete mode 100644 src/backend/langflow/login.py create mode 100644 src/backend/langflow/models/__init__.py create mode 100644 src/backend/langflow/models/token.py create mode 100644 src/backend/langflow/models/user.py create mode 100644 src/backend/langflow/routers/__init__.py create mode 100644 src/backend/langflow/routers/health.py create mode 100644 src/backend/langflow/routers/items.py create mode 100644 src/backend/langflow/routers/login.py create mode 100644 src/backend/langflow/routers/users.py diff --git a/src/backend/langflow/auth/__init__.py b/src/backend/langflow/auth/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/auth/auth.py b/src/backend/langflow/auth/auth.py new file mode 100644 index 000000000..503b2bd5b --- /dev/null +++ b/src/backend/langflow/auth/auth.py @@ -0,0 +1,72 @@ +from typing import Annotated + +from fastapi import Depends, HTTPException, status +from passlib.context import CryptContext +from jose import JWTError, jwt +from datetime import datetime, timedelta, timezone +from fastapi.security import OAuth2PasswordBearer +from ..models.token import TokenData +from ..models.user import get_user, fake_users_db, User + + +SECRET_KEY = "your_secret_key" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + + +def verify_password(plain_password, hashed_password): + return pwd_context.verify(plain_password, hashed_password) + + +def get_password_hash(password): + return pwd_context.hash(password) + + +def create_access_token(data: dict, expires_delta: timedelta = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.now(timezone.utc) + expires_delta + else: + expire = datetime.now(timezone.utc) + timedelta(minutes=15) + to_encode["exp"] = expire + return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + + +def authenticate_user(fake_db, username: str, password: str): + user = get_user(fake_db, username) + if not user: + return False + if not verify_password(password, user.hashed_password): + return False + return user + + +async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]): + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + token_data = TokenData(username=username) + except JWTError: + raise credentials_exception + user = get_user(fake_users_db, username=token_data.username) + if user is None: + raise credentials_exception + return user + + +async def get_current_active_user( + current_user: Annotated[User, Depends(get_current_user)] +): + if current_user.disabled: + raise HTTPException(status_code=400, detail="Inactive user") + return current_user diff --git a/src/backend/langflow/login.py b/src/backend/langflow/login.py deleted file mode 100644 index c2782be56..000000000 --- a/src/backend/langflow/login.py +++ /dev/null @@ -1,143 +0,0 @@ -from datetime import datetime, timedelta -from typing import Annotated - -from fastapi import Depends, FastAPI, HTTPException, status -from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm -from jose import JWTError, jwt -from passlib.context import CryptContext -from pydantic import BaseModel - -# to get a string like this run: -# openssl rand -hex 32 -SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7" -ALGORITHM = "HS256" -ACCESS_TOKEN_EXPIRE_MINUTES = 30 - - -fake_users_db = { - "johndoe": { - "username": "johndoe", - "full_name": "John Doe", - "email": "johndoe@example.com", - "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW", - "disabled": False, - } -} - - -class Token(BaseModel): - access_token: str - token_type: str - - -class TokenData(BaseModel): - username: str | None = None - - -class User(BaseModel): - username: str - email: str | None = None - full_name: str | None = None - disabled: bool | None = None - - -class UserInDB(User): - hashed_password: str - - -pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") -oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") - - -def verify_password(plain_password, hashed_password): - return pwd_context.verify(plain_password, hashed_password) - - -def get_password_hash(password): - return pwd_context.hash(password) - - -def get_user(db, username: str): - if username in db: - user_dict = db[username] - return UserInDB(**user_dict) - - -def authenticate_user(fake_db, username: str, password: str): - user = get_user(fake_db, username) - if not user: - return False - if not verify_password(password, user.hashed_password): - return False - return user - - -def create_access_token(data: dict, expires_delta: timedelta | None = None): - to_encode = data.copy() - if expires_delta: - expire = datetime.utcnow() + expires_delta - else: - expire = datetime.utcnow() + timedelta(minutes=15) - to_encode.update({"exp": expire}) - encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) - return encoded_jwt - - -async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]): - credentials_exception = HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Could not validate credentials", - headers={"WWW-Authenticate": "Bearer"}, - ) - try: - payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) - username: str = payload.get("sub") - if username is None: - raise credentials_exception - token_data = TokenData(username=username) - except JWTError: - raise credentials_exception - user = get_user(fake_users_db, username=token_data.username) - if user is None: - raise credentials_exception - return user - - -async def get_current_active_user( - current_user: Annotated[User, Depends(get_current_user)] -): - if current_user.disabled: - raise HTTPException(status_code=400, detail="Inactive user") - return current_user - - -@app.post("/token", response_model=Token) -async def login_for_access_token( - form_data: Annotated[OAuth2PasswordRequestForm, Depends()] -): - user = authenticate_user(fake_users_db, form_data.username, form_data.password) - if not user: - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Incorrect username or password", - headers={"WWW-Authenticate": "Bearer"}, - ) - access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) - access_token = create_access_token( - data={"sub": user.username}, expires_delta=access_token_expires - ) - return {"access_token": access_token, "token_type": "bearer"} - - -@app.get("/users/me/", response_model=User) -async def read_users_me( - current_user: Annotated[User, Depends(get_current_active_user)] -): - return current_user - - -@app.get("/users/me/items/") -async def read_own_items( - current_user: Annotated[User, Depends(get_current_active_user)] -): - return [{"item_id": "Foo", "owner": current_user.username}] \ No newline at end of file diff --git a/src/backend/langflow/main.py b/src/backend/langflow/main.py index 78ac1e75f..d546fd58e 100644 --- a/src/backend/langflow/main.py +++ b/src/backend/langflow/main.py @@ -2,160 +2,15 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from langflow.api import router +from langflow.routers import login, users, items, health from langflow.database.base import create_db_and_tables -from datetime import datetime, timedelta -from typing import Annotated - -from fastapi import Depends, HTTPException, status -from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm -from jose import JWTError, jwt -from passlib.context import CryptContext -from pydantic import BaseModel - -# to get a string like this run: -# openssl rand -hex 32 -SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7" -ALGORITHM = "HS256" -ACCESS_TOKEN_EXPIRE_MINUTES = 30 - - -fake_users_db = { - "johndoe": { - "username": "johndoe", - "full_name": "John Doe", - "email": "johndoe@example.com", - "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW", - "disabled": False, - } -} - - -class Token(BaseModel): - access_token: str - token_type: str - - -class TokenData(BaseModel): - username: str | None = None - - -class User(BaseModel): - username: str - email: str | None = None - full_name: str | None = None - disabled: bool | None = None - - -class UserInDB(User): - hashed_password: str - - -pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") -oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") - - -def verify_password(plain_password, hashed_password): - return pwd_context.verify(plain_password, hashed_password) - - -def get_password_hash(password): - return pwd_context.hash(password) - - -def get_user(db, username: str): - if username in db: - user_dict = db[username] - return UserInDB(**user_dict) - - -def authenticate_user(fake_db, username: str, password: str): - user = get_user(fake_db, username) - if not user: - return False - if not verify_password(password, user.hashed_password): - return False - return user - - -def create_access_token(data: dict, expires_delta: timedelta | None = None): - to_encode = data.copy() - if expires_delta: - expire = datetime.utcnow() + expires_delta - else: - expire = datetime.utcnow() + timedelta(minutes=15) - to_encode.update({"exp": expire}) - encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) - return encoded_jwt - - -async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]): - credentials_exception = HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Could not validate credentials", - headers={"WWW-Authenticate": "Bearer"}, - ) - try: - payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) - username: str = payload.get("sub") - if username is None: - raise credentials_exception - token_data = TokenData(username=username) - except JWTError: - raise credentials_exception - user = get_user(fake_users_db, username=token_data.username) - if user is None: - raise credentials_exception - return user - - -async def get_current_active_user(current_user: Annotated[User, Depends(get_current_user)]): - if current_user.disabled: - raise HTTPException(status_code=400, detail="Inactive user") - return current_user - def create_app(): """Create the FastAPI app and include the router.""" app = FastAPI() - origins = [ - "*", - ] - - @app.post("/token", response_model=Token) - async def login_for_access_token(form_data: Annotated[OAuth2PasswordRequestForm, Depends()]): - user = authenticate_user(fake_users_db, form_data.username, form_data.password) - if not user: - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Incorrect username or password", - headers={"WWW-Authenticate": "Bearer"}, - ) - access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) - access_token = create_access_token( - data={"sub": user.username}, - expires_delta=access_token_expires - ) - return {"access_token": access_token, "token_type": "bearer"} - - - @app.get("/users/me/", response_model=User) - async def read_users_me( - current_user: Annotated[User, Depends(get_current_active_user)] - ): - return current_user - - - @app.get("/users/me/items/") - async def read_own_items( - current_user: Annotated[User, Depends(get_current_active_user)] - ): - return [{"item_id": "Foo", "owner": current_user.username}] - - @app.get("/health") - def get_health(): - return {"status": "OK"} + origins = ["*"] app.add_middleware( CORSMiddleware, @@ -165,7 +20,12 @@ def create_app(): allow_headers=["*"], ) + app.include_router(login.router) + app.include_router(users.router) + app.include_router(items.router) + app.include_router(health.router) app.include_router(router) + app.on_event("startup")(create_db_and_tables) return app diff --git a/src/backend/langflow/models/__init__.py b/src/backend/langflow/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/models/token.py b/src/backend/langflow/models/token.py new file mode 100644 index 000000000..080286787 --- /dev/null +++ b/src/backend/langflow/models/token.py @@ -0,0 +1,10 @@ +from pydantic import BaseModel + + +class Token(BaseModel): + access_token: str + token_type: str + + +class TokenData(BaseModel): + username: str | None = None diff --git a/src/backend/langflow/models/user.py b/src/backend/langflow/models/user.py new file mode 100644 index 000000000..1023a6a65 --- /dev/null +++ b/src/backend/langflow/models/user.py @@ -0,0 +1,29 @@ +from pydantic import BaseModel + + +class User(BaseModel): + username: str + email: str | None = None + full_name: str | None = None + disabled: bool | None = None + + +class UserInDB(User): + hashed_password: str + + +fake_users_db = { + "johndoe": { + "username": "johndoe", + "full_name": "John Doe", + "email": "johndoe@example.com", + "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW", + "disabled": False, + } +} + + +def get_user(db, username: str): + if username in db: + user_dict = db[username] + return UserInDB(**user_dict) diff --git a/src/backend/langflow/routers/__init__.py b/src/backend/langflow/routers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/routers/health.py b/src/backend/langflow/routers/health.py new file mode 100644 index 000000000..244ef001d --- /dev/null +++ b/src/backend/langflow/routers/health.py @@ -0,0 +1,8 @@ +from fastapi import APIRouter + +router = APIRouter() + + +@router.get("/health") +def get_health(): + return {"status": "OK"} diff --git a/src/backend/langflow/routers/items.py b/src/backend/langflow/routers/items.py new file mode 100644 index 000000000..e6d21340e --- /dev/null +++ b/src/backend/langflow/routers/items.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter, Depends +from ..models.user import User +from ..auth.auth import get_current_active_user + +router = APIRouter() + + +@router.get("/users/me/items/") +async def read_own_items( + current_user: User = Depends(get_current_active_user) +): + return [{"item_id": "Foo", "owner": current_user.username}] diff --git a/src/backend/langflow/routers/login.py b/src/backend/langflow/routers/login.py new file mode 100644 index 000000000..eac2d57bb --- /dev/null +++ b/src/backend/langflow/routers/login.py @@ -0,0 +1,35 @@ +from fastapi import APIRouter, Depends, HTTPException, status +from fastapi.security import OAuth2PasswordRequestForm +from langflow.models.token import Token +from langflow.models.user import fake_users_db +from datetime import timedelta +from langflow.auth.auth import ( + ACCESS_TOKEN_EXPIRE_MINUTES, + authenticate_user, + create_access_token +) + +router = APIRouter() + + +@router.post("/token", response_model=Token) +async def login_for_access_token( + form_data: OAuth2PasswordRequestForm = Depends() +): + user = authenticate_user( + fake_users_db, + form_data.username, + form_data.password + ) + if not user: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + data={"sub": user.username}, + expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} diff --git a/src/backend/langflow/routers/users.py b/src/backend/langflow/routers/users.py new file mode 100644 index 000000000..1a9184ec8 --- /dev/null +++ b/src/backend/langflow/routers/users.py @@ -0,0 +1,10 @@ +from fastapi import APIRouter, Depends +from langflow.models.user import User +from langflow.auth.auth import get_current_active_user + +router = APIRouter() + + +@router.get("/users/me/", response_model=User) +async def read_users_me(current_user: User = Depends(get_current_active_user)): + return current_user From 6d78aefa623c1e2789056e6d08b1d70222b22c97 Mon Sep 17 00:00:00 2001 From: gustavoschaedler Date: Tue, 20 Jun 2023 00:19:30 +0100 Subject: [PATCH 03/91] Add random SECRET_KEY to test Changed the SECRET_KEY to a randomly generated one using the command `openssl rand -hex 32`. Additionally, added code to raise an exception when facing JWTError in `get_current_user`. Added a new user in `fake_users_db` who is currently disabled. Finally, changed the endpoint to show all users instead of `me`. --- src/backend/langflow/auth/auth.py | 11 ++++++++--- src/backend/langflow/models/user.py | 17 ++++++++++++----- src/backend/langflow/routers/items.py | 9 +++++++-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/backend/langflow/auth/auth.py b/src/backend/langflow/auth/auth.py index 503b2bd5b..ec45d48f4 100644 --- a/src/backend/langflow/auth/auth.py +++ b/src/backend/langflow/auth/auth.py @@ -9,7 +9,9 @@ from ..models.token import TokenData from ..models.user import get_user, fake_users_db, User -SECRET_KEY = "your_secret_key" +# to get a string like this run: +# openssl rand -hex 32 +SECRET_KEY = "698619adad2d916f1f32d264540976964b3c0d3828e0870a65add5800a8cc6b9" ALGORITHM = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES = 30 @@ -37,6 +39,7 @@ def create_access_token(data: dict, expires_delta: timedelta = None): def authenticate_user(fake_db, username: str, password: str): user = get_user(fake_db, username) + if not user: return False if not verify_password(password, user.hashed_password): @@ -50,14 +53,16 @@ async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]): detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) + try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) username: str = payload.get("sub") if username is None: raise credentials_exception token_data = TokenData(username=username) - except JWTError: - raise credentials_exception + except JWTError as e: + raise credentials_exception from e + user = get_user(fake_users_db, username=token_data.username) if user is None: raise credentials_exception diff --git a/src/backend/langflow/models/user.py b/src/backend/langflow/models/user.py index 1023a6a65..c47c85464 100644 --- a/src/backend/langflow/models/user.py +++ b/src/backend/langflow/models/user.py @@ -13,12 +13,19 @@ class UserInDB(User): fake_users_db = { - "johndoe": { - "username": "johndoe", - "full_name": "John Doe", - "email": "johndoe@example.com", - "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW", + "gustavo": { + "username": "gustavo", + "full_name": "Gustavo Schaedler", + "email": "gustavopoa@gmail.com", + "hashed_password": "$2b$12$f4R8IHUaVxVchhpWrwhckeJXnPalW1vUbJzcvb1KeovJcuMwE861K", #secret "disabled": False, + }, + "gustavo_disabled": { + "username": "gustavo_disabled", + "full_name": "Gustavo Disabled", + "email": "gustavo_disabled@gmail.com", + "hashed_password": "$2b$12$f4R8IHUaVxVchhpWrwhckeJXnPalW1vUbJzcvb1KeovJcuMwE861K", #secret + "disabled": True, } } diff --git a/src/backend/langflow/routers/items.py b/src/backend/langflow/routers/items.py index e6d21340e..7ca1ff320 100644 --- a/src/backend/langflow/routers/items.py +++ b/src/backend/langflow/routers/items.py @@ -5,8 +5,13 @@ from ..auth.auth import get_current_active_user router = APIRouter() -@router.get("/users/me/items/") +@router.get("/users/all/") async def read_own_items( current_user: User = Depends(get_current_active_user) ): - return [{"item_id": "Foo", "owner": current_user.username}] + return [ + { + "item_id": "my_id", + "owner": current_user.username + } + ] From f855433652af63639547e45d914448f826b51223 Mon Sep 17 00:00:00 2001 From: gustavoschaedler Date: Wed, 21 Jun 2023 15:54:56 +0100 Subject: [PATCH 04/91] feat(auth-models): Add is_admin field to User model This commit adds an is_admin field to the User model definition in user.py. It is set to False by default and has been updated in fake_users_db for both users. Also, there were some code formatting changes made in auth.py. --- src/backend/langflow/auth/auth.py | 4 ++-- src/backend/langflow/models/user.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/auth/auth.py b/src/backend/langflow/auth/auth.py index ec45d48f4..92f44d63d 100644 --- a/src/backend/langflow/auth/auth.py +++ b/src/backend/langflow/auth/auth.py @@ -39,7 +39,7 @@ def create_access_token(data: dict, expires_delta: timedelta = None): def authenticate_user(fake_db, username: str, password: str): user = get_user(fake_db, username) - + if not user: return False if not verify_password(password, user.hashed_password): @@ -53,7 +53,7 @@ async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]): detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) - + try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) username: str = payload.get("sub") diff --git a/src/backend/langflow/models/user.py b/src/backend/langflow/models/user.py index c47c85464..2a9c233a4 100644 --- a/src/backend/langflow/models/user.py +++ b/src/backend/langflow/models/user.py @@ -6,6 +6,7 @@ class User(BaseModel): email: str | None = None full_name: str | None = None disabled: bool | None = None + is_admin: bool | None = False class UserInDB(User): @@ -19,6 +20,7 @@ fake_users_db = { "email": "gustavopoa@gmail.com", "hashed_password": "$2b$12$f4R8IHUaVxVchhpWrwhckeJXnPalW1vUbJzcvb1KeovJcuMwE861K", #secret "disabled": False, + "is_admin": True, }, "gustavo_disabled": { "username": "gustavo_disabled", @@ -26,6 +28,7 @@ fake_users_db = { "email": "gustavo_disabled@gmail.com", "hashed_password": "$2b$12$f4R8IHUaVxVchhpWrwhckeJXnPalW1vUbJzcvb1KeovJcuMwE861K", #secret "disabled": True, + "is_admin": False, } } From 7ca0f8d60dba8aaa99a16fc7dd25cfb790af7a18 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 17:05:40 -0300 Subject: [PATCH 05/91] refactor[EditFlowSettingsComponent]: Move type InputProps to types directorie --- .../components/EditFlowSettingsComponent/index.tsx | 12 +----------- src/frontend/src/types/components/index.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx index a0beb11f3..6c1b77b6c 100644 --- a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx +++ b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx @@ -2,17 +2,7 @@ import React, { ChangeEvent, useState } from "react"; import { Input } from "../../components/ui/input"; import { Label } from "../../components/ui/label"; import { Textarea } from "../../components/ui/textarea"; - -type InputProps = { - name: string | null; - description: string | null; - maxLength?: number; - flows: Array<{ id: string; name: string }>; - tabId: string; - setName: (name: string) => void; - setDescription: (description: string) => void; - updateFlow: (flow: { id: string; name: string }) => void; -}; +import { InputProps } from "../../types/components"; export const EditFlowSettings: React.FC = ({ name, diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 813ed28a3..be13ac5e4 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -168,3 +168,14 @@ export type IconComponentProps = { className: string; iconColor?: string; }; + +export type InputProps = { + name: string | null; + description: string | null; + maxLength?: number; + flows: Array<{ id: string; name: string }>; + tabId: string; + setName: (name: string) => void; + setDescription: (description: string) => void; + updateFlow: (flow: { id: string; name: string }) => void; +}; From 83772eeefd2565ca55185e68cdae97ef1f275ad1 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 17:11:56 -0300 Subject: [PATCH 06/91] refactor[ReactTooltipComponent]: Move type TooltipProps to types directorie --- .../src/components/ReactTooltipComponent/index.tsx | 13 +------------ src/frontend/src/types/components/index.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/components/ReactTooltipComponent/index.tsx b/src/frontend/src/components/ReactTooltipComponent/index.tsx index 0f0c64b89..2e3733e2a 100644 --- a/src/frontend/src/components/ReactTooltipComponent/index.tsx +++ b/src/frontend/src/components/ReactTooltipComponent/index.tsx @@ -4,18 +4,7 @@ import React from "react"; import { Tooltip as ReactTooltip } from "react-tooltip"; import "react-tooltip/dist/react-tooltip.css"; import { classNames } from "../../utils/utils"; - -type TooltipProps = { - selector: string; - content?: string; - disabled?: boolean; - htmlContent?: React.ReactNode; - className?: string; // This should use !impornant to override the default styles eg: '!bg-white' - position?: "top" | "right" | "bottom" | "left"; - clickable?: boolean; - children: React.ReactNode; - delayShow?: number; -}; +import { TooltipProps } from "../../types/components"; const TooltipReact: FC = ({ selector, diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index be13ac5e4..e21ca0da2 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -179,3 +179,15 @@ export type InputProps = { setDescription: (description: string) => void; updateFlow: (flow: { id: string; name: string }) => void; }; + +export type TooltipProps = { + selector: string; + content?: string; + disabled?: boolean; + htmlContent?: React.ReactNode; + className?: string; // This should use !impornant to override the default styles eg: '!bg-white' + position?: "top" | "right" | "bottom" | "left"; + clickable?: boolean; + children: React.ReactNode; + delayShow?: number; +}; From 67be60c9375e39acdf180b24321d0cbce6cc87a3 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 17:14:17 -0300 Subject: [PATCH 07/91] refactor[loadingComponent]: Move type LoadingComponentProps to types directorie --- src/frontend/src/components/loadingComponent/index.tsx | 4 +--- src/frontend/src/types/components/index.ts | 4 ++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/components/loadingComponent/index.tsx b/src/frontend/src/components/loadingComponent/index.tsx index 31e78d474..a1e406710 100644 --- a/src/frontend/src/components/loadingComponent/index.tsx +++ b/src/frontend/src/components/loadingComponent/index.tsx @@ -1,6 +1,4 @@ -type LoadingComponentProps = { - remSize: number; -}; +import { LoadingComponentProps } from "../../types/components"; export default function LoadingComponent({ remSize }: LoadingComponentProps) { return ( diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index e21ca0da2..8a606bd8a 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -191,3 +191,7 @@ export type TooltipProps = { children: React.ReactNode; delayShow?: number; }; + +export type LoadingComponentProps = { + remSize: number; +}; From a2ebec1a87af504c48771469ef5e79577086d6c2 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 17:20:34 -0300 Subject: [PATCH 08/91] refactor[alertContext]: Move type alertContextType to types directorie --- src/frontend/src/contexts/alertContext.tsx | 23 +------------------- src/frontend/src/types/typesContext/index.ts | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/frontend/src/contexts/alertContext.tsx b/src/frontend/src/contexts/alertContext.tsx index 62ae2e396..781ecd2af 100644 --- a/src/frontend/src/contexts/alertContext.tsx +++ b/src/frontend/src/contexts/alertContext.tsx @@ -1,30 +1,9 @@ import { createContext, ReactNode, useState } from "react"; import { AlertItemType } from "../types/alerts"; +import { alertContextType } from "../types/typesContext"; import _ from "lodash"; -//types for alertContextType -type alertContextType = { - errorData: { title: string; list?: Array }; - setErrorData: (newState: { title: string; list?: Array }) => void; - errorOpen: boolean; - setErrorOpen: (newState: boolean) => void; - noticeData: { title: string; link?: string }; - setNoticeData: (newState: { title: string; link?: string }) => void; - noticeOpen: boolean; - setNoticeOpen: (newState: boolean) => void; - successData: { title: string }; - setSuccessData: (newState: { title: string }) => void; - successOpen: boolean; - setSuccessOpen: (newState: boolean) => void; - notificationCenter: boolean; - setNotificationCenter: (newState: boolean) => void; - notificationList: Array; - pushNotificationList: (Object: AlertItemType) => void; - clearNotificationList: () => void; - removeFromNotificationList: (index: string) => void; -}; - //initial values to alertContextType const initialValue: alertContextType = { errorData: { title: "", list: [] }, diff --git a/src/frontend/src/types/typesContext/index.ts b/src/frontend/src/types/typesContext/index.ts index 64b6e3e9d..984dda332 100644 --- a/src/frontend/src/types/typesContext/index.ts +++ b/src/frontend/src/types/typesContext/index.ts @@ -1,5 +1,6 @@ import { ReactFlowInstance } from "reactflow"; import { APIClassType } from "../api"; +import { AlertItemType } from "../alerts"; const types: { [char: string]: string } = {}; const template: { [char: string]: APIClassType } = {}; @@ -16,3 +17,24 @@ export type typesContextType = { data: typeof data; setData: (newState: {}) => void; }; + +export type alertContextType = { + errorData: { title: string; list?: Array }; + setErrorData: (newState: { title: string; list?: Array }) => void; + errorOpen: boolean; + setErrorOpen: (newState: boolean) => void; + noticeData: { title: string; link?: string }; + setNoticeData: (newState: { title: string; link?: string }) => void; + noticeOpen: boolean; + setNoticeOpen: (newState: boolean) => void; + successData: { title: string }; + setSuccessData: (newState: { title: string }) => void; + successOpen: boolean; + setSuccessOpen: (newState: boolean) => void; + notificationCenter: boolean; + setNotificationCenter: (newState: boolean) => void; + notificationList: Array; + pushNotificationList: (Object: AlertItemType) => void; + clearNotificationList: () => void; + removeFromNotificationList: (index: string) => void; +}; From 2c8b0e1aaf3a71e432e2b86799c22f83857d1cfe Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 17:27:09 -0300 Subject: [PATCH 09/91] refactor[darkContext]: Move type darkContextType to types directorie --- src/frontend/src/contexts/darkContext.tsx | 6 +----- src/frontend/src/types/typesContext/index.ts | 5 +++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/contexts/darkContext.tsx b/src/frontend/src/contexts/darkContext.tsx index 2a76d0e53..d152ced34 100644 --- a/src/frontend/src/contexts/darkContext.tsx +++ b/src/frontend/src/contexts/darkContext.tsx @@ -1,9 +1,5 @@ import { createContext, useEffect, useState } from "react"; - -type darkContextType = { - dark: {}; - setDark: (newState: {}) => void; -}; +import { darkContextType } from "../types/typesContext"; const initialValue = { dark: {}, diff --git a/src/frontend/src/types/typesContext/index.ts b/src/frontend/src/types/typesContext/index.ts index 984dda332..f0debe77a 100644 --- a/src/frontend/src/types/typesContext/index.ts +++ b/src/frontend/src/types/typesContext/index.ts @@ -38,3 +38,8 @@ export type alertContextType = { clearNotificationList: () => void; removeFromNotificationList: (index: string) => void; }; + +export type darkContextType = { + dark: {}; + setDark: (newState: {}) => void; +}; From ca8e8e3f087473cf2eddfdda93665f4bcb614767 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 17:30:41 -0300 Subject: [PATCH 10/91] refactor[locationContext]: Move type locationContextType to types directorie --- src/frontend/src/contexts/locationContext.tsx | 31 +------------------ src/frontend/src/types/typesContext/index.ts | 29 +++++++++++++++++ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/frontend/src/contexts/locationContext.tsx b/src/frontend/src/contexts/locationContext.tsx index 474062d69..b0a9ef8c5 100644 --- a/src/frontend/src/contexts/locationContext.tsx +++ b/src/frontend/src/contexts/locationContext.tsx @@ -1,34 +1,5 @@ import { createContext, ReactNode, useState } from "react"; - -//types for location context -type locationContextType = { - current: Array; - setCurrent: (newState: Array) => void; - isStackedOpen: boolean; - setIsStackedOpen: (newState: boolean) => void; - showSideBar: boolean; - setShowSideBar: (newState: boolean) => void; - extraNavigation: { - title: string; - options?: Array<{ - name: string; - href: string; - icon: any; - children?: Array; - }>; - }; - setExtraNavigation: (newState: { - title: string; - options?: Array<{ - name: string; - href: string; - icon: any; - children?: Array; - }>; - }) => void; - extraComponent: any; - setExtraComponent: (newState: any) => void; -}; +import { locationContextType } from "../types/typesContext"; //initial value for location context const initialValue = { diff --git a/src/frontend/src/types/typesContext/index.ts b/src/frontend/src/types/typesContext/index.ts index f0debe77a..76a1fc17c 100644 --- a/src/frontend/src/types/typesContext/index.ts +++ b/src/frontend/src/types/typesContext/index.ts @@ -43,3 +43,32 @@ export type darkContextType = { dark: {}; setDark: (newState: {}) => void; }; + +export type locationContextType = { + current: Array; + setCurrent: (newState: Array) => void; + isStackedOpen: boolean; + setIsStackedOpen: (newState: boolean) => void; + showSideBar: boolean; + setShowSideBar: (newState: boolean) => void; + extraNavigation: { + title: string; + options?: Array<{ + name: string; + href: string; + icon: any; + children?: Array; + }>; + }; + setExtraNavigation: (newState: { + title: string; + options?: Array<{ + name: string; + href: string; + icon: any; + children?: Array; + }>; + }) => void; + extraComponent: any; + setExtraComponent: (newState: any) => void; +}; From bfee2ffe70b2b7cbdaf7c80f8d4329b2d46ba56d Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 17:39:36 -0300 Subject: [PATCH 11/91] refactor[undoRedoContext]: Move undoRedoContext types to types directorie --- src/frontend/src/contexts/undoRedoContext.tsx | 27 ++----------------- src/frontend/src/types/typesContext/index.ts | 26 +++++++++++++++++- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/frontend/src/contexts/undoRedoContext.tsx b/src/frontend/src/contexts/undoRedoContext.tsx index 3df201082..e3084cc5a 100644 --- a/src/frontend/src/contexts/undoRedoContext.tsx +++ b/src/frontend/src/contexts/undoRedoContext.tsx @@ -6,32 +6,9 @@ import { useEffect, useState, } from "react"; -import { Edge, Node, useReactFlow } from "reactflow"; +import { useReactFlow } from "reactflow"; import { TabsContext } from "./tabsContext"; - -type undoRedoContextType = { - undo: () => void; - redo: () => void; - takeSnapshot: () => void; -}; - -type UseUndoRedoOptions = { - maxHistorySize: number; - enableShortcuts: boolean; -}; - -type UseUndoRedo = (options?: UseUndoRedoOptions) => { - undo: () => void; - redo: () => void; - takeSnapshot: () => void; - canUndo: boolean; - canRedo: boolean; -}; - -type HistoryItem = { - nodes: Node[]; - edges: Edge[]; -}; +import { undoRedoContextType, UseUndoRedoOptions , UseUndoRedo, HistoryItem } from "../types/typesContext"; const initialValue = { undo: () => {}, diff --git a/src/frontend/src/types/typesContext/index.ts b/src/frontend/src/types/typesContext/index.ts index 76a1fc17c..ab655f6e7 100644 --- a/src/frontend/src/types/typesContext/index.ts +++ b/src/frontend/src/types/typesContext/index.ts @@ -1,4 +1,4 @@ -import { ReactFlowInstance } from "reactflow"; +import { ReactFlowInstance, Edge, Node } from "reactflow"; import { APIClassType } from "../api"; import { AlertItemType } from "../alerts"; @@ -72,3 +72,27 @@ export type locationContextType = { extraComponent: any; setExtraComponent: (newState: any) => void; }; + +export type undoRedoContextType = { + undo: () => void; + redo: () => void; + takeSnapshot: () => void; +}; + +export type UseUndoRedoOptions = { + maxHistorySize: number; + enableShortcuts: boolean; +}; + +export type UseUndoRedo = (options?: UseUndoRedoOptions) => { + undo: () => void; + redo: () => void; + takeSnapshot: () => void; + canUndo: boolean; + canRedo: boolean; +}; + +export type HistoryItem = { + nodes: Node[]; + edges: Edge[]; +}; From f990b0e39b5730abfcacdbbe1ab74267b50a4f23 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 18:01:15 -0300 Subject: [PATCH 12/91] refactor[baseModal]: Move baseModal types to types directorie --- src/frontend/src/modals/baseModal/index.tsx | 4 +--- src/frontend/src/types/components/index.ts | 4 ++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/modals/baseModal/index.tsx b/src/frontend/src/modals/baseModal/index.tsx index 4b135383c..d670546ac 100644 --- a/src/frontend/src/modals/baseModal/index.tsx +++ b/src/frontend/src/modals/baseModal/index.tsx @@ -10,9 +10,7 @@ import { DialogTrigger, } from "../../components/ui/dialog"; import { PopUpContext } from "../../contexts/popUpContext"; - -type ContentProps = { children: ReactNode }; -type HeaderProps = { children: ReactNode; description: string }; +import { ContentProps, HeaderProps } from "../../types/components"; const Content: React.FC = ({ children }) => { return
{children}
; diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 8a606bd8a..555a0d1b0 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -2,6 +2,7 @@ import { ReactElement, ReactNode } from "react"; import { APIClassType } from "../api"; import { NodeDataType } from "../flow/index"; import { typesContextType } from "../typesContext"; + export type InputComponentType = { value: string; disabled?: boolean; @@ -195,3 +196,6 @@ export type TooltipProps = { export type LoadingComponentProps = { remSize: number; }; + +export type ContentProps = { children: ReactNode }; +export type HeaderProps = { children: ReactNode; description: string }; From 7601fca2f7835383b78bf1859fdc9c2782dccbea Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Wed, 19 Jul 2023 18:07:51 -0300 Subject: [PATCH 13/91] Format code --- src/frontend/src/components/ReactTooltipComponent/index.tsx | 2 +- src/frontend/src/contexts/undoRedoContext.tsx | 6 +++++- src/frontend/src/types/typesContext/index.ts | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/components/ReactTooltipComponent/index.tsx b/src/frontend/src/components/ReactTooltipComponent/index.tsx index 2e3733e2a..9b4120ee2 100644 --- a/src/frontend/src/components/ReactTooltipComponent/index.tsx +++ b/src/frontend/src/components/ReactTooltipComponent/index.tsx @@ -3,8 +3,8 @@ import type { FC } from "react"; import React from "react"; import { Tooltip as ReactTooltip } from "react-tooltip"; import "react-tooltip/dist/react-tooltip.css"; -import { classNames } from "../../utils/utils"; import { TooltipProps } from "../../types/components"; +import { classNames } from "../../utils/utils"; const TooltipReact: FC = ({ selector, diff --git a/src/frontend/src/contexts/undoRedoContext.tsx b/src/frontend/src/contexts/undoRedoContext.tsx index e3084cc5a..9fe07ab76 100644 --- a/src/frontend/src/contexts/undoRedoContext.tsx +++ b/src/frontend/src/contexts/undoRedoContext.tsx @@ -7,8 +7,12 @@ import { useState, } from "react"; import { useReactFlow } from "reactflow"; +import { + HistoryItem, + UseUndoRedoOptions, + undoRedoContextType, +} from "../types/typesContext"; import { TabsContext } from "./tabsContext"; -import { undoRedoContextType, UseUndoRedoOptions , UseUndoRedo, HistoryItem } from "../types/typesContext"; const initialValue = { undo: () => {}, diff --git a/src/frontend/src/types/typesContext/index.ts b/src/frontend/src/types/typesContext/index.ts index ab655f6e7..0f470862d 100644 --- a/src/frontend/src/types/typesContext/index.ts +++ b/src/frontend/src/types/typesContext/index.ts @@ -1,6 +1,6 @@ -import { ReactFlowInstance, Edge, Node } from "reactflow"; -import { APIClassType } from "../api"; +import { Edge, Node, ReactFlowInstance } from "reactflow"; import { AlertItemType } from "../alerts"; +import { APIClassType } from "../api"; const types: { [char: string]: string } = {}; const template: { [char: string]: APIClassType } = {}; From 54f1f5c504ecf20659655ebd78e7bb02b83dc1dd Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Thu, 20 Jul 2023 16:02:09 -0300 Subject: [PATCH 14/91] refactor[utils.ts]: Add type to functions that didnt have it --- src/frontend/src/types/components/index.ts | 212 +++++++++++++++++++++ src/frontend/src/utils/utils.ts | 21 +- 2 files changed, 223 insertions(+), 10 deletions(-) diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index df2a5ef81..476fa284e 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -203,3 +203,215 @@ export type HeaderProps = { children: ReactNode; description: string }; export interface languageMap { [key: string]: string | undefined; } + +export type groupedObjType = { + component: string; + family: string; + type: string; +}; + +export type dataObjType = { + base_classes: string[]; + custom_fields: object; + description: string; + display_name: string; + documentation: string; + output_types: Array; + template: object; +}; + +export type documentloadersType = { + AZLyricsLoader: dataObjType; + AirbyteJSONLoader: dataObjType; + BSHTMLLoader: dataObjType; + CSVLoader: dataObjType; + CoNLLULoader: dataObjType; + CollegeConfidentialLoader: dataObjType; + DirectoryLoader: dataObjType; + EverNoteLoader: dataObjType; + FacebookChatLoader: dataObjType; + GitLoader: dataObjType; + GitbookLoader: dataObjType; + GutenbergLoader: dataObjType; + HNLoader: dataObjType; + IFixitLoader: dataObjType; + IMSDbLoader: dataObjType; + NotionDirectoryLoader: dataObjType; + PyPDFDirectoryLoader: dataObjType; + PyPDFLoader: dataObjType; + ReadTheDocsLoader: dataObjType; + SRTLoader: dataObjType; + SlackDirectoryLoader: dataObjType; + TextLoader: dataObjType; + UnstructuredEmailLoader: dataObjType; + UnstructuredHTMLLoader: dataObjType; + UnstructuredMarkdownLoader: dataObjType; + UnstructuredPowerPointLoader: dataObjType; + UnstructuredWordDocumentLoader: dataObjType; + WebBaseLoader: dataObjType; +}; + +export type agentsType = { + AgentInitializer: dataObjType; + CSVAgent: dataObjType; + JsonAgent: dataObjType; + SQLAgent: dataObjType; + VectorStoreAgent: dataObjType; + VectorStoreRouterAgent: dataObjType; + ZeroShotAgent: dataObjType; +}; + +export type chainsType = { + CombineDocsChain: dataObjType; + ConversationChain: dataObjType; + ConversationalRetrievalChain: dataObjType; + LLMChain: dataObjType; + LLMCheckerChain: dataObjType; + LLMMathChain: dataObjType; + MidJourneyPromptChain: dataObjType; + RetrievalQA: dataObjType + RetrievalQAWithSourcesChain: dataObjType; + SQLDatabaseChain: dataObjType; + SeriesCharacterChain: dataObjType; + TimeTravelGuideChain: dataObjType; +} + +export type embeddingsType = { + CohereEmbeddings: dataObjType; + HuggingFaceEmbeddings: dataObjType; + OpenAIEmbeddings: dataObjType; +}; + +export type llmsTypes = { + Anthropic: dataObjType; + CTransformers: dataObjType; + ChatAnthropic: dataObjType; + ChatOpenAI: dataObjType; + Cohere: dataObjType; + HuggingFaceHub: dataObjType; + LlamaCpp: dataObjType; + OpenAI: dataObjType; + VertexAI: dataObjType; +} + +export type memoriesType = { + ConversationBufferMemory: dataObjType; + ConversationBufferWindowMemory: dataObjType; + ConversationEntityMemory: dataObjType; + ConversationKGMemory: dataObjType; + ConversationSummaryMemory: dataObjType; + MongoDBChatMessageHistory: dataObjType; + PostgresChatMessageHistory: dataObjType; + VectorStoreRetrieverMemory: dataObjType; +}; + +export type outputParsersType = { + ResponseSchema: dataObjType; + StructuredOutputParser: dataObjType; +}; + +export type promptsType = { + ChatMessagePromptTemplate: dataObjType; + ChatPromptTemplate: dataObjType; + HumanMessagePromptTemplate: dataObjType; + PromptTemplate: dataObjType; + SystemMessagePromptTemplate: dataObjType; +} + +export type retrieversType = { + MultiQueryRetriever: dataObjType; +}; + +export type textSplittersType = { + CharacterTextSplitter: dataObjType; + RecursiveCharacterTextSplitter: dataObjType; +}; + +export type toolkitsType = { + JsonToolkit: dataObjType; + OpenAPIToolkit: dataObjType; + VectorStoreInfo: dataObjType; + VectorStoreRouterToolkit: dataObjType; + VectorStoreToolkit: dataObjType; +}; + +export type toolsType = { + BingSearchRun: dataObjType; + Calculator: dataObjType; + GoogleSearchResults: dataObjType; + GoogleSearchRun: dataObjType; + GoogleSerperRun: dataObjType; + InfoSQLDatabaseTool: dataObjType; + JsonGetValueTool: dataObjType; + JsonListKeysTool: dataObjType; + JsonSpec: dataObjType; + ListSQLDatabaseTool: dataObjType; + "News API": dataObjType; + 'PAL-MATH': dataObjType; + "Podcast API": dataObjType; + PythonAstREPLTool: dataObjType; + PythonFunction: dataObjType; + PythonFunctionTool: dataObjType; + PythonREPLTool: dataObjType; + QuerySQLDataBaseTool: dataObjType; + RequestsDeleteTool: dataObjType; + RequestsGetTool: dataObjType; + RequestsPatchTool: dataObjType; + RequestsPostTool: dataObjType; + RequestsPutTool: dataObjType; + Search: dataObjType; + 'TMDB API': dataObjType; + Tool: dataObjType; + WikipediaQueryRun: dataObjType; + WolframAlphaQueryRun: dataObjType; +}; + +export type utilitiesType = { + BingSearchAPIWrapper: dataObjType; + GoogleSearchAPIWrapper: dataObjType; + GoogleSerperAPIWrapper: dataObjType; + SearxSearchWrapper: dataObjType; + SerpAPIWrapper: dataObjType; + WikipediaAPIWrapper: dataObjType; + WolframAlphaAPIWrapper: dataObjType; +}; + +export type vectorStoresType = { + Chroma: dataObjType; + FAISS: dataObjType; + MongoDBAtlasVectorSearch: dataObjType; + Pinecone: dataObjType; + Qdrant: dataObjType; + SupabaseVectorStore: dataObjType; + Weaviate: dataObjType; +}; + +export type wrappersType = { + SQLDatabase: dataObjType; + TextRequestsWrapper: dataObjType; +}; + +export type dataType = { + agents?: agentsType; + chains?: chainsType; + documentloaders?: documentloadersType; + embeddings?: embeddingsType; + llms?: llmsTypes; + memories?: memoriesType; + output_parsers?: outputParsersType; + prompts?: promptsType; + retrievers?: retrieversType; + textsplitters?: textSplittersType; + toolkits?: toolkitsType; + tools?: toolsType + utilities?: utilitiesType; + vectorstores?: vectorStoresType; + wrappers?: wrappersType; +}; + +export type tweakType = { + "ChatOpenAI-TxuiN": object; + "LLMChain-zPC3w": object; + "PromptTemplate-iNj5W": object; + "ConversationBufferMemory-JnodM": object; +} diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index a537dad37..78dcf3be7 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -1,20 +1,20 @@ import clsx, { ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; import { ADJECTIVES, DESCRIPTIONS, NOUNS } from "../flow_constants"; -import { IVarHighlightType } from "../types/components"; +import { IVarHighlightType, dataType, groupedObjType, tweakType } from "../types/components"; import { FlowType } from "../types/flow"; import { TabsState } from "../types/tabs"; import { buildTweaks } from "./reactflowUtils"; -export function classNames(...classes: Array) { +export function classNames(...classes: Array): string { return classes.filter(Boolean).join(" "); } -export function cn(...inputs: ClassValue[]) { +export function cn(...inputs: ClassValue[]): string { return twMerge(clsx(inputs)); } -export function toNormalCase(str: string) { +export function toNormalCase(str: string): string { let result = str .split("_") .map((word, index) => { @@ -36,7 +36,7 @@ export function toNormalCase(str: string) { .join(" "); } -export function normalCaseToSnakeCase(str: string) { +export function normalCaseToSnakeCase(str: string): string { return str .split(" ") .map((word, index) => { @@ -48,7 +48,7 @@ export function normalCaseToSnakeCase(str: string) { .join("_"); } -export function toTitleCase(str: string) { +export function toTitleCase(str: string): string { let result = str .split("_") .map((word, index) => { @@ -75,7 +75,7 @@ export function toTitleCase(str: string) { } export const upperCaseWords: string[] = ["llm", "uri"]; -export function checkUpperWords(str: string) { +export function checkUpperWords(str: string): string { const words = str.split(" ").map((word) => { return upperCaseWords.includes(word.toLowerCase()) ? word.toUpperCase() @@ -85,7 +85,7 @@ export function checkUpperWords(str: string) { return words.join(" "); } -export function groupByFamily(data, baseClasses, left, type) { +export function groupByFamily(data: dataType, baseClasses: string, left: boolean, type: string): groupedObjType[] { let parentOutput: string; let arrOfParent: string[] = []; let arrOfType: { family: string; type: string; component: string }[] = []; @@ -200,7 +200,7 @@ export function groupByFamily(data, baseClasses, left, type) { } } -export function buildInputs(tabsState, id) { +export function buildInputs(tabsState: object, id: string): string { return tabsState && tabsState[id] && tabsState[id].formKeysData && @@ -261,7 +261,8 @@ export function varHighlightHTML({ name }: IVarHighlightType): string { return html; }; -export function buildTweakObject(tweak) { +export function buildTweakObject(tweak: tweakType[]): string { + console.log(tweak) tweak.forEach((el) => { Object.keys(el).forEach((key) => { for (let kp in el[key]) { From fff6e494dbe1489d8b222d2807b0fdf3fc3f12f6 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Thu, 20 Jul 2023 16:50:32 -0300 Subject: [PATCH 15/91] refactor[src/pages]: Add types to pages functions that didnt have it --- src/frontend/src/pages/CommunityPage/index.tsx | 2 +- .../ConnectionLineComponent/index.tsx | 2 +- .../components/DisclosureComponent/index.tsx | 2 +- .../FlowPage/components/PageComponent/index.tsx | 2 +- .../components/extraSidebarComponent/index.tsx | 2 +- .../components/nodeToolbarComponent/index.tsx | 4 +++- src/frontend/src/pages/FlowPage/index.tsx | 2 +- src/frontend/src/pages/MainPage/index.tsx | 2 +- src/frontend/src/types/components/index.ts | 17 +++++++++++++++++ 9 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/frontend/src/pages/CommunityPage/index.tsx b/src/frontend/src/pages/CommunityPage/index.tsx index c3d028314..2c9ae8a29 100644 --- a/src/frontend/src/pages/CommunityPage/index.tsx +++ b/src/frontend/src/pages/CommunityPage/index.tsx @@ -8,7 +8,7 @@ import { CardComponent } from "../../components/cardComponent"; import IconComponent from "../../components/genericIconComponent"; import { getExamples } from "../../controllers/API"; import { FlowType } from "../../types/flow"; -export default function CommunityPage() { +export default function CommunityPage(): JSX.Element { const { flows, setTabId, downloadFlows, uploadFlows, addFlow } = useContext(TabsContext); diff --git a/src/frontend/src/pages/FlowPage/components/ConnectionLineComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/ConnectionLineComponent/index.tsx index 61a493613..0c535e4f8 100644 --- a/src/frontend/src/pages/FlowPage/components/ConnectionLineComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/ConnectionLineComponent/index.tsx @@ -6,7 +6,7 @@ const ConnectionLineComponent = ({ toX, toY, connectionLineStyle = {}, // provide a default value for connectionLineStyle -}: ConnectionLineComponentProps) => { +}: ConnectionLineComponentProps): JSX.Element => { return ( {({ open }) => ( diff --git a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx index 5469c4300..5505ef101 100644 --- a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx @@ -34,7 +34,7 @@ const nodeTypes = { genericNode: GenericNode, }; -export default function Page({ flow }: { flow: FlowType }) { +export default function Page({ flow }: { flow: FlowType }): JSX.Element { let { updateFlow, uploadFlow, diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx index 4ae486fda..877e2dae9 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx @@ -18,7 +18,7 @@ import { import { classNames } from "../../../../utils/utils"; import DisclosureComponent from "../DisclosureComponent"; -export default function ExtraSidebar() { +export default function ExtraSidebar(): JSX.Element { const { data } = useContext(typesContext); const { openPopUp } = useContext(PopUpContext); const { flows, tabId, uploadFlow, tabsState, saveFlow } = diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx index 35e07c88b..9d26d45eb 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx @@ -5,8 +5,10 @@ import IconComponent from "../../../../components/genericIconComponent"; import { TabsContext } from "../../../../contexts/tabsContext"; import EditNodeModal from "../../../../modals/EditNodeModal"; import { classNames } from "../../../../utils/utils"; +import { nodeToolbarType } from "../../../../types/components"; -const NodeToolbarComponent = (props) => { +const NodeToolbarComponent = (props): JSX.Element => { + console.log(props); const [nodeLength, setNodeLength] = useState( Object.keys(props.data.node.template).filter( (t) => diff --git a/src/frontend/src/pages/FlowPage/index.tsx b/src/frontend/src/pages/FlowPage/index.tsx index f47a485ff..e854e35d9 100644 --- a/src/frontend/src/pages/FlowPage/index.tsx +++ b/src/frontend/src/pages/FlowPage/index.tsx @@ -4,7 +4,7 @@ import { TabsContext } from "../../contexts/tabsContext"; import { getVersion } from "../../controllers/API"; import Page from "./components/PageComponent"; -export default function FlowPage() { +export default function FlowPage(): JSX.Element { const { flows, tabId, setTabId } = useContext(TabsContext); const { id } = useParams(); diff --git a/src/frontend/src/pages/MainPage/index.tsx b/src/frontend/src/pages/MainPage/index.tsx index f8e657da3..6bfacc8b9 100644 --- a/src/frontend/src/pages/MainPage/index.tsx +++ b/src/frontend/src/pages/MainPage/index.tsx @@ -5,7 +5,7 @@ import IconComponent from "../../components/genericIconComponent"; import { Button } from "../../components/ui/button"; import { USER_PROJECTS_HEADER } from "../../constants/constants"; import { TabsContext } from "../../contexts/tabsContext"; -export default function HomePage() { +export default function HomePage(): JSX.Element { const { flows, setTabId, downloadFlows, uploadFlows, addFlow, removeFlow } = useContext(TabsContext); diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 476fa284e..4e02e1403 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -415,3 +415,20 @@ export type tweakType = { "PromptTemplate-iNj5W": object; "ConversationBufferMemory-JnodM": object; } + +export type nodeToolbarType = { + data: { + id: string; + type: string; + node: { + base_classes: string[]; + description: string; + display_name: string; + documentation: string; + template: object; + }; + value: void; + }; + deleteNode: (idx: string) => void; + openPopUp: (element: any) => void; +}; From 84b2fb8aae4ea9cb89408e466a74bddd1c416bca Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Thu, 20 Jul 2023 17:12:50 -0300 Subject: [PATCH 16/91] refactor[CustomNodes]: Add types to functions that didnt have it --- .../GenericNode/components/parameterComponent/index.tsx | 2 +- src/frontend/src/CustomNodes/GenericNode/index.tsx | 2 +- .../pages/FlowPage/components/nodeToolbarComponent/index.tsx | 1 - src/frontend/src/utils/utils.ts | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index 06094f970..600258de5 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -44,7 +44,7 @@ export default function ParameterComponent({ required = false, optionalHandle = null, info = "", -}: ParameterComponentType) { +}: ParameterComponentType): JSX.Element { const ref = useRef(null); const refHtml = useRef(null); const refNumberComponents = useRef(0); diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index ba506c855..f7fa61edf 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -20,7 +20,7 @@ export default function GenericNode({ }: { data: NodeDataType; selected: boolean; -}) { +}): JSX.Element { const { setErrorData } = useContext(alertContext); const showError = useRef(true); const { types, deleteNode } = useContext(typesContext); diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx index 9d26d45eb..0dd042140 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx @@ -8,7 +8,6 @@ import { classNames } from "../../../../utils/utils"; import { nodeToolbarType } from "../../../../types/components"; const NodeToolbarComponent = (props): JSX.Element => { - console.log(props); const [nodeLength, setNodeLength] = useState( Object.keys(props.data.node.template).filter( (t) => diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 78dcf3be7..63efde176 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -262,7 +262,6 @@ export function varHighlightHTML({ name }: IVarHighlightType): string { }; export function buildTweakObject(tweak: tweakType[]): string { - console.log(tweak) tweak.forEach((el) => { Object.keys(el).forEach((key) => { for (let kp in el[key]) { From b5c6b06b3cc47e20395d73160b6bf1050076d886 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Thu, 20 Jul 2023 17:58:48 -0300 Subject: [PATCH 17/91] refactor[components]: Add types to functions that didnt have it --- .../components/AccordionComponent/index.tsx | 2 +- .../components/CrashErrorComponent/index.tsx | 2 +- .../EditFlowSettingsComponent/index.tsx | 2 +- .../src/components/RadialProgress/index.tsx | 2 +- .../ReactTooltipComponent/index.tsx | 2 +- .../components/SanitizedHTMLWrapper/index.tsx | 2 +- .../components/ShadTooltipComponent/index.tsx | 2 +- .../src/components/TooltipComponent/index.tsx | 2 +- .../src/components/cardComponent/index.tsx | 2 +- .../chatComponent/buildTrigger/index.tsx | 2 +- .../chatComponent/chatTrigger/index.tsx | 5 ++-- .../src/components/chatComponent/index.tsx | 2 +- .../components/codeAreaComponent/index.tsx | 2 +- .../components/dropdownComponent/index.tsx | 2 +- .../src/components/floatComponent/index.tsx | 2 +- .../components/menuBar/index.tsx | 3 ++- .../src/components/headerComponent/index.tsx | 2 +- .../src/components/inputComponent/index.tsx | 2 +- .../components/inputFileComponent/index.tsx | 2 +- .../components/inputListComponent/index.tsx | 2 +- .../src/components/intComponent/index.tsx | 2 +- .../src/components/loadingComponent/index.tsx | 2 +- .../src/components/promptComponent/index.tsx | 2 +- .../components/textAreaComponent/index.tsx | 2 +- .../src/components/toggleComponent/index.tsx | 2 +- .../components/toggleShadComponent/index.tsx | 2 +- src/frontend/src/types/components/index.ts | 24 +++++++++++++++++-- 27 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/frontend/src/components/AccordionComponent/index.tsx b/src/frontend/src/components/AccordionComponent/index.tsx index 7212e6a1b..3f6597d2a 100644 --- a/src/frontend/src/components/AccordionComponent/index.tsx +++ b/src/frontend/src/components/AccordionComponent/index.tsx @@ -12,7 +12,7 @@ export default function AccordionComponent({ children, open = [], keyValue, -}: AccordionComponentType) { +}: AccordionComponentType): JSX.Element { const [value, setValue] = useState( open.length === 0 ? "" : getOpenAccordion() ); diff --git a/src/frontend/src/components/CrashErrorComponent/index.tsx b/src/frontend/src/components/CrashErrorComponent/index.tsx index fd7d22c36..b435cca0b 100644 --- a/src/frontend/src/components/CrashErrorComponent/index.tsx +++ b/src/frontend/src/components/CrashErrorComponent/index.tsx @@ -1,4 +1,4 @@ -export default function CrashErrorComponent({ error, resetErrorBoundary }) { +export default function CrashErrorComponent({ error, resetErrorBoundary }): JSX.Element { return (
diff --git a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx index 6c1b77b6c..77dfc2422 100644 --- a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx +++ b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx @@ -13,7 +13,7 @@ export const EditFlowSettings: React.FC = ({ setName, setDescription, updateFlow, -}) => { +}): JSX.Element => { const [isMaxLength, setIsMaxLength] = useState(false); const handleNameChange = (event: ChangeEvent) => { diff --git a/src/frontend/src/components/RadialProgress/index.tsx b/src/frontend/src/components/RadialProgress/index.tsx index f277a9c80..f5160c40b 100644 --- a/src/frontend/src/components/RadialProgress/index.tsx +++ b/src/frontend/src/components/RadialProgress/index.tsx @@ -3,7 +3,7 @@ import { RadialProgressType } from "../../types/components"; export default function RadialProgressComponent({ value, color, -}: RadialProgressType) { +}: RadialProgressType): JSX.Element { const style = { "--value": value * 100, "--size": "1.5rem", diff --git a/src/frontend/src/components/ReactTooltipComponent/index.tsx b/src/frontend/src/components/ReactTooltipComponent/index.tsx index 9b4120ee2..9103ae21c 100644 --- a/src/frontend/src/components/ReactTooltipComponent/index.tsx +++ b/src/frontend/src/components/ReactTooltipComponent/index.tsx @@ -16,7 +16,7 @@ const TooltipReact: FC = ({ className, clickable, delayShow, -}) => { +}: TooltipProps): JSX.Element => { return (
{React.cloneElement(children as React.ReactElement, { diff --git a/src/frontend/src/components/SanitizedHTMLWrapper/index.tsx b/src/frontend/src/components/SanitizedHTMLWrapper/index.tsx index e76105c00..248f210a4 100644 --- a/src/frontend/src/components/SanitizedHTMLWrapper/index.tsx +++ b/src/frontend/src/components/SanitizedHTMLWrapper/index.tsx @@ -5,7 +5,7 @@ const SanitizedHTMLWrapper = ({ content, onClick, suppressWarning = false, -}) => { +}): JSX.Element => { const sanitizedHTML = DOMPurify.sanitize(content); return ( diff --git a/src/frontend/src/components/ShadTooltipComponent/index.tsx b/src/frontend/src/components/ShadTooltipComponent/index.tsx index 89f301e60..62d5bc2e4 100644 --- a/src/frontend/src/components/ShadTooltipComponent/index.tsx +++ b/src/frontend/src/components/ShadTooltipComponent/index.tsx @@ -8,7 +8,7 @@ export default function ShadTooltip({ children, styleClasses, delayDuration = 500, -}: ShadToolTipType) { +}: ShadToolTipType): JSX.Element { return ( {children} diff --git a/src/frontend/src/components/TooltipComponent/index.tsx b/src/frontend/src/components/TooltipComponent/index.tsx index 91fa006ec..5f105873d 100644 --- a/src/frontend/src/components/TooltipComponent/index.tsx +++ b/src/frontend/src/components/TooltipComponent/index.tsx @@ -5,7 +5,7 @@ export default function Tooltip({ children, title, placement, -}: TooltipComponentType) { +}: TooltipComponentType): JSX.Element { return ( {children} diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 12c409047..3a1388f53 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -21,7 +21,7 @@ export const CardComponent = ({ id: string; onDelete?: () => void; button?: JSX.Element; -}) => { +}): JSX.Element => { const { removeFlow } = useContext(TabsContext); return ( diff --git a/src/frontend/src/components/chatComponent/buildTrigger/index.tsx b/src/frontend/src/components/chatComponent/buildTrigger/index.tsx index 4eb69546e..b82a65db0 100644 --- a/src/frontend/src/components/chatComponent/buildTrigger/index.tsx +++ b/src/frontend/src/components/chatComponent/buildTrigger/index.tsx @@ -21,7 +21,7 @@ export default function BuildTrigger({ flow: FlowType; setIsBuilt: any; isBuilt: boolean; -}) { +}): JSX.Element { const { updateSSEData, isBuilding, setIsBuilding, sseData } = useSSE(); const { reactFlowInstance } = useContext(typesContext); const { setTabsState } = useContext(TabsContext); diff --git a/src/frontend/src/components/chatComponent/chatTrigger/index.tsx b/src/frontend/src/components/chatComponent/chatTrigger/index.tsx index a92a8e0cd..2be327904 100644 --- a/src/frontend/src/components/chatComponent/chatTrigger/index.tsx +++ b/src/frontend/src/components/chatComponent/chatTrigger/index.tsx @@ -9,11 +9,12 @@ import { } from "../../../constants/constants"; import { alertContext } from "../../../contexts/alertContext"; import IconComponent from "../../genericIconComponent"; +import { chatTriggerPropType } from "../../../types/components"; -export default function ChatTrigger({ open, setOpen, isBuilt, canOpen }) { +export default function ChatTrigger({ open, setOpen, isBuilt, canOpen }: chatTriggerPropType): JSX.Element { const { setErrorData } = useContext(alertContext); - function handleClick() { + function handleClick(): void { if (isBuilt) { if (canOpen) { setOpen(true); diff --git a/src/frontend/src/components/chatComponent/index.tsx b/src/frontend/src/components/chatComponent/index.tsx index 58c058866..044bf64c0 100644 --- a/src/frontend/src/components/chatComponent/index.tsx +++ b/src/frontend/src/components/chatComponent/index.tsx @@ -10,7 +10,7 @@ import { getBuildStatus } from "../../controllers/API"; import FormModal from "../../modals/formModal"; import { NodeType } from "../../types/flow"; -export default function Chat({ flow }: ChatType) { +export default function Chat({ flow }: ChatType): JSX.Element { const [open, setOpen] = useState(false); const [isBuilt, setIsBuilt] = useState(false); const [canOpen, setCanOpen] = useState(false); diff --git a/src/frontend/src/components/codeAreaComponent/index.tsx b/src/frontend/src/components/codeAreaComponent/index.tsx index 4f0fc3b17..1e3797ec9 100644 --- a/src/frontend/src/components/codeAreaComponent/index.tsx +++ b/src/frontend/src/components/codeAreaComponent/index.tsx @@ -12,7 +12,7 @@ export default function CodeAreaComponent({ editNode = false, nodeClass, setNodeClass, -}: TextAreaComponentType) { +}: TextAreaComponentType): JSX.Element { const [myValue, setMyValue] = useState( typeof value == "string" ? value : JSON.stringify(value) ); diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index 9b614c7ae..bb7b75c05 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -12,7 +12,7 @@ export default function Dropdown({ editNode = false, numberOfOptions = 0, apiModal = false, -}: DropDownComponentType) { +}: DropDownComponentType): JSX.Element { const { closePopUp } = useContext(PopUpContext); let [internalValue, setInternalValue] = useState( diff --git a/src/frontend/src/components/floatComponent/index.tsx b/src/frontend/src/components/floatComponent/index.tsx index 66b97db1a..fcee0d1a5 100644 --- a/src/frontend/src/components/floatComponent/index.tsx +++ b/src/frontend/src/components/floatComponent/index.tsx @@ -9,7 +9,7 @@ export default function FloatComponent({ disableCopyPaste = false, disabled, editNode = false, -}: FloatComponentType) { +}: FloatComponentType): JSX.Element { const [myValue, setMyValue] = useState(value ?? ""); const { setDisableCopyPaste } = useContext(TabsContext); const { closePopUp } = useContext(PopUpContext); diff --git a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx index 84777c5fe..6e5560bbd 100644 --- a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx +++ b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx @@ -15,8 +15,9 @@ import { undoRedoContext } from "../../../../contexts/undoRedoContext"; import FlowSettingsModal from "../../../../modals/flowSettingsModal"; import IconComponent from "../../../genericIconComponent"; import { Button } from "../../../ui/button"; +import { menuBarPropsType } from "../../../../types/components"; -export const MenuBar = ({ flows, tabId }) => { +export const MenuBar = ({ flows, tabId }: menuBarPropsType): JSX.Element => { const { updateFlow, setTabId, addFlow } = useContext(TabsContext); const { setErrorData } = useContext(alertContext); const { openPopUp } = useContext(PopUpContext); diff --git a/src/frontend/src/components/headerComponent/index.tsx b/src/frontend/src/components/headerComponent/index.tsx index 67f738821..ef067cd5c 100644 --- a/src/frontend/src/components/headerComponent/index.tsx +++ b/src/frontend/src/components/headerComponent/index.tsx @@ -14,7 +14,7 @@ import { Button } from "../ui/button"; import { Separator } from "../ui/separator"; import MenuBar from "./components/menuBar"; -export default function Header() { +export default function Header(): JSX.Element { const { flows, addFlow, tabId } = useContext(TabsContext); const { openPopUp } = useContext(PopUpContext); const { templates } = useContext(typesContext); diff --git a/src/frontend/src/components/inputComponent/index.tsx b/src/frontend/src/components/inputComponent/index.tsx index 1e6ca32ef..c976f1906 100644 --- a/src/frontend/src/components/inputComponent/index.tsx +++ b/src/frontend/src/components/inputComponent/index.tsx @@ -11,7 +11,7 @@ export default function InputComponent({ disabled, password, editNode = false, -}: InputComponentType) { +}: InputComponentType): JSX.Element { const [myValue, setMyValue] = useState(value ?? ""); const [pwdVisible, setPwdVisible] = useState(false); const { setDisableCopyPaste } = useContext(TabsContext); diff --git a/src/frontend/src/components/inputFileComponent/index.tsx b/src/frontend/src/components/inputFileComponent/index.tsx index 3f77734f3..4de6e3dbe 100644 --- a/src/frontend/src/components/inputFileComponent/index.tsx +++ b/src/frontend/src/components/inputFileComponent/index.tsx @@ -13,7 +13,7 @@ export default function InputFileComponent({ fileTypes, onFileChange, editNode = false, -}: FileComponentType) { +}: FileComponentType): JSX.Element { const [myValue, setMyValue] = useState(value); const [loading, setLoading] = useState(false); const { setErrorData } = useContext(alertContext); diff --git a/src/frontend/src/components/inputListComponent/index.tsx b/src/frontend/src/components/inputListComponent/index.tsx index 086473acc..853fd95d1 100644 --- a/src/frontend/src/components/inputListComponent/index.tsx +++ b/src/frontend/src/components/inputListComponent/index.tsx @@ -11,7 +11,7 @@ export default function InputListComponent({ disabled, editNode = false, onAddInput, -}: InputListComponentType) { +}: InputListComponentType): JSX.Element { const [inputList, setInputList] = useState(value ?? [""]); const { closePopUp } = useContext(PopUpContext); diff --git a/src/frontend/src/components/intComponent/index.tsx b/src/frontend/src/components/intComponent/index.tsx index ae47d856a..c3fc98c9c 100644 --- a/src/frontend/src/components/intComponent/index.tsx +++ b/src/frontend/src/components/intComponent/index.tsx @@ -9,7 +9,7 @@ export default function IntComponent({ disableCopyPaste = false, disabled, editNode = false, -}: FloatComponentType) { +}: FloatComponentType): JSX.Element { const [myValue, setMyValue] = useState(value ?? ""); const { setDisableCopyPaste } = useContext(TabsContext); const min = 0; diff --git a/src/frontend/src/components/loadingComponent/index.tsx b/src/frontend/src/components/loadingComponent/index.tsx index a1e406710..406dad793 100644 --- a/src/frontend/src/components/loadingComponent/index.tsx +++ b/src/frontend/src/components/loadingComponent/index.tsx @@ -1,6 +1,6 @@ import { LoadingComponentProps } from "../../types/components"; -export default function LoadingComponent({ remSize }: LoadingComponentProps) { +export default function LoadingComponent({ remSize }: LoadingComponentProps): JSX.Element { return (
{ diff --git a/src/frontend/src/components/toggleShadComponent/index.tsx b/src/frontend/src/components/toggleShadComponent/index.tsx index c06d42430..2af4696f4 100644 --- a/src/frontend/src/components/toggleShadComponent/index.tsx +++ b/src/frontend/src/components/toggleShadComponent/index.tsx @@ -6,7 +6,7 @@ export default function ToggleShadComponent({ setEnabled, disabled, size, -}: ToggleComponentType) { +}: ToggleComponentType): JSX.Element { let scaleX, scaleY; switch (size) { case "small": diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 4e02e1403..81cfbcb15 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -1,6 +1,6 @@ import { ReactElement, ReactNode } from "react"; import { APIClassType } from "../api"; -import { NodeDataType } from "../flow/index"; +import { FlowStyleType, NodeDataType } from "../flow/index"; import { typesContextType } from "../typesContext"; export type InputComponentType = { @@ -430,5 +430,25 @@ export type nodeToolbarType = { value: void; }; deleteNode: (idx: string) => void; - openPopUp: (element: any) => void; + openPopUp: (element) => JSX.Element; }; + +export type chatTriggerPropType = { + open: boolean; + isBuilt: boolean; + canOpen: boolean; + setOpen: (can: boolean) => void; +} + +export type headerFlowsType = { + data: object; + description: string; + id: string; + name: string; + style?: FlowStyleType; +} + +export type menuBarPropsType = { + flows: Array; + tabId: string; +} From 3a055b74115b328bc39079b2a73da11eadfa72a3 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Thu, 20 Jul 2023 18:01:06 -0300 Subject: [PATCH 18/91] refactor[alerts]: Add types to functions that didnt have it --- .../alertDropDown/components/singleAlertComponent/index.tsx | 2 +- src/frontend/src/alerts/alertDropDown/index.tsx | 2 +- src/frontend/src/alerts/error/index.tsx | 2 +- src/frontend/src/alerts/notice/index.tsx | 2 +- src/frontend/src/alerts/success/index.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx b/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx index 9a94db7d5..efba9d27b 100644 --- a/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx +++ b/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx @@ -7,7 +7,7 @@ import { SingleAlertComponentType } from "../../../../types/alerts"; export default function SingleAlert({ dropItem, removeAlert, -}: SingleAlertComponentType) { +}: SingleAlertComponentType): JSX.Element { const [show, setShow] = useState(true); const type = dropItem.type; diff --git a/src/frontend/src/alerts/alertDropDown/index.tsx b/src/frontend/src/alerts/alertDropDown/index.tsx index a3f69d707..8600adfeb 100644 --- a/src/frontend/src/alerts/alertDropDown/index.tsx +++ b/src/frontend/src/alerts/alertDropDown/index.tsx @@ -6,7 +6,7 @@ import { AlertDropdownType } from "../../types/alerts"; import { useOnClickOutside } from "../hooks/useOnClickOutside"; import SingleAlert from "./components/singleAlertComponent"; -export default function AlertDropdown({}: AlertDropdownType) { +export default function AlertDropdown({}: AlertDropdownType): JSX.Element { const { closePopUp } = useContext(PopUpContext); const componentRef = useRef(null); diff --git a/src/frontend/src/alerts/error/index.tsx b/src/frontend/src/alerts/error/index.tsx index 2b898f58a..eb626df2f 100644 --- a/src/frontend/src/alerts/error/index.tsx +++ b/src/frontend/src/alerts/error/index.tsx @@ -8,7 +8,7 @@ export default function ErrorAlert({ list = [], id, removeAlert, -}: ErrorAlertType) { +}: ErrorAlertType): JSX.Element { const [show, setShow] = useState(true); useEffect(() => { if (show) { diff --git a/src/frontend/src/alerts/notice/index.tsx b/src/frontend/src/alerts/notice/index.tsx index 494d9d4dc..2e6d6929e 100644 --- a/src/frontend/src/alerts/notice/index.tsx +++ b/src/frontend/src/alerts/notice/index.tsx @@ -9,7 +9,7 @@ export default function NoticeAlert({ link = "", id, removeAlert, -}: NoticeAlertType) { +}: NoticeAlertType): JSX.Element { const [show, setShow] = useState(true); useEffect(() => { if (show) { diff --git a/src/frontend/src/alerts/success/index.tsx b/src/frontend/src/alerts/success/index.tsx index 5cb89b530..6d82b51e5 100644 --- a/src/frontend/src/alerts/success/index.tsx +++ b/src/frontend/src/alerts/success/index.tsx @@ -7,7 +7,7 @@ export default function SuccessAlert({ title, id, removeAlert, -}: SuccessAlertType) { +}: SuccessAlertType): JSX.Element { const [show, setShow] = useState(true); useEffect(() => { if (show) { From 76a0a40656008e5f8b557f972872864268d15e25 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Thu, 20 Jul 2023 18:24:04 -0300 Subject: [PATCH 19/91] refactor[modals]: Add types to functions that didnt have it --- .../components/CrashErrorComponent/index.tsx | 5 ++- .../chatComponent/chatTrigger/index.tsx | 9 ++++- .../components/menuBar/index.tsx | 2 +- .../src/components/loadingComponent/index.tsx | 4 +- .../src/components/toggleComponent/index.tsx | 1 - src/frontend/src/modals/ApiModal/index.tsx | 2 +- .../src/modals/EditNodeModal/index.tsx | 8 +++- src/frontend/src/modals/NodeModal/index.tsx | 6 ++- .../src/modals/codeAreaModal/index.tsx | 8 ++-- src/frontend/src/modals/exportModal/index.tsx | 2 +- .../src/modals/flowSettingsModal/index.tsx | 6 +-- .../src/modals/formModal/chatInput/index.tsx | 3 +- .../formModal/chatMessage/codeBlock/index.tsx | 2 +- .../modals/formModal/chatMessage/index.tsx | 2 +- src/frontend/src/modals/formModal/index.tsx | 21 ++++++----- .../src/modals/genericModal/index.tsx | 10 ++--- .../modals/importModal/buttonBox/index.tsx | 2 +- src/frontend/src/modals/importModal/index.tsx | 6 +-- .../components/nodeToolbarComponent/index.tsx | 1 - src/frontend/src/pages/MainPage/index.tsx | 2 +- src/frontend/src/types/components/index.ts | 37 ++++++++++++------- src/frontend/src/utils/utils.ts | 22 ++++++++--- 22 files changed, 101 insertions(+), 60 deletions(-) diff --git a/src/frontend/src/components/CrashErrorComponent/index.tsx b/src/frontend/src/components/CrashErrorComponent/index.tsx index b435cca0b..cd6a976be 100644 --- a/src/frontend/src/components/CrashErrorComponent/index.tsx +++ b/src/frontend/src/components/CrashErrorComponent/index.tsx @@ -1,4 +1,7 @@ -export default function CrashErrorComponent({ error, resetErrorBoundary }): JSX.Element { +export default function CrashErrorComponent({ + error, + resetErrorBoundary, +}): JSX.Element { return (
diff --git a/src/frontend/src/components/chatComponent/chatTrigger/index.tsx b/src/frontend/src/components/chatComponent/chatTrigger/index.tsx index 2be327904..a390da8d2 100644 --- a/src/frontend/src/components/chatComponent/chatTrigger/index.tsx +++ b/src/frontend/src/components/chatComponent/chatTrigger/index.tsx @@ -8,10 +8,15 @@ import { FLOW_NOT_BUILT_TITLE, } from "../../../constants/constants"; import { alertContext } from "../../../contexts/alertContext"; -import IconComponent from "../../genericIconComponent"; import { chatTriggerPropType } from "../../../types/components"; +import IconComponent from "../../genericIconComponent"; -export default function ChatTrigger({ open, setOpen, isBuilt, canOpen }: chatTriggerPropType): JSX.Element { +export default function ChatTrigger({ + open, + setOpen, + isBuilt, + canOpen, +}: chatTriggerPropType): JSX.Element { const { setErrorData } = useContext(alertContext); function handleClick(): void { diff --git a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx index 6e5560bbd..8d71162de 100644 --- a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx +++ b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx @@ -13,9 +13,9 @@ import { Link, useNavigate } from "react-router-dom"; import { alertContext } from "../../../../contexts/alertContext"; import { undoRedoContext } from "../../../../contexts/undoRedoContext"; import FlowSettingsModal from "../../../../modals/flowSettingsModal"; +import { menuBarPropsType } from "../../../../types/components"; import IconComponent from "../../../genericIconComponent"; import { Button } from "../../../ui/button"; -import { menuBarPropsType } from "../../../../types/components"; export const MenuBar = ({ flows, tabId }: menuBarPropsType): JSX.Element => { const { updateFlow, setTabId, addFlow } = useContext(TabsContext); diff --git a/src/frontend/src/components/loadingComponent/index.tsx b/src/frontend/src/components/loadingComponent/index.tsx index 406dad793..0cd3c9ef0 100644 --- a/src/frontend/src/components/loadingComponent/index.tsx +++ b/src/frontend/src/components/loadingComponent/index.tsx @@ -1,6 +1,8 @@ import { LoadingComponentProps } from "../../types/components"; -export default function LoadingComponent({ remSize }: LoadingComponentProps): JSX.Element { +export default function LoadingComponent({ + remSize, +}: LoadingComponentProps): JSX.Element { return (
{ if (disabled) { diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index d4a5c887e..6afad22b5 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -53,7 +53,7 @@ import { getPythonApiCode, getPythonCode, } from "../../utils/utils"; -export default function ApiModal({ flow }: { flow: FlowType }) { +export default function ApiModal({ flow }: { flow: FlowType }): JSX.Element { const [open, setOpen] = useState(true); const { dark } = useContext(darkContext); const { closePopUp, closeEdit, setCloseEdit } = useContext(PopUpContext); diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index 901371d30..b9b97c97e 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -36,7 +36,11 @@ import { typesContext } from "../../contexts/typesContext"; import { NodeDataType } from "../../types/flow"; import { classNames } from "../../utils/utils"; -export default function EditNodeModal({ data }: { data: NodeDataType }) { +export default function EditNodeModal({ + data, +}: { + data: NodeDataType; +}): JSX.Element { const [open, setOpen] = useState(true); const [nodeLength, setNodeLength] = useState( Object.keys(data.node.template).filter( @@ -66,7 +70,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { closePopUp(); } - function setModalOpen(x: boolean) { + function setModalOpen(x: boolean): void { setOpen(x); if (x === false) { closePopUp(); diff --git a/src/frontend/src/modals/NodeModal/index.tsx b/src/frontend/src/modals/NodeModal/index.tsx index 162ffcf45..1a53ec312 100644 --- a/src/frontend/src/modals/NodeModal/index.tsx +++ b/src/frontend/src/modals/NodeModal/index.tsx @@ -9,7 +9,11 @@ import { nodeColors, nodeIconsLucide } from "../../utils/styleUtils"; import { classNames, toTitleCase } from "../../utils/utils"; import ModalField from "./components/ModalField"; -export default function NodeModal({ data }: { data: NodeDataType }) { +export default function NodeModal({ + data, +}: { + data: NodeDataType; +}): JSX.Element { const [open, setOpen] = useState(true); const { closePopUp } = useContext(PopUpContext); const { types } = useContext(typesContext); diff --git a/src/frontend/src/modals/codeAreaModal/index.tsx b/src/frontend/src/modals/codeAreaModal/index.tsx index deae92cbe..70cccf694 100644 --- a/src/frontend/src/modals/codeAreaModal/index.tsx +++ b/src/frontend/src/modals/codeAreaModal/index.tsx @@ -26,21 +26,21 @@ export default function CodeAreaModal({ value: string; nodeClass: APIClassType; setNodeClass: (Class: APIClassType) => void; -}) { +}): JSX.Element { const [code, setCode] = useState(value); const { dark } = useContext(darkContext); const { closePopUp, setCloseEdit } = useContext(PopUpContext); const { setErrorData, setSuccessData } = useContext(alertContext); - function setModalOpen(x: boolean) { + function setModalOpen(x: boolean): void { if (x === false) { setCloseEdit("codearea"); closePopUp(); } } - // Check for custom code errors - function handleClick() { + // Check for custom code errors + function handleClick(): void { postValidateCode(code) .then((apiReturn) => { if (apiReturn.data) { diff --git a/src/frontend/src/modals/exportModal/index.tsx b/src/frontend/src/modals/exportModal/index.tsx index d9574613b..b5ce1ce84 100644 --- a/src/frontend/src/modals/exportModal/index.tsx +++ b/src/frontend/src/modals/exportModal/index.tsx @@ -18,7 +18,7 @@ import { PopUpContext } from "../../contexts/popUpContext"; import { TabsContext } from "../../contexts/tabsContext"; import { removeApiKeys } from "../../utils/reactflowUtils"; -export default function ExportModal() { +export default function ExportModal(): JSX.Element { const [open, setOpen] = useState(true); const { closePopUp } = useContext(PopUpContext); const ref = useRef(); diff --git a/src/frontend/src/modals/flowSettingsModal/index.tsx b/src/frontend/src/modals/flowSettingsModal/index.tsx index ab5081dfc..82d663e3c 100644 --- a/src/frontend/src/modals/flowSettingsModal/index.tsx +++ b/src/frontend/src/modals/flowSettingsModal/index.tsx @@ -16,7 +16,7 @@ import { alertContext } from "../../contexts/alertContext"; import { PopUpContext } from "../../contexts/popUpContext"; import { TabsContext } from "../../contexts/tabsContext"; -export default function FlowSettingsModal() { +export default function FlowSettingsModal(): JSX.Element { const [open, setOpen] = useState(true); const { closePopUp } = useContext(PopUpContext); const { setErrorData, setSuccessData } = useContext(alertContext); @@ -28,7 +28,7 @@ export default function FlowSettingsModal() { const [description, setDescription] = useState( flows.find((f) => f.id === tabId).description ); - function setModalOpen(x: boolean) { + function setModalOpen(x: boolean): void { setOpen(x); if (x === false) { setTimeout(() => { @@ -36,7 +36,7 @@ export default function FlowSettingsModal() { }, 300); } } - function handleClick() { + function handleClick(): void { let savedFlow = flows.find((f) => f.id === tabId); savedFlow.name = name; savedFlow.description = description; diff --git a/src/frontend/src/modals/formModal/chatInput/index.tsx b/src/frontend/src/modals/formModal/chatInput/index.tsx index 63f224e92..1b4708549 100644 --- a/src/frontend/src/modals/formModal/chatInput/index.tsx +++ b/src/frontend/src/modals/formModal/chatInput/index.tsx @@ -1,5 +1,6 @@ import { useEffect } from "react"; import IconComponent from "../../../components/genericIconComponent"; +import { chatInputType } from "../../../types/components"; import { classNames } from "../../../utils/utils"; export default function ChatInput({ @@ -9,7 +10,7 @@ export default function ChatInput({ setChatValue, inputRef, noInput, -}) { +}: chatInputType): JSX.Element { useEffect(() => { if (!lockChat && inputRef.current) { inputRef.current.focus(); diff --git a/src/frontend/src/modals/formModal/chatMessage/codeBlock/index.tsx b/src/frontend/src/modals/formModal/chatMessage/codeBlock/index.tsx index ce121a7cf..2dd02eb05 100644 --- a/src/frontend/src/modals/formModal/chatMessage/codeBlock/index.tsx +++ b/src/frontend/src/modals/formModal/chatMessage/codeBlock/index.tsx @@ -9,7 +9,7 @@ interface Props { value: string; } -export function CodeBlock({ language, value }) { +export function CodeBlock({ language, value }: Props): JSX.Element { const [isCopied, setIsCopied] = useState(false); const copyToClipboard = () => { diff --git a/src/frontend/src/modals/formModal/chatMessage/index.tsx b/src/frontend/src/modals/formModal/chatMessage/index.tsx index 8a64e2f58..d2e643a10 100644 --- a/src/frontend/src/modals/formModal/chatMessage/index.tsx +++ b/src/frontend/src/modals/formModal/chatMessage/index.tsx @@ -20,7 +20,7 @@ export default function ChatMessage({ chat: ChatMessageType; lockChat: boolean; lastMessage: boolean; -}) { +}): JSX.Element { const convert = new Convert({ newline: true }); const [hidden, setHidden] = useState(true); const template = chat.template; diff --git a/src/frontend/src/modals/formModal/index.tsx b/src/frontend/src/modals/formModal/index.tsx index 48dfbc6ea..5b1f8277b 100644 --- a/src/frontend/src/modals/formModal/index.tsx +++ b/src/frontend/src/modals/formModal/index.tsx @@ -34,7 +34,7 @@ export default function FormModal({ open: boolean; setOpen: Function; flow: FlowType; -}) { +}): JSX.Element { const { tabsState, setTabsState } = useContext(TabsContext); const [chatValue, setChatValue] = useState(() => { try { @@ -147,7 +147,7 @@ export default function FormModal({ }); } - function handleOnClose(event: CloseEvent) { + function handleOnClose(event: CloseEvent): void { if (isOpen.current) { setErrorData({ title: event.reason }); setTimeout(() => { @@ -157,7 +157,10 @@ export default function FormModal({ } } - function getWebSocketUrl(chatId, isDevelopment = false) { + function getWebSocketUrl( + chatId: string, + isDevelopment: boolean = false + ): string { const isSecureProtocol = window.location.protocol === "https:"; const webSocketProtocol = isSecureProtocol ? "wss" : "ws"; const host = isDevelopment ? "localhost:7860" : window.location.host; @@ -238,7 +241,7 @@ export default function FormModal({ } } - function connectWS() { + function connectWS(): void { try { const urlWs = getWebSocketUrl( id.current, @@ -305,7 +308,7 @@ export default function FormModal({ // do not add connectWS on dependencies array }, [lockChat]); - async function sendAll(data: sendAllProps) { + async function sendAll(data: sendAllProps): Promise { try { if (ws) { ws.current.send(JSON.stringify(data)); @@ -332,7 +335,7 @@ export default function FormModal({ } }, [open]); - function sendMessage() { + function sendMessage(): void { let nodeValidationErrors = validateNodes(reactFlowInstance); if (nodeValidationErrors.length === 0) { setLockChat(true); @@ -365,17 +368,17 @@ export default function FormModal({ }); } } - function clearChat() { + function clearChat(): void { setChatHistory([]); ws.current.send(JSON.stringify({ clear_history: true })); if (lockChat) setLockChat(false); } - function setModalOpen(x: boolean) { + function setModalOpen(x: boolean): void { setOpen(x); } - function handleOnCheckedChange(checked: boolean, i: string) { + function handleOnCheckedChange(checked: boolean, i: string): void { if (checked === true) { setChatKey(i); setChatValue(tabsState[flow.id].formKeysData.input_keys[i]); diff --git a/src/frontend/src/modals/genericModal/index.tsx b/src/frontend/src/modals/genericModal/index.tsx index 5505f38c0..eacab3eeb 100644 --- a/src/frontend/src/modals/genericModal/index.tsx +++ b/src/frontend/src/modals/genericModal/index.tsx @@ -44,7 +44,7 @@ export default function GenericModal({ type: number; nodeClass?: APIClassType; setNodeClass?: (Class: APIClassType) => void; -}) { +}): JSX.Element { const [myButtonText] = useState(buttonText); const [myModalTitle] = useState(modalTitle); const [myModalType] = useState(type); @@ -56,7 +56,7 @@ export default function GenericModal({ useContext(alertContext); const { closePopUp, setCloseEdit } = useContext(PopUpContext); const ref = useRef(); - function setModalOpen(x: boolean) { + function setModalOpen(x: boolean): void { if (x === false) { setCloseEdit("generic"); closePopUp(); @@ -65,7 +65,7 @@ export default function GenericModal({ const divRef = useRef(null); const divRefPrompt = useRef(null); - function checkVariables(valueToCheck) { + function checkVariables(valueToCheck: string): void { const regex = /\{([^{}]+)\}/g; const matches = []; let match; @@ -111,7 +111,7 @@ export default function GenericModal({ .replace(regexHighlight, varHighlightHTML({ name: "$1" })) .replace(/\n/g, "
"); - const TextAreaContentView = () => { + const TextAreaContentView = (): JSX.Element => { return ( { sumOfCaracteres = sumOfCaracteres + element.replace(/[{}]/g, "").length; diff --git a/src/frontend/src/modals/importModal/buttonBox/index.tsx b/src/frontend/src/modals/importModal/buttonBox/index.tsx index 0a998d56e..5558dd13e 100644 --- a/src/frontend/src/modals/importModal/buttonBox/index.tsx +++ b/src/frontend/src/modals/importModal/buttonBox/index.tsx @@ -19,7 +19,7 @@ export default function ButtonBox({ textColor: string; deactivate?: boolean; size: "small" | "medium" | "big"; -}) { +}): JSX.Element { let bigCircle: string; let smallCircle: string; let titleFontSize: string; diff --git a/src/frontend/src/modals/importModal/index.tsx b/src/frontend/src/modals/importModal/index.tsx index 8c4f8a0d2..cf621807d 100644 --- a/src/frontend/src/modals/importModal/index.tsx +++ b/src/frontend/src/modals/importModal/index.tsx @@ -24,7 +24,7 @@ import { FlowType } from "../../types/flow"; import { classNames } from "../../utils/utils"; import ButtonBox from "./buttonBox"; -export default function ImportModal() { +export default function ImportModal(): JSX.Element { const [open, setOpen] = useState(true); const { setErrorData } = useContext(alertContext); const { closePopUp } = useContext(PopUpContext); @@ -33,7 +33,7 @@ export default function ImportModal() { const [loadingExamples, setLoadingExamples] = useState(false); const [examples, setExamples] = useState([]); const { uploadFlow, addFlow } = useContext(TabsContext); - function setModalOpen(x: boolean) { + function setModalOpen(x: boolean): void { setOpen(x); if (x === false) { setTimeout(() => { @@ -42,7 +42,7 @@ export default function ImportModal() { } } - function handleExamples() { + function handleExamples(): void { setLoadingExamples(true); getExamples() .then((result) => { diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx index 0dd042140..18178d37f 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx @@ -5,7 +5,6 @@ import IconComponent from "../../../../components/genericIconComponent"; import { TabsContext } from "../../../../contexts/tabsContext"; import EditNodeModal from "../../../../modals/EditNodeModal"; import { classNames } from "../../../../utils/utils"; -import { nodeToolbarType } from "../../../../types/components"; const NodeToolbarComponent = (props): JSX.Element => { const [nodeLength, setNodeLength] = useState( diff --git a/src/frontend/src/pages/MainPage/index.tsx b/src/frontend/src/pages/MainPage/index.tsx index 6bfacc8b9..6fc218161 100644 --- a/src/frontend/src/pages/MainPage/index.tsx +++ b/src/frontend/src/pages/MainPage/index.tsx @@ -8,7 +8,7 @@ import { TabsContext } from "../../contexts/tabsContext"; export default function HomePage(): JSX.Element { const { flows, setTabId, downloadFlows, uploadFlows, addFlow, removeFlow } = useContext(TabsContext); - + // Set a null id useEffect(() => { setTabId(""); diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 81cfbcb15..17ecee167 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -226,7 +226,7 @@ export type documentloadersType = { BSHTMLLoader: dataObjType; CSVLoader: dataObjType; CoNLLULoader: dataObjType; - CollegeConfidentialLoader: dataObjType; + CollegeConfidentialLoader: dataObjType; DirectoryLoader: dataObjType; EverNoteLoader: dataObjType; FacebookChatLoader: dataObjType; @@ -269,12 +269,12 @@ export type chainsType = { LLMCheckerChain: dataObjType; LLMMathChain: dataObjType; MidJourneyPromptChain: dataObjType; - RetrievalQA: dataObjType + RetrievalQA: dataObjType; RetrievalQAWithSourcesChain: dataObjType; SQLDatabaseChain: dataObjType; SeriesCharacterChain: dataObjType; TimeTravelGuideChain: dataObjType; -} +}; export type embeddingsType = { CohereEmbeddings: dataObjType; @@ -292,7 +292,7 @@ export type llmsTypes = { LlamaCpp: dataObjType; OpenAI: dataObjType; VertexAI: dataObjType; -} +}; export type memoriesType = { ConversationBufferMemory: dataObjType; @@ -316,7 +316,7 @@ export type promptsType = { HumanMessagePromptTemplate: dataObjType; PromptTemplate: dataObjType; SystemMessagePromptTemplate: dataObjType; -} +}; export type retrieversType = { MultiQueryRetriever: dataObjType; @@ -347,7 +347,7 @@ export type toolsType = { JsonSpec: dataObjType; ListSQLDatabaseTool: dataObjType; "News API": dataObjType; - 'PAL-MATH': dataObjType; + "PAL-MATH": dataObjType; "Podcast API": dataObjType; PythonAstREPLTool: dataObjType; PythonFunction: dataObjType; @@ -360,7 +360,7 @@ export type toolsType = { RequestsPostTool: dataObjType; RequestsPutTool: dataObjType; Search: dataObjType; - 'TMDB API': dataObjType; + "TMDB API": dataObjType; Tool: dataObjType; WikipediaQueryRun: dataObjType; WolframAlphaQueryRun: dataObjType; @@ -388,7 +388,7 @@ export type vectorStoresType = { export type wrappersType = { SQLDatabase: dataObjType; - TextRequestsWrapper: dataObjType; + TextRequestsWrapper: dataObjType; }; export type dataType = { @@ -403,7 +403,7 @@ export type dataType = { retrievers?: retrieversType; textsplitters?: textSplittersType; toolkits?: toolkitsType; - tools?: toolsType + tools?: toolsType; utilities?: utilitiesType; vectorstores?: vectorStoresType; wrappers?: wrappersType; @@ -414,7 +414,7 @@ export type tweakType = { "LLMChain-zPC3w": object; "PromptTemplate-iNj5W": object; "ConversationBufferMemory-JnodM": object; -} +}; export type nodeToolbarType = { data: { @@ -438,7 +438,7 @@ export type chatTriggerPropType = { isBuilt: boolean; canOpen: boolean; setOpen: (can: boolean) => void; -} +}; export type headerFlowsType = { data: object; @@ -446,9 +446,20 @@ export type headerFlowsType = { id: string; name: string; style?: FlowStyleType; -} +}; export type menuBarPropsType = { flows: Array; tabId: string; -} +}; + +export type chatInputType = { + chatValue: string; + inputRef: { + current: any; + }; + lockChat: boolean; + noInput: boolean; + sendMessage: () => void; + setChatValue: (value: string) => void; +}; diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 63efde176..bea1fcb01 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -1,7 +1,12 @@ import clsx, { ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; import { ADJECTIVES, DESCRIPTIONS, NOUNS } from "../flow_constants"; -import { IVarHighlightType, dataType, groupedObjType, tweakType } from "../types/components"; +import { + IVarHighlightType, + dataType, + groupedObjType, + tweakType, +} from "../types/components"; import { FlowType } from "../types/flow"; import { TabsState } from "../types/tabs"; import { buildTweaks } from "./reactflowUtils"; @@ -85,7 +90,12 @@ export function checkUpperWords(str: string): string { return words.join(" "); } -export function groupByFamily(data: dataType, baseClasses: string, left: boolean, type: string): groupedObjType[] { +export function groupByFamily( + data: dataType, + baseClasses: string, + left: boolean, + type: string +): groupedObjType[] { let parentOutput: string; let arrOfParent: string[] = []; let arrOfType: { family: string; type: string; component: string }[] = []; @@ -259,7 +269,7 @@ export function getRandomKeyByssmm(): string { export function varHighlightHTML({ name }: IVarHighlightType): string { const html = `{${name}}`; return html; -}; +} export function buildTweakObject(tweak: tweakType[]): string { tweak.forEach((el) => { @@ -331,7 +341,7 @@ def run_flow(inputs: dict, flow_id: str, tweaks: Optional[dict] = None) -> dict: # Setup any tweaks you want to apply to the flow inputs = ${inputs} print(run_flow(inputs, flow_id=FLOW_ID, tweaks=TWEAKS))`; -}; +} /** * Function to get the curl code for the API @@ -357,7 +367,7 @@ export function getCurlCode( ? buildTweakObject(tweak) : JSON.stringify(tweaks, null, 2) }}'`; -}; +} /** * Function to get the python code for the API @@ -382,4 +392,4 @@ flow = load_flow_from_json("${flowName}.json", tweaks=TWEAKS) # Now you can use it like any chain inputs = ${inputs} flow(inputs)`; -}; +} From 6113aae86f187120e0f5da2bd4085468d9a947fc Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Fri, 21 Jul 2023 17:08:15 -0300 Subject: [PATCH 20/91] Refactor[NodeModal]: Remove unnused code (NodeModal) --- .../src/CustomNodes/GenericNode/index.tsx | 8 - .../src/modals/EditNodeModal/index.tsx | 7 +- .../NodeModal/components/ModalField/index.tsx | 175 ------------------ src/frontend/src/modals/NodeModal/index.tsx | 167 ----------------- src/frontend/src/types/components/index.ts | 14 ++ 5 files changed, 19 insertions(+), 352 deletions(-) delete mode 100644 src/frontend/src/modals/NodeModal/components/ModalField/index.tsx delete mode 100644 src/frontend/src/modals/NodeModal/index.tsx diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index f7fa61edf..e3925fda9 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -7,7 +7,6 @@ import { useSSE } from "../../contexts/SSEContext"; import { alertContext } from "../../contexts/alertContext"; import { PopUpContext } from "../../contexts/popUpContext"; import { typesContext } from "../../contexts/typesContext"; -import NodeModal from "../../modals/NodeModal"; import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; import { NodeDataType } from "../../types/flow"; import { nodeColors, nodeIconsLucide } from "../../utils/styleUtils"; @@ -91,13 +90,6 @@ export default function GenericNode({
-
diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index b9b97c97e..05885a242 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -35,6 +35,7 @@ import { TabsContext } from "../../contexts/tabsContext"; import { typesContext } from "../../contexts/typesContext"; import { NodeDataType } from "../../types/flow"; import { classNames } from "../../utils/utils"; +import { editNodeToggleType } from "../../types/components"; export default function EditNodeModal({ data, @@ -87,7 +88,8 @@ export default function EditNodeModal({ setNodeValue(!nodeValue); } - const handleOnNewValue = (newValue: any, name) => { + const handleOnNewValue = (newValue, name) => { + console.log({ newValue, name }) data.node.template[name].value = newValue; // Set state to pending setTabsState((prev) => { @@ -210,6 +212,7 @@ export default function EditNodeModal({ ) : data.node.template[n].type === "bool" ? (
{" "} + oi
- ) : data.node.template[n].type === "str" && + ) : data.node.template[n].type === "str" && data.node.template[n].options ? (
- t.charAt(0) !== "_" && - data.node.template[t].advanced && - data.node.template[t].show - ).length - - 1 === - index - ? "pb-4" - : "" - )} - > - {display && ( -
- {title} - {required ? " *" : ""} -
- )} - - {type === "str" && !data.node.template[name].options ? ( -
- {data.node.template[name].list ? ( - { - data.node.template[name].value = t; - }} - /> - ) : data.node.template[name].multiline ? ( - { - data.node.template[name].value = t; - }} - /> - ) : ( - { - data.node.template[name].value = t; - }} - /> - )} -
- ) : type === "bool" ? ( -
- {" "} - { - data.node.template[name].value = t; - setEnabled(t); - }} - size="small" - /> -
- ) : type === "float" ? ( -
- { - data.node.template[name].value = t; - }} - /> -
- ) : type === "str" && data.node.template[name].options ? ( -
- (data.node.template[name].value = newValue)} - value={data.node.template[name].value ?? "Choose an option"} - > -
- ) : type === "int" ? ( -
- { - data.node.template[name].value = t; - }} - /> -
- ) : type === "file" ? ( -
- { - data.node.template[name].value = t; - }} - fileTypes={data.node.template[name].fileTypes} - suffixes={data.node.template[name].suffixes} - onFileChange={(t: string) => { - data.node.template[name].content = t; - }} - > -
- ) : type === "prompt" ? ( -
- { - data.node.template[name].value = t; - }} - /> -
- ) : type === "code" ? ( -
- { - data.node.template[name].value = t; - }} - /> -
- ) : ( -
- )} -
- ); -} diff --git a/src/frontend/src/modals/NodeModal/index.tsx b/src/frontend/src/modals/NodeModal/index.tsx deleted file mode 100644 index 1a53ec312..000000000 --- a/src/frontend/src/modals/NodeModal/index.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import { Dialog, Transition } from "@headlessui/react"; -import { Fragment, useContext, useRef, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import { limitScrollFieldsModal } from "../../constants/constants"; -import { PopUpContext } from "../../contexts/popUpContext"; -import { typesContext } from "../../contexts/typesContext"; -import { NodeDataType } from "../../types/flow"; -import { nodeColors, nodeIconsLucide } from "../../utils/styleUtils"; -import { classNames, toTitleCase } from "../../utils/utils"; -import ModalField from "./components/ModalField"; - -export default function NodeModal({ - data, -}: { - data: NodeDataType; -}): JSX.Element { - const [open, setOpen] = useState(true); - const { closePopUp } = useContext(PopUpContext); - const { types } = useContext(typesContext); - const ref = useRef(); - function setModalOpen(x: boolean) { - setOpen(x); - if (x === false) { - setTimeout(() => { - closePopUp(); - }, 300); - } - } - // any to avoid type conflict - const Icon: any = nodeIconsLucide[types[data.type]]; - return ( - - - -
- - -
-
- - -
- -
-
-
- -
- - {data.type} - -
-
-
-
-
- t.charAt(0) !== "_" && - data.node.template[t].advanced && - data.node.template[t].show - ).length > limitScrollFieldsModal - ? "overflow-scroll overflow-x-hidden custom-scroll" - : "overflow-hidden" - )} - > -
- {Object.keys(data.node.template) - .filter( - (t) => - t.charAt(0) !== "_" && - data.node.template[t].advanced && - data.node.template[t].show - ) - .map((t: string, idx) => { - return ( - - ); - })} -
-
-
-
-
- -
-
-
-
-
-
-
-
- ); -} diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 17ecee167..0472e0a0f 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -2,6 +2,7 @@ import { ReactElement, ReactNode } from "react"; import { APIClassType } from "../api"; import { FlowStyleType, NodeDataType } from "../flow/index"; import { typesContextType } from "../typesContext"; +import { BlobOptions } from "buffer"; export type InputComponentType = { value: string; @@ -463,3 +464,16 @@ export type chatInputType = { sendMessage: () => void; setChatValue: (value: string) => void; }; + +export type editNodeToggleType = { + advanced: boolean; + info: string; + list: boolean; + multiline: boolean; + name: string; + password: boolean; + placeholder: string; + required: boolean; + show: boolean; + type: string; +}; From 4fc636cb9b2b03a4d41de434234bbc0c8f7393d3 Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Mon, 24 Jul 2023 13:20:29 -0300 Subject: [PATCH 21/91] refactor[EditNodeModal]: Remove any types --- src/frontend/src/modals/EditNodeModal/index.tsx | 6 +++--- src/frontend/src/types/components/index.ts | 12 ++++++------ src/frontend/tsconfig.json | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index 05885a242..075bc22c9 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -78,7 +78,7 @@ export default function EditNodeModal({ } } - function changeAdvanced(node) { + function changeAdvanced(node: editNodeToggleType): void { Object.keys(data.node.template).map((n, i) => { if (n === node.name) { data.node.template[n].advanced = !data.node.template[n].advanced; @@ -88,8 +88,7 @@ export default function EditNodeModal({ setNodeValue(!nodeValue); } - const handleOnNewValue = (newValue, name) => { - console.log({ newValue, name }) + const handleOnNewValue = (newValue: string | string[] | boolean, name: string): void => { data.node.template[name].value = newValue; // Set state to pending setTabsState((prev) => { @@ -183,6 +182,7 @@ export default function EditNodeModal({ : data.node.template[n].value } onChange={(t: string[]) => { + console.log(t) handleOnNewValue(t, n); }} /> diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 0472e0a0f..bdaf78982 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -466,13 +466,13 @@ export type chatInputType = { }; export type editNodeToggleType = { - advanced: boolean; - info: string; + advanced?: boolean; + info?: string; list: boolean; - multiline: boolean; - name: string; - password: boolean; - placeholder: string; + multiline?: boolean; + name?: string; + password?: boolean; + placeholder?: string; required: boolean; show: boolean; type: string; diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json index c411ff4e7..88e7e83a6 100644 --- a/src/frontend/tsconfig.json +++ b/src/frontend/tsconfig.json @@ -15,7 +15,7 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - "noImplicitAny": false + "noImplicitAny": true }, "include": ["src"] } From 53a20ecccf03873ae8eb8e458f8b851207fdc3df Mon Sep 17 00:00:00 2001 From: Igor Carvalho Date: Mon, 24 Jul 2023 14:10:38 -0300 Subject: [PATCH 22/91] refactor[modals]: Remove any types --- src/frontend/src/modals/exportModal/index.tsx | 4 ++-- src/frontend/src/modals/formModal/chatInput/index.tsx | 6 +++--- .../modals/formModal/chatMessage/codeBlock/index.tsx | 10 +++------- .../src/modals/formModal/chatMessage/index.tsx | 2 +- .../src/modals/formModal/fileComponent/index.tsx | 10 ++++++---- src/frontend/src/types/components/index.ts | 11 +++++++++++ 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/frontend/src/modals/exportModal/index.tsx b/src/frontend/src/modals/exportModal/index.tsx index b5ce1ce84..7f6e9bd30 100644 --- a/src/frontend/src/modals/exportModal/index.tsx +++ b/src/frontend/src/modals/exportModal/index.tsx @@ -26,7 +26,7 @@ export default function ExportModal(): JSX.Element { const { flows, tabId, updateFlow, downloadFlow, saveFlow } = useContext(TabsContext); const [isMaxLength, setIsMaxLength] = useState(false); - function setModalOpen(x: boolean) { + function setModalOpen(x: boolean): void { setOpen(x); if (x === false) { setTimeout(() => { @@ -67,7 +67,7 @@ export default function ExportModal(): JSX.Element {
{ + onCheckedChange={(event: boolean): void => { setChecked(event); }} /> diff --git a/src/frontend/src/modals/formModal/chatInput/index.tsx b/src/frontend/src/modals/formModal/chatInput/index.tsx index 1b4708549..2050071d4 100644 --- a/src/frontend/src/modals/formModal/chatInput/index.tsx +++ b/src/frontend/src/modals/formModal/chatInput/index.tsx @@ -27,7 +27,7 @@ export default function ChatInput({ return (