diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8020b443c..26ec0f398 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,7 +7,7 @@ on:
type: string
description: 'The next version to release'
required: true
-
+
jobs:
release:
uses: datavisyn/github-workflows/.github/workflows/release-source.yml@feat-automate-releases-releasenotes
diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json
index b68cd39de..646297488 100644
--- a/cypress/tsconfig.json
+++ b/cypress/tsconfig.json
@@ -3,6 +3,7 @@
"compilerOptions": {
"outDir": "./dist",
"sourceMap": false,
+ "declarationMap": false,
"types": [
"cypress"
]
diff --git a/package.json b/package.json
index b064cebea..c24625ed9 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "visyn_core",
"description": "Core repository for datavisyn applications.",
- "version": "12.0.0",
+ "version": "13.0.0",
"author": {
"name": "datavisyn GmbH",
"email": "contact@datavisyn.io",
@@ -54,8 +54,10 @@
"all": "yarn run lint:fix && yarn run test && yarn run build && yarn run dist",
"build": "yarn run clean && yarn run compile && yarn run copy",
"clean": "visyn_scripts clean build dist lib",
- "compile:watch": "visyn_scripts compile --watch",
- "compile": "visyn_scripts compile",
+ "compile:watch": "visyn_scripts compile --watch -p tsconfig.lenient.json",
+ "compile": "visyn_scripts compile -p tsconfig.lenient.json",
+ "compile:strict:watch": "visyn_scripts compile --watch",
+ "compile:strict": "visyn_scripts compile",
"copy": "visyn_scripts copy",
"cy:open": "cypress open",
"cy:run": "cypress run --e2e",
@@ -75,29 +77,29 @@
"chromatic": "yarn run chromatic"
},
"dependencies": {
- "@emotion/css": "^11.11.2",
- "@emotion/react": "^11.11.4",
- "@fortawesome/fontawesome-free": "^6.5.2",
- "@fortawesome/fontawesome-svg-core": "^6.5.2",
- "@fortawesome/free-regular-svg-icons": "^6.5.2",
- "@fortawesome/free-solid-svg-icons": "^6.5.2",
+ "@emotion/css": "^11.13.0",
+ "@emotion/react": "^11.13.3",
+ "@fortawesome/fontawesome-free": "^6.6.0",
+ "@fortawesome/fontawesome-svg-core": "^6.6.0",
+ "@fortawesome/free-regular-svg-icons": "^6.6.0",
+ "@fortawesome/free-solid-svg-icons": "^6.6.0",
"@fortawesome/react-fontawesome": "^0.2.2",
- "@mantine/code-highlight": "~7.10.1",
- "@mantine/core": "~7.10.1",
- "@mantine/dates": "~7.10.1",
- "@mantine/dropzone": "~7.10.1",
- "@mantine/form": "~7.10.1",
- "@mantine/hooks": "~7.10.1",
- "@mantine/modals": "~7.10.1",
- "@mantine/notifications": "~7.10.1",
+ "@mantine/code-highlight": "~7.12.2",
+ "@mantine/core": "~7.12.2",
+ "@mantine/dates": "~7.12.2",
+ "@mantine/dropzone": "~7.12.2",
+ "@mantine/form": "~7.12.2",
+ "@mantine/hooks": "~7.12.2",
+ "@mantine/modals": "~7.12.2",
+ "@mantine/notifications": "~7.12.2",
"@mantine/styles": "~6.0.21",
- "@mantine/tiptap": "~7.10.1",
+ "@mantine/tiptap": "~7.12.2",
"@mantine6/core": "npm:@mantine/core@~6.0.21",
- "@sentry/react": "^8.8.0",
+ "@sentry/react": "^8.27.0",
"@types/d3-hexbin": "^0.2.5",
"@types/d3v7": "npm:@types/d3@^7.4.3",
"@types/plotly.js-dist-min": "^2.3.4",
- "@types/react": "^18.3.3",
+ "@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
"@types/react-plotly.js": "^2.6.3",
"arquero": "5.4.0",
@@ -106,7 +108,7 @@
"d3v7": "npm:d3@^7.9.0",
"fit-curve": "^0.2.0",
"html-to-image": "^1.11.11",
- "i18next": "^23.11.5",
+ "i18next": "^23.14.0",
"jstat": "^1.9.6",
"lineupjs": "4.11.0",
"lodash": "~4.17.21",
@@ -115,14 +117,27 @@
"react-dom": "~18.3.1",
"react-highlight-words": "^0.20.0",
"react-plotly.js": "^2.6.0",
- "react-spring": "^9.7.3",
+ "react-spring": "^9.7.4",
"use-deep-compare-effect": "^1.8.1",
- "visyn_scripts": "^9.0.0"
+ "visyn_scripts": "^11.1.0"
},
"devDependencies": {
- "@chromatic-com/storybook": "^1.5.0",
- "chromatic": "^11.5.3",
- "cypress": "^13.11.0"
+ "@chromatic-com/storybook": "^1.8.0",
+ "@playwright/test": "^1.45.2",
+ "@storybook/addon-actions": "^7.6.20",
+ "@storybook/addon-essentials": "^7.6.20",
+ "@storybook/addon-interactions": "^7.6.20",
+ "@storybook/addon-links": "^7.6.20",
+ "@storybook/addon-styling": "^1.3.7",
+ "@storybook/addon-styling-webpack": "^1.0.0",
+ "@storybook/cli": "^7.6.20",
+ "@storybook/react": "^7.6.20",
+ "@storybook/react-webpack5": "^7.6.20",
+ "@storybook/testing-library": "0.2.2",
+ "chromatic": "^11.7.1",
+ "cypress": "^13.14.2",
+ "storybook": "^7.6.20",
+ "storybook-addon-swc": "^1.2.0"
},
"visyn": {
"entries": {
diff --git a/requirements.txt b/requirements.txt
index 8b1ae1972..720889b6c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,45 +1,50 @@
# a2wsgi==1.6.0 # This WSIGMiddleware is not compatible with starlette_context
alembic==1.13.2
cachetools==5.3.3
-fastapi==0.111.0
+fastapi==0.112.2
json-cfg==0.4.2
openpyxl==3.1.5
-opentelemetry-api==1.25.0
-opentelemetry-exporter-otlp==1.25.0
-opentelemetry-exporter-prometheus==0.46b0
-opentelemetry-instrumentation-fastapi==0.46b0
-opentelemetry-instrumentation-httpx==0.46b0
-opentelemetry-instrumentation-logging==0.46b0
-opentelemetry-instrumentation-requests==0.46b0
-opentelemetry-instrumentation-sqlalchemy==0.46b0
-opentelemetry-instrumentation-system-metrics==0.46b0
-opentelemetry-sdk==1.25.0
-psycopg==3.1.19
+opentelemetry-api==1.27.0
+opentelemetry-exporter-otlp==1.27.0
+opentelemetry-exporter-prometheus==0.48b0
+opentelemetry-instrumentation-fastapi==0.48b0
+opentelemetry-instrumentation-httpx==0.48b0
+opentelemetry-instrumentation-logging==0.48b0
+opentelemetry-instrumentation-requests==0.48b0
+opentelemetry-instrumentation-sqlalchemy==0.48b0
+opentelemetry-instrumentation-system-metrics==0.48b0
+opentelemetry-sdk==1.27.0
+psycopg==3.2.1
psycopg2==2.9.9
pydantic==1.10.17
-pyjwt[crypto]==2.8.0
-pytest-postgresql==6.0.0
+pyjwt[crypto]==2.9.0
+pytest-postgresql==6.0.1
python-dateutil==2.9.0.post0
requests==2.32.3
-sentry-sdk~=2.11.0
-SQLAlchemy>=1.4.40,<=1.4.52
+sentry-sdk~=2.13.0
+SQLAlchemy>=1.4.40,<=1.4.53
starlette-context==0.3.6
-uvicorn[standard]==0.30.1
# Extras from fastapi[all], which we can't install because it requires pydantic v2: https://github.com/tiangolo/fastapi/blob/master/pyproject.toml#L79-L103
-fastapi-cli >=0.0.4
-# # For the test client
-httpx >=0.27.0
+fastapi-cli[standard]>=0.0.5
+# For the test client
+httpx>=0.23.0
# For templates
-jinja2 >=2.11.2
+jinja2>=2.11.2
# For forms and file uploads
-python-multipart >=0.0.7
+python-multipart>=0.0.7
# For Starlette's SessionMiddleware, not commonly used with FastAPI
-itsdangerous >=1.1.0
+itsdangerous>=1.1.0
# For Starlette's schema generation, would not be used with FastAPI
-pyyaml >=5.3.1
+pyyaml>=5.3.1
# For UJSONResponse
-ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0
+ujson>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0
# For ORJSONResponse
-orjson >=3.2.1
+orjson>=3.2.1
# To validate email fields
-email_validator >=2.0.0
\ No newline at end of file
+email-validator>=2.0.0
+# Uvicorn with uvloop
+uvicorn[standard]>=0.30.6
+# Disabled as we are still on Pydantic 1: Settings management
+# pydantic-settings>=2.0.0
+# Disabled as we are still on Pydantic 1: Extra Pydantic data types
+# pydantic-extra-types>=2.0.0
diff --git a/src/app/VisynApp.tsx b/src/app/VisynApp.tsx
index bb34a9637..7118b5b33 100644
--- a/src/app/VisynApp.tsx
+++ b/src/app/VisynApp.tsx
@@ -27,15 +27,15 @@ export function VisynApp({
children,
loginMenu = ,
}: {
- header?: ReactElement>;
- headerConfig?: Partial;
- navbar?: ReactElement>;
- navbarConfig?: AppShellProps['navbar'];
- aside?: ReactElement>;
- footer?: ReactElement>;
- footerConfig?: AppShellProps['footer'];
- appShellProps?: Partial>;
- loginMenu?: JSX.Element;
+ header?: ReactElement> | null;
+ headerConfig?: Partial | null;
+ navbar?: ReactElement> | null;
+ navbarConfig?: AppShellProps['navbar'] | null;
+ aside?: ReactElement> | null;
+ footer?: ReactElement> | null;
+ footerConfig?: AppShellProps['footer'] | null;
+ appShellProps?: Partial> | null;
+ loginMenu?: JSX.Element | null;
children?: React.ReactNode;
}) {
useVisynAppContext();
@@ -52,8 +52,8 @@ export function VisynApp({
},
}}
{...appShellProps}
- navbar={navbarConfig}
- footer={footerConfig}
+ navbar={navbarConfig ?? undefined}
+ footer={footerConfig ?? undefined}
header={{ height: 50, ...headerConfig }}
>
{navbar}
diff --git a/src/app/VisynAppContext.tsx b/src/app/VisynAppContext.tsx
index 326524a6c..a9810825c 100644
--- a/src/app/VisynAppContext.tsx
+++ b/src/app/VisynAppContext.tsx
@@ -5,8 +5,12 @@ import type { IUser } from '../security';
export const VisynAppContext = React.createContext<{
user: IUser | null;
appName: JSX.Element | string;
- clientConfig: IClientConfig;
-}>(null);
+ clientConfig: IClientConfig | null;
+}>({
+ user: null,
+ appName: '',
+ clientConfig: null,
+});
export function useVisynAppContext() {
const context = React.useContext(VisynAppContext);
diff --git a/src/app/header/AboutAppModal.tsx b/src/app/header/AboutAppModal.tsx
index a8b28207e..dae5853aa 100644
--- a/src/app/header/AboutAppModal.tsx
+++ b/src/app/header/AboutAppModal.tsx
@@ -9,7 +9,7 @@ import { WebpackEnv } from '../../base';
*/
export interface IAboutAppModalConfig {
// Middle section of the modal
- content: JSX.Element;
+ content?: JSX.Element;
// Bottom section of the modal
bottom?: JSX.Element;
customerLogo?: JSX.Element;
@@ -36,9 +36,9 @@ export function AboutAppModal({
content,
opened,
onClose,
- dvLogo = null,
+ dvLogo = undefined,
bottom,
- customerLogo = null,
+ customerLogo = undefined,
}: {
opened: boolean;
onClose: () => void;
diff --git a/src/app/header/ConfigurationMenu.tsx b/src/app/header/ConfigurationMenu.tsx
index 1e63871bb..1e14ab44c 100644
--- a/src/app/header/ConfigurationMenu.tsx
+++ b/src/app/header/ConfigurationMenu.tsx
@@ -5,7 +5,7 @@ import React from 'react';
import { useVisynAppContext } from '../VisynAppContext';
import { AboutAppModal, IAboutAppModalConfig } from './AboutAppModal';
-export function ConfigurationMenu({ menu, dvLogo, aboutAppModal }: { menu: JSX.Element; dvLogo: JSX.Element; aboutAppModal?: IAboutAppModalConfig }) {
+export function ConfigurationMenu({ menu, dvLogo, aboutAppModal }: { menu?: JSX.Element; dvLogo: JSX.Element; aboutAppModal?: IAboutAppModalConfig }) {
const { appName } = useVisynAppContext();
const [showAboutModal, setShowAboutModal] = React.useState(false);
diff --git a/src/app/header/UserMenu.tsx b/src/app/header/UserMenu.tsx
index 8400fdb33..b87340e03 100644
--- a/src/app/header/UserMenu.tsx
+++ b/src/app/header/UserMenu.tsx
@@ -3,7 +3,7 @@ import React from 'react';
import { css } from '@emotion/css';
import { LoginUtils } from '../../security';
-export function UserMenu({ menu, user, color }: { menu: JSX.Element; user: string; color: string }) {
+export function UserMenu({ menu, user, color }: { menu?: JSX.Element; user: string; color?: string }) {
return (