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"; import { Link, RepoLink } from "../uikit/link.ts"; const tr = E.bind(null, "tr", []); const td = E.bind(null, "td", []); const th = E.bind(null, "th", []); export function WorksPage(ctx: Context, content: AnyNode): AnyNode { ctx.title = "Works | Pleshevski"; return PageLayout(ctx, [ E("div", classNames("content-width gap-v-1x5 responsive-typography"), [ content, H3(ctx.tr.Chronological), ChronologicalWorksTable(ctx, CHRONOLOGICAL_WORKS), ]), ]); } function ChronologicalWorksTable(ctx: Context, works: Work[]): AnyNode { return E("table", [], [ E("thead", [], [ tr([ 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(", ")), td(work.startDate), td(work.endDate ? work.endDate : (work.statuses ?? []).join(", ")), ]); }), ), ]); } interface Work { name: AnyNode; description: string; roles: Role[]; technologies: Technology[]; // TODO: use Date instead of string startDate: string; endDate?: string; statuses?: Status[]; } enum Role { Collaborator = "collaborator", Author = "author", TechLead = "tech lead", TeamLead = "team lead", Developer = "developer", } 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", Bash = "Bash", TreeSitter = "TreeSitter", Nix = "Nix", } 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", } const CHRONOLOGICAL_WORKS: Work[] = [ { 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], }, { 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"), description: "A simple way to parse a string using type annotations.", roles: [Role.Author], technologies: [Technology.Rust], startDate: "2022", statuses: [Status.PassivelyMaintained], }, { name: RepoLink("enve", "/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: "2022", statuses: [Status.PassivelyMaintained], }, { name: RepoLink("dexios", "/github/dexios"), description: "Dexios is a fast, secure, and open source command-line encryption tool.", roles: [Role.Collaborator], technologies: [Technology.Rust], startDate: "2022", statuses: [Status.PassivelyMaintained], }, { name: RepoLink("paren", "/pleshevskiy/paren"), description: "Library for parsing and rendering information.", roles: [Role.Author], technologies: [Technology.TypeScript, Technology.Deno], startDate: "2022", statuses: [Status.AsIs, Status.Experimental], }, { name: RepoLink("recipes", "/pleshevskiy/recipes"), description: "Site with recipes which cares about privacy", roles: [Role.Author], technologies: [Technology.TypeScript, Technology.Deno, Technology.Rust], startDate: "2022", statuses: [Status.PassivelyMaintained], }, { 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, ], startDate: "2022", statuses: [Status.PassivelyMaintained], }, { name: RepoLink("docker stack drone plugin", "/drone_plugins/docker_stack"), description: "Deploy to production using `docker stack deploy`", roles: [Role.Author], technologies: [Technology.Docker, Technology.Drone], startDate: "2022", statuses: [Status.PassivelyMaintained], }, { name: RepoLink("hwt", "/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: "2022", statuses: [Status.AsIs], }, { name: RepoLink("migra", "/pleshevskiy/migra"), description: "Simple SQL migration manager for your project.", roles: [Role.Author], technologies: [Technology.Rust], startDate: "2021", statuses: [Status.AsIs], }, { name: RepoLink( "ood_persistence", "/pleshevskiy/ood_persistence", ), description: "Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ", roles: [Role.Author], technologies: [Technology.Rust], startDate: "2021", statuses: [Status.Deprecated, Status.Experimental], }, { name: RepoLink( "espruino-starter", "/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: "2021", statuses: [Status.AsIs], }, { name: RepoLink( "sonic-channel", "/pleshevskiy/sonic-channel", ), description: "Rust client for sonic search backend.", roles: [Role.Author], technologies: [Technology.Rust], startDate: "2020", statuses: [Status.PassivelyMaintained], }, { name: RepoLink( "react-rest-request", "/pleshevskiy/react-rest-request", ), description: "Minimalistic REST API client for React inspired by Apollo.", roles: [Role.Author], technologies: [Technology.TypeScript, Technology.React], startDate: "2020", 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], startDate: "2019", statuses: [Status.Deprecated], }, { 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], startDate: "2019", 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, Technology.Nix, ], startDate: "2019", statuses: [Status.PassivelyMaintained], }, { name: RepoLink("genrss", "/pleshevskiy/genrss"), description: "RSS generator for python", roles: [Role.Author], technologies: [Technology.Python], startDate: "2019", statuses: [Status.PassivelyMaintained], }, { name: RepoLink( "marshmallow_pageinfo", "/pleshevskiy/marshmallow_pageinfo", ), 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, Technology.Rust, Technology.Nix, ], 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", }, { 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, ], startDate: "2018", statuses: [Status.PassivelyMaintained], }, { name: RepoLink("ictmpl", "/pleshevskiy/ictmpl"), description: "Generate projects from templates", roles: [Role.Author], technologies: [Technology.Python], startDate: "2018", statuses: [Status.AsIs], }, { name: RepoLink("jjcrypto", "/pleshevskiy/jjcrypto"), description: "Javascript encoder and decoder", roles: [Role.Author], technologies: [Technology.Php], startDate: "2015", statuses: [Status.AsIs], }, ];