pleshevski.ru/views/pages/works.ts

407 lines
12 KiB
TypeScript
Raw Normal View History

import { PageLayout } from "../comp/page_layout.ts";
import { AnyNode, E } from "ren/node.ts";
import { classNames } from "ren/attrs.ts";
import { Context } from "../../context.ts";
import { H3 } from "../uikit/typo.ts";
2022-06-22 00:35:55 +03:00
import { Link, RepoLink } from "../uikit/link.ts";
2022-06-22 00:35:55 +03:00
const tr = E.bind(null, "tr", []);
const td = E.bind(null, "td", []);
const th = E.bind(null, "th", []);
2022-07-04 00:15:23 +03:00
export function WorksPage(ctx: Context, content: AnyNode): AnyNode {
2023-02-03 03:09:57 +03:00
ctx.title = "Works | Pleshevski";
2023-02-03 03:17:55 +03:00
return PageLayout(ctx, [
E("div", classNames("content-width gap-v-1x5 responsive-typography"), [
2022-07-04 00:15:23 +03:00
content,
2022-06-22 00:35:55 +03:00
H3(ctx.tr.Chronological),
2022-07-04 00:15:23 +03:00
ChronologicalWorksTable(ctx, CHRONOLOGICAL_WORKS),
]),
]);
}
2022-07-04 00:15:23 +03:00
function ChronologicalWorksTable(ctx: Context, works: Work[]): AnyNode {
return E("table", [], [
E("thead", [], [
tr([
2022-07-04 00:15:23 +03:00
th(ctx.tr.Name),
th(ctx.tr.Description),
th(ctx.tr.Role),
th(ctx.tr.Technologies),
th(ctx.tr.Start),
th(ctx.tr.Status_or_End),
]),
]),
E(
"tbody",
[],
works.map((work) => {
return tr([
td([work.name]),
td(work.description),
td(work.roles.join(", ")),
td(work.technologies.join(", ")),
2022-07-04 00:15:23 +03:00
td(work.startDate),
td(work.endDate ? work.endDate : (work.statuses ?? []).join(", ")),
]);
}),
),
]);
}
interface Work {
name: AnyNode;
description: string;
roles: Role[];
technologies: Technology[];
2022-07-03 16:18:43 +03:00
// TODO: use Date instead of string
startDate: string;
endDate?: string;
2022-07-04 00:15:23 +03:00
statuses?: Status[];
}
enum Role {
2022-07-22 13:53:25 +03:00
Collaborator = "collaborator",
Author = "author",
TechLead = "tech lead",
2022-07-03 16:18:43 +03:00
TeamLead = "team lead",
Developer = "developer",
}
enum Technology {
2023-02-03 02:55:42 +03:00
C = "C",
JavaScript = "JS",
TypeScript = "TS",
Rust = "Rust",
Python = "Python",
Php = "PHP",
Deno = "Deno",
NodeJS = "NodeJS",
Flask = "Flask",
React = "React",
2022-07-03 16:18:43 +03:00
Antd = "Antd",
2022-06-22 12:12:06 +03:00
Postgresql = "PostgreSQL",
2022-07-03 15:44:46 +03:00
Docker = "Docker",
Drone = "Drone",
2023-02-03 02:55:42 +03:00
Bash = "Bash",
TreeSitter = "TreeSitter",
Nix = "Nix",
}
2022-06-22 00:35:55 +03:00
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",
}
2022-07-03 15:44:46 +03:00
const CHRONOLOGICAL_WORKS: Work[] = [
2023-02-03 02:55:42 +03:00
{
name: RepoLink("tree-sitter-plpgsql", "/pleshevskiy/tree-sitter-plpgsql"),
description: "plpgsql grammar for tree-sitter",
roles: [Role.Author],
technologies: [Technology.C, Technology.JavaScript, Technology.TreeSitter],
startDate: "2022",
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink("wd2", "/pleshevskiy/wd2"),
description:
"A wrapper over d2 which allows to use additional configs from d2 file",
roles: [Role.Author],
technologies: [Technology.Bash],
startDate: "2022",
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink("tree-sitter-d2", "/pleshevskiy/tree-sitter-d2"),
description: "d2 grammar for tree-sitter",
roles: [Role.Author],
technologies: [Technology.C, Technology.JavaScript, Technology.TreeSitter],
startDate: "2022",
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink("nix2lua", "/mynix/nix2lua"),
description:
"This is a small but functional library that converts your nix configurations into lua format.",
roles: [Role.Author],
technologies: [Technology.Nix],
startDate: "2022",
statuses: [Status.PassivelyMaintained],
},
2022-08-04 13:13:16 +03:00
{
name: RepoLink("vnetod", "/pleshevskiy/vnetod"),
description: "Dotenv section switcher",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: "2022",
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink("estring", "/pleshevskiy/estring"),
2022-08-04 13:13:16 +03:00
description: "A simple way to parse a string using type annotations.",
roles: [Role.Author],
technologies: [Technology.Rust],
startDate: "2022",
2023-02-03 02:55:42 +03:00
statuses: [Status.PassivelyMaintained],
2022-08-04 13:13:16 +03:00
},
{
name: RepoLink("enve", "/pleshevskiy/enve"),
2022-08-04 13:13:16 +03:00
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: "2022",
2023-02-03 02:55:42 +03:00
statuses: [Status.PassivelyMaintained],
2022-08-04 13:13:16 +03:00
},
2022-07-22 13:53:25 +03:00
{
name: RepoLink("dexios", "/github/dexios"),
2022-07-22 13:53:25 +03:00
description:
"Dexios is a fast, secure, and open source command-line encryption tool.",
roles: [Role.Collaborator],
technologies: [Technology.Rust],
startDate: "2022",
2023-02-03 02:55:42 +03:00
statuses: [Status.PassivelyMaintained],
2022-07-22 13:53:25 +03:00
},
2022-07-03 15:44:46 +03:00
{
name: RepoLink("paren", "/pleshevskiy/paren"),
description: "Library for parsing and rendering information.",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.Deno],
2022-07-03 16:18:43 +03:00
startDate: "2022",
2023-02-03 02:55:42 +03:00
statuses: [Status.AsIs, Status.Experimental],
2022-07-03 15:44:46 +03:00
},
{
name: RepoLink("recipes", "/pleshevskiy/recipes"),
description: "Site with recipes which cares about privacy",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.Deno, Technology.Rust],
2022-07-03 16:18:43 +03:00
startDate: "2022",
2023-02-03 02:55:42 +03:00
statuses: [Status.PassivelyMaintained],
2022-07-03 15:44:46 +03:00
},
{
name: RepoLink("pleshevski.ru", "/pleshevskiy/pleshevski.ru"),
description: "Source code of my personal site",
roles: [Role.Author],
technologies: [
Technology.TypeScript,
Technology.Deno,
Technology.Docker,
Technology.Drone,
],
2022-07-03 16:18:43 +03:00
startDate: "2022",
2022-07-03 15:44:46 +03:00
statuses: [Status.PassivelyMaintained],
},
{
2022-07-03 16:18:43 +03:00
name: RepoLink("docker stack drone plugin", "/drone_plugins/docker_stack"),
2022-07-03 15:44:46 +03:00
description: "Deploy to production using `docker stack deploy`",
roles: [Role.Author],
technologies: [Technology.Docker, Technology.Drone],
2022-07-03 16:18:43 +03:00
startDate: "2022",
2022-07-03 15:44:46 +03:00
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink("hwt", "/pleshevskiy/hwt"),
2022-07-03 15:44:46 +03:00
description:
"healthy workaholic timer A tool that keeps you from breaking your health by working all day.",
roles: [Role.Author],
technologies: [Technology.Rust],
2022-07-03 16:18:43 +03:00
startDate: "2022",
2023-02-03 02:55:42 +03:00
statuses: [Status.AsIs],
2022-07-03 15:44:46 +03:00
},
{
name: RepoLink("migra", "/pleshevskiy/migra"),
2022-07-03 15:44:46 +03:00
description: "Simple SQL migration manager for your project.",
roles: [Role.Author],
technologies: [Technology.Rust],
2022-07-03 16:18:43 +03:00
startDate: "2021",
2022-07-03 15:44:46 +03:00
statuses: [Status.AsIs],
},
{
name: RepoLink(
"ood_persistence",
"/pleshevskiy/ood_persistence",
2022-07-03 15:44:46 +03:00
),
description:
"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",
roles: [Role.Author],
technologies: [Technology.Rust],
2022-07-03 16:18:43 +03:00
startDate: "2021",
2022-07-03 15:44:46 +03:00
statuses: [Status.Deprecated, Status.Experimental],
},
{
name: RepoLink(
"espruino-starter",
"/pleshevskiy/espruino-starter",
2022-07-03 15:44:46 +03:00
),
description:
"Quickly start creating your new project on the espruino board or a board based on it.",
roles: [Role.Author],
technologies: [Technology.JavaScript],
2022-07-03 16:18:43 +03:00
startDate: "2021",
2022-07-03 15:44:46 +03:00
statuses: [Status.AsIs],
},
{
name: RepoLink(
"sonic-channel",
"/pleshevskiy/sonic-channel",
2022-07-03 15:44:46 +03:00
),
description: "Rust client for sonic search backend.",
roles: [Role.Author],
technologies: [Technology.Rust],
2022-07-03 16:18:43 +03:00
startDate: "2020",
2022-07-03 15:44:46 +03:00
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink(
"react-rest-request",
"/pleshevskiy/react-rest-request",
2022-07-03 15:44:46 +03:00
),
description: "Minimalistic REST API client for React inspired by Apollo.",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.React],
2022-07-03 16:18:43 +03:00
startDate: "2020",
2022-07-03 15:44:46 +03:00
statuses: [Status.AsIs],
},
{
name: RepoLink("itconfig", "/pleshevskiy/itconfig"),
description:
"Easy build a configs from environment variables and use it in globally.",
roles: [Role.Author],
technologies: [Technology.Rust],
2022-07-03 16:18:43 +03:00
startDate: "2019",
2023-02-03 02:55:42 +03:00
statuses: [Status.Deprecated],
2022-07-03 15:44:46 +03:00
},
{
name: RepoLink("it-fsm", "/pleshevskiy/it-fsm"),
description: "Simple full-featured finite state machine for your project",
roles: [Role.Author],
technologies: [Technology.TypeScript, Technology.NodeJS, Technology.Deno],
2022-07-03 16:18:43 +03:00
startDate: "2019",
2022-07-03 15:44:46 +03:00
statuses: [Status.PassivelyMaintained],
},
{
name: Link("Cabinet Master Progress", {
href: "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.Drone,
2023-02-03 02:55:42 +03:00
Technology.Nix,
2022-07-03 15:44:46 +03:00
],
2022-07-03 16:18:43 +03:00
startDate: "2019",
2022-07-03 15:44:46 +03:00
statuses: [Status.PassivelyMaintained],
},
2022-07-03 16:18:43 +03:00
{
name: RepoLink("genrss", "/pleshevskiy/genrss"),
2022-07-03 16:18:43 +03:00
description: "RSS generator for python",
roles: [Role.Author],
technologies: [Technology.Python],
startDate: "2019",
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink(
"marshmallow_pageinfo",
"/pleshevskiy/marshmallow_pageinfo",
2022-07-03 16:18:43 +03:00
),
description: "Page info marshmallow schema for api",
roles: [Role.Author],
technologies: [Technology.Python],
startDate: "2019",
statuses: [Status.AsIs],
},
{
name: Link("BinaryManagement", {
href: "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,
2023-02-03 02:55:42 +03:00
Technology.Rust,
Technology.Nix,
2022-07-03 16:18:43 +03:00
],
startDate: "2018",
statuses: [Status.ActiveDeveloped],
},
{
name: Link("CoreSpirit", { href: "https://corespirit.com" }),
description: "Social platform focusing on human and planetary enhancement",
roles: [Role.Developer],
technologies: [
Technology.TypeScript,
Technology.NodeJS,
Technology.React,
Technology.Docker,
],
startDate: "2018",
endDate: "2019",
},
2022-07-03 15:44:46 +03:00
{
name: Link("Master Progress", { href: "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.Drone,
],
2022-07-03 16:18:43 +03:00
startDate: "2018",
2022-07-03 15:44:46 +03:00
statuses: [Status.PassivelyMaintained],
},
{
name: RepoLink("ictmpl", "/pleshevskiy/ictmpl"),
2022-07-03 15:44:46 +03:00
description: "Generate projects from templates",
roles: [Role.Author],
technologies: [Technology.Python],
2022-07-03 16:18:43 +03:00
startDate: "2018",
2022-07-03 15:44:46 +03:00
statuses: [Status.AsIs],
},
{
name: RepoLink("jjcrypto", "/pleshevskiy/jjcrypto"),
2022-07-03 15:44:46 +03:00
description: "Javascript encoder and decoder",
roles: [Role.Author],
technologies: [Technology.Php],
2022-07-03 16:18:43 +03:00
startDate: "2015",
2022-07-03 15:44:46 +03:00
statuses: [Status.AsIs],
},
];