Compare commits

...

7 Commits

28 changed files with 632 additions and 197 deletions
+64 -2
View File
@@ -9,10 +9,8 @@ on:
jobs: jobs:
ci-fe: ci-fe:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Node.js 18.x - name: Setup Node.js 18.x
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@@ -68,6 +66,70 @@ jobs:
docker push registry.digitalocean.com/kemkas/kemkas:${GITHUB_SHA::8} docker push registry.digitalocean.com/kemkas/kemkas:${GITHUB_SHA::8}
docker push ghcr.io/${{ github.repository_owner }}/kemkas:${GITHUB_SHA::8} docker push ghcr.io/${{ github.repository_owner }}/kemkas:${GITHUB_SHA::8}
docker-fe-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- name: Install doctl
uses: digitalocean/action-doctl@v2
with:
token: ${{ secrets.DO_ACCESS_TOKEN }}
- name: Log in to DigitalOcean Container Registry with short-lived credentials
run: doctl registry login --expiry-seconds 1200
- name: Log in to GitHub Container Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- uses: docker/build-push-action@v5
with:
context: ./Kemkas.Web/frontend/
file: ./Kemkas.Web/frontend/Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
push: false
load: true
tags: kemkas/kemkas-fe:edge
- name: Tag container image
run: |
docker tag kemkas/kemkas-fe:edge registry.digitalocean.com/kemkas/kemkas-fe:${GITHUB_SHA::8}
docker tag kemkas/kemkas-fe:edge ghcr.io/${{ github.repository_owner }}/kemkas-fe:${GITHUB_SHA::8}
- name: Push image to Container Registry
run: |
docker push registry.digitalocean.com/kemkas/kemkas-fe:${GITHUB_SHA::8}
docker push ghcr.io/${{ github.repository_owner }}/kemkas-fe:${GITHUB_SHA::8}
docker-be-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- name: Install doctl
uses: digitalocean/action-doctl@v2
with:
token: ${{ secrets.DO_ACCESS_TOKEN }}
- name: Log in to DigitalOcean Container Registry with short-lived credentials
run: doctl registry login --expiry-seconds 1200
- name: Log in to GitHub Container Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- uses: docker/build-push-action@v5
with:
context: .
file: Kemkas.Web/Backend.Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
push: false
load: true
tags: kemkas/kemkas-be:edge
- name: Tag container image
run: |
docker tag kemkas/kemkas-be:edge registry.digitalocean.com/kemkas/kemkas-be:${GITHUB_SHA::8}
docker tag kemkas/kemkas-be:edge ghcr.io/${{ github.repository_owner }}/kemkas-be:${GITHUB_SHA::8}
- name: Push image to Container Registry
run: |
docker push registry.digitalocean.com/kemkas/kemkas-be:${GITHUB_SHA::8}
docker push ghcr.io/${{ github.repository_owner }}/kemkas-be:${GITHUB_SHA::8}
deploy: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: needs:
+20
View File
@@ -0,0 +1,20 @@
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["Kemkas.Web/Kemkas.Web.csproj", "Kemkas.Web/"]
RUN dotnet restore "Kemkas.Web/Kemkas.Web.csproj"
COPY . .
WORKDIR "/src/Kemkas.Web"
RUN dotnet build "Kemkas.Web.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Kemkas.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Kemkas.Web.dll"]
@@ -113,28 +113,19 @@ public class CharacterPersistenceService(
}) })
.ToListAsync(); .ToListAsync();
var characters2ERaw = await dbContext.Karakterek2E.Include(k => k.Szintlepesek) var characters2E = await dbContext.Karakterek2E.Include(k => k.Szintlepesek)
.Where(k => k.OwnerUserId == currentUser.Id) .Where(k => k.OwnerUserId == currentUser.Id)
.Select(k => new .Select(k => new CharacterListItemDto
{ {
k.Id, Id = k.Id,
k.Nev, Name = k.Nev,
k.Szint, Szint = k.Szint,
k.Faj, Faj = k.Faj.Convert(),
Osztalyok = k.Szintlepesek.Select(x => x.Osztaly).ToList(), Osztaly = k.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.Osztaly).First().Convert(),
Edition = "2e"
}) })
.ToListAsync(); .ToListAsync();
var characters2E = characters2ERaw.Select(k => new CharacterListItemDto
{
Id = k.Id,
Name = k.Nev,
Szint = k.Szint,
Faj = k.Faj.Convert(),
Osztaly = string.Join('/', k.Osztalyok.Select(o => o.Convert())),
Edition = "2e"
});
characters.AddRange(characters2E); characters.AddRange(characters2E);
return characters; return characters;
+1 -1
View File
@@ -13,5 +13,5 @@ RUN yarn build
FROM nginx:latest as proxy FROM nginx:latest as proxy
# COPY ./nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder "/src/build" "/usr/share/nginx/html" COPY --from=builder "/src/build" "/usr/share/nginx/html"
COPY ./nginx.conf /etc/nginx/nginx.conf
+36
View File
@@ -0,0 +1,36 @@
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
}
+1 -1
View File
@@ -3,7 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@grafana/faro-web-sdk": "^1.2.2", "@grafana/faro-web-sdk": "^1.3.9",
"@pdf-lib/fontkit": "^1.1.1", "@pdf-lib/fontkit": "^1.1.1",
"@testing-library/jest-dom": "^6.1.4", "@testing-library/jest-dom": "^6.1.4",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
Binary file not shown.
+2 -2
View File
@@ -3,7 +3,7 @@ import './App.css';
import {Faro} from "@grafana/faro-web-sdk"; import {Faro} from "@grafana/faro-web-sdk";
import {createBrowserRouter, redirect, RouterProvider} from "react-router-dom"; import {createBrowserRouter, redirect, RouterProvider} from "react-router-dom";
import CreateCharacter from "./first-edition/pages/CreateCharacter"; import CreateCharacter from "./first-edition/pages/CreateCharacter";
import CharacterList from "./first-edition/pages/CharacterList"; import CharacterList from "./shared/pages/CharacterList";
import ErrorBoundary from "./shared/ErrorBoundary"; import ErrorBoundary from "./shared/ErrorBoundary";
import Header from "./shared/Header"; import Header from "./shared/Header";
import Footer from "./shared/Footer"; import Footer from "./shared/Footer";
@@ -42,7 +42,7 @@ function App(props: {faro?: Faro}) {
const router = createBrowserRouter([ const router = createBrowserRouter([
{ {
path: "/", path: "/",
loader: () => fetchedUser.data == null ? redirect("/1e/karakter") : redirect("/karaktereim") loader: () => fetchedUser.data == null ? redirect("/2e/karakter") : redirect("/karaktereim")
}, },
{ {
path: "/karaktereim", path: "/karaktereim",
@@ -1,26 +0,0 @@
import * as React from "react";
import {Osztaly, OsztalyLabel} from "../domain-models/osztaly";
import {Faj, FajLabel} from "../domain-models/faj";
export interface CharacterListItemDto {
id: string,
name: string,
szint: number,
faj: Faj,
osztaly: Osztaly,
edition: "1e" | "2e"
}
function CharacterListItem(props: {
character: CharacterListItemDto,
}) {
const {character:c} = props
return <>
<td><a href={`/${c.edition}/karakter/${c.id}`}>{c.name}</a></td>
<td>{c.szint}. szintű</td>
<td>{FajLabel(c.faj)}</td>
<td>{OsztalyLabel(c.osztaly)}</td>
</>
}
export default CharacterListItem;
@@ -1,35 +0,0 @@
import * as React from "react";
import {useLoaderData} from "react-router-dom";
import CharacterListItem, {CharacterListItemDto} from "../components/CharacterListItem";
function CharacterList(props: {}) {
const characters = useLoaderData() as CharacterListItemDto[];
return <div className="container">
<div className="container-fluid p-5 bg-black text-white text-center">
<h1>Karakterek</h1>
</div>
<div className="d-grid gap-2 m-5">
<a className="btn btn-dark btn-lg" href="/" type="button">Új karakter létrehozása</a>
</div>
<table className="table mt-3">
<thead>
<tr>
<th scope="col">Név</th>
<th scope="col">Szint</th>
<th scope="col">Faj</th>
<th scope="col">Osztály</th>
</tr>
</thead>
<tbody>
{characters.map(c => (
<tr key={c.id}>
<CharacterListItem character={c}/>
</tr>
))}
</tbody>
</table>
</div>
}
export default CharacterList;
@@ -40,13 +40,12 @@ function DrawFelszereles(draw: (text: string, x: number, y:number) => void, fels
export async function CreatePDF(karakter: KarakterPdfView) { export async function CreatePDF(karakter: KarakterPdfView) {
const existingPdfBytes = await fetch('/km_karakterlap_hysteria_1.2.pdf').then(res => res.arrayBuffer()) const existingPdfBytes = await fetch('/pdfs/km_karakterlap_hysteria_1.2.pdf').then(res => res.arrayBuffer())
const pdfDoc = await PDFDocument.load(existingPdfBytes) const pdfDoc = await PDFDocument.load(existingPdfBytes)
pdfDoc.registerFontkit(fontkit) pdfDoc.registerFontkit(fontkit)
const fontBytes = await fetch('/Merienda-Regular.ttf').then(res => res.arrayBuffer()) const fontBytes = await fetch('/fonts/Merienda-Regular.ttf').then(res => res.arrayBuffer())
const pdfFont = await pdfDoc.embedFont(fontBytes) const pdfFont = await pdfDoc.embedFont(fontBytes)
// const pdfFont = await pdfDoc.embedFont(StandardFonts.TimesNewRoman)
const fontSizeBase = 12 const fontSizeBase = 12
const page = pdfDoc.getPage(0) const page = pdfDoc.getPage(0)
@@ -80,7 +79,7 @@ export async function CreatePDF(karakter: KarakterPdfView) {
DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF) DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF)
const secondPage = pdfDoc.addPage() const secondPage = pdfDoc.addPage()
const fontBoldBytes = await fetch('/Merienda-Bold.ttf').then(res => res.arrayBuffer()) const fontBoldBytes = await fetch('/fonts/Merienda-Bold.ttf').then(res => res.arrayBuffer())
const fontBold = await pdfDoc.embedFont(fontBoldBytes) const fontBold = await pdfDoc.embedFont(fontBoldBytes)
DrawOsztalySpecialsPage(secondPage, pdfFont, fontBold, karakter) DrawOsztalySpecialsPage(secondPage, pdfFont, fontBold, karakter)
@@ -1,7 +1,7 @@
import React from "react"; import React from "react";
import {Fegyver} from "../domain-models/felszereles"; import {Fegyver} from "../domain-models/felszereles";
export function FegyverLabel(fegyver: Fegyver): string { export function FegyverFlags(fegyver: Fegyver): string {
const flags = [] as string[] const flags = [] as string[]
if (fegyver.Megterheltseg) { if (fegyver.Megterheltseg) {
flags.push("M") flags.push("M")
@@ -47,17 +47,15 @@ export function FegyverLabel(fegyver: Fegyver): string {
if (fegyver.Rohamtoro) { if (fegyver.Rohamtoro) {
flags.push("RT") flags.push("RT")
} }
// Replaced by new group "dobhato" return flags.join(' ');
// if (fegyver.EroBonusz) { }
// flags.push("ER")
// } export function FegyverLabel(fegyver: Fegyver): string {
if (fegyver.Megjegyzes != null && fegyver.Megjegyzes.length > 0) { const serializedFlags = FegyverFlags(fegyver) + (fegyver.Megjegyzes != null ? " " + fegyver.Megjegyzes : "");
flags.push(fegyver.Megjegyzes)
}
const serializedFlags = flags.reduce((p,c) => `${p}${c} `, '');
const sizeLabel = fegyver.Size < 1 && fegyver.Size > 0 ? ` [1/${Math.round(1 / fegyver.Size)}]` : (fegyver.Size > 1 ? ` [${fegyver.Size}]` : ''); const sizeLabel = fegyver.Size < 1 && fegyver.Size > 0 ? ` [1/${Math.round(1 / fegyver.Size)}]` : (fegyver.Size > 1 ? ` [${fegyver.Size}]` : '');
return `${fegyver.Name}${sizeLabel} ${serializedFlags.length > 0 ? "| " + serializedFlags : ''}| ${ return `${fegyver.Name}${sizeLabel} | ${serializedFlags.length > 0 ? serializedFlags + " |" : ''}${
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${fegyver.DamageBonus > 0 ? ` +${fegyver.DamageBonus}` : ''} ${ fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${
fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${fegyver.DamageBonus > 0 ? ` +${fegyver.DamageBonus}` : ''} ${
fegyver.CritRangeStart < 20 ? `${fegyver.CritRangeStart}-20` : ''}x${fegyver.CritMultiplier}${ fegyver.CritRangeStart < 20 ? `${fegyver.CritRangeStart}-20` : ''}x${fegyver.CritMultiplier}${
fegyver.Price > 0 ? ` | ár: ${fegyver.Price} at ` : ''}${ fegyver.Price > 0 ? ` | ár: ${fegyver.Price} at ` : ''}${
fegyver.Range > 10 ? ` | táv: ${fegyver.Range}` : ''}` fegyver.Range > 10 ? ` | táv: ${fegyver.Range}` : ''}`
@@ -2,7 +2,7 @@ import React from "react";
import {Faj2E, FajLabel} from "../domain-models/faj2E"; import {Faj2E, FajLabel} from "../domain-models/faj2E";
import {Modifier} from "../domain-models/tulajdonsag2E"; import {Modifier} from "../domain-models/tulajdonsag2E";
import {SignedNumberToText} from "../../shared/helpers"; import {SignedNumberToText} from "../../shared/components/Helpers";
function fajiModositoText(faj: Faj2E, szamolas: (f: Faj2E) => number) : string { function fajiModositoText(faj: Faj2E, szamolas: (f: Faj2E) => number) : string {
@@ -120,7 +120,7 @@ function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E,
export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E { export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E {
return { return {
...karakter, ...karakter,
szintlepesek: [{...karakter.szintlepesek[0], osztaly}, ...karakter.szintlepesek.slice(1)] szintlepesek: [{...karakter.szintlepesek[0], HProll: BaseHP(osztaly) , osztaly}, ...karakter.szintlepesek.slice(1)]
} }
} }
@@ -53,6 +53,24 @@ export function HP(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'szintlepesek'>)
.reduce((sum, val) => sum + val, 0) .reduce((sum, val) => sum + val, 0)
} }
export function VOegyeb(karakter: Pick<Karakter2E, 'faj'| 'szintlepesek'>): number {
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
let vo = 0;
if (osztalyok.has(Osztaly2E.Tengeresz)) {
const kalozSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
vo += Math.floor(kalozSzintek / 3)
}
if (osztalyok.has(Osztaly2E.Amazon)) {
const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length
vo += Math.floor(amazonSzintek / 2)
}
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
vo += 1
}
return vo;
}
export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintlepesek' | 'szint' | 'felszereles'>): number { export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintlepesek' | 'szint' | 'felszereles'>): number {
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly)) const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
const pancel = GetPancel(karakter.felszereles.pancelID) const pancel = GetPancel(karakter.felszereles.pancelID)
@@ -63,20 +81,12 @@ export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintle
if (pancel) { if (pancel) {
abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO) abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO)
} }
if (osztalyok.has(Osztaly2E.Tengeresz)) { if (osztalyok.has(Osztaly2E.Amazon)){
const kalozSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
vo += Math.floor(kalozSzintek / 3)
}
if (osztalyok.has(Osztaly2E.Amazon)) {
if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) { if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) {
abilityVO = Modifier(karakter.tulajdonsagok.t_kar) abilityVO = Modifier(karakter.tulajdonsagok.t_kar)
} }
const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length
vo += Math.floor(amazonSzintek / 2)
}
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
vo += 1
} }
vo += VOegyeb(karakter)
vo += abilityVO vo += abilityVO
return vo return vo
@@ -9,9 +9,12 @@ import {AllowedFegyver} from "./allowed-fegyver";
export interface Szintlepes { export interface Szintlepes {
osztaly: Osztaly2E; osztaly: Osztaly2E;
HProll: number; HProll: number;
tolvajExtraKepzettseg?: KepzettsegId; // only at level 5 and 9 // only at level 5 and 9
harcosFegyver?: string; // every 3rd level tolvajExtraKepzettseg?: KepzettsegId;
kalozKritikus?: string; // every odd level // every odd level
harcosFegyver?: string;
// every 3rd level
kalozKritikus?: string;
tulajdonsagNoveles?: Tulajdonsag2E; tulajdonsagNoveles?: Tulajdonsag2E;
} }
@@ -1,6 +1,6 @@
import React, {useContext, useState} from 'react' import React, {useContext, useState} from 'react'
import {useLoaderData, useNavigate, useParams} from "react-router-dom"; import {useLoaderData, useNavigate, useParams} from "react-router-dom";
import {Button, InputGroup, Modal, OverlayTrigger, Toast, ToastContainer, Tooltip} from "react-bootstrap"; import {Button, InputGroup, Modal, OverlayTrigger, Toast, ToastContainer} from "react-bootstrap";
import {ChangeLvl1Osztaly, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E"; import {ChangeLvl1Osztaly, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E"; import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E";
import FajSelector2E from "../components/FajSelector2E"; import FajSelector2E from "../components/FajSelector2E";
@@ -32,6 +32,8 @@ import {
} from "../api/character.api"; } from "../api/character.api";
import {Faro} from "@grafana/faro-web-sdk"; import {Faro} from "@grafana/faro-web-sdk";
import Form from "react-bootstrap/Form"; import Form from "react-bootstrap/Form";
import {CreatePDF} from "../pdf/character.pdf";
import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view";
function CreateCharacter2E(props: { function CreateCharacter2E(props: {
faro?: Faro faro?: Faro
@@ -272,18 +274,16 @@ function CreateCharacter2E(props: {
</div> </div>
</div> </div>
<div className="col-6"> <div className="col-6">
<OverlayTrigger <div className='d-grid gap-2 m-5'>
placement='top' <button className='btn btn-danger btn-lg' type='button' onClick={async () => {
overlay={<Tooltip id="pdf-btn-tooltip">Hamarosan!</Tooltip>} faro?.api.pushEvent('character_created', {
delay={0} osztaly: karakter.szintlepesek[0].osztaly,
defaultShow={false} szint: karakter.szint.toString(),
flip={false} faj: karakter.faj.toString(),
trigger={"hover"} })
> await CreatePDF(KarakterInputToPdfView(karakter))
<div className='d-grid gap-2 m-5'> }}>PDF</button>
<button className='btn btn-secondary btn-lg' disabled={true} type='button'>PDF</button> </div>
</div>
</OverlayTrigger>
</div> </div>
</div> </div>
</form> </form>
@@ -0,0 +1,90 @@
import {KarakterPdfView} from "./karakter_pdf_view";
import {PDFDocument} from "pdf-lib";
import fontkit from "@pdf-lib/fontkit";
import download from "downloadjs";
import {SignedNumberToText} from "../../shared/components/Helpers";
export async function CreatePDF(karakter: KarakterPdfView) {
const existingPdfBytes = await fetch('/pdfs/kem2karakterlap_form.pdf').then(res => res.arrayBuffer())
const pdfDoc = await PDFDocument.load(existingPdfBytes)
pdfDoc.registerFontkit(fontkit)
const fontBytes = await fetch('/fonts/Milonga-Regular.ttf').then(res => res.arrayBuffer())
const pdfFont = await pdfDoc.embedFont(fontBytes)
const form = pdfDoc.getForm()
const osztalyok = karakter.Osztaly.length > 1 ? karakter.Osztaly.map(x => `${x.osztaly} (${x.szint})`).join(", ") : karakter.Osztaly[0].osztaly
form.getTextField("nev_faj_osztaly").setText(`${karakter.Nev}, ${karakter.Faj} ${osztalyok}`)
form.getTextField("szint").setText((karakter.SzintTotal.length > 1 ? " " : " ") + karakter.SzintTotal)
form.getTextField("jellem").setText(karakter.Jellem)
form.getTextField("istenseg").setText(karakter.Isten)
form.getTextField("vo").setText(karakter.VO.toString())
form.getTextField("pancel").setText(" " + karakter.PancelVO)
form.getTextField("pajzs").setText(" " + karakter.PajzsVO)
form.getTextField("egyeb_vo").setText(" " + karakter.EgyebVO)
form.getTextField("tul_ero").setText(` ${karakter.Tulajdonsagok.t_ero}`)
form.getTextField("tul_ero_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_ero))
form.getTextField("tul_ugy").setText(` ${karakter.Tulajdonsagok.t_ugy}`)
form.getTextField("tul_ugy_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_ugy))
form.getTextField("tul_egs").setText(` ${karakter.Tulajdonsagok.t_egs}`)
form.getTextField("tul_egs_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_egs))
form.getTextField("tul_int").setText(` ${karakter.Tulajdonsagok.t_int}`)
form.getTextField("tul_int_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_int))
form.getTextField("tul_bol").setText(` ${karakter.Tulajdonsagok.t_bol}`)
form.getTextField("tul_bol_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_bol))
form.getTextField("tul_kar").setText(` ${karakter.Tulajdonsagok.t_kar}`)
form.getTextField("tul_kar_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_kar))
form.getTextField("hp_rolls").setText(karakter.HPszintenkent.join(", "))
form.getTextField("hp_aktualis").setText(karakter.HP.toString())
form.getTextField("kitartas_alap").setText(" " + karakter.MentokAlap.kitartas.toString())
form.getTextField("kitartas_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.kitartas))
form.getTextField("kitartas_sum").setText(" " + karakter.MentokModositokkal.kitartas.toString())
form.getTextField("reflex_alap").setText(" " + karakter.MentokAlap.reflex.toString())
form.getTextField("reflex_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.reflex))
form.getTextField("reflex_sum").setText(" " + karakter.MentokModositokkal.reflex.toString())
form.getTextField("akaratero_alap").setText(" " + karakter.MentokAlap.akaratero.toString())
form.getTextField("akaratero_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.akaratero))
form.getTextField("akaratero_sum").setText(" " + karakter.MentokModositokkal.akaratero.toString())
form.getTextField("kezdemenyezes").setText(" " + SignedNumberToText(karakter.Kezdemenyezes))
form.getTextField("tamadas_bonusz_alap").setText(karakter.TamadasBonuszAlap.join("/"))
form.getTextField("tamadas_bonusz_ero").setText(" " + SignedNumberToText(karakter.TulajdonsagModositok.t_ero))
form.getTextField("tamadas_bonusz_kozelharc").setText(karakter.KozelharciTB.join("/"))
form.getTextField("tamadas_bonusz_ugy").setText(" " + SignedNumberToText(karakter.TulajdonsagModositok.t_ugy))
form.getTextField("tamadas_bonusz_tavolsagi").setText(karakter.CelzoTB.join("/"))
for (let i = 0; i < karakter.Kepzettsegek.length; i++) {
const kepzettseg = karakter.Kepzettsegek[i]
form.getTextField(`kepzettseg_${i}_nev`).setText(kepzettseg.nev)
form.getTextField(`kepzettseg_${i}_alap`).setText(kepzettseg.alap)
form.getTextField(`kepzettseg_${i}_bonusz`).setText(kepzettseg.bonusz)
form.getTextField(`kepzettseg_${i}_osszes`).setText(kepzettseg.osszes)
}
for (let i = 0; i < karakter.Fegyverek.length; i++) {
form.getTextField(`fegyver_${i+1}`).setText(karakter.Fegyverek[i])
}
for (let i = 0; i < karakter.FelszerelesViselt.length && i < 8; i++) {
form.getTextField(`viselt_${i}`).setText(karakter.FelszerelesViselt[i])
}
for (let i = 0; i < karakter.FelszerelesCipelt.length && i < 8; i++) {
form.getTextField(`cipelt_${i}`).setText(karakter.FelszerelesCipelt[i])
}
for (let i = 0; i < karakter.FelszerelesAprosagok.length && i < 8; i++) {
form.getTextField(`aprosagok_${i}`).setText(karakter.FelszerelesAprosagok[i])
}
form.updateFieldAppearances(pdfFont)
const pdfBytes = await pdfDoc.save();
download(pdfBytes, `${karakter.Nev}_${karakter.SzintTotal}.pdf`, "application/pdf");
}
@@ -0,0 +1,176 @@
import {Modifier, TulajdonsagokTotal} from "../domain-models/tulajdonsag2E";
import {Mentok, MentoModositok, MultiClassMentokAlap} from "../domain-models/mentok";
import {CalculateMasodlagosErtekek, VOegyeb} from "../domain-models/masodlagos_ertekek";
import {FajLabel} from "../domain-models/faj2E";
import {Osztaly2E, OsztalyLabel} from "../domain-models/osztaly2E";
import {CelzoTB, KozelharciTB, MultiClassTamadasBonusz} from "../domain-models/tamadas_bonusz";
import {Karakter2E} from "../domain-models/karakter2E";
import {GetJellem} from "../domain-models/jellem";
import {GetFegyver, GetPajzs, GetPancel} from '../domain-models/felszereles'
import {
KarakterTulajdonsagok,
TulajdonsagModosito
} from "../domain-models/tulajdonsag2E";
import {SignedNumberToText} from "../../shared/components/Helpers";
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek2E";
import {getClassLevels} from "../domain-models/szintlepes";
import {FegyverFlags} from "../components/FegyverSelector";
interface KepzettsegPdfView {
nev: string,
alap: string,
bonusz: string,
osszes: string
}
export interface KarakterPdfView {
Nev: string
Isten: string
Jellem: string
Faj: string
Osztaly: {osztaly: string, szint: number}[]
Tulajdonsagok: KarakterTulajdonsagok,
TulajdonsagModositok: KarakterTulajdonsagok,
SzintTotal: string
HP: number
HPszintenkent: number[]
VO: number
PancelVO: string
PajzsVO: string
EgyebVO: string
Kezdemenyezes: number
TamadasBonuszAlap: number[]
KozelharciTB: number[]
CelzoTB: number[]
MentokAlap: Mentok
MentoModositok: Mentok
MentokModositokkal: Mentok,
Kepzettsegek: KepzettsegPdfView[],
Fegyverek: string[],
FelszerelesViselt: string[],
FelszerelesCipelt: string[],
FelszerelesAprosagok: string[],
}
export function KarakterInputToPdfView(karakter: Karakter2E): KarakterPdfView {
const tulajdonsagok = TulajdonsagokTotal(karakter)
karakter = {...karakter, tulajdonsagok}
const tulajdonsagModositok = TulajdonsagModosito(tulajdonsagok)
const masodlagosErtekek = CalculateMasodlagosErtekek(karakter)
const pancel = GetPancel(karakter.felszereles.pancelID)
const pajzs = GetPajzs(karakter.felszereles.pajzsID)
const kezdemenyezes = tulajdonsagModositok.t_ugy + (karakter.szintlepesek.some(x => x.osztaly === Osztaly2E.Tolvaj) ? 4 : 0)
const mentok = MultiClassMentokAlap(karakter.szintlepesek)
const mentoModositok = MentoModositok(tulajdonsagModositok)
const osztalyok = new Array(...(new Set(karakter.szintlepesek.map(x => x.osztaly))))
const osztaly = osztalyok.map(x => ({
osztaly: OsztalyLabel(x),
szint: karakter.szintlepesek.filter(sz => sz.osztaly === x).length
}))
const classLevels = getClassLevels(karakter.szintlepesek)
let felszereles = [] as string[]
if(pancel != null){
felszereles = felszereles.concat(FelszerelesToPdfView(pancel))
}
if(pajzs != null){
felszereles = felszereles.concat(FelszerelesToPdfView(pajzs))
}
felszereles = felszereles.concat(karakter.felszereles.fegyverIDk.map(x => {
const fegyver = GetFegyver(x)
if (fegyver == null) {
console.error("unknown fegyver: " + x)
return []
}
return FelszerelesToPdfView(fegyver)
}).reduce((acc, item) => acc.concat(item), [] as string[]))
return {
Faj: FajLabel(karakter.faj).toLowerCase(),
Isten: karakter.isten || "",
Jellem: GetJellem(karakter.jellem).Label,
Nev: karakter.nev,
Tulajdonsagok: karakter.tulajdonsagok,
Osztaly: osztaly,
SzintTotal: karakter.szint.toString(),
TulajdonsagModositok: tulajdonsagModositok,
HP: masodlagosErtekek.HP,
HPszintenkent: karakter.szintlepesek.map(x => x.HProll),
Kezdemenyezes: kezdemenyezes,
TamadasBonuszAlap: MultiClassTamadasBonusz(karakter.szintlepesek),
KozelharciTB: KozelharciTB(karakter),
CelzoTB: CelzoTB(karakter),
MentoModositok: mentoModositok,
MentokAlap: mentok,
MentokModositokkal: masodlagosErtekek.Mentok,
VO: masodlagosErtekek.VO,
PajzsVO: SignedNumberToText(pajzs?.VO),
PancelVO: SignedNumberToText(pancel?.VO),
EgyebVO: SignedNumberToText(VOegyeb(karakter)),
Kepzettsegek:
karakter.kepzettsegek.map(k =>
mapKepzettsegToPdfView(Kepzettsegek[k], tulajdonsagok, karakter.szint))
.concat(karakter.tolvajKepzettsegek?.map(k =>
mapKepzettsegToPdfView(Kepzettsegek[k], tulajdonsagok, classLevels[Osztaly2E.Tolvaj])) || []),
Fegyverek: karakter.felszereles.fegyverIDk.slice(0, 4).map(fid => {
const fegyver = GetFegyver(fid)
if (fegyver == null) {
console.error("unknown fegyver: " + fid)
return ""
}
const serializedFlags = FegyverFlags(fegyver);
const critStart = fegyver.CritRangeStart - karakter.szintlepesek.filter(x => x.kalozKritikus === fegyver.Id).length
const damageBonus = fegyver.DamageBonus +
(fegyver.KetkezesBonusz ? 1 : 0) +
(fegyver.Type !== "lofegyver" || fegyver.EroBonusz ? tulajdonsagModositok.t_ero : 0) +
(karakter.szintlepesek.filter(x => x.harcosFegyver === fegyver.Id).length * 2)
return `${fegyver.Name} ${serializedFlags.length > 0 ? serializedFlags + " " : ''} ${
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${
fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${damageBonus !== 0 ? `${
SignedNumberToText(damageBonus)}` : ''} ${
critStart < 20 ? `${critStart}-20` : '20'}x${fegyver.CritMultiplier}`
}),
FelszerelesViselt: felszereles,
FelszerelesCipelt: [],
FelszerelesAprosagok: []
}
}
interface FelszerelesPdf {
Name: string,
Size: number,
}
function FelszerelesToPdfView(item: FelszerelesPdf): string[] {
const ans = [item.Name]
for (let i = 1; i < item.Size; i ++) {
ans.push("+")
}
return ans
}
function mapKepzettsegToPdfView(kepzettseg: Kepzettseg, tulajdonsagok: KarakterTulajdonsagok, szint: number): KepzettsegPdfView {
const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) =>
tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek
? tulajdonsagok[currentTulajdonsag]
: maxTulajdonsagErtek,
tulajdonsagok[kepzettseg.Tulajdonsag[0]])
return {
nev: kepzettseg.Name,
alap: szint.toString(),
bonusz: SignedNumberToText(Modifier(tulajdonsagErtek)),
osszes: (szint + Modifier(tulajdonsagErtek)).toString(),
}
}
@@ -0,0 +1,19 @@
import * as React from "react";
import {CharacterListItemViewModel} from "../pages/CharacterList";
function CharacterListItem(props: {
character: CharacterListItemViewModel,
}) {
const {character:c} = props
return <>
<td><a href={`/${c.edition}/karakter/${c.id}`}>{c.name}</a></td>
<td>{c.szint}. szintű</td>
<td>{c.faj}</td>
<td>{c.osztaly}</td>
<td>{c.edition}</td>
</>
}
export default CharacterListItem;
@@ -1,3 +1,3 @@
export function SignedNumberToText(val: number) : string { export function SignedNumberToText(val?: number) : string {
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString()) return (val === null || val === undefined) ? "" : (val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString()))
} }
@@ -1,3 +0,0 @@
export function SignedNumberToText(val: number) : string {
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
}
@@ -0,0 +1,101 @@
import * as React from "react";
import {useLoaderData} from "react-router-dom";
import CharacterListItem from "../components/CharacterListItem";
import {Faj, FajLabel as FajLabel1E} from "../../first-edition/domain-models/faj";
import {Faj2E, FajLabel as FajLabel2E} from "../../second-edition/domain-models/faj2E";
import {Osztaly, OsztalyLabel as OsztalyLabel1E} from "../../first-edition/domain-models/osztaly";
import {Osztaly2E, OsztalyLabel as OsztalyLabel2E} from "../../second-edition/domain-models/osztaly2E";
export interface CharacterListItemViewModel {
id: string,
name: string,
szint: number,
faj: string,
osztaly: string,
edition: "1e" | "2e"
}
interface CharacterListItemDto1E {
id: string,
name: string,
szint: number,
faj: Faj,
osztaly: Osztaly,
edition: "1e"
}
interface CharacterListItemDto2E {
id: string,
name: string,
szint: number,
faj: Faj2E,
osztaly: Osztaly2E,
edition: "2e"
}
type CharacterListItemDto = CharacterListItemDto1E | CharacterListItemDto2E;
function mapDtoToViewModel(dto: CharacterListItemDto): CharacterListItemViewModel {
if (dto.edition === "1e") {
return {
id: dto.id,
name: dto.name,
edition: dto.edition,
szint: dto.szint,
faj: FajLabel1E(dto.faj),
osztaly: OsztalyLabel1E(dto.osztaly),
}
}
else {
return {
id: dto.id,
name: dto.name,
edition: dto.edition,
szint: dto.szint,
faj: FajLabel2E(dto.faj),
osztaly: OsztalyLabel2E(dto.osztaly),
}
}
}
function CharacterList(props: {}) {
const characters = useLoaderData() as CharacterListItemDto[];
return <div className="container">
<div className="container-fluid p-5 bg-black text-white text-center">
<h1>Karakterek</h1>
</div>
<div className="row">
<div className="col-6">
<div className="d-grid gap-1 m-3 m-lg-5">
<a className="btn btn-dark btn-lg" href="/2e/karakter/" type="button">Új 2e karakter létrehozása</a>
</div>
</div>
<div className="col-6">
<div className="d-grid gap-1 m-3 m-lg-5">
<a className="btn btn-dark btn-lg" href="/1e/karakter/" type="button">Új 1e karakter létrehozása</a>
</div>
</div>
</div>
<table className="table mt-3">
<thead>
<tr>
<th scope="col">Név</th>
<th scope="col">Szint</th>
<th scope="col">Faj</th>
<th scope="col">Osztály</th>
<th scope="col">Kiadás</th>
</tr>
</thead>
<tbody>
{characters.map(c => (
<tr key={c.id}>
<CharacterListItem character={mapDtoToViewModel(c)}/>
</tr>
))}
</tbody>
</table>
</div>
}
export default CharacterList;
+58 -64
View File
@@ -1322,21 +1322,20 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
"@grafana/faro-core@^1.3.6": "@grafana/faro-core@^1.3.9":
version "1.3.6" version "1.3.9"
resolved "https://registry.yarnpkg.com/@grafana/faro-core/-/faro-core-1.3.6.tgz#7e4f2754e35d683c259af2ee4851aceadbfca8ad" resolved "https://registry.yarnpkg.com/@grafana/faro-core/-/faro-core-1.3.9.tgz#69d7c4239c3507028eb7a6f21f1213278b11194a"
integrity sha512-1N/VWOIuukvqJUbpGRmendbJSG8hEvMqUV79+jPrhSRjM2VlNsqtFC/0VdW9mpQPpZh2cOyI5bPjuAZsRe7+Xw== integrity sha512-zBghaYNKwMwiyErUYEYbx/E/HTdy3tFS7Oy+1f5CiIi5+iUSYidgeQqKdd4vKB1EtDn1MI5iA2dXBavxLNYGlg==
dependencies: dependencies:
"@opentelemetry/api" "^1.7.0" "@opentelemetry/api" "^1.7.0"
"@opentelemetry/otlp-transformer" "^0.45.1" "@opentelemetry/otlp-transformer" "^0.48.0"
murmurhash-js "^1.0.0"
"@grafana/faro-web-sdk@^1.2.2": "@grafana/faro-web-sdk@^1.3.9":
version "1.3.6" version "1.3.9"
resolved "https://registry.yarnpkg.com/@grafana/faro-web-sdk/-/faro-web-sdk-1.3.6.tgz#96fecf122d3352a3867bde76a01ef38fe75d868c" resolved "https://registry.yarnpkg.com/@grafana/faro-web-sdk/-/faro-web-sdk-1.3.9.tgz#ebf8c645cbcc3a22e31a89d0e7e94f9d09f88c5f"
integrity sha512-hxqHRZM1AERK6YZtJpCM1PJoj9/CLhCfQcfprcv751l5xkLCOzCoUWiH8CSW3gfiu7egIzEq0luHF7544Xezvg== integrity sha512-lrUhzITfgpEtOP4I/HbhIh0UCTNpcAWveFN7bzdCJ/N/G3YULd6jXBuBoHcC25Fx3WtLChljzJ5IJ02HTA2Q9g==
dependencies: dependencies:
"@grafana/faro-core" "^1.3.6" "@grafana/faro-core" "^1.3.9"
ua-parser-js "^1.0.32" ua-parser-js "^1.0.32"
web-vitals "^3.1.1" web-vitals "^3.1.1"
@@ -1696,10 +1695,10 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@opentelemetry/api-logs@0.45.1": "@opentelemetry/api-logs@0.48.0":
version "0.45.1" version "0.48.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.45.1.tgz#9e4f2c652dcce798c5627939b22304c2b5ce19c5" resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz#9521a0c1e920ed536f31cda117164c4afff44caf"
integrity sha512-zVGq/k70l+kB/Wuv3O/zhptP2hvDhEbhDu9EtHde1iWZJf3FedeYS/nWVcMBkkyPAjS/JKNk86WN4CBQLGUuOw== integrity sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==
dependencies: dependencies:
"@opentelemetry/api" "^1.0.0" "@opentelemetry/api" "^1.0.0"
@@ -1708,63 +1707,63 @@
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40"
integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw== integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==
"@opentelemetry/core@1.18.1": "@opentelemetry/core@1.21.0":
version "1.18.1" version "1.21.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.1.tgz#d2e45f6bd6be4f00d20d18d4f1b230ec33805ae9" resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.21.0.tgz#8c16faf16edf861b073c03c9d45977b3f4003ee1"
integrity sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg== integrity sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==
dependencies: dependencies:
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.21.0"
"@opentelemetry/otlp-transformer@^0.45.1": "@opentelemetry/otlp-transformer@^0.48.0":
version "0.45.1" version "0.48.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.45.1.tgz#8f6590b93f177510983bea3055e5a3f3d30faad2" resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz#969d52a767c7538552b88f7baaa001d3f88feb17"
integrity sha512-FhIHgfC0b0XtoBrS5ISfva939yWffNl47ypXR8I7Ru+dunlySpmf2TLocKHYLHGcWiuoeSNO5O4dZCmSKOtpXw== integrity sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==
dependencies: dependencies:
"@opentelemetry/api-logs" "0.45.1" "@opentelemetry/api-logs" "0.48.0"
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.21.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.21.0"
"@opentelemetry/sdk-logs" "0.45.1" "@opentelemetry/sdk-logs" "0.48.0"
"@opentelemetry/sdk-metrics" "1.18.1" "@opentelemetry/sdk-metrics" "1.21.0"
"@opentelemetry/sdk-trace-base" "1.18.1" "@opentelemetry/sdk-trace-base" "1.21.0"
"@opentelemetry/resources@1.18.1": "@opentelemetry/resources@1.21.0":
version "1.18.1" version "1.21.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.18.1.tgz#e27bdc4715bccc8cd4a72d4aca3995ad0a496fe7" resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.21.0.tgz#e773e918cc8ca26493a987dfbfc6b8a315a2ab45"
integrity sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA== integrity sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.21.0"
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.21.0"
"@opentelemetry/sdk-logs@0.45.1": "@opentelemetry/sdk-logs@0.48.0":
version "0.45.1" version "0.48.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.45.1.tgz#d59a99147ab15eb36757932517dfc9a10e1645e9" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz#5248e4cbfc99bbee555ffd1a23b5db53d6553f2c"
integrity sha512-z0RRgW4LeKEKnhXS4F/HnqB6+7gsy63YK47F4XAJYHs4s1KKg8XnQ2RkbuL31i/a9nXkylttYtvsT50CGr487g== integrity sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.21.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.21.0"
"@opentelemetry/sdk-metrics@1.18.1": "@opentelemetry/sdk-metrics@1.21.0":
version "1.18.1" version "1.21.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.18.1.tgz#1dd334744a1e5d2eec27e9e9765c73cd2f43aef3" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz#40d71aaec5b696e58743889ce6d5bf2593f9a23d"
integrity sha512-TEFgeNFhdULBYiCoHbz31Y4PDsfjjxRp8Wmdp6ybLQZPqMNEb+dRq+XN8Xw3ivIgTaf9gYsomgV5ensX99RuEQ== integrity sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.21.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.21.0"
lodash.merge "^4.6.2" lodash.merge "^4.6.2"
"@opentelemetry/sdk-trace-base@1.18.1": "@opentelemetry/sdk-trace-base@1.21.0":
version "1.18.1" version "1.21.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz#256605d90b202002d5672305c66dbcf377132379" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz#ffad912e453a92044fb220bd5d2f6743bf37bb8a"
integrity sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg== integrity sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.21.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.21.0"
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.21.0"
"@opentelemetry/semantic-conventions@1.18.1": "@opentelemetry/semantic-conventions@1.21.0":
version "1.18.1" version "1.21.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz#8e47caf57a84b1dcc1722b2025693348cdf443b4" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz#83f7479c524ab523ac2df702ade30b9724476c72"
integrity sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA== integrity sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==
"@pdf-lib/fontkit@^1.1.1": "@pdf-lib/fontkit@^1.1.1":
version "1.1.1" version "1.1.1"
@@ -6961,11 +6960,6 @@ multicast-dns@^7.2.5:
dns-packet "^5.2.2" dns-packet "^5.2.2"
thunky "^1.0.2" thunky "^1.0.2"
murmurhash-js@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51"
integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==
mz@^2.7.0: mz@^2.7.0:
version "2.7.0" version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"