From 406429cbb52dde115c68fafc0bc5ca65000b61da Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Tue, 20 Jun 2023 16:30:27 +0300 Subject: [PATCH] move works to the module --- global.ts | 1 + .../ChronologicalWorksTable.ts | 53 +++ .../work/ChronologicalWorksTable/RoleList.ts | 6 + .../ChronologicalWorksTable/TechnologyList.ts | 7 + modules/work/ChronologicalWorksTable/mod.ts | 1 + modules/work/WorkLink.ts | 6 + modules/work/data.ts | 318 ++++++++++++++ modules/work/domain/Role.ts | 7 + modules/work/domain/Status.ts | 25 ++ modules/work/domain/Technology.ts | 21 + modules/work/domain/Work.ts | 20 + modules/work/domain/mod.ts | 5 + modules/work/mod.ts | 1 + {views/uikit => uikit}/link.ts | 6 - {views/uikit => uikit}/typo.ts | 0 views/comp/page_layout.ts | 17 +- views/pages/e404.ts | 2 +- views/pages/e500.ts | 2 +- views/pages/works.ts | 409 +----------------- 19 files changed, 484 insertions(+), 423 deletions(-) create mode 100644 global.ts create mode 100644 modules/work/ChronologicalWorksTable/ChronologicalWorksTable.ts create mode 100644 modules/work/ChronologicalWorksTable/RoleList.ts create mode 100644 modules/work/ChronologicalWorksTable/TechnologyList.ts create mode 100644 modules/work/ChronologicalWorksTable/mod.ts create mode 100644 modules/work/WorkLink.ts create mode 100644 modules/work/data.ts create mode 100644 modules/work/domain/Role.ts create mode 100644 modules/work/domain/Status.ts create mode 100644 modules/work/domain/Technology.ts create mode 100644 modules/work/domain/Work.ts create mode 100644 modules/work/domain/mod.ts create mode 100644 modules/work/mod.ts rename {views/uikit => uikit}/link.ts (71%) rename {views/uikit => uikit}/typo.ts (100%) diff --git a/global.ts b/global.ts new file mode 100644 index 0000000..5ae448c --- /dev/null +++ b/global.ts @@ -0,0 +1 @@ +export type NonEmptyArray = [T, ...T[]]; diff --git a/modules/work/ChronologicalWorksTable/ChronologicalWorksTable.ts b/modules/work/ChronologicalWorksTable/ChronologicalWorksTable.ts new file mode 100644 index 0000000..f49c5bd --- /dev/null +++ b/modules/work/ChronologicalWorksTable/ChronologicalWorksTable.ts @@ -0,0 +1,53 @@ +import { AnyNode, E } from "ren/node.ts"; +import { WorkLink } from "../mod.ts"; +import { renderDate } from "../../../render.ts"; +import { CHRONOLOGICAL_WORKS } from "../data.ts"; +import { RoleList } from "./RoleList.ts"; + +const tr = E.bind(null, "tr", []); +const td = E.bind(null, "td", []); +const th = E.bind(null, "th", []); + +export type ChronologicalWorksTableTranslations = Readonly< + Record< + | "Name" + | "Description" + | "Role" + | "Technologies" + | "Start" + | "Status_or_End", + string + > +>; + +export const ChronologicalWorksTable = ( + i18n: ChronologicalWorksTableTranslations, +): AnyNode => + E("table", [], [ + E("thead", [], [ + tr([ + th(i18n.Name), + th(i18n.Description), + th(i18n.Role), + th(i18n.Technologies), + th(i18n.Start), + th(i18n.Status_or_End), + ]), + ]), + E( + "tbody", + [], + CHRONOLOGICAL_WORKS.map((work) => { + return tr([ + td([WorkLink(work)]), + td(work.description), + td([RoleList(work.roles)]), + td(work.technologies.join(", ")), + td(renderDate(work.startDate)), + td( + work.endDate ? renderDate(work.endDate) : work.status, + ), + ]); + }), + ), + ]); diff --git a/modules/work/ChronologicalWorksTable/RoleList.ts b/modules/work/ChronologicalWorksTable/RoleList.ts new file mode 100644 index 0000000..b3f43f2 --- /dev/null +++ b/modules/work/ChronologicalWorksTable/RoleList.ts @@ -0,0 +1,6 @@ +import { NonEmptyArray } from "../../../global.ts"; +import { Role } from "../domain/mod.ts"; +import { AnyNode, TextNode } from "ren/node.ts"; + +export const RoleList: (roles: NonEmptyArray) => AnyNode = (roles) => + new TextNode(roles.join(", ")); diff --git a/modules/work/ChronologicalWorksTable/TechnologyList.ts b/modules/work/ChronologicalWorksTable/TechnologyList.ts new file mode 100644 index 0000000..e0c625c --- /dev/null +++ b/modules/work/ChronologicalWorksTable/TechnologyList.ts @@ -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) => AnyNode = ( + techs, +) => new TextNode(techs.join(", ")); diff --git a/modules/work/ChronologicalWorksTable/mod.ts b/modules/work/ChronologicalWorksTable/mod.ts new file mode 100644 index 0000000..f4f59df --- /dev/null +++ b/modules/work/ChronologicalWorksTable/mod.ts @@ -0,0 +1 @@ +export { ChronologicalWorksTable } from "./ChronologicalWorksTable.ts"; diff --git a/modules/work/WorkLink.ts b/modules/work/WorkLink.ts new file mode 100644 index 0000000..99a2e7e --- /dev/null +++ b/modules/work/WorkLink.ts @@ -0,0 +1,6 @@ +import { AnyNode } from "ren/node.ts"; +import { Work, work as w } from "./domain/mod.ts"; +import { Link } from "../../uikit/link.ts"; + +export const WorkLink: (work: Work) => AnyNode = (work) => + Link(work.name, { href: w.getExternalLink(work) }); diff --git a/modules/work/data.ts b/modules/work/data.ts new file mode 100644 index 0000000..59c293a --- /dev/null +++ b/modules/work/data.ts @@ -0,0 +1,318 @@ +import { Role } from "./domain/Role.ts"; +import { Status } from "./domain/Status.ts"; +import { Technology } from "./domain/Technology.ts"; +import { Work } from "./domain/Work.ts"; + +export const CHRONOLOGICAL_WORKS: Work[] = [ + { + 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"), + status: Status.PassivelyMaintained, + }, + { + 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.PassivelyMaintained, + }, + { + 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: "BinaryManagement", + 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: "CoreSpirit", + 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, + }, +]; diff --git a/modules/work/domain/Role.ts b/modules/work/domain/Role.ts new file mode 100644 index 0000000..f124a40 --- /dev/null +++ b/modules/work/domain/Role.ts @@ -0,0 +1,7 @@ +export enum Role { + Collaborator = "collaborator", + Author = "author", + TechLead = "tech lead", + TeamLead = "team lead", + Developer = "developer", +} diff --git a/modules/work/domain/Status.ts b/modules/work/domain/Status.ts new file mode 100644 index 0000000..3e3dc64 --- /dev/null +++ b/modules/work/domain/Status.ts @@ -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", +} diff --git a/modules/work/domain/Technology.ts b/modules/work/domain/Technology.ts new file mode 100644 index 0000000..43d61c4 --- /dev/null +++ b/modules/work/domain/Technology.ts @@ -0,0 +1,21 @@ +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", +} diff --git a/modules/work/domain/Work.ts b/modules/work/domain/Work.ts new file mode 100644 index 0000000..0e03500 --- /dev/null +++ b/modules/work/domain/Work.ts @@ -0,0 +1,20 @@ +import { 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; + technologies: NonEmptyArray; + startDate: Date; + endDate?: Date; + status?: Status; +} + +export const getExternalLink: (work: Pick) => string = (work) => + work.url.startsWith("https://") + ? work.url + : new URL(work.url, "https://git.pleshevski.ru").toString(); diff --git a/modules/work/domain/mod.ts b/modules/work/domain/mod.ts new file mode 100644 index 0000000..cf8937a --- /dev/null +++ b/modules/work/domain/mod.ts @@ -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"; diff --git a/modules/work/mod.ts b/modules/work/mod.ts new file mode 100644 index 0000000..6d8bead --- /dev/null +++ b/modules/work/mod.ts @@ -0,0 +1 @@ +export { WorkLink } from "./WorkLink.ts"; diff --git a/views/uikit/link.ts b/uikit/link.ts similarity index 71% rename from views/uikit/link.ts rename to uikit/link.ts index 2be2575..d51894b 100644 --- a/views/uikit/link.ts +++ b/uikit/link.ts @@ -1,11 +1,5 @@ import { AnyNode, Attrs, E } from "ren/node.ts"; -export function RepoLink(name: string, repo: string): AnyNode { - const gitBase = new URL("https://git.pleshevski.ru"); - - return Link(name, { href: new URL(repo, gitBase).toString() }); -} - export function Link( text: string, sourceAttrs: Attrs | Attrs[], diff --git a/views/uikit/typo.ts b/uikit/typo.ts similarity index 100% rename from views/uikit/typo.ts rename to uikit/typo.ts diff --git a/views/comp/page_layout.ts b/views/comp/page_layout.ts index 4f03a73..e9088f4 100644 --- a/views/comp/page_layout.ts +++ b/views/comp/page_layout.ts @@ -1,7 +1,10 @@ import { AnyNode, Attrs, E, Elem } from "ren/node.ts"; import { classNames } from "ren/attrs.ts"; import { Context, getLangHref, iterLangs, Lang } from "../../context.ts"; -import { Link, RepoLink } from "../uikit/link.ts"; +import { Link } from "../../uikit/link.ts"; +import { renderDate } from "../../render.ts"; + +const SITE_UPDATED_AT = new Date(); export function PageLayout(ctx: Context, children: AnyNode[]): Elem { return E("div", { id: "main" }, [ @@ -30,22 +33,18 @@ function navLink(lhref: string, ctx?: Context): Attrs { return attrs; } -const SERVER_STARTED_AT = new Date().toLocaleDateString(undefined, { - year: "numeric", - month: "2-digit", - day: "2-digit", -}); - export function Footer(ctx: Context): AnyNode { return E("footer", classNames("footer"), [ E("div", classNames("content-width row-sta-bet"), [ E("div", classNames("gap-v-1x5"), [ E("div", [], [ E("b", [], "Updated At:"), - SERVER_STARTED_AT, + renderDate(SITE_UPDATED_AT), ]), E("div", [], [ - RepoLink(ctx.tr.Source_code, "/pleshevskiy/pleshevski.ru"), + Link(ctx.tr.Source_code, { + href: "https://git.pleshevski.ru/pleshevskiy/pleshevski.ru", + }), ]), ]), ChangeLang(ctx), diff --git a/views/pages/e404.ts b/views/pages/e404.ts index bd224d6..ee98334 100644 --- a/views/pages/e404.ts +++ b/views/pages/e404.ts @@ -2,7 +2,7 @@ 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 { H3 } from "../../uikit/typo.ts"; export function E404Page(ctx: Context): AnyNode { ctx.title = "Not Found - 404 | Pleshevski"; diff --git a/views/pages/e500.ts b/views/pages/e500.ts index d3930e4..b0c58e6 100644 --- a/views/pages/e500.ts +++ b/views/pages/e500.ts @@ -2,7 +2,7 @@ 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 { H3 } from "../../uikit/typo.ts"; export function E500Page(ctx: Context): AnyNode { ctx.title = "Internal Server Error - 500 | Pleshevski"; diff --git a/views/pages/works.ts b/views/pages/works.ts index 2655978..71eccdd 100644 --- a/views/pages/works.ts +++ b/views/pages/works.ts @@ -2,13 +2,8 @@ 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"; -import { renderDate } from "../../render.ts"; - -const tr = E.bind(null, "tr", []); -const td = E.bind(null, "td", []); -const th = E.bind(null, "th", []); +import { ChronologicalWorksTable } from "../../modules/work/ChronologicalWorksTable/mod.ts"; +import { H3 } from "../../uikit/typo.ts"; export function WorksPage(ctx: Context, _content: AnyNode): AnyNode { ctx.title = "Works | Pleshevski"; @@ -17,405 +12,7 @@ export function WorksPage(ctx: Context, _content: AnyNode): AnyNode { E("div", classNames("content-width gap-v-1x5 responsive-typography"), [ // content, H3(ctx.tr.Chronological), - ChronologicalWorksTable(ctx, CHRONOLOGICAL_WORKS), + ChronologicalWorksTable(ctx.tr), ]), ]); } - -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(renderDate(work.startDate)), - td( - work.endDate - ? renderDate(work.endDate) - : (work.statuses ?? []).join(", "), - ), - ]); - }), - ), - ]); -} - -interface Work { - name: AnyNode; - description: string; - roles: Role[]; - technologies: Technology[]; - startDate: Date; - endDate?: Date; - 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", - Lua = "Lua", -} - -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, - Technology.Nix, - ], - startDate: new Date("2023-01-05"), - 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, Technology.Nix], - startDate: new Date("2022-12-12"), - 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, - Technology.Nix, - ], - startDate: new Date("2022-12-04"), - statuses: [Status.ActiveDeveloped], - }, - { - 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, Technology.Lua], - startDate: new Date("2022-11-22"), - statuses: [Status.PassivelyMaintained], - }, - { - name: RepoLink("vnetod", "/pleshevskiy/vnetod"), - description: "Dotenv section switcher", - roles: [Role.Author], - technologies: [Technology.Rust], - startDate: new Date("2022-07-29"), - 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: new Date("2022-07-23"), - 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: new Date("2022-07-18"), - 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: new Date("2022-06-06"), - 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: new Date("2022-06-01"), - endDate: new Date("2023-02-28"), - }, - { - name: RepoLink("recipes", "/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"), - 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: new Date("2022-03-16"), - statuses: [Status.PassivelyMaintained], - }, - { - name: RepoLink("paren", "/pleshevskiy/paren"), - description: "Library for parsing and rendering information.", - roles: [Role.Author], - technologies: [Technology.TypeScript, Technology.Deno], - startDate: new Date("2022-03-14"), - statuses: [Status.AsIs, Status.Experimental], - }, - { - 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: new Date("2022-02-04"), - 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: new Date("2021-10-12"), - statuses: [Status.Deprecated, Status.Experimental], - }, - { - name: RepoLink("migra", "/pleshevskiy/migra"), - description: "Simple SQL migration manager for your project.", - roles: [Role.Author], - technologies: [Technology.Rust], - startDate: new Date("2021-01-31"), - statuses: [Status.AsIs], - }, - { - 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: new Date("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: new Date("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: new Date("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: new Date("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: new Date("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: new Date("2019"), - statuses: [Status.PassivelyMaintained], - }, - { - name: RepoLink("genrss", "/pleshevskiy/genrss"), - description: "RSS generator for python", - roles: [Role.Author], - technologies: [Technology.Python], - startDate: new Date("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: new Date("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: new Date("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: new Date("2018"), - endDate: new Date("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: new Date("2018"), - statuses: [Status.PassivelyMaintained], - }, - { - name: RepoLink("ictmpl", "/pleshevskiy/ictmpl"), - description: "Generate projects from templates", - roles: [Role.Author], - technologies: [Technology.Python], - startDate: new Date("2018"), - statuses: [Status.AsIs], - }, - { - name: RepoLink("jjcrypto", "/pleshevskiy/jjcrypto"), - description: "Javascript encoder and decoder", - roles: [Role.Author], - technologies: [Technology.Php], - startDate: new Date("2015"), - statuses: [Status.AsIs], - }, -];