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
|
||||
ARG APP_DIR=/opt/bridge-frontend
|
||||
|
|
|
|||
|
|
@ -3,23 +3,16 @@
|
|||
import { FC, PropsWithChildren, useState } from "react";
|
||||
import { Grid } from "@mui/material";
|
||||
import { CssBaseline } from "@mui/material";
|
||||
import { AppRouterCacheProvider } from "@mui/material-nextjs/v14-appRouter";
|
||||
import { SessionProvider } from "next-auth/react";
|
||||
import { css, Global } from "@emotion/react";
|
||||
import { fonts } from "@link-stack/ui";
|
||||
import { Sidebar } from "./Sidebar";
|
||||
|
||||
export const InternalLayout: FC<PropsWithChildren> = ({ children }) => {
|
||||
const [open, setOpen] = useState(true);
|
||||
const { roboto } = fonts;
|
||||
const globalCSS = css`
|
||||
* {
|
||||
font-family: ${roboto.style.fontFamily};
|
||||
}
|
||||
`;
|
||||
|
||||
return (
|
||||
<AppRouterCacheProvider>
|
||||
<SessionProvider>
|
||||
<Global styles={globalCSS} />
|
||||
<CssBaseline />
|
||||
<Grid container direction="row">
|
||||
<Sidebar open={open} setOpen={setOpen} />
|
||||
|
|
@ -31,5 +24,6 @@ export const InternalLayout: FC<PropsWithChildren> = ({ children }) => {
|
|||
</Grid>
|
||||
</Grid>
|
||||
</SessionProvider>
|
||||
</AppRouterCacheProvider>
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
import NextAuth from "next-auth";
|
||||
import { authOptions } from "@/app/_lib/authentication";
|
||||
|
||||
// @ts-expect-error
|
||||
const handler = NextAuth(authOptions);
|
||||
|
||||
export { handler as GET, handler as POST };
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
transpilePackages: ["@link-stack/ui", "@link-stack/bridge-common", "@link-stack/bridge-ui"],
|
||||
poweredByHeader: false,
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
|
|
|
|||
|
|
@ -13,42 +13,24 @@
|
|||
"migrate:down:one": "tsx database/migrate.ts down:one"
|
||||
},
|
||||
"dependencies": {
|
||||
"@auth/kysely-adapter": "^1.4.2",
|
||||
"@emotion/cache": "^11.13.1",
|
||||
"@emotion/react": "^11.13.0",
|
||||
"@emotion/styled": "^11.13.0",
|
||||
"@auth/kysely-adapter": "^1.5.2",
|
||||
"@mui/icons-material": "^5",
|
||||
"@mui/material": "^5",
|
||||
"@mui/material-nextjs": "^5.16.6",
|
||||
"@mui/x-data-grid-pro": "^7.12.1",
|
||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
||||
"@mui/x-license": "^7.12.0",
|
||||
"@mui/material-nextjs": "^5",
|
||||
"@mui/x-license": "^7.18.0",
|
||||
"@link-stack/bridge-common": "*",
|
||||
"@link-stack/bridge-ui": "*",
|
||||
"@link-stack/signal-api": "*",
|
||||
"date-fns": "^3.6.0",
|
||||
"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",
|
||||
"next": "14.2.13",
|
||||
"next-auth": "^4.24.8",
|
||||
"react": "18.3.1",
|
||||
"react-cookie": "^7.2.0",
|
||||
"react-digit-input": "^2.1.0",
|
||||
"react-dom": "18.3.1",
|
||||
"react-qr-code": "^2.0.15",
|
||||
"react-timer-hook": "^3.0.7",
|
||||
"sharp": "^0.33.5",
|
||||
"tss-react": "^4.9.12",
|
||||
"tsx": "^4.19.0",
|
||||
"tsx": "^4.19.1",
|
||||
"@link-stack/ui": "*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22",
|
||||
"@types/pg": "^8.11.8",
|
||||
"@types/pg": "^8.11.10",
|
||||
"@types/react": "^18",
|
||||
"@types/react-dom": "^18",
|
||||
"@link-stack/eslint-config": "*",
|
||||
|
|
|
|||
|
|
@ -11,12 +11,12 @@
|
|||
"dependencies": {
|
||||
"dotenv": "^16.4.5",
|
||||
"kysely": "0.26.1",
|
||||
"pg": "^8.12.0",
|
||||
"tsx": "^4.19.0"
|
||||
"pg": "^8.13.0",
|
||||
"tsx": "^4.19.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22",
|
||||
"@types/pg": "^8.11.8",
|
||||
"@types/pg": "^8.11.10",
|
||||
"@link-stack/eslint-config": "*",
|
||||
"@link-stack/typescript-config": "*",
|
||||
"typescript": "^5"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:20-bookworm AS base
|
||||
FROM node:22-bookworm-slim AS base
|
||||
|
||||
FROM base AS builder
|
||||
ARG APP_DIR=/opt/bridge-whatsapp
|
||||
|
|
|
|||
|
|
@ -6,11 +6,10 @@
|
|||
"license": "AGPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
"@adiwajshing/keyed-db": "0.2.4",
|
||||
"@hapi/boom": "^10.0.1",
|
||||
"@hapi/hapi": "^21.3.10",
|
||||
"@hapipal/schmervice": "^3.0.0",
|
||||
"@hapipal/toys": "^4.0.0",
|
||||
"@whiskeysockets/baileys": "^6.7.7",
|
||||
"@whiskeysockets/baileys": "^6.7.8",
|
||||
"hapi-pino": "^12.1.0",
|
||||
"link-preview-js": "^3.0.5"
|
||||
},
|
||||
|
|
@ -20,8 +19,8 @@
|
|||
"@link-stack/typescript-config": "*",
|
||||
"@types/node": "*",
|
||||
"dotenv-cli": "^7.4.2",
|
||||
"tsx": "^4.19.0",
|
||||
"typescript": "^5.5.4"
|
||||
"tsx": "^4.19.1",
|
||||
"typescript": "^5.6.2"
|
||||
},
|
||||
"scripts": {
|
||||
"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
|
||||
ARG APP_DIR=/opt/bridge-worker
|
||||
|
|
|
|||
|
|
@ -16,24 +16,14 @@
|
|||
"@link-stack/signal-api": "*",
|
||||
"fluent-ffmpeg": "^2.1.3",
|
||||
"graphile-worker": "^0.16.6",
|
||||
"html-to-text": "^9.0.5",
|
||||
"jest": "^29.7.0",
|
||||
"kysely": "^0.27.3",
|
||||
"pg": "^8.12.0",
|
||||
"remeda": "^2.11.0",
|
||||
"twilio": "^5.2.3"
|
||||
"remeda": "^2.14.0",
|
||||
"twilio": "^5.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.25.2",
|
||||
"@babel/preset-env": "7.25.4",
|
||||
"@babel/preset-typescript": "7.24.7",
|
||||
"@types/fluent-ffmpeg": "^2.1.26",
|
||||
"dotenv-cli": "^7.4.2",
|
||||
"@link-stack/eslint-config": "*",
|
||||
"prettier": "^3.3.3",
|
||||
"@link-stack/typescript-config": "*",
|
||||
"ts-node": "^10.9.2",
|
||||
"typedoc": "^0.26.6",
|
||||
"typescript": "^5.5.4"
|
||||
"typescript": "^5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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" />
|
||||
|
||||
// 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 = {
|
||||
transpilePackages: ["@link-stack/leafcutter-ui", "@link-stack/opensearch-common"],
|
||||
experimental: {
|
||||
missingSuspenseWithCSRBailout: false,
|
||||
},
|
||||
poweredByHeader: false,
|
||||
rewrites: async () => ({
|
||||
fallback: [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -14,46 +14,36 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@emotion/cache": "^11.13.1",
|
||||
"@emotion/react": "^11.13.0",
|
||||
"@emotion/react": "^11.13.3",
|
||||
"@emotion/server": "^11.11.0",
|
||||
"@emotion/styled": "^11.13.0",
|
||||
"@link-stack/leafcutter-ui": "*",
|
||||
"@link-stack/opensearch-common": "*",
|
||||
"@mui/icons-material": "^5",
|
||||
"@mui/material": "^5",
|
||||
"@mui/material-nextjs": "^5.16.6",
|
||||
"@mui/x-data-grid-pro": "^7.12.1",
|
||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
||||
"@opensearch-project/opensearch": "^2.11.0",
|
||||
"cryptr": "^6.3.0",
|
||||
"date-fns": "^3.6.0",
|
||||
"http-proxy-middleware": "^3.0.0",
|
||||
"material-ui-popup-state": "^5.1.2",
|
||||
"next": "14.2.5",
|
||||
"next-auth": "^4.24.7",
|
||||
"@mui/material-nextjs": "^5",
|
||||
"@mui/x-date-pickers-pro": "^7.18.0",
|
||||
"@opensearch-project/opensearch": "^2.12.0",
|
||||
"date-fns": "^4.1.0",
|
||||
"http-proxy-middleware": "^3.0.2",
|
||||
"material-ui-popup-state": "^5.3.1",
|
||||
"next": "14.2.13",
|
||||
"next-auth": "^4.24.8",
|
||||
"react": "18.3.1",
|
||||
"react-cookie": "^7.2.0",
|
||||
"react-cookie-consent": "^9.0.0",
|
||||
"react-dom": "18.3.1",
|
||||
"react-iframe": "^1.8.5",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-polyglot": "^0.7.2",
|
||||
"sharp": "^0.33.5",
|
||||
"uuid": "^10.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2",
|
||||
"@types/node": "^22.5.2",
|
||||
"@types/react": "18.3.5",
|
||||
"@types/node": "^22.7.3",
|
||||
"@types/react": "18.3.9",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"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",
|
||||
"typescript": "5.5.4"
|
||||
"@link-stack/eslint-config": "*",
|
||||
"@link-stack/typescript-config": "*",
|
||||
"typescript": "5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:20-bookworm AS base
|
||||
FROM node:22-bookworm-slim AS base
|
||||
|
||||
FROM base AS builder
|
||||
ARG APP_DIR=/opt/link
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
"use client";
|
||||
|
||||
import { FC, useState } from "react";
|
||||
import { FC, useState, useEffect } from "react";
|
||||
import {
|
||||
Box,
|
||||
Grid,
|
||||
|
|
@ -14,7 +14,7 @@ import {
|
|||
Google as GoogleIcon,
|
||||
Key as KeyIcon,
|
||||
} from "@mui/icons-material";
|
||||
import { signIn } from "next-auth/react";
|
||||
import { signIn, getProviders } from "next-auth/react";
|
||||
import Image from "next/image";
|
||||
import LinkLogo from "public/link-logo-small.png";
|
||||
import { colors, fonts } from "@link-stack/ui";
|
||||
|
|
@ -29,6 +29,7 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
|||
typeof window !== "undefined" && window.location.origin
|
||||
? window.location.origin
|
||||
: "";
|
||||
const [provider, setProvider] = useState(undefined);
|
||||
const [email, setEmail] = useState("");
|
||||
const [password, setPassword] = useState("");
|
||||
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 (
|
||||
<Box sx={{ backgroundColor: darkGray, height: "100vh" }}>
|
||||
<Container maxWidth="md" sx={{ p: 10 }}>
|
||||
|
|
@ -142,6 +151,7 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
|||
</Box>
|
||||
</Grid>
|
||||
) : null}
|
||||
{provider === "google" && (
|
||||
<Grid item sx={{ width: "100%" }}>
|
||||
<IconButton
|
||||
sx={buttonStyles}
|
||||
|
|
@ -155,6 +165,8 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
|||
Sign in with Google
|
||||
</IconButton>
|
||||
</Grid>
|
||||
)}
|
||||
{provider === "apple" && (
|
||||
<Grid item sx={{ width: "100%" }}>
|
||||
<IconButton
|
||||
aria-label="Sign in with Apple"
|
||||
|
|
@ -169,19 +181,9 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
|||
Sign in with Apple
|
||||
</IconButton>
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Typography
|
||||
variant="body1"
|
||||
sx={{
|
||||
fontSize: 18,
|
||||
color: white,
|
||||
textAlign: "center",
|
||||
mt: 3,
|
||||
}}
|
||||
>
|
||||
⸺ or ⸺
|
||||
</Typography>
|
||||
</Grid>
|
||||
)}
|
||||
{provider === "credentials" && (
|
||||
<Grid item container spacing={3}>
|
||||
<Grid item sx={{ width: "100%" }}>
|
||||
<TextField
|
||||
value={email}
|
||||
|
|
@ -221,6 +223,8 @@ export const Login: FC<LoginProps> = ({ session }) => {
|
|||
</IconButton>
|
||||
</Grid>
|
||||
</Grid>
|
||||
)}
|
||||
</Grid>
|
||||
</Container>
|
||||
) : null}
|
||||
{session ? (
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ import {
|
|||
import { usePathname } from "next/navigation";
|
||||
import Link from "next/link";
|
||||
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 { getOverviewTicketCountsAction } from "app/_actions/overviews";
|
||||
import { getOverviewTicketCountsAction } from "@/app/_actions/overviews";
|
||||
import { SearchBox } from "./SearchBox";
|
||||
import { fonts } from "@link-stack/ui";
|
||||
|
||||
|
|
|
|||
|
|
@ -66,21 +66,24 @@ const login = async (email: string, password: string) => {
|
|||
}
|
||||
};
|
||||
|
||||
export const authOptions: NextAuthOptions = {
|
||||
pages: {
|
||||
signIn: "/login",
|
||||
error: "/login",
|
||||
signOut: "/logout",
|
||||
},
|
||||
providers: [
|
||||
const providers = [];
|
||||
|
||||
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
|
||||
providers.push(
|
||||
Google({
|
||||
clientId: process.env.GOOGLE_CLIENT_ID,
|
||||
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
||||
}),
|
||||
);
|
||||
} else if (process.env.APPLE_CLIENT_ID && process.env.APPLE_CLIENT_SECRET) {
|
||||
providers.push(
|
||||
Apple({
|
||||
clientId: process.env.APPLE_CLIENT_ID,
|
||||
clientSecret: process.env.APPLE_CLIENT_SECRET,
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
providers.push(
|
||||
Credentials({
|
||||
name: "Zammad",
|
||||
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,
|
||||
callbacks: {
|
||||
signIn: async ({ user }) => {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import NextAuth from "next-auth";
|
||||
import { authOptions } from "app/_lib/authentication";
|
||||
import { authOptions } from "@/app/_lib/authentication";
|
||||
|
||||
const handler = NextAuth(authOptions);
|
||||
|
||||
|
|
|
|||
|
|
@ -85,9 +85,6 @@ const checkRewrites = async (request: NextRequestWithAuth) => {
|
|||
};
|
||||
|
||||
export default withAuth(checkRewrites, {
|
||||
pages: {
|
||||
signIn: `/login`,
|
||||
},
|
||||
callbacks: {
|
||||
authorized: ({ token, req }) => {
|
||||
if (process.env.SETUP_MODE === "true") {
|
||||
|
|
@ -97,6 +94,10 @@ export default withAuth(checkRewrites, {
|
|||
const path = req.nextUrl.pathname;
|
||||
const roles: any = token?.roles ?? [];
|
||||
|
||||
if (path.startsWith("/login")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (path.startsWith("/admin") && !roles.includes("admin")) {
|
||||
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" />
|
||||
|
||||
// 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} */
|
||||
const nextConfig = {
|
||||
poweredByHeader: false,
|
||||
transpilePackages: [
|
||||
"@link-stack/leafcutter-ui",
|
||||
"@link-stack/opensearch-common",
|
||||
|
|
|
|||
|
|
@ -23,36 +23,27 @@
|
|||
"@link-stack/ui": "*",
|
||||
"@mui/icons-material": "^5",
|
||||
"@mui/material": "^5",
|
||||
"@mui/material-nextjs": "^5.16.6",
|
||||
"@mui/x-data-grid-pro": "^7.12.1",
|
||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
||||
"date-fns": "^3.6.0",
|
||||
"graphql": "^16.9.0",
|
||||
"@mui/material-nextjs": "^5",
|
||||
"@mui/x-data-grid-pro": "^7.18.0",
|
||||
"@mui/x-date-pickers": "^7.18.0",
|
||||
"@mui/x-date-pickers-pro": "^7.18.0",
|
||||
"@mui/x-license": "^7.18.0",
|
||||
"date-fns": "^4.1.0",
|
||||
"graphql-request": "^7.1.0",
|
||||
"material-ui-popup-state": "^5.1.2",
|
||||
"mui-chips-input": "^2.1.5",
|
||||
"next": "14.2.5",
|
||||
"next-auth": "^4.24.7",
|
||||
"next": "14.2.13",
|
||||
"next-auth": "^4.24.8",
|
||||
"react": "18.3.1",
|
||||
"react-cookie": "^7.2.0",
|
||||
"react-dom": "18.3.1",
|
||||
"react-iframe": "^1.8.5",
|
||||
"react-polyglot": "^0.7.2",
|
||||
"sharp": "^0.33.4"
|
||||
"sharp": "^0.33.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2",
|
||||
"@types/node": "^22.2.0",
|
||||
"@types/react": "18.3.3",
|
||||
"@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"
|
||||
"@link-stack/eslint-config": "*",
|
||||
"@types/node": "^22.7.3",
|
||||
"@types/react": "18.3.9",
|
||||
"@types/uuid": "^10.0.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
version: "3.4"
|
||||
|
||||
x-global-vars: &common-global-variables
|
||||
TZ: Etc/UTC
|
||||
|
||||
|
|
@ -10,28 +8,16 @@ x-bridge-vars: &common-bridge-variables
|
|||
DATABASE_ROOT_PASSWORD: ${BRIDGE_DATABASE_ROOT_PASSWORD}
|
||||
DATABASE_OWNER: "bridge"
|
||||
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"
|
||||
WORKER_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
||||
SHADOW_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge_shadow"
|
||||
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"
|
||||
CORS_ALLOWED_ORIGINS: "https://bridge-api,${BRIDGE_DOMAIN},http://localhost:3000,http://127.0.0.1:3000"
|
||||
FRONTEND_URL: ${BRIDGE_DOMAIN}
|
||||
API_URL: "http://bridge-api:3001"
|
||||
NEXTAUTH_URL: ${BRIDGE_DOMAIN}
|
||||
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:
|
||||
bridge-frontend:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
version: "3.4"
|
||||
|
||||
services:
|
||||
leafcutter:
|
||||
container_name: leafcutter
|
||||
|
|
@ -15,6 +13,3 @@ services:
|
|||
environment:
|
||||
NEXTAUTH_URL: ${LINK_URL}
|
||||
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:
|
||||
link:
|
||||
container_name: link
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
version: "3.4"
|
||||
|
||||
services:
|
||||
opensearch:
|
||||
container_name: opensearch
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
version: "3.4"
|
||||
|
||||
x-global-vars: &common-global-variables
|
||||
TZ: Etc/UTC
|
||||
|
||||
|
|
@ -24,28 +22,15 @@ x-bridge-vars: &common-bridge-variables
|
|||
DATABASE_ROOT_PASSWORD: ${BRIDGE_DATABASE_ROOT_PASSWORD}
|
||||
DATABASE_OWNER: "bridge"
|
||||
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"
|
||||
WORKER_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge"
|
||||
SHADOW_DATABASE_URL: "postgresql://bridge:${BRIDGE_DATABASE_PASSWORD}@bridge-postgresql/bridge_shadow"
|
||||
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"
|
||||
CORS_ALLOWED_ORIGINS: "https://bridge-api,${BRIDGE_DOMAIN},http://localhost:3000,http://127.0.0.1:3000"
|
||||
FRONTEND_URL: ${BRIDGE_DOMAIN}
|
||||
API_URL: "http://bridge-api:3001"
|
||||
NEXTAUTH_URL: ${BRIDGE_DOMAIN}
|
||||
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:
|
||||
postgresql:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
version: "3.4"
|
||||
|
||||
x-global-vars: &common-global-variables
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
FROM redis:7.2.4-bookworm
|
||||
FROM redis:7.4.0-bookworm
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
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
|
||||
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": {
|
||||
"dotenv-cli": "latest",
|
||||
"eslint": "^8",
|
||||
"turbo": "^2.1.2",
|
||||
"typescript": "latest"
|
||||
},
|
||||
"overrides": {
|
||||
|
|
|
|||
|
|
@ -147,6 +147,6 @@ export const db = new KyselyAuth<Database>({
|
|||
user: process.env.DATABASE_USER,
|
||||
password: process.env.DATABASE_PASSWORD,
|
||||
}),
|
||||
}),
|
||||
}) as any,
|
||||
plugins: [new CamelCasePlugin()],
|
||||
});
|
||||
|
|
|
|||
|
|
@ -9,18 +9,14 @@
|
|||
"build": "tsc -p tsconfig.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@auth/kysely-adapter": "^1.4.2",
|
||||
"@auth/kysely-adapter": "^1.5.2",
|
||||
"graphile-worker": "^0.16.6",
|
||||
"kysely": "0.26.1",
|
||||
"pg": "^8.12.0"
|
||||
"pg": "^8.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.25.2",
|
||||
"@babel/preset-env": "7.25.4",
|
||||
"@babel/preset-typescript": "7.24.7",
|
||||
"prettier": "^3.3.3",
|
||||
"@link-stack/eslint-config": "*",
|
||||
"@link-stack/typescript-config": "*",
|
||||
"tsx": "^4.19.0",
|
||||
"typescript": "^5.5.4"
|
||||
"typescript": "^5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,46 +5,21 @@
|
|||
"build": "tsc -p tsconfig.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@auth/kysely-adapter": "^1.4.2",
|
||||
"@emotion/cache": "^11.13.1",
|
||||
"@emotion/react": "^11.13.0",
|
||||
"@emotion/server": "^11.11.0",
|
||||
"@emotion/styled": "^11.13.0",
|
||||
"@link-stack/bridge-common": "^2.2.0",
|
||||
"@link-stack/signal-api": "*",
|
||||
"@mui/icons-material": "^5",
|
||||
"@link-stack/ui": "^2.2.0",
|
||||
"@mui/material": "^5",
|
||||
"@mui/x-data-grid-pro": "^7.12.1",
|
||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
||||
"date-fns": "^3.6.0",
|
||||
"@mui/x-data-grid-pro": "^7.18.0",
|
||||
"kysely": "0.26.1",
|
||||
"material-ui-popup-state": "^5.1.2",
|
||||
"next": "14.2.5",
|
||||
"next": "14.2.13",
|
||||
"react": "18.3.1",
|
||||
"react-cookie": "^7.2.0",
|
||||
"react-cookie-consent": "^9.0.0",
|
||||
"react-dom": "18.3.1",
|
||||
"react-iframe": "^1.8.5",
|
||||
"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"
|
||||
"react-qr-code": "^2.0.15"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2",
|
||||
"@types/node": "^22.5.2",
|
||||
"@types/react": "18.3.5",
|
||||
"@types/node": "^22.7.3",
|
||||
"@types/react": "18.3.9",
|
||||
"@types/react-dom": "^18.3.0",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"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"
|
||||
"typescript": "5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,14 +10,14 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@rushstack/eslint-patch": "^1.10.4",
|
||||
"@typescript-eslint/eslint-plugin": "^8.3.0",
|
||||
"@typescript-eslint/parser": "^8.3.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.7.0",
|
||||
"@typescript-eslint/parser": "^8.7.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-config-xo-space": "^0.35.0",
|
||||
"eslint-plugin-cypress": "^3.5.0",
|
||||
"eslint-plugin-eslint-comments": "^3.2.0",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"eslint-plugin-jest": "^28.8.2",
|
||||
"eslint-plugin-import": "^2.30.0",
|
||||
"eslint-plugin-jest": "^28.8.3",
|
||||
"eslint-plugin-promise": "^7.1.0",
|
||||
"eslint-plugin-unicorn": "55.0.0",
|
||||
"@babel/eslint-parser": "7.25.1"
|
||||
|
|
@ -28,6 +28,6 @@
|
|||
"devDependencies": {
|
||||
"eslint": "^8",
|
||||
"jest": "^29.7.0",
|
||||
"typescript": "^5.5.4"
|
||||
"typescript": "^5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"node": ">=14"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/jest": "^29.5.12",
|
||||
"@types/jest": "^29.5.13",
|
||||
"jest": "^29.7.0",
|
||||
"jest-junit": "^16.0.0"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -5,42 +5,28 @@
|
|||
"build": "tsc -p tsconfig.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@emotion/cache": "^11.13.1",
|
||||
"@emotion/react": "^11.13.0",
|
||||
"@emotion/server": "^11.11.0",
|
||||
"@emotion/react": "^11.13.3",
|
||||
"@emotion/styled": "^11.13.0",
|
||||
"@link-stack/opensearch-common": "*",
|
||||
"@mui/icons-material": "^5",
|
||||
"@mui/material": "^5",
|
||||
"@mui/x-data-grid-pro": "^7.12.1",
|
||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
||||
"@link-stack/opensearch-common": "*",
|
||||
"date-fns": "^3.6.0",
|
||||
"material-ui-popup-state": "^5.1.2",
|
||||
"next": "14.2.5",
|
||||
"@mui/x-data-grid-pro": "^7.18.0",
|
||||
"@mui/x-date-pickers-pro": "^7.18.0",
|
||||
"date-fns": "^4.1.0",
|
||||
"next": "14.2.13",
|
||||
"next-auth": "^4.24.8",
|
||||
"react": "18.3.1",
|
||||
"react-cookie": "^7.2.0",
|
||||
"react-cookie-consent": "^9.0.0",
|
||||
"react-dom": "18.3.1",
|
||||
"react-iframe": "^1.8.5",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-polyglot": "^0.7.2",
|
||||
"tss-react": "^4.9.12",
|
||||
"uuid": "^10.0.0"
|
||||
"react-polyglot": "^0.7.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2",
|
||||
"@types/node": "^22.5.2",
|
||||
"@types/react": "18.3.5",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"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"
|
||||
"@link-stack/eslint-config": "*",
|
||||
"@link-stack/typescript-config": "*",
|
||||
"@types/node": "^22.7.3",
|
||||
"@types/react": "18.3.9",
|
||||
"typescript": "5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,14 +9,10 @@
|
|||
"uuid": "^10.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2",
|
||||
"@types/node": "^22.5.2",
|
||||
"@types/react": "18.3.5",
|
||||
"@types/node": "^22.7.3",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"babel-loader": "^9.1.3",
|
||||
"@link-stack/typescript-config": "*",
|
||||
"@link-stack/eslint-config": "*",
|
||||
"file-loader": "^6.2.0",
|
||||
"typescript": "5.5.4"
|
||||
"typescript": "5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@openapitools/openapi-generator-cli": "^2.13.5",
|
||||
"@openapitools/openapi-generator-cli": "^2.13.9",
|
||||
"@link-stack/typescript-config": "*",
|
||||
"@link-stack/eslint-config": "*",
|
||||
"@types/node": "^22",
|
||||
|
|
|
|||
|
|
@ -9,15 +9,15 @@
|
|||
"dependencies": {
|
||||
"@mui/icons-material": "^5",
|
||||
"@mui/material": "^5",
|
||||
"@mui/x-data-grid-pro": "^7.12.1",
|
||||
"@mui/x-date-pickers-pro": "^7.12.1",
|
||||
"next": "14.2.5",
|
||||
"@mui/x-data-grid-pro": "^7.18.0",
|
||||
"@mui/x-license": "^7.18.0",
|
||||
"next": "14.2.13",
|
||||
"react": "18.3.1",
|
||||
"react-dom": "18.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.2.0",
|
||||
"@types/react": "18.3.3",
|
||||
"typescript": "^5.5.4"
|
||||
"@types/node": "^22.7.3",
|
||||
"@types/react": "18.3.9",
|
||||
"typescript": "^5.6.2"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
"build": "tsc"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.5.2",
|
||||
"@types/node": "^22.7.3",
|
||||
"typescript": "^5"
|
||||
},
|
||||
"author": "",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue