commit bae0ce97adabeb5371e9437058f6489123d9ee8e Author: idylls Date: Tue Jan 24 15:52:57 2023 -0500 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34558e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +node_modules/ +build/ diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..0bfc428 --- /dev/null +++ b/build.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +cp -r content/static build/ +npx lessc css/style.less build/style.css +npx lessc css/resume.less build/resume.css +npx esbuild --bundle js/bundle.ts --outfile=build/bundle.js +bun gen/main.ts diff --git a/content/pages/about.html b/content/pages/about.html new file mode 100644 index 0000000..76ec724 --- /dev/null +++ b/content/pages/about.html @@ -0,0 +1,41 @@ + + About the Author + + +

About the Author

+
+ + +

+Hello! My name is Nick. Currently I'm located in the Greater Philadelphia +area. +

+

+I work as a programmer, typically remotely. +I'm usually tinkering on some sort of project, some of which are available +publicly on my git service, and others +that I keep mostly private for myself and friends (though I'm typically +happy to demo/share source code on request). +

+ +

+You can see what I'm currently up to on my now page. +

+

+I maintain a list of the gear / tools I use here. +

+

Contact Me

+

+If you'd like to reach me, the best way to do so is by email. My email +address is nick at <this domain>. Please add my +address to your whitelist, otherwise any responses I send may be sent to +spam, or worse, silently dropped. I try to respond within 24 hours, +so if you haven't heard from me by then, either check your spam folder or +send me another email. +

+
diff --git a/content/pages/home.html b/content/pages/home.html new file mode 100644 index 0000000..c2336de --- /dev/null +++ b/content/pages/home.html @@ -0,0 +1,3 @@ + + Home + diff --git a/content/pages/index.html b/content/pages/index.html new file mode 100644 index 0000000..c6ce211 --- /dev/null +++ b/content/pages/index.html @@ -0,0 +1,5 @@ + + Hello + + + diff --git a/content/pages/logs.html b/content/pages/logs.html new file mode 100644 index 0000000..eea592b --- /dev/null +++ b/content/pages/logs.html @@ -0,0 +1,25 @@ + + Logs + + +

Logs

+

+I have a terrible memory, so I try to keep track of various media that I've +enjoyed here. Think of it kind of like Goodreads :) +

+ +

+Everything is rated out of 10, with the general scale as follows: +

10: All time favorite
+
9: Almost perfect
+
8: Really good
+
7: Good
+
6: Decent
+
5: Meh
+
4: Not my thing
+
3: Really not my thing
+
2: Bad, but maybe someone out there would like it
+
1: Awful
+

+ + diff --git a/content/pages/nav.html b/content/pages/nav.html new file mode 100644 index 0000000..0526722 --- /dev/null +++ b/content/pages/nav.html @@ -0,0 +1,13 @@ + + Sitemap + + +

Site map

+ + diff --git a/content/pages/now.html b/content/pages/now.html new file mode 100644 index 0000000..2d3a943 --- /dev/null +++ b/content/pages/now.html @@ -0,0 +1,7 @@ + + Now + + + +

Now

+ diff --git a/content/pages/uses.html b/content/pages/uses.html new file mode 100644 index 0000000..bfe5060 --- /dev/null +++ b/content/pages/uses.html @@ -0,0 +1,80 @@ + + Uses This + + +

Uses This

+

Inspired by usesthis.

+ +
+

Computing

+
+

Desktop

+

Built February 2022

+
    +
  • Case: Corsair 4000D Airflow
  • +
  • Motherboard: Asus PRIME Z690-P D4
  • +
  • Processor: i7-12700k
  • +
  • GPU: EVGA GeForce RTX 3060 Ti FTW Ultra Gaming
  • +
  • RAM: 32GB DDR4 @ 3600MHz
  • +
  • Cooler: Scythe FUMA 2
  • +
  • Power Supply: Corsair RM750x (2021)
  • +
  • Drive: Samsung 970 Evo Plus 1TB
  • +
  • Operating System: Arch Linux
  • +
  • Mouse: Pulsar Xlite V2 mini Wireless
  • +
  • Headphones: Sennheiser HD 560 S
  • +
  • Microphone: Samson Technologies Q2U Dynamic Microphone
  • +
  • Mouse pad: ARTISAN Raiden XL
  • +
+
+
+

Laptop

+

+Lenovo Thinkpad T440s, bought sometime in ~2013. Running Arch Linux. +Modded with a 3-button touchpad. Looking to replace this at some point +in the near future. +

+
+
+

Keyboard

+

+Self-built +Ferris Sweep, with +Choc Purpz. +

+

+
+

Tools

+
    +
  • Text editor: Emacs
  • +
  • Terminal emulator: kitty
  • +
  • Interactive shell: fish
  • +
  • Browser: Firefox
  • +
+
+
+ +
+

Art

+
    +
  • Digital art software: Krita
  • +
  • Tablet: Wacom Intuous S
  • +
  • Sketchbook: Some cheap hardcover notebooks from Amazon
  • +
  • Pens: Mr. Pen Multiliners
  • +
  • Mechanical Pencil: uni Kuru Toga Roulette
  • +
+
+ +
+

Other

+
+ +
+

Updates

+
    +
  • 2023-01-12: Created this page
  • +
+
+ +
+

Archive

+
diff --git a/content/pages/work.html b/content/pages/work.html new file mode 100644 index 0000000..e1677d5 --- /dev/null +++ b/content/pages/work.html @@ -0,0 +1,15 @@ + + Work + + +

Work

+ +

+I am currently looking for work! If you'd like to contact me, see +here. +

+

+My full résumé is available here. +

+ + diff --git a/content/static/images/author.png b/content/static/images/author.png new file mode 100644 index 0000000..b19b0b2 Binary files /dev/null and b/content/static/images/author.png differ diff --git a/css/resume.less b/css/resume.less new file mode 100644 index 0000000..5ed3bdd --- /dev/null +++ b/css/resume.less @@ -0,0 +1,165 @@ +/* Reset */ +*, *::before, *::after { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +:root { + min-width: 100vw; + min-height: 100vh; +} + +body { + padding: 0; + margin: 0; +} + +/* Style */ +:root { + font-family: "Inter"; + font-size: 18pt; +} + +body { + padding: 1.5rem; + line-height: 1.3; + max-width: 100ch; + margin: 0 auto; +} + +a { + color: inherit; +} + +.info { + display: grid; + grid-template-columns: 1fr min-content; + + .name { + grid-row: 1 / 3; + font-size: 2rem; + } + + margin-bottom: 0.5em; +} + +section { + header { + font-size: 1.5rem; + margin-bottom: 0.15rem; + } + + margin-bottom: 0.5em; +} + +.experience { + display: grid; + grid-template-columns: max-content 1fr max-content; + margin-bottom: 0.5em; + + .title { + font-weight: 600; + } + + .company { + font-style: italic; + + &::before { + font-style: normal; + display: inline-block; + content: "\00a0|\00a0"; + } + } + + .skills { + grid-column: 1 / 4; + } + + .highlights { + grid-column: 1 / 4; + font-size: 0.9rem; + + padding-left: 1em; + } +} + +.projects { + display: grid; + grid-template-columns: 1fr 1fr; + + aside { + display: flex; + align-items: center; + justify-content: flex-end; + font-style: italic; + text-align: right; + font-size: 0.8rem; + } + + .project { + display: grid; + grid-template-columns: max-content 1fr; + grid-template-rows: repeat(2, min-content); + + .name { + font-weight: 600; + } + + .skills { + &::before { + font-style: normal; + display: inline-block; + content: "\00a0|\00a0"; + } + } + + .description { + grid-column: 1 / 3; + } + } +} + + +.education { + display: grid; + grid-template-columns: fit-content(100%) max-content; + + header { + grid-column: 1 / 3; + } + + .university { + font-weight: 600; + + &::after { + font-weight: normal; + display: inline-block; + content: "\00a0\2014\00a0" + } + } + + .degree { + grid-column: 1 / 3; + } +} + + +@media print { + body { + padding: 0; + margin: 1.5rem; + } + + @page { + margin: 0; + } + + :root { + font-size: 14pt; + } + + section.projects { + padding-top: 22px; + } +} diff --git a/css/style.less b/css/style.less new file mode 100644 index 0000000..054055c --- /dev/null +++ b/css/style.less @@ -0,0 +1,171 @@ +/* Reset */ +*, *::before, *::after { + box-sizing: border-box; +} + +:root { + min-width: 100vw; + min-height: 100vh; +} + +body { + padding: 0; + margin: 0; +} + +ul, ol { + margin: 0; +} + +blockquote { + margin: 0; +} + +h1, h2, h3, h4, h5, h6 { + font-size: unset; + margin: 0; + font-style: unset; + font-weight: unset; +} + +p { + margin: 0; + line-height: unset; +} + +/* Site Elements */ +:root { + --background: black; + --foreground: white; + --base-font-size: 18pt; + + background: var(--background); + color: var(--foreground); + font-size: 18pt; + font-family: sans; +} + +a { + position: relative; + color: inherit; + text-decoration: underline; + + &[href^="http"]::after { + display: inline-block; + content: "🡕"; + margin-left: 3px; + font-weight: bold; + font-size: 0.85em; + } + + &:hover { + text-decoration-thickness: 3px; + } +} + +nav { + padding: 1em; + ul { + padding: 0; + display: flex; + flex-direction: row; + flex-wrap: wrap; + + li { + list-style: none; + margin-right: 1em; + } + } +} + +main { + margin: 1rem auto; + padding: 0 1em; + max-width: 75ch; + display: flex; + flex-direction: column; +} + +.home-quote { + font-size: 1.25rem; + margin: 1.5em; + + cite { + font-style: normal; + font-size: 1.1rem; + margin-top: 1em; + display: block; + + &::before { + display: inline-block; + content: "\2014\00a0"; + } + } +} + +img.author { + float: left; + max-width: 256px; + margin-right: 2em; + margin-bottom: 2em; +} + +p { + margin-bottom: 1em; +} + +h1 { + font-size: 2.2rem; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +h2 { + font-size: 1.8rem; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +h3 { + font-size: 1.4rem; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +h4 { + font-size: 1.2rem; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +.now { + section { + margin-bottom: 1em; + } + + .date { + font-weight: bold; + } +} + +.nobreak { + display: inline-block; +} + +.full-bleed { + width: 100vw; + margin-left: calc(50% - 50vw); +} + +table { + border-spacing: 25px 10px; +} + +table.work { + max-width: 85vw; + margin: 0 auto; +} + +.hidden { + display: none; +} diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..6e5bef3 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +./build.sh + +rsync -avz -e 'ssh -p 8022' build/* root@idylls.net:/var/www/htdocs/idylls.net/ diff --git a/gen/main.ts b/gen/main.ts new file mode 100644 index 0000000..f754b3a --- /dev/null +++ b/gen/main.ts @@ -0,0 +1,18 @@ +import { buildPages } from "./pages/build"; + +const abort = (e: any) => { + console.error(e); + process.exit(1); +}; + +const check = (p: Promise) => p.catch(abort); + +const gen = async () => { + const bp = check(buildPages()); + + await bp; + + console.log("Generation done"); +}; + +await gen(); diff --git a/gen/pages/build.ts b/gen/pages/build.ts new file mode 100644 index 0000000..215e40c --- /dev/null +++ b/gen/pages/build.ts @@ -0,0 +1,131 @@ +import { readdir, mkdir, stat, readFile, writeFile } from "node:fs/promises"; +import { HTMLElement, parse, NodeType } from "node-html-parser"; + +import { render as renderNow } from "./now"; +import { render as renderHomeQuote } from "./quote"; +import { render as renderLogs } from "./logs"; +import { render as renderWork, renderResume } from "./work"; + +const walkdir = async (path: string) => { + const paths = await readdir(path); + const out = [] as string[]; + + for (const p of paths) { + const p_ = `${path}/${p}`; + const st = await stat(p_); + if (st.isDirectory()) { + // TODO: do something special + continue; + } + + out.push(p_); + } + + return out; +}; + +const RENDERERS = { + "x-meta": () => "", + "x-now": renderNow, + "x-logs": renderLogs, + "x-home-quote": renderHomeQuote, + "x-work": renderWork, +}; +const renderElement = (el: HTMLElement) => { + if (el.nodeType == NodeType.TEXT_NODE) { + return el.rawText; + } + + const renderer = RENDERERS[el.tagName.toLowerCase()] ?? renderBasic; + + return renderer(el); +}; + +const renderBasic = (el: HTMLElement) => { + const tag = el.tagName.toLowerCase(); + + let out = `<${tag}`; + for (const attr in el.attributes) { + out += ` ${attr}="${el.attributes[attr]}"`; + } + out += ">"; + + const children = el.childNodes.map(renderElement).join(""); + out += children; + out += ``; + + return out; +}; + +const buildPage = async (pagePath: string) => { + const contents = (await readFile(pagePath)).toString(); + const parsed = parse(contents); + + const pageOpts = (() => { + const el = parsed.querySelector("x-meta"); + if (!el) { + return { + title: null, + }; + } + + const title = el.querySelector("title"); + + return { + title: title?.innerText ?? null, + }; + })(); + + const els = parsed.childNodes.map(renderElement).join(""); + const rendered = ` + + + + + + + +${ + pageOpts.title + ? `${pageOpts.title} - idylls.net` + : "idylls.net" +} + + + +
+${els} +
+ + +`; + + const [, p] = pagePath.split("content/pages/"); + const outPath = `build/${p}`; + + return writeFile(outPath, rendered); +}; + +export const buildPages = async () => { + await mkdir("build/", { recursive: true }); + + const paths = await walkdir("content/pages"); + + for (const p of paths) { + await buildPage(p); + } + + const resumeContent = renderResume(); + + await writeFile("build/resume.html", resumeContent); +}; diff --git a/gen/pages/logs.ts b/gen/pages/logs.ts new file mode 100644 index 0000000..cb2688f --- /dev/null +++ b/gen/pages/logs.ts @@ -0,0 +1,165 @@ +import { isoDateStr } from "../util"; + +type LogBase = { + name: string; + started?: Date; + finished?: Date; + dropped?: true; + rating?: number; + picUrl?: string; +}; + +const status = (log: LogBase) => { + if (log.dropped) { + return "dropped" as const; + } + + if (!log.started && !log.finished && !log.rating) { + return "wantTo" as const; + } + + if (log.started && !log.finished) { + return "inProgress" as const; + } + + if (log.finished || log.rating) { + return "finished" as const; + } + + throw new Error("unreachable"); +}; + +const byStatusSorted = (items: LogBase[]) => { + const inProgress = items.filter((i) => status(i) == "inProgress"); + inProgress.sort((a, b) => +(a.started ?? 0) - +(b.started ?? 0)); + + const finished = items.filter((i) => status(i) == "finished"); + finished.sort((a, b) => (b.rating ?? 0) - (a.rating ?? 0)); + + const wantTo = items.filter((i) => status(i) == "wantTo"); + wantTo.sort((a, b) => a.name.localeCompare(b.name)); + + const dropped = items.filter((i) => status(i) == "dropped"); + dropped.sort((a, b) => +((a.started ?? 0) > (b.started ?? 0))); + + return { dropped, wantTo, finished, inProgress }; +}; + +type Anime = LogBase & { season?: number }; +const ANIME: Anime[] = [ + { + name: "Violet Evergarden", + rating: 10, + }, + { + name: "Sugar Apple Fairy Tale", + started: new Date("2023-01-22"), + }, + { + name: "REVENGER", + started: new Date("2023-01-21"), + }, + { + name: "Ice Guy and the Cool Female Colleague", + }, + { + name: "High Card", + started: new Date("2023-01-21"), + }, + { + name: "Bocchi the Rock!", + started: new Date("2023-01-12"), + season: 1, + }, + { + name: "Blue Period", + started: new Date("2023-01-02"), + finished: new Date("2023-01-12"), + season: 1, + rating: 10, + }, + { + name: "Chainsaw Man", + started: new Date("2022-12-01"), + finished: new Date("2023-01-04"), + season: 1, + rating: 7.5, + }, + { + name: "Do it Yourself!!", + started: new Date("2022-12-01"), + season: 1, + }, + { + name: "Cyberpunk: Edgerunners", + season: 1, + rating: 10, + }, + { + name: "The Bear", + rating: 8, + }, + { + name: "The Witcher", + rating: 9, + }, + { + name: "Arcane", + rating: 10, + }, + { + name: "Castlevania", + rating: 10, + }, + { + name: "Over the Garden Wall", + rating: 10, + }, +]; +const renderAnime = () => { + const renderSection = (title: string, items: Anime[]) => { + let out = `

${title}

`; + for (const a of items) { + out += `

${a.name}`; + if (a.season) { + out += `, Season ${a.season}`; + } + out += "

"; + + if (a.started) { + out += `
Started: ${isoDateStr(a.started)}
`; + } + + if (a.finished) { + out += `
Finished: ${isoDateStr( + a.finished, + )}
`; + } + + if (a.rating) { + out += `
Rating: ${a.rating} / 10
`; + } + + out += "
"; + } + out += "
"; + + return out; + }; + + const { wantTo, dropped, finished, inProgress } = byStatusSorted(ANIME); + + return ` +
+

Anime / TV

+ ${renderSection("Currently Watching", inProgress)} + ${renderSection("Finished", finished)} + ${renderSection("Dropped", dropped)} + ${renderSection("Want to Watch", wantTo)} +
+ `; +}; + +export const render = () => { + return renderAnime(); +}; diff --git a/gen/pages/now.ts b/gen/pages/now.ts new file mode 100644 index 0000000..8476c2b --- /dev/null +++ b/gen/pages/now.ts @@ -0,0 +1,95 @@ +import { isoDateStr, dbg } from "../util"; + +type EntryKind = + | { + kind: "free"; + text: string; + } + | { + kind: "listeningTo"; + artist: string; + song: string; + url?: string; + } + | { + kind: "workingOn"; + what: string; + url?: string; + }; +type Entry = { + date: Date; + entries: EntryKind[]; +}; + +const ENTRIES: Entry[] = [ + { + date: new Date("2023-01-10"), + entries: [{ kind: "workingOn", what: "this site!" }], + }, + { + date: new Date("2023-01-18"), + entries: [ + { kind: "free", text: "Looking for work!" }, + { + kind: "listeningTo", + artist: "Saint Pepsi", + song: "Better", + url: "https://music.youtube.com/watch?v=WYvji5AXOfk", + }, + ], + }, + { + date: new Date("2023-01-12"), + entries: [ + { + kind: "listeningTo", + artist: "Darius (feat. Amaria)", + song: "FADED", + url: "https://music.youtube.com/watch?v=SfTOJ9PeQlY", + }, + ], + }, +]; + +export const render = () => { + const entries = [...ENTRIES]; + entries.sort((a, b) => +b.date - +a.date); + + let out = '
'; + for (const entry of entries) { + out += ` +
+
+ ${isoDateStr(entry.date)} +
`; + + for (const en of entry.entries) { + switch (en.kind) { + case "workingOn": + out += `
Working on: ${en.what}
`; + break; + case "free": + out += `
${en.text}
`; + break; + case "listeningTo": + out += ` + + `; + break; + } + } + + out += `
`; + } + + out += "
"; + + return out; +}; diff --git a/gen/pages/quote.ts b/gen/pages/quote.ts new file mode 100644 index 0000000..de39c00 --- /dev/null +++ b/gen/pages/quote.ts @@ -0,0 +1,18 @@ +// TODO: now that this is in typescript, maybe share quote list and +// dynamically pick one here? + +export const render = () => ` +
+
+ The world ain't all sunshine and rainbows. It's a very mean and + nasty place, and I don't care how tough you are it will beat you + to your knees and keep you there permanently if you let it. You, + me, or nobody is gonna hit as hard as life. But it ain't about + how hard you hit. It's about how hard you can get hit and keep + moving forward. How much you can take and keep moving forward. + That's how winning is done! + Rocky +
+ +
+`; diff --git a/gen/pages/work.ts b/gen/pages/work.ts new file mode 100644 index 0000000..9f8e9a4 --- /dev/null +++ b/gen/pages/work.ts @@ -0,0 +1,327 @@ +import { isoDateStr } from "../util"; + +type Info = { + name: string; + emailAddress: string; + website: string; +}; + +type Education = { + university: string; + college: string; + graduationYear: number; + degree: string; +}; + +type Timeframe = { start: Date; end?: Date } | string; + +type Skill = + | "TypeScript" + | "React" + | "Python" + | "Django" + | "CSS" + | "SCSS" + | "PostgreSQL" + | "Java" + | "Go" + | "MongoDB" + | "WordPress" + | "PHP" + | "Kotlin" + | "HTML" + | "Elixir" + | "Phoenix" + | "JavaScript" + | "Docker" + | "Rust" + | "C++" + | "C" + | "Haskell" + | "GraphQL"; + +type Experience = { + companyName: string; + title: string; + skills: Skill[]; + timeframe: Timeframe; + highlights: string[]; +}; + +type Project = { + name: string; + skills: Skill[]; + description: string; + link?: string; +}; + +type Resume = { + info: Info; + education: Education; + experiences: Experience[]; + selectedProjects: Project[]; + skills: Skill[]; +}; + +const RESUME: Resume = { + info: { + name: "Nick", + emailAddress: "hello@idylls.net", + website: "https://idylls.net", + }, + education: { + university: "Northeastern University", + college: "Khoury College of Computer Sciences", + degree: "Bachelor of Science in Computer Science with Honors, Cum Laude", + graduationYear: 2019, + }, + experiences: [ + { + companyName: "Massachusetts Bay Transportation Authority", + title: "Full Stack Software Engineer", + highlights: [ + "Led maintenance and development of critical, high-availability service delivering transit alerts to riders via both SMS and email", + "Developed and deployed various improvements to public-facing rider website", + ], + skills: [ + "Elixir", + "Phoenix", + "TypeScript", + "JavaScript", + "SCSS", + "Docker", + "PostgreSQL", + ], + timeframe: "2022", + }, + { + companyName: "KickUp", + title: "Full Stack Software Engineer", + highlights: [ + "Designed and implemented several features improving client abilities to visualize, analyze, and action teacher growth data", + "Led effort to integrate TypeScript into existing JavaScript codebase, as well as provided mentorship to other team members", + ], + skills: [ + "TypeScript", + "JavaScript", + "React", + "Python", + "Django", + "CSS", + "PostgreSQL", + "GraphQL", + ], + timeframe: { + start: new Date("2020-10-01"), + end: new Date("2022-02-01"), + }, + }, + { + companyName: "TripAdvisor", + title: "Full Stack Software Engineer", + highlights: [ + "Led design and implementation of project surfacing location outliers to suppliers, increasing sales and click-through rate on 10% of products", + "Implemented improved online photo editor, increasing the percentage of listings with owner-provided photos by 5%", + ], + timeframe: { + start: new Date("2019-09-01"), + end: new Date("2020-06-01"), + }, + skills: ["Java", "JavaScript", "React", "CSS", "PostgreSQL", "GraphQL"], + }, + { + companyName: "TripAdvisor, Rentals", + title: "Full Stack Engineering Co-op", + highlights: [ + "Assisted in redesigning the external calendar syncing system, reducing the time to update hundreds of thousands of external calendars from hours to fifteen minutes", + "Designed, developed, and tested endpoints for internal and external REST APIs in a large Java codebase, as well as modified user-facing web pages", + ], + timeframe: "Spring/Summer 2018", + skills: ["Java", "JavaScript", "CSS"], + }, + { + companyName: "clypd", + title: "Backend Engineering Co-op", + highlights: [ + "Acted as feature lead on redesign of large portions of existing API to surface additional data and improve ergonomics for major analytics project", + "Organized meetups originally related to Rust but later expanding to general code jams", + ], + skills: ["Go", "PostgreSQL"], + timeframe: "Spring/Summer 2017", + }, + { + companyName: "I'm From the Future", + title: "Junior Full Stack Software Engineer", + highlights: [ + "Led development on an internal marketing tool using React, D3.js, PhantomJS, and MongoDB", + ], + skills: ["PHP", "JavaScript", "React", "MongoDB", "CSS", "WordPress"], + timeframe: "Summer/Fall 2016", + }, + { + companyName: "ProTech Internet Group", + title: "Junior Web Developer", + skills: ["PHP", "JavaScript", "CSS", "WordPress"], + timeframe: { + start: new Date("2015-06-01"), + end: new Date("2016-06-01"), + }, + highlights: [], + }, + { + companyName: "SiteTechs", + title: "Web Content Admin", + skills: ["JavaScript", "HTML", "CSS", "WordPress"], + timeframe: { + start: new Date("2012-06-01"), + end: new Date("2015-09-01"), + }, + highlights: [], + }, + ], + selectedProjects: [ + { + name: "Pathos", + description: + "An Old School RuneScape plugin for displaying pathing information", + skills: ["Kotlin"], + link: "https://git.idylls.net/idylls/pathos", + }, + { + name: "Statue", + description: "A lightweight web host / service status monitor", + skills: ["Rust", "TypeScript"], + link: "https://status.idylls.net", + }, + ], + skills: ["Rust", "TypeScript", "C++", "C", "Haskell", "Java"], +}; + +export const renderResume = () => { + const renderInfo = () => ` +
+
${RESUME.info.name}
+ + +
+ `; + const renderExperiences = () => { + let out = `
Experience
`; + + for (const e of RESUME.experiences) { + out += `
`; + + out += `
${e.title}
`; + out += `
${e.companyName}
`; + out += `
${renderTimeframe(e.timeframe)}
`; + out += `
${e.skills.join(", ")}
`; + + out += `
    `; + for (const h of e.highlights) { + out += `
  • ${h}
  • `; + } + out += `
`; + + out += `
`; + } + + out += `
`; + + return out; + }; + const renderProjects = () => { + let out = `
Selected Projects
`; + out += ``; + + for (const p of RESUME.selectedProjects) { + out += `
`; + + out += `
${p.name}
`; + out += `
${p.skills.join(", ")}
`; + out += `
${p.description}
`; + + out += `
`; + } + + out += "
"; + + return out; + }; + const renderEducation = () => ` +
+
Education
+
${RESUME.education.university}
+
${RESUME.education.college} Class of ${RESUME.education.graduationYear}
+
${RESUME.education.degree}
+
+ `; + + const renderSkills = () => ` +
+
Skills
+
${RESUME.skills.join(", ")}
+
+ `; + + return ` + + + + + + +Résumé + + +${renderInfo()} +${renderExperiences()} +${renderProjects()} +${renderEducation()} +${renderSkills()} + + + `; +}; + +const renderTimeframe = (t: Timeframe) => { + if (typeof t == "string") { + return t; + } + + return `${t.start.getFullYear()} — ${ + t.end ? t.end.getFullYear() : "Present" + }`; +}; + +export const render = () => { + let out = ` +
+ + + + + + + + + +`; + + for (const e of RESUME.experiences) { + out += ` + + + + + +`; + } + + out += `
CompanyTitleTimeframe
${e.companyName}${e.title}${renderTimeframe(e.timeframe)}
`; + + return out; +}; diff --git a/gen/util.ts b/gen/util.ts new file mode 100644 index 0000000..43b3872 --- /dev/null +++ b/gen/util.ts @@ -0,0 +1,11 @@ +export const isoDateStr = (date: Date) => + `${date.getUTCFullYear()}-${`${date.getUTCMonth() + 1}`.padStart( + 2, + "0", + )}-${`${date.getUTCDate()}`.padStart(2, "0")}`; + +export const dbg = (a: T) => { + console.debug(a); + + return a; +}; diff --git a/js/bundle.ts b/js/bundle.ts new file mode 100644 index 0000000..f2978da --- /dev/null +++ b/js/bundle.ts @@ -0,0 +1,3 @@ +import { init as initQuote } from "./quote"; + +window["initQuote"] = initQuote; diff --git a/js/quote.ts b/js/quote.ts new file mode 100644 index 0000000..8b21bcb --- /dev/null +++ b/js/quote.ts @@ -0,0 +1,55 @@ +import { swel } from "swel"; + +const QUOTES = [ + [ + "The world ain't all sunshine and rainbows. It's a very mean and nasty place, and I don't care how tough you are it will beat you to your knees and keep you there permanently if you let it. You, me, or nobody is gonna hit as hard as life. But it ain't about how hard you hit. It's about how hard you can get hit and keep moving forward. How much you can take and keep moving forward. That's how winning is done!", + "Rocky", + ] as const, + [ + "Almost dead yesterday, maybe dead tomorrow, but alive, gloriously alive, today", + "Robert Jordan, Lord of Chaos", + ] as const, + [ + "Those who build walls are their own prisoners", + "Ursula K. Le Guin, The Dispossessed", + ] as const, + [ + "I have no right to call myself one who knows. I was one who \ + seeks, and I still am, but I no longer seek in the stars or in \ + the books; I’m beginning to hear the teachings of my blood \ + pulsing within me. My story isn’t pleasant. It’s not sweet and \ + harmonious like invented stories. It tastes of folly and \ + bewilderment, of madness and dream, like the life of all people \ + who no longer want to lie to themselves.", + "Herman Hesse", + ] as const, + [ + "In the depth of winter, I finally learned that within me there \ + lay and invincible summer", + "Albert Camus", + ] as const, + [ + "Life, although it may only be an accumulation of anguish, is \ + dear to me, and I will defend it.", + "Mary Shelley, Frankenstein", + ] as const, + [ + "Who but a god can go through life unmarked?", + "Aeschylus, Agamemnon", + ] as const, + ["Don't you dare go Hollow.", "Laurentius, Dark Souls"] as const, +]; + +export const init = () => { + const el = document.querySelector(".home-quote"); + if (!el) { + return; + } + + const [quote, cite] = QUOTES[Math.floor(Math.random() * QUOTES.length)]; + + const citeEl = swel("cite"); + citeEl.innerHTML = cite; + const bq = swel("blockquote", [quote, citeEl]); + el.replaceChildren(bq); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3a88539 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1229 @@ +{ + "name": "sike", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "sike", + "version": "0.0.0", + "devDependencies": { + "bun-types": "^0.5.0", + "esbuild": "^0.16.17", + "less": "^4.1.3", + "node-html-parser": "^6.1.4", + "swel": "file:../swel" + } + }, + "../swel": { + "version": "0.0.0", + "dev": true, + "license": "UNLICENSED" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bun-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-0.5.0.tgz", + "integrity": "sha512-W74XkTKdOP2HV1PbzL7k6+8TZlcJyj1IuD7y9wX2SiHIaVjlqVwM9fXgsCvTlQQqkkkyZxSPSDFF10J6qml2eA==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "optional": true + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-html-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.4.tgz", + "integrity": "sha512-3muP9Uy/Pz7bQa9TNYVQzWJhNZMqyCx7xJle8kz2/y1UgzAUyXXShc1IcPaJy6u07CE3K5rQcRwlvHzmlySRjg==", + "dev": true, + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/swel": { + "resolved": "../swel", + "link": true + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "bun-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-0.5.0.tgz", + "integrity": "sha512-W74XkTKdOP2HV1PbzL7k6+8TZlcJyj1IuD7y9wX2SiHIaVjlqVwM9fXgsCvTlQQqkkkyZxSPSDFF10J6qml2eA==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "optional": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + } + }, + "node-html-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.4.tgz", + "integrity": "sha512-3muP9Uy/Pz7bQa9TNYVQzWJhNZMqyCx7xJle8kz2/y1UgzAUyXXShc1IcPaJy6u07CE3K5rQcRwlvHzmlySRjg==", + "dev": true, + "requires": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "swel": { + "version": "file:../swel" + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..36916a6 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "sike", + "type": "module", + "version": "0.0.0", + "description": "", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "devDependencies": { + "bun-types": "^0.5.0", + "esbuild": "^0.16.17", + "less": "^4.1.3", + "node-html-parser": "^6.1.4", + "swel": "file:../swel" + } +} diff --git a/prettier.config.cjs b/prettier.config.cjs new file mode 100644 index 0000000..13a984f --- /dev/null +++ b/prettier.config.cjs @@ -0,0 +1,11 @@ +module.exports = { + printWidth: 80, + useTabs: true, + semi: true, + singleQuote: false, + quoteProps: "as-needed", + trailingComma: "all", + bracketSpacing: true, + arrowParens: "always", + parser: "typescript", +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..551699e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "noEmit": true, + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "noUncheckedIndexedAccess": true, + "strictNullChecks": true, + "exactOptionalPropertyTypes": true, + "noImplicitOverride": true, + "checkJs": true, + "allowJs": true, + "types": ["bun-types"] + }, + "include": ["gen/**/*.ts", "gen/**/*.js"], + "exclude": ["node_modules"] +}