Deploy 2025-02-03

This commit is contained in:
Forgejo actions[bot] 2025-02-03 07:50:34 +00:00
parent b05bea95c6
commit 012b7386c7
53 changed files with 216 additions and 6428 deletions

View file

@ -1,16 +0,0 @@
on:
push:
branches:
- 'renovate/*'
jobs:
test-dependencies:
runs-on: docker
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
run_install: |
- recursive: true
args: [--frozen-lockfile, --strict-peer-dependencies]
- run: pnpm build

17
.gitignore vendored
View file

@ -1,17 +0,0 @@
# editors
.idea/
.vscode/
*.swp
# direnv
.direnv
.envrc
# nodejs
node_modules/
# nix
/result
# custom
.DS_Store
# vuepress
/docs/.vuepress/.cache
/docs/.vuepress/.temp
/docs/.vuepress/dist

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-rc.18" />
<meta name="generator" content="VuePress 2.0.0-rc.19" />
<style>
:root {
--vp-c-bg: #fff;
@ -32,12 +32,12 @@
}
</script>
<meta property="og:url" content="https://pleshevski.ru/404.html"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":""}</script><title>Дмитрий Плешевский</title><meta name="description" content=" ">
<link rel="preload" href="/assets/style-CyqMEKOR.css" as="style"><link rel="stylesheet" href="/assets/style-CyqMEKOR.css">
<link rel="modulepreload" href="/assets/app-CvTe0YTg.js"><link rel="modulepreload" href="/assets/404.html-BGekuXRq.js">
<link rel="prefetch" href="/assets/index.html-D7ve43IL.js" as="script"><link rel="prefetch" href="/assets/works.html-NBBFoiT7.js" as="script"><link rel="prefetch" href="/assets/index.html-B5LWGqHO.js" as="script"><link rel="prefetch" href="/assets/works.html-CihZ59B-.js" as="script">
<link rel="preload" href="/assets/style-CynUSZ8x.css" as="style"><link rel="stylesheet" href="/assets/style-CynUSZ8x.css">
<link rel="modulepreload" href="/assets/app-R2Ffa9VO.js"><link rel="modulepreload" href="/assets/404.html-Xq3T-2PH.js">
<link rel="prefetch" href="/assets/index.html-DasZnaAo.js" as="script"><link rel="prefetch" href="/assets/works.html-DplNc40I.js" as="script"><link rel="prefetch" href="/assets/index.html-7-wjojn8.js" as="script"><link rel="prefetch" href="/assets/works.html-D4EgERwy.js" as="script">
</head>
<body>
<div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-9607bbd4><main class="page" data-v-9607bbd4><div class="theme-default-content" vp-content data-v-9607bbd4><h1 data-v-9607bbd4>404</h1><blockquote data-v-9607bbd4>Ошиблись в параллельной вселенной.</blockquote><a class="route-link" href="/" data-v-9607bbd4>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
<script type="module" src="/assets/app-CvTe0YTg.js" defer></script>
<div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-f90f3f6a><main class="page" data-v-f90f3f6a><div vp-content data-v-f90f3f6a><h1 data-v-f90f3f6a>404</h1><blockquote data-v-f90f3f6a>Ошиблись в параллельной вселенной.</blockquote><a class="route-link" href="/" data-v-f90f3f6a>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
<script type="module" src="/assets/app-R2Ffa9VO.js" defer></script>
</body>
</html>

View file

@ -1,24 +0,0 @@
PREFIX ?= dist
.PHONY: help
help:
cat Makefile
.PHONY: build
build:
pnpm run build --dest $(PREFIX)
.PHONY: install
install: build
.PHONY: dev
dev:
pnpm run dev
.PHONY: deps
deps:
pnpm install
.PHONY: init-git-hooks
init-git-hooks:
ln -sf $(PWD)/scripts/pre-commit $(PWD)/.git/hooks/pre-commit

View file

@ -1 +1 @@
import{_ as e,c as o,a,o as n}from"./app-CvTe0YTg.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};
import{_ as e,c as o,a,o as n}from"./app-R2Ffa9VO.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};

31
assets/app-R2Ffa9VO.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

43
dist/eng/index.html vendored

File diff suppressed because one or more lines are too long

43
dist/eng/works.html vendored

File diff suppressed because one or more lines are too long

43
dist/index.html vendored

File diff suppressed because one or more lines are too long

43
dist/works.html vendored

File diff suppressed because one or more lines are too long

View file

@ -1,6 +0,0 @@
import { defineClientConfig } from "vuepress/client";
import WorksPage from "./pages/WorksPage.vue";
export default defineClientConfig({
layouts: { WorksPage },
});

View file

@ -1,98 +0,0 @@
import { defineUserConfig } from "vuepress";
import { viteBundler } from "@vuepress/bundler-vite";
import { mkMyTheme } from "./theme.js";
import { redirectPlugin } from "@vuepress/plugin-redirect";
export default defineUserConfig({
lang: "ru-RU",
title: "Дмитрий Плешевский",
description: " ",
locales: {
"/": {
lang: "ru-RU",
title: "Дмитрий Плешевский",
},
"/eng/": {
lang: "en-US",
title: "Dmitriy Pleshevskiy",
},
},
theme: mkMyTheme({
hostname: "https://pleshevski.ru",
repo: "https://git.pleshevski.ru/pleshevskiy/pleshevski.ru",
locales: {
"/": {
selectLanguageName: "Русский",
navbar: ["/", "/works"],
notFound: [
"Верните страницу!",
"Мы потеряли страницу...",
"Вы заблокированы в лабиринте.",
"Искали кота?",
"Страница украдена.",
"Ошиблись в параллельной вселенной.",
],
backToHome: "Вернуться на главную",
worksTable: {
name: "Название",
description: "Описание",
role: "Роль",
technologies: "Технологии",
status: "Статус",
dates: "Даты",
},
},
"/eng/": {
selectLanguageName: "English",
navbar: ["/eng/", "/eng/works"],
notFound: [
"Return the page!",
"We lost a page...",
"You're blocked in a labyrinth.",
"Looking for a cat?",
"The page has been stolen.",
"Wrong turn in parallel universe.",
],
backToHome: "Back to home",
worksTable: {
name: "Name",
description: "Description",
role: "Role",
technologies: "Technologies",
status: "Status",
dates: "Dates",
},
},
},
themePlugins: {
seo: {
autoDescription: false,
isArticle: () => false,
},
linksCheck: {
build: "error",
},
mediumZoom: false,
sitemap: {
changefreq: "monthly",
},
},
}),
plugins: [
redirectPlugin({
config: {
"/rus/": "/",
"/rus/works.html": "/works.html",
},
}),
],
bundler: viteBundler(),
});

View file

@ -1,9 +0,0 @@
export type NonEmptyArray<T> = [T, ...T[]];
export function renderDate(date: Date): string {
return date.toLocaleDateString(undefined, {
year: "numeric",
month: "2-digit",
day: "2-digit",
});
}

View file

@ -1,73 +0,0 @@
<script lang="ts">
function date2num(date: Date | undefined): number {
return date?.valueOf() ?? Infinity;
}
export default {
name: "WorksPage",
computed: {
tableTheme() {
return this.$themeLocale.worksTable ?? {};
},
},
};
</script>
<script lang="ts" setup>
import { CHRONOLOGICAL_WORKS } from "../data.ts";
import { renderDate } from "../../../global.ts";
import { work as w } from "../domain";
import { computed } from "vue";
const works = computed(() =>
CHRONOLOGICAL_WORKS.concat().sort(
(a, b) =>
date2num(b.endDate) - date2num(a.endDate) ||
date2num(b.startDate) - date2num(a.startDate),
),
);
</script>
<template>
<table>
<thead>
<tr>
<th>{{ tableTheme.name }}</th>
<th>{{ tableTheme.description }}</th>
<th>{{ tableTheme.role }}</th>
<th>{{ tableTheme.technologies }}</th>
<th>{{ tableTheme.status }}</th>
<th>{{ tableTheme.dates }}</th>
</tr>
</thead>
<tbody>
<tr v-for="work in works">
<td>
<a rel="nofollow noopener" :href="w.getExternalLink(work)">
{{ work.name }}
</a>
</td>
<td>{{ work.description }}</td>
<td v-html="work.roles.join(', ')"></td>
<td>{{ work.technologies.join(", ") }}</td>
<td>{{ work.status }}</td>
<td>
<div>
<small :class="{ grey: work.endDate }">
{{ renderDate(work.startDate) }}
</small>
</div>
<div v-if="work.endDate">
<small>{{ renderDate(work.endDate) }}</small>
</div>
</td>
</tr>
</tbody>
</table>
</template>
<style lang="css">
.grey {
color: rgba(0, 0, 0, 0.4);
}
</style>

View file

@ -1 +0,0 @@
export { default as ChronologicalWorksTable } from "./ChronologicalWorksTable.vue";

View file

@ -1,375 +0,0 @@
import { Role } from "./domain/Role.ts";
import { Status } from "./domain/Status.ts";
import { Technology } from "./domain/Technology.ts";
import type { Work } from "./domain/Work.ts";
export const CHRONOLOGICAL_WORKS: Work[] = [
{
name: "nixeovim",
url: "/pleshevskiy/nixeovim",
description: "Configure and build neovim editor using nix",
roles: [Role.Author],
technologies: [Technology.Nix],
startDate: new Date("2024-04-24"),
status: Status.ActiveDeveloped,
},
{
name: "picsg",
url: "/pleshevskiy/picsg",
description:
"A tool for steganographing information in a picture encoded using the Vernam cipher.",
roles: [Role.Author],
technologies: [Technology.Haskell],
startDate: new Date("2024-04-13"),
endDate: new Date("2024-07-25"),
status: Status.AsIs,
},
{
name: "Mindustry tools",
url: "/pleshevskiy/mindustry-tools",
description: "Tools for the Mindustry game",
roles: [Role.Author],
technologies: [Technology.Nix, Technology.Godot],
startDate: new Date("2024-01-07"),
status: Status.PassivelyMaintained,
},
{
name: "Master Progress Rosmintrud tools",
url: "https://rosmintrud.masterprogress.ru",
description:
"Internal service to prepare documents for the rosmintrud (SPA)",
roles: [Role.TechLead],
technologies: [
Technology.Deno,
Technology.Sqlite,
Technology.TypeScript,
Technology.Vue,
Technology.Docker,
Technology.Woodpecker,
Technology.Nix,
],
startDate: new Date("2023-07-03"),
status: Status.PassivelyMaintained,
},
{
name: "yandexgpt_tg_bot",
url: "/pleshevskiy/yandexgpt_tg_bot",
description: "The Telegram bot to describe article with link by YandexGPT.",
roles: [Role.Author],
technologies: [Technology.JavaScript, Technology.NodeJS, Technology.Nix],
startDate: new Date("2023-06-27"),
endDate: new Date("2024-07-25"),
status: Status.AsIs,
},
{
name: "tree-sitter-plpgsql",
url: "/pleshevskiy/tree-sitter-plpgsql",
description: "plpgsql grammar for tree-sitter",
roles: [Role.Author],
technologies: [
Technology.C,
Technology.JavaScript,
Technology.TreeSitter,
Technology.Nix,
],
startDate: new Date("2023-01-05"),
status: Status.PassivelyMaintained,
},
{
name: "wd2",
url: "/pleshevskiy/wd2",
description:
"A wrapper over d2 which allows to use additional configs from d2 file",
roles: [Role.Author],
technologies: [Technology.Bash, Technology.Nix],
startDate: new Date("2022-12-12"),
endDate: new Date("2023-07-31"),
status: Status.AsIs,
},
{
name: "tree-sitter-d2",
url: "/pleshevskiy/tree-sitter-d2",
description: "d2 grammar for tree-sitter",
roles: [Role.Author],
technologies: [
Technology.C,
Technology.JavaScript,
Technology.TreeSitter,
Technology.Nix,
],
startDate: new Date("2022-12-04"),
status: Status.ActiveDeveloped,
},
{
name: "nix2lua",
url: "/mynix/nix2lua",
description:
"This is a small but functional library that converts your nix configurations into lua format.",
roles: [Role.Author],
technologies: [Technology.Nix, Technology.Lua],
startDate: new Date("2022-11-22"),
status: Status.PassivelyMaintained,
},
{
name: "vnetod",
url: "/pleshevskiy/vnetod",
description: "Dotenv section switcher",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2022-07-29"),
status: Status.PassivelyMaintained,
},
{
name: "estring",
url: "/pleshevskiy/estring",
description: "A simple way to parse a string using type annotations.",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2022-07-23"),
endDate: new Date("2024-07-25"),
status: Status.AsIs,
},
{
name: "enve",
url: "/pleshevskiy/enve",
description:
"It helps you work with environment variables and convert it to any type using only type annotations",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2022-07-18"),
endDate: new Date("2024-07-25"),
status: Status.AsIs,
},
{
name: "docker stack drone plugin",
url: "/pleshevskiy/docker_stack",
description: "Deploy to production using `docker stack deploy`",
roles: [Role.Author],
technologies: [Technology.Docker, Technology.Drone, Technology.Woodpecker],
startDate: new Date("2022-06-06"),
endDate: new Date("2024-07-25"),
status: Status.AsIs,
},
{
name: "dexios",
url: "/github/dexios",
description:
"Dexios is a fast, secure, and open source command-line encryption tool.",
roles: [Role.Collaborator],
technologies: [Technology.Rust],
startDate: new Date("2022-06-01"),
endDate: new Date("2023-02-28"),
},
{
name: "recipes",
url: "/pleshevskiy/recipes",
description: "Site with recipes which cares about privacy",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.Deno, Technology.Rust],
startDate: new Date("2022-05-04"),
status: Status.PassivelyMaintained,
},
{
name: "pleshevski.ru",
url: "/pleshevskiy/pleshevski.ru",
description: "Source code of my personal site",
roles: [Role.Author],
technologies: [
Technology.TypeScript,
Technology.Vue,
Technology.Vuepress,
Technology.Nix,
],
startDate: new Date("2022-03-16"),
status: Status.PassivelyMaintained,
},
{
name: "paren",
url: "/pleshevskiy/paren",
description: "Library for parsing and rendering information.",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.Deno],
startDate: new Date("2022-03-14"),
endDate: new Date("2024-07-25"),
status: Status.Experimental,
},
{
name: "hwt",
url: "/pleshevskiy/hwt",
description:
"healthy workaholic timer A tool that keeps you from breaking your health by working all day.",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2022-02-04"),
endDate: new Date("2024-07-25"),
status: Status.AsIs,
},
{
name: "ood_persistence",
url: "/pleshevskiy/ood_persistence",
description:
"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2021-10-12"),
endDate: new Date("2021-10-21"),
status: Status.Deprecated,
},
{
name: "migra",
url: "/pleshevskiy/migra",
description: "Simple SQL migration manager for your project.",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2021-01-31"),
endDate: new Date("2022-03-17"),
status: Status.AsIs,
},
{
name: "espruino-starter",
url: "/pleshevskiy/espruino-starter",
description:
"Quickly start creating your new project on the espruino board or a board based on it.",
roles: [Role.Author],
technologies: [Technology.JavaScript],
startDate: new Date("2021-08-23"),
status: Status.AsIs,
},
{
name: "react-rest-request",
url: "/pleshevskiy/react-rest-request",
description: "Minimalistic REST API client for React inspired by Apollo.",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.React],
startDate: new Date("2020-10-04"),
endDate: new Date("2023-03-02"),
status: Status.Deprecated,
},
{
name: "sonic-channel",
url: "/pleshevskiy/sonic-channel",
description: "Rust client for sonic search backend.",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2020-07-18"),
status: Status.PassivelyMaintained,
},
{
name: "itconfig",
url: "/pleshevskiy/itconfig",
description:
"Easy build a configs from environment variables and use it in globally.",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: new Date("2019-12-22"),
endDate: new Date("2022-07-24"),
status: Status.Deprecated,
},
{
name: "it-fsm",
url: "/pleshevskiy/it-fsm",
description: "Simple full-featured finite state machine for your project",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.NodeJS, Technology.Deno],
startDate: new Date("2019-10-11"),
status: Status.PassivelyMaintained,
},
{
name: "Cabinet Master Progress",
url: "https://cabinet.masterprogress.ru",
description:
"Student's cabinet of the educational center Master Progress (SSR + SPA)",
roles: [Role.TechLead],
technologies: [
Technology.Python,
Technology.Flask,
Technology.Postgresql,
Technology.TypeScript,
Technology.React,
Technology.Docker,
Technology.Woodpecker,
Technology.Nix,
],
startDate: new Date("2019-09-22"),
status: Status.PassivelyMaintained,
},
{
name: "genrss",
url: "/pleshevskiy/genrss",
description: "RSS generator for python",
roles: [Role.Author],
technologies: [Technology.Python],
startDate: new Date("2019-07-23"),
status: Status.AsIs,
},
{
name: "marshmallow_pageinfo",
url: "/pleshevskiy/marshmallow_pageinfo",
description: "Page info marshmallow schema for api",
roles: [Role.Author],
technologies: [Technology.Python],
startDate: new Date("2019-10-05"),
endDate: new Date("2023-03-02"),
status: Status.AsIs,
},
{
name: "Binary Management",
url: "https://www.binarymanagement.com",
description: "Project management tool for interior designers",
roles: [Role.Developer, Role.TechLead, Role.TeamLead],
technologies: [
Technology.TypeScript,
Technology.NodeJS,
Technology.React,
Technology.Antd,
Technology.Docker,
Technology.Drone,
Technology.Rust,
Technology.Nix,
],
startDate: new Date("2018-09-15"),
status: Status.ActiveDeveloped,
},
{
name: "Core Spirit",
url: "https://corespirit.com",
description: "Social platform focusing on human and planetary enhancement",
roles: [Role.Developer],
technologies: [
Technology.TypeScript,
Technology.NodeJS,
Technology.Go,
Technology.Python,
Technology.React,
Technology.Docker,
Technology.Drone,
],
startDate: new Date("2018-09-05"),
endDate: new Date("2019-12-31"),
},
{
name: "Master Progress",
url: "https://masterprogress.ru",
description:
"Main website of the educational center Master Progress (SSR + Forms)",
roles: [Role.TechLead],
technologies: [
Technology.Python,
Technology.Flask,
Technology.JavaScript,
Technology.Nix,
],
startDate: new Date("2018-04-10"),
status: Status.PassivelyMaintained,
},
{
name: "ictmpl",
url: "/pleshevskiy/ictmpl",
description: "Generate projects from templates",
roles: [Role.Author],
technologies: [Technology.Python],
startDate: new Date("2018-06-30"),
endDate: new Date("2023-03-02"),
status: Status.AsIs,
},
];

View file

@ -1,7 +0,0 @@
export enum Role {
Collaborator = "collaborator",
Author = "author",
TechLead = "tech&nbsp;lead",
TeamLead = "team&nbsp;lead",
Developer = "developer",
}

View file

@ -1,25 +0,0 @@
export enum Status {
// New features are being added and bugs are being fixed.
ActiveDeveloped = "actively-developed",
// There are no plans for new features, but the maintainer intends to respond
// to issues that get filed.
PassivelyMaintained = "passively-maintained",
// The package is feature complete, the maintainer does not intend to continue
// working on it or providing support, but it works for the purposes it was
// designed for.
AsIs = "as-is",
// The author wants to share it with the community but is not intending to
// meet anyone's particular use case.
Experimental = "experimental",
// The current maintainer would like to transfer the package to someone else.
LookingForMaintainer = "looking-for-maintainer",
// The maintainer does not recommend using this package (the description of the
// package can describe why, there could be a better solution available or
// there could be problems with the package that the author does not want to fix).
Deprecated = "deprecated",
}

View file

@ -1,27 +0,0 @@
export enum Technology {
C = "C",
Go = "Go",
JavaScript = "JS",
TypeScript = "TS",
Rust = "Rust",
Python = "Python",
Php = "PHP",
Deno = "Deno",
NodeJS = "NodeJS",
Flask = "Flask",
React = "React",
Antd = "Antd",
Postgresql = "PostgreSQL",
Docker = "Docker",
Drone = "Drone CI",
Woodpecker = "Woodpecker CI",
Bash = "Bash",
TreeSitter = "TreeSitter",
Nix = "Nix",
Lua = "Lua",
Sqlite = "Sqlite",
Vue = "Vue",
Vuepress = "Vuepress",
Godot = "Godot",
Haskell = "Haskell",
}

View file

@ -1,20 +0,0 @@
import type { NonEmptyArray } from "../../../global.ts";
import { Role } from "./Role.ts";
import { Status } from "./Status.ts";
import { Technology } from "./Technology.ts";
export interface Work {
name: string;
url: string;
description: string;
roles: NonEmptyArray<Role>;
technologies: NonEmptyArray<Technology>;
startDate: Date;
endDate?: Date;
status?: Status;
}
export const getExternalLink: (work: Pick<Work, "url">) => string = (work) =>
work.url.startsWith("https://")
? work.url
: new URL(work.url, "https://git.pleshevski.ru").toString();

View file

@ -1,5 +0,0 @@
export { Role } from "./Role.ts";
export { Status } from "./Status.ts";
export { Technology } from "./Technology.ts";
export type { Work } from "./Work.ts";
export * as work from "./Work.ts";

View file

@ -1 +0,0 @@
export * from "./ChronologicalWorksTable";

View file

@ -1,42 +0,0 @@
<script setup>
// See: https://github.com/vuejs/vuepress/blob/master/packages/%40vuepress/theme-default/layouts/Layout.vue
import ParentLayout from '@vuepress/theme-default/layouts/Layout.vue'
import { ChronologicalWorksTable } from "../modules/work";
</script>
<template>
<ParentLayout>
<template #page-bottom>
<div class="works-table-wrapper">
<ChronologicalWorksTable />
</div>
</template>
</ParentLayout>
</template>
<style lang="css" scoped>
.works-table-wrapper {
margin: 0 auto;
padding: 0 2rem;
max-width: 1224px;
box-sizing: border-box
}
.works-table-wrapper :deep(table) {
width: 100%;
}
</style>
<style lang="css">
:root {
--content-width: 960px;
}
.vp-page .theme-default-content {
padding-bottom: 0 !important;
}
.vp-page-meta {
display: none;
}
</style>

View file

@ -1,10 +0,0 @@
import { DefaultThemeOptions, defaultTheme } from "@vuepress/theme-default";
export const mkMyTheme = (options: DefaultThemeOptions) => {
// returns a theme object
return {
name: "my-theme",
extends: defaultTheme(options),
};
};

View file

@ -1,112 +0,0 @@
---
home: true
title: Resume
heroText: null
---
Always up-to-date link to [resume](/eng/).
## Overview
My name is Dmitriy Pleshevskiy.
I'm an open source software enthusiast, a lead software developer, architect,
team leader and also mentor.
## Skills
#### Programming Languages:
- TypeScript (prefer, solid 9-year exp)
- SQL (prefer, solid 8-year exp)
- Rust (prefer, solid 5-year exp)
- Python (solid 9-year exp)
- Haskell
- Bash (8-year exp)
- Java
- C#
- C++
#### Repositories:
- PostgreSQL (prefer, solid 8-year exp)
- MySQL
- Sqlite
- MsSQL
- MongoDB
- Reddis
- Minio (prefer, solid 5-year exp)
---
I also have extensive experience in creating the following applications:
- Traditional (SSR + Forms)
- API (REST/GraphQL/WebSocket/EventSource)
- Dynamic (SPA)
- Hybrid (SSR + SPA)
- Console
- Cross-platform
## Stack
#### Backend (Rust)
- `axum` (prefer, solid 2-year exp)
- `async-graphql` (prefer, solid 2-year exp)
- `shaku` (prefer, solid 2-year exp)
- `bb8` + `postgres-types` (prefer, solid 5-year exp)
- `diesel` (2-year exp)
#### Backend (Node.JS)
- `Apollo` (solid 5-year exp)
- `Express` (solid 9-year exp)
- `Nest.JS`
- `Knex.js` / `Objection.js` (solid 5-year exp)
- `Sequelize`
#### Frontend
- `React` (solid 8-year exp)
- `VueJS` (prefer, solid 3-year exp)
- `Cypress` (prefer, solid 3-year exp)
- `JQuery`
- `Antd` / `Antdv`
- `PostCSS` (prefer, solid 5-year exp)
- `Sass` (prefer, solid 8-year exp)
- `Less` (weak 4-year exp)
#### DevOps
- `NixOS` / `NixOps` / `Nix dev shell` (prefer, solid 3-year exp)
- `Docker Swarm` (solid 6-year exp)
- `Kubernetes` (weak 5-year exp)
- `Woodpecker CI` (prefer, solid 4-year exp)
- `Drone CI` (solid 3-year exp)
- `Gitlab CI` (solid 7-year exp)
- `GitHub Actions` (4-year exp)
## Interests
Open-source projects are my passion! I develop, maintain and improve projects in
my spare time.
Besides programming, I love to cook and spend time with my beloved family!
## Contacts
Simplex (Prefer): [Dmitriy
Pleshevskiy](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion)
Telegram: [Dmitriy Pleshevskiy](https://telegram.me/da_pranaya)
Matrix: `@pleshevskiy:matrix.org`
Email: `dmitriy[at]pleshevski[dot]ru`
## Links
- [Forgejo](https://git.pleshevski.ru/)
- [Github (Suspended)](https://github.com/pleshevskiy)

View file

@ -1,121 +0,0 @@
---
title: Works
layout: WorksPage
sidebar: false
---
## Highlighted working experience
### Binary Management
- Dates: August 2018 currently
- Roles: Lead Fullstack Developer, Team Lead, Architect
Development of a Project Management Tool for Interior Designers
##### Backend GraphQL API
Stack: `Node.JS`, `Apollo`, `PostgreSQL`, `Redis`, `BullMQ`
- Migrated database triggers into business logic. Code became easier to read and
maintain, and the system became more reliable.
- Introduced unit testing and integration testing practices. I wrote over 70% of
all tests myself.
- Added GraphQL subscriptions for dynamic updates.
##### Frontend
Stack: `React`, `Apollo`, `Antd`
- Formed a UIKit and general components, optimized complex and loaded
components.
- Changed API work on the frontend.
- Introduced integration testing practice using Cypress.
- Migrated the entire project to TypeScript. Created isolated system modules.
##### Leadership of the Team
- Introduced TDD (Test-Driven Development) practices.
- Brought the "Critical Chain Method", the "Buffer Method", and the "Backward
Planning" method into the project. Helped the team get in sync,
releasing small batches every week.
- Created individual development plans for team members.
##### Architecture
- Broke down the entire codebase into modules by feature.
- Optimized `PostgreSQL` database, splitting company data into separate schemas
and applying partitioning tables.
- Added query caching with Redis.
- Reduced infrastructure costs by 5 times, migrating the project from Kubernetes
to NixOS.
---
### Core Spirit (Back Office)
- Даты: Август 2024 - currently
- Роль: Lead Fullstack Developer
Development of the Back Office for Core Spirit social platform.
- Integrated `Dependabot`, which helped update all outdated
dependencies. Replaced webpack with `vite`.
---
### Master Progress
- Dates: May 2018 - currently (Passively maintained)
- Role: Tech Lead
Development web infrastructure of the educational center Master Progress
- [The main site](https://masterprogress.ru) (`Python`, `Flask`).
- [Student's cabinet](https://cabinet.masterprogress.ru) (`Python`,
`Flask`, `TypeScript`, `React`, `PostgreSQL`).
- [A tool for rosmintrud](https://rosmintrud.masterprogress.ru)
(`Deno`, `Vue`, `Typescript`)
- A complete infrastructure was created on `NixOS`. Before that, I had created
an infrastructure using `Drone CI` / `Woodpecker CI` and `Docker
swarm`, which has been running for over 5 years.
---
### Core Spirit
- Dates: August 2018 - May 2020, August 2024 - currently
- Role: Lead Fullstack Developer
Development of Social platform focusing on human and planetary enhancement.
- A REST API (using `Node.JS`, `Express`, and `PostgreSQL`) for the main website
and back office. I also got to work with a new version of the REST
API using `Go` and `PostgreSQL`.
- Auto poster to various social networks and messengers
(Facebook, LinkedIn, Twitter, Telegram).
- Neural network for automatic categorization of articles.
---
#### MERLION
- Dates: March 2016 May 2018
- Role: Senior Fullstack developer
In this company there were 6 considerable projects I have successfully
completed:
- optimize the creation of promotional pages (PHP, JavaScript)
- support main traditional site <https://citilink.ru> (PHP, JavaScript)
- development of parsing to monitor products for changes in price,
quantity/availability in stock, rating and other fields based on data from 55
websites (Node.JS, Express)
- work with neural networks for matching of goods
- development face recognition apps for Android (Java)
---
## Chronology
Public projects only.

View file

@ -1,113 +0,0 @@
---
home: true
title: Резюме
heroText: null
---
Всегда актуальная ссылка на [резюме](/).
## Общие сведения
Меня зовут Дмитрий Плешевский.
Я энтузиаст программного обеспечения с открытым исходным кодом, ведущий
разработчик програмного обеспечения, архитектор, руководитель команды, а так же
ментор.
## Умения
#### Языки программирования:
- TypeScript (предпочитаю, твёрдый 9-летний опыт)
- SQL (предпочитаю, твёрдый 8-летний опыт)
- Rust (предпочитаю, 5-летний опыт)
- Python (твёрдый 9-летний опыт)
- Haskell
- Bash (8-летний опыт)
- Java
- C#
- C++
#### Хранилища данных:
- PostgreSQL (предпочитаю, твёрдый 8-летний опыт)
- MySQL
- Sqlite
- MsSQL
- MongoDB
- Reddis
- Minio (предпочитаю, твердый 5-летний опыт)
---
Я так же имею большой опыт в создании следующих типов приложений:
- Традиционные (SSR + Forms)
- API (REST/GraphQL/WebSocket/EventSource)
- Динамическое (SPA)
- Гибридное (SSR + SPA)
- Консольные
- Кроссплатформенные
## Stack
#### Backend (Rust)
- `axum` (предпочитаю, твёрдый 2-летний опыт)
- `async-graphql` (предпочитаю, твёрдый 2-летний опыт)
- `shaku` (предпочитаю, твёрдый 2-летний опыт)
- `bb8` + `postgres-types` (предпочитаю, твёрдый 5-летний опыт)
- `diesel` (2-летний опыт)
#### Backend (Node.JS)
- `Apollo` (твёрдый 5-летний опыт)
- `Express` (твёрдый 9-летний опыт)
- `Nest.JS`
- `Knex.js` / `Objection.js` (твёрдый 5-летний опыт)
- `Sequelize`
#### Frontend
- `React` (твёрдый 8-летний опыт)
- `VueJS` (предпочитаю, твёрдый 4-летний опыт)
- `Cypress` (предпочитаю, твёрдый 3-летний опыт)
- `JQuery`
- `Antd` / `Antdv`
- `PostCSS` (предпочитаю, твёрдый 5-летний опыт)
- `Sass` (предпочитаю, твёрдый 8-летний опыт)
- `Less` (слабый 4-летний опыт)
#### DevOps
- `NixOS` / `NixOps` / `Nix dev shell` (предпочитаю, твёрдый 3-летний опыт)
- `Docker Swarm` (твёрдый 6-летний опыт)
- `Kubernetes` (слабый 5-летний опыт)
- `Woodpecker CI` (твёрдый 4-летний опыт)
- `Drone CI` (твёрдый 3-летний опыт)
- `Gitlab CI` (твёрдый 7-летний опыт)
- `GitHub Actions` (4-летний опыт)
## Интересы
Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в
своё свободное время.
Помимо программирования я люблю готовить и проводить время со своей любимой
семьей!
## Контакты
Simplex (Предпочтительно): [Dmitriy
Pleshevskiy](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion)
Telegram: [Dmitriy Pleshevskiy](https://telegram.me/da_pranaya)
Matrix: `@pleshevskiy:matrix.org`
Email: `dmitriy[at]pleshevski[dot]ru`
## Ссылки
- [Forgejo](https://git.pleshevski.ru/)
- [Github (Приостановлен)](https://github.com/pleshevskiy)

View file

@ -1,122 +0,0 @@
---
title: Работы
layout: WorksPage
sidebar: false
---
## Выделенный опыт работы
### Binary Management
- Даты: Август 2018 по настоящее время
- Роли: Lead Fullstack Developer, Team Lead, Architect
Разработка инструмента управления проектами для дизайнеров интерьера.
##### Backend GraphQL API
Стек: `Node.JS`, `Apollo`, `PostgreSQL`, `Redis`, `BullMQ`
- Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить
изменение и система стала надежнее.
- Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал
более 70% всех тестов.
- Добавил GraphQL подписки для динамичного обновления.
##### Frontend
Стек: `React`, `Apollo`, `Antd`
- Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные
компоненты.
- Изменил работу с API на фронтенде.
- Внедрил практику написания интеграционных тестов с помощью cypress.
- Полностью перенес проект на TypeScript. Сформировал изолированные модули
системы.
##### Руководство командой
- Ввёл практику TDD (Test-Driven Development).
- Я привнес в проект "метод критической цепи", "метод буфера" и "метод
планирования с конца". Помог команде войти в ритм, чтобы выпускать релизы каждую
неделю небольшими партиями.
- Составлял индивидуальный план развития для членов команды.
##### Архитектура
- Разбил всю кодовую базу на модули по фичам.
- Ускорил базу данных `PostgreSQL`, разбив данные компаний по отдельным схемам и
применив партиципирование таблиц.
- Добавил кеширование запросов с `Redis`.
- Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes
на `NixOS`.
---
### Core Spirit (Back Office)
- Даты: Август 2024 - по настоящее время
- Роль: Lead Fullstack Developer
Разработка бэк-офиса для социальной платформы Core Spirit.
- Интегрировал Dependabot, который помог обновить все устаревшие
зависимости. Заменил webpack на vite.
---
### Master Progress
- Даты: Май 2018 - по настоящее время (Пассивная поддержка)
- Роль: Tech Lead
Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.
- [Главного сайта](https://masterprogress.ru) (`Python`, `Flask`).
- [Кабинета студента](https://cabinet.masterprogress.ru) (`Python`, `Flask`,
`TypeScript`, `React`, `PostgreSQL`).
- [Инструмента для работы с rosmintrud](https://rosmintrud.masterprogress.ru)
(`Deno`, `Vue`, `Typescript`)
- Создана полная инфраструктура на `NixOS`. До этого создал инфраструктуру
используя `Drone CI` / `Woodpecker CI` и `Docker swarm`, которая проработала
более 5 лет.
---
### Core Spirit
- Даты: Август 2018 - May 2020, Август 2024 - по настоящее время
- Роль: Lead Fullstack Developer
Разработка социальной платформы, сфокусированной на улучшении человека и
планеты.
- REST API (`Node.JS`, `Express`, `PostgreSQL`) для основного сайта и
бэк-офиса. Успел поработать с новой версией REST API на `Go`, `PostgreSQL`
- Автопостер в различные социальные сети и мессенджеры (Facebook,
LinkedIn, Twitter, Telegram).
- Создал нейронную сеть для автоматической категоризации статей.
---
### MERLION
- Dates: March 2016 May 2018
- Role: Senior Fullstack developer
В этой компании было 6 значительных проектов, которые я успешно завершил:
- Оптимизация создания рекламных страниц (PHP, JavaScript)
- Поддержка основного традиционного сайта <https://citilink.ru> (PHP,
JavaScript)
- Разработка парсинга для мониторинга товаров на предмет изменения цены,
количества/наличия на складе, рейтинга и других полей на основе данных с 55+
сайтов (Node.js, Express)
- Работа с нейронными сетями для подбора товаров
- Разработка приложений для распознавания лиц для Android (Java)
---
## Хронология
В списке перечислены только публичные проекты.

43
eng/index.html Normal file

File diff suppressed because one or more lines are too long

43
eng/works.html Normal file

File diff suppressed because one or more lines are too long

61
flake.lock generated
View file

@ -1,61 +0,0 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1721562059,
"narHash": "sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "68c9ed8bbed9dfce253cc91560bf9043297ef2fe",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

View file

@ -1,47 +0,0 @@
{
description = "Pleshevski personal site";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
let
out = system:
let
inherit (builtins) substring;
pkgs = import nixpkgs { inherit system; };
version = "0.0.1+${substring 0 8 self.lastModifiedDate}_${self.shortRev or "dirty"}";
in
{
packages.default = with pkgs; stdenv.mkDerivation (finalAttrs: {
pname = "pleshevski_site";
inherit version;
src = ./.;
dontBuild = true;
installPhase = ''
mkdir -p $out
cp -r dist/* $out
'';
});
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
pre-commit
nodejs_22
gnumake
pnpm
nodePackages.typescript-language-server # typescript
nodePackages.vscode-langservers-extracted # html, css, json, eslint
];
};
};
in
flake-utils.lib.eachDefaultSystem out;
}

43
index.html Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,35 +0,0 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "pleshevskiy",
"description": "Dmitriy Pleshevskiy",
"version": "0.0.1",
"type": "module",
"private": true,
"packageManager": "pnpm@9.15.4",
"scripts": {
"build": "vuepress build docs",
"dev": "vuepress dev docs"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.1.4",
"@types/node": "^22.1.0",
"@vitejs/plugin-vue": "^5.0.0",
"@vue/eslint-config-prettier": "^10.0.0",
"@vue/eslint-config-typescript": "^14.0.0",
"@vue/language-server": "^2.0.19",
"@vue/tsconfig": "^0.7.0",
"@vue/typescript-plugin": "^2.0.19",
"@vuepress/bundler-vite": "^2.0.0-rc.7",
"@vuepress/plugin-blog": "^2.0.0-rc.11",
"@vuepress/plugin-redirect": "2.0.0-rc.8",
"@vuepress/theme-default": "^2.0.0-rc.11",
"eslint": "<10.0.0",
"eslint-plugin-vue": "^9.14.1",
"prettier": ">=3.0.0",
"sass": "^1.79.5",
"typescript": "~5.7.0",
"vue": "^3.4.0",
"vue-tsc": "^2.0.0",
"vuepress": "^2.0.0-rc.7"
}
}

4815
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"configMigration": true,
"extends": ["config:recommended"],
"postUpdateOptions": ["pnpmDedupe"]
}

View file

@ -1,13 +0,0 @@
#! /usr/bin/env bash
# Can be used as a pre-commit hook
# Just symlink this file to .git/hooks/pre-commit
set -xe
if [ ! -z "$(git diff --cached --name-only | grep "^docs/")" ]
then
make build
git add dist
fi

View file

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://pleshevski.ru/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/works.html</loc><lastmod>2024-08-07T08:48:54.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url><url><loc>https://pleshevski.ru/eng/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/eng/works.html</loc><lastmod>2024-08-07T08:48:54.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url></urlset>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://pleshevski.ru/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/works.html</loc><lastmod>2024-10-15T14:10:49.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url><url><loc>https://pleshevski.ru/eng/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/eng/works.html</loc><lastmod>2024-08-07T08:48:54.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url></urlset>

View file

@ -1,11 +0,0 @@
{
"compilerOptions": {
"baseUrl": ".",
"composite": true,
"paths": {
"@/*": ["./docs/*"]
}
},
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "docs/**/*", "docs/**/*.vue"]
}

43
works.html Normal file

File diff suppressed because one or more lines are too long