From 184ed14435e884a39a49a4550854f237cfe5d7b1 Mon Sep 17 00:00:00 2001 From: Araozu Date: Tue, 26 Mar 2024 18:05:58 -0500 Subject: [PATCH] write a custom highlighter for codejar --- bun.lockb | Bin 0 -> 74497 bytes lexer/lexer.test.ts | 45 ++ lexer/lexer.ts | 80 +++ lexer/number_lexer.test.ts | 19 + lexer/number_lexer.ts | 47 ++ lexer/utils.ts | 3 + package.json | 14 +- pnpm-lock.yaml | 1225 ------------------------------------ static/index.html | 40 +- static/js/codemirror.js | 58 ++ static/js/lexer.js | 1 + tailwind.config.js | 2 +- tsconfig.json | 27 + 13 files changed, 306 insertions(+), 1255 deletions(-) create mode 100755 bun.lockb create mode 100644 lexer/lexer.test.ts create mode 100644 lexer/lexer.ts create mode 100644 lexer/number_lexer.test.ts create mode 100644 lexer/number_lexer.ts create mode 100644 lexer/utils.ts delete mode 100644 pnpm-lock.yaml create mode 100644 static/js/codemirror.js create mode 100644 static/js/lexer.js create mode 100644 tsconfig.json diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..7324a7b920085ba52d0a61f4574e135ed81bad55 GIT binary patch literal 74497 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 { + test("empty program should return no tokens", () => { + const code = ""; + const tokens = lex(code); + expect(tokens).toEqual([]); + }); + + test("program with whitespace should return a single token", () => { + const code = " "; + const tokens = lex(code); + expect(tokens).toEqual([{v: " "}]); + }) + + test("program with newlines should return a single token", () => { + const code = "\n"; + const tokens = lex(code); + expect(tokens).toEqual([{v: "\n"}]); + }); + + test("program with random unicode should return the same unicode", () => { + const code = "🍕"; + const tokens = lex(code); + expect(tokens).toEqual([{v: "🍕"}]); + }); + + test("should scan integers", () => { + const code = "12345"; + const tokens = lex(code); + expect(tokens).toEqual([{v: "12345"}]); + }); + + test("should scan integers and whitespace around", () => { + const code = " 12345 \n "; + const tokens = lex(code); + expect(tokens).toEqual([ + {v: " "}, + {v: "12345"}, + {v: " \n "} + ]); + }); +}); + diff --git a/lexer/lexer.ts b/lexer/lexer.ts new file mode 100644 index 0000000..58f898a --- /dev/null +++ b/lexer/lexer.ts @@ -0,0 +1,80 @@ +import { lex_number } from "./number_lexer.ts"; +import { is_digit } from "./utils.ts"; + +export type Token = { v: string }; + +/** + * Lexes a string of THP code, and returns an array of tokens. Unlike a regular + * lexer, whitespace and other characters are not ignored, and are instead treated + * as a default token. + * + * This lexer implements a subset of the grammar defined in the THP language specification, + * only recognizing the following tokens: + * - Identifier + * - Datatype + * - String + * - Number + * - Single line comment + * - Multi line comment + * - Keywords + * + * @param code Code to lex + * @returns An array of all the tokens found + */ +export function lex(code: string): Array { + const code_len = code.length; + const tokens: Array = []; + + let current_pos = 0; + let current_default_token = ""; + + while (current_pos < code_len) { + const c = code[current_pos]; + + let next_token: Token | null = null; + let next_position: number | null = null; + + if (is_digit(c)) { + // if the current default token is not empty, push it to the tokens array + if (current_default_token !== "") { + tokens.push({ v: current_default_token }); + current_default_token = ""; + } + + // lex a number + const [token, next] = lex_number(code, current_pos); + current_pos = next; + tokens.push(token); + continue; + } + + // here, check if a token was found + if (next_token !== null && next_position !== null) { + // if there was a default token, push it to the tokens array + if (current_default_token !== "") { + tokens.push({ v: current_default_token }); + current_default_token = ""; + } + + // then push the new token found + tokens.push(next_token); + current_pos = next_position; + continue; + } + // otherwise, add the current character to the default token + else { + current_default_token += c; + current_pos++; + } + } + + // if there was a default token, push it to the tokens array + if (current_default_token !== "") { + tokens.push({ v: current_default_token }); + current_default_token = ""; + } + + return tokens; +} + + diff --git a/lexer/number_lexer.test.ts b/lexer/number_lexer.test.ts new file mode 100644 index 0000000..17b3b6f --- /dev/null +++ b/lexer/number_lexer.test.ts @@ -0,0 +1,19 @@ +import { expect, test, describe } from "bun:test"; +import { lex_number } from "./number_lexer"; + +describe("Number Lexer", () => { + test("should return a whole number token", () => { + const code = "1"; + const token = lex_number(code, 0); + + expect(token).toEqual([{ v: "1" }, 1]); + }); + + test("should return a whole number token pt 2", () => { + const code = "12345"; + const token = lex_number(code, 0); + + expect(token).toEqual([{ v: "12345" }, 5]); + }); +}); + diff --git a/lexer/number_lexer.ts b/lexer/number_lexer.ts new file mode 100644 index 0000000..8e2ae95 --- /dev/null +++ b/lexer/number_lexer.ts @@ -0,0 +1,47 @@ +import type { Token } from "./lexer.ts"; +import { is_digit } from "./utils.ts"; + +/** + * Scans a number, at the given position in the input string. + * This function assumes that the character at the given position is a digit. + * It follows this grammar: + * + * @param input the input string + * @param pos the position to start scanning from + * @returns + */ +export function lex_number(input: string, pos: number): [Token, number] { + const [token_value, next] = scan_decimal(input, pos); + + return [{ v: token_value }, next]; +} + +function scan_decimal(input: string, starting_position: number): [string, number] { + let current_value = ""; + let pos = starting_position; + + while (pos < input.length) { + const c = input[pos]; + + if (c === ".") { + // todo + throw new Error("Not implemented"); + } + else if (c == "e" || c == "E") { + // todo + throw new Error("Not implemented"); + } + else if (is_digit(c)) { + current_value += c; + pos += 1; + } + else { + break; + } + + } + + return [current_value, pos]; +} + + diff --git a/lexer/utils.ts b/lexer/utils.ts new file mode 100644 index 0000000..cc221eb --- /dev/null +++ b/lexer/utils.ts @@ -0,0 +1,3 @@ +export function is_digit(c: string): boolean { + return c >= '0' && c <= '9'; +} \ No newline at end of file diff --git a/package.json b/package.json index 1d09ec6..590e491 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "generate": "md-docs", - "dev": "concurrently -k \"pnpm tailwind:watch\" \"serve ./static/ -l 3333\"", + "bundle": "bun build ./lexer/lexer.ts --outdir ./static/js/ --format esm --minify", + "dev": "concurrently -k \"tailwindcss -i ./tailwind.css -o ./static/css/out.css --watch\" \"serve ./static/ -l 3333\"", + "codemirror": "esbuild --bundle ./static/js/codemirror.js --outfile=./static/js/codemirror.min.js --minify --sourcemap", "tailwind:watch": "tailwindcss -i ./tailwind.css -o ./static/css/out.css --watch", "tailwind:build": "tailwindcss -i ./tailwind.css -o ./static/css/out.css --minify" }, @@ -13,10 +15,16 @@ "author": "", "license": "ISC", "dependencies": { + "@types/bun": "^1.0.10", + "codejar": "^4.2.0", "tailwindcss": "^3.2.7" }, "devDependencies": { "concurrently": "^8.2.0", - "serve": "^14.2.0" + "serve": "^14.2.1", + "bun-types": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index a9b187b..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,1225 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - tailwindcss: - specifier: ^3.2.7 - version: 3.3.5 - -devDependencies: - concurrently: - specifier: ^8.2.0 - version: 8.2.2 - serve: - specifier: ^14.2.0 - version: 14.2.1 - -packages: - - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - dev: false - - /@babel/runtime@7.23.2: - resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 - dev: false - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false - - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /@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==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: false - - /@zeit/schemas@2.29.0: - resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==} - dev: true - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /ajv@8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: false - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: false - - /boxen@7.0.0: - resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} - engines: {node: '>=14.16'} - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.0.1 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: false - - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: false - - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true - - /chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} - dependencies: - chalk: 4.1.2 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.0.1: - resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: false - - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: true - - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false - - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 - spawn-command: 0.0.2 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - dev: true - - /content-disposition@0.5.2: - resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} - engines: {node: '>= 0.6'} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.23.2 - dev: true - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-url-parser@1.1.3: - resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} - dependencies: - punycode: 1.4.1 - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: false - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: false - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - 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: false - - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: false - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: false - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: false - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /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==} - engines: {node: '>=8'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: false - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: false - - /is-port-reachable@4.0.0: - resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /jiti@1.20.0: - resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} - hasBin: true - dev: false - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: false - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.33.0: - resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} - engines: {node: '>= 0.6'} - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.18: - resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.33.0 - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: false - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: false - - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: false - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: false - - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false - - /path-to-regexp@2.2.1: - resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: false - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: false - - /postcss-import@15.1.0(postcss@8.4.31): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.31 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - dev: false - - /postcss-js@4.0.1(postcss@8.4.31): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.31 - dev: false - - /postcss-load-config@4.0.1(postcss@8.4.31): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.31 - yaml: 2.3.3 - dev: false - - /postcss-nested@6.0.1(postcss@8.4.31): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 - dev: false - - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false - - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: false - - /range-parser@1.2.0: - resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} - engines: {node: '>= 0.6'} - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - dependencies: - pify: 2.3.0 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: false - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: true - - /registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - dev: true - - /registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - dependencies: - rc: 1.2.8 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: false - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: false - - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /serve-handler@6.1.5: - resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} - dependencies: - bytes: 3.0.0 - content-disposition: 0.5.2 - fast-url-parser: 1.1.3 - mime-types: 2.1.18 - minimatch: 3.1.2 - path-is-inside: 1.0.2 - path-to-regexp: 2.2.1 - range-parser: 1.2.0 - dev: true - - /serve@14.2.1: - resolution: {integrity: sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==} - engines: {node: '>= 14'} - hasBin: true - dependencies: - '@zeit/schemas': 2.29.0 - ajv: 8.11.0 - arg: 5.0.2 - boxen: 7.0.0 - chalk: 5.0.1 - chalk-template: 0.4.0 - clipboardy: 3.0.0 - compression: 1.7.4 - is-port-reachable: 4.0.0 - serve-handler: 6.1.5 - update-check: 1.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false - - /spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: false - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: false - - /tailwindcss@3.3.5: - resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.5.3 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.1 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.20.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.31 - postcss-import: 15.1.0(postcss@8.4.31) - postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.1(postcss@8.4.31) - postcss-nested: 6.0.1(postcss@8.4.31) - postcss-selector-parser: 6.0.13 - resolve: 1.22.8 - sucrase: 3.34.0 - transitivePeerDependencies: - - ts-node - dev: false - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: false - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: false - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true - - /update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} - dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yaml@2.3.3: - resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} - engines: {node: '>= 14'} - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true diff --git a/static/index.html b/static/index.html index 10399cf..4d0f7ff 100644 --- a/static/index.html +++ b/static/index.html @@ -13,7 +13,7 @@ @@ -26,7 +26,7 @@ -
+

@@ -76,35 +76,23 @@
-
-                
-                    // Actual generics & sum types
-                    fun find_person(Int person_id) -> Result[String, String] {
-                        // Easy, explicit error bubbling
-                        try Person::find_by_id(person_id)
-                    }
-
-                    val id = POST::get("person_id") ?? exit("Null person_id")
-                    // Errors as values
-                    val person = try find_person(person_id: id) with error {
-                        eprint("Error: {error}")
-                        exit("Person not found")
-                    }
-
-                    // First class HTML-like templates & components
-                    print(
-                        <a href="/person/reports/{person.id}">
-                            welcome, {person.name}
-                        </a>
-                    )
-                    // And more!
-                
-            
+

+
+
+
+ + + + \ No newline at end of file diff --git a/static/js/codemirror.js b/static/js/codemirror.js new file mode 100644 index 0000000..e88d9b4 --- /dev/null +++ b/static/js/codemirror.js @@ -0,0 +1,58 @@ +import { CodeJar } from "codejar" + +// Custom highlighter for THP, based on regex for now. +// It'll implement a lexer & parser in the future. +const thpHighlighter = (editor, pos) => { + let code = editor.textContent; + + // Highlighting rules + + // Identifier regex + const identifier = /[a-z][a-z0-9_]*/g; + + // Datatype regex + const datatype = /[A-Z][a-z0-9_]*/g; + + + + // example + code = code.replace( + /\((\w+?)(\b)/g, + '($1$2' + ); + editor.innerHTML = code; + + console.log("running highlighter...", pos); + code = code.replace( + /\((\w+?)(\b)/g, + '($1$2' + ); + editor.innerHTML = code; +}; + +let jar = CodeJar(document.getElementById("editor"), thpHighlighter, { + tab: " ", +}); + +jar.updateCode( + `// Actual generics & sum types +fun find_person(Int person_id) -> Result[String, String] { + // Easy, explicit error bubbling + try Person::find_by_id(person_id) +} + +val id = POST::get("person_id") ?? exit("Null person_id") +// Errors as values +val person = try find_person(person_id: id) with error { + eprint("Error: {error}") + exit("Person not found") +} + +// First class HTML-like templates & components +print( + + welcome, {person.name} + +) +// And more!` +) diff --git a/static/js/lexer.js b/static/js/lexer.js new file mode 100644 index 0000000..2a27078 --- /dev/null +++ b/static/js/lexer.js @@ -0,0 +1 @@ +console.log(Bun.version); diff --git a/tailwind.config.js b/tailwind.config.js index 1cca3ea..d029c14 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -17,7 +17,7 @@ module.exports = { } }, fontFamily: { - "mono": ["'Fira Code'", "Inconsolata", "Iosevka", "monospace"], + "mono": ["Iosevka", "monospace"], "display": ["Inter", "'Josefin Sans'", "'Fugaz One'", "sans-serif"], "body": ["'Fira Sans'", "Inter", "sans-serif"], }, diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..df2b488 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags + "noUnusedLocals": true, + "noUnusedParameters": true, + "noPropertyAccessFromIndexSignature": true + } +}