Merge branch 'develop' into 'main'
Develop See merge request digiresilience/link/link-stack!12
This commit is contained in:
commit
36103e36b5
60 changed files with 1294 additions and 5458 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:20-bookworm AS base
|
FROM node:22-bookworm-slim AS base
|
||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
ARG APP_DIR=/opt/bridge-frontend
|
ARG APP_DIR=/opt/bridge-frontend
|
||||||
|
|
|
||||||
|
|
@ -3,23 +3,16 @@
|
||||||
import { FC, PropsWithChildren, useState } from "react";
|
import { FC, PropsWithChildren, useState } from "react";
|
||||||
import { Grid } from "@mui/material";
|
import { Grid } from "@mui/material";
|
||||||
import { CssBaseline } from "@mui/material";
|
import { CssBaseline } from "@mui/material";
|
||||||
|
import { AppRouterCacheProvider } from "@mui/material-nextjs/v14-appRouter";
|
||||||
import { SessionProvider } from "next-auth/react";
|
import { SessionProvider } from "next-auth/react";
|
||||||
import { css, Global } from "@emotion/react";
|
|
||||||
import { fonts } from "@link-stack/ui";
|
|
||||||
import { Sidebar } from "./Sidebar";
|
import { Sidebar } from "./Sidebar";
|
||||||
|
|
||||||
export const InternalLayout: FC<PropsWithChildren> = ({ children }) => {
|
export const InternalLayout: FC<PropsWithChildren> = ({ children }) => {
|
||||||
const [open, setOpen] = useState(true);
|
const [open, setOpen] = useState(true);
|
||||||
const { roboto } = fonts;
|
|
||||||
const globalCSS = css`
|
|
||||||
* {
|
|
||||||
font-family: ${roboto.style.fontFamily};
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<AppRouterCacheProvider>
|
||||||
<SessionProvider>
|
<SessionProvider>
|
||||||
<Global styles={globalCSS} />
|
|
||||||
<CssBaseline />
|
<CssBaseline />
|
||||||
<Grid container direction="row">
|
<Grid container direction="row">
|
||||||
<Sidebar open={open} setOpen={setOpen} />
|
<Sidebar open={open} setOpen={setOpen} />
|
||||||
|
|
@ -31,5 +24,6 @@ export const InternalLayout: FC<PropsWithChildren> = ({ children }) => {
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</SessionProvider>
|
</SessionProvider>
|
||||||
|
</AppRouterCacheProvider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import NextAuth from "next-auth";
|
import NextAuth from "next-auth";
|
||||||
import { authOptions } from "@/app/_lib/authentication";
|
import { authOptions } from "@/app/_lib/authentication";
|
||||||
|
|
||||||
// @ts-expect-error
|
|
||||||
const handler = NextAuth(authOptions);
|
const handler = NextAuth(authOptions);
|
||||||
|
|
||||||
export { handler as GET, handler as POST };
|
export { handler as GET, handler as POST };
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
transpilePackages: ["@link-stack/ui", "@link-stack/bridge-common", "@link-stack/bridge-ui"],
|
transpilePackages: ["@link-stack/ui", "@link-stack/bridge-common", "@link-stack/bridge-ui"],
|
||||||
|
poweredByHeader: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
|
|
||||||
|
|
@ -13,42 +13,24 @@
|
||||||
"migrate:down:one": "tsx database/migrate.ts down:one"
|
"migrate:down:one": "tsx database/migrate.ts down:one"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@auth/kysely-adapter": "^1.4.2",
|
"@auth/kysely-adapter": "^1.5.2",
|
||||||
"@emotion/cache": "^11.13.1",
|
|
||||||
"@emotion/react": "^11.13.0",
|
|
||||||
"@emotion/styled": "^11.13.0",
|
|
||||||
"@mui/icons-material": "^5",
|
"@mui/icons-material": "^5",
|
||||||
"@mui/material": "^5",
|
"@mui/material": "^5",
|
||||||
"@mui/material-nextjs": "^5.16.6",
|
"@mui/material-nextjs": "^5",
|
||||||
"@mui/x-data-grid-pro": "^7.12.1",
|
"@mui/x-license": "^7.18.0",
|
||||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
|
||||||
"@mui/x-license": "^7.12.0",
|
|
||||||
"@link-stack/bridge-common": "*",
|
"@link-stack/bridge-common": "*",
|
||||||
"@link-stack/bridge-ui": "*",
|
"@link-stack/bridge-ui": "*",
|
||||||
"@link-stack/signal-api": "*",
|
"next": "14.2.13",
|
||||||
"date-fns": "^3.6.0",
|
"next-auth": "^4.24.8",
|
||||||
"dotenv": "^16.4.5",
|
|
||||||
"graphile-worker": "^0.16.6",
|
|
||||||
"kysely": "0.26.1",
|
|
||||||
"material-ui-popup-state": "^5.1.2",
|
|
||||||
"mui-chips-input": "^2.1.5",
|
|
||||||
"next": "14.2.5",
|
|
||||||
"next-auth": "^4.24.7",
|
|
||||||
"pg": "^8.12.0",
|
|
||||||
"react": "18.3.1",
|
"react": "18.3.1",
|
||||||
"react-cookie": "^7.2.0",
|
|
||||||
"react-digit-input": "^2.1.0",
|
|
||||||
"react-dom": "18.3.1",
|
"react-dom": "18.3.1",
|
||||||
"react-qr-code": "^2.0.15",
|
|
||||||
"react-timer-hook": "^3.0.7",
|
|
||||||
"sharp": "^0.33.5",
|
"sharp": "^0.33.5",
|
||||||
"tss-react": "^4.9.12",
|
"tsx": "^4.19.1",
|
||||||
"tsx": "^4.19.0",
|
|
||||||
"@link-stack/ui": "*"
|
"@link-stack/ui": "*"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22",
|
"@types/node": "^22",
|
||||||
"@types/pg": "^8.11.8",
|
"@types/pg": "^8.11.10",
|
||||||
"@types/react": "^18",
|
"@types/react": "^18",
|
||||||
"@types/react-dom": "^18",
|
"@types/react-dom": "^18",
|
||||||
"@link-stack/eslint-config": "*",
|
"@link-stack/eslint-config": "*",
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,12 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"kysely": "0.26.1",
|
"kysely": "0.26.1",
|
||||||
"pg": "^8.12.0",
|
"pg": "^8.13.0",
|
||||||
"tsx": "^4.19.0"
|
"tsx": "^4.19.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22",
|
"@types/node": "^22",
|
||||||
"@types/pg": "^8.11.8",
|
"@types/pg": "^8.11.10",
|
||||||
"@link-stack/eslint-config": "*",
|
"@link-stack/eslint-config": "*",
|
||||||
"@link-stack/typescript-config": "*",
|
"@link-stack/typescript-config": "*",
|
||||||
"typescript": "^5"
|
"typescript": "^5"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:20-bookworm AS base
|
FROM node:22-bookworm-slim AS base
|
||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
ARG APP_DIR=/opt/bridge-whatsapp
|
ARG APP_DIR=/opt/bridge-whatsapp
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,10 @@
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@adiwajshing/keyed-db": "0.2.4",
|
"@adiwajshing/keyed-db": "0.2.4",
|
||||||
"@hapi/boom": "^10.0.1",
|
|
||||||
"@hapi/hapi": "^21.3.10",
|
"@hapi/hapi": "^21.3.10",
|
||||||
"@hapipal/schmervice": "^3.0.0",
|
"@hapipal/schmervice": "^3.0.0",
|
||||||
"@hapipal/toys": "^4.0.0",
|
"@hapipal/toys": "^4.0.0",
|
||||||
"@whiskeysockets/baileys": "^6.7.7",
|
"@whiskeysockets/baileys": "^6.7.8",
|
||||||
"hapi-pino": "^12.1.0",
|
"hapi-pino": "^12.1.0",
|
||||||
"link-preview-js": "^3.0.5"
|
"link-preview-js": "^3.0.5"
|
||||||
},
|
},
|
||||||
|
|
@ -20,8 +19,8 @@
|
||||||
"@link-stack/typescript-config": "*",
|
"@link-stack/typescript-config": "*",
|
||||||
"@types/node": "*",
|
"@types/node": "*",
|
||||||
"dotenv-cli": "^7.4.2",
|
"dotenv-cli": "^7.4.2",
|
||||||
"tsx": "^4.19.0",
|
"tsx": "^4.19.1",
|
||||||
"typescript": "^5.5.4"
|
"typescript": "^5.6.2"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc -p tsconfig.json",
|
"build": "tsc -p tsconfig.json",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:20-bookworm AS base
|
FROM node:22-bookworm-slim AS base
|
||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
ARG APP_DIR=/opt/bridge-worker
|
ARG APP_DIR=/opt/bridge-worker
|
||||||
|
|
|
||||||
|
|
@ -16,24 +16,14 @@
|
||||||
"@link-stack/signal-api": "*",
|
"@link-stack/signal-api": "*",
|
||||||
"fluent-ffmpeg": "^2.1.3",
|
"fluent-ffmpeg": "^2.1.3",
|
||||||
"graphile-worker": "^0.16.6",
|
"graphile-worker": "^0.16.6",
|
||||||
"html-to-text": "^9.0.5",
|
"remeda": "^2.14.0",
|
||||||
"jest": "^29.7.0",
|
"twilio": "^5.3.2"
|
||||||
"kysely": "^0.27.3",
|
|
||||||
"pg": "^8.12.0",
|
|
||||||
"remeda": "^2.11.0",
|
|
||||||
"twilio": "^5.2.3"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.25.2",
|
|
||||||
"@babel/preset-env": "7.25.4",
|
|
||||||
"@babel/preset-typescript": "7.24.7",
|
|
||||||
"@types/fluent-ffmpeg": "^2.1.26",
|
"@types/fluent-ffmpeg": "^2.1.26",
|
||||||
"dotenv-cli": "^7.4.2",
|
"dotenv-cli": "^7.4.2",
|
||||||
"@link-stack/eslint-config": "*",
|
"@link-stack/eslint-config": "*",
|
||||||
"prettier": "^3.3.3",
|
|
||||||
"@link-stack/typescript-config": "*",
|
"@link-stack/typescript-config": "*",
|
||||||
"ts-node": "^10.9.2",
|
"typescript": "^5.6.2"
|
||||||
"typedoc": "^0.26.6",
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
const path = require("path");
|
|
||||||
const toPath = (filePath) => path.join(process.cwd(), filePath);
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
stories: [
|
|
||||||
"../stories/**/*.stories.mdx",
|
|
||||||
"../stories/**/*.stories.@(js|jsx|ts|tsx)",
|
|
||||||
],
|
|
||||||
addons: [
|
|
||||||
"@storybook/addon-docs",
|
|
||||||
"@storybook/addon-links",
|
|
||||||
"@storybook/addon-essentials",
|
|
||||||
],
|
|
||||||
webpackFinal: async (config) => {
|
|
||||||
return {
|
|
||||||
...config,
|
|
||||||
resolve: {
|
|
||||||
...config.resolve,
|
|
||||||
alias: {
|
|
||||||
...config.resolve.alias,
|
|
||||||
"@emotion/core": toPath("node_modules/@emotion/react"),
|
|
||||||
"emotion-theming": toPath("node_modules/@emotion/react"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
import { AppProvider } from "../components/common/AppProvider";
|
|
||||||
import { I18n } from "react-polyglot";
|
|
||||||
import en from "../locales/en.json";
|
|
||||||
import "@fontsource/roboto/400.css";
|
|
||||||
import "@fontsource/poppins/400.css";
|
|
||||||
import "@fontsource/poppins/700.css";
|
|
||||||
import "@fontsource/playfair-display/900.css";
|
|
||||||
|
|
||||||
const locale = "en";
|
|
||||||
const messages = { en };
|
|
||||||
|
|
||||||
export const decorators = [
|
|
||||||
(Story) => (
|
|
||||||
<I18n locale={locale} messages={messages[locale]}>
|
|
||||||
<AppProvider>
|
|
||||||
<Story />
|
|
||||||
</AppProvider>
|
|
||||||
</I18n>
|
|
||||||
),
|
|
||||||
];
|
|
||||||
|
|
||||||
export const parameters = {
|
|
||||||
actions: { argTypesRegex: "^on[A-Z].*" },
|
|
||||||
controls: {
|
|
||||||
matchers: {
|
|
||||||
color: /(background|color)$/i,
|
|
||||||
date: /Date$/,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:20 AS base
|
FROM node:22-bookworm-slim AS base
|
||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
ARG APP_DIR=/opt/leafcutter
|
ARG APP_DIR=/opt/leafcutter
|
||||||
|
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
# Patterns to ignore when building packages.
|
|
||||||
# This supports shell glob matching, relative path matching, and
|
|
||||||
# negation (prefixed with !). Only one pattern per line.
|
|
||||||
.DS_Store
|
|
||||||
# Common VCS dirs
|
|
||||||
.git/
|
|
||||||
.gitignore
|
|
||||||
.bzr/
|
|
||||||
.bzrignore
|
|
||||||
.hg/
|
|
||||||
.hgignore
|
|
||||||
.svn/
|
|
||||||
# Common backup files
|
|
||||||
*.swp
|
|
||||||
*.bak
|
|
||||||
*.tmp
|
|
||||||
*.orig
|
|
||||||
*~
|
|
||||||
# Various IDEs
|
|
||||||
.project
|
|
||||||
.idea/
|
|
||||||
*.tmproj
|
|
||||||
.vscode/
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
apiVersion: v2
|
|
||||||
name: leafcutter
|
|
||||||
description: A Helm chart for Kubernetes
|
|
||||||
type: application
|
|
||||||
version: 0.2.0
|
|
||||||
appVersion: "0.2.0"
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
1. Get the application URL by running these commands:
|
|
||||||
{{- if .Values.ingress.enabled }}
|
|
||||||
{{- range $host := .Values.ingress.hosts }}
|
|
||||||
{{- range .paths }}
|
|
||||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
{{- else if contains "NodePort" .Values.service.type }}
|
|
||||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "charts.fullname" . }})
|
|
||||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
|
||||||
echo http://$NODE_IP:$NODE_PORT
|
|
||||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
|
||||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
|
||||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "charts.fullname" . }}'
|
|
||||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "charts.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
|
||||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
|
||||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
|
||||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "charts.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
|
||||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
|
||||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
|
||||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
|
||||||
{{- end }}
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
{{/*
|
|
||||||
Expand the name of the chart.
|
|
||||||
*/}}
|
|
||||||
{{- define "charts.name" -}}
|
|
||||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
{{/*
|
|
||||||
Create a default fully qualified app name.
|
|
||||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
|
||||||
If release name contains chart name it will be used as a full name.
|
|
||||||
*/}}
|
|
||||||
{{- define "charts.fullname" -}}
|
|
||||||
{{- if .Values.fullnameOverride }}
|
|
||||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
|
||||||
{{- else }}
|
|
||||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
|
||||||
{{- if contains $name .Release.Name }}
|
|
||||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
|
||||||
{{- else }}
|
|
||||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
{{/*
|
|
||||||
Create chart name and version as used by the chart label.
|
|
||||||
*/}}
|
|
||||||
{{- define "charts.chart" -}}
|
|
||||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
{{/*
|
|
||||||
Common labels
|
|
||||||
*/}}
|
|
||||||
{{- define "charts.labels" -}}
|
|
||||||
helm.sh/chart: {{ include "charts.chart" . }}
|
|
||||||
{{ include "charts.selectorLabels" . }}
|
|
||||||
{{- if .Chart.AppVersion }}
|
|
||||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
|
||||||
{{- end }}
|
|
||||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
{{/*
|
|
||||||
Selector labels
|
|
||||||
*/}}
|
|
||||||
{{- define "charts.selectorLabels" -}}
|
|
||||||
app.kubernetes.io/name: {{ include "charts.name" . }}
|
|
||||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
{{/*
|
|
||||||
Create the name of the service account to use
|
|
||||||
*/}}
|
|
||||||
{{- define "charts.serviceAccountName" -}}
|
|
||||||
{{- if .Values.serviceAccount.create }}
|
|
||||||
{{- default (include "charts.fullname" .) .Values.serviceAccount.name }}
|
|
||||||
{{- else }}
|
|
||||||
{{- default "default" .Values.serviceAccount.name }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: {{ include "charts.fullname" . }}
|
|
||||||
labels:
|
|
||||||
{{- include "charts.labels" . | nindent 4 }}
|
|
||||||
spec:
|
|
||||||
{{- if not .Values.autoscaling.enabled }}
|
|
||||||
replicas: {{ .Values.replicaCount }}
|
|
||||||
{{- end }}
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
{{- include "charts.selectorLabels" . | nindent 6 }}
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
{{- with .Values.podAnnotations }}
|
|
||||||
annotations:
|
|
||||||
{{- toYaml . | nindent 8 }}
|
|
||||||
{{- end }}
|
|
||||||
labels:
|
|
||||||
{{- include "charts.selectorLabels" . | nindent 8 }}
|
|
||||||
spec:
|
|
||||||
{{- with .Values.imagePullSecrets }}
|
|
||||||
imagePullSecrets:
|
|
||||||
{{- toYaml . | nindent 8 }}
|
|
||||||
{{- end }}
|
|
||||||
serviceAccountName: {{ include "charts.serviceAccountName" . }}
|
|
||||||
securityContext:
|
|
||||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
|
||||||
containers:
|
|
||||||
- name: {{ .Chart.Name }}
|
|
||||||
securityContext:
|
|
||||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
|
||||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
|
||||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
|
||||||
env:
|
|
||||||
{{- range .Values.env }}
|
|
||||||
- name: {{ .name }}
|
|
||||||
value: {{ .value }}
|
|
||||||
{{- end }}
|
|
||||||
ports:
|
|
||||||
- name: http
|
|
||||||
containerPort: 3000
|
|
||||||
protocol: TCP
|
|
||||||
livenessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /
|
|
||||||
port: http
|
|
||||||
readinessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /
|
|
||||||
port: http
|
|
||||||
resources:
|
|
||||||
{{- toYaml .Values.resources | nindent 12 }}
|
|
||||||
{{- with .Values.nodeSelector }}
|
|
||||||
nodeSelector:
|
|
||||||
{{- toYaml . | nindent 8 }}
|
|
||||||
{{- end }}
|
|
||||||
{{- with .Values.affinity }}
|
|
||||||
affinity:
|
|
||||||
{{- toYaml . | nindent 8 }}
|
|
||||||
{{- end }}
|
|
||||||
{{- with .Values.tolerations }}
|
|
||||||
tolerations:
|
|
||||||
{{- toYaml . | nindent 8 }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
{{- if .Values.autoscaling.enabled }}
|
|
||||||
apiVersion: autoscaling/v2beta1
|
|
||||||
kind: HorizontalPodAutoscaler
|
|
||||||
metadata:
|
|
||||||
name: {{ include "charts.fullname" . }}
|
|
||||||
labels:
|
|
||||||
{{- include "charts.labels" . | nindent 4 }}
|
|
||||||
spec:
|
|
||||||
scaleTargetRef:
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
name: {{ include "charts.fullname" . }}
|
|
||||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
|
||||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
|
||||||
metrics:
|
|
||||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
|
||||||
- type: Resource
|
|
||||||
resource:
|
|
||||||
name: cpu
|
|
||||||
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
|
||||||
{{- end }}
|
|
||||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
|
||||||
- type: Resource
|
|
||||||
resource:
|
|
||||||
name: memory
|
|
||||||
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
{{- if .Values.ingress.enabled -}}
|
|
||||||
{{- $fullName := include "charts.fullname" . -}}
|
|
||||||
{{- $svcPort := .Values.service.port -}}
|
|
||||||
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
|
||||||
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
|
||||||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
|
|
||||||
apiVersion: networking.k8s.io/v1
|
|
||||||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
|
||||||
apiVersion: networking.k8s.io/v1beta1
|
|
||||||
{{- else -}}
|
|
||||||
apiVersion: extensions/v1beta1
|
|
||||||
{{- end }}
|
|
||||||
kind: Ingress
|
|
||||||
metadata:
|
|
||||||
name: {{ $fullName }}
|
|
||||||
labels:
|
|
||||||
{{- include "charts.labels" . | nindent 4 }}
|
|
||||||
{{- with .Values.ingress.annotations }}
|
|
||||||
annotations:
|
|
||||||
{{- toYaml . | nindent 4 }}
|
|
||||||
{{- end }}
|
|
||||||
spec:
|
|
||||||
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
|
||||||
ingressClassName: {{ .Values.ingress.className }}
|
|
||||||
{{- end }}
|
|
||||||
{{- if .Values.ingress.tls }}
|
|
||||||
tls:
|
|
||||||
{{- range .Values.ingress.tls }}
|
|
||||||
- hosts:
|
|
||||||
{{- range .hosts }}
|
|
||||||
- {{ . | quote }}
|
|
||||||
{{- end }}
|
|
||||||
secretName: {{ .secretName }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
rules:
|
|
||||||
{{- range .Values.ingress.hosts }}
|
|
||||||
- host: {{ .host | quote }}
|
|
||||||
http:
|
|
||||||
paths:
|
|
||||||
{{- range .paths }}
|
|
||||||
- path: {{ .path }}
|
|
||||||
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
|
||||||
pathType: {{ .pathType }}
|
|
||||||
{{- end }}
|
|
||||||
backend:
|
|
||||||
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
|
||||||
service:
|
|
||||||
name: {{ $fullName }}
|
|
||||||
port:
|
|
||||||
number: {{ $svcPort }}
|
|
||||||
{{- else }}
|
|
||||||
serviceName: {{ $fullName }}
|
|
||||||
servicePort: {{ $svcPort }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: {{ include "charts.fullname" . }}
|
|
||||||
labels:
|
|
||||||
{{- include "charts.labels" . | nindent 4 }}
|
|
||||||
spec:
|
|
||||||
type: {{ .Values.service.type }}
|
|
||||||
ports:
|
|
||||||
- port: {{ .Values.service.port }}
|
|
||||||
targetPort: http
|
|
||||||
protocol: TCP
|
|
||||||
name: http
|
|
||||||
selector:
|
|
||||||
{{- include "charts.selectorLabels" . | nindent 4 }}
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
{{- if .Values.serviceAccount.create -}}
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ServiceAccount
|
|
||||||
metadata:
|
|
||||||
name: {{ include "charts.serviceAccountName" . }}
|
|
||||||
labels:
|
|
||||||
{{- include "charts.labels" . | nindent 4 }}
|
|
||||||
{{- with .Values.serviceAccount.annotations }}
|
|
||||||
annotations:
|
|
||||||
{{- toYaml . | nindent 4 }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
apiVersion: v1
|
|
||||||
kind: Pod
|
|
||||||
metadata:
|
|
||||||
name: "{{ include "charts.fullname" . }}-test-connection"
|
|
||||||
labels:
|
|
||||||
{{- include "charts.labels" . | nindent 4 }}
|
|
||||||
annotations:
|
|
||||||
"helm.sh/hook": test
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: wget
|
|
||||||
image: busybox
|
|
||||||
command: ['wget']
|
|
||||||
args: ['{{ include "charts.fullname" . }}:{{ .Values.service.port }}']
|
|
||||||
restartPolicy: Never
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
replicaCount: 1
|
|
||||||
|
|
||||||
image:
|
|
||||||
repository: registry.gitlab.com/digiresilience/link/link-stack/leafcutter
|
|
||||||
pullPolicy: IfNotPresent
|
|
||||||
tag: "main"
|
|
||||||
|
|
||||||
imagePullSecrets: []
|
|
||||||
|
|
||||||
nameOverride: ""
|
|
||||||
|
|
||||||
fullnameOverride: ""
|
|
||||||
|
|
||||||
env: []
|
|
||||||
|
|
||||||
serviceAccount:
|
|
||||||
create: true
|
|
||||||
annotations: {}
|
|
||||||
name: ""
|
|
||||||
|
|
||||||
podAnnotations: {}
|
|
||||||
|
|
||||||
podSecurityContext: {}
|
|
||||||
|
|
||||||
securityContext: {}
|
|
||||||
|
|
||||||
service:
|
|
||||||
type: ClusterIP
|
|
||||||
port: 3000
|
|
||||||
|
|
||||||
ingress:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
resources: {}
|
|
||||||
|
|
||||||
autoscaling:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
nodeSelector: {}
|
|
||||||
|
|
||||||
tolerations: []
|
|
||||||
|
|
||||||
affinity: {}
|
|
||||||
2
apps/leafcutter/next-env.d.ts
vendored
2
apps/leafcutter/next-env.d.ts
vendored
|
|
@ -3,4 +3,4 @@
|
||||||
/// <reference types="next/navigation-types/compat/navigation" />
|
/// <reference types="next/navigation-types/compat/navigation" />
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
// NOTE: This file should not be edited
|
||||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,9 @@
|
||||||
const ContentSecurityPolicy = `
|
|
||||||
default-src 'self';
|
|
||||||
script-src 'self';
|
|
||||||
child-src example.com;
|
|
||||||
style-src 'self' example.com;
|
|
||||||
font-src 'self';
|
|
||||||
`;
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
transpilePackages: ["@link-stack/leafcutter-ui", "@link-stack/opensearch-common"],
|
transpilePackages: ["@link-stack/leafcutter-ui", "@link-stack/opensearch-common"],
|
||||||
experimental: {
|
experimental: {
|
||||||
missingSuspenseWithCSRBailout: false,
|
missingSuspenseWithCSRBailout: false,
|
||||||
},
|
},
|
||||||
|
poweredByHeader: false,
|
||||||
rewrites: async () => ({
|
rewrites: async () => ({
|
||||||
fallback: [
|
fallback: [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -14,46 +14,36 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/cache": "^11.13.1",
|
"@emotion/cache": "^11.13.1",
|
||||||
"@emotion/react": "^11.13.0",
|
"@emotion/react": "^11.13.3",
|
||||||
"@emotion/server": "^11.11.0",
|
"@emotion/server": "^11.11.0",
|
||||||
"@emotion/styled": "^11.13.0",
|
"@emotion/styled": "^11.13.0",
|
||||||
"@link-stack/leafcutter-ui": "*",
|
"@link-stack/leafcutter-ui": "*",
|
||||||
"@link-stack/opensearch-common": "*",
|
"@link-stack/opensearch-common": "*",
|
||||||
"@mui/icons-material": "^5",
|
"@mui/icons-material": "^5",
|
||||||
"@mui/material": "^5",
|
"@mui/material": "^5",
|
||||||
"@mui/material-nextjs": "^5.16.6",
|
"@mui/material-nextjs": "^5",
|
||||||
"@mui/x-data-grid-pro": "^7.12.1",
|
"@mui/x-date-pickers-pro": "^7.18.0",
|
||||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
"@opensearch-project/opensearch": "^2.12.0",
|
||||||
"@opensearch-project/opensearch": "^2.11.0",
|
"date-fns": "^4.1.0",
|
||||||
"cryptr": "^6.3.0",
|
"http-proxy-middleware": "^3.0.2",
|
||||||
"date-fns": "^3.6.0",
|
"material-ui-popup-state": "^5.3.1",
|
||||||
"http-proxy-middleware": "^3.0.0",
|
"next": "14.2.13",
|
||||||
"material-ui-popup-state": "^5.1.2",
|
"next-auth": "^4.24.8",
|
||||||
"next": "14.2.5",
|
|
||||||
"next-auth": "^4.24.7",
|
|
||||||
"react": "18.3.1",
|
"react": "18.3.1",
|
||||||
"react-cookie": "^7.2.0",
|
"react-cookie": "^7.2.0",
|
||||||
"react-cookie-consent": "^9.0.0",
|
"react-cookie-consent": "^9.0.0",
|
||||||
"react-dom": "18.3.1",
|
"react-dom": "18.3.1",
|
||||||
"react-iframe": "^1.8.5",
|
"react-iframe": "^1.8.5",
|
||||||
"react-markdown": "^9.0.1",
|
|
||||||
"react-polyglot": "^0.7.2",
|
"react-polyglot": "^0.7.2",
|
||||||
"sharp": "^0.33.5",
|
"sharp": "^0.33.5",
|
||||||
"uuid": "^10.0.0"
|
"uuid": "^10.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@types/node": "^22.7.3",
|
||||||
"@types/node": "^22.5.2",
|
"@types/react": "18.3.9",
|
||||||
"@types/react": "18.3.5",
|
|
||||||
"@types/uuid": "^10.0.0",
|
"@types/uuid": "^10.0.0",
|
||||||
"babel-loader": "^9.1.3",
|
"@link-stack/eslint-config": "*",
|
||||||
"eslint": "^8.0.0",
|
"@link-stack/typescript-config": "*",
|
||||||
"eslint-config-next": "^14.2.7",
|
"typescript": "5.6.2"
|
||||||
"eslint-config-prettier": "^9.1.0",
|
|
||||||
"eslint-plugin-import": "^2.29.1",
|
|
||||||
"eslint-plugin-jsx-a11y": "^6.9.0",
|
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
|
||||||
"eslint-plugin-react": "^7.35.0",
|
|
||||||
"typescript": "5.5.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:20-bookworm AS base
|
FROM node:22-bookworm-slim AS base
|
||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
ARG APP_DIR=/opt/link
|
ARG APP_DIR=/opt/link
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { FC, useState } from "react";
|
import { FC, useState, useEffect } from "react";
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Grid,
|
Grid,
|
||||||
|
|
@ -14,7 +14,7 @@ import {
|
||||||
Google as GoogleIcon,
|
Google as GoogleIcon,
|
||||||
Key as KeyIcon,
|
Key as KeyIcon,
|
||||||
} from "@mui/icons-material";
|
} from "@mui/icons-material";
|
||||||
import { signIn } from "next-auth/react";
|
import { signIn, getProviders } from "next-auth/react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import LinkLogo from "public/link-logo-small.png";
|
import LinkLogo from "public/link-logo-small.png";
|
||||||
import { colors, fonts } from "@link-stack/ui";
|
import { colors, fonts } from "@link-stack/ui";
|
||||||
|
|
@ -29,6 +29,7 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
||||||
typeof window !== "undefined" && window.location.origin
|
typeof window !== "undefined" && window.location.origin
|
||||||
? window.location.origin
|
? window.location.origin
|
||||||
: "";
|
: "";
|
||||||
|
const [provider, setProvider] = useState(undefined);
|
||||||
const [email, setEmail] = useState("");
|
const [email, setEmail] = useState("");
|
||||||
const [password, setPassword] = useState("");
|
const [password, setPassword] = useState("");
|
||||||
const params = useSearchParams();
|
const params = useSearchParams();
|
||||||
|
|
@ -63,6 +64,14 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchProviders = async () => {
|
||||||
|
const providers = await getProviders();
|
||||||
|
setProvider(Object.keys(providers)?.pop());
|
||||||
|
};
|
||||||
|
fetchProviders();
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{ backgroundColor: darkGray, height: "100vh" }}>
|
<Box sx={{ backgroundColor: darkGray, height: "100vh" }}>
|
||||||
<Container maxWidth="md" sx={{ p: 10 }}>
|
<Container maxWidth="md" sx={{ p: 10 }}>
|
||||||
|
|
@ -142,6 +151,7 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
||||||
</Box>
|
</Box>
|
||||||
</Grid>
|
</Grid>
|
||||||
) : null}
|
) : null}
|
||||||
|
{provider === "google" && (
|
||||||
<Grid item sx={{ width: "100%" }}>
|
<Grid item sx={{ width: "100%" }}>
|
||||||
<IconButton
|
<IconButton
|
||||||
sx={buttonStyles}
|
sx={buttonStyles}
|
||||||
|
|
@ -155,6 +165,8 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
||||||
Sign in with Google
|
Sign in with Google
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
)}
|
||||||
|
{provider === "apple" && (
|
||||||
<Grid item sx={{ width: "100%" }}>
|
<Grid item sx={{ width: "100%" }}>
|
||||||
<IconButton
|
<IconButton
|
||||||
aria-label="Sign in with Apple"
|
aria-label="Sign in with Apple"
|
||||||
|
|
@ -169,19 +181,9 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
||||||
Sign in with Apple
|
Sign in with Apple
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid>
|
)}
|
||||||
<Typography
|
{provider === "credentials" && (
|
||||||
variant="body1"
|
<Grid item container spacing={3}>
|
||||||
sx={{
|
|
||||||
fontSize: 18,
|
|
||||||
color: white,
|
|
||||||
textAlign: "center",
|
|
||||||
mt: 3,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
⸺ or ⸺
|
|
||||||
</Typography>
|
|
||||||
</Grid>
|
|
||||||
<Grid item sx={{ width: "100%" }}>
|
<Grid item sx={{ width: "100%" }}>
|
||||||
<TextField
|
<TextField
|
||||||
value={email}
|
value={email}
|
||||||
|
|
@ -221,6 +223,8 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
)}
|
||||||
|
</Grid>
|
||||||
</Container>
|
</Container>
|
||||||
) : null}
|
) : null}
|
||||||
{session ? (
|
{session ? (
|
||||||
|
|
|
||||||
|
|
@ -29,9 +29,9 @@ import {
|
||||||
import { usePathname } from "next/navigation";
|
import { usePathname } from "next/navigation";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import LinkLogo from "public/link-logo-small.png";
|
import LinkLogo from "@app/../public/link-logo-small.png";
|
||||||
import { useSession, signOut } from "next-auth/react";
|
import { useSession, signOut } from "next-auth/react";
|
||||||
import { getOverviewTicketCountsAction } from "app/_actions/overviews";
|
import { getOverviewTicketCountsAction } from "@/app/_actions/overviews";
|
||||||
import { SearchBox } from "./SearchBox";
|
import { SearchBox } from "./SearchBox";
|
||||||
import { fonts } from "@link-stack/ui";
|
import { fonts } from "@link-stack/ui";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,21 +66,24 @@ const login = async (email: string, password: string) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const authOptions: NextAuthOptions = {
|
const providers = [];
|
||||||
pages: {
|
|
||||||
signIn: "/login",
|
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
|
||||||
error: "/login",
|
providers.push(
|
||||||
signOut: "/logout",
|
|
||||||
},
|
|
||||||
providers: [
|
|
||||||
Google({
|
Google({
|
||||||
clientId: process.env.GOOGLE_CLIENT_ID,
|
clientId: process.env.GOOGLE_CLIENT_ID,
|
||||||
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
||||||
}),
|
}),
|
||||||
|
);
|
||||||
|
} else if (process.env.APPLE_CLIENT_ID && process.env.APPLE_CLIENT_SECRET) {
|
||||||
|
providers.push(
|
||||||
Apple({
|
Apple({
|
||||||
clientId: process.env.APPLE_CLIENT_ID,
|
clientId: process.env.APPLE_CLIENT_ID,
|
||||||
clientSecret: process.env.APPLE_CLIENT_SECRET,
|
clientSecret: process.env.APPLE_CLIENT_SECRET,
|
||||||
}),
|
}),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
providers.push(
|
||||||
Credentials({
|
Credentials({
|
||||||
name: "Zammad",
|
name: "Zammad",
|
||||||
credentials: {
|
credentials: {
|
||||||
|
|
@ -96,7 +99,16 @@ export const authOptions: NextAuthOptions = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
],
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const authOptions: NextAuthOptions = {
|
||||||
|
pages: {
|
||||||
|
signIn: "/login",
|
||||||
|
error: "/login",
|
||||||
|
signOut: "/logout",
|
||||||
|
},
|
||||||
|
providers,
|
||||||
secret: process.env.NEXTAUTH_SECRET,
|
secret: process.env.NEXTAUTH_SECRET,
|
||||||
callbacks: {
|
callbacks: {
|
||||||
signIn: async ({ user }) => {
|
signIn: async ({ user }) => {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import NextAuth from "next-auth";
|
import NextAuth from "next-auth";
|
||||||
import { authOptions } from "app/_lib/authentication";
|
import { authOptions } from "@/app/_lib/authentication";
|
||||||
|
|
||||||
const handler = NextAuth(authOptions);
|
const handler = NextAuth(authOptions);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,9 +85,6 @@ const checkRewrites = async (request: NextRequestWithAuth) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
export default withAuth(checkRewrites, {
|
export default withAuth(checkRewrites, {
|
||||||
pages: {
|
|
||||||
signIn: `/login`,
|
|
||||||
},
|
|
||||||
callbacks: {
|
callbacks: {
|
||||||
authorized: ({ token, req }) => {
|
authorized: ({ token, req }) => {
|
||||||
if (process.env.SETUP_MODE === "true") {
|
if (process.env.SETUP_MODE === "true") {
|
||||||
|
|
@ -97,6 +94,10 @@ export default withAuth(checkRewrites, {
|
||||||
const path = req.nextUrl.pathname;
|
const path = req.nextUrl.pathname;
|
||||||
const roles: any = token?.roles ?? [];
|
const roles: any = token?.roles ?? [];
|
||||||
|
|
||||||
|
if (path.startsWith("/login")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (path.startsWith("/admin") && !roles.includes("admin")) {
|
if (path.startsWith("/admin") && !roles.includes("admin")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
apps/link/next-env.d.ts
vendored
2
apps/link/next-env.d.ts
vendored
|
|
@ -2,4 +2,4 @@
|
||||||
/// <reference types="next/image-types/global" />
|
/// <reference types="next/image-types/global" />
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
// NOTE: This file should not be edited
|
||||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
|
poweredByHeader: false,
|
||||||
transpilePackages: [
|
transpilePackages: [
|
||||||
"@link-stack/leafcutter-ui",
|
"@link-stack/leafcutter-ui",
|
||||||
"@link-stack/opensearch-common",
|
"@link-stack/opensearch-common",
|
||||||
|
|
|
||||||
|
|
@ -23,36 +23,27 @@
|
||||||
"@link-stack/ui": "*",
|
"@link-stack/ui": "*",
|
||||||
"@mui/icons-material": "^5",
|
"@mui/icons-material": "^5",
|
||||||
"@mui/material": "^5",
|
"@mui/material": "^5",
|
||||||
"@mui/material-nextjs": "^5.16.6",
|
"@mui/material-nextjs": "^5",
|
||||||
"@mui/x-data-grid-pro": "^7.12.1",
|
"@mui/x-data-grid-pro": "^7.18.0",
|
||||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
"@mui/x-date-pickers": "^7.18.0",
|
||||||
"date-fns": "^3.6.0",
|
"@mui/x-date-pickers-pro": "^7.18.0",
|
||||||
"graphql": "^16.9.0",
|
"@mui/x-license": "^7.18.0",
|
||||||
|
"date-fns": "^4.1.0",
|
||||||
"graphql-request": "^7.1.0",
|
"graphql-request": "^7.1.0",
|
||||||
"material-ui-popup-state": "^5.1.2",
|
|
||||||
"mui-chips-input": "^2.1.5",
|
"mui-chips-input": "^2.1.5",
|
||||||
"next": "14.2.5",
|
"next": "14.2.13",
|
||||||
"next-auth": "^4.24.7",
|
"next-auth": "^4.24.8",
|
||||||
"react": "18.3.1",
|
"react": "18.3.1",
|
||||||
"react-cookie": "^7.2.0",
|
"react-cookie": "^7.2.0",
|
||||||
"react-dom": "18.3.1",
|
"react-dom": "18.3.1",
|
||||||
"react-iframe": "^1.8.5",
|
"react-iframe": "^1.8.5",
|
||||||
"react-polyglot": "^0.7.2",
|
"react-polyglot": "^0.7.2",
|
||||||
"sharp": "^0.33.4"
|
"sharp": "^0.33.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@link-stack/eslint-config": "*",
|
||||||
"@types/node": "^22.2.0",
|
"@types/node": "^22.7.3",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.9",
|
||||||
"@types/uuid": "^10.0.0",
|
"@types/uuid": "^10.0.0"
|
||||||
"babel-loader": "^9.1.3",
|
|
||||||
"eslint": "^8.0.0",
|
|
||||||
"eslint-config-next": "^14.2.5",
|
|
||||||
"eslint-config-prettier": "^9.1.0",
|
|
||||||
"eslint-plugin-import": "^2.29.1",
|
|
||||||
"eslint-plugin-jsx-a11y": "^6.9.0",
|
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
|
||||||
"eslint-plugin-react": "^7.35.0",
|
|
||||||
"typescript": "5.5.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
version: "3.4"
|
|
||||||
|
|
||||||
x-global-vars: &common-global-variables
|
x-global-vars: &common-global-variables
|
||||||
TZ: Etc/UTC
|
TZ: Etc/UTC
|
||||||
|
|
||||||
|
|
@ -10,28 +8,16 @@ x-bridge-vars: &common-bridge-variables
|
||||||
DATABASE_ROOT_PASSWORD: ${BRIDGE_DATABASE_ROOT_PASSWORD}
|
DATABASE_ROOT_PASSWORD: ${BRIDGE_DATABASE_ROOT_PASSWORD}
|
||||||
DATABASE_OWNER: "bridge"
|
DATABASE_OWNER: "bridge"
|
||||||
DATABASE_PASSWORD: ${BRIDGE_DATABASE_PASSWORD}
|
DATABASE_PASSWORD: ${BRIDGE_DATABASE_PASSWORD}
|
||||||
DATABASE_VISITOR: "app_visitor"
|
|
||||||
DATABASE_AUTHENTICATOR: "app_graphile_auth"
|
|
||||||
DATABASE_AUTHENTICATOR_PASSWORD: ${BRIDGE_DATABASE_AUTHENTICATOR_PASSWORD}
|
|
||||||
DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
||||||
WORKER_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
WORKER_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
||||||
SHADOW_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge_shadow"
|
SHADOW_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge_shadow"
|
||||||
ROOT_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/template1"
|
ROOT_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/template1"
|
||||||
APP_ROOT_DATABASE_URL: "postgresql://root:${BRIDGE_DATABASE_ROOT_PASSWORD}@bridge-postgresql/bridge"
|
APP_ROOT_DATABASE_URL: "postgresql://root:${BRIDGE_DATABASE_ROOT_PASSWORD}@bridge-postgresql/bridge"
|
||||||
DATABASE_AUTH_URL: "postgresql://app_graphile_auth:${BRIDGE_DATABASE_AUTHENTICATOR_PASSWORD}@bridge-postgresql/bridge"
|
DATABASE_AUTH_URL: "postgresql://app_graphile_auth:${BRIDGE_DATABASE_AUTHENTICATOR_PASSWORD}@bridge-postgresql/bridge"
|
||||||
CORS_ALLOWED_ORIGINS: "https://bridge-api,${BRIDGE_DOMAIN},http://localhost:3000,http://127.0.0.1:3000"
|
|
||||||
FRONTEND_URL: ${BRIDGE_DOMAIN}
|
FRONTEND_URL: ${BRIDGE_DOMAIN}
|
||||||
API_URL: "http://bridge-api:3001"
|
API_URL: "http://bridge-api:3001"
|
||||||
NEXTAUTH_URL: ${BRIDGE_DOMAIN}
|
NEXTAUTH_URL: ${BRIDGE_DOMAIN}
|
||||||
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
||||||
NEXTAUTH_AUDIENCE: ${NEXTAUTH_AUDIENCE}
|
|
||||||
NEXTAUTH_SIGNING_KEY_B64: ${NEXTAUTH_SIGNING_KEY_B64}
|
|
||||||
NEXTAUTH_ENCRYPTION_KEY_B64: ${NEXTAUTH_ENCRYPTION_KEY_B64}
|
|
||||||
GITLAB_EMAIL_ADDRESS: ${GITLAB_EMAIL_ADDRESS}
|
|
||||||
GITLAB_ID: ${GITLAB_ID}
|
|
||||||
GITLAB_SECRET: ${GITLAB_SECRET}
|
|
||||||
SIGNALD_ENABLED: "true"
|
|
||||||
SIGNALD_SOCKET: /signald/signald.sock
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
bridge-frontend:
|
bridge-frontend:
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
version: "3.4"
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
leafcutter:
|
leafcutter:
|
||||||
container_name: leafcutter
|
container_name: leafcutter
|
||||||
|
|
@ -15,6 +13,3 @@ services:
|
||||||
environment:
|
environment:
|
||||||
NEXTAUTH_URL: ${LINK_URL}
|
NEXTAUTH_URL: ${LINK_URL}
|
||||||
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
||||||
NEXTAUTH_AUDIENCE: ${NEXTAUTH_AUDIENCE}
|
|
||||||
NEXTAUTH_SIGNING_KEY_B64: ${NEXTAUTH_SIGNING_KEY_B64}
|
|
||||||
NEXTAUTH_ENCRYPTION_KEY_B64: ${NEXTAUTH_ENCRYPTION_KEY_B64}
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
version: "3.4"
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
link:
|
link:
|
||||||
container_name: link
|
container_name: link
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
version: "3.4"
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
opensearch:
|
opensearch:
|
||||||
container_name: opensearch
|
container_name: opensearch
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
version: "3.4"
|
|
||||||
|
|
||||||
x-global-vars: &common-global-variables
|
x-global-vars: &common-global-variables
|
||||||
TZ: Etc/UTC
|
TZ: Etc/UTC
|
||||||
|
|
||||||
|
|
@ -24,28 +22,15 @@ x-bridge-vars: &common-bridge-variables
|
||||||
DATABASE_ROOT_PASSWORD: ${BRIDGE_DATABASE_ROOT_PASSWORD}
|
DATABASE_ROOT_PASSWORD: ${BRIDGE_DATABASE_ROOT_PASSWORD}
|
||||||
DATABASE_OWNER: "bridge"
|
DATABASE_OWNER: "bridge"
|
||||||
DATABASE_PASSWORD: ${BRIDGE_DATABASE_PASSWORD}
|
DATABASE_PASSWORD: ${BRIDGE_DATABASE_PASSWORD}
|
||||||
DATABASE_VISITOR: "app_visitor"
|
|
||||||
DATABASE_AUTHENTICATOR: "app_graphile_auth"
|
|
||||||
DATABASE_AUTHENTICATOR_PASSWORD: ${BRIDGE_DATABASE_AUTHENTICATOR_PASSWORD}
|
|
||||||
DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
||||||
WORKER_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
WORKER_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
||||||
SHADOW_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge_shadow"
|
SHADOW_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge_shadow"
|
||||||
ROOT_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/template1"
|
ROOT_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/template1"
|
||||||
APP_ROOT_DATABASE_URL: "postgresql://root:${BRIDGE_DATABASE_ROOT_PASSWORD}@bridge-postgresql/bridge"
|
|
||||||
DATABASE_AUTH_URL: "postgresql://app_graphile_auth:${BRIDGE_DATABASE_AUTHENTICATOR_PASSWORD}@bridge-postgresql/bridge"
|
DATABASE_AUTH_URL: "postgresql://app_graphile_auth:${BRIDGE_DATABASE_AUTHENTICATOR_PASSWORD}@bridge-postgresql/bridge"
|
||||||
CORS_ALLOWED_ORIGINS: "https://bridge-api,${BRIDGE_DOMAIN},http://localhost:3000,http://127.0.0.1:3000"
|
|
||||||
FRONTEND_URL: ${BRIDGE_DOMAIN}
|
FRONTEND_URL: ${BRIDGE_DOMAIN}
|
||||||
API_URL: "http://bridge-api:3001"
|
API_URL: "http://bridge-api:3001"
|
||||||
NEXTAUTH_URL: ${BRIDGE_DOMAIN}
|
NEXTAUTH_URL: ${BRIDGE_DOMAIN}
|
||||||
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
||||||
NEXTAUTH_AUDIENCE: ${NEXTAUTH_AUDIENCE}
|
|
||||||
NEXTAUTH_SIGNING_KEY_B64: ${NEXTAUTH_SIGNING_KEY_B64}
|
|
||||||
NEXTAUTH_ENCRYPTION_KEY_B64: ${NEXTAUTH_ENCRYPTION_KEY_B64}
|
|
||||||
GITLAB_EMAIL_ADDRESS: ${GITLAB_EMAIL_ADDRESS}
|
|
||||||
GITLAB_ID: ${GITLAB_ID}
|
|
||||||
GITLAB_SECRET: ${GITLAB_SECRET}
|
|
||||||
SIGNALD_ENABLED: "true"
|
|
||||||
SIGNALD_SOCKET: /signald/signald.sock
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgresql:
|
postgresql:
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
version: "3.4"
|
|
||||||
|
|
||||||
x-global-vars: &common-global-variables
|
x-global-vars: &common-global-variables
|
||||||
TZ: Etc/UTC
|
TZ: Etc/UTC
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
FROM memcached:1.6.27-bookworm
|
FROM memcached:1.6.31-bookworm
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
FROM nginxproxy/nginx-proxy:1.5.2
|
FROM nginxproxy/nginx-proxy:1.6.1
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
FROM opensearchproject/opensearch-dashboards:2.13.0
|
FROM opensearchproject/opensearch-dashboards:2.17.0
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
FROM opensearchproject/opensearch:2.13.0
|
FROM opensearchproject/opensearch:2.17.0
|
||||||
RUN /usr/share/opensearch/bin/opensearch-plugin install ingest-attachment -b
|
RUN /usr/share/opensearch/bin/opensearch-plugin install ingest-attachment -b
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
FROM redis:7.2.4-bookworm
|
FROM redis:7.4.0-bookworm
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
ARG ZAMMAD_VERSION=6.3.1
|
ARG ZAMMAD_VERSION=6.3.1
|
||||||
|
|
||||||
FROM node:20-slim as node
|
FROM node:22-slim as node
|
||||||
|
|
||||||
FROM zammad/zammad-docker-compose:${ZAMMAD_VERSION} AS builder
|
FROM zammad/zammad-docker-compose:${ZAMMAD_VERSION} AS builder
|
||||||
COPY --from=node /opt /opt
|
COPY --from=node /opt /opt
|
||||||
|
|
|
||||||
5759
package-lock.json
generated
5759
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -52,6 +52,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"dotenv-cli": "latest",
|
"dotenv-cli": "latest",
|
||||||
"eslint": "^8",
|
"eslint": "^8",
|
||||||
|
"turbo": "^2.1.2",
|
||||||
"typescript": "latest"
|
"typescript": "latest"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,6 @@ export const db = new KyselyAuth<Database>({
|
||||||
user: process.env.DATABASE_USER,
|
user: process.env.DATABASE_USER,
|
||||||
password: process.env.DATABASE_PASSWORD,
|
password: process.env.DATABASE_PASSWORD,
|
||||||
}),
|
}),
|
||||||
}),
|
}) as any,
|
||||||
plugins: [new CamelCasePlugin()],
|
plugins: [new CamelCasePlugin()],
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -9,18 +9,14 @@
|
||||||
"build": "tsc -p tsconfig.json"
|
"build": "tsc -p tsconfig.json"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@auth/kysely-adapter": "^1.4.2",
|
"@auth/kysely-adapter": "^1.5.2",
|
||||||
"graphile-worker": "^0.16.6",
|
"graphile-worker": "^0.16.6",
|
||||||
"kysely": "0.26.1",
|
"kysely": "0.26.1",
|
||||||
"pg": "^8.12.0"
|
"pg": "^8.13.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.25.2",
|
"@link-stack/eslint-config": "*",
|
||||||
"@babel/preset-env": "7.25.4",
|
|
||||||
"@babel/preset-typescript": "7.24.7",
|
|
||||||
"prettier": "^3.3.3",
|
|
||||||
"@link-stack/typescript-config": "*",
|
"@link-stack/typescript-config": "*",
|
||||||
"tsx": "^4.19.0",
|
"typescript": "^5.6.2"
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,46 +5,21 @@
|
||||||
"build": "tsc -p tsconfig.json"
|
"build": "tsc -p tsconfig.json"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@auth/kysely-adapter": "^1.4.2",
|
"@link-stack/bridge-common": "^2.2.0",
|
||||||
"@emotion/cache": "^11.13.1",
|
|
||||||
"@emotion/react": "^11.13.0",
|
|
||||||
"@emotion/server": "^11.11.0",
|
|
||||||
"@emotion/styled": "^11.13.0",
|
|
||||||
"@link-stack/signal-api": "*",
|
"@link-stack/signal-api": "*",
|
||||||
"@mui/icons-material": "^5",
|
"@link-stack/ui": "^2.2.0",
|
||||||
"@mui/material": "^5",
|
"@mui/material": "^5",
|
||||||
"@mui/x-data-grid-pro": "^7.12.1",
|
"@mui/x-data-grid-pro": "^7.18.0",
|
||||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
|
||||||
"date-fns": "^3.6.0",
|
|
||||||
"kysely": "0.26.1",
|
"kysely": "0.26.1",
|
||||||
"material-ui-popup-state": "^5.1.2",
|
"next": "14.2.13",
|
||||||
"next": "14.2.5",
|
|
||||||
"react": "18.3.1",
|
"react": "18.3.1",
|
||||||
"react-cookie": "^7.2.0",
|
|
||||||
"react-cookie-consent": "^9.0.0",
|
|
||||||
"react-dom": "18.3.1",
|
"react-dom": "18.3.1",
|
||||||
"react-iframe": "^1.8.5",
|
"react-qr-code": "^2.0.15"
|
||||||
"react-markdown": "^9.0.1",
|
|
||||||
"react-polyglot": "^0.7.2",
|
|
||||||
"react-qr-code": "^2.0.15",
|
|
||||||
"tss-react": "^4.9.12",
|
|
||||||
"uuid": "^10.0.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@types/node": "^22.7.3",
|
||||||
"@types/node": "^22.5.2",
|
"@types/react": "18.3.9",
|
||||||
"@types/react": "18.3.5",
|
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
"@types/uuid": "^10.0.0",
|
"typescript": "5.6.2"
|
||||||
"babel-loader": "^9.1.3",
|
|
||||||
"eslint": "^8.0.0",
|
|
||||||
"eslint-config-next": "^14.2.7",
|
|
||||||
"eslint-config-prettier": "^9.1.0",
|
|
||||||
"eslint-plugin-import": "^2.29.1",
|
|
||||||
"eslint-plugin-jsx-a11y": "^6.9.0",
|
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
|
||||||
"eslint-plugin-react": "^7.35.0",
|
|
||||||
"file-loader": "^6.2.0",
|
|
||||||
"typescript": "5.5.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,14 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rushstack/eslint-patch": "^1.10.4",
|
"@rushstack/eslint-patch": "^1.10.4",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.3.0",
|
"@typescript-eslint/eslint-plugin": "^8.7.0",
|
||||||
"@typescript-eslint/parser": "^8.3.0",
|
"@typescript-eslint/parser": "^8.7.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-config-xo-space": "^0.35.0",
|
"eslint-config-xo-space": "^0.35.0",
|
||||||
"eslint-plugin-cypress": "^3.5.0",
|
"eslint-plugin-cypress": "^3.5.0",
|
||||||
"eslint-plugin-eslint-comments": "^3.2.0",
|
"eslint-plugin-eslint-comments": "^3.2.0",
|
||||||
"eslint-plugin-import": "^2.29.1",
|
"eslint-plugin-import": "^2.30.0",
|
||||||
"eslint-plugin-jest": "^28.8.2",
|
"eslint-plugin-jest": "^28.8.3",
|
||||||
"eslint-plugin-promise": "^7.1.0",
|
"eslint-plugin-promise": "^7.1.0",
|
||||||
"eslint-plugin-unicorn": "55.0.0",
|
"eslint-plugin-unicorn": "55.0.0",
|
||||||
"@babel/eslint-parser": "7.25.1"
|
"@babel/eslint-parser": "7.25.1"
|
||||||
|
|
@ -28,6 +28,6 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "^8",
|
"eslint": "^8",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"typescript": "^5.5.4"
|
"typescript": "^5.6.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
"node": ">=14"
|
"node": ">=14"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/jest": "^29.5.12",
|
"@types/jest": "^29.5.13",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"jest-junit": "^16.0.0"
|
"jest-junit": "^16.0.0"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -5,42 +5,28 @@
|
||||||
"build": "tsc -p tsconfig.json"
|
"build": "tsc -p tsconfig.json"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/cache": "^11.13.1",
|
"@emotion/react": "^11.13.3",
|
||||||
"@emotion/react": "^11.13.0",
|
|
||||||
"@emotion/server": "^11.11.0",
|
|
||||||
"@emotion/styled": "^11.13.0",
|
"@emotion/styled": "^11.13.0",
|
||||||
|
"@link-stack/opensearch-common": "*",
|
||||||
"@mui/icons-material": "^5",
|
"@mui/icons-material": "^5",
|
||||||
"@mui/material": "^5",
|
"@mui/material": "^5",
|
||||||
"@mui/x-data-grid-pro": "^7.12.1",
|
"@mui/x-data-grid-pro": "^7.18.0",
|
||||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
"@mui/x-date-pickers-pro": "^7.18.0",
|
||||||
"@link-stack/opensearch-common": "*",
|
"date-fns": "^4.1.0",
|
||||||
"date-fns": "^3.6.0",
|
"next": "14.2.13",
|
||||||
"material-ui-popup-state": "^5.1.2",
|
"next-auth": "^4.24.8",
|
||||||
"next": "14.2.5",
|
|
||||||
"react": "18.3.1",
|
"react": "18.3.1",
|
||||||
"react-cookie": "^7.2.0",
|
"react-cookie": "^7.2.0",
|
||||||
"react-cookie-consent": "^9.0.0",
|
|
||||||
"react-dom": "18.3.1",
|
"react-dom": "18.3.1",
|
||||||
"react-iframe": "^1.8.5",
|
"react-iframe": "^1.8.5",
|
||||||
"react-markdown": "^9.0.1",
|
"react-markdown": "^9.0.1",
|
||||||
"react-polyglot": "^0.7.2",
|
"react-polyglot": "^0.7.2"
|
||||||
"tss-react": "^4.9.12",
|
|
||||||
"uuid": "^10.0.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@link-stack/eslint-config": "*",
|
||||||
"@types/node": "^22.5.2",
|
"@link-stack/typescript-config": "*",
|
||||||
"@types/react": "18.3.5",
|
"@types/node": "^22.7.3",
|
||||||
"@types/uuid": "^10.0.0",
|
"@types/react": "18.3.9",
|
||||||
"babel-loader": "^9.1.3",
|
"typescript": "5.6.2"
|
||||||
"eslint": "^8.0.0",
|
|
||||||
"eslint-config-next": "^14.2.7",
|
|
||||||
"eslint-config-prettier": "^9.1.0",
|
|
||||||
"eslint-plugin-import": "^2.29.1",
|
|
||||||
"eslint-plugin-jsx-a11y": "^6.9.0",
|
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
|
||||||
"eslint-plugin-react": "^7.35.0",
|
|
||||||
"file-loader": "^6.2.0",
|
|
||||||
"typescript": "5.5.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,10 @@
|
||||||
"uuid": "^10.0.0"
|
"uuid": "^10.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@types/node": "^22.7.3",
|
||||||
"@types/node": "^22.5.2",
|
|
||||||
"@types/react": "18.3.5",
|
|
||||||
"@types/uuid": "^10.0.0",
|
"@types/uuid": "^10.0.0",
|
||||||
"babel-loader": "^9.1.3",
|
|
||||||
"@link-stack/typescript-config": "*",
|
"@link-stack/typescript-config": "*",
|
||||||
"@link-stack/eslint-config": "*",
|
"@link-stack/eslint-config": "*",
|
||||||
"file-loader": "^6.2.0",
|
"typescript": "5.6.2"
|
||||||
"typescript": "5.5.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
"update-api": "openapi-generator-cli generate -i 'https://bbernhard.github.io/signal-cli-rest-api/src/docs/swagger.json' -g typescript-fetch -o . --skip-validate-spec"
|
"update-api": "openapi-generator-cli generate -i 'https://bbernhard.github.io/signal-cli-rest-api/src/docs/swagger.json' -g typescript-fetch -o . --skip-validate-spec"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@openapitools/openapi-generator-cli": "^2.13.5",
|
"@openapitools/openapi-generator-cli": "^2.13.9",
|
||||||
"@link-stack/typescript-config": "*",
|
"@link-stack/typescript-config": "*",
|
||||||
"@link-stack/eslint-config": "*",
|
"@link-stack/eslint-config": "*",
|
||||||
"@types/node": "^22",
|
"@types/node": "^22",
|
||||||
|
|
|
||||||
|
|
@ -9,15 +9,15 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mui/icons-material": "^5",
|
"@mui/icons-material": "^5",
|
||||||
"@mui/material": "^5",
|
"@mui/material": "^5",
|
||||||
"@mui/x-data-grid-pro": "^7.12.1",
|
"@mui/x-data-grid-pro": "^7.18.0",
|
||||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
"@mui/x-license": "^7.18.0",
|
||||||
"next": "14.2.5",
|
"next": "14.2.13",
|
||||||
"react": "18.3.1",
|
"react": "18.3.1",
|
||||||
"react-dom": "18.3.1"
|
"react-dom": "18.3.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22.2.0",
|
"@types/node": "^22.7.3",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.9",
|
||||||
"typescript": "^5.5.4"
|
"typescript": "^5.6.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
"build": "tsc"
|
"build": "tsc"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22.5.2",
|
"@types/node": "^22.7.3",
|
||||||
"typescript": "^5"
|
"typescript": "^5"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue