refac: use vuepress
This commit is contained in:
parent
97b65ccfe8
commit
753116020a
99 changed files with 6213 additions and 41 deletions
21
.gitignore
vendored
21
.gitignore
vendored
|
@ -1,6 +1,17 @@
|
||||||
# misc
|
# editors
|
||||||
.DS_Store
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
# direnv
|
# direnv
|
||||||
/.envrc
|
.direnv
|
||||||
/.direnv/
|
.envrc
|
||||||
|
# nodejs
|
||||||
|
node_modules/
|
||||||
|
# nix
|
||||||
|
/result
|
||||||
|
# custom
|
||||||
|
.DS_Store
|
||||||
|
# vuepress
|
||||||
|
/docs/.vuepress/.cache
|
||||||
|
/docs/.vuepress/.temp
|
||||||
|
/docs/.vuepress/dist
|
||||||
|
|
25
Makefile
25
Makefile
|
@ -1,13 +1,16 @@
|
||||||
PAR := $(MAKE) -j 128
|
PREFIX ?= dist
|
||||||
|
|
||||||
watch:
|
|
||||||
${PAR} deno-w sass-w
|
|
||||||
|
|
||||||
deno-w:
|
|
||||||
deno run -A --watch server.ts
|
|
||||||
|
|
||||||
sass-w:
|
|
||||||
sass -w styles/main.scss public/styles/main.css
|
|
||||||
|
|
||||||
help:
|
help:
|
||||||
cat makefile
|
cat Makefile
|
||||||
|
|
||||||
|
build:
|
||||||
|
pnpm run docs:build --dest $(PREFIX)
|
||||||
|
|
||||||
|
install: build
|
||||||
|
|
||||||
|
dev:
|
||||||
|
pnpm run docs:dev
|
||||||
|
|
||||||
|
deps:
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
|
43
dist/404.html
vendored
Normal file
43
dist/404.html
vendored
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="ru-RU">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
<meta name="generator" content="VuePress 2.0.0-rc.14" />
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--c-bg: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
html.dark {
|
||||||
|
--c-bg: #22272e;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
background-color: var(--c-bg);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
const userMode = localStorage.getItem('vuepress-color-scheme')
|
||||||
|
const systemDarkMode =
|
||||||
|
window.matchMedia &&
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||||
|
|
||||||
|
if (userMode === 'light') {
|
||||||
|
document.documentElement.dataset.theme = 'light'
|
||||||
|
} else if (userMode === 'dark' || systemDarkMode) {
|
||||||
|
document.documentElement.classList.toggle('dark', true)
|
||||||
|
document.documentElement.dataset.theme = 'dark'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<meta property="og:url" content="https://pleshevski.ru/404.html"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:description" content="404 Not Found"><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":"","description":"404 Not Found"}</script><title>Дмитрий Плешевский</title><meta name="description" content="404 Not Found">
|
||||||
|
<link rel="preload" href="/assets/style-BnNdFOI8.css" as="style"><link rel="stylesheet" href="/assets/style-BnNdFOI8.css">
|
||||||
|
<link rel="modulepreload" href="/assets/app-Dw1tezwH.js"><link rel="modulepreload" href="/assets/404.html-C-XD0uTd.js">
|
||||||
|
<link rel="prefetch" href="/assets/index.html-Bgp5oohT.js" as="script"><link rel="prefetch" href="/assets/works.html-sG2zmfnZ.js" as="script"><link rel="prefetch" href="/assets/index.html-Bmcvetlf.js" as="script"><link rel="prefetch" href="/assets/works.html-DIDCwbnz.js" as="script">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"><!--[--><div class="vp-theme-container" data-v-99131a8e><main class="page" data-v-99131a8e><div class="theme-default-content" data-v-99131a8e><h1 data-v-99131a8e>404</h1><blockquote data-v-99131a8e>Мы потеряли страницу...</blockquote><a class="route-link" href="/" data-v-99131a8e>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
|
||||||
|
<script type="module" src="/assets/app-Dw1tezwH.js" defer></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
1
dist/assets/404.html-C-XD0uTd.js
vendored
Normal file
1
dist/assets/404.html-C-XD0uTd.js
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import{_ as t,c as e,o,a as n}from"./app-Dw1tezwH.js";const r={},a=n("p",null,"404 Not Found",-1),c=[a];function s(p,l){return o(),e("div",null,c)}const d=t(r,[["render",s],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","description":"404 Not Found","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:description","content":"404 Not Found"}],["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\\":\\"\\",\\"description\\":\\"404 Not Found\\"}"]]},"headers":[],"git":{},"autoDesc":true,"filePathRelative":null}');export{d as comp,m as data};
|
32
dist/assets/app-Dw1tezwH.js
vendored
Normal file
32
dist/assets/app-Dw1tezwH.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/index.html-Bgp5oohT.js
vendored
Normal file
1
dist/assets/index.html-Bgp5oohT.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/index.html-Bmcvetlf.js
vendored
Normal file
1
dist/assets/index.html-Bmcvetlf.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/style-BnNdFOI8.css
vendored
Normal file
1
dist/assets/style-BnNdFOI8.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/works.html-DIDCwbnz.js
vendored
Normal file
1
dist/assets/works.html-DIDCwbnz.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/works.html-sG2zmfnZ.js
vendored
Normal file
1
dist/assets/works.html-sG2zmfnZ.js
vendored
Normal file
File diff suppressed because one or more lines are too long
43
dist/eng/index.html
vendored
Normal file
43
dist/eng/index.html
vendored
Normal file
File diff suppressed because one or more lines are too long
43
dist/eng/works.html
vendored
Normal file
43
dist/eng/works.html
vendored
Normal file
File diff suppressed because one or more lines are too long
43
dist/index.html
vendored
Normal file
43
dist/index.html
vendored
Normal file
File diff suppressed because one or more lines are too long
5
dist/robots.txt
vendored
Normal file
5
dist/robots.txt
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
User-agent:*
|
||||||
|
Disallow:
|
||||||
|
|
||||||
|
Sitemap: https://pleshevski.ru/sitemap.xml
|
17
dist/rus/index.html
vendored
Normal file
17
dist/rus/index.html
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="robots" content="noindex">
|
||||||
|
<meta http-equiv="refresh" content="0; url=/index.html">
|
||||||
|
<link rel="canonical" href="/index.html">
|
||||||
|
<title>Redirecting...</title>
|
||||||
|
<script>
|
||||||
|
const anchor = window.location.hash.substring(1);
|
||||||
|
location.href = `/index.html${anchor? `#${anchor}`: ""}`;
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Redirecting...</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
17
dist/rus/works.html
vendored
Normal file
17
dist/rus/works.html
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="robots" content="noindex">
|
||||||
|
<meta http-equiv="refresh" content="0; url=/works.html">
|
||||||
|
<link rel="canonical" href="/works.html">
|
||||||
|
<title>Redirecting...</title>
|
||||||
|
<script>
|
||||||
|
const anchor = window.location.hash.substring(1);
|
||||||
|
location.href = `/works.html${anchor? `#${anchor}`: ""}`;
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>Redirecting...</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
3
dist/sitemap.xml
vendored
Normal file
3
dist/sitemap.xml
vendored
Normal file
|
@ -0,0 +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-07-24T14:15:05.000Z</lastmod><changefreq>daily</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-07-24T14:15:05.000Z</lastmod><changefreq>daily</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-07-24T14:15:05.000Z</lastmod><changefreq>daily</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-07-24T14:15:05.000Z</lastmod><changefreq>daily</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>
|
207
dist/sitemap.xsl
vendored
Normal file
207
dist/sitemap.xsl
vendored
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<xsl:stylesheet version="2.0"
|
||||||
|
xmlns:html="http://www.w3.org/TR/REC-html40"
|
||||||
|
xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||||
|
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
|
||||||
|
<xsl:template match="/">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>XML Sitemap</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0;" />
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg-color: #f8f8f8;
|
||||||
|
--bg-color-secondary: #fff;
|
||||||
|
--text-color: #2c3e50;
|
||||||
|
--border-color: #eaecef;
|
||||||
|
--brand-color: #3eaf7c;
|
||||||
|
|
||||||
|
color-scheme: light dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--bg-color: #0d1117;
|
||||||
|
--bg-color-secondary: #161b22;
|
||||||
|
--text-color: #ccc;
|
||||||
|
--border-color: #30363d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: var(--bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
min-height: 100vh;
|
||||||
|
color: var(--text-color);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
max-width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 419px) {
|
||||||
|
h1 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--text-color);
|
||||||
|
font-weight: 500;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 8px;
|
||||||
|
border-collapse: collapse;
|
||||||
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 419px) {
|
||||||
|
table {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
min-width: 56px;
|
||||||
|
padding: 0.6em 1em;
|
||||||
|
|
||||||
|
background-color: var(--brand-color);
|
||||||
|
color: var(--bg-color);
|
||||||
|
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 719px) {
|
||||||
|
th {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
th:first-child {
|
||||||
|
text-align: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:nth-child(odd) {
|
||||||
|
background: var(--bg-color-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:hover {
|
||||||
|
background-color: #e8e8e8;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
tr:hover {
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 0.6em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 719px) {
|
||||||
|
td {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
td:first-child {
|
||||||
|
text-align: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 4px;
|
||||||
|
|
||||||
|
color: #888;
|
||||||
|
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="content">
|
||||||
|
<h1>Sitemap</h1>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<xsl:value-of select="concat('URL (', count(sitemap:urlset/sitemap:url), ')')" />
|
||||||
|
</th>
|
||||||
|
<th>Priority</th>
|
||||||
|
<th>Change Frequency</th>
|
||||||
|
<th>Last Updated Time</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'" />
|
||||||
|
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
|
||||||
|
<xsl:for-each select="sitemap:urlset/sitemap:url">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<xsl:variable name="itemURL">
|
||||||
|
<xsl:value-of select="sitemap:loc" />
|
||||||
|
</xsl:variable>
|
||||||
|
<a href="{$itemURL}" target="_blank">
|
||||||
|
<xsl:value-of select="sitemap:loc" />
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:choose>
|
||||||
|
<xsl:when test="sitemap:priority">
|
||||||
|
<xsl:value-of select="concat(sitemap:priority*100,'%a')" />
|
||||||
|
</xsl:when>
|
||||||
|
<xsl:otherwise>
|
||||||
|
<xsl:text>0.5</xsl:text>
|
||||||
|
</xsl:otherwise>
|
||||||
|
</xsl:choose>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:choose>
|
||||||
|
<xsl:when test="sitemap:changefreq">
|
||||||
|
<xsl:value-of select="concat(translate(substring(sitemap:changefreq, 1, 1),concat($lower, $upper),concat($upper, $lower)),substring(sitemap:changefreq, 2))" />
|
||||||
|
</xsl:when>
|
||||||
|
<xsl:otherwise>
|
||||||
|
<xsl:text>-</xsl:text>
|
||||||
|
</xsl:otherwise>
|
||||||
|
</xsl:choose>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</xsl:for-each>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
Generatd by <a href="https://ecosystem.vuejs.press/plugins/sitemap/">@vuepress/plugin-sitemap</a>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</xsl:template>
|
||||||
|
</xsl:stylesheet>
|
43
dist/works.html
vendored
Normal file
43
dist/works.html
vendored
Normal file
File diff suppressed because one or more lines are too long
6
docs/.vuepress/client.ts
Normal file
6
docs/.vuepress/client.ts
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
import { defineClientConfig } from "vuepress/client";
|
||||||
|
import WorksPage from "./pages/WorksPage.vue";
|
||||||
|
|
||||||
|
export default defineClientConfig({
|
||||||
|
layouts: { WorksPage },
|
||||||
|
});
|
84
docs/.vuepress/config.ts
Normal file
84
docs/.vuepress/config.ts
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
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: "Технологии",
|
||||||
|
start: "Начало",
|
||||||
|
statusOrEnd: "Статус/Окончание",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"/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",
|
||||||
|
start: "Start",
|
||||||
|
statusOrEnd: "Status/End",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
redirectPlugin({
|
||||||
|
config: {
|
||||||
|
"/rus/": "/",
|
||||||
|
"/rus/works.html": "/works.html",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
|
||||||
|
bundler: viteBundler(),
|
||||||
|
});
|
9
docs/.vuepress/global.ts
Normal file
9
docs/.vuepress/global.ts
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
export type NonEmptyArray<T> = [T, ...T[]];
|
||||||
|
|
||||||
|
export function renderDate(date: Date): string {
|
||||||
|
return date.toLocaleDateString(undefined, {
|
||||||
|
year: "numeric",
|
||||||
|
month: "2-digit",
|
||||||
|
day: "2-digit",
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
<script lang="ts">
|
||||||
|
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'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{{ tableTheme.name }}</th>
|
||||||
|
<th>{{ tableTheme.description }}</th>
|
||||||
|
<th>{{ tableTheme.role }}</th>
|
||||||
|
<th>{{ tableTheme.technologies }}</th>
|
||||||
|
<th>{{ tableTheme.start }}</th>
|
||||||
|
<th>{{ tableTheme.statusOrEnd }}</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="work in CHRONOLOGICAL_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>{{ renderDate(work.startDate) }}</td>
|
||||||
|
<td>{{ work.endDate ? renderDate(work.endDate) : work.status }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</template>
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
export { default as ChronologicalWorksTable } from "./ChronologicalWorksTable.vue";
|
361
docs/.vuepress/modules/work/data.ts
Normal file
361
docs/.vuepress/modules/work/data.ts
Normal file
|
@ -0,0 +1,361 @@
|
||||||
|
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: "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"),
|
||||||
|
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"),
|
||||||
|
status: Status.PassivelyMaintained,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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"),
|
||||||
|
status: Status.PassivelyMaintained,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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"),
|
||||||
|
status: Status.PassivelyMaintained,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "docker stack drone plugin",
|
||||||
|
url: "/drone_plugins/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"),
|
||||||
|
status: Status.PassivelyMaintained,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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.Deno,
|
||||||
|
Technology.Docker,
|
||||||
|
Technology.Woodpecker,
|
||||||
|
],
|
||||||
|
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"),
|
||||||
|
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"),
|
||||||
|
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"),
|
||||||
|
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"),
|
||||||
|
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"),
|
||||||
|
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"),
|
||||||
|
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"),
|
||||||
|
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"),
|
||||||
|
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.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.Docker,
|
||||||
|
Technology.Woodpecker,
|
||||||
|
],
|
||||||
|
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"),
|
||||||
|
status: Status.AsIs,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "jjcrypto",
|
||||||
|
url: "/pleshevskiy/jjcrypto",
|
||||||
|
description: "Javascript encoder and decoder",
|
||||||
|
roles: [Role.Author],
|
||||||
|
technologies: [Technology.Php],
|
||||||
|
startDate: new Date("2015-11-01"),
|
||||||
|
status: Status.AsIs,
|
||||||
|
},
|
||||||
|
];
|
20
docs/.vuepress/modules/work/domain/Work.ts
Normal file
20
docs/.vuepress/modules/work/domain/Work.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
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();
|
1
docs/.vuepress/modules/work/index.ts
Normal file
1
docs/.vuepress/modules/work/index.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export * from "./ChronologicalWorksTable";
|
42
docs/.vuepress/pages/WorksPage.vue
Normal file
42
docs/.vuepress/pages/WorksPage.vue
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<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>
|
10
docs/.vuepress/theme.ts
Normal file
10
docs/.vuepress/theme.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
import { defaultTheme } from '@vuepress/theme-default'
|
||||||
|
|
||||||
|
export const mkMyTheme = (options) => {
|
||||||
|
// returns a theme object
|
||||||
|
return {
|
||||||
|
name: 'my-theme',
|
||||||
|
|
||||||
|
extends: defaultTheme(options),
|
||||||
|
}
|
||||||
|
}
|
109
docs/eng/index.md
Normal file
109
docs/eng/index.md
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
---
|
||||||
|
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
|
||||||
|
- Java
|
||||||
|
- C#
|
||||||
|
- C++
|
||||||
|
|
||||||
|
Databases:
|
||||||
|
|
||||||
|
- PostgreSQL (prefer, solid 7-year exp)
|
||||||
|
- MySQL
|
||||||
|
- Sqlite
|
||||||
|
- MsSQL
|
||||||
|
- MongoDB
|
||||||
|
- Reddis
|
||||||
|
|
||||||
|
I also have extensive experience in creating the following applications:
|
||||||
|
|
||||||
|
- Traditional (SSR + Forms)
|
||||||
|
- API (REST/GraphQL/WebSocket/EventSource)
|
||||||
|
- Dynamic (SPA)
|
||||||
|
- Hybrid (SSR + SPA)
|
||||||
|
- Console
|
||||||
|
- Crossplatform
|
||||||
|
|
||||||
|
### 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 2-year exp)
|
||||||
|
- Docker Swarm (prefer, solid 5-year exp)
|
||||||
|
- Kubernetes (weak 4-year exp)
|
||||||
|
- Woodpecker CI (prefer, solid 3-year exp)
|
||||||
|
- Drone CI (solid 3-year exp)
|
||||||
|
- Gitlab CI (solid 7-year exp)
|
||||||
|
- GitHub Actions (3-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:
|
||||||
|
[Dmitriy Pleshevskiy](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FSkIkI6EPd2D63F4xFKfHk7I1UGZVNn6k1QWZ5rcyr6w%3D%40smp9.simplex.im%2FLfKyG0YgW5eRO-z8vrEyvnNfV2EKDfBv%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAMRpR3YB10GVzc-asfqY2oIFkipx5RQm4DZRabzjfPHo%253D%26srv%3Djssqzccmrcws6bhmn77vgmhfjmhwlyr3u7puw4erkyoosywgl67slqqd.onion)
|
||||||
|
|
||||||
|
Telegram: [Dmitriy Pleshevskiy](https://telegram.me/da_pranaya)
|
||||||
|
|
||||||
|
Matrix: @pleshevskiy:matrix.org
|
||||||
|
|
||||||
|
Email: dmitriy[at]pleshevski[dot]ru
|
||||||
|
|
||||||
|
### Links
|
||||||
|
|
||||||
|
[My Git Repo](https://git.pleshevski.ru/)
|
||||||
|
|
||||||
|
[My Github (Suspended due to sanctions)](https://github.com/pleshevskiy)
|
71
docs/eng/works.md
Normal file
71
docs/eng/works.md
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
|
- Development of the GraphQL API (Node.JS, Apollo, PostgreSQL, Redis, BullMQ).
|
||||||
|
Moved database triggers to business logic. Wrote integration tests on 70% api.
|
||||||
|
- Development of the frontend (React, Antd). Formed uikit, shared components,
|
||||||
|
redesigned the page generation gathering. Completely changed work with API on
|
||||||
|
the frontend. Introduced the practice of writing integration tests using
|
||||||
|
cypress
|
||||||
|
- Completely ported the project to TypeScript. I have formed isolated modules of
|
||||||
|
the system.
|
||||||
|
- As a team leader, I brought the critical chain method, the buffer method, and
|
||||||
|
the planning method to the project from the end. Helped the team get into a
|
||||||
|
rhythm to make releases each week in small batches. A couple of times I also
|
||||||
|
prepared an individual development plan for team members.
|
||||||
|
|
||||||
|
#### 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).
|
||||||
|
- [A tool for rosmintrud](https://rosmintrud.masterprogress.ru)
|
||||||
|
(Deno, Vue, Typescript)
|
||||||
|
- Created a complete infrastructure on Woodpecker CI and Docker swarm.
|
||||||
|
|
||||||
|
#### Core Spirit
|
||||||
|
|
||||||
|
- Dates: August 2018 - May 2020
|
||||||
|
- Role: Lead Fullstack Developer
|
||||||
|
|
||||||
|
Development of Social platform focusing on human and planetary enhancement.
|
||||||
|
|
||||||
|
- REST API (Node.JS, Express, PostgreSQL) for main site and
|
||||||
|
backoffice.
|
||||||
|
- 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)
|
||||||
|
|
111
docs/index.md
Normal file
111
docs/index.md
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
---
|
||||||
|
home: true
|
||||||
|
title: Резюме
|
||||||
|
heroText: null
|
||||||
|
---
|
||||||
|
|
||||||
|
Всегда актуальная ссылка на [резюме](/).
|
||||||
|
|
||||||
|
### Общие сведения
|
||||||
|
|
||||||
|
Меня зовут Дмитрий Плешевский.
|
||||||
|
|
||||||
|
Я энтузиаст программного обеспечения с открытым исходным кодом, ведущий
|
||||||
|
разработчик програмного обеспечения, архитектор, руководитель команды, а так же
|
||||||
|
ментор.
|
||||||
|
|
||||||
|
### Умения
|
||||||
|
|
||||||
|
Языки программирования:
|
||||||
|
|
||||||
|
- TypeScript (предпочитаю, твёрдый 9-летний опыт)
|
||||||
|
- SQL (предпочитаю, твёрдый 8-летний опыт)
|
||||||
|
- Rust (предпочитаю, 5-летний опыт)
|
||||||
|
- Python (твёрдый 9-летний опыт)
|
||||||
|
- Haskell
|
||||||
|
- Bash
|
||||||
|
- Java
|
||||||
|
- C#
|
||||||
|
- C++
|
||||||
|
|
||||||
|
Базы данных:
|
||||||
|
|
||||||
|
- PostgreSQL (предпочитаю, твёрдый 7-летний опыт)
|
||||||
|
- MySQL
|
||||||
|
- Sqlite
|
||||||
|
- MsSQL
|
||||||
|
- MongoDB
|
||||||
|
- Reddis
|
||||||
|
|
||||||
|
Я так же имею большой опыт в создании следующих типов приложений:
|
||||||
|
|
||||||
|
- Традиционные (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 (предпочитаю, твёрдый 2-летний опыт)
|
||||||
|
- Docker Swarm (предпочитаю, твёрдый 5-летний опыт)
|
||||||
|
- Kubernetes (слабый 4-летний опыт)
|
||||||
|
- Woodpecker CI (предпочитаю, твёрдый 3-летний опыт)
|
||||||
|
- Drone CI (твёрдый 3-летний опыт)
|
||||||
|
- Gitlab CI (твёрдый 7-летний опыт)
|
||||||
|
- GitHub Actions (3-летний опыт)
|
||||||
|
|
||||||
|
### Интересы
|
||||||
|
|
||||||
|
Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в
|
||||||
|
своё свободное время.
|
||||||
|
|
||||||
|
Помимо программирования я люблю готовить и проводить время со своей любимой
|
||||||
|
семьей!
|
||||||
|
|
||||||
|
### Контакты
|
||||||
|
|
||||||
|
SimpleX:
|
||||||
|
[Dmitriy Pleshevskiy](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FSkIkI6EPd2D63F4xFKfHk7I1UGZVNn6k1QWZ5rcyr6w%3D%40smp9.simplex.im%2FLfKyG0YgW5eRO-z8vrEyvnNfV2EKDfBv%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAMRpR3YB10GVzc-asfqY2oIFkipx5RQm4DZRabzjfPHo%253D%26srv%3Djssqzccmrcws6bhmn77vgmhfjmhwlyr3u7puw4erkyoosywgl67slqqd.onion)
|
||||||
|
|
||||||
|
Telegram: [Dmitriy Pleshevskiy](https://telegram.me/da_pranaya)
|
||||||
|
|
||||||
|
Matrix: @pleshevskiy:matrix.org
|
||||||
|
|
||||||
|
Email: dmitriy[at]pleshevski[dot]ru
|
||||||
|
|
||||||
|
### Ссылки
|
||||||
|
|
||||||
|
[My Git Repo](https://git.pleshevski.ru/)
|
||||||
|
|
||||||
|
[My Github (Приостановлен из-за санкций)](https://github.com/pleshevskiy)
|
75
docs/works.md
Normal file
75
docs/works.md
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
---
|
||||||
|
title: Работы
|
||||||
|
layout: WorksPage
|
||||||
|
sidebar: false
|
||||||
|
---
|
||||||
|
|
||||||
|
## Выделенный опыт работы
|
||||||
|
|
||||||
|
### Binary Management
|
||||||
|
|
||||||
|
- Даты: Август 2018 – по настоящее время
|
||||||
|
- Роли: Lead Fullstack Developer, Team Lead, Architect
|
||||||
|
|
||||||
|
Разработка инструмента управления проектами для дизайнеров интерьера
|
||||||
|
|
||||||
|
- Разработка GraphQL API (Node.JS, Apollo, PostgreSQL, Redis, BullMQ). Перенес
|
||||||
|
триггеры базы данных в бизнес-логику. Написал интеграционные тесты на 70% api.
|
||||||
|
- Разработка фронтенда (React, Antd). Сформировал uikit и общие компоненты,
|
||||||
|
оптимизировал сложные и нагруженные компоненты. Полностью изменил работу с API
|
||||||
|
на фронтенде. Внедрил практику написания интеграционных тестов с помощью
|
||||||
|
cypress.
|
||||||
|
- Полностью перенес проект на TypeScript. Сформировал изолированные модули
|
||||||
|
системы.
|
||||||
|
- Как руководитель команды, я привнес в проект метод критической цепи, метод
|
||||||
|
буфера и метод планирования с конца. Помог команде войти в ритм, чтобы
|
||||||
|
выпускать релизы каждую неделю небольшими партиями. Я также несколько раз
|
||||||
|
составлял индивидуальный план развития для членов команды.
|
||||||
|
|
||||||
|
### Master Progress
|
||||||
|
|
||||||
|
- Даты: Май 2018 - по настоящее время (Пассивная поддержка)
|
||||||
|
- Роль: Tech Lead
|
||||||
|
|
||||||
|
Разработка веб-инфраструктуры образовательного центра Мастер Прогресс
|
||||||
|
|
||||||
|
- [Главного сайта](https://masterprogress.ru) (Python, Flask).
|
||||||
|
- [Кабинета студента](https://cabinet.masterprogress.ru) (Python, Flask,
|
||||||
|
TypeScript, React).
|
||||||
|
- [Инструмента для работы с rosmintrud](https://rosmintrud.masterprogress.ru)
|
||||||
|
(Deno, Vue, Typescript)
|
||||||
|
- Создана полная инфраструктура на Woodpecker CI и Docker swarm.
|
||||||
|
|
||||||
|
### Core Spirit
|
||||||
|
|
||||||
|
- Даты: Август 2018 - May 2020
|
||||||
|
- Роль: Lead Fullstack Developer
|
||||||
|
|
||||||
|
Разработка социальной платформы, сфокусированной на улучшении человека и
|
||||||
|
планеты.
|
||||||
|
|
||||||
|
- REST API (Node.JS, Express, 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)
|
||||||
|
|
||||||
|
## Хронология
|
||||||
|
|
||||||
|
В списке перечислены только публичные проекты.
|
44
flake.lock
44
flake.lock
|
@ -1,12 +1,30 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"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": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1654593855,
|
"lastModified": 1721562059,
|
||||||
"narHash": "sha256-c+SyXvj7THre87OyIdZfRVR+HhI/g1ZDrQ3VUtTuHkU=",
|
"narHash": "sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "033bd4fa9a8fbe0c68a88e925d9a884161044b25",
|
"rev": "68c9ed8bbed9dfce253cc91560bf9043297ef2fe",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -18,22 +36,22 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs",
|
"flake-utils": "flake-utils",
|
||||||
"utils": "utils"
|
"nixpkgs": "nixpkgs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"utils": {
|
"systems": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1653893745,
|
"lastModified": 1681028828,
|
||||||
"narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=",
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
"owner": "numtide",
|
"owner": "nix-systems",
|
||||||
"repo": "flake-utils",
|
"repo": "default",
|
||||||
"rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1",
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "numtide",
|
"owner": "nix-systems",
|
||||||
"repo": "flake-utils",
|
"repo": "default",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
40
flake.nix
40
flake.nix
|
@ -3,20 +3,44 @@
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
utils.url = "github:numtide/flake-utils";
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = {self, nixpkgs, utils}:
|
outputs = { self, nixpkgs, flake-utils }:
|
||||||
let out = system:
|
let
|
||||||
let pkgs = nixpkgs.legacyPackages."${system}";
|
out = system:
|
||||||
in {
|
let
|
||||||
devShell = pkgs.mkShell {
|
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; [
|
buildInputs = with pkgs; [
|
||||||
|
nodejs_22
|
||||||
gnumake
|
gnumake
|
||||||
nodePackages.sass
|
pnpm
|
||||||
|
nodePackages.typescript-language-server # typescript
|
||||||
|
nodePackages.vscode-langservers-extracted # html, css, json, eslint
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
in with utils.lib; eachSystem defaultSystems out;
|
in
|
||||||
|
flake-utils.lib.eachDefaultSystem out;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
import { NonEmptyArray } from "../../../global.ts";
|
||||||
|
import { Technology } from "../domain/mod.ts";
|
||||||
|
import { AnyNode, TextNode } from "ren/node.ts";
|
||||||
|
|
||||||
|
export const TechnologyList: (techs: NonEmptyArray<Technology>) => AnyNode = (
|
||||||
|
techs,
|
||||||
|
) => new TextNode(techs.join(", "));
|
7
old/modules/work/domain/Role.ts
Normal file
7
old/modules/work/domain/Role.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
export enum Role {
|
||||||
|
Collaborator = "collaborator",
|
||||||
|
Author = "author",
|
||||||
|
TechLead = "tech lead",
|
||||||
|
TeamLead = "team lead",
|
||||||
|
Developer = "developer",
|
||||||
|
}
|
25
old/modules/work/domain/Status.ts
Normal file
25
old/modules/work/domain/Status.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
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",
|
||||||
|
}
|
25
old/modules/work/domain/Technology.ts
Normal file
25
old/modules/work/domain/Technology.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
export enum Technology {
|
||||||
|
C = "C",
|
||||||
|
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",
|
||||||
|
Godot = "Godot",
|
||||||
|
Haskell = "Haskell",
|
||||||
|
}
|
5
old/modules/work/domain/mod.ts
Normal file
5
old/modules/work/domain/mod.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
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";
|
36
package.json
Normal file
36
package.json
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
"name": "pleshevskiy",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "Dmitriy Pleshevskiy",
|
||||||
|
"license": "MIT",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"docs:build": "vuepress build docs",
|
||||||
|
"docs:clean-dev": "vuepress dev docs --clean-cache",
|
||||||
|
"docs:dev": "vuepress dev docs",
|
||||||
|
"docs:update-package": "pnpm dlx vp-update"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@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",
|
||||||
|
"vue": "^3.4.0",
|
||||||
|
"vuepress": "^2.0.0-rc.7",
|
||||||
|
|
||||||
|
"@rushstack/eslint-patch": "^1.1.4",
|
||||||
|
"@types/node": "^20.14.2",
|
||||||
|
"@vitejs/plugin-vue": "^4.0.0",
|
||||||
|
"@vue/eslint-config-prettier": "^9.0.0",
|
||||||
|
"@vue/eslint-config-typescript": "^13.0.0",
|
||||||
|
"@vue/language-server": "^2.0.19",
|
||||||
|
"@vue/tsconfig": "^0.5.1",
|
||||||
|
"@vue/typescript-plugin": "^2.0.19",
|
||||||
|
"eslint": "<9.0.0",
|
||||||
|
"eslint-plugin-cypress": "^3.3.0",
|
||||||
|
"eslint-plugin-vue": "^9.14.1",
|
||||||
|
"prettier": ">=3.0.0",
|
||||||
|
"typescript": "~5.4.5",
|
||||||
|
"vue-tsc": "^1.6.0"
|
||||||
|
}
|
||||||
|
}
|
4554
pnpm-lock.yaml
Normal file
4554
pnpm-lock.yaml
Normal file
File diff suppressed because it is too large
Load diff
11
tsconfig.json
Normal file
11
tsconfig.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
|
"include": ["env.d.ts", "docs/**/*", "docs/**/*.vue"],
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./docs/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue