From 7adf03c83fd3fbdef5c4308bff640c9ccd5691a6 Mon Sep 17 00:00:00 2001 From: Morten Olsen Date: Tue, 28 Mar 2023 08:10:46 +0200 Subject: [PATCH] cleanup --- .eslintrc | 12 + .prettierrc.json | 14 + bin/build/data.ts | 31 + bin/build/index.ts | 99 +- bin/build/templates.ts | 17 + bin/bundler/index.ts | 8 +- bin/data/articles/index.ts | 27 +- bin/data/positions/index.ts | 24 +- bin/data/profile/index.ts | 22 +- bin/dev/server.ts | 59 +- bin/index.ts | 40 +- bin/observable/index.test.ts | 20 +- bin/observable/index.ts | 4 +- bin/observable/observable.ts | 14 +- bin/observable/utils.ts | 2 +- bin/resources/ejs/index.ts | 4 +- bin/resources/file/index.ts | 22 +- bin/resources/glob/index.ts | 21 +- bin/resources/image/index.ts | 11 +- bin/resources/latex/index.ts | 14 +- bin/resources/latex/utils.ts | 10 +- bin/resources/page/index.ts | 22 +- bin/resources/react/index.ts | 52 +- bin/resources/script/index.ts | 14 +- bin/utils/markdown/index.ts | 30 +- bin/utils/markdown/latex.ts | 34 +- bin/utils/observable/index.ts | 10 +- content/config.ts | 31 + content/resume/positions/zeronorth/main.md | 2 +- content/templates/latex/article.tex | 23 +- .../react/components/article/grid/index.tsx | 14 +- .../components/article/preview/index.tsx | 20 +- .../components/article/preview/jumbo.tsx | 12 +- .../react/components/article/preview/mini.tsx | 20 +- .../templates/react/components/html/index.tsx | 9 +- .../react/components/sheet/index.tsx | 12 +- .../{article.tsx => pages/article/index.tsx} | 42 +- .../frontpage/index.tsx} | 40 +- content/templates/react/theme/create.ts | 9 +- content/templates/react/theme/global.d.ts | 1 - content/templates/react/typography/index.tsx | 46 +- package.json | 3 + pnpm-lock.yaml | 1241 ++++++++++++++++- types/config.ts | 29 + 44 files changed, 1780 insertions(+), 411 deletions(-) create mode 100644 .eslintrc create mode 100644 .prettierrc.json create mode 100644 bin/build/data.ts create mode 100644 bin/build/templates.ts create mode 100644 content/config.ts rename content/templates/react/{article.tsx => pages/article/index.tsx} (86%) rename content/templates/react/{frontpage.tsx => pages/frontpage/index.tsx} (77%) create mode 100644 types/config.ts diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..0545416 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,12 @@ +{ + "extends": "@react-native-community", + "rules": { + "react/react-in-jsx-scope": 0, + "prettier/prettier": [ + "error", + { + "singleQuote": true + } + ] + } +} diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..a51e95b --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,14 @@ +{ + "semi": true, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": false, + "printWidth": 100, + "arrowParens": "always", + "htmlWhitespaceSensitivity": "css", + "bracketSpacing": true, + "quoteProps": "as-needed", + "trailingComma": "all" +} diff --git a/bin/build/data.ts b/bin/build/data.ts new file mode 100644 index 0000000..cac983f --- /dev/null +++ b/bin/build/data.ts @@ -0,0 +1,31 @@ +import { Config } from '../../types/config'; +import { Bundler } from '../bundler'; +import { createArticles } from '../data/articles'; +import { createPositions } from '../data/positions'; +import { createProfile } from '../data/profile'; + +type GetDataOptions = { + cwd: string; + config: Config; + bundler: Bundler; +}; + +const getData = ({ cwd, config, bundler }: GetDataOptions) => ({ + articles: createArticles({ + cwd, + pattern: config.articles.pattern, + bundler, + }), + positions: createPositions({ + cwd, + pattern: config.positions.pattern, + bundler, + }), + profile: createProfile({ + cwd, + path: config.profile.path, + bundler, + }), +}); + +export { getData }; diff --git a/bin/build/index.ts b/bin/build/index.ts index 1b3950b..c2ed450 100644 --- a/bin/build/index.ts +++ b/bin/build/index.ts @@ -1,47 +1,33 @@ -import { resolve } from "path"; -import { createReact } from "../resources/react"; -import { Observable, getCollectionItems } from "../observable"; -import { createPage } from "../resources/page"; -import { createArticles } from "../data/articles"; -import { Bundler } from "../bundler"; -import { forEach } from "../utils/observable"; -import { createEjs } from "../resources/ejs"; -import { createLatex } from "../resources/latex"; -import { markdownToLatex } from "../utils/markdown"; -import { createPositions } from "../data/positions"; -import { createProfile } from "../data/profile"; -import { Position } from "../../types"; +import { resolve } from 'path'; +import { Observable, getCollectionItems } from '../observable'; +import { createPage } from '../resources/page'; +import { Bundler } from '../bundler'; +import { forEach } from '../utils/observable'; +import { createLatex } from '../resources/latex'; +import { markdownToLatex } from '../utils/markdown'; +import { Position } from '../../types'; +import { Config } from '../../types/config'; +import { getTemplates } from './templates'; +import { getData } from './data'; -const build = async () => { +const build = async (cwd: string, config: Config) => { const bundler = new Bundler(); - const articles = createArticles({ - bundler, - }); - const positions = createPositions({ - bundler, - }); - const profile = createProfile({ + const data = getData({ + cwd, + config, bundler, }); + const templates = getTemplates(cwd, config); - const latex = { - article: createEjs(resolve("content/templates/latex/article.tex")), - resume: createEjs(resolve("content/templates/latex/resume.tex")), - }; - - const react = { - article: createReact(resolve("content/templates/react/article.tsx")), - frontpage: createReact(resolve("content/templates/react/frontpage.tsx")), - }; - - const resumeProps = Observable.combine({ - articles: articles.pipe(getCollectionItems), - positions: positions.pipe(async (positions) => { + const resumeData = Observable.combine({ + articles: data.articles.pipe(getCollectionItems), + // TODO: collection observer + positions: data.positions.pipe(async (positions) => { const result: Position[] = []; for (const a of positions) { const item = await a.data; const content = markdownToLatex({ - root: resolve("content"), + root: resolve('content'), content: item.raw, }); result.push({ @@ -51,38 +37,43 @@ const build = async () => { } return result; }), - profile, + profile: data.profile, + }); + + resumeData.subscribe(() => { + console.log('resume'); }); const resumeUrl = createLatex({ bundler, - path: "/resume", - data: resumeProps, - template: latex.resume, + path: '/resume', + data: resumeData, + template: templates.latex.resume, }); { const props = Observable.combine({ - articles: articles.pipe(getCollectionItems), - positions: positions.pipe(getCollectionItems), - profile, - resumeUrl: new Observable(async () => resumeUrl), + articles: data.articles.pipe(getCollectionItems), + positions: data.positions.pipe(getCollectionItems), + profile: data.profile, + resumeUrl: Observable.link([resumeUrl.item], async () => resumeUrl.url), }); createPage({ - path: "/", + path: '/', props, - template: react.frontpage, + template: templates.react.frontpage, bundler, }); } - await forEach(articles, async (article) => { + await forEach(data.articles, async (article) => { const { slug } = await article.data; - const pdfUrl = createLatex({ + const pdf = createLatex({ bundler, - path: resolve("/articles", slug), - template: latex.article, + path: resolve('/articles', slug), + template: templates.latex.article, data: Observable.combine({ + profile: data.profile, article: article.pipe(async ({ title, cover, root, raw }) => { const body = markdownToLatex({ root, @@ -98,14 +89,16 @@ const build = async () => { }); const props = Observable.combine({ article, - profile, - pdfUrl: new Observable(async () => pdfUrl), - resumeUrl: new Observable(async () => resumeUrl), + profile: data.profile, + pdfUrl: Observable.link([pdf.item], async () => pdf.url), + }); + article.subscribe(() => { + console.log('updated', slug); }); createPage({ path: `/articles/${slug}`, props, - template: react.article, + template: templates.react.article, bundler, }); }); diff --git a/bin/build/templates.ts b/bin/build/templates.ts new file mode 100644 index 0000000..040c38e --- /dev/null +++ b/bin/build/templates.ts @@ -0,0 +1,17 @@ +import { resolve } from 'path'; +import { Config } from '../../types/config'; +import { createEjs } from '../resources/ejs'; +import { createReact } from '../resources/react'; + +const getTemplates = (cwd: string, config: Config) => ({ + latex: { + article: createEjs(resolve(cwd, config.articles.latex.template)), + resume: createEjs(resolve(cwd, config.resume.latex.template)), + }, + react: { + article: createReact(resolve(cwd, config.articles.react.template)), + frontpage: createReact(resolve(cwd, config.frontpage.react.template)), + }, +}); + +export { getTemplates }; diff --git a/bin/bundler/index.ts b/bin/bundler/index.ts index 692cbf9..808279e 100644 --- a/bin/bundler/index.ts +++ b/bin/bundler/index.ts @@ -1,5 +1,5 @@ -import { resolve } from "path"; -import { Observable } from "../observable"; +import { resolve } from 'path'; +import { Observable } from '../observable'; type Asset = { content: string | Buffer; @@ -17,7 +17,7 @@ class Bundler { } public register = (path: string, asset: Observable) => { - const realPath = resolve("/", path); + const realPath = resolve('/', path); if (!this.#assets.has(realPath)) { this.#assets.set(realPath, asset); } @@ -25,7 +25,7 @@ class Bundler { }; public get = (path: string) => { - const realPath = resolve("/", path); + const realPath = resolve('/', path); return this.#assets.get(realPath); }; } diff --git a/bin/data/articles/index.ts b/bin/data/articles/index.ts index 8bbfd36..82cdcc1 100644 --- a/bin/data/articles/index.ts +++ b/bin/data/articles/index.ts @@ -1,19 +1,22 @@ -import { createGlob } from "../../resources/glob"; -import { createFile } from "../../resources/file"; -import grayMatter from "gray-matter"; -import { Article } from "../../../types/article"; -import { Bundler } from "../../bundler"; -import { markdownBundleImages } from "../../utils/markdown"; -import { dirname, resolve } from "path"; -import { createImage } from "../../resources/image"; +import { createGlob } from '../../resources/glob'; +import { createFile } from '../../resources/file'; +import grayMatter from 'gray-matter'; +import { Article } from '../../../types/article'; +import { Bundler } from '../../bundler'; +import { markdownBundleImages } from '../../utils/markdown'; +import { dirname, resolve } from 'path'; +import { createImage } from '../../resources/image'; type ArticleOptions = { + cwd: string; + pattern: string; bundler: Bundler; }; -const createArticles = ({ bundler }: ArticleOptions) => { +const createArticles = ({ bundler, cwd, pattern }: ArticleOptions) => { const files = createGlob({ - pattern: "content/articles/**/*.md", + pattern, + cwd, create: (path) => { const file = createFile({ path }); const article = file.pipe(async (raw) => { @@ -27,12 +30,12 @@ const createArticles = ({ bundler }: ArticleOptions) => { }); const coverUrl = createImage({ image: resolve(cwd, cover), - format: "avif", + format: 'avif', bundler, }); const thumbUrl = createImage({ image: resolve(cwd, cover), - format: "avif", + format: 'avif', width: 400, bundler, }); diff --git a/bin/data/positions/index.ts b/bin/data/positions/index.ts index 8ed0cf4..ddf8951 100644 --- a/bin/data/positions/index.ts +++ b/bin/data/positions/index.ts @@ -1,20 +1,24 @@ -import { createGlob } from "../../resources/glob"; -import { createFile } from "../../resources/file"; -import grayMatter from "gray-matter"; -import { Bundler } from "../../bundler"; -import { markdownBundleImages } from "../../utils/markdown"; -import { dirname } from "path"; -import { Position } from "../../../types"; -import { Observable } from "../../observable"; +import { createGlob } from '../../resources/glob'; +import { createFile } from '../../resources/file'; +import grayMatter from 'gray-matter'; +import { Bundler } from '../../bundler'; +import { markdownBundleImages } from '../../utils/markdown'; +import { dirname } from 'path'; +import { Position } from '../../../types'; +import { Observable } from '../../observable'; type PositionOptions = { + cwd: string; + pattern: string; bundler: Bundler; }; -const createPositions = ({ bundler }: PositionOptions) => { +const createPositions = ({ cwd, pattern, bundler }: PositionOptions) => { const files = createGlob>({ - pattern: "content/resume/positions/**/*.md", + pattern, + cwd, create: (path) => { + console.log('c', path); const file = createFile({ path }); const position = file.pipe(async (raw) => { const { data, content } = grayMatter(raw); diff --git a/bin/data/profile/index.ts b/bin/data/profile/index.ts index 134e477..13d37c9 100644 --- a/bin/data/profile/index.ts +++ b/bin/data/profile/index.ts @@ -1,27 +1,29 @@ -import { resolve } from "path"; -import { createFile } from "../../resources/file"; -import YAML from "yaml"; -import { Bundler } from "../../bundler"; -import { Profile } from "../../../types"; -import { createImage } from "../../resources/image"; +import { resolve } from 'path'; +import { createFile } from '../../resources/file'; +import YAML from 'yaml'; +import { Bundler } from '../../bundler'; +import { Profile } from '../../../types'; +import { createImage } from '../../resources/image'; type ProfileOptions = { + path: string; + cwd: string; bundler: Bundler; }; -const createProfile = ({ bundler }: ProfileOptions) => { +const createProfile = ({ cwd, path, bundler }: ProfileOptions) => { const file = createFile({ - path: resolve("content/profile.yml"), + path: resolve(cwd, path), }); const profile = file.pipe(async (yaml) => { const data = YAML.parse(yaml); - const imagePath = resolve("content", data.image); + const imagePath = resolve('content', data.image); const result: Profile = { ...data, imageUrl: createImage({ image: imagePath, - format: "avif", + format: 'webp', bundler, }), imagePath, diff --git a/bin/dev/server.ts b/bin/dev/server.ts index a0b9873..7585537 100644 --- a/bin/dev/server.ts +++ b/bin/dev/server.ts @@ -1,6 +1,6 @@ -import express, { Express } from "express"; -import { Bundler } from "../bundler"; -import { extname } from "path"; +import express, { Express } from 'express'; +import { Bundler } from '../bundler'; +import { extname } from 'path'; const createServer = (bundler: Bundler): Express => { const app = express(); @@ -8,35 +8,40 @@ const createServer = (bundler: Bundler): Express => { let path = req.path; let asset = bundler.get(path); if (!asset) { - path = path.endsWith("/") ? path + "index.html" : path + "/index.html"; + path = path.endsWith('/') ? path + 'index.html' : path + '/index.html'; asset = bundler.get(path); } if (asset) { const ext = extname(path); - asset.data.then((data) => { - if (ext === ".html") { - const unsubscribe = asset!.subscribe(async () => { - await asset?.data; - unsubscribe(); - res.end(``); - }); - res.on("close", unsubscribe); - res.on("finish", unsubscribe); - res.on("error", unsubscribe); - res.writeHead(200, { - "content-type": "text/html;charset=utf-8", - "Cache-Control": "no-cache, no-store, must-revalidate", - Pragma: "no-cache", - Expires: "0", - "keep-alive": "timeout=5, max=100", - }); - res.write(data.content.toString().replace("", "")); - } else { - res.send(data.content); - } - }); + asset.data + .then((data) => { + if (ext === '.html') { + const unsubscribe = asset!.subscribe(async () => { + await asset?.data; + unsubscribe(); + res.end(''); + }); + res.on('close', unsubscribe); + res.on('finish', unsubscribe); + res.on('error', unsubscribe); + res.writeHead(200, { + 'content-type': 'text/html;charset=utf-8', + 'Cache-Control': 'no-cache, no-store, must-revalidate', + Pragma: 'no-cache', + Expires: '0', + 'keep-alive': 'timeout=5, max=100', + }); + res.write(data.content.toString().replace('', '')); + } else { + res.send(data.content); + } + }) + .catch((err) => { + console.error(err); + res.status(500).send(err.message); + }); } else { - res.status(404).send("Not found"); + res.status(404).send('Not found'); } }); diff --git a/bin/index.ts b/bin/index.ts index fe76464..078a25f 100644 --- a/bin/index.ts +++ b/bin/index.ts @@ -1,21 +1,35 @@ -import { program } from "commander"; -import { build } from "./build"; -import { createServer } from "./dev/server"; -import { dirname, join, resolve } from "path"; -import { mkdir, rm, writeFile } from "fs/promises"; -import { existsSync } from "fs"; +import { program } from 'commander'; +import { build } from './build'; +import { createServer } from './dev/server'; +import { dirname, join, resolve } from 'path'; +import { mkdir, rm, writeFile } from 'fs/promises'; +import { existsSync } from 'fs'; -const dev = program.command("dev"); -dev.action(async () => { - const bundler = await build(); +const getConfig = (path: string) => { + const resolved = resolve(path); + const module = require(resolved); + const config = module.default || module; + return { + cwd: dirname(resolved), + config, + }; +}; + +const dev = program.command('dev'); +dev.argument('', 'Path to config file'); +dev.action(async (configLocation) => { + const { cwd, config } = getConfig(configLocation); + const bundler = await build(cwd, config); const server = createServer(bundler); server.listen(3000); }); -const bundle = program.command("build"); -bundle.action(async () => { - const bundler = await build(); - const outputDir = resolve("out"); +const bundle = program.command('build'); +bundle.argument('', 'Path to config file'); +bundle.action(async (configLocation) => { + const { cwd, config } = getConfig(configLocation); + const bundler = await build(cwd, config); + const outputDir = resolve('out'); if (existsSync(outputDir)) { rm(outputDir, { recursive: true }); } diff --git a/bin/observable/index.test.ts b/bin/observable/index.test.ts index 61b40f5..e0f4ae2 100644 --- a/bin/observable/index.test.ts +++ b/bin/observable/index.test.ts @@ -1,15 +1,15 @@ -import { Observable } from "./observable"; -import { getCollectionItems } from "./utils"; +import { Observable } from './observable'; +import { getCollectionItems } from './utils'; -describe("observable", () => { - it("should be able to create an observable", async () => { +describe('observable', () => { + it('should be able to create an observable', async () => { const observable = new Observable(() => Promise.resolve(1)); expect(observable).toBeDefined(); const data = await observable.data; expect(data).toBe(1); }); - it("should be able to combine observables", async () => { + it('should be able to combine observables', async () => { const observable1 = new Observable(() => Promise.resolve(1)); const observable2 = new Observable(() => Promise.resolve(2)); const combined = Observable.combine({ observable1, observable2 }); @@ -18,7 +18,7 @@ describe("observable", () => { expect(data.observable2).toBe(2); }); - it("should be able to update observable", async () => { + it('should be able to update observable', async () => { const observable = new Observable(() => Promise.resolve(1)); const data = await observable.data; expect(data).toBe(1); @@ -27,20 +27,20 @@ describe("observable", () => { expect(data2).toBe(2); }); - it("should be able to extract collection items", async () => { + it('should be able to extract collection items', async () => { const observable = new Observable(() => Promise.resolve([ new Observable(() => Promise.resolve(1)), new Observable(() => Promise.resolve(2)), new Observable(() => Promise.resolve(3)), - ]) + ]), ); const flatten = observable.pipe(getCollectionItems); const data = await flatten.data; expect(data).toEqual([1, 2, 3]); }); - it("should update observable when subscribed", async () => { + it('should update observable when subscribed', async () => { const observable = new Observable(() => Promise.resolve(1)); const spy = jest.fn(); observable.subscribe(spy); @@ -50,7 +50,7 @@ describe("observable", () => { expect(spy).toHaveBeenCalledTimes(1); }); - it("should update combined observable when subscribed", async () => { + it('should update combined observable when subscribed', async () => { const observable1 = new Observable(() => Promise.resolve(1)); const observable2 = new Observable(() => Promise.resolve(2)); const combined = Observable.combine({ observable1, observable2 }); diff --git a/bin/observable/index.ts b/bin/observable/index.ts index fa0111e..878a08b 100644 --- a/bin/observable/index.ts +++ b/bin/observable/index.ts @@ -1,2 +1,2 @@ -export { Observable } from "./observable"; -export { getCollectionItems } from "./utils"; +export { Observable } from './observable'; +export { getCollectionItems } from './utils'; diff --git a/bin/observable/observable.ts b/bin/observable/observable.ts index bb62be1..eebf542 100644 --- a/bin/observable/observable.ts +++ b/bin/observable/observable.ts @@ -58,7 +58,7 @@ class Observable { }; static combine = >>( - record: U + record: U, ): Observable> => { const loader = () => Object.entries(record).reduce( @@ -66,7 +66,7 @@ class Observable { ...(await accP), [key]: await value.data, }), - {} as any + {} as any, ); const observable = new Observable>(loader); Object.values(record).forEach((item) => { @@ -76,6 +76,16 @@ class Observable { }); return observable; }; + + static link = (observables: Observable[], generate: () => Promise) => { + const observable = new Observable(generate); + observables.forEach((item) => { + item.subscribe(() => { + observable.recreate(); + }); + }); + return observable; + }; } export { Observable }; diff --git a/bin/observable/utils.ts b/bin/observable/utils.ts index 2ed1d41..1223362 100644 --- a/bin/observable/utils.ts +++ b/bin/observable/utils.ts @@ -1,4 +1,4 @@ -import { Observable } from "./observable"; +import { Observable } from './observable'; const getCollectionItems = async (items: Observable[]) => { return Promise.all(items.map((item) => item.data)); diff --git a/bin/resources/ejs/index.ts b/bin/resources/ejs/index.ts index 0ac8d04..6e7a181 100644 --- a/bin/resources/ejs/index.ts +++ b/bin/resources/ejs/index.ts @@ -1,5 +1,5 @@ -import { createFile } from "../file"; -import ejs from "ejs"; +import { createFile } from '../file'; +import ejs from 'ejs'; const createEjs = (path: string) => { const file = createFile({ path }); diff --git a/bin/resources/file/index.ts b/bin/resources/file/index.ts index 46586e2..f0bad23 100644 --- a/bin/resources/file/index.ts +++ b/bin/resources/file/index.ts @@ -1,16 +1,26 @@ -import { readFile } from "fs/promises"; -import { Observable } from "../../observable"; -import { watch } from "fs"; +import { readFile } from 'fs/promises'; +import { Observable } from '../../observable'; +import { watch } from 'fs'; type FileOptions = { path: string; }; const createFile = ({ path }: FileOptions) => { - const file = new Observable(async () => readFile(path, "utf-8")); + let watcher: ReturnType | undefined; + const addWatcher = () => { + if (watcher) { + watcher.close(); + } + watcher = watch(path, () => { + file.recreate(); + addWatcher(); + }); + }; - watch(path, () => { - file.recreate(); + const file = new Observable(async () => { + addWatcher(); + return readFile(path, 'utf-8'); }); return file; diff --git a/bin/resources/glob/index.ts b/bin/resources/glob/index.ts index 59d6603..06cd236 100644 --- a/bin/resources/glob/index.ts +++ b/bin/resources/glob/index.ts @@ -1,28 +1,25 @@ -import fastGlob from "fast-glob"; -import watchGlob from "glob-watcher"; -import { Observable } from "../../observable"; +import fastGlob from 'fast-glob'; +import watchGlob from 'glob-watcher'; +import { Observable } from '../../observable'; +import { resolve } from 'path'; type GlobOptions = { - cwd?: string; + cwd: string; pattern: string; create?: (path: string) => T; }; const defaultCreate = (a: any) => a; -const createGlob = ({ - cwd, - pattern, - create = defaultCreate, -}: GlobOptions) => { +const createGlob = ({ cwd, pattern, create = defaultCreate }: GlobOptions) => { const glob = new Observable(async () => { const files = await fastGlob(pattern, { cwd }); - return files.map(create); + return files.map((path) => create(resolve(cwd, path))); }); const watcher = watchGlob(pattern, { cwd }); - watcher.on("add", (path) => { - glob.set((current) => Promise.resolve([...(current || []), create(path)])); + watcher.on('add', (path) => { + glob.set((current) => Promise.resolve([...(current || []), create(resolve(cwd, path))])); return glob; }); diff --git a/bin/resources/image/index.ts b/bin/resources/image/index.ts index dce39cb..ed855b4 100644 --- a/bin/resources/image/index.ts +++ b/bin/resources/image/index.ts @@ -1,7 +1,7 @@ -import { createHash } from "crypto"; -import { Asset, Bundler } from "../../bundler"; -import { Observable } from "../../observable"; -import sharp, { FormatEnum } from "sharp"; +import { createHash } from 'crypto'; +import { Asset, Bundler } from '../../bundler'; +import { Observable } from '../../observable'; +import sharp, { FormatEnum } from 'sharp'; type ImageOptions = { format: keyof FormatEnum; @@ -13,8 +13,7 @@ type ImageOptions = { }; const createImage = (options: ImageOptions) => { - let path = - options.name || createHash("sha256").update(options.image).digest("hex"); + let path = options.name || createHash('sha256').update(options.image).digest('hex'); if (options.width) { path += `-w${options.width}`; } diff --git a/bin/resources/latex/index.ts b/bin/resources/latex/index.ts index 6c09c2a..bd7ba85 100644 --- a/bin/resources/latex/index.ts +++ b/bin/resources/latex/index.ts @@ -1,7 +1,7 @@ -import { Asset, Bundler } from "../../bundler"; -import { Observable } from "../../observable"; -import { createEjs } from "../ejs"; -import { latexToPdf } from "./utils"; +import { Asset, Bundler } from '../../bundler'; +import { Observable } from '../../observable'; +import { createEjs } from '../ejs'; +import { latexToPdf } from './utils'; type LatexOptions = { path: string; @@ -23,7 +23,11 @@ const createLatex = ({ template, data, path, bundler }: LatexOptions) => { }; return asset; }); - return bundler.register(`${path}.pdf`, pdf); + const url = bundler.register(`${path}.pdf`, pdf); + return { + url, + item: pdf, + }; }; export { createLatex }; diff --git a/bin/resources/latex/utils.ts b/bin/resources/latex/utils.ts index 2b2cc9a..a128d34 100644 --- a/bin/resources/latex/utils.ts +++ b/bin/resources/latex/utils.ts @@ -1,5 +1,5 @@ -import latex from "node-latex"; -import { Readable } from "stream"; +import latex from 'node-latex'; +import { Readable } from 'stream'; const latexToPdf = (doc: string) => new Promise((resolve, reject) => { @@ -8,14 +8,14 @@ const latexToPdf = (doc: string) => input.push(doc); input.push(null); const latexStream = latex(input); - latexStream.on("data", (chunk) => { + latexStream.on('data', (chunk) => { chunks.push(Buffer.from(chunk)); }); - latexStream.on("finish", () => { + latexStream.on('finish', () => { const result = Buffer.concat(chunks); resolve(result); }); - latexStream.on("error", (err) => { + latexStream.on('error', (err) => { reject(err); }); }); diff --git a/bin/resources/page/index.ts b/bin/resources/page/index.ts index 181fcff..3c43f51 100644 --- a/bin/resources/page/index.ts +++ b/bin/resources/page/index.ts @@ -1,10 +1,10 @@ -import React, { ComponentType } from "react"; -import { renderToStaticMarkup } from "react-dom/server"; -import { HelmetProvider, FilledContext } from "react-helmet-async"; -import { Asset, Bundler } from "../../bundler"; -import { Observable } from "../../observable"; -import { ServerStyleSheet } from "styled-components"; -import { resolve } from "path"; +import React, { ComponentType } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { HelmetProvider, FilledContext } from 'react-helmet-async'; +import { Asset, Bundler } from '../../bundler'; +import { Observable } from '../../observable'; +import { ServerStyleSheet } from 'styled-components'; +import { resolve } from 'path'; type PageOptions = { path: string; @@ -24,8 +24,8 @@ const createPage = (options: PageOptions) => { React.createElement( HelmetProvider, { context: helmetContext }, - React.createElement(template, props) - ) + React.createElement(template, props), + ), ); const bodyHtml = renderToStaticMarkup(body); const { helmet } = helmetContext; @@ -40,7 +40,7 @@ const createPage = (options: PageOptions) => { helmet.script?.toString(), ] .filter(Boolean) - .join(""); + .join(''); const html = ` @@ -55,7 +55,7 @@ const createPage = (options: PageOptions) => { return asset; }); - const path = resolve("/", options.path, "index.html"); + const path = resolve('/', options.path, 'index.html'); return options.bundler.register(path, page); }; diff --git a/bin/resources/react/index.ts b/bin/resources/react/index.ts index d3486ab..a5d7501 100644 --- a/bin/resources/react/index.ts +++ b/bin/resources/react/index.ts @@ -1,27 +1,27 @@ -import vm from "vm"; -import React, { ComponentType } from "react"; -import { nodeResolve } from "@rollup/plugin-node-resolve"; -import commonjs from "@rollup/plugin-commonjs"; -import json from "@rollup/plugin-json"; -import replace from "@rollup/plugin-replace"; -import sucrase from "@rollup/plugin-sucrase"; -import alias from "@rollup/plugin-alias"; -import externalGlobals from "rollup-plugin-external-globals"; -import { createScript } from "../script"; -import orgStyled from "styled-components"; -import * as styledExports from "styled-components"; -import ReactHelmetAsync from "react-helmet-async"; -import { resolve } from "path"; +import vm from 'vm'; +import React, { ComponentType } from 'react'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; +import replace from '@rollup/plugin-replace'; +import sucrase from '@rollup/plugin-sucrase'; +import alias from '@rollup/plugin-alias'; +import externalGlobals from 'rollup-plugin-external-globals'; +import { createScript } from '../script'; +import orgStyled from 'styled-components'; +import * as styledExports from 'styled-components'; +import ReactHelmetAsync from 'react-helmet-async'; +import { resolve } from 'path'; const styled = orgStyled.bind(null); for (let key of Object.keys(orgStyled)) { - if (key === "default") { + if (key === 'default') { continue; } (styled as any)[key] = (orgStyled as any)[key]; } for (let key of Object.keys(styledExports)) { - if (key === "default") { + if (key === 'default') { continue; } (styled as any)[key] = (styledExports as any)[key]; @@ -30,34 +30,32 @@ for (let key of Object.keys(styledExports)) { const createReact = (path: string) => { const script = createScript({ path, - format: "cjs", + format: 'cjs', plugins: [ replace({ preventAssignment: true, - "process.env.NODE_ENV": JSON.stringify("production"), + 'process.env.NODE_ENV': JSON.stringify('production'), }), alias({ - entries: [ - { find: "@", replacement: resolve("content/templates/react") }, - ], + entries: [{ find: '@', replacement: resolve('content/templates/react') }], }), sucrase({ - exclude: ["node_modules/**"], - transforms: ["jsx", "typescript"], + exclude: ['node_modules/**'], + transforms: ['jsx', 'typescript'], }), nodeResolve({ browser: true, preferBuiltins: false, - extensions: [".js", ".ts", ".tsx"], + extensions: ['.js', '.ts', '.tsx'], }), json(), commonjs({ include: /node_modules/, }), externalGlobals({ - react: "React", - "styled-components": "StyledComponents", - "react-helmet-async": "ReactHelmetAsync", + react: 'React', + 'styled-components': 'StyledComponents', + 'react-helmet-async': 'ReactHelmetAsync', }), ], }); diff --git a/bin/resources/script/index.ts b/bin/resources/script/index.ts index cc5c767..fe933e8 100644 --- a/bin/resources/script/index.ts +++ b/bin/resources/script/index.ts @@ -1,5 +1,5 @@ -import { Observable } from "../../observable"; -import { InputPluginOption, ModuleFormat, watch } from "rollup"; +import { Observable } from '../../observable'; +import { InputPluginOption, ModuleFormat, watch } from 'rollup'; type ScriptOptions = { path: string; @@ -13,7 +13,7 @@ const build = (options: ScriptOptions, update: (code: string) => void) => const watcher = watch({ input: options.path, plugins: options.plugins, - onwarn: () => { }, + onwarn: () => {}, output: { format: options.format, }, @@ -22,8 +22,8 @@ const build = (options: ScriptOptions, update: (code: string) => void) => }, }); - watcher.on("event", async (event) => { - if (event.code === "BUNDLE_END") { + watcher.on('event', async (event) => { + if (event.code === 'BUNDLE_END') { const { output } = await event.result.generate({ format: options.format, }); @@ -35,7 +35,7 @@ const build = (options: ScriptOptions, update: (code: string) => void) => update(code); } } - if (event.code === "ERROR") { + if (event.code === 'ERROR') { reject(event.error); } }); @@ -43,7 +43,7 @@ const build = (options: ScriptOptions, update: (code: string) => void) => const createScript = (options: ScriptOptions) => { const script: Observable = new Observable(() => - build(options, (code) => script.set(() => Promise.resolve(code))) + build(options, (code) => script.set(() => Promise.resolve(code))), ); return script; diff --git a/bin/utils/markdown/index.ts b/bin/utils/markdown/index.ts index 846186d..2cb0a0f 100644 --- a/bin/utils/markdown/index.ts +++ b/bin/utils/markdown/index.ts @@ -1,11 +1,11 @@ -import { resolve } from "path"; -import { decode } from "html-entities"; -import { marked } from "marked"; -import remark from "remark"; -import visit from "unist-util-visit"; -import { Bundler } from "../../bundler"; -import { createImage } from "../../resources/image"; -import { renderer } from "./latex"; +import { resolve } from 'path'; +import { decode } from 'html-entities'; +import { marked } from 'marked'; +import remark from 'remark'; +import visit from 'unist-util-visit'; +import { Bundler } from '../../bundler'; +import { createImage } from '../../resources/image'; +import { renderer } from './latex'; type MarkdownBundleImagesOptions = { cwd: string; @@ -13,15 +13,11 @@ type MarkdownBundleImagesOptions = { bundler: Bundler; }; -const markdownBundleImages = async ({ - bundler, - cwd, - content, -}: MarkdownBundleImagesOptions) => { +const markdownBundleImages = async ({ bundler, cwd, content }: MarkdownBundleImagesOptions) => { const result = await remark() .use(() => (tree) => { - visit(tree, "image", (node) => { - if (!("url" in node)) { + visit(tree, 'image', (node) => { + if (!('url' in node)) { return; } const url = node.url as string; @@ -29,7 +25,7 @@ const markdownBundleImages = async ({ const image = createImage({ image: path, bundler, - format: "webp", + format: 'avif', }); const newUrl = image; node.url = newUrl; @@ -46,7 +42,7 @@ type MarkdownToLatexOptions = { const markdownToLatex = ({ root, content }: MarkdownToLatexOptions) => { const render: any = { - ...renderer(0), + ...renderer(0, root), }; const latex = marked(content, { renderer: render, diff --git a/bin/utils/markdown/latex.ts b/bin/utils/markdown/latex.ts index 9679a95..9c96a9c 100644 --- a/bin/utils/markdown/latex.ts +++ b/bin/utils/markdown/latex.ts @@ -1,19 +1,20 @@ -import { decode } from "html-entities"; -import { existsSync } from "fs"; +import { decode } from 'html-entities'; +import { existsSync } from 'fs'; +import { resolve } from 'path'; -const latexTypes = ["", "section", "subsection", "paragraph", "subparagraph"]; +const latexTypes = ['', 'section', 'subsection', 'paragraph', 'subparagraph']; const sanitize = (text?: string) => { if (!text) { - return ""; + return ''; } return decode(text) - .replace("&", "\\&") - .replace("_", "\\_") - .replace(/([^\\])\}/g, "$1\\}") - .replace(/([^\\])\{/g, "$1\\{") - .replace(/[^\\]\[/g, "\\[") - .replace(/#/g, "\\#"); + .replace('&', '\\&') + .replace('_', '\\_') + .replace(/([^\\])\}/g, '$1\\}') + .replace(/([^\\])\{/g, '$1\\{') + .replace(/[^\\]\[/g, '\\[') + .replace(/#/g, '\\#'); }; type Renderer = (depth: number) => { @@ -30,7 +31,7 @@ type Renderer = (depth: number) => { image?: (link: string) => string; }; -const renderer = (outerDepth: number) => ({ +const renderer = (outerDepth: number, cwd: string) => ({ heading: (text: string, depth: number) => { return `\\${latexTypes[outerDepth + depth]}{${sanitize(text)}}\n\n`; }, @@ -76,13 +77,12 @@ const renderer = (outerDepth: number) => ({ return `\\texttt{${sanitize(code)}}`; }, image: (link: string) => { - if (!existsSync(link)) { - return "Online image not supported"; + const path = resolve(cwd, link); + if (!existsSync(path)) { + return `Online image not supported ${path}`; } - return `\\begin{figure}[h!] - \\includegraphics[width=0.5\\textwidth]{${link}} - \\centering -\\end{figure} + return ` + \\noindent\\includegraphics[width=\\linewidth]{${path}} `; }, }); diff --git a/bin/utils/observable/index.ts b/bin/utils/observable/index.ts index db92d0b..94594f2 100644 --- a/bin/utils/observable/index.ts +++ b/bin/utils/observable/index.ts @@ -1,14 +1,10 @@ -import { Observable } from "../../observable"; +import { Observable } from '../../observable'; const forEach = async >( observable: T, fn: ( - value: T extends Observable - ? U extends Array - ? A - : never - : never - ) => Promise + value: T extends Observable ? (U extends Array ? A : never) : never, + ) => Promise, ) => { const knownValues = new Set(); const update = async () => { diff --git a/content/config.ts b/content/config.ts new file mode 100644 index 0000000..99bfe88 --- /dev/null +++ b/content/config.ts @@ -0,0 +1,31 @@ +import { Config } from '../types/config'; + +const config: Config = { + profile: { + path: 'profile.yml', + }, + frontpage: { + react: { + template: 'templates/react/pages/frontpage/index.tsx', + }, + }, + resume: { + latex: { + template: 'templates/latex/resume.tex', + }, + }, + articles: { + pattern: 'articles/**/*.md', + react: { + template: 'templates/react/pages/article/index.tsx', + }, + latex: { + template: 'templates/latex/article.tex', + }, + }, + positions: { + pattern: 'resume/positions/**/*.md', + }, +}; + +export default config; diff --git a/content/resume/positions/zeronorth/main.md b/content/resume/positions/zeronorth/main.md index 3ae10e0..fa76034 100644 --- a/content/resume/positions/zeronorth/main.md +++ b/content/resume/positions/zeronorth/main.md @@ -5,4 +5,4 @@ from: 2022 to: Present --- -Hello world +// TODO diff --git a/content/templates/latex/article.tex b/content/templates/latex/article.tex index 81195aa..9fce92d 100644 --- a/content/templates/latex/article.tex +++ b/content/templates/latex/article.tex @@ -1,9 +1,28 @@ \documentclass{article} +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} \usepackage{graphicx} \usepackage{hyperref} +\usepackage{multicol} +\usepackage{fancyhdr} + +\pagestyle{fancy} +\fancyhf{} +\rhead{<%-profile.name%> \today} +\lhead{<%-article.title%>} +\rfoot{Page \thepage} + \title{<%-article.title%>} \begin{document} -\maketitle -\includegraphics[width=0.5\textwidth]{<%-article.cover%>} + +\begin{multicols}{2} +\noindent\begin{minipage}{\linewidth} +\Huge{<%-article.title%>} +\newline +\large{By <%-profile.name%>} +\vspace{0.5cm}\\ +\includegraphics[width=\linewidth]{<%-article.cover%>} +\vspace{1.5cm} +\end{minipage} <%-article.body%> +\end{multicols} \end{document} diff --git a/content/templates/react/components/article/grid/index.tsx b/content/templates/react/components/article/grid/index.tsx index 2527e0e..f75670f 100644 --- a/content/templates/react/components/article/grid/index.tsx +++ b/content/templates/react/components/article/grid/index.tsx @@ -1,9 +1,9 @@ -import React, { useMemo } from "react"; -import styled from "styled-components"; -import ArticlePreview from "../preview"; -import { JumboArticlePreview } from "../preview/jumbo"; -import { MiniArticlePreview } from "../preview/mini"; -import { Article } from "types"; +import React, { useMemo } from 'react'; +import styled from 'styled-components'; +import ArticlePreview from '../preview'; +import { JumboArticlePreview } from '../preview/jumbo'; +import { MiniArticlePreview } from '../preview/mini'; +import { Article } from 'types'; type Props = { articles: Article[]; @@ -47,7 +47,7 @@ const ArticleGrid: React.FC = ({ articles }) => { // new Date(b.published).getTime() - // new Date(a.published).getTime() // ), - [articles] + [articles], ); const featured1 = useMemo(() => sorted.slice(0, 1)[0], [sorted]); diff --git a/content/templates/react/components/article/preview/index.tsx b/content/templates/react/components/article/preview/index.tsx index 334745e..5517d6f 100644 --- a/content/templates/react/components/article/preview/index.tsx +++ b/content/templates/react/components/article/preview/index.tsx @@ -1,9 +1,9 @@ -import React, { useMemo } from "react"; -import styled from "styled-components"; -import { Title1 } from "@/typography"; -import { createTheme } from "@/theme/create"; -import { ThemeProvider } from "@/theme/provider"; -import { Article } from "types"; +import React, { useMemo } from 'react'; +import styled from 'styled-components'; +import { Title1 } from '@/typography'; +import { createTheme } from '@/theme/create'; +import { ThemeProvider } from '@/theme/provider'; +import { Article } from 'types'; type Props = { article: Article; @@ -28,7 +28,7 @@ const Wrapper = styled.a` const Title = styled(Title1)` background: ${({ theme }) => theme.colors.primary}; line-height: 40px; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; font-size: 25px; padding: 0 5px; margin: 5px 0; @@ -48,7 +48,7 @@ const AsideWrapper = styled.aside<{ background: ${({ theme }) => theme.colors.primary}; background-size: cover; background-position: center; - ${({ image }) => (image ? `background-image: url(${image});` : "")} + ${({ image }) => (image ? `background-image: url(${image});` : '')} flex: 1; top: 0; bottom: 0; @@ -63,14 +63,14 @@ const ArticlePreview: React.FC = ({ article }) => { createTheme({ baseColor: article.color, }), - [article.color] + [article.color], ); return ( - {article.title.split(" ").map((word, index) => ( + {article.title.split(' ').map((word, index) => ( {word} ))} diff --git a/content/templates/react/components/article/preview/jumbo.tsx b/content/templates/react/components/article/preview/jumbo.tsx index efeda6c..efe13bb 100644 --- a/content/templates/react/components/article/preview/jumbo.tsx +++ b/content/templates/react/components/article/preview/jumbo.tsx @@ -1,7 +1,7 @@ -import React from "react"; -import styled from "styled-components"; -import { Title1, Body1 } from "@/typography"; -import { Article } from "types"; +import React from 'react'; +import styled from 'styled-components'; +import { Title1, Body1 } from '@/typography'; +import { Article } from 'types'; type Props = { article: Article; @@ -24,7 +24,7 @@ const Wrapper = styled.a` const Title = styled(Title1)` line-height: 40px; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; font-size: 25px; padding: 0 5px; margin: 5px 0; @@ -55,7 +55,7 @@ const AsideWrapper = styled.aside<{ background: ${({ theme }) => theme.colors.primary}; background-size: cover; background-position: center; - ${({ image }) => (image ? `background-image: url(${image});` : "")} + ${({ image }) => (image ? `background-image: url(${image});` : '')} flex: 1; top: 0; bottom: 0; diff --git a/content/templates/react/components/article/preview/mini.tsx b/content/templates/react/components/article/preview/mini.tsx index 342c321..1fe92d1 100644 --- a/content/templates/react/components/article/preview/mini.tsx +++ b/content/templates/react/components/article/preview/mini.tsx @@ -1,9 +1,9 @@ -import React, { useMemo } from "react"; -import styled from "styled-components"; -import { Title1 } from "@/typography"; -import { createTheme } from "@/theme/create"; -import { ThemeProvider } from "@/theme/provider"; -import { Article } from "types"; +import React, { useMemo } from 'react'; +import styled from 'styled-components'; +import { Title1 } from '@/typography'; +import { createTheme } from '@/theme/create'; +import { ThemeProvider } from '@/theme/provider'; +import { Article } from 'types'; type Props = { article: Article; @@ -26,7 +26,7 @@ const Title = styled(Title1)` line-height: 20px; font-size: 20px; padding: 5px 5px; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; margin: 5px 0; background: ${({ theme }) => theme.colors.background}; `; @@ -46,7 +46,7 @@ const AsideWrapper = styled.aside<{ background: ${({ theme }) => theme.colors.primary}; background-size: cover; background-position: center; - ${({ image }) => (image ? `background-image: url(${image});` : "")} + ${({ image }) => (image ? `background-image: url(${image});` : '')} position: absolute; top: 0; bottom: 0; @@ -61,14 +61,14 @@ const MiniArticlePreview: React.FC = ({ article }) => { createTheme({ baseColor: article.color, }), - [article.color] + [article.color], ); return ( - {article.title.split(" ").map((word, index) => ( + {article.title.split(' ').map((word, index) => ( {word} ))} diff --git a/content/templates/react/components/html/index.tsx b/content/templates/react/components/html/index.tsx index 8b9bca3..d1fea2a 100644 --- a/content/templates/react/components/html/index.tsx +++ b/content/templates/react/components/html/index.tsx @@ -1,4 +1,4 @@ -import { FC, ReactNode } from "react" +import { FC, ReactNode } from 'react'; type HtmlProps = { body: ReactNode; @@ -17,8 +17,11 @@ const Html: FC = ({ body, head, scripts }) => { ))} - - + +
{body}
diff --git a/content/templates/react/components/sheet/index.tsx b/content/templates/react/components/sheet/index.tsx index c42e6bf..fde0ae7 100644 --- a/content/templates/react/components/sheet/index.tsx +++ b/content/templates/react/components/sheet/index.tsx @@ -1,7 +1,7 @@ -import React, { ReactNode, useMemo } from "react"; -import styled from "styled-components"; -import { createTheme } from "@/theme/create"; -import { ThemeProvider } from "@/theme/provider"; +import React, { ReactNode, useMemo } from 'react'; +import styled from 'styled-components'; +import { createTheme } from '@/theme/create'; +import { ThemeProvider } from '@/theme/provider'; const Wrapper = styled.div` background: ${({ theme }) => theme.colors.background}; @@ -25,7 +25,7 @@ const BackgroundWrapper = styled.div<{ background-size: cover; background-position: center; opacity: 0.2; - ${({ image }) => (image ? `background-image: url(${image});` : "")} + ${({ image }) => (image ? `background-image: url(${image});` : '')} `; const Content = styled.div` @@ -50,7 +50,7 @@ const Sheet: React.FC = ({ color, background, children }) => { createTheme({ baseColor: color, }), - [color] + [color], ); return ( diff --git a/content/templates/react/article.tsx b/content/templates/react/pages/article/index.tsx similarity index 86% rename from content/templates/react/article.tsx rename to content/templates/react/pages/article/index.tsx index 007abdb..5c78a3b 100644 --- a/content/templates/react/article.tsx +++ b/content/templates/react/pages/article/index.tsx @@ -1,9 +1,9 @@ -import styled, { createGlobalStyle } from "styled-components"; -import ReactMarkdown from "react-markdown"; -import { Jumbo } from "./typography"; -import { createTheme, ThemeProvider } from "./theme"; -import { Helmet } from "react-helmet-async"; -import { Page } from "types"; +import styled, { createGlobalStyle } from 'styled-components'; +import ReactMarkdown from 'react-markdown'; +import { Jumbo } from '../../typography'; +import { createTheme, ThemeProvider } from '../../theme'; +import { Helmet } from 'react-helmet-async'; +import { Page } from 'types'; const GlobalStyle = createGlobalStyle` * { box-sizing: border-box; } @@ -36,7 +36,7 @@ const ArticleTitleWord = styled(Jumbo)` padding: 0 15px; text-transform: uppercase; margin: 10px; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; background: ${({ theme }) => theme.colors.primary}; color: ${({ theme }) => theme.colors.foreground}; @media only screen and (max-width: 900px) { @@ -57,7 +57,7 @@ const Wrapper = styled.div` const ArticleWrapper = styled.article` font-size: 1.1rem; - font-family: "Merriweather", serif; + font-family: 'Merriweather', serif; > p, ul, @@ -82,7 +82,7 @@ const ArticleWrapper = styled.article` } > p:first-of-type::first-letter { - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; border: solid 5px ${({ theme }) => theme.colors.foreground}; margin: 0 1rem 0 0; font-size: 6rem; @@ -118,7 +118,7 @@ const ArticleWrapper = styled.article` padding-right: 40px; shape-outside: padding-box; position: relative; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; text-transform: uppercase; display: flex; align-items: flex-start; @@ -132,7 +132,7 @@ const ArticleWrapper = styled.article` &:after { position: absolute; - content: ""; + content: ''; right: 20px; top: 0; bottom: 0; @@ -162,14 +162,14 @@ const ArticleWrapper = styled.article` &:before { color: ${({ theme }) => theme.colors.primary}; - content: "\\00BB"; + content: '\\00BB'; float: left; font-size: 6rem; } &:after { position: absolute; - content: ""; + content: ''; right: 20px; top: 0; bottom: 0; @@ -222,14 +222,14 @@ const Download = styled.a` text-align: center; padding: 1rem; font-size: 1rem; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; text-transform: uppercase; text-decoration: none; `; const Author = styled.a` text-transform: uppercase; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; font-size: 2rem; margin: 1rem; display: inline-block; @@ -238,7 +238,7 @@ const Author = styled.a` color: ${({ theme }) => theme.colors.foreground}; &:after { - content: ""; + content: ''; border-bottom: solid 15px ${({ theme }) => theme.colors.primary}; display: block; width: 100%; @@ -249,17 +249,13 @@ const Author = styled.a` } `; -const ArticlePage: Page<"article"> = ({ article, profile, pdfUrl }) => { +const ArticlePage: Page<'article'> = ({ article, profile, pdfUrl }) => { return ( - + = ({ article, profile, pdfUrl }) => { - {article.title.split(" ").map((word, index) => ( + {article.title.split(' ').map((word, index) => ( <ArticleTitleWord key={index}>{word}</ArticleTitleWord> ))} <Author href="/">by {profile.name}</Author> diff --git a/content/templates/react/frontpage.tsx b/content/templates/react/pages/frontpage/index.tsx similarity index 77% rename from content/templates/react/frontpage.tsx rename to content/templates/react/pages/frontpage/index.tsx index 73cb4d7..b2cbde6 100644 --- a/content/templates/react/frontpage.tsx +++ b/content/templates/react/pages/frontpage/index.tsx @@ -1,12 +1,12 @@ -import styled, { createGlobalStyle } from "styled-components"; -import { ArticleGrid } from "@/components/article/grid"; -import { Jumbo } from "@/typography"; -import { useMemo } from "react"; -import { Sheet } from "./components/sheet"; -import { ThemeProvider, createTheme } from "./theme"; -import chroma from "chroma-js"; -import { Helmet } from "react-helmet-async"; -import { Page } from "../../../types"; +import styled, { createGlobalStyle } from 'styled-components'; +import { ArticleGrid } from '@/components/article/grid'; +import { Jumbo } from '@/typography'; +import { useMemo } from 'react'; +import { Sheet } from '../../components/sheet'; +import { ThemeProvider, createTheme } from '@/theme'; +import chroma from 'chroma-js'; +import { Helmet } from 'react-helmet-async'; +import { Page } from 'types'; const GlobalStyle = createGlobalStyle` * { box-sizing: border-box; } @@ -32,7 +32,7 @@ const Download = styled.a` padding: 0 15px; text-transform: uppercase; margin: 10px; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; @media only screen and (max-width: 700px) { margin: 5px; font-size: 3rem; @@ -49,7 +49,7 @@ const Title = styled(Jumbo)` padding: 0 15px; text-transform: uppercase; margin: 10px; - font-family: "Black Ops One", sans-serif; + font-family: 'Black Ops One', sans-serif; @media only screen and (max-width: 700px) { margin: 5px; font-size: 3rem; @@ -71,7 +71,7 @@ const Arrow = styled.div` border-radius: 50%; width: 80px; height: 80px; - content: "↓"; + content: '↓'; font-size: 50px; @media only screen and (max-width: 700px) { width: 40px; @@ -99,13 +99,13 @@ const ImageBg = styled.picture` } `; -const FrontPage: Page<"frontpage"> = ({ articles, profile }) => { +const FrontPage: Page<'frontpage'> = ({ articles, profile }) => { const theme = useMemo( () => createTheme({ baseColor: chroma.random().brighten(1).hex(), }), - [] + [], ); return ( @@ -113,11 +113,7 @@ const FrontPage: Page<"frontpage"> = ({ articles, profile }) => { <Helmet> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="preconnect" href="https://fonts.googleapis.com" /> - <link - rel="preconnect" - href="https://fonts.gstatic.com" - crossOrigin="anonymous" - /> + <link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" /> <link href="https://fonts.googleapis.com/css2?family=Archivo+Black&family=Black+Ops+One&family=Merriweather:wght@400;700&display=swap" rel="stylesheet" @@ -130,12 +126,12 @@ const FrontPage: Page<"frontpage"> = ({ articles, profile }) => { </ImageBg> <Arrow /> <Hero> - {"Hi, I'm Morten".split(" ").map((char, index) => ( + {"Hi, I'm Morten".split(' ').map((char, index) => ( <Title key={index}>{char} ))} - {"And I make software".split(" ").map((char, index) => ( + {'And I make software'.split(' ').map((char, index) => ( {char} ))} @@ -147,7 +143,7 @@ const FrontPage: Page<"frontpage"> = ({ articles, profile }) => { - {"Table of Content".split(" ").map((char, index) => ( + {'Table of Content'.split(' ').map((char, index) => ( {char} ))} diff --git a/content/templates/react/theme/create.ts b/content/templates/react/theme/create.ts index a4e1448..d3e9909 100644 --- a/content/templates/react/theme/create.ts +++ b/content/templates/react/theme/create.ts @@ -11,13 +11,9 @@ type CreateOptions = { const isBright = (color: chroma.Color) => color.luminance() > 0.4; const createTheme = (options: CreateOptions = {}) => { - const baseColor = options.baseColor - ? chroma(options.baseColor) - : chroma.random(); + const baseColor = options.baseColor ? chroma(options.baseColor) : chroma.random(); const text = isBright(baseColor) ? BLACK : WHITE; - const bg = isBright(baseColor) - ? baseColor.luminance(0.9) - : baseColor.luminance(0.01); + const bg = isBright(baseColor) ? baseColor.luminance(0.9) : baseColor.luminance(0.01); const theme: Theme = { typography: { Jumbo: { @@ -57,4 +53,3 @@ const createTheme = (options: CreateOptions = {}) => { }; export { createTheme }; - diff --git a/content/templates/react/theme/global.d.ts b/content/templates/react/theme/global.d.ts index db977d3..91115e0 100644 --- a/content/templates/react/theme/global.d.ts +++ b/content/templates/react/theme/global.d.ts @@ -3,4 +3,3 @@ import { Theme } from './theme'; declare module 'styled-components' { export interface DefaultTheme extends Theme {} } - diff --git a/content/templates/react/typography/index.tsx b/content/templates/react/typography/index.tsx index c30d3f9..7e21a6c 100644 --- a/content/templates/react/typography/index.tsx +++ b/content/templates/react/typography/index.tsx @@ -1,49 +1,43 @@ -import styled from "styled-components"; -import { Theme, Typography } from "../theme"; +import styled from 'styled-components'; +import { Theme, Typography } from '../theme'; interface TextProps { - color?: keyof Theme["colors"]; + color?: keyof Theme['colors']; bold?: boolean; theme: Theme; } const BaseText = styled.span` - ${({ theme }) => - theme.font.family ? `font-family: ${theme.font.family};` : ""} - color: ${({ color, theme }) => - color ? theme.colors[color] : theme.colors.foreground}; - font-weight: ${({ bold }) => (bold ? "bold" : "normal")}; + ${({ theme }) => (theme.font.family ? `font-family: ${theme.font.family};` : '')} + color: ${({ color, theme }) => (color ? theme.colors[color] : theme.colors.foreground)}; + font-weight: ${({ bold }) => (bold ? 'bold' : 'normal')}; font-size: ${({ theme }) => theme.font.baseSize}px; `; -const get = (name: keyof Theme["typography"], theme: Theme): Typography => { +const get = (name: keyof Theme['typography'], theme: Theme): Typography => { const typography = theme.typography[name]; return typography; }; -const createTypography = (name: keyof Theme["typography"]) => { - const Component = styled(BaseText) ` - font-size: ${({ theme }) => - theme.font.baseSize * (get(name, theme).size || 1)}px; +const createTypography = (name: keyof Theme['typography']) => { + const Component = styled(BaseText)` + font-size: ${({ theme }) => theme.font.baseSize * (get(name, theme).size || 1)}px; font-weight: ${({ bold, theme }) => - typeof bold !== "undefined" - ? "bold" - : get(name, theme).weight || "normal"}; - ${({ theme }) => - get(name, theme).upperCase ? "text-transform: uppercase;" : ""} + typeof bold !== 'undefined' ? 'bold' : get(name, theme).weight || 'normal'}; + ${({ theme }) => (get(name, theme).upperCase ? 'text-transform: uppercase;' : '')} `; return Component; }; -const Jumbo = createTypography("Jumbo"); -const Title2 = createTypography("Title2"); -const Title1 = createTypography("Title1"); -const Body1 = createTypography("Body1"); -const Overline = createTypography("Overline"); -const Caption = createTypography("Caption"); -const Link = createTypography("Link"); +const Jumbo = createTypography('Jumbo'); +const Title2 = createTypography('Title2'); +const Title1 = createTypography('Title1'); +const Body1 = createTypography('Body1'); +const Overline = createTypography('Overline'); +const Caption = createTypography('Caption'); +const Link = createTypography('Link'); -const types: { [key in keyof Theme["typography"]]: typeof BaseText } = { +const types: { [key in keyof Theme['typography']]: typeof BaseText } = { Jumbo, Title2, Title1, diff --git a/package.json b/package.json index 0d707fa..5f42a3d 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "yaml": "^2.2.1" }, "devDependencies": { + "@react-native-community/eslint-config": "^3.2.0", "@types/chroma-js": "^2.4.0", "@types/ejs": "^3.1.2", "@types/express": "^4.17.17", @@ -54,7 +55,9 @@ "@types/react-dom": "^18.0.11", "@types/sharp": "^0.31.1", "@types/styled-components": "^5.1.26", + "eslint": "^8.36.0", "jest": "^29.5.0", + "prettier": "^2.8.7", "ts-jest": "^29.0.5", "ts-node": "^10.9.1", "typescript": "^5.0.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b28b10d..094137c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,6 +1,7 @@ lockfileVersion: 5.4 specifiers: + '@react-native-community/eslint-config': ^3.2.0 '@rollup/plugin-alias': ^4.0.3 '@rollup/plugin-commonjs': ^24.0.1 '@rollup/plugin-json': ^6.0.0 @@ -22,6 +23,7 @@ specifiers: chroma-js: ^2.4.2 commander: ^10.0.0 ejs: ^3.1.9 + eslint: ^8.36.0 eventemitter3: ^5.0.0 express: ^4.18.2 fast-glob: ^3.2.12 @@ -31,6 +33,7 @@ specifiers: jest: ^29.5.0 marked: ^4.2.12 node-latex: ^3.1.0 + prettier: ^2.8.7 react: ^18.2.0 react-dom: ^18.2.0 react-helmet-async: ^1.3.0 @@ -80,6 +83,7 @@ dependencies: yaml: 2.2.1 devDependencies: + '@react-native-community/eslint-config': 3.2.0_dzq4sglfl3yv4kxodieycp32vy '@types/chroma-js': 2.4.0 '@types/ejs': 3.1.2 '@types/express': 4.17.17 @@ -91,7 +95,9 @@ devDependencies: '@types/react-dom': 18.0.11 '@types/sharp': 0.31.1 '@types/styled-components': 5.1.26 + eslint: 8.36.0 jest: 29.5.0_d2dllaz5dte7avnjm55wl7fmsu + prettier: 2.8.7 ts-jest: 29.0.5_44ttdtjaknnkcgzh5px4h2qxl4 ts-node: 10.9.1_sxidjv3cojnrggmso45tj7hldi typescript: 5.0.2 @@ -140,6 +146,20 @@ packages: - supports-color dev: true + /@babel/eslint-parser/7.21.3_pxuto7xgangxlusvzceggvrmde: + resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.21.3 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.36.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + /@babel/generator/7.21.3: resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} engines: {node: '>=6.9.0'} @@ -483,6 +503,63 @@ packages: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} dev: false + /@eslint-community/eslint-utils/4.4.0_eslint@8.36.0: + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.36.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@eslint-community/regexpp/4.4.1: + resolution: {integrity: sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc/2.0.1: + resolution: {integrity: sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.0 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js/8.36.0: + resolution: {integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -752,18 +829,22 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + dev: true + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: false /@nodelib/fs.stat/2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: false /@nodelib/fs.walk/1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -771,7 +852,37 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - dev: false + + /@react-native-community/eslint-config/3.2.0_dzq4sglfl3yv4kxodieycp32vy: + resolution: {integrity: sha512-ZjGvoeiBtCbd506hQqwjKmkWPgynGUoJspG8/MuV/EfKnkjCtBmeJvq2n+sWbWEvL9LWXDp2GJmPzmvU5RSvKQ==} + peerDependencies: + eslint: '>=8' + prettier: '>=2' + dependencies: + '@babel/core': 7.21.3 + '@babel/eslint-parser': 7.21.3_pxuto7xgangxlusvzceggvrmde + '@react-native-community/eslint-plugin': 1.3.0 + '@typescript-eslint/eslint-plugin': 5.57.0_p7xo4zbf6rlx7pmjonhlydeowm + '@typescript-eslint/parser': 5.57.0_j4766f7ecgqbon3u7zlxn5zszu + eslint: 8.36.0 + eslint-config-prettier: 8.8.0_eslint@8.36.0 + eslint-plugin-eslint-comments: 3.2.0_eslint@8.36.0 + eslint-plugin-ft-flow: 2.0.3_kixzldopwlj3xm3b57rwttexoy + eslint-plugin-jest: 26.9.0_2gyqiuhxaqgnkmscqi3rgytgju + eslint-plugin-prettier: 4.2.1_ywlv3zveqg2kxfq44lflihh5mm + eslint-plugin-react: 7.32.2_eslint@8.36.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.36.0 + eslint-plugin-react-native: 4.0.0_eslint@8.36.0 + prettier: 2.8.7 + transitivePeerDependencies: + - jest + - supports-color + - typescript + dev: true + + /@react-native-community/eslint-plugin/1.3.0: + resolution: {integrity: sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg==} + dev: true /@rollup/plugin-alias/4.0.3_rollup@3.20.0: resolution: {integrity: sha512-ZuDWE1q4PQDhvm/zc5Prun8sBpLJy41DMptYrS6MhAy9s9kL/doN1613BWfEchGVfKxzliJ3BjbOPizXX38DbQ==} @@ -1049,6 +1160,10 @@ packages: pretty-format: 29.5.0 dev: true + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + /@types/marked/4.0.8: resolution: {integrity: sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw==} dev: true @@ -1106,6 +1221,10 @@ packages: /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + /@types/serve-static/1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: @@ -1145,6 +1264,136 @@ packages: '@types/yargs-parser': 21.0.0 dev: true + /@typescript-eslint/eslint-plugin/5.57.0_p7xo4zbf6rlx7pmjonhlydeowm: + resolution: {integrity: sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.4.1 + '@typescript-eslint/parser': 5.57.0_j4766f7ecgqbon3u7zlxn5zszu + '@typescript-eslint/scope-manager': 5.57.0 + '@typescript-eslint/type-utils': 5.57.0_j4766f7ecgqbon3u7zlxn5zszu + '@typescript-eslint/utils': 5.57.0_j4766f7ecgqbon3u7zlxn5zszu + debug: 4.3.4 + eslint: 8.36.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@5.0.2 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.57.0_j4766f7ecgqbon3u7zlxn5zszu: + resolution: {integrity: sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.57.0 + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/typescript-estree': 5.57.0_typescript@5.0.2 + debug: 4.3.4 + eslint: 8.36.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.57.0: + resolution: {integrity: sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/visitor-keys': 5.57.0 + dev: true + + /@typescript-eslint/type-utils/5.57.0_j4766f7ecgqbon3u7zlxn5zszu: + resolution: {integrity: sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.57.0_typescript@5.0.2 + '@typescript-eslint/utils': 5.57.0_j4766f7ecgqbon3u7zlxn5zszu + debug: 4.3.4 + eslint: 8.36.0 + tsutils: 3.21.0_typescript@5.0.2 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.57.0: + resolution: {integrity: sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.57.0_typescript@5.0.2: + resolution: {integrity: sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/visitor-keys': 5.57.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@5.0.2 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.57.0_j4766f7ecgqbon3u7zlxn5zszu: + resolution: {integrity: sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0_eslint@8.36.0 + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.57.0 + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/typescript-estree': 5.57.0_typescript@5.0.2 + eslint: 8.36.0 + eslint-scope: 5.1.1 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.57.0: + resolution: {integrity: sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.57.0 + eslint-visitor-keys: 3.3.0 + dev: true + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1153,6 +1402,14 @@ packages: negotiator: 0.6.3 dev: false + /acorn-jsx/5.3.2_acorn@8.8.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -1164,6 +1421,15 @@ packages: hasBin: true dev: true + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + /ansi-escapes/4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1223,6 +1489,10 @@ packages: dependencies: sprintf-js: 1.0.3 + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /arr-diff/4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} @@ -1238,6 +1508,13 @@ packages: engines: {node: '>=0.10.0'} dev: false + /array-buffer-byte-length/1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + /array-each/1.0.1: resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} engines: {node: '>=0.10.0'} @@ -1247,16 +1524,52 @@ packages: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.0 + is-string: 1.0.7 + dev: true + /array-slice/1.1.0: resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} engines: {node: '>=0.10.0'} dev: false + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + /array-unique/0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: false + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.tosorted/1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.0 + dev: true + /assign-symbols/1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} @@ -1286,6 +1599,11 @@ packages: hasBin: true dev: false + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + /babel-jest/29.5.0_@babel+core@7.21.3: resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1541,7 +1859,6 @@ packages: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 - dev: false /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1852,10 +2169,22 @@ packages: engines: {node: '>=4.0.0'} dev: false + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + /deepmerge/4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + /define-property/0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} @@ -1908,6 +2237,27 @@ packages: engines: {node: '>=0.3.1'} dev: true + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false @@ -1950,6 +2300,70 @@ packages: is-arrayish: 0.2.1 dev: true + /es-abstract/1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -1968,11 +2382,245 @@ packages: engines: {node: '>=8'} dev: true + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier/8.8.0_eslint@8.36.0: + resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.36.0 + dev: true + + /eslint-plugin-eslint-comments/3.2.0_eslint@8.36.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.36.0 + ignore: 5.2.4 + dev: true + + /eslint-plugin-ft-flow/2.0.3_kixzldopwlj3xm3b57rwttexoy: + resolution: {integrity: sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==} + engines: {node: '>=12.22.0'} + peerDependencies: + '@babel/eslint-parser': ^7.12.0 + eslint: ^8.1.0 + dependencies: + '@babel/eslint-parser': 7.21.3_pxuto7xgangxlusvzceggvrmde + eslint: 8.36.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + dev: true + + /eslint-plugin-jest/26.9.0_2gyqiuhxaqgnkmscqi3rgytgju: + resolution: {integrity: sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.57.0_p7xo4zbf6rlx7pmjonhlydeowm + '@typescript-eslint/utils': 5.57.0_j4766f7ecgqbon3u7zlxn5zszu + eslint: 8.36.0 + jest: 29.5.0_d2dllaz5dte7avnjm55wl7fmsu + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-prettier/4.2.1_ywlv3zveqg2kxfq44lflihh5mm: + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.36.0 + eslint-config-prettier: 8.8.0_eslint@8.36.0 + prettier: 2.8.7 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-react-hooks/4.6.0_eslint@8.36.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.36.0 + dev: true + + /eslint-plugin-react-native-globals/0.1.2: + resolution: {integrity: sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==} + dev: true + + /eslint-plugin-react-native/4.0.0_eslint@8.36.0: + resolution: {integrity: sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ==} + peerDependencies: + eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/traverse': 7.21.3 + eslint: 8.36.0 + eslint-plugin-react-native-globals: 0.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-react/7.32.2_eslint@8.36.0: + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.36.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.0 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.36.0: + resolution: {integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0_eslint@8.36.0 + '@eslint-community/regexpp': 4.4.1 + '@eslint/eslintrc': 2.0.1 + '@eslint/js': 8.36.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-visitor-keys: 3.3.0 + espree: 9.5.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.5.0: + resolution: {integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2_acorn@8.8.2 + eslint-visitor-keys: 3.3.0 + dev: true + /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + /estree-walker/2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: false @@ -1983,6 +2631,11 @@ packages: '@types/estree': 1.0.0 dev: false + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2117,6 +2770,14 @@ packages: - supports-color dev: false + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff/1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + /fast-glob/3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -2126,17 +2787,19 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: false /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + /fastq/1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - dev: false /fb-watchman/2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -2144,6 +2807,13 @@ packages: bser: 2.1.1 dev: true + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + /file-uri-to-path/1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} requiresBuild: true @@ -2195,6 +2865,32 @@ packages: path-exists: 4.0.0 dev: true + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} @@ -2260,6 +2956,20 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2276,7 +2986,6 @@ packages: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - dev: false /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -2288,6 +2997,14 @@ packages: engines: {node: '>=10'} dev: true + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + /get-value/2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} @@ -2309,7 +3026,13 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - dev: false + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true /glob-watcher/5.0.5: resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} @@ -2362,9 +3085,45 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + /globals/13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + /graceful-fs/4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + /gray-matter/4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -2375,6 +3134,10 @@ packages: strip-bom-string: 1.0.0 dev: false + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -2383,10 +3146,27 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: false + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true /has-value/0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} @@ -2465,6 +3245,19 @@ packages: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + /import-local/3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} @@ -2496,6 +3289,15 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + /invariant/2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: @@ -2532,6 +3334,14 @@ packages: is-decimal: 1.0.4 dev: false + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true @@ -2540,6 +3350,12 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + /is-binary-path/1.0.1: resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} engines: {node: '>=0.10.0'} @@ -2547,6 +3363,14 @@ packages: binary-extensions: 1.13.1 dev: false + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + /is-buffer/1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: false @@ -2563,6 +3387,11 @@ packages: builtin-modules: 3.3.0 dev: false + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + /is-core-module/2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: @@ -2582,6 +3411,13 @@ packages: kind-of: 6.0.3 dev: false + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-decimal/1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} dev: false @@ -2619,7 +3455,6 @@ packages: /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - dev: false /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -2643,7 +3478,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - dev: false /is-hexadecimal/1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} @@ -2658,6 +3492,18 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-number/3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} @@ -2669,6 +3515,11 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-plain-obj/2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -2693,11 +3544,56 @@ packages: '@types/estree': 1.0.0 dev: false + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array/1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -3190,6 +4086,10 @@ packages: - ts-node dev: true + /js-sdsl/4.4.0: + resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + dev: true + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3200,6 +4100,13 @@ packages: argparse: 1.0.10 esprima: 4.0.1 + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -3209,6 +4116,14 @@ packages: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3221,6 +4136,14 @@ packages: graceful-fs: 4.2.11 dev: false + /jsx-ast-utils/3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + object.assign: 4.1.4 + dev: true + /just-debounce/1.1.0: resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} dev: false @@ -3259,6 +4182,14 @@ packages: engines: {node: '>=6'} dev: true + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3269,13 +4200,23 @@ packages: p-locate: 4.1.0 dev: true + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + /lodash.memoize/4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false /longest-streak/2.0.4: resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} @@ -3286,7 +4227,6 @@ packages: hasBin: true dependencies: js-tokens: 4.0.0 - dev: false /lru-cache/5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3415,7 +4355,6 @@ packages: /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - dev: false /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -3563,6 +4502,10 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -3622,7 +4565,6 @@ packages: /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: false /object-copy/0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} @@ -3635,7 +4577,11 @@ packages: /object-inspect/1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: false + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true /object-visit/1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} @@ -3644,6 +4590,16 @@ packages: isobject: 3.0.1 dev: false + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /object.defaults/1.1.0: resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} engines: {node: '>=0.10.0'} @@ -3654,6 +4610,31 @@ packages: isobject: 3.0.1 dev: false + /object.entries/1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.fromentries/2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.hasown/1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + /object.pick/1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} @@ -3661,6 +4642,15 @@ packages: isobject: 3.0.1 dev: false + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + /on-finished/2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -3680,6 +4670,18 @@ packages: mimic-fn: 2.1.0 dev: true + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3701,11 +4703,25 @@ packages: p-limit: 2.3.0 dev: true + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + /parse-entities/2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} dependencies: @@ -3762,6 +4778,11 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -3809,6 +4830,24 @@ packages: tunnel-agent: 0.6.0 dev: false + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers/1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.2.0 + dev: true + + /prettier/2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + /pretty-format/29.5.0: resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3836,7 +4875,6 @@ packages: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: false /property-information/5.6.0: resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} @@ -3859,6 +4897,11 @@ packages: once: 1.4.0 dev: false + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + /pure-rand/6.0.1: resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} dev: true @@ -3872,7 +4915,6 @@ packages: /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: false /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} @@ -4015,6 +5057,15 @@ packages: safe-regex: 1.1.0 dev: false + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + /remark-parse/9.0.0: resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} dependencies: @@ -4071,6 +5122,11 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -4094,6 +5150,15 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + /resolve/2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /ret/0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -4102,7 +5167,6 @@ packages: /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false /rimraf/2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} @@ -4111,6 +5175,13 @@ packages: glob: 7.2.3 dev: false + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + /rollup-plugin-external-globals/0.7.3_rollup@3.20.0: resolution: {integrity: sha512-rOxtHUyIYR06kV2H5xhxIjbmdfQ7YGw/LUPFzxi9qwUqTqnbBUbZlVpkc5hs13b8KVO20Zkb+LzT2TGpJgRaIg==} peerDependencies: @@ -4135,7 +5206,6 @@ packages: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - dev: false /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -4145,6 +5215,14 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + /safe-regex/1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: @@ -4265,7 +5343,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.0 object-inspect: 1.12.3 - dev: false /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4419,6 +5496,10 @@ packages: strip-ansi: 6.0.1 dev: true + /string-natural-compare/3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + dev: true + /string-to-stream/1.1.1: resolution: {integrity: sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==} dependencies: @@ -4435,6 +5516,44 @@ packages: strip-ansi: 6.0.1 dev: true + /string.prototype.matchall/4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim/1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -4579,6 +5698,10 @@ packages: minimatch: 3.1.2 dev: true + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + /thenify-all/1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -4715,21 +5838,47 @@ packages: yn: 3.1.1 dev: true + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false + /tsutils/3.21.0_typescript@5.0.2: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + /tunnel-agent/0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: false + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + /type-fest/0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -4743,11 +5892,28 @@ packages: mime-types: 2.1.35 dev: false + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + /typescript/5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + /unified/9.2.2: resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} dependencies: @@ -4836,6 +6002,12 @@ packages: picocolors: 1.0.0 dev: true + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + /urix/0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated @@ -4895,6 +6067,28 @@ packages: makeerror: 1.0.12 dev: true + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array/1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4903,6 +6097,11 @@ packages: isexe: 2.0.0 dev: true + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} diff --git a/types/config.ts b/types/config.ts new file mode 100644 index 0000000..5af14f6 --- /dev/null +++ b/types/config.ts @@ -0,0 +1,29 @@ +interface Config { + profile: { + path: string; + }; + frontpage: { + react: { + template: string; + }; + }; + articles: { + pattern: string; + react: { + template: string; + }; + latex: { + template: string; + }; + }; + resume: { + latex: { + template: string; + }; + }; + positions: { + pattern: string; + }; +} + +export { Config };